IHM pour la correction de l'orbite fermée de l'anneau

Laurent S. Nadolski

L'application a été développée à SLAC pour les accélérateurs SPEAR2 et
SPEAR3 par William J. Corbett. Elle a été adaptée aux besoins de SOLEIL
et remaniée en partie (extension, simplification, normalisation par
rapport au Matlab Middle Layer).

En annexe sont présentés les structures Matlab utilisées dans l'ensemble
du programme. Cette information technique est dédiée aux utilisateurs
souhaitant comprendre le fonctionne interne de l'application, voire
maintenir ou améliorer l'application. C'est une aide précieuse
nécessaire avec de lire les scripts Matlab de l'application.

Les différents menus de l'application sont maintenant détaillés.

1.  **Menu Plot**

+----------------------------------+-----------------------------------+
| **Entrée**                       | **Appel et fonctionnalité**       |
+==================================+===================================+
| BPM Plot Scale                   | *orbgui(\'\'BPMPlotScale\'\')*    |
|                                  |                                   |
|                                  | Choix de l\'échelle verticale la  |
|                                  | fenêtre BPM : automatique ou      |
|                                  | manuelle.                         |
|                                  |                                   |
|                                  | Possibilité d\'affichage en       |
|                                  | fonction de la position ou de la  |
|                                  | phase.                            |
+----------------------------------+-----------------------------------+
| Corrector Plot Scale             | *orbgui(\'\'CorPlotScale\'\')*    |
|                                  |                                   |
|                                  | Choix de l\'échelle verticale     |
|                                  | pour la fenêtre Correcteurs.      |
+----------------------------------+-----------------------------------+
| BPM Unit Data Display            | *orbgui(\'\'BPM                   |
|                                  | ChangeUnits\'\',\'\'Physics\'\')* |
|                                  |                                   |
|                                  | *o                                |
|                                  | rbgui(\'\'BPMChangeUnits\'\',\'\' |
|                                  | Hardware\'\')orbgui(\'\'BPMChange |
|                                  | Units\'\',\'\'1000xHardware\'\')* |
|                                  |                                   |
|                                  | Permet de choisir l\'unité        |
|                                  | d\'affichage des BPM              |
+----------------------------------+-----------------------------------+
| COR Unit Data Display            | *orbgui(\'\'COR                   |
|                                  | ChangeUnits\'\',\'\'Physics\'\')* |
|                                  |                                   |
|                                  | *orbgui(\'\'CORC                  |
|                                  | hangeUnits\'\',\'\'Hardware\'\')* |
|                                  |                                   |
|                                  | Permet de choisir l\'unité        |
|                                  | d\'affichage des correcteurs.     |
+----------------------------------+-----------------------------------+
| Reset Horizontal Scale           | *orbgui(\'\'ResetAxes\'\')*       |
|                                  |                                   |
|                                  | Echelle des abscisses remises à   |
|                                  | sa valeur de défaut               |
+----------------------------------+-----------------------------------+

Tableau 1 Menu « Plot »

2.  **Menu session**

+----------------------------------+-----------------------------------+
| **Entrée**                       | **Appel et fonctionnalité**       |
+==================================+===================================+
| Save Program Parameters          | *readwrite(\'DialogBox\',\'Save   |
|                                  | System                            |
|                                  | Parameters\',\'\'SaveSystem\')*   |
+----------------------------------+-----------------------------------+
| Restore Program Parameters       | *                                 |
|                                  | readwrite(\'DialogBox\',\'Restore |
|                                  | System                            |
|                                  | Parameters\',\'RestoreSystem\')*  |
+----------------------------------+-----------------------------------+
| Mode                             | *orbgui(\'Switch2sim\')*          |
|                                  |                                   |
|                                  | Passe en mode Simulateur          |
|                                  |                                   |
|                                  | *orbgui(\'Switch2online\')*       |
|                                  |                                   |
|                                  | Machine en ligne                  |
+----------------------------------+-----------------------------------+

Tableau 2 Menu « Session »

3.  **Menu Simulator**

+----------------------------------+-----------------------------------+
| **Entrée**                       | **Appel et fonctionnalité**       |
+==================================+===================================+
| New Quad Alignment (both plane)  | *orbgui(\'\'QuadOffset\'\')*      |
|                                  |                                   |
|                                  | Simule des erreurs aléatoires     |
|                                  | d\'alignement des quadrupôles     |
|                                  | dans les deux plans.              |
+----------------------------------+-----------------------------------+
| Make New Reference Orbit (this   | *orbgui(\'\'MakeNewRef\'\')*      |
| plane)                           |                                   |
|                                  | Génère une nouvelle orbite de     |
|                                  | référence (aléatoire) dans le     |
|                                  | plan actuel.                      |
+----------------------------------+-----------------------------------+
| Corrector strengths to zero      | *orbgui(\'\'Cor2Zero\'\')*        |
| (this plane)                     |                                   |
|                                  | Force à zéro les correcteurs du   |
|                                  | plan actuel                       |
+----------------------------------+-----------------------------------+
| Quad alignment to zero (both     | *orbgui(\'\'Quad2Zero\'\')*       |
| planes)                          |                                   |
|                                  | Force à zéro les erreurs          |
|                                  | d\'alignement des quadrupôles     |
|                                  | dans les deux plans.              |
+----------------------------------+-----------------------------------+
| Update Optics (LinOpt)           | *orbgui(\'\'UpdateOptics\'\')*    |
|                                  |                                   |
|                                  | Recalcule l\'optique linéaire     |
+----------------------------------+-----------------------------------+
| Fit Tunes to 10.2/18.3           | *orbgui(\'\'SetTune\'\')*         |
|                                  |                                   |
|                                  | Fit les nombres d\'ondes aux      |
|                                  | valeurs par défauts.              |
+----------------------------------+-----------------------------------+

Tableau 3 Menu « simulator »

4.  **Menu Optics**

+----------------------------------+-----------------------------------+
| **Entrée**                       | **Appel et fonctionnalité**       |
+==================================+===================================+
| Display Optics Parameters        | *orbgui(\'\'DisplayOptics\'\')*   |
|                                  |                                   |
|                                  | Affiche les paramètre de Twiss    |
+----------------------------------+-----------------------------------+
| Display Optics Parameters in     | *or                               |
| EXCEL                            | bgui(\'\'DisplayOpticsEXCEL\'\')* |
|                                  |                                   |
|                                  | Affiche les paramètres de Twiss   |
|                                  | dans Excel                        |
|                                  |                                   |
|                                  | (ne fonctionne que sous windows)  |
+----------------------------------+-----------------------------------+
| Plot Betafunctions               | *o                                |
|                                  | rbgui(\'\'PlotBetaFunctions\'\')* |
|                                  |                                   |
|                                  | Trace les fonctions bêtatrons     |
+----------------------------------+-----------------------------------+
| Plot Ring Elements               | *                                 |
|                                  | orbgui(\'\'PlotRingElements\'\')* |
|                                  |                                   |
|                                  | Lance l\'éditeur interactif de AT |
+----------------------------------+-----------------------------------+

Tableau 4 Menu « optics »

5.  **Menu R-matrix**

+----------------------------------+-----------------------------------+
| **Entrée**                       | **Appel et fonctionnalité**       |
+==================================+===================================+
| Read Response Matrix             | *readwrite(\'ReadResponse\')*     |
|                                  |                                   |
|                                  | Lit une matrice réponse depuis un |
|                                  | fichier                           |
+----------------------------------+-----------------------------------+
| Write Response Matrix            | *readwrite(\'DialogBox\',\'Write  |
|                                  | Response                          |
|                                  | Matrix\',\'WriteResponse\')*      |
|                                  |                                   |
|                                  | TODO                              |
+----------------------------------+-----------------------------------+
| Show Eigenvectors                | *corgui(\'ShowEig\')*             |
+----------------------------------+-----------------------------------+
| Show Response                    | *corgui(\'ShowResp\')*            |
|                                  |                                   |
|                                  | Trace la ligne de la matrice      |
|                                  | réponse en noir dans la fenêtre   |
|                                  | BPM                               |
+----------------------------------+-----------------------------------+
| Select X-Corrector Strengths     | *rload(\'GenFig\',                |
| (BPM)                            | COR(1).name,COR(1).status,COR     |
|                                  | (1).ifit,COR(1).ebpm,\'Horizontal |
|                                  | Correctors to Electron            |
|                                  | BPMs\',\'hbpm\')*                 |
|                                  |                                   |
|                                  | Choix de la force des correcteurs |
|                                  | horizontaux pour la mesure de     |
|                                  | matrice réponse.                  |
+----------------------------------+-----------------------------------+
| Measure Horizontal to BPMs (all  | *corgui(\'\'MeasureXResp\'\')*    |
| valid correctors)                |                                   |
|                                  | Mesure de la matrice réponse      |
|                                  | horizontale                       |
+----------------------------------+-----------------------------------+
| Select Z-corrector Strengths     | *rload(\'GenFig\',                |
| (BPM)                            | COR(2).name,COR(2                 |
|                                  | ).status,COR(2).ifit,COR(2).ebpm, |
|                                  | \'Vertical Correctors to Electron |
|                                  | BPMs\',\'vbpm\');*                |
|                                  |                                   |
|                                  | Choix de la force des correcteurs |
|                                  | verticaux pour la mesure de       |
|                                  | matrice réponse.                  |
+----------------------------------+-----------------------------------+
| Measure Vertical to BPMs (all    | *corgui(\'\'MeasureYResp\'\')*    |
| valid correctors)                |                                   |
|                                  | Mesure de la matrice réponse      |
|                                  | verticale                         |
+----------------------------------+-----------------------------------+

Tableau 5 Menu « R-Matrix »

6.  **Menu superperiod**

+----------------------------------+-----------------------------------+
| **Entrée**                       | **Appel et fonctionnalité**       |
+==================================+===================================+
| All storage ring                 | *orbgui(\'allmachine\')*          |
|                                  |                                   |
|                                  | Affiche tout l\'anneau            |
+----------------------------------+-----------------------------------+
| Super period #1                  | *orbgui(\'superperiod1\')*        |
|                                  |                                   |
|                                  | Affiche première super-période    |
+----------------------------------+-----------------------------------+
| Super period #2                  | *orbgui(\'superperiod2\')*        |
|                                  |                                   |
|                                  | Affiche deuxième super-période    |
+----------------------------------+-----------------------------------+
| Super period #3                  | *orbgui(\'superperiod3\')*        |
|                                  |                                   |
|                                  | Affiche troisième super-période   |
+----------------------------------+-----------------------------------+
| Super period #4                  | *orbgui(\'superperiod4\')*        |
|                                  |                                   |
|                                  | Affiche quatrième super-période   |
+----------------------------------+-----------------------------------+

Tableau 6 Menu « superperiod »

7.  **Menu eta-fit**

  -----------------------------------------------------------------------
  **Entrée**                          **Appel et fonctionnalité**
  ----------------------------------- -----------------------------------
  Load Dispersion Orbit               *readwrite(\'DialogBox\',\'Load
                                      Reference
                                      Orbit\',\'ReadDispersion\')*

  Display Dispersion Control Panel    *respgui(\'DispersionPanel\')*

  Display Dispersion Correction       *respgui(\'DispersionPlot\')*
  -----------------------------------------------------------------------

Tableau 7 Menu etafi : choix de la fonction dispersion lors de la
correction d\'orbite fermée

8.  **Menu BPMs**

+------------------------+---------------------------------------------+
| **Entrée**             | **Appel et fonctionnalité**                 |
+------------------------+---------------------------------------------+
| Select All BPMS        | *bpmgui(\'SelectAll\')*                     |
|                        |                                             |
|                        | Sélectionne tous les BPMs (symbole en vert) |
|                        | pour le fit dans le plan actuel             |
+------------------------+---------------------------------------------+
| Select No BPM          | *bpmgui(\'SelectNone\')*                    |
|                        |                                             |
|                        | Sélectionne aucun BPM (symbole en jauge)    |
|                        | pour le fit dans le plan actuel             |
+------------------------+---------------------------------------------+
| Remove BPM Drag        | *bpmgui(\'ClearOffsets\')*                  |
| Changes                |                                             |
|                        | Offset des BPMs forcés à zéros pour le fit  |
|                        | dans le plan actuel                         |
+------------------------+---------------------------------------------+
| Show BPM state         | *bpmgui('ShowBPMState')*                    |
|                        |                                             |
|                        | Affiche l\'état des BPMs dans le plan       |
|                        | actuel                                      |
+------------------------+---------------------------------------------+
| Archive X-orbit        | *readwrite('ArchiveBPMOrbit','X')*          |
|                        |                                             |
|                        | Archive l\'orbite horizontale               |
+------------------------+---------------------------------------------+
| Archive Z-orbit        | *readwrite('ArchiveBPMOrbit','Z')*          |
|                        |                                             |
|                        | Archive l\'orbite vertical                  |
+------------------------+---------------------------------------------+
| Archive X/Z-orbit      | *readwrite('ArchiveBPMOrbit','B')*          |
|                        |                                             |
|                        | Archive l\'orbite dans les deux plans       |
+------------------------+---------------------------------------------+
| Load X-reference orbit | *readwrite('ReadBPMReferenceOrbit','X')*    |
|                        |                                             |
|                        | Charge une orbite de référence horizontale  |
|                        | parmi celles sauvegardées. Elle devient     |
|                        | l\'orbite en rouge.                         |
+------------------------+---------------------------------------------+
| Load Z-reference orbit | *readwrite('ReadBPMReferenceOrbit','Z')*    |
|                        |                                             |
|                        | Charge une orbite de référence verticale    |
|                        | parmi celles sauvegardées. Elle devient     |
|                        | l\'orbite en rouge.                         |
+------------------------+---------------------------------------------+
| Load X/Z-reference     | *readwrite('ReadBPMReferenceOrbit','B')*    |
| orbit                  |                                             |
|                        | Charge une orbite de référence horizontale  |
|                        | et verticale parmi celles sauvegardées.     |
|                        | Elle devient l\'orbite en rouge.            |
+------------------------+---------------------------------------------+
| Archive Golden X-orbit | *readwrite('ArchiveBPMOrbit','X','Golden')* |
|                        |                                             |
|                        | Sauve l\'orbite horizontale actuelle comme  |
|                        | « golden orbite ». **Cette action est       |
|                        | périlleuse.**                               |
+------------------------+---------------------------------------------+
| Archive Golden X-orbit | *readwrite('ArchiveBPMOrbit','Z','Golden')* |
|                        |                                             |
|                        | Sauve l\'orbite horizontale actuelle comme  |
|                        | « golden orbit ». **Cette action est        |
|                        | périlleuse.**                               |
+------------------------+---------------------------------------------+
| Archive Golden X-orbit | *readwrite('ArchiveBPMOrbit','B','Golden')* |
|                        |                                             |
|                        | Sauve l\'orbite horizontale actuelle comme  |
|                        | « golden orbit ». **Cette action est        |
|                        | périlleuse.**                               |
+------------------------+---------------------------------------------+
| Load Golden X-orbit    | *readw                                      |
|                        | rite('ReadBPMReferenceOrbit','X','Golden')* |
|                        |                                             |
|                        | Charge la « golden orbit » comme orbite de  |
|                        | référence (rouge).                          |
+------------------------+---------------------------------------------+
| Load Golden Z-orbit    | *readw                                      |
|                        | rite('ReadBPMReferenceOrbit','Z','Golden')* |
|                        |                                             |
|                        | Charge la « golden orbit » comme orbite de  |
|                        | référence (rouge)                           |
+------------------------+---------------------------------------------+
| Load Golden X/Z-orbit  | *readw                                      |
|                        | rite('ReadBPMReferenceOrbit','B','Golden')* |
|                        |                                             |
|                        | Charge la « golden orbit » comme orbite de  |
|                        | référence (rouge)                           |
+------------------------+---------------------------------------------+
| Select X-BPM Weights   | *rload(\'GenFig\',                          |
|                        | BPM(1).name,BPM(                            |
|                        | 1).avail,BPM(1).ifit,BPM(1).wt,\'Horizontal |
|                        | BPM Weights\',\'zbwt\');*                   |
|                        |                                             |
|                        | Permet de mettre un poids différents sur    |
|                        | les BPM horizontaux lors du fit.            |
+------------------------+---------------------------------------------+
| Select Z-BPM Weights   | *rload(\'GenFig\',                          |
|                        | BPM(2).name,BP                              |
|                        | M(2).avail,BPM(2).ifit,BPM(2).wt,\'Vertical |
|                        | BPM Weights\',\'zbwt\');*                   |
|                        |                                             |
|                        | Permet de mettre un poids différents sur    |
|                        | les BPM horizontaux lors du fit.            |
+------------------------+---------------------------------------------+

9.  **Menu Correctors**

+-------------------------+--------------------------------------------+
| **Entrée**              | **Appel et fonctionnalité**                |
+=========================+============================================+
| Update Correctors       | *corgui(\'UpdateCorrs\')*                  |
|                         |                                            |
|                         | Relit le courant des correcteurs           |
+-------------------------+--------------------------------------------+
| Select All Correctors   | *corgui(\'SelectAll\')*                    |
|                         |                                            |
|                         | Sélectionne tous les correcteurs pour le   |
|                         | fit dans le plan actuel.                   |
+-------------------------+--------------------------------------------+
| Select No Correctors    | *corgui(\'SelectNone\')*                   |
|                         |                                            |
|                         | Ne Sélectionne aucun correcteur dans le    |
|                         | plan actuel.                               |
+-------------------------+--------------------------------------------+
| Load Correctors         | *readwrite(\'DialogBox\',\'Read            |
|                         | Correctors\', \'ReadCorrectors\')*         |
|                         |                                            |
|                         | Lit les valeurs de courant des correcteurs |
|                         | depuis un fichier au format ASCII.         |
+-------------------------+--------------------------------------------+
| Archive Correctors      | *readwrite(\'DialogBox\',\'Write           |
|                         | Correctors\', \'WriteCorrectors\'\')*      |
|                         |                                            |
|                         | Sauvegarde les courants des correcteurs    |
|                         | dans un fichier au format ASCII.           |
+-------------------------+--------------------------------------------+
| Select X-Corrector      | *rload(\'GenFig\',                         |
| Limits                  | COR(1).name,COR(1).s                       |
|                         | tatus,COR(1).avail,COR(1).lim,\'Horizontal |
|                         | Corrector Limits\',\'xclim\');*            |
|                         |                                            |
|                         | Configuration du courant maximum pour      |
|                         | chaque correcteur horizontal (vert:        |
|                         | disponible, rouge : non disponible) dans   |
|                         | le plan actuel.                            |
+-------------------------+--------------------------------------------+
| Select X-Corrector      | *rload(\'GenFig\',                         |
| Weights                 | COR(1).name,COR(2).s                       |
|                         | tatus,COR(1).ifit,COR(1).wt,\'\'Horizontal |
|                         | Corrector Weights,\'xcwt\')*               |
|                         |                                            |
|                         | Configuration du poids pour chaque         |
|                         | correcteur horizontal pour le fit (vert:   |
|                         | disponible, rouge : non disponible) dans   |
|                         | le plan actuel.                            |
+-------------------------+--------------------------------------------+
| Select Z-Corrector      | *rload(\'GenFig\',                         |
| Limits                  | COR(2).name,COR(2)                         |
|                         | .status,COR(2).avail,COR(2).lim,\'Vertical |
|                         | Corrector Limits\',\'zclim\');*            |
|                         |                                            |
|                         | Configuration du courant maximum pour      |
|                         | chaque correcteur vertical (vert:          |
|                         | disponible, rouge : non disponible) dans   |
|                         | le plan actuel.                            |
+-------------------------+--------------------------------------------+
| Select Z-Corrector      | *rload(\'GenFig\',                         |
| Weights                 | COR(2).name,COR(2)                         |
|                         | .status,COR(2).ifit,COR(2).wt,\'\'Vertical |
|                         | Corrector Weights,\'zcwt\')*               |
|                         |                                            |
|                         | Configuration du poids pour chaque         |
|                         | correcteur vertical pour le fit (vert:     |
|                         | disponible, rouge : non disponible) dans   |
|                         | le plan actuel.                            |
+-------------------------+--------------------------------------------+
| Show Corrector State    | *corgui(\'ShowCORState\')*                 |
|                         |                                            |
|                         | Affiche les informations (status, fit,     |
|                         | poids, limites, \...)relatives à les       |
|                         | correcteurs dans le plan actuel.           |
+-------------------------+--------------------------------------------+

Tableau 8

**Vue BPM**

La vue correspond à un plan unique, horizontal ou vertical suivant le
choix de l\'utilisateur.

Les couleurs de traits correspondent :

Trait bleu : orbite mesurée (absolue ou relative)

Trait rouge : orbite de référence

Trait bleu pointillé : orbite prédite après le fit

L\'unité d\'affichage de l\'orbite est donnée par la légende de l\'axe
des ordonnées. Elle peut être changée en utilisant le menu *Plot*.

La valeur moyenne et rms de l\'orbite par rapport à l\'orbite de
référence est affichée dans la fenêtre.

Les BPM sont symbolisés par des cercles de couleurs :

vert : BPM utilisé dans la correction d\'orbite

jaune : BPM non utilisé dans la correction d\'orbite

noir : BPM non disponible

Si on sélectionne un BPM avec la souris, le BPM et ses paramètres sont
détaillés dans la boite BPM situé en bas de l\'interface. Un croix noire
symbolise le BPM sélectionné.

Une barre latérale permet de zoomer l\'axe des ordonnées. Un bouton
propose également un autozoom.

Offset = désirée -- référence

(BPM(plane).act(BPM(plane).avail) -

BPM(plane).abs(BPM(plane).avail) +

BPM(plane).fit(BPM(plane).avail));

**Vue correcteurs**

La vue correspond à un plan unique, horizontal ou vertical suivant le
choix de l\'utilisateur.

Ce plan est le même que celui des BPM.

Le code de couleur est le suivant :

Vert: valeurs actuelles

Rouge: valeurs prédites par SVD

Noir : non disponible

La barre correspond à la force du correcteur. L\'unité est affichée sur
la légende de l\'axe et peut être changée par le menu *correctors*.

Une barre latérale permet de zoomer l\'axe des ordonnées. Un bouton
propose également un autozoom.

1.  **Panneau supérieur**

+----------------------------------+-----------------------------------+
| Bouton                           | Fonctionnalité                    |
+==================================+===================================+
| Update Display                   | *bpmgui(\'UpdateAct\')*           |
|                                  |                                   |
|                                  | raffraichit l\'affichage BPM      |
|                                  | uniquement                        |
+----------------------------------+-----------------------------------+
| Update Reference                 | *bpmgui(\'UpdateRef\')*           |
|                                  |                                   |
|                                  | *L\'orbite actuelle devient       |
|                                  | l\'orbite de référence*           |
+----------------------------------+-----------------------------------+
| Horizontal/Vertical              | orbgui(\'\'Plane\'\')             |
|                                  |                                   |
|                                  | Choix du plan horizontal ou       |
|                                  | vertical                          |
+----------------------------------+-----------------------------------+
| Absolute/relative                | orbgui(\'\'Relative\'\')          |
+----------------------------------+-----------------------------------+
| Current                          | *                                 |
|                                  | orbgui(\'\'UpdateParameters\'\')* |
| Energy                           |                                   |
|                                  | Met à jour les champs :           |
| Lifetime                         |                                   |
|                                  | le courant stocké, la durée de    |
|                                  | vie, l\'énergie                   |
+----------------------------------+-----------------------------------+
| Save                             | orbgui(\'\'SaveSet\'\')           |
|                                  |                                   |
|                                  | Sauvegarde les paramètres de      |
|                                  | configuration de l\'application.  |
|                                  | Il peut y avoir plusieurs         |
|                                  | sauvegardes.                      |
|                                  |                                   |
|                                  | Bpm : mode, scalemode, dev, id,   |
|                                  | ifit, wt, des                     |
|                                  |                                   |
|                                  | Cor : mode, scalemode, fract, id, |
|                                  | ifit, wt, RSP : nsvd, disp, eig   |
+----------------------------------+-----------------------------------+
| Restore                          | orbgui(\'\'RestoreSaveSet\'\')    |
|                                  |                                   |
|                                  | Restaure un environnement         |
|                                  | sauvegardé. Menu contextuel pour  |
|                                  | choisir lequel.                   |
+----------------------------------+-----------------------------------+
|                                  |                                   |
+----------------------------------+-----------------------------------+

1.  **Correction de l\'orbite fermée**

L\'algorithme de correction repose sur une méthode SVD (voir pour une
introduction à la SVD le chapitre 2.9 de Numerical Recipes). La
correction se fait plan par plan.

## Principe :  {#principe .unnumbered}

Soit R la matrice réponse BPM/correcteurs définie par X = R I, avec X
est le vecteur colonne des positions lues dans les BPM pour une
variation I des correcteurs dipolaires de l\'anneau.

La correction d\'orbite a pour but de résoudre le problème inverse.
Connaissance l\'orbite de référence Xref et l\'orbite actuelle Xact du
faisceau dans l\'anneau, quel est l\'incrément en courant qu\'il faut
appliquer aux correcteurs de la machine pour que l\'orbite actuelle
devienne l\'orbite de référence, soit encore, trouver le vecteur I
vérifiant :

I = R^-1^ (Xref - Xact) = R^-1^ X

L'algorithme SVD décompose la matrice de la façon suivante R = USV^T^,
avec U et V des matrices orthogonales, S = diag(~i~) une matrice
diagonale. Les éléments diagonaux (~i~ ) de S sont rangés par valeurs
décroissantes et sont appelés valeurs singulières si matrice n'est pas
inversible (cas général) et valeurs propres si la matrice est
inversible.

La matrice inverse s'écrit alors R^-1^ = V^T^S^-1^U ; les éléments de
S^-1^ sont l'inverse de valeurs singulières non nulles (~i~^-1^), et
forcé à zéro sinon. On peut aussi définir un seuil à partir duquel les
valeurs singulières sont traitées comme non importante pour la
correction, i.e. forcée à zéro.

Lorsque la matrice réponse n'est pas inversible, la méthode SVD revient
minimiser au sens des moindres carrés, i.e. l'algorithme minimise le
vecteur :

rX - R I­\|

Pour l\'anneau de stockage de SOLEIL, nous avons 120 BPM dans les deux
plans et 56 correcteurs par plan. Les matrices ont pour taille maximale
56x120 sans couplage et 56x240 en prenant en compte le couplage entre
les deux plans.

Dans le plan horizontal, la fréquence RF est utilisée comme 57-ième
correcteur. En effet dans une région dispersive, une variation de la
fréquence de RF induit un déplacement de l'orbite fermée.

L'algorithme prend en compte également la pondération des lectures des
BPM. Par exemple, il est possible de mettre un poids plus grand pour les
BPM des sections droites, BPM dont la stabilité en meilleure.

De même, le correcteur « fréquence RF » est pondéré de sorte que ses
termes dans la matrice réponse sont équivalents à ceux de la matrice
réponse standard. Le poids est actuellement :

W~RF~ = 10 valeur_moyenne(écart_type(collonnes de
R))/écart_type(Matrice_RF).

[En prenant les poids en considération, l'algorithme final
devient :]{.underline}

1.  Rmod = matrice réponse dont les lignes sont pondérées par les poids
    des BPM.

2.  Svd(Rmod) = U^T^SV

3.  I, f~RF~\]^T^= V^T^S^-1^U W~BPM~(X) ) avec W~BPM~(X) ) = (W~BPM1~
    x~1~, ..., W~BPM56~ x~56~)^T^

Les nouvelles valeurs de consignes des correcteurs sont pour les 56
correcteurs dans chaque plan :

~k~I~k~ + I~k0~ avec k = 1..56 et I~k0~ le courant du k-ième correcteur
avant correction ;

Pour une correction de l'orbite fermée horizontale, la nouvelle valeur
de fréquence RF est : f~RF\ =~ W~RF~f~RF~ + f~RF0~ avec f~RF0~ la
fréquence RF avant correction.

## Interface {#interface .unnumbered}

Il est possible de choisir le nombre de valeurs singulières *via* soit
le graphe de valeurs singulières : il suffit de déplacer avec la souris
le disque rouge, soit en tapant dans la fenêtre *Singular values* le
nombre de valeurs singulières.

La correction peut être faite en prenant en compte ou pas la fréquence
RF.

Avant la correction, il est possible de sauvegarder la force des
correcteurs avec le bouton *save correctors*. Le bouton *Restore
correctors* permet de recharger les valeurs sauvegardées. La profondeur
de sauvegarde est d\'une seule itération.

Le bouton *Apply*, permet d\'appliquer pourcentage de la correction. Le
choix de ce pourcentage peut être modifier en entrant une valeur entre 0
et 1 dans la case *Fraction of correction*.

  -----------------------------------------------------------------------
  Bouton                              Fonctionnalité
  ----------------------------------- -----------------------------------
  Apply                               corgui(\'ApplyCorrection\')

  Remove                              corgui(\'\'RemoveCorrection\'\')

  Refresh Fit                         orbgui(\'\'RefreshOrbGUI\'\')

  \# Singular Values:                 respgui(\'\'SVDEdit\'\');

  Fraction of Correction:             corgui(\'\'Fract\'\');

                                      

                                      

                                      
  -----------------------------------------------------------------------

### Annexes techniques {#annexes-techniques .unnumbered}

1.  **Structure d\'échange BPM : moniteurs de position**

Cette structure gère toutes les informations relatives aux BPM, elle est
stockée dans l'espace de travail Matlab et est accessible avec la
commande getappdata(0,'BPM'). BPM(1) correspond aux BPM horizontaux et
BPM(2) aux BPM verticaux. Physiquement BPM(1) et BPM(2) correspondent
aux mêmes équipements puisque chaque BPM peut lire la position
horizontale et verticale du faisceau d'électron.

Il y a actuellement 120 BPM utilisables.

Toujours accessible via la commande getappdata(0,\'BPM\')

+----------------+-----------------------------------------------------+
| Champ          | Fonctionnalité                                      |
+================+=====================================================+
| abs            | Vecteur 1 à 120 utilisé pour l'affichage absolu     |
|                | (vaut zéro) ou relatif (vaut *ref*).                |
+----------------+-----------------------------------------------------+
| act            | Orbite actuelle (ie la dernière lue sur la machine  |
|                | ou le simulateur)                                   |
|                |                                                     |
|                | Trait bleu                                          |
+----------------+-----------------------------------------------------+
| AOFAMILY       | Famille, ie. BPMx ou BPMz                           |
+----------------+-----------------------------------------------------+
| ATindex        | Indices dans le simulateur AT                       |
+----------------+-----------------------------------------------------+
| avail          | Numéro BPM (1 à 120) si disponible (sinon 0 à la    |
|                | place du numéro)                                    |
+----------------+-----------------------------------------------------+
| des            | Orbite désirée (1 à 120) : trait pointillé rouge    |
|                |                                                     |
|                | des = ref -- abs                                    |
+----------------+-----------------------------------------------------+
| dev            | Déviation maximale de l\'orbite de référence (non   |
|                | utilisé)                                            |
+----------------+-----------------------------------------------------+
| drf            | Changement en fréquence pour la matrice réponse     |
+----------------+-----------------------------------------------------+
| dsp            | Composant dispersion dans les BPM (1 à 120)         |
+----------------+-----------------------------------------------------+
| etawt          | Poids pour la fonction dispersion (1 à 120)         |
+----------------+-----------------------------------------------------+
| fit            | Orbite prédite par le fit.                          |
|                |                                                     |
|                | Trait bleu pointillé y = act -- abs + fit           |
+----------------+-----------------------------------------------------+
| hicon          | Référence de l\'icône d\'affichage des BPM (disque  |
|                | noir, jaune ou vert).                               |
+----------------+-----------------------------------------------------+
| id             | Numéro du BPM sélectionné à la souris dans la       |
|                | fenêtre BPM (une croix noire le met en valeur) et   |
|                | affiché dans la boite de dialogue BPM.              |
+----------------+-----------------------------------------------------+
| ifit           | Numéros des BPM utilisés pour fit : vaut le numéro  |
|                | du BPM (1 à 120) symbole vert, sinon zéro, symbole  |
|                | jaune.                                              |
+----------------+-----------------------------------------------------+
| iref           | BPM disponibles dans l'orbite de référence          |
|                | utilité ?                                           |
+----------------+-----------------------------------------------------+
| mode           | 0 : dialog box Toggle BPM on                        |
|                |                                                     |
|                | 1 : dialog box Toggle BPM off                       |
+----------------+-----------------------------------------------------+
| name           | Noms communs des BPMs                               |
+----------------+-----------------------------------------------------+
| ntbpm          | Nombre de BPM (non utilisé)                         |
+----------------+-----------------------------------------------------+
| Phi            | Phases bêtatrons aux BPMs                           |
+----------------+-----------------------------------------------------+
| ref            | Orbite de référence (trait continu rouge), ie la    |
|                | « golden orbit » ou une orbite chargée d'un fichier |
|                | ou sélectionner dans l'application (cf. bouton Make |
|                | Reference) ref = ref -- abs (abs vaut 0 en          |
|                | affichage absolu).                                  |
+----------------+-----------------------------------------------------+
| rffit          | Fit pour la rf                                      |
+----------------+-----------------------------------------------------+
| s              | Position longitudinale des BPM obtenus dans le      |
|                | simulateur AT                                       |
+----------------+-----------------------------------------------------+
| scale          | Facteur de mise à l\'échelle:                       |
|                |                                                     |
|                | 1 si Harware (mm)                                   |
|                |                                                     |
|                | 0.001 si 1000xHardware (m)                          |
|                |                                                     |
|                | 1000 si Physics (um)                                |
+----------------+-----------------------------------------------------+
| scalemode      | 0: échelle manuelle                                 |
|                |                                                     |
|                | 1: échelle automatique                              |
+----------------+-----------------------------------------------------+
| status         | Statut au sens Matlab Middle Layer                  |
+----------------+-----------------------------------------------------+
| units          | Unité d\'affichage (Physics, Hardware,              |
|                | 1000xHardware)                                      |
+----------------+-----------------------------------------------------+
| wt             | Poids des BPM pour le fit                           |
+----------------+-----------------------------------------------------+
| ylim           | Limite pour l'échelle verticale dans la fenêtre BPM |
+----------------+-----------------------------------------------------+

Tableau 9Structure d'échange BPM

2.  **Structure d\'échange COR : correcteurs**

Cette structure gère toutes les informations relatives aux correcteurs
dipolaires situés dans les sextupôles de l'anneau de stockage ; elle est
stockée dans l'espace de travail Matlab et est accessible avec la
commande getappdata(0,'COR'). COR(1) correspond aux correcteurs
horizontaux et COR(2) aux correcteurs verticaux.

Il y a actuellement 56 correcteurs utilisables sur 120 possible dans les
deux plans.

Toujours accessible via la commande getappdata(0,\'COR\')

+-------------------------+--------------------------------------------+
| Champ                   | Fonctionnalité                             |
+=========================+============================================+
| act                     | Valeur de consigne actuelle                |
|                         |                                            |
|                         | Symbole ver                                |
+-------------------------+--------------------------------------------+
| AOFamily                | Famille : HCOR ou VCOR                     |
+-------------------------+--------------------------------------------+
| ATindex                 | Indices dans le simulateur AT              |
+-------------------------+--------------------------------------------+
| avail                   | Numéro des correcteurs (1 à 120) si        |
|                         | disponible, sinon vaut 0. Représentation   |
|                         | avec un disque noir.                       |
+-------------------------+--------------------------------------------+
| ebpm                    | Kicks utilisés pour la matrice réponse     |
|                         | (Utilité ? la générée à l'extérieur)       |
+-------------------------+--------------------------------------------+
| fit                     | Valeurs incrémentales prédites par le fit  |
|                         | (la correction).                           |
+-------------------------+--------------------------------------------+
| fract                   | Fraction de correction à appliquer à       |
|                         | chaque itération                           |
+-------------------------+--------------------------------------------+
| hw2physics              | Facteurs de conversion unités matérielles  |
|                         | vers unités physiques.                     |
+-------------------------+--------------------------------------------+
| hact (handle for        | Référence pour la barre graphique du       |
| actuator)               | correcteur (vert)                          |
|                         |                                            |
|                         | hact(:,1) : symbole                        |
|                         |                                            |
|                         | hact(:,2) : bar                            |
+-------------------------+--------------------------------------------+
| hfit                    | Référence pour la barre graphique du       |
|                         | correcteur pour la force estimé lors du    |
|                         | fit (rouge)                                |
|                         |                                            |
|                         | hfit(:,1) : symbole                        |
|                         |                                            |
|                         | hfit(:,2) : bar                            |
+-------------------------+--------------------------------------------+
| id                      | Numéro du correcteur sélectionné dans la   |
|                         | fenêtre correcteur (croix noire) et        |
|                         | affiché dans la boite de dialogue          |
|                         | correcteur.                                |
+-------------------------+--------------------------------------------+
| ifit                    | Numéros des correcteurs sélectionnés pour  |
|                         | fit                                        |
|                         |                                            |
|                         | (56/120). Si sélectionné le symbole est    |
|                         | vert, sinon le symbole est jaune.          |
+-------------------------+--------------------------------------------+
| lim                     | Courant maximum pour les correcteurs       |
+-------------------------+--------------------------------------------+
| mode                    | 0 : dialog box Toggle COR on               |
|                         |                                            |
|                         | 1 : dialog box Toggle COR off              |
+-------------------------+--------------------------------------------+
| name                    | Noms communs des correcteurs au sens MML   |
+-------------------------+--------------------------------------------+
| ntcor                   | Nombre de correcteurs                      |
+-------------------------+--------------------------------------------+
| phi                     | Phases bêtatrons au niveau des correcteurs |
|                         | (simulateur AT)                            |
+-------------------------+--------------------------------------------+
| ref                     | Valeur de consignes (référence)            |
+-------------------------+--------------------------------------------+
| rst                     | Valeurs avant d\'appliquer nouvelles       |
|                         | valeurs de correcteurs                     |
+-------------------------+--------------------------------------------+
| s                       | Position longitudinale des correcteurs     |
|                         | (simulateur AT)                            |
+-------------------------+--------------------------------------------+
| save                    | Corrector saveset                          |
+-------------------------+--------------------------------------------+
| saveflag                | 1 corrector save valid                     |
+-------------------------+--------------------------------------------+
| scalemode               | 0: échelle manuelle                        |
|                         |                                            |
|                         | 1: échelle automatique                     |
+-------------------------+--------------------------------------------+
| status                  | Statut des correcteurs                     |
+-------------------------+--------------------------------------------+
| units                   | Unité d\'affichage (Physics, Hardware)     |
+-------------------------+--------------------------------------------+
| ylim                    | Limite verticale pour l\'affichage dans la |
|                         | fenêtre correcteur                         |
+-------------------------+--------------------------------------------+

Tableau 10Structure d'échange correcteur

3.  **Structure d\'échange SYS : système**

Toujours accessible via la commande getappdata(0,\'SYS\')

+----------------------------------+-----------------------------------+
| Champ                            | Fonctionnalité                    |
+==================================+===================================+
| Abort                            | feedback or response matrix abort |
|                                  | ????                              |
+----------------------------------+-----------------------------------+
| ahbpm (bpm axis handle)          | Référence du système d\'axes des  |
|                                  | BPM                               |
+----------------------------------+-----------------------------------+
| ahcor (corrector axis handle)    | Référence du système d\'axes des  |
|                                  | correcteurs                       |
+----------------------------------+-----------------------------------+
| ahpos (position axis handle)     | Référence du système d\'axes du   |
|                                  | schéma de la maille               |
+----------------------------------+-----------------------------------+
| Ahr                              | Ampère/heure (Utilité ???)        |
+----------------------------------+-----------------------------------+
| ahsvd (svd axis handle)          | Référence du système d\'axes des  |
|                                  | valeurs singulières (SVD)         |
+----------------------------------+-----------------------------------+
| algo                             | Nom de l\'algorithme pour le fit  |
|                                  | : SVD par défaut                  |
+----------------------------------+-----------------------------------+
| beam                             | beam mode ???                     |
+----------------------------------+-----------------------------------+
| BPMLogfid                        | Fichier de log pour BPM ???       |
+----------------------------------+-----------------------------------+
| bpmmode                          | Utilité ???                       |
+----------------------------------+-----------------------------------+
| bpmslp                           | temps entre deux acquisitions BPM |
|                                  | (s)                               |
+----------------------------------+-----------------------------------+
| CORLogfid                        | Fichier de log pour correcteurs   |
|                                  | ???                               |
+----------------------------------+-----------------------------------+
| current                          | Courant stocké                    |
+----------------------------------+-----------------------------------+
| energy                           | Energie du faisceau               |
+----------------------------------+-----------------------------------+
| etafil                           | Fichier pour la dispersion        |
+----------------------------------+-----------------------------------+
| fdbk                             | feedback on/off                   |
+----------------------------------+-----------------------------------+
| filpath                          | Chemin vers les fichiers ????     |
+----------------------------------+-----------------------------------+
| hbeam                            |                                   |
+----------------------------------+-----------------------------------+
| lhact                            | Référence du tracé l\'orbite      |
|                                  | actuelle                          |
+----------------------------------+-----------------------------------+
| lhbid                            | Référence vers la croix noir      |
|                                  | symbolisant le bpm sélectionné.   |
+----------------------------------+-----------------------------------+
| lhcid                            | Référence vers la croix noir      |
|                                  | symbolisant le correcteur         |
|                                  | sélectionné.                      |
+----------------------------------+-----------------------------------+
| lhdes                            | Référence du tracé de l\'orbite   |
|                                  | désirée                           |
+----------------------------------+-----------------------------------+
| lhdot                            | Référence du point rouge          |
|                                  | symbolisant le nombre de valeurs  |
|                                  | singulières sélectionnées.        |
+----------------------------------+-----------------------------------+
| lheig                            | orbit handle                      |
+----------------------------------+-----------------------------------+
| lhfit                            | Référence du tracé de l\'orbite   |
|                                  | prédite par la correction.        |
+----------------------------------+-----------------------------------+
| lhref                            | Référence du tracé de l\'orbite   |
|                                  | de référence.                     |
+----------------------------------+-----------------------------------+
| lhrsp                            | response orbit handle             |
+----------------------------------+-----------------------------------+
| lhsvd                            | svd curve handle                  |
+----------------------------------+-----------------------------------+
| lt                               | Durée de vie                      |
+----------------------------------+-----------------------------------+
| machine                          | Nom de l\'accélérateur            |
+----------------------------------+-----------------------------------+
| mode                             | Online/simulator pour :           |
|                                  |                                   |
|                                  | En ligne/Simulateur               |
+----------------------------------+-----------------------------------+
| mxphi                            | Maximum pour l\'échelle des       |
|                                  | phases                            |
+----------------------------------+-----------------------------------+
| mxs                              | Limite de la coordonnée           |
|                                  | curviligne ???                    |
+----------------------------------+-----------------------------------+
| nsvd                             | Nombre de valeurs singulières     |
|                                  | utilisé pour le fit               |
+----------------------------------+-----------------------------------+
| plane                            | 1 pour horizontal                 |
|                                  |                                   |
|                                  | 2 pour vertical                   |
+----------------------------------+-----------------------------------+
| reffil                           | Fichier de référence (silver.dat) |
|                                  |                                   |
|                                  | Utilité ???                       |
+----------------------------------+-----------------------------------+
| reffile                          | Nom du fichier de référence       |
+----------------------------------+-----------------------------------+
| relative                         | 1 : affichage relatif             |
|                                  |                                   |
|                                  | 2 : affichage absolu              |
+----------------------------------+-----------------------------------+
| restorefile                      | Nom du fichier de sauvegarde      |
+----------------------------------+-----------------------------------+
| rspfil                           | Fichier pour la matrice réponse   |
+----------------------------------+-----------------------------------+
| xlimax                           | Maximum pour l\'échelle des       |
|                                  | abscisses                         |
+----------------------------------+-----------------------------------+
| xscale                           | Echelle des abscisses             |
|                                  | (meter/phase)                     |
+----------------------------------+-----------------------------------+

Tableau 11

hbeam: 188 PV handle for beam mode

hengy: 189 PV handle for energy

hcurr: 190 PV handle for current

hlt: 191 PV handle for lifetime

beam: 3 beam mode

brspfil:
\'Q:\\Groups\\Accel\\controls\\matlabapplications\\Orbit\\SPEAR2\\dummy.m\'

4.  **Structure d\'échange RSP : matrice réponse**

Toujours accessible via la commande getappdata(0,\'RSP\')

+------------------------+---------------------------------------------+
| Champ                  | Fonctionnalité                              |
+========================+=============================================+
| fit                    | 1 : fit valide                              |
+------------------------+---------------------------------------------+
| rfflag                 | 1 : soustrait la partie RF                  |
|                        |                                             |
|                        | 0 : BPM(k).rffit = 0                        |
+------------------------+---------------------------------------------+
| rf                     | 1 : utilise RF dans le fit                  |
|                        |                                             |
|                        | 0 : n\'utilise pas la RF dans le fit        |
+------------------------+---------------------------------------------+
| drf                    | RF offset pour mesurer les fonctions        |
|                        | dispersion                                  |
+------------------------+---------------------------------------------+
| nsvd                   | Nombre de valeurs singulières utilisé dans  |
|                        | le fit                                      |
+------------------------+---------------------------------------------+
| nsvdmx                 | Nombre maximal de valeurs singulières       |
+------------------------+---------------------------------------------+
| ntcor                  | Nombre maximal de correcteurs dans la       |
|                        | matrice réponse                             |
+------------------------+---------------------------------------------+
| ntbpm                  | Nombre maximal de BPM dans la matrice       |
|                        | réponse                                     |
+------------------------+---------------------------------------------+
| Data                   | Matrice réponse                             |
+------------------------+---------------------------------------------+
| U                      | Vecteurs propres dans l\'espace des BPM     |
+------------------------+---------------------------------------------+
| S                      | Valeurs singulières                         |
+------------------------+---------------------------------------------+
| V                      | Vecteurs propres dans l\'espace des         |
|                        | correcteurs                                 |
+------------------------+---------------------------------------------+
| disp                   | \'on\' : affichage les colonnes de la       |
|                        | matrice réponse                             |
|                        |                                             |
|                        | \'off\'                                     |
+------------------------+---------------------------------------------+
| eig                    | \'on\' : affiche les vecteurs propres       |
|                        |                                             |
|                        | \'off\'                                     |
+------------------------+---------------------------------------------+
| ActuatorDelta          | Courant des correcteurs pour mesures la     |
|                        | matrice réponse                             |
+------------------------+---------------------------------------------+
| eta                    | fonction dispersion                         |
+------------------------+---------------------------------------------+
| ib                     | indices des BPM dans la matrice réponse     |
+------------------------+---------------------------------------------+
| ic                     | indices des correcteurs dans la matrice     |
|                        | réponse                                     |
+------------------------+---------------------------------------------+
| respstruct             | Matrice réponse calculée avec measbpmresp   |
+------------------------+---------------------------------------------+
| svdtol                 | Si non nulle, utilisé comme tolérance pour  |
|                        | sélectionner le nombre de valeurs           |
|                        | singulières.                                |
|                        |                                             |
|                        | La tolérance est normalisé par la valeur de |
|                        | la première valeur singulière.              |
+------------------------+---------------------------------------------+

Tableau 12 Structure d\'échange pour les matrices réponse

  -----------------------------------------------------------------------
  bmp: 0 use beamline bump subtraction
  -----------------------------------------------------------------------

  -----------------------------------------------------------------------

Correction de l\'orbite fermée

Le fichier soleilrestore est appelé pour initialiser l\'application: de
nombreux paramètres clefs y sont définis.

# Normes

1 : plan H

2 : plan V

[Bouton « update display » :]{.underline}

Appelle

Bpmgui('UpdateAct')

-   Bpmgui/GetAct : lit les valeurs actuelles des BPMs et les stocke
    dans BPM(1 ou 2).act

-   Bpmgui/RePlot :

-   Bpmgui/UpdateBPMBox

-   Bpmgui/UpdateCorBox

-   Bpmgui/LBOX, Refresh Orbit

-   Bpmgui/RefreshOrbGUI

# Click dans la fenêtre graphique BPM 

Bpmgui('BPMSelect')

Recherche le BPM le plus proche du pointeur de la souris et met à jour
les fenêtres graphiques

-   Bpmgui/BPMbar : déplace le curseur noir sur le BPM sélectionné

-   UpdateIcons : met à jour les icônes dans la barre de symboles

-   Bpmgui/ProcessBPM

RefOrb2Zero : met l'orbite de référence à zéro

Readwrite :

UpdateAct : lit les BPM et met à jour les graphes

L'interface graphique de correction d'orbite est composée principalement
des fichiers Matlab suivants :

-   solorbit : Initialisation de l\'application

-   orbgui : fonctions relatives à l\'affichage

-   bpmgui : fonctions relatives aux BPM

-   corgui : fonctions relatives aux correcteurs

-   respgui : fonctions relatives à la correction de l\'orbite