OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
ThickTracker.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // Copyright: see Copyright.readme
3 // ------------------------------------------------------------------------
4 //
5 // Class: ThickTracker
6 // The visitor class for building a map of given order for a beamline
7 // using a finite-length lenses for all elements.
8 // Multipole-like elements are done by expanding the Lie series.
9 //
10 // ------------------------------------------------------------------------
11 //
12 // $Author: ganz_p $
13 //
14 // ------------------------------------------------------------------------
15 
16 
17 #include <cfloat>
18 #include <fstream>
19 #include <typeinfo>
20 
22 
23 #include "Beamlines/Beamline.h"
25 
27 
28 #include "Utilities/Options.h"
29 #include "Utilities/Util.h"
30 #include "Utilities/Timer.h"
31 
32 #include "Physics/Physics.h"
33 
34 //
35 // Class ThickTracker
36 // ------------------------------------------------------------------------
37 //
39  const PartData &reference,
40  bool revBeam, bool revTrack)
41  : Tracker(beamline, reference, revBeam, revTrack)
42  , hamiltonian_m(1)
43  , RefPartR_m(0.0)
44  , RefPartP_m(0.0)
45  , itsDataSink_m(nullptr)
46  , itsOpalBeamline_m(beamline.getOrigin3D(), beamline.getInitialDirection())
47  , zstart_m(0.0)
48  , zstop_m(0.0)
49  , threshold_m(1.0e-6)
50  , truncOrder_m(1) // linear
51  , mapCreation_m( IpplTimings::getTimer("mapCreation"))
52  , mapCombination_m(IpplTimings::getTimer("mapCombination"))
53  , mapTracking_m( IpplTimings::getTimer("mapTracking"))
54 {
55  CoordinateSystemTrafo labToRef(beamline.getOrigin3D(),
56  beamline.getInitialDirection());
57  referenceToLabCSTrafo_m = labToRef.inverted();
58 }
59 
60 
63  Beam &beam,
64  DataSink &ds,
65  const PartData &reference,
66  bool revBeam, bool revTrack,
67  const std::vector<unsigned long long> &maxSteps,
68  double zstart,
69  const std::vector<double> &zstop,
70  const std::vector<double> &dt,
71  const int& truncOrder)
72  : Tracker(beamline, bunch, reference, revBeam, revTrack)
73  , hamiltonian_m(truncOrder)
74  , RefPartR_m(0.0)
75  , RefPartP_m(0.0)
76  , itsDataSink_m(&ds)
77  , itsOpalBeamline_m(beamline.getOrigin3D(), beamline.getInitialDirection())
78  , zstart_m(zstart)
79  , zstop_m(zstop[0])
80  , threshold_m(1.0e-6)
81  , truncOrder_m(truncOrder)
82  , mapCreation_m( IpplTimings::getTimer("mapCreation"))
83  , mapCombination_m(IpplTimings::getTimer("mapCombination"))
84  , mapTracking_m( IpplTimings::getTimer("mapTracking"))
85 {
86  if ( zstop.size() > 1 )
87  throw OpalException("ThickTracker::ThickTracker()",
88  "Multiple tracks not yet supported.");
89 
90 
91  CoordinateSystemTrafo labToRef(beamline.getOrigin3D(),
92  beamline.getInitialDirection());
93  referenceToLabCSTrafo_m = labToRef.inverted();
94 }
95 
96 
98 {}
99 
100 
101 
103 
104  const FlaggedBeamline* fbl = static_cast<const FlaggedBeamline*>(&bl);
105  if (fbl->getRelativeFlag()) {
106  *gmsg << " do stuff" << endl;
107  OpalBeamline stash(fbl->getOrigin3D(), fbl->getInitialDirection());
108  stash.swap(itsOpalBeamline_m);
109  fbl->iterate(*this, false);
112  stash.merge(itsOpalBeamline_m);
113  stash.swap(itsOpalBeamline_m);
114  } else {
115  fbl->iterate(*this, false);
116  }
117 }
118 
119 
121  itsBeamline_m.accept(*this);
123 }
124 
125 
126 
127 
128 /*
129 //TODO complete and test fringe fields
130 void ThickTracker::insertFringeField(SBend* pSBend, lstruct_t& mBL,
131  double& beta0, double& gamma0, double& P0, double& q, std::array<double,2>& paramFringe, std::string e){
132 
133 
134  series_t H;
135  map_t tempMap, fieldMap;
136  lstruct_t::iterator mBLit;
137  double lenFringe = paramFringe[0] + paramFringe[1];
138 
139  //double intHeight = 0.1; //:TODO: change or argument for that value
140  double stepSize = 0.01; //:TODO: change or argument for that value maybe minStepIfSC?
141 
142 
143  //entrFringe = std::fabs(intHeight * std::tan(pSBend->getEntranceAngle()));
144 
145  //get proper slices for the fringe field
146  double nSlices = std::ceil(2 * lenFringe / stepSize);
147  stepSize = 2 * lenFringe / nSlices;
148 
149  //Create structMapTracking and push in BeamLine
150  double K0= pSBend ->getB()*(Physics::c/itsReference.getP());
151  K0= std::round(K0*1e6)/1e6 *q*(Physics::c/P0);
152 
153  double h = 1./ pSBend ->getBendRadius(); //inverse bending radius [1/m]
154  K0<0 ? h = -1*h : h = 1*h;
155 
156  series_t az = - K0 / (2 * lenFringe) * (hamiltonian_m.y*hamiltonian_m.y - hamiltonian_m.x*hamiltonian_m.x) * std::tan(pSBend->getEntranceAngle());
157  if (e == "out") {
158  az = -az;
159  }
160  std::cout << az.getMaxOrder() << std::endl;
161  for ( int i = 0 ; i < nSlices; i++ ){
162  double l = stepSize * i;
163  series_t ax = 0.5 * K0 / (2 * lenFringe) * (l*l - hamiltonian_m.y*hamiltonian_m.y);
164  H = hamiltonian_m.bendFringe(beta0, gamma0, h, K0, ax, az);
165  tempMap = ExpMap(-H * stepSize ,truncOrder_m);
166  fieldMap = (tempMap * fieldMap).truncate(truncOrder_m);
167  }
168 
169  structMapTracking fringeField;
170  fringeField.elementName=pSBend->getName() + "accumulated Fringe Field Map";
171  if (e == "in"){
172  fringeField.elementPos=(pSBend->getElementPosition() - paramFringe[0]);
173  } else if (e == "out") {
174  fringeField.elementPos=(pSBend->getElementPosition() + pSBend->getArcLength() - paramFringe[1]);
175  }
176  fringeField.stepSize= lenFringe;
177  fringeField.nSlices=1;
178  fringeField.elementMap=fieldMap;
179  mBL.push_back(fringeField);
180 }
181 */
182 
183 
189 
190  /*
191  * global settings
192  */
193  Inform msg("ThickTracker", *gmsg);
194 
196 
198 
199  if ( OpalData::getInstance()->hasPriorTrack() ||
200  OpalData::getInstance()->inRestartRun() )
201  {
203  }
204 
205  prepareSections();
206 
207  msg << "Truncation order: " << this->truncOrder_m << endl;
208 
209 
210  this->checkElementOrder_m();
211 
212  this->fillGaps_m();
213 
214  //FIXME in local system only
215  RefPartR_m = Vector_t(0.0);
217 
219 
220 // IpplTimings::startTimer(mapCreation_m);
221 
222  // TODO need a way to implement Initial dispersion Values
223  //dispInitialVal[0][0]= 0.5069938765;
224  //dispInitialVal[0][1]= -0.1681363086;
226 
227  track_m();
228 
229  // fMatrix_t sigMatrix = itsBunch_m->getSigmaMatrix();
230  // linSigAnalyze(sigMatrix);
231 }
232 
233 
235 
236  // check order of beam line
238  beamline_t::const_iterator el = elements_m.cbegin();
239 
240  double currentEnd = zstart_m;
241  for (FieldList::iterator it = elements.begin(); it != elements.end(); ++it) {
242  double pos = it->getElement()->getElementPosition();
243  // we have to take this length due to dipole --> arclength
244  if ( currentEnd - pos > threshold_m ) {
245 
246  throw OpalException("ThickTracker::checkOrder_m()",
247  std::string("Elements are not in ascending order or overlap.") +
248  " Element Name: " + it->getElement()->getName() +
249  " ELEMEDGE position: " + std::to_string(pos) +
250  " Beamline end " + std::to_string(currentEnd) +
251  " element length " + std::to_string(std::get<2>(*el))) ;
252  }
253  currentEnd = pos + std::get<2>(*el);
254  ++el;
255  while (std::get<2>(*el) == 0) ++el; // skip zero-length elements (aka fringe fields)
256  }
257 }
258 
259 
261 
265 
266  beamline_t tmp;
267 
269  beamline_t::const_iterator el = elements_m.cbegin();
270 
271  double currentEnd = zstart_m;
272  for (FieldList::iterator it = elements.begin(); it != elements.end(); ++it) {
273 
274  tmp.push_back( *el );
275 
276  double pos = it->getElement()->getElementPosition();
277 
278  double length = std::abs(pos - currentEnd);
279  if ( length > threshold_m ) {
280  //FIXME if gamma changes this is an error!!!
281  double gamma = itsReference.getGamma();
282  tmp.push_back(std::make_tuple(hamiltonian_m.drift(gamma), 1, length));
283  }
284 
285  currentEnd = pos + std::get<2>(*el);
286  ++el;
287  }
288 
289  double length = std::abs(zstop_m - currentEnd);
290  if ( length > threshold_m ) {
291  //FIXME if gamma changes this is an error!!!
292  double gamma = itsReference.getGamma();
293  tmp.push_back(std::make_tuple(hamiltonian_m.drift(gamma), 1, length));
294  }
295 
296  elements_m.swap(tmp);
297 }
298 
299 
301 {
303 
304  fMatrix_t tFMatrix;
305  for (int i=0; i<6; i++){
306  tFMatrix[i][i]=1.;
307  }
308 
309  FMatrix<double, 1, 4> dispInitialVal;
310  for (int i=2; i<4; i++){
311  dispInitialVal[0][i]=0;
312  }
313 
314  map_t transferMap;
315 
316  fMatrix_t refSigma;
317  refSigma = (itsBunch_m->getSigmaMatrix());
318 
319  double spos = zstart_m;
320 
321 
322  this->advanceDispersion_m(tFMatrix, dispInitialVal, spos);
323 
324 
325  std::size_t step = 0;
326 
327  this->dump_m();
328 
329  //(1) Loop Beamline
330  for(beamline_t::const_iterator it = elements_m.cbegin(); it != elements_m.end(); ++it) {
331  //(2) Loop Slices
332 
333  const series_t& H = std::get<0>(*it);
334  const std::size_t& nSlices = std::get<1>(*it);
335  const double& length = std::get<2>(*it);
336 
337  const double ds = length / double(nSlices);
338 
339  map_t map = ExpMap(- H * ds, truncOrder_m);
340 
341  // global truncation order is truncOrder_m + 1
342  map = map.truncate(truncOrder_m);
343 
344  for (std::size_t slice = 0; slice < nSlices; ++slice) {
345 
346  this->advanceParticles_m(map);
347 
348  this->concatenateMaps_m(map, transferMap);
349 
350  tFMatrix= transferMap.linearTerms();
351  this->advanceDispersion_m(tFMatrix, dispInitialVal, spos);
352 
353  spos += ds;
354  ++step;
355 
356  this->update_m(spos, step);
357 
358  this->dump_m();
359 
360  refSigma = itsBunch_m->getSigmaMatrix();
361 
362  //printPhaseShift(refSigma ,mapBeamLineit->elementMap.linearTerms(), N);
363  }
364  }
365 
366 
367  this->write_m(transferMap);
368 
370 }
371 
372 
375  const Vector_t& P) const
376 {
377  particle_t particle;
378  for (int d = 0; d < 3; ++d) {
379  particle[2 * d] = R(d);
380  particle[2 *d + 1] = P(d);
381  }
382  return particle;
383 }
384 
385 
387  Vector_t& R,
388  Vector_t& P) const
389 {
390  for (int d = 0; d < 3; ++d) {
391  R(d) = particle[2 * d];
392  P(d) = particle[2 *d + 1];
393  }
394 }
395 
396 
397 void ThickTracker::write_m(const map_t& map) {
398 
399  if ( Ippl::myNode() == 0 ) {
400 
401  static bool first = true;
402 
403  std::string fn = OpalData::getInstance()->getInputBasename() + ".map";
404 
405  std::ofstream out;
406 
407  if ( first ) {
408  first = false;
409  out.open(fn, std::ios::out);
410  } else {
411  out.open(fn, std::ios::app);
412  }
413 
414  out << std::setprecision(16)
415  << map
416  << std::endl;
417 
418  out.close();
419  }
420 }
421 
422 
424  for (std::size_t ip = 0; ip < itsBunch_m->getLocalNum(); ++ip) {
425 
426  particle_t particle = this->particleToVector_m(itsBunch_m->R[ip],
427  itsBunch_m->P[ip]);
428 
429  this->updateParticle_m(particle, map);
430 
431  this->vectorToParticle_m(particle,
432  itsBunch_m->R[ip],
433  itsBunch_m->P[ip]);
434  }
435 
436  // update reference particle
437  particle_t particle = this->particleToVector_m(RefPartR_m,
438  RefPartP_m);
439 
440  this->updateParticle_m(particle, map);
441 
442  this->vectorToParticle_m(particle,
443  RefPartR_m,
444  RefPartP_m);
445 }
446 
447 
449  const map_t& map)
450 {
451  double betagamma = itsBunch_m->getInitialBeta() * itsBunch_m->getInitialGamma();
452 
453  //Units
454  double pParticle= std::sqrt( particle[1] * particle[1] +
455  particle[3] * particle[3] +
456  particle[5] * particle[5]); // [beta gamma]
457 
458  particle[1] /= betagamma;
459  particle[3] /= betagamma;
460 
461  particle[5] = std::sqrt( 1.0 + pParticle * pParticle ) / betagamma
462  - 1.0 / itsBunch_m->getInitialBeta();
463 
464  //Apply element map
465  particle = map * particle;
466 
467  //Units back
468  particle[1] *= betagamma;
469  particle[3] *= betagamma;
470 
471  double tempGamma = (particle[5] + 1.0 / itsBunch_m->getInitialBeta())
472  * betagamma ;
473 
474  pParticle = std::sqrt( tempGamma * tempGamma -1.0);
475 
476  particle[5] = std::sqrt(pParticle * pParticle -
477  particle[1] * particle[1] -
478  particle[3] * particle[3] );
479 }
480 
481 
484  y = x * y;
485  y = y.truncate(truncOrder_m);
487 }
488 
489 
491 
500  FMatrix<double, 1, 4> initialVal,
501  double pos)
502 {
503  if ( Ippl::myNode() == 0 ) {
504  static bool first = true;
505 
506  std::ofstream out;
507  std::string fn = OpalData::getInstance()->getInputBasename() + ".dispersion";
508 
509  if ( first ) {
510  first = false;
511  out.open(fn, std::ios::out);
512  } else {
513  out.open(fn, std::ios::app);
514  }
515 
516  out << std::setprecision(16);
517 
518 
519  FMatrix<double, 2, 2> subx, suby;
520  FMatrix<double, 2, 1> subdx, subdy;
521  FMatrix<double, 2, 1> dxi, dyi, dx, dy;
522 
523  for (int i=0; i<2; i++){
524  dxi[i][0]= initialVal[0][i]; //
525  dyi[i][0]= initialVal[0][i+2];
526 
527  subdx[i][0]=tempMatrix[i][5]*itsBunch_m->getInitialBeta();
528  subdy[i][0]=tempMatrix[i+2][5]*itsBunch_m->getInitialBeta();
529 
530  for (int j=0; j<2; j++){
531 
532  subx[i][j]=tempMatrix[i][j];
533  suby[i][j]=tempMatrix[i+2][j+2];
534 
535  }
536  }
537 
538  dx= subx*dxi + subdx;
539  dy= suby*dyi + subdy;
540 
541 
542 
543  out <<pos<< "\t" << dx[0][0] << "\t" << dx[0][1] << "\t" << dy[0][0] << "\t" << dy[0][1] << std::endl;
544  }
545 }
546 
547 
549 
550  if ( itsBunch_m->getTotalNum() == 0 )
551  return;
552 
553  Inform msg("ThickTracker", *gmsg);
554 
555  msg << *itsBunch_m << endl;
556 
557  const std::size_t step = itsBunch_m->getGlobalTrackStep();
558 
559  bool psDump = ((step + 1) % Options::psDumpFreq == 0);
560  bool statDump = ((step + 1) % Options::statDumpFreq == 0);
561 
562  // Sample fields at (xmin, ymin, zmin), (xmax, ymax, zmax) and the centroid location. We
563  // are sampling the electric and magnetic fields at the back, front and
564  // center of the beam.
565 
566  Vector_t FDext[2]; // FDext = {BHead, EHead, BRef, ERef, BTail, ETail}.
567 
568  if (psDump || statDump) {
569 
570  Vector_t externalE, externalB;
571 
572  Vector_t rmin, rmax;
573  itsBunch_m->get_bounds(rmin, rmax);
574 
575  externalB = Vector_t(0.0);
576  externalE = Vector_t(0.0);
579  itsBunch_m->getT() - 0.5 * itsBunch_m->getdT(),
580  externalE,
581  externalB);
582  FDext[0] = referenceToLabCSTrafo_m.rotateFrom(externalB);
583  FDext[1] = referenceToLabCSTrafo_m.rotateFrom(externalE * 1e-6);
584  }
585 
586 
587  if ( psDump ) {
589  }
590 
591  if ( statDump ) {
592  std::vector<std::pair<std::string, unsigned int> > collimatorLosses;
593  itsDataSink_m->dumpSDDS(itsBunch_m, FDext, collimatorLosses);
594  }
595 }
596 
597 
598 void ThickTracker::update_m(const double& spos,
599  const std::size_t& step)
600 {
601  // update dt and t
602  double ds = spos - itsBunch_m->get_sPos();
603  double gamma = itsBunch_m->get_gamma();
604  double beta = std::sqrt(1.0 - 1.0 / (gamma * gamma) );
605  double dt = ds / Physics::c / beta;
606  itsBunch_m->setdT(dt);
607  itsBunch_m->setT(itsBunch_m->getT() + dt);
608 
609  const unsigned int localNum = itsBunch_m->getLocalNum();
610  for (unsigned int i = 0; i < localNum; ++i) {
611  itsBunch_m->dt[i] = dt;
612  }
613 
614 
615  itsBunch_m->set_sPos(spos);
619 }
void checkElementOrder_m()
ParticleAttrib< Vector_t > P
elements
Definition: IndexMap.cpp:141
FVps truncate(int trunc)
Truncate.
Definition: FVps.hpp:234
void write_m(const map_t &map)
CoordinateSystemTrafo referenceToLabCSTrafo_m
Definition: ThickTracker.h:377
double getT() const
void advanceParticles_m(const map_t &map)
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
constexpr double e
The value of .
Definition: Physics.h:40
void setOpenMode(OPENMODE openMode)
Definition: OpalData.cpp:377
void prepareSections()
bool getRelativeFlag() const
Definition: TBeamline.h:470
OpalBeamline itsOpalBeamline_m
Definition: ThickTracker.h:370
Vector_t rotateTo(const Vector_t &r) const
const Beamline & itsBeamline_m
Definition: Tracker.h:145
The base class for all OPAL exceptions.
Definition: OpalException.h:28
IpplTimings::TimerRef mapTracking_m
track particles trough maps of elements_m
Definition: ThickTracker.h:384
void compute3DLattice()
std::list< ClassicField > FieldList
Definition: ClassicField.h:47
Particle reference data.
Definition: PartData.h:38
void advanceDispersion_m(fMatrix_t tempMatrix, FMatrix< double, 1, 4 > initialVal, double pos)
Writes Dispersion in X and Y plane.
double getdT() const
Inform * gmsg
Definition: Main.cpp:21
static int myNode()
Definition: IpplInfo.cpp:794
void updateParticle_m(particle_t &particle, const map_t &map)
Vector_t transformTo(const Vector_t &r) const
Vector_t get_pmean_Distribution() const
void setdT(double dt)
virtual Quaternion getInitialDirection() const
Definition: Beamline.cpp:53
unsigned long getFieldAt(const unsigned int &, const Vector_t &, const long &, const double &, Vector_t &, Vector_t &)
ThickTracker()=delete
Vector_t getOrigin3D() const
Definition: TBeamline.h:450
FMatrix< double, 2 *Dim, 2 *Dim > getSigmaMatrix()
size_t getTotalNum() const
Hamiltonian::series_t drift(const double &gamma0)
Definition: Hamiltonian.cpp:16
int statDumpFreq
The frequency to dump statistical values, e.e. dump data when stepstatDumpFreq==0.
Definition: Options.cpp:54
double getInitialBeta() const
void set_sPos(double s)
static OpalData * getInstance()
Definition: OpalData.cpp:209
double zstart_m
Start of beam line.
Definition: ThickTracker.h:372
beamline_t elements_m
elements in beam line
Definition: ThickTracker.h:375
void calcBeamParameters()
Template class for beam lines.
Definition: TBeamline.h:40
IpplTimings::TimerRef mapCombination_m
map accumulation along elements_m -&gt; Transfermap
Definition: ThickTracker.h:383
void fillGaps_m()
Fills undefined beam path with a Drift Space.
virtual void accept(BeamlineVisitor &visitor) const =0
Apply visitor.
virtual ~ThickTracker()
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:52
Hamiltonian hamiltonian_m
Definition: ThickTracker.h:361
static void startTimer(TimerRef t)
Definition: IpplTimings.h:187
particle_t particleToVector_m(const Vector_t &R, const Vector_t &P) const
virtual void visitBeamline(const Beamline &)
Apply the algorithm to a beam line.
void vectorToParticle_m(const particle_t &particle, Vector_t &R, Vector_t &P) const
void prepareSections()
virtual void iterate(BeamlineVisitor &, bool r2l) const
Apply visitor to all elements of the line.
Definition: TBeamline.h:215
void dumpH5(PartBunchBase< double, 3 > *beam, Vector_t FDext[]) const
Definition: DataSink.cpp:69
FieldList getElementByType(ElementBase::ElementType)
FVps< T, N > ExpMap(const FTps< T, N > &H, int trunc=FTps< T, N >::EXACT)
Build the exponential series.
Definition: FTps.hpp:1994
double getInitialGamma() const
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
void swap(OpalBeamline &rhs)
double zstop_m
End of beam line.
Definition: ThickTracker.h:373
An abstract sequence of beam line components.
Definition: Beamline.h:37
const PartData itsReference
The reference information.
size_t getLocalNum() const
FMatrix< T, N, N > linearTerms() const
Extract the linear part of the map.
Definition: FVps.hpp:561
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
int psDumpFreq
The frequency to dump the phase space, i.e.dump data when steppsDumpFreq==0.
Definition: Options.cpp:48
ParticleAttrib< double > dt
double getGamma() const
The relativistic gamma per particle.
Definition: PartData.h:132
double get_gamma() const
Vector_t RefPartR_m
Definition: ThickTracker.h:365
DataSink * itsDataSink_m
Definition: ThickTracker.h:368
void setGlobalPhaseShift(double shift)
units: (sec)
Definition: OpalData.cpp:492
The BEAM definition.
Definition: Beam.h:35
T euclidean_norm(const Vector< T > &)
Euclidean norm.
Definition: Vector.h:243
Vector_t rotateFrom(const Vector_t &r) const
void setT(double t)
double threshold_m
Threshold for element overlaps and gaps.
Definition: ThickTracker.h:374
void update_m(const double &spos, const std::size_t &step)
CoordinateSystemTrafo inverted() const
void dumpSDDS(PartBunchBase< double, 3 > *beam, Vector_t FDext[], const double &azimuth=-1) const
Definition: DataSink.cpp:99
Quaternion getInitialDirection() const
Definition: TBeamline.h:460
ParticlePos_t & R
std::string::iterator iterator
Definition: MSLang.h:16
void concatenateMaps_m(const map_t &x, map_t &y)
void get_bounds(Vector_t &rmin, Vector_t &rmax)
virtual Vector_t getOrigin3D() const
Definition: Beamline.cpp:49
static void stopTimer(TimerRef t)
Definition: IpplTimings.h:192
std::string getInputBasename()
get input file name without extension
Definition: OpalData.cpp:717
Definition: Inform.h:41
virtual void execute()
Apply the algorithm to the top-level beamline.
std::list< tuple_t > beamline_t
Definition: ThickTracker.h:113
PartBunchBase< double, 3 > * itsBunch_m
The bunch of particles to be tracked.
Definition: Tracker.h:174
void setInPrepState(bool state)
Definition: OpalData.cpp:324
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
void setGlobalTrackStep(long long n)
step in multiple TRACK commands
Vector_t RefPartP_m
Definition: ThickTracker.h:366
long long getGlobalTrackStep() const
int truncOrder_m
truncation order of map tracking
Definition: ThickTracker.h:380
Track particles or bunches.
Definition: Tracker.h:84