OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
SpecificElementVisitor.h
Go to the documentation of this file.
1 #ifndef SPECIFICELEMENTVISITOR_H
2 #define SPECIFICELEMENTVISITOR_H
3 
4 #include <list>
5 
7 
9 #include "AbsBeamline/BeamBeam.h"
12 #include "AbsBeamline/Corrector.h"
13 #include "AbsBeamline/Cyclotron.h"
14 #include "AbsBeamline/Diagnostic.h"
15 #include "AbsBeamline/Drift.h"
16 #include "AbsBeamline/Degrader.h"
19 #include "AbsBeamline/Lambertson.h"
20 #include "AbsBeamline/Offset.h"
21 #include "AbsBeamline/Marker.h"
22 #include "AbsBeamline/Monitor.h"
23 #include "AbsBeamline/Multipole.h"
24 #include "AbsBeamline/MultipoleT.h"
28 #include "AbsBeamline/Patch.h"
29 #include "AbsBeamline/Probe.h"
30 #include "AbsBeamline/RBend.h"
31 #include "AbsBeamline/Ring.h"
32 #include "AbsBeamline/RFCavity.h"
37 #include "AbsBeamline/SBend.h"
38 #include "AbsBeamline/SBend3D.h"
41 #include "AbsBeamline/Separator.h"
42 #include "AbsBeamline/Septum.h"
43 #include "AbsBeamline/Solenoid.h"
44 #include "AbsBeamline/Source.h"
47 #include "AbsBeamline/Stripper.h"
48 
50 
56 
59 
60 template <class ELEM1, class ELEM2>
61 struct CastsTrait {
62  typedef std::list<const ELEM1*> ElementList_t;
63 
64  static void apply(ElementList_t &, const ELEM2 &)
65  { }
66 };
67 
68 template <class ELEM>
69 struct CastsTrait<ELEM,ELEM> {
70  typedef std::list<const ELEM*> ElementList_t;
71 
72  static void apply(ElementList_t &allElements, const ELEM &element)
73  {
74  allElements.push_back(dynamic_cast<const ELEM*>(&element));
75  }
76 };
77 
78 template <class ELEM>
80 public:
81  SpecificElementVisitor(const Beamline &beamline);
82 
83  virtual void execute();
84 
86  virtual void visitBeamBeam(const BeamBeam &);
87 
89  virtual void visitBeamStripping(const BeamStripping &);
90 
92  virtual void visitCCollimator(const CCollimator &);
93 
95  virtual void visitComponent(const Component &);
96 
98  virtual void visitCyclotron(const Cyclotron &);
99 
101  virtual void visitRing(const Ring &);
102 
104  virtual void visitCorrector(const Corrector &);
105 
107  virtual void visitDegrader(const Degrader &);
108 
110  virtual void visitDiagnostic(const Diagnostic &);
111 
113  virtual void visitDrift(const Drift &);
114 
116  virtual void visitFlexibleCollimator(const FlexibleCollimator &);
117 
119  virtual void visitLambertson(const Lambertson &);
120 
122  virtual void visitMarker(const Marker &);
123 
125  virtual void visitMonitor(const Monitor &);
126 
128  virtual void visitMultipole(const Multipole &);
129 
131  virtual void visitMultipoleT(const MultipoleT &);
132 
134  virtual void visitMultipoleTStraight(const MultipoleTStraight &);
135 
138 
141 
143  virtual void visitOffset(const Offset &);
144 
146  virtual void visitPatch(const Patch &pat);
147 
149  virtual void visitProbe(const Probe &prob);
150 
152  virtual void visitRBend(const RBend &);
153 
155  virtual void visitRBend3D(const RBend3D &);
156 
158  virtual void visitVariableRFCavity(const VariableRFCavity &vcav);
159 
162  (const VariableRFCavityFringeField &vcav);
163 
165  virtual void visitRFCavity(const RFCavity &);
166 
168  virtual void visitTravelingWave(const TravelingWave &);
169 
171  virtual void visitRFQuadrupole(const RFQuadrupole &);
172 
174  virtual void visitSBend(const SBend &);
175 
177  virtual void visitSBend3D(const SBend3D &);
178 
180  virtual void visitSeparator(const Separator &);
181 
183  virtual void visitSeptum(const Septum &);
184 
186  virtual void visitSolenoid(const Solenoid &);
187 
189  virtual void visitSource(const Source &);
190 
192  virtual void visitScalingFFAMagnet(const ScalingFFAMagnet &);
193 
195  virtual void visitVerticalFFAMagnet(const VerticalFFAMagnet &);
196 
198  virtual void visitParallelPlate(const ParallelPlate &);
199 
201  virtual void visitCyclotronValley(const CyclotronValley &);
202 
204  virtual void visitStripper(const Stripper &);
205 
207  virtual void visitBeamline(const Beamline &);
208 
210  virtual void visitFlaggedElmPtr(const FlaggedElmPtr &);
211 
212 
214  virtual void visitAlignWrapper(const AlignWrapper &);
215 
217  virtual void visitCorrectorWrapper(const CorrectorWrapper &);
218 
220  virtual void visitCyclotronWrapper(const CyclotronWrapper &);
221 
223  virtual void visitMultipoleWrapper(const MultipoleWrapper &);
224 
226  virtual void visitRBendWrapper(const RBendWrapper &);
227 
229  virtual void visitSBendWrapper(const SBendWrapper &);
230 
231 
233  virtual void visitIntegrator(const Integrator &);
234 
236  virtual void visitMapIntegrator(const MapIntegrator &);
237 
239  virtual void visitTrackIntegrator(const TrackIntegrator &);
240 
241  size_t size() const;
242 
243  typedef std::list<const ELEM*> ElementList_t;
245  typedef typename ElementList_t::const_iterator const_iterator_t;
246 
247  typedef typename ElementList_t::reference reference_t;
248  typedef typename ElementList_t::const_reference const_reference_t;
249 
250  iterator_t begin();
251  const_iterator_t begin() const;
252 
253  iterator_t end();
254  const_iterator_t end() const;
255 
256  reference_t front();
257  const_reference_t front() const;
258 
259 private:
261 };
262 
263 template<class ELEM>
265  BeamlineVisitor(),
266  allElementsOfTypeE()
267 {
268  beamline.iterate(*this, false);
269 }
270 
271 template<class ELEM>
273 { }
274 
275 template<class ELEM>
277  CastsTrait<ELEM, BeamBeam>::apply(allElementsOfTypeE, element);
278 }
279 
280 template<class ELEM>
282  CastsTrait<ELEM, BeamStripping>::apply(allElementsOfTypeE, element);
283 }
284 
285 template<class ELEM>
287  CastsTrait<ELEM, CCollimator>::apply(allElementsOfTypeE, element);
288 }
289 
290 template<class ELEM>
292  CastsTrait<ELEM, Component>::apply(allElementsOfTypeE, element);
293 }
294 
295 template<class ELEM>
297  CastsTrait<ELEM, Cyclotron>::apply(allElementsOfTypeE, element);
298 }
299 
300 template<class ELEM>
302  CastsTrait<ELEM, Ring>::apply(allElementsOfTypeE, element);
303 }
304 
305 template<class ELEM>
307  CastsTrait<ELEM, Corrector>::apply(allElementsOfTypeE, element);
308 }
309 
310 template<class ELEM>
312  CastsTrait<ELEM, Degrader>::apply(allElementsOfTypeE, element);
313 }
314 
315 template<class ELEM>
317  CastsTrait<ELEM, Diagnostic>::apply(allElementsOfTypeE, element);
318 }
319 
320 template<class ELEM>
322  CastsTrait<ELEM, Drift>::apply(allElementsOfTypeE, element);
323 }
324 
325 template<class ELEM>
327  CastsTrait<ELEM, FlexibleCollimator>::apply(allElementsOfTypeE, element);
328 }
329 
330 template<class ELEM>
332  CastsTrait<ELEM, Lambertson>::apply(allElementsOfTypeE, element);
333 }
334 
335 template<class ELEM>
337  CastsTrait<ELEM, Marker>::apply(allElementsOfTypeE, element);
338 }
339 
340 template<class ELEM>
342  CastsTrait<ELEM, Monitor>::apply(allElementsOfTypeE, element);
343 }
344 
345 template<class ELEM>
347  CastsTrait<ELEM, Multipole>::apply(allElementsOfTypeE, element);
348 }
349 
350 template<class ELEM>
352  CastsTrait<ELEM, MultipoleT>::apply(allElementsOfTypeE, element);
353 }
354 
355 template<class ELEM>
357  CastsTrait<ELEM, MultipoleTStraight>::apply(allElementsOfTypeE, element);
358 }
359 
360 template<class ELEM>
362  CastsTrait<ELEM, MultipoleTCurvedConstRadius>::apply(allElementsOfTypeE, element);
363 }
364 
365 template<class ELEM>
367  CastsTrait<ELEM, MultipoleTCurvedVarRadius>::apply(allElementsOfTypeE, element);
368 }
369 
370 template<class ELEM>
372  CastsTrait<ELEM, Offset>::apply(allElementsOfTypeE, element);
373 }
374 
375 template<class ELEM>
377  CastsTrait<ELEM, Patch>::apply(allElementsOfTypeE, element);
378 }
379 
380 template<class ELEM>
382  CastsTrait<ELEM, Probe>::apply(allElementsOfTypeE, element);
383 }
384 
385 template<class ELEM>
387  CastsTrait<ELEM, RBend>::apply(allElementsOfTypeE, element);
388 }
389 
390 template<class ELEM>
392  CastsTrait<ELEM, RBend3D>::apply(allElementsOfTypeE, element);
393 }
394 
395 template<class ELEM>
397  (const VariableRFCavity &element) {
398  CastsTrait<ELEM, VariableRFCavity>::apply(allElementsOfTypeE, element);
399 }
400 
401 template<class ELEM>
403  (const VariableRFCavityFringeField &element) {
405  element);
406 }
407 
408 template<class ELEM>
410  CastsTrait<ELEM, RFCavity>::apply(allElementsOfTypeE, element);
411 }
412 
413 template<class ELEM>
415  CastsTrait<ELEM, TravelingWave>::apply(allElementsOfTypeE, element);
416 }
417 
418 template<class ELEM>
420  CastsTrait<ELEM, RFQuadrupole>::apply(allElementsOfTypeE, element);
421 }
422 
423 template<class ELEM>
425  CastsTrait<ELEM, SBend>::apply(allElementsOfTypeE, element);
426 }
427 
428 template<class ELEM>
430  CastsTrait<ELEM, SBend3D>::apply(allElementsOfTypeE, element);
431 }
432 
433 template<class ELEM>
435  CastsTrait<ELEM, ScalingFFAMagnet>::apply(allElementsOfTypeE, element);
436 }
437 
438 template<class ELEM>
440  CastsTrait<ELEM, VerticalFFAMagnet>::apply(allElementsOfTypeE, element);
441 }
442 
443 template<class ELEM>
445  CastsTrait<ELEM, Separator>::apply(allElementsOfTypeE, element);
446 }
447 
448 template<class ELEM>
450  CastsTrait<ELEM, Septum>::apply(allElementsOfTypeE, element);
451 }
452 
453 template<class ELEM>
455  CastsTrait<ELEM, Solenoid>::apply(allElementsOfTypeE, element);
456 }
457 
458 template<class ELEM>
460  CastsTrait<ELEM, Source>::apply(allElementsOfTypeE, element);
461 }
462 
463 template<class ELEM>
465  CastsTrait<ELEM, ParallelPlate>::apply(allElementsOfTypeE, element);
466 }
467 
468 template<class ELEM>
470  CastsTrait<ELEM, CyclotronValley>::apply(allElementsOfTypeE, element);
471 }
472 
473 template<class ELEM>
475  CastsTrait<ELEM, Stripper>::apply(allElementsOfTypeE, element);
476 }
477 
478 template<class ELEM>
480  element.iterate(*this, false);
481 }
482 
483 template<class ELEM>
485  const ElementBase* wrappedElement = element.getElement();
486  wrappedElement->accept(*this);
487 }
488 
489 template<class ELEM>
491  const ElementBase* wrappedElement = element.getElement();
492  wrappedElement->accept(*this);
493 }
494 
495 template<class ELEM>
497  CastsTrait<ELEM, CorrectorWrapper>::apply(allElementsOfTypeE, element);
498 }
499 
500 template<class ELEM>
502  CastsTrait<ELEM, CyclotronWrapper>::apply(allElementsOfTypeE, element);
503 }
504 
505 template<class ELEM>
507  CastsTrait<ELEM, MultipoleWrapper>::apply(allElementsOfTypeE, element);
508 }
509 
510 template<class ELEM>
512  CastsTrait<ELEM, RBendWrapper>::apply(allElementsOfTypeE, element);
513 }
514 
515 template<class ELEM>
517  CastsTrait<ELEM, SBendWrapper>::apply(allElementsOfTypeE, element);
518 }
519 
520 template<class ELEM>
522 
523 }
524 
525 template<class ELEM>
527 
528 }
529 
530 template<class ELEM>
532 
533 }
534 
535 template<class ELEM>
537  return allElementsOfTypeE.size();
538 }
539 
540 template<class ELEM>
542  return allElementsOfTypeE.begin();
543 }
544 
545 template<class ELEM>
547  return allElementsOfTypeE.begin();
548 }
549 
550 template<class ELEM>
552  return allElementsOfTypeE.end();
553 }
554 
555 template<class ELEM>
557  return allElementsOfTypeE.end();
558 }
559 
560 template<class ELEM>
562  return allElementsOfTypeE.front();
563 }
564 
565 template<class ELEM>
567  return allElementsOfTypeE.front();
568 }
569 
570 #endif
SpecificElementVisitor(const Beamline &beamline)
virtual void visitIntegrator(const Integrator &)
Apply the algorithm to a generic integrator.
virtual ElementBase * getElement() const
Return the contained element.
virtual void iterate(BeamlineVisitor &, bool reverse) const =0
Apply visitor to all elements of the line.
virtual void visitSeptum(const Septum &)
Apply the algorithm to a septum.
Definition: Source.h:12
Interface for solenoids.
Definition: RBend3D.h:39
virtual void visitMultipoleTCurvedConstRadius(const MultipoleTCurvedConstRadius &)
Apply the algorithm to a multipoleT.
virtual void visitDrift(const Drift &)
Apply the algorithm to a drift.
virtual void visitRFQuadrupole(const RFQuadrupole &)
Apply the algorithm to a RF quadrupole.
ElementList_t::const_iterator const_iterator_t
virtual void visitRFCavity(const RFCavity &)
Apply the algorithm to a RF cavity.
Interface for basic beam line object.
Definition: ElementBase.h:128
virtual void visitProbe(const Probe &prob)
Apply the algorithm to a probe.
Definition: Offset.h:66
virtual void visitCyclotron(const Cyclotron &)
Apply the algorithm to an cyclotron.
virtual void visitSource(const Source &)
Apply the algorithm to a solenoid.
static void apply(ElementList_t &, const ELEM2 &)
Interface for septum magnet.
Definition: Septum.h:11
virtual void visitMultipoleWrapper(const MultipoleWrapper &)
Apply the algorithm to an multipole wrapper..
Interface for electrostatic separator.
Definition: Separator.h:33
Interface for a Cyclotron.
Definition: Cyclotron.h:91
virtual void visitAlignWrapper(const AlignWrapper &)
Apply the algorithm to an align wrapper..
Interface for beam position monitors.
Definition: Monitor.h:41
Interface for RF Quadrupole.
Definition: RFQuadrupole.h:30
virtual void visitBeamBeam(const BeamBeam &)
Apply the algorithm to a beam-beam.
Define the position of a misaligned element.
Definition: AlignWrapper.h:39
Interface for RF cavity.
Definition: ParallelPlate.h:36
Interface for general corrector.
Definition: Corrector.h:35
virtual void visitStripper(const Stripper &)
Apply the algorithm to a charge stripper.
Abstract collimator.
Definition: RBend.h:73
Interface for beam diagnostics.
Definition: Diagnostic.h:32
Interface for a marker.
Definition: Marker.h:32
Representation of a perturbed multipole.
virtual void visitVariableRFCavityFringeField(const VariableRFCavityFringeField &vcav)
Apply the algorithm to a RF cavity.
Interface for drift space.
Definition: Drift.h:33
std::list< const ELEM * > ElementList_t
virtual void visitRBend(const RBend &)
Apply the algorithm to a rectangular bend.
virtual void visitMonitor(const Monitor &)
Apply the algorithm to a monitor.
ElementList_t::const_reference const_reference_t
virtual void visitOffset(const Offset &)
Apply the algorithm to an Offset.
virtual void visitCyclotronWrapper(const CyclotronWrapper &)
Apply the algorithm to an cyclotron wrapper..
virtual void visitCCollimator(const CCollimator &)
Apply the algorithm to a collimator.
virtual void visitVerticalFFAMagnet(const VerticalFFAMagnet &)
Apply the algorithm to a spiral sector magnet.
virtual void visitRBendWrapper(const RBendWrapper &)
Apply the algorithm to an RBend wrapper..
Interface for general multipole.
Definition: Multipole.h:46
static void apply(ElementList_t &allElements, const ELEM &element)
virtual void visitDegrader(const Degrader &)
Apply the algorithm to a drift.
virtual void visitCorrector(const Corrector &)
Apply the algorithm to a corrector.
virtual void visitPatch(const Patch &pat)
Apply the algorithm to a patch.
Interface for probe.
Definition: Probe.h:16
virtual void visitSBend3D(const SBend3D &)
Apply the algorithm to a sector bend.
virtual void visitMultipoleTCurvedVarRadius(const MultipoleTCurvedVarRadius &)
Apply the algorithm to a multipoleT.
virtual void visitMultipoleT(const MultipoleT &)
Apply the algorithm to a multipoleT.
virtual void visitBeamStripping(const BeamStripping &)
Apply the algorithm to a beam stripping.
virtual void visitComponent(const Component &)
Apply the algorithm to an arbitrary component.
virtual void visitMarker(const Marker &)
Apply the algorithm to a marker.
virtual void accept(BeamlineVisitor &visitor) const =0
Apply visitor.
Interface for cyclotron collimator.
Definition: CCollimator.h:13
virtual void visitMultipoleTStraight(const MultipoleTStraight &)
Apply the algorithm to a multipoleTStraight.
Abstract beam-beam interaction.
Definition: BeamBeam.h:37
Interface for RF cavity.
Definition: TravelingWave.h:37
virtual void visitLambertson(const Lambertson &)
Apply the algorithm to a Lambertson.
Definition: SBend.h:68
Representation of a perturbed cyclotron.
virtual void execute()
Execute the algorithm on the attached beam line.
Interface for cyclotron valley.
virtual void visitTrackIntegrator(const TrackIntegrator &)
Apply the algorithm to an integrator capable of tracking.
virtual void visitFlaggedElmPtr(const FlaggedElmPtr &)
Apply the algorithm to a FlaggedElmPtr.
virtual void visitSBend(const SBend &)
Apply the algorithm to a sector bend.
virtual void visitTravelingWave(const TravelingWave &)
Apply the algorithm to a RF cavity.
Representation of a perturbed sector bend.
Definition: SBendWrapper.h:37
Interface for solenoids.
Definition: Solenoid.h:36
An abstract sequence of beam line components.
Definition: Beamline.h:37
Integrate particle.
virtual void visitMapIntegrator(const MapIntegrator &)
Apply the algorithm to an integrator capable of mapping.
virtual void visitSeparator(const Separator &)
Apply the algorithm to a separator.
virtual void visitParallelPlate(const ParallelPlate &)
Apply the algorithm to a ParallelPlate.
Representation for a perturbed closed orbit corrector.
virtual void visitFlexibleCollimator(const FlexibleCollimator &)
Apply the algorithm to a flexible collimator.
ElementList_t::reference reference_t
virtual void visitRBend3D(const RBend3D &)
Apply the algorithm to a rectangular bend.
virtual void visitVariableRFCavity(const VariableRFCavity &vcav)
Apply the algorithm to a RF cavity.
Interface for RF cavity.
Definition: RFCavity.h:37
Abstract collimator.
Definition: Degrader.h:37
virtual void visitSolenoid(const Solenoid &)
Apply the algorithm to a solenoid.
Base class for special integrators.
Definition: Integrator.h:41
Ring describes a ring type geometry for tracking.
Definition: Ring.h:64
virtual void visitMultipole(const Multipole &)
Apply the algorithm to a multipole.
std::string::iterator iterator
Definition: MSLang.h:16
Interface for a geometric patch.
Definition: Patch.h:34
ElementList_t::iterator iterator_t
Interface for a single beam element.
Definition: Component.h:51
virtual void visitRing(const Ring &)
Apply the algorithm to an opal ring..
virtual void visitScalingFFAMagnet(const ScalingFFAMagnet &)
Apply the algorithm to a spiral sector magnet.
Representation of a perturbed rectangular bend.
Definition: RBendWrapper.h:37
virtual void visitCyclotronValley(const CyclotronValley &)
Apply the algorithm to a CyclotronValley.
virtual void visitDiagnostic(const Diagnostic &)
Apply the algorithm to a diagnostic.
Abstract algorithm.
ElementBase * getElement() const
Get the element pointer.
Definition: ElmPtr.h:58
virtual void visitCorrectorWrapper(const CorrectorWrapper &)
Apply the algorithm to an corrector wrapper..
std::list< const ELEM * > ElementList_t
virtual void visitBeamline(const Beamline &)
Apply the algorithm to a beam line.
Interface for a Lambertson septum.
Definition: Lambertson.h:33
std::list< const ELEM1 * > ElementList_t
Integrate a map.
Definition: MapIntegrator.h:41
A section of a beam line.
Definition: FlaggedElmPtr.h:36
virtual void visitSBendWrapper(const SBendWrapper &)
Apply the algorithm to an SBend wrapper..