OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
LieMapper.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // $RCSfile: LieMapper.cpp,v $
3 // ------------------------------------------------------------------------
4 // $Revision: 1.3 $
5 // ------------------------------------------------------------------------
6 // Copyright: see Copyright.readme
7 // ------------------------------------------------------------------------
8 //
9 // Class: LieMapper
10 // The visitor class for building a map of given order for a beamline
11 // using a finite-length lenses for all elements.
12 // Multipole-like elements are done by Lie series.
13 //
14 // ------------------------------------------------------------------------
15 //
16 // $Date: 2000/05/03 08:16:29 $
17 // $Author: opal $
18 //
19 // ------------------------------------------------------------------------
20 
21 #include "Algorithms/LieMapper.h"
22 
24 #include "AbsBeamline/Corrector.h"
25 #include "AbsBeamline/Degrader.h"
26 #include "AbsBeamline/Diagnostic.h"
27 #include "AbsBeamline/Drift.h"
30 #include "AbsBeamline/Lambertson.h"
31 #include "AbsBeamline/Marker.h"
32 #include "AbsBeamline/Monitor.h"
33 #include "AbsBeamline/Multipole.h"
34 #include "AbsBeamline/Probe.h"
35 #include "AbsBeamline/RBend.h"
36 #include "AbsBeamline/RFCavity.h"
38 #include "AbsBeamline/SBend.h"
39 #include "AbsBeamline/Separator.h"
40 #include "AbsBeamline/Septum.h"
41 #include "AbsBeamline/Solenoid.h"
44 
48 #include "Beamlines/Beamline.h"
49 #include "Fields/BMultipoleField.h"
52 #include "FixedAlgebra/FTps.h"
53 #include "FixedAlgebra/FTpsMath.h"
54 #include "Physics/Physics.h"
55 
56 class Beamline;
57 class PartData;
58 using Physics::c;
59 
61 
62 
63 // Class LieMapper
64 // ------------------------------------------------------------------------
65 
66 LieMapper::LieMapper(const Beamline &beamline, const PartData &reference,
67  bool backBeam, bool backTrack, int order):
68  AbstractMapper(beamline, reference, backBeam, backTrack),
69  itsOrder(std::min(order, 6))
70 {}
71 
72 
74 {}
75 
76 
78  map = itsMap.operator LinearMap<double, 6>();
79 }
80 
81 
83  map = itsMap.operator FVps<double, 6>();
84 }
85 
86 
88  map = itsMap;
89 }
90 
91 
93  itsMap = DragtFinnMap<3>(map);
94 }
95 
96 
98  itsMap = DragtFinnMap<3>(map);
99 }
100 
101 
103  itsMap = map;
104 }
105 
106 
108  // *** MISSING *** Map for beam-beam.
109 }
110 
112  // *** MISSING *** Map for beam stripping.
113 }
114 
117 }
118 
119 
121  // *** MISSING *** Map for arbitrary component.
122 }
123 
124 
126  // Get data.
127  double length = flip_s * corr.getElementLength();
128  double kin = itsReference.getM() / itsReference.getP();
129  double scale = (length * itsReference.getQ()) / itsReference.getP();
130  BDipoleField field = corr.getField();
131 
132  // First order terms (kicks).
134  f_1[1] = - scale * field.getBy();
135  f_1[2] = - f_1[1] * (length / 2.0);
136  f_1[3] = scale * field.getBx();
137  f_1[4] = - f_1[3] * (length / 2.0);
138 
139  // Apply map; higher terms ignored.
140  DragtFinnMap<3> theMap;
141  theMap.assign(f_1);
142  theMap.getMatrix()(0, 1) = length;
143  theMap.getMatrix()(2, 3) = length;
144  theMap.getMatrix()(4, 5) = length * kin * kin;
145  itsMap = itsMap.catenate(theMap);
146 }
147 
148 
150  // The diagnostic has no effect on the map.
152 }
153 
155  // The diagnostic has no effect on the map.
157 }
158 
159 
160 void LieMapper::visitDrift(const Drift &drift) {
162 }
163 
166 }
167 
169  // Assume the particle go through the magnet's window.
171 }
172 
173 
174 void LieMapper::visitMarker(const Marker &marker) {
175  // Do nothing.
176 }
177 
178 
179 void LieMapper::visitMonitor(const Monitor &corr) {
181 }
182 
183 
185  double length = mult.getElementLength() * flip_s;
186  const BMultipoleField &field = mult.getField();
187  double scale = (flip_B * itsReference.getQ() * c) / itsReference.getP();
188 
189  if(length) {
190  // Normal case: Finite-length multipole, field coefficients are B.
191  // Apply entrance fringe field.
192  applyEntranceFringe(0.0, 0.0, field, scale);
193 
194  // Kinematic terms.
195  double kin = itsReference.getM() / itsReference.getP();
196 
197  // Vector potential in straight reference.
198  Series As = buildMultipoleVectorPotential(field) * scale;
199 
200  // Build Hamiltonian and factored map, catenate with previous map.
203  static const Series pt1 = Series::makeVariable(AbstractMapper::PT) + 1.0;
204  Series pz = sqrt(pt1 * pt1 - px * px - py * py);
205  Series E = sqrt(pt1 * pt1 + kin * kin) / itsReference.getBeta();
206  Series H = length * (As + E - pz);
207  DragtFinnMap<3> theMap(H);
208  itsMap = itsMap.catenate(theMap);
209 
210  // Apply exit fringe field.
211  applyExitFringe(0.0, 0.0, field, scale);
212  } else {
213  // Special case: Thin multipole, field coefficients are integral(B*dl).
214  // Hamiltonian for thin Multipole is just A_s.
215  Series H = buildMultipoleVectorPotential(field) * scale;
217  itsMap = itsMap.catenate(theMap);
218  }
219 }
220 
221 
222 void LieMapper::visitPatch(const Patch &patch) {
223  applyTransform(patch.getPatch());
224 }
225 
226 void LieMapper::visitProbe(const Probe &prob) {
227  // Do nothing.
228 }
229 
230 
231 void LieMapper::visitRBend(const RBend &bend) {
232  // Geometry.
233  const RBendGeometry &geometry = bend.getGeometry();
234  double length = flip_s * geometry.getElementLength();
235  double scale = (flip_B * itsReference.getQ() * c) / itsReference.getP();
236  const BMultipoleField &field = bend.getField();
237 
238  if(length) {
239  // Finite-length RBend.
240  if(back_path) {
241  // Apply rotation global to local.
242  applyTransform(Inverse(geometry.getExitPatch()));
243 
244  // Apply entrance fringe field.
245  applyEntranceFringe(bend.getExitFaceRotation(), scale, field, scale);
246  } else {
247  // Apply rotation global to local.
248  applyTransform(geometry.getEntrancePatch());
249 
250  // Apply exit fringe field.
251  applyEntranceFringe(bend.getEntryFaceRotation(), scale, field, scale);
252  }
253 
254  // Kinematic terms.
255  double kin = itsReference.getM() / itsReference.getP();
256 
257  // Vector potential in straight reference.
258  Series As = buildMultipoleVectorPotential(field) * scale;
259 
260  // Finish Hamiltonian, build factored map, and catenate with previous map.
263  static const Series pt1 = Series::makeVariable(AbstractMapper::PT) + 1.0;
264  Series pz = sqrt(pt1 * pt1 - px * px - py * py);
265  Series E = sqrt(pt1 * pt1 + kin * kin) / itsReference.getBeta();
266  Series H = length * (As + E - pz);
267  DragtFinnMap<3> theMap(H);
268  itsMap = itsMap.catenate(theMap);
269 
270  if(back_path) {
271  // Apply exit fringe field.
272  applyExitFringe(bend.getEntryFaceRotation(), scale, field, scale);
273 
274  // Transform from local to global.
276  } else {
277  // Apply entrance fringe field.
278  applyEntranceFringe(bend.getExitFaceRotation(), scale, field, scale);
279 
280  // Transform from local to global.
281  applyTransform(geometry.getExitPatch());
282  }
283  } else {
284  // Thin RBend.
285  double half_angle = flip_s * geometry.getBendAngle() / 2.0;
286  Euclid3D rotat = Euclid3D::YRotation(- half_angle);
287 
288  // Transform from in-plane to mid-plane.
289  applyTransform(rotat, 0.0);
290 
291  // Hamiltonian for thin RBend is just vector potential.
292  Series H = buildMultipoleVectorPotential(field) * scale;
294  itsMap = itsMap.catenate(theMap);
295 
296  // Transform from mid-plane to out-plane.
297  applyTransform(rotat, 0.0);
298  }
299 }
300 
301 
303  // Do nothing.
304 }
305 
307  // Do nothing here.
308 }
309 
311  // Drift through half length.
312  double length = flip_s * as.getElementLength();
313  if(length) applyDrift(length / 2.0);
314 
315  // Get parameters.
316  double freq = as.getFrequency();
317  double peak = flip_s * as.getAmplitude() / itsReference.getP();
318 
319  // Compute Hamiltonian.
321  Series H = peak * cos(as.getPhase() + (freq / c) * t);
322 
323  // Build map.
325  itsMap = itsMap.catenate(theMap);
326 
327  // Drift through half length.
328  if(length) applyDrift(length / 2.0);
329 }
330 
331 
333  // *** MISSING *** Map for RF quadrupole.
335 }
336 
337 
338 void LieMapper::visitSBend(const SBend &bend) {
339  const PlanarArcGeometry &geometry = bend.getGeometry();
340  double length = flip_s * geometry.getElementLength();
341  double scale = (flip_B * itsReference.getQ() * c) / itsReference.getP();
342  const BMultipoleField &field = bend.getField();
343 
344  if(length) {
345  // Apply entrance fringe field.
347  bend.getEntryFaceCurvature(), field, scale);
348 
349  // Build Hamiltonian in local coordinates; substitution done later.
350  double h = geometry.getCurvature();
351 
352  // Kinematic terms.
353  double kin = itsReference.getM() / itsReference.getP();
354 
355  // Vector potential (1 + h*x) * As in curved reference.
356  Series As = buildSBendVectorPotential(field, h) * scale;
357 
358  // Finish Hamiltonian, build factored map,
359  // and catenate with the previous map.
363  static const Series pt1 = Series::makeVariable(AbstractMapper::PT) + 1.0;
364  Series pz = sqrt(pt1 * pt1 - px * px - py * py);
365  Series E = sqrt(pt1 * pt1 + kin * kin) / itsReference.getBeta();
366  Series H = length * (As + E - (1.0 + h * x) * pz);
367  DragtFinnMap<3> theMap(H);
368  itsMap = itsMap.catenate(theMap);
369 
370  // Apply exit fringe field.
372  bend.getExitFaceCurvature(), field, scale);
373  } else {
374  double half_angle = geometry.getBendAngle() / 2.0;
375  Euclid3D rotat = Euclid3D::YRotation(- half_angle);
376 
377  // Transform from in-plane to mid-plane.
378  applyTransform(rotat, 0.0);
379 
380  // Hamiltonian for thin SBend is just vector potential,
381  // but curvature is non known.
382  Series H = buildSBendVectorPotential(field, 0.0) * scale;
384  itsMap = itsMap.catenate(theMap);
385 
386  // Transform from mid-plane to out-plane.
387  applyTransform(rotat, 0.0);
388  }
389 }
390 
391 
393  // Get data.
394  double length = flip_s * sep.getElementLength();
395  double kin = itsReference.getM() / itsReference.getP();
396  double scale = (length * itsReference.getQ()) / itsReference.getP();
397 
398  // First-order terms (kicks).
400  f_1[1] = scale * sep.getEx();
401  f_1[2] = - f_1[1] * (length / 2.0);
402  f_1[3] = scale * sep.getEy();
403  f_1[4] = - f_1[3] * (length / 2.0);
404 
405  // Apply map; higher-order terms ignored.
406  DragtFinnMap<3> theMap;
407  theMap.assign(f_1);
408  theMap.getMatrix()(0, 1) = length;
409  theMap.getMatrix()(2, 3) = length;
410  theMap.getMatrix()(4, 5) = length * kin * kin;
411  itsMap = itsMap.catenate(theMap);
412 }
413 
414 
415 void LieMapper::visitSeptum(const Septum &sept) {
416  // Assume the particle go through the magnet's window.
418 }
419 
420 
421 void LieMapper::visitSolenoid(const Solenoid &solenoid) {
422  double length = flip_s * solenoid.getElementLength();
423 
424  if(length) {
425  double ks = (flip_B * itsReference.getQ() * solenoid.getBz() * c) /
426  (2.0 * itsReference.getP());
427 
428  if(ks) {
429  double kin = itsReference.getM() / itsReference.getP();
432  static const Series pt1 = Series::makeVariable(AbstractMapper::PT) + 1.0;
433  Series pz = sqrt(pt1 * pt1 - px * px - py * py);
434  Series H = length * (sqrt(pt1 * pt1 + kin * kin) - pz);
436  itsMap = itsMap.catenate(theMap);
437  } else {
438  applyDrift(length);
439  }
440  }
441 }
442 
443 
444 void LieMapper::applyDrift(double length)
445 
446 {
447  // Fetch data.
448  double kin = itsReference.getM() / itsReference.getP();
449 
450  // Build matrix.
451  DragtFinnMap<3> theMap;
454  static const Series pt1 = Series::makeVariable(AbstractMapper::PT) + 1.0;
455  Series pz = sqrt(pt1 * pt1 - px * px - py * py);
456  Series H = length * (sqrt(pt1 * pt1 + kin * kin) - pz);
458 
459  // Catenate with previous map.
460  itsMap = itsMap.catenate(theMap);
461 }
462 
463 
464 void LieMapper::applyEntranceFringe(double angle, double curve,
465  const BMultipoleField &field,
466  double scale) {
467  // *** MISSING *** map terms for entrance fringe.
468  // double hx = scale * field.normal(1);
469  // double ex = hx * tan(angle);
470  // double ey = hx * tan(angle + itsMap[PX][0]);
471 }
472 
473 
474 void LieMapper::applyExitFringe(double angle, double curve,
475  const BMultipoleField &field,
476  double scale) {
477  // *** MISSING *** map terms for exit fringe.
478  // double hx = scale * field.normal(1);
479  // double ex = hx * tan(angle);
480  // double ey = hx * tan(angle - itsMap[PX][0]);
481 }
482 
483 
484 void LieMapper::applyTransform(const Euclid3D &euclid, double refLength) {
485  if(! euclid.isIdentity()) {
486  // build rotation matrix and compute additional drift length.
487  double s2 = (euclid.M(0, 2) * euclid.getX() +
488  euclid.M(1, 2) * euclid.getY() +
489  euclid.M(2, 2) * euclid.getZ()) / euclid.M(2, 2);
490  double kin = itsReference.getM() / itsReference.getP();
491 
492  // f1 terms (kicks).
494  f_1[1] = euclid.M(0, 2) / euclid.M(2, 2);
495  f_1[2] = - euclid.getX() + f_1[1] * s2;
496  f_1[3] = euclid.M(1, 2) / euclid.M(2, 2);
497  f_1[4] = - euclid.getY() + f_1[3] * s2;
498  f_1[5] = 0.0;
499  f_1[6] = euclid.getZ();
500 
501  // Transfer matrix.
503  F(1, 1) = euclid.M(0, 0);
504  F(1, 3) = euclid.M(1, 0);
505  F(1, 5) = euclid.M(2, 0);
506  F(3, 1) = euclid.M(0, 1);
507  F(3, 3) = euclid.M(1, 1);
508  F(3, 5) = euclid.M(2, 1);
509  F(5, 5) = 1.0;
510 
511  F(0, 0) = euclid.M(1, 1) / euclid.M(2, 2);
512  F(0, 2) = F(0, 0) * s2;
513  F(0, 2) = - euclid.M(0, 1) / euclid.M(2, 2);
514  F(0, 3) = F(0, 2) * s2;
515  F(2, 0) = - euclid.M(1, 0) / euclid.M(2, 2);
516  F(2, 1) = F(2, 0) * s2;
517  F(2, 2) = euclid.M(0, 0) / euclid.M(2, 2);
518  F(2, 3) = F(2, 2) * s2;
519  F(4, 0) = euclid.M(0, 2) / euclid.M(2, 2);
520  F(4, 1) = F(4, 0) * s2;
521  F(4, 2) = euclid.M(1, 2) / euclid.M(2, 2);
522  F(4, 3) = F(4, 2) * s2;
523  F(4, 4) = 1.0;
524  F(4, 5) = - s2 * kin * kin;
525 
526  // Store generator and matrix.
527  DragtFinnMap <3> theMap;
528  theMap.assign(f_1);
529  theMap.assign(F);
530  itsMap = itsMap.catenate(theMap);
531  }
532 }
Build transfer map.
virtual void visitSeptum(const Septum &)
Apply the algorithm to a Septum.
Definition: LieMapper.cpp:415
virtual double getExitFaceRotation() const =0
Get exit pole face rotation.
virtual BMultipoleField & getField() override=0
Get multipole expansion of field.
virtual ~LieMapper()
Definition: LieMapper.cpp:73
double getX() const
Get displacement.
Definition: Euclid3D.h:216
virtual void visitFlexibleCollimator(const FlexibleCollimator &)
Apply the algorithm to a flexible collimator.
Definition: LieMapper.cpp:164
virtual BDipoleField & getField()=0
Return the corrector field.
virtual double getAmplitude() const =0
Get RF amplitude.
The field of a magnetic dipole.
Definition: BDipoleField.h:31
virtual BMultipoleField & getField() override=0
Get multipole expansion of field.
Interface for septum magnet.
Definition: Septum.h:11
void applyEntranceFringe(double edge, double curve, const BMultipoleField &field, double scale)
Definition: LieMapper.cpp:464
virtual BMultipoleField & getField() override=0
Get multipole field.
Interface for electrostatic separator.
Definition: Separator.h:33
Euclid3D getExitPatch() const
Get patch.
virtual double getPhase() const =0
Get RF phase.
Interface for beam position monitors.
Definition: Monitor.h:41
Interface for RF Quadrupole.
Definition: RFQuadrupole.h:30
A simple arc in the XZ plane.
virtual void visitParallelPlate(const ParallelPlate &)
Apply the algorithm to a ParallelPlate.
Definition: LieMapper.cpp:302
virtual double getBz() const =0
Get solenoid field Bz in Teslas.
virtual void setMap(const LinearMap< double, 6 > &)
Reset the linear part of the accumulated map for restart.
Definition: LieMapper.cpp:92
Interface for RF cavity.
Definition: ParallelPlate.h:36
double getZ() const
Get displacement.
Definition: Euclid3D.h:224
virtual double getElementLength() const override
Get design length.
Definition: RFCavity.cpp:818
static DragtFinnMap factorSimple(const FTps< double, 2 *N > &H)
Definition: DragtFinnMap.h:652
Particle reference data.
Definition: PartData.h:38
virtual double getEx() const =0
Get horizontal component Ex of field in V/m.
Interface for general corrector.
Definition: Corrector.h:35
virtual void visitCCollimator(const CCollimator &)
Apply the algorithm to a Collimator.
Definition: LieMapper.cpp:115
virtual double getEy() const =0
Get vertical component Ey of field in V/m.
Abstract collimator.
Definition: RBend.h:73
Interface for beam diagnostics.
Definition: Diagnostic.h:32
Euclid3D getEntrancePatch() const
Get patch.
Interface for a marker.
Definition: Marker.h:32
virtual double getBy() const
Get vertical component.
DragtFinnMap< 3 > itsMap
Definition: LieMapper.h:188
virtual PlanarArcGeometry & getGeometry() override=0
Get SBend geometry.
const FMatrix< double, 2 *N, 2 *N > & getMatrix() const
Return the matrix representing the linear transform.
Definition: DragtFinnMap.h:671
virtual void visitLambertson(const Lambertson &)
Apply the algorithm to a Lambertson.
Definition: LieMapper.cpp:168
virtual double getEntryFaceRotation() const =0
Get pole entry face rotation.
Interface for drift space.
Definition: Drift.h:33
virtual void visitBeamStripping(const BeamStripping &)
Apply the algorithm to a BeamStripping.
Definition: LieMapper.cpp:111
virtual void visitComponent(const Component &)
Apply the algorithm to a Component.
Definition: LieMapper.cpp:120
double getBeta() const
The relativistic beta per particle.
Definition: PartData.h:127
virtual void visitRFCavity(const RFCavity &)
Apply the algorithm to a RFCavity.
Definition: LieMapper.cpp:310
double M(int row, int col) const
Get component.
Definition: Euclid3D.h:228
DragtFinnMap catenate(const DragtFinnMap &) const
Substitute (concatenate) with another map in beam order.
Definition: DragtFinnMap.h:813
Interface for general multipole.
Definition: Multipole.h:46
FTps< double, 6 > Series
Definition: LieMapper.cpp:60
static Euclid3D YRotation(double angle)
Make rotation.
Definition: Euclid3D.cpp:164
T deg(T x)
Convert radians to degrees.
Definition: matheval.hpp:82
void applyDrift(double length)
Definition: LieMapper.cpp:444
Euclid3D Inverse(const Euclid3D &t)
Euclidean inverse.
Definition: Euclid3D.h:204
virtual double getElementLength() const override
Get design length.
Definition: Solenoid.cpp:256
virtual void visitCorrector(const Corrector &)
Apply the algorithm to a Corrector.
Definition: LieMapper.cpp:125
virtual double getExitFaceRotation() const =0
Get exit pole face rotation.
double getBendAngle() const
Get angle.
virtual void visitDiagnostic(const Diagnostic &)
Apply the algorithm to a Diagnostic.
Definition: LieMapper.cpp:154
Interface for probe.
Definition: Probe.h:16
virtual void visitMultipole(const Multipole &)
Apply the algorithm to a Multipole.
Definition: LieMapper.cpp:184
void assign(const FMatrix< double, 2 *N, 2 *N > &)
Assign the matrix representing the linear transform.
Definition: DragtFinnMap.h:395
virtual void visitRBend(const RBend &)
Apply the algorithm to a RBend.
Definition: LieMapper.cpp:231
double getQ() const
The constant charge per particle.
Definition: PartData.h:107
virtual double getElementLength() const
Get design length.
Definition: ElementBase.h:511
void applyExitFringe(double edge, double curve, const BMultipoleField &field, double scale)
Definition: LieMapper.cpp:474
virtual double getFrequency() const =0
Get RF frequencey.
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:52
Interface for cyclotron collimator.
Definition: CCollimator.h:13
Displacement and rotation in space.
Definition: Euclid3D.h:68
Abstract beam-beam interaction.
Definition: BeamBeam.h:37
Definition: SBend.h:68
virtual void visitProbe(const Probe &)
Apply the algorithm to a Probe.
Definition: LieMapper.cpp:226
FTps< double, 6 > buildSBendVectorPotential(const BMultipoleField &, double h)
Construct the vector potential for an SBend.
bool isIdentity() const
Test for identity.
Definition: Euclid3D.h:233
Interface for cyclotron valley.
virtual double getBx() const
Get horizontal component.
virtual void visitSolenoid(const Solenoid &)
Apply the algorithm to a Solenoid.
Definition: LieMapper.cpp:421
Interface for solenoids.
Definition: Solenoid.h:36
virtual double getElementLength() const
Get element length.
An abstract sequence of beam line components.
Definition: Beamline.h:37
virtual double getEntryFaceCurvature() const =0
Get entry pole face curvature.
virtual double getElementLength() const
Get element length.
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
virtual double getEntryFaceRotation() const =0
Get pole entry face rotation.
A representation for a homogeneous polynomial, used as a Lie generator.
Definition: DragtFinnMap.h:29
The geometry for a RBend element.
Definition: RBendGeometry.h:41
double getP() const
The constant reference momentum per particle.
Definition: PartData.h:117
FTps filter(int minOrder, int maxOrder, int trcOrder=EXACT) const
Extract given range of orders, with truncation.
Definition: FTps.hpp:451
The magnetic field of a multipole.
virtual void visitRFQuadrupole(const RFQuadrupole &)
Apply the algorithm to a RFQuadrupole.
Definition: LieMapper.cpp:332
virtual void visitCyclotronValley(const CyclotronValley &)
Apply the algorithm to a CyclotronValley.
Definition: LieMapper.cpp:306
FTps< double, 6 > buildMultipoleVectorPotential(const BMultipoleField &)
Construct the vector potential for a Multipole.
Interface for RF cavity.
Definition: RFCavity.h:37
double getM() const
The constant mass per particle.
Definition: PartData.h:112
Tps< T > cos(const Tps< T > &x)
Cosine.
Definition: TpsMath.h:129
Abstract collimator.
Definition: Degrader.h:37
virtual double getExitFaceCurvature() const =0
Get exit pole face curvature.
virtual void applyTransform(const Euclid3D &, double refLength=0.0)
Apply transform.
Definition: LieMapper.cpp:484
virtual void visitBeamBeam(const BeamBeam &)
Apply the algorithm to a BeamBeam.
Definition: LieMapper.cpp:107
double getCurvature() const
Get curvature.
virtual RBendGeometry & getGeometry() override=0
Get RBend geometry.
virtual double getBendAngle() const
Get angle.
Interface for a geometric patch.
Definition: Patch.h:34
virtual void visitSeparator(const Separator &)
Apply the algorithm to a Separator.
Definition: LieMapper.cpp:392
virtual void visitMarker(const Marker &)
Apply the algorithm to a Marker.
Definition: LieMapper.cpp:174
Interface for a single beam element.
Definition: Component.h:51
virtual const Euclid3D & getPatch() const =0
Get patch transform.
virtual void visitDrift(const Drift &)
Apply the algorithm to a Drift.
Definition: LieMapper.cpp:160
const PartData itsReference
The reference information.
double getY() const
Get displacement.
Definition: Euclid3D.h:220
int itsOrder
Definition: LieMapper.h:191
virtual void visitPatch(const Patch &)
Apply the algorithm to a Patch.
Definition: LieMapper.cpp:222
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Definition: ReductionLoc.h:95
virtual void visitSBend(const SBend &)
Apply the algorithm to a SBend.
Definition: LieMapper.cpp:338
virtual void visitMonitor(const Monitor &)
Apply the algorithm to a Monitor.
Definition: LieMapper.cpp:179
static FTps makeVariable(int var)
Make variable.
virtual void getMap(LinearMap< double, 6 > &) const
Return the linear part of the accumulated map.
Definition: LieMapper.cpp:77
virtual void visitDegrader(const Degrader &)
Apply the algorithm to a Degrader.
Definition: LieMapper.cpp:149
Interface for a Lambertson septum.
Definition: Lambertson.h:33