Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VChannelingFastSimCrystalData Class Referenceabstract

#include <G4VChannelingFastSimCrystalData.hh>

Inheritance diagram for G4VChannelingFastSimCrystalData:

Public Member Functions

 G4VChannelingFastSimCrystalData ()
virtual ~G4VChannelingFastSimCrystalData ()
G4double Ex (G4double x, G4double y)
 electric fields produced by crystal lattice
G4double Ey (G4double x, G4double y)
G4double ElectronDensity (G4double x, G4double y)
 electron density function
G4double MinIonizationEnergy (G4double x, G4double y)
 minimum energy of ionization function
G4double NuclearDensity (G4double x, G4double y, G4int ielement)
 nuclear density function (normalized to average nuclear density)
G4double GetLindhardAngle (G4double etotal, G4double mass, G4double charge)
 Calculate the value of the Lindhard angle (!!! the value for a straight crystal).
G4double GetLindhardAngle ()
 Calculate the value of the Lindhard angle (!!! the value for a straight crystal).
G4double GetSimulationStep (G4double tx, G4double ty)
G4double GetMaxSimulationStep (G4double etotal, G4double mass, G4double charge)
 Calculate maximal simulation step (standard value for channeling particles).
G4double GetBeta ()
 get particle velocity/c
G4int GetNelements ()
G4int GetModel ()
G4double GetBendingAngle ()
G4double GetMiscutAngle ()
G4double GetCurv (G4double z)
G4double GetCUx (G4double z)
 get crystalline undulator wave function
G4double GetCUtetax (G4double z)
 get crystalline undulator wave 1st derivative function
virtual void SetMaterialProperties (const G4Material *crystal, const G4String &lattice, const G4String &filePath)=0
void SetGeometryParameters (const G4LogicalVolume *crystallogic)
 set geometry parameters from current logical volume
void SetBendingAngle (G4double tetab, const G4LogicalVolume *crystallogic)
void SetMiscutAngle (G4double tetam, const G4LogicalVolume *crystallogic)
void SetCrystallineUndulatorParameters (G4double amplitude, G4double period, G4double phase, const G4LogicalVolume *crystallogic)
void SetCrystallineUndulatorParameters (const G4LogicalVolume *crystallogic, const G4String &filename="CUgeometry.dat")
 set importing geometry of a crystalline undulator from file for specific volume
void SetCUParameters (const G4ThreeVector &amplitudePeriodPhase, const G4LogicalVolume *crystallogic)
void SetParticleProperties (G4double etotal, G4double mp, G4double charge, const G4String &particleName)
virtual G4ThreeVector CoordinatesFromBoxToLattice (const G4ThreeVector &pos0)=0
virtual G4ThreeVector CoordinatesFromLatticeToBox (const G4ThreeVector &pos)=0
virtual G4ThreeVector ChannelChange (G4double &x, G4double &y, G4double &z)=0
 change the channel if necessary, recalculate x o y
G4double GetCorrectionZ ()
virtual G4double AngleXFromBoxToLattice (G4double tx, G4double z)=0
virtual G4double AngleXFromLatticeToBox (G4double tx, G4double z)=0
virtual G4double AngleXShift (G4double z)=0
 auxialiary function to transform the horizontal angle
G4ThreeVector CoulombAtomicScattering (G4double effectiveStep, G4double step, G4int ielement)
 multiple and single scattering on screened potential
G4ThreeVector CoulombElectronScattering (G4double eMinIonization, G4double electronDensity, G4double step)
 multiple and single scattering on electrons
G4double IonizationLosses (G4double dz, G4int ielement)
 ionization losses
void SetVerbosity (G4int ver)

Protected Attributes

G4ChannelingFastSimInterpolationfElectricFieldX {nullptr}
 classes containing interpolation coefficients
G4ChannelingFastSimInterpolationfElectricFieldY {nullptr}
G4ChannelingFastSimInterpolationfElectronDensity {nullptr}
G4ChannelingFastSimInterpolationfMinIonizationEnergy {nullptr}
std::vector< G4ChannelingFastSimInterpolation * > fNucleiDensity
G4ThreeVector fHalfDimBoundingBox
 values related to the crystal geometry
G4int fBent =0
G4double fBendingAngle =0.
G4double fBendingR = 0.
G4double fBending2R =0.
G4double fBendingRsquare =0.
G4double fCurv =0.
G4double fMiscutAngle = 0.
G4double fCosMiscutAngle =1.
G4double fSinMiscutAngle =0.
G4double fCorrectionZ = 1.
G4bool fCU = false
G4double fCUAmplitude =0.
G4double fCUK =0.
G4double fCUPhase =0.
G4double fCUAmplitudeK =0.
G4double fCUK2 =0.
G4int fNelements =1
 values related to the crystal lattice
G4int iModel =1
G4double fVmax =0
G4double fVmax2 =0
G4double fVMinCrystal =0
G4double fChangeStep =0
std::vector< G4doublefI0
std::vector< G4doublefRF
std::vector< G4doublefTeta10
 angles necessary for multiple and single coulomb scattering
std::vector< G4doublefTetamax0
std::vector< G4doublefTetamax2
std::vector< G4doublefTetamax12
std::vector< G4doublefTeta12
std::vector< G4doublefK20
 coefficients necessary for multiple and single coulomb scattering
std::vector< G4doublefK2
std::vector< G4doublefK40
G4double fK30 =0
G4double fK3 =0
std::vector< G4doublefKD
std::vector< G4doublefLogPlasmaEdI0
std::vector< G4doublefPu11
 coefficients for multiple scattering suppression
std::vector< G4doublefPzu11
std::vector< G4doublefBB
std::vector< G4doublefE1XBbb
std::vector< G4doublefBBDEXP
G4int fVerbosity = 1

Detailed Description

Definition at line 61 of file G4VChannelingFastSimCrystalData.hh.

Constructor & Destructor Documentation

◆ G4VChannelingFastSimCrystalData()

G4VChannelingFastSimCrystalData::G4VChannelingFastSimCrystalData ( )

Definition at line 34 of file G4VChannelingFastSimCrystalData.cc.

34{}

◆ ~G4VChannelingFastSimCrystalData()

G4VChannelingFastSimCrystalData::~G4VChannelingFastSimCrystalData ( )
virtual

Definition at line 38 of file G4VChannelingFastSimCrystalData.cc.

38{}

Member Function Documentation

◆ AngleXFromBoxToLattice()

virtual G4double G4VChannelingFastSimCrystalData::AngleXFromBoxToLattice ( G4double tx,
G4double z )
pure virtual

calculate the horizontal angle in the co-rotating reference system within a channel (periodic cell) (connected with crystal planes/axes either bent or straight)

Implemented in G4ChannelingFastSimCrystalData.

◆ AngleXFromLatticeToBox()

virtual G4double G4VChannelingFastSimCrystalData::AngleXFromLatticeToBox ( G4double tx,
G4double z )
pure virtual

calculate the horizontal angle in the Box reference system (connected with the bounding box of the volume)

Implemented in G4ChannelingFastSimCrystalData.

◆ AngleXShift()

virtual G4double G4VChannelingFastSimCrystalData::AngleXShift ( G4double z)
pure virtual

auxialiary function to transform the horizontal angle

Implemented in G4ChannelingFastSimCrystalData.

◆ ChannelChange()

virtual G4ThreeVector G4VChannelingFastSimCrystalData::ChannelChange ( G4double & x,
G4double & y,
G4double & z )
pure virtual

change the channel if necessary, recalculate x o y

Implemented in G4ChannelingFastSimCrystalData.

◆ CoordinatesFromBoxToLattice()

virtual G4ThreeVector G4VChannelingFastSimCrystalData::CoordinatesFromBoxToLattice ( const G4ThreeVector & pos0)
pure virtual

calculate the coordinates in the co-rotating reference system within a channel (periodic cell) (connected with crystal planes/axes either bent or straight)

Implemented in G4ChannelingFastSimCrystalData.

◆ CoordinatesFromLatticeToBox()

virtual G4ThreeVector G4VChannelingFastSimCrystalData::CoordinatesFromLatticeToBox ( const G4ThreeVector & pos)
pure virtual

calculate the coordinates in the Box reference system (connected with the bounding box of the volume)

Implemented in G4ChannelingFastSimCrystalData.

◆ CoulombAtomicScattering()

G4ThreeVector G4VChannelingFastSimCrystalData::CoulombAtomicScattering ( G4double effectiveStep,
G4double step,
G4int ielement )

multiple and single scattering on screened potential

Definition at line 474 of file G4VChannelingFastSimCrystalData.cc.

478{
479 G4double tx = 0.;//horizontal scattering angle
480 G4double ty = 0.;//vertical scattering angle
481
482 G4double ksi=0.1;
483
484// calculation of the teta2-minimal possible angle of a single scattering
485 G4double e1=fK2[ielement]*effectiveStep; //for high speed of a program
486// (real formula is (4*pi*fN0*wpl(x)*dz*fZ1*zz2*alpha*hdc/fPV)**2)
487 G4double teta122=fTetamax12[ielement]/(ksi*fTetamax12[ielement]/e1+1.);
488 // teta122=fTeta12+teta22=teta1^2+teta2^2
489
490 G4double teta22;
491 G4double t;
492// if the angle of a single scattering is less teta1 - minimal possible
493// angle of coulomb scattering defining by the electron shielding than
494// multiple scattering by both nuclei and electrons and electrons will not
495// occur => minimal possible angle of a single scattering is equal to teta1
496 if (teta122<=fTeta12[ielement]*1.000125)
497 {
498 teta22=0.;
499 teta122=fTeta12[ielement];
500 }
501 else
502 {
503 teta22=teta122-fTeta12[ielement];
504 G4double aa=teta22/fTeta12[ielement];
505 G4double aa1=1.+aa;
506
507// crystal, with scattering suppression
508 G4double tetamsi=e1*(G4Log(aa1)+
509 (1.-std::exp(-aa*fBB[ielement]))/aa1+
510 fBBDEXP[ielement]*
511 (expint(fBB[ielement]*aa1)-fE1XBbb[ielement]));
512
513// sumilation of multiple coulomb scattering by nuclei and electrons
514// for high speed of a program, real formula is
515// 4*pi*fN0*wpl(x)*dz*(fZ1*zz2*alpha*hdc/fPV)**2*
516// *(ln(1+a)+(1-exp(-a*b))/(1+a)+(1+b)*exp(b)*(E1XB(b*(1+a))-E1XB(b)))
517
518 ksi=G4UniformRand();
519 t=std::sqrt(-tetamsi*G4Log(ksi));
520
521 ksi=G4UniformRand();
522
523 tx+=t*std::cos(CLHEP::twopi*ksi);
524 ty+=t*std::sin(CLHEP::twopi*ksi);
525
526 }
527// simulation of single coulomb scattering by nuclei (with screened potential)
528 G4double zss=0.;
529 G4double dzss=step;
530
531// (calculation of a distance, at which another single scattering can happen)
532 ksi=G4UniformRand();
533
534 zss=-G4Log(ksi)*step/(e1*(1./teta122-1./fTetamax12[ielement]));
535 G4double tt;
536
537// At some step several single scattering can occur.
538// So,if the distance of the next scattering is less than the step,
539// another scattering can occur. If the distance of the next scattering
540// is less than the difference between the step and the distance of
541// the previous scattering, another scattering can occur. And so on, and so on.
542// In the cycle we simulate each of them. The cycle is finished, when
543// the remaining part of step is less than a distance of the next single scattering.
544//********************************************
545// if at a step a single scattering occurs
546 while (zss<dzss)
547 {
548
549// simulation by Monte-Carlo of angles of single scattering
550 ksi=G4UniformRand();
551
552 tt=fTetamax12[ielement]/(1.+ksi*(fTetamax2[ielement]-teta22)/teta122)-
553 fTeta12[ielement];
554
555 ksi=G4UniformRand();
556
557// suppression of incoherent scattering by the atomic correlations in crystals
558 t=fPzu11[ielement]*tt;
559 t=std::exp(-t);
560
561 if (t<ksi) //if scattering takes place
562 {
563 //scattering angle
564 t=std::sqrt(tt);
565 ksi=G4UniformRand();
566
567 tx+=t*std::cos(CLHEP::twopi*ksi);
568 ty+=t*std::sin(CLHEP::twopi*ksi);
569 }
570
571 dzss-=zss;
572// (calculation of a distance, at which another single scattering can happen)
573 ksi=G4UniformRand();
574
575 zss=-G4Log(ksi)*step/(e1*(1./teta122-1./fTetamax12[ielement]));
576 }
577//********************************************
578 return G4ThreeVector(tx,ty,0.);
579}
G4double G4Log(G4double x)
Definition G4Log.hh:169
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition G4Types.hh:83
#define G4UniformRand()
Definition Randomize.hh:52

◆ CoulombElectronScattering()

G4ThreeVector G4VChannelingFastSimCrystalData::CoulombElectronScattering ( G4double eMinIonization,
G4double electronDensity,
G4double step )

multiple and single scattering on electrons

Definition at line 583 of file G4VChannelingFastSimCrystalData.cc.

587{
588
589 G4double zss=0.;
590 G4double dzss=step;
591 G4double ksi = 0.;
592
593 G4double tx = 0.;//horizontal scattering angle
594 G4double ty = 0.;//vertical scattering angle
595 G4double eloss = 0.;//energy loss
596
597 // eMinIonization - minimal energy transfered to electron
598 // a cut to reduce the number of calls of electron scattering
599 // is needed only at low density regions, in many cases does not do anything at all
600 if (eMinIonization<0.5*CLHEP::eV){eMinIonization=0.5*CLHEP::eV;}
601
602 // single scattering on electrons routine
603 if ((eMinIonization<fTmax)&&(electronDensity>DBL_EPSILON))
604 {
605
606// (calculation of a distance, at which another single scattering can happen)
607// simulation of scattering length (by the same way single scattering by nucleus
608 ksi=G4UniformRand();
609
610 zss=-1.0*G4Log(ksi)/(fK3*electronDensity)/(1./eMinIonization-1./fTmax);
611
612//********************************************
613// if at a step a single scattering occur
614 while (zss<dzss)
615 {
616// simulation by Monte-Carlo of angles of single scattering
617 ksi=G4UniformRand();
618
619// energy transfered to electron
620 G4double e1=eMinIonization/(1.-ksi*(1.-eMinIonization/fTmax));
621
622// scattering angle
623 G4double t=0;
624 if(fTmax-e1>DBL_EPSILON) //to be sure e1<fTmax
625 {
626 t=std::sqrt(2.*CLHEP::electron_mass_c2*e1*(1-e1/fTmax))/fPz;
627 }
628
629 // energy losses
630 eloss=e1;
631 ksi=G4UniformRand();
632
633 tx+=t*std::cos(CLHEP::twopi*ksi);
634 ty+=t*std::sin(CLHEP::twopi*ksi);
635
636 dzss-=zss;
637// (calculation of a distance, at which another single scattering can happen)
638// simulation of scattering length
639// (by the same way single scattering by nucleus
640 ksi=G4UniformRand();
641
642 zss=-1.0*G4Log(ksi)/(fK3*electronDensity)/(1./eMinIonization-1./fTmax);
643 }
644//********************************************
645 }
646 return G4ThreeVector(tx,ty,eloss);
647}
#define DBL_EPSILON
Definition templates.hh:66

◆ ElectronDensity()

G4double G4VChannelingFastSimCrystalData::ElectronDensity ( G4double x,
G4double y )
inline

electron density function

Definition at line 72 of file G4VChannelingFastSimCrystalData.hh.

73 {
74 G4double nel0=fElectronDensity->GetIF(x,y);
75 if(nel0<0.) {nel0=0.;}//exception, errors of interpolation functions
76 return nel0;
77 }
G4ChannelingFastSimInterpolation * fElectronDensity

◆ Ex()

G4double G4VChannelingFastSimCrystalData::Ex ( G4double x,
G4double y )
inline

electric fields produced by crystal lattice

Definition at line 68 of file G4VChannelingFastSimCrystalData.hh.

68{return (fElectricFieldX->GetIF(x,y))*(-fZ2/fPV);}
G4ChannelingFastSimInterpolation * fElectricFieldX
classes containing interpolation coefficients

◆ Ey()

G4double G4VChannelingFastSimCrystalData::Ey ( G4double x,
G4double y )
inline

Definition at line 69 of file G4VChannelingFastSimCrystalData.hh.

69{return (fElectricFieldY->GetIF(x,y))*(-fZ2/fPV);}
G4ChannelingFastSimInterpolation * fElectricFieldY

◆ GetBendingAngle()

G4double G4VChannelingFastSimCrystalData::GetBendingAngle ( )
inline

get bending angle of the crystal planes/axes (default BendingAngle=0 => straight crystal);

Definition at line 107 of file G4VChannelingFastSimCrystalData.hh.

◆ GetBeta()

G4double G4VChannelingFastSimCrystalData::GetBeta ( )
inline

get particle velocity/c

Definition at line 100 of file G4VChannelingFastSimCrystalData.hh.

100{return fBeta;}

◆ GetCorrectionZ()

G4double G4VChannelingFastSimCrystalData::GetCorrectionZ ( )
inline

return correction of the longitudinal coordinate (along current plane/axis vs "central plane/axis")

Definition at line 194 of file G4VChannelingFastSimCrystalData.hh.

◆ GetCurv()

G4double G4VChannelingFastSimCrystalData::GetCurv ( G4double z)
inline

get crystal curvature for crystalline undulator the curvature is a function, otherwise it's a constant

Definition at line 115 of file G4VChannelingFastSimCrystalData.hh.

116 {return fCU ? //select between a crystalline undulator (CU) and a bent crystal
117 ( fImportCrystalGeometry ? //select between a realistic and an ideal CU
118 fVecCUCurv[fCUID].Value(z) :
119 -fCUK2*GetCUx(z)) :
120 fCurv;}
G4double GetCUx(G4double z)
get crystalline undulator wave function

◆ GetCUtetax()

G4double G4VChannelingFastSimCrystalData::GetCUtetax ( G4double z)
inline

get crystalline undulator wave 1st derivative function

Definition at line 129 of file G4VChannelingFastSimCrystalData.hh.

130 {return fCU ? //select between a crystalline undulator (CU) and a bent crystal
131 ( fImportCrystalGeometry ? //select between a realistic and an ideal CU
132 fVecCUtetax[fCUID].Value(z) :
133 -fCUAmplitudeK*std::sin(fCUK*z+fCUPhase)) :
134 0.;}

Referenced by G4ChannelingFastSimCrystalData::AngleXFromBoxToLattice(), and G4ChannelingFastSimCrystalData::AngleXFromLatticeToBox().

◆ GetCUx()

G4double G4VChannelingFastSimCrystalData::GetCUx ( G4double z)
inline

get crystalline undulator wave function

Definition at line 123 of file G4VChannelingFastSimCrystalData.hh.

124 {return fImportCrystalGeometry ? //select between a realistic and an ideal CU
125 fVecCUx[fCUID].Value(z) :
126 fCUAmplitude*std::cos(fCUK*z+fCUPhase);}

Referenced by G4ChannelingFastSimCrystalData::CoordinatesFromBoxToLattice(), G4ChannelingFastSimCrystalData::CoordinatesFromLatticeToBox(), and GetCurv().

◆ GetLindhardAngle() [1/2]

G4double G4VChannelingFastSimCrystalData::GetLindhardAngle ( )

Calculate the value of the Lindhard angle (!!! the value for a straight crystal).

Definition at line 427 of file G4VChannelingFastSimCrystalData.cc.

428{
429 return fTetaL; //return the Lindhard angle value calculated in SetParticleProperties
430}

Referenced by GetMaxSimulationStep().

◆ GetLindhardAngle() [2/2]

G4double G4VChannelingFastSimCrystalData::GetLindhardAngle ( G4double etotal,
G4double mass,
G4double charge )

Calculate the value of the Lindhard angle (!!! the value for a straight crystal).

Definition at line 416 of file G4VChannelingFastSimCrystalData.cc.

419{
420 G4double pv0 = etotal-mass*mass/etotal;
421 return std::sqrt(2*std::abs(charge)*fVmax/pv0); //Calculate the value of the Lindhard angle
422 //(!!! the value for a straight crystal)
423}

◆ GetMaxSimulationStep()

G4double G4VChannelingFastSimCrystalData::GetMaxSimulationStep ( G4double etotal,
G4double mass,
G4double charge )

Calculate maximal simulation step (standard value for channeling particles).

Definition at line 464 of file G4VChannelingFastSimCrystalData.cc.

467{
468 //standard value of step for channeling particles which is the maximal possible step
469 return fChangeStep/GetLindhardAngle(etotal, mass, charge);
470}
G4double GetLindhardAngle()
Calculate the value of the Lindhard angle (!!! the value for a straight crystal).

◆ GetMiscutAngle()

G4double G4VChannelingFastSimCrystalData::GetMiscutAngle ( )
inline

fBendingAngle MAY BE NOT THE SAME AS THE BENDING ANGLE OF THE CRYSTAL VOLUME: THE VOLUME OF A BENT CRYSTAL MAY BE G4Box, while the planes/axes inside may be bent

Definition at line 111 of file G4VChannelingFastSimCrystalData.hh.

◆ GetModel()

G4int G4VChannelingFastSimCrystalData::GetModel ( )
inline

Definition at line 103 of file G4VChannelingFastSimCrystalData.hh.

103{return iModel;}//=1 for planes, =2 for axes

◆ GetNelements()

G4int G4VChannelingFastSimCrystalData::GetNelements ( )
inline

Definition at line 102 of file G4VChannelingFastSimCrystalData.hh.

102{return fNelements;}
G4int fNelements
values related to the crystal lattice

◆ GetSimulationStep()

G4double G4VChannelingFastSimCrystalData::GetSimulationStep ( G4double tx,
G4double ty )

Calculate simulation step (standard value for channeling particles and reduced value for overbarrier particles)

Definition at line 434 of file G4VChannelingFastSimCrystalData.cc.

435{
436 G4double simulationstep;
437 //find angle of particle w.r.t. the plane or axis
438 G4double angle=0.;
439 if (iModel==1)//1D model
440 {
441 angle = std::abs(tx);
442 }
443 else if (iModel==2)//2D model
444 {
445 angle = std::sqrt(tx*tx+ty*ty);
446 }
447
448 //compare this angle with the Lindhard angle
449 if (angle<fTetaL)
450 {
451 simulationstep = fChannelingStep;
452 }
453 else
454 {
455 simulationstep = fChangeStep;
456 if (angle > 0.0) { simulationstep /= angle; }
457 }
458
459 return simulationstep;
460}

◆ IonizationLosses()

G4double G4VChannelingFastSimCrystalData::IonizationLosses ( G4double dz,
G4int ielement )

ionization losses

Definition at line 651 of file G4VChannelingFastSimCrystalData.cc.

653{
654 //amorphous part of ionization losses
655
656 G4double elosses = 0.;
657 // 1/2 already taken into account in fKD
658
659 G4double loge = G4Log(fMe2Gamma*fGamma*fV2/fI0[ielement]);
660 G4double delta= 2.*(G4Log(fBeta*fGamma)+fLogPlasmaEdI0[ielement]-0.5);
661 if(delta<0.){delta=0.;}
662 loge-=delta;
663 if(fParticleName=="e-")
664 {
665 loge+=(-G4Log(2.) + 1.
666 -(2.*fGamma - 1.)/fGamma/fGamma*G4Log(2.) +
667 1./8.*((fGamma - 1.)/fGamma)*((fGamma - 1.)/fGamma));
668 }
669 else if(fParticleName=="e+")
670 {
671 loge+=(-fV2/12.*(11. + 14./(fGamma + 1.) + 10./(fGamma + 1.)/(fGamma + 1.) +
672 4./(fGamma + 1.)/(fGamma + 1.)/(fGamma + 1.)));
673 }
674 else
675 {
676 loge-=fV2;
677 }
678 elosses=fZ2*fZ2*fKD[ielement]/fV2*loge*dz;
679
680 return elosses;}

◆ MinIonizationEnergy()

G4double G4VChannelingFastSimCrystalData::MinIonizationEnergy ( G4double x,
G4double y )
inline

minimum energy of ionization function

Definition at line 79 of file G4VChannelingFastSimCrystalData.hh.

80 {return fMinIonizationEnergy->GetIF(x,y);}
G4ChannelingFastSimInterpolation * fMinIonizationEnergy

◆ NuclearDensity()

G4double G4VChannelingFastSimCrystalData::NuclearDensity ( G4double x,
G4double y,
G4int ielement )
inline

nuclear density function (normalized to average nuclear density)

Definition at line 82 of file G4VChannelingFastSimCrystalData.hh.

83 {return std::abs(fNucleiDensity[ielement]->GetIF(x,y));}
std::vector< G4ChannelingFastSimInterpolation * > fNucleiDensity

◆ SetBendingAngle()

void G4VChannelingFastSimCrystalData::SetBendingAngle ( G4double tetab,
const G4LogicalVolume * crystallogic )

set bending angle of the crystal planes/axes (default fBendingAngle=0 => straight crystal); only non-negative values! crystal is bent in the positive direction of x

Definition at line 66 of file G4VChannelingFastSimCrystalData.cc.

68{
69 G4int crystalID = crystallogic->GetInstanceID();
70
71 //set the bending angle for this logical volume
72 fMapBendingAngle[crystalID]=tetab;
73
74 G4ThreeVector limboxmin;//minimal limits of the box bounding the logical volume
75 G4ThreeVector limboxmax;//maximal limits of the box bounding the logical volume
76 //save the limits of the box bounding the logical volume
77 crystallogic->GetSolid()->BoundingLimits(limboxmin,limboxmax);
78
79 //bounding box half dimensions
80 fHalfDimBoundingBox = (limboxmax-limboxmin)/2.;
81
82 G4double lcr = limboxmax.getZ()-limboxmin.getZ();//crystal thickness
83
84 fBendingAngle=std::abs(tetab);
85 if (fBendingAngle<0.000001)//no bending less then 1 urad
86 {
88 {
89 G4cout << "Channeling model: volume " << crystallogic->GetName() << G4endl;
90 G4cout << "Warning: bending angle is lower than 1 urad => set to 0" << G4endl;
91 }
92
93 fBent=0;
95 fBendingR=0.;//just for convenience (infinity in reality)
96 fBending2R=0.;
98 fCurv=0.;
99
100 fCorrectionZ = 1.;
101 }
102 else
103 {
104 fBent=1;
108 fCurv=1./fBendingR;
109
110 if (tetab<0.)
111 {
112 G4cout << "Channeling model: volume " << crystallogic->GetName() << G4endl;
113 G4cout << "Warning: bending angle is negative => set to be positive" << G4endl;
114 }
115 }
116
117}
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
double getZ() const
G4VSolid * GetSolid() const
G4int GetInstanceID() const
const G4String & GetName() const
G4ThreeVector fHalfDimBoundingBox
values related to the crystal geometry
virtual void BoundingLimits(G4ThreeVector &pMin, G4ThreeVector &pMax) const
Definition G4VSolid.cc:691

Referenced by SetCUParameters(), and SetGeometryParameters().

◆ SetCrystallineUndulatorParameters() [1/2]

void G4VChannelingFastSimCrystalData::SetCrystallineUndulatorParameters ( const G4LogicalVolume * crystallogic,
const G4String & filename = "CUgeometry.dat" )

set importing geometry of a crystalline undulator from file for specific volume

Definition at line 164 of file G4VChannelingFastSimCrystalData.cc.

167{
168 G4int crystalID = crystallogic->GetInstanceID();
169 fMapImportCrystalGeometry[crystalID] = true;
170
171 G4PhysicsLinearVector vec(true); //CU geometry data x=f(z) - transverse coordinate vs longitudinal
172 G4PhysicsLinearVector vecD(true); // = first derivative of vec
173 G4PhysicsLinearVector vecDD(true);// = second derivative of vec
174
175 //open input file for CU data
176 std::ifstream vfilein;
177 vfilein.open(filename);
178
179 if (!vfilein) {
180 G4String message = "Input file " +
181 filename +
182 " is not found!";
183 G4Exception("SetCrystallineUndulatorParameters",// Origin of the exception
184 "001", // Unique error code
185 FatalException, // Terminate the program
186 message);
187 }
188
189 G4cout << "Importing the Crystal geometry from the file: "
190 << filename << G4endl;
191
192 //reading from file
193 //CAUTION: all the values in the file in mm!!!
194 vec.Retrieve(vfilein,true);
195
196 vfilein.close();
197
198 //check the start coordinate (10.*DBL_EPSILON to add more flexibility, if not equal, no problem)
199 if(std::abs(vec.GetMinEnergy()) > 10.*DBL_EPSILON)
200 {
201 G4Exception("SetCrystallineUndulatorParameters",// Origin of the exception
202 "001", // Unique error code
203 FatalException, // Terminate the program
204 "The interpolation of the crystalline undulator does not start from 0.! "
205 "The program will terminate.");
206
207 }
208
209 //check the end coordinate (1.e8*DBL_EPSILON - single precision check)
210 if(std::abs(vec.GetMaxEnergy() - 2.*fHalfDimBoundingBox.z()) > 100000000.*DBL_EPSILON)
211 {
212 G4Exception("SetCrystallineUndulatorParameters",// Origin of the exception
213 "001", // Unique error code
214 FatalException, // Terminate the program
215 "The interpolation of the crystalline undulator does not end with at"
216 "the boundary of the volume => check the crystal thickness in z! "
217 "The program will terminate.");
218 }
219
220 // Get the total length of vectors
221 std::size_t inodes = vec.GetVectorLength();
222
223 //check if the interpolation nodes are equidistant (otherwise )
224 for(std::size_t i=1; i<inodes-1; i++)
225 {
226 if(std::abs((vec.Energy(i+1)-vec.Energy(i))-
227 (vec.Energy(i) -vec.Energy(i-1)))>100000000.*DBL_EPSILON)//single precision
228 {
229 G4String message = "The interpolation nodes in the file " + filename +
230 " are not equidistant! The program will terminate.";
231 G4Exception("SetCrystallineUndulatorParameters",// Origin of the exception
232 "001", // Unique error code
233 FatalException, // Terminate the program
234 message);
235 }
236 }
237
238 //necessary to use spline interpolation
239 vec.FillSecondDerivatives(G4SplineType::Base);
240
241 //setting up the vectors (to have the same arguments)
242 vecD = vec;
243 vecDD = vec;
244
245 //calculating the derivatives
246 for(std::size_t i=1; i<inodes-1; i++)
247 {
248 vecD.PutValue(i,(vec[i+1]-vec[i-1])/(vec.Energy(i+1)-vec.Energy(i-1)));
249 vecDD.PutValue(i,((vec[i+1]-vec[i])/(vec.Energy(i+1)-vec.Energy(i)) -
250 (vec[i]-vec[i-1])/(vec.Energy(i)-vec.Energy(i-1)))*
251 2./(vec.Energy(i+1)-vec.Energy(i-1)));
252 }
253
254 //end points have the same values as neighbouring
255 vecD.PutValue(0,vecD[1]);
256 vecD.PutValue(inodes-1,vecD[inodes-2]);
257 vecDD.PutValue(0,vecDD[1]);
258 vecDD.PutValue(inodes-1,vecDD[inodes-2]);
259
260 //necessary to use spline interpolation
261 vecD.FillSecondDerivatives(G4SplineType::Base);
262 vecDD.FillSecondDerivatives(G4SplineType::Base);
263
264 fVecCUx.push_back(vec);
265 fVecCUtetax.push_back(vecD);
266 fVecCUCurv.push_back(vecDD);
267
268 //check if the fVecCUx was already set up for this logical volume
269 if(fMapCUID.count(crystalID) > 0)
270 {
271 G4Exception("SetCrystallineUndulatorParameters",// Origin of the exception
272 "001", // Unique error code
273 FatalException, // Terminate the program
274 "It is not allowed to set up the crystalline undulator geometry "
275 "the second time for the same logical volume! The program will terminate.");
276 }
277
278 //save the number of current element in fVecCUx, fVecCUtetax, fVecCUCurv
279 //to call them later using crystalID
280 fMapCUID[crystalID] = (G4int)fVecCUx.size()-1;
281
282 SetCUParameters(G4ThreeVector(1.,1.,0.),crystallogic);// input G4ThreeVector(1.,1.,0.)
283 // is needed just to setup
284 // the undulator in a normal way =>
285 // first 2 arguments > 0.
286 // values do not matter
287}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
void SetCUParameters(const G4ThreeVector &amplitudePeriodPhase, const G4LogicalVolume *crystallogic)

◆ SetCrystallineUndulatorParameters() [2/2]

void G4VChannelingFastSimCrystalData::SetCrystallineUndulatorParameters ( G4double amplitude,
G4double period,
G4double phase,
const G4LogicalVolume * crystallogic )

set crystalline undulator parameters: amplitude, period and phase (default: all 3 value = 0) function to use in Detector Construction

Definition at line 143 of file G4VChannelingFastSimCrystalData.cc.

148{
149 if (amplitude<DBL_EPSILON||period<DBL_EPSILON)
150 {
151 amplitude = 0.;
152 period=0.;
153 phase=0.;
154 G4cout << "Channeling model: volume " << crystallogic->GetName() << G4endl;
155 G4cout << "Warning: The crystalline undulator parameters are out of range "
156 "=> the crystalline undulator mode switched off" << G4endl;
157 }
158
159 SetCUParameters(G4ThreeVector(amplitude,period,phase),crystallogic);
160}

◆ SetCUParameters()

void G4VChannelingFastSimCrystalData::SetCUParameters ( const G4ThreeVector & amplitudePeriodPhase,
const G4LogicalVolume * crystallogic )

set crystalline undulator parameters (internal function of the model) for convenience we put amplitude, period and phase in a G4ThreeVector

Definition at line 291 of file G4VChannelingFastSimCrystalData.cc.

294{
295 G4int crystalID = crystallogic->GetInstanceID();
296
297 //set the crystalline undulator parameters for this logical volume
298 fMapCUAmplitudePeriodPhase[crystalID]=amplitudePeriodPhase;
299 fCUAmplitude=amplitudePeriodPhase.x();
300 G4double period = amplitudePeriodPhase.y();
301 fCUPhase = amplitudePeriodPhase.z();
302
303 // flag of custom crystal geometry uploaded from a file
304 fImportCrystalGeometry = (fMapImportCrystalGeometry.count(crystalID) > 0) ?
305 fMapImportCrystalGeometry[crystalID] :
306 false;
307
308 //if the amplidude of the crystalline undulator is 0 => no undulator
310 {
311 //crystalline undulator flag
312 fCU = true;
313
314 fCUK = CLHEP::twopi/period;
315
317 {
318 //bent and periodically bent crystal are not compatible
319 SetBendingAngle(0,crystallogic);
320
321 G4cout << "Channeling model: volume " << crystallogic->GetName() << G4endl;
322 G4cout << "Warning: crystalline undulator is not compatible with "
323 "a bent crystal mode => setting bending angle to 0." << G4endl;
324 }
325
326 //setup crystal internal geometry data to access the correct elements of
327 //fVecCUx, fVecCUtetax, fVecCUCurv
328 if(fImportCrystalGeometry)
329 {
330 fCUID = fMapCUID[crystalID];
331 }
332 }
333 else
334 {
335 fCU = false;
336 fCUAmplitude = 0.;
337 fCUK = 0.;
338 fCUPhase = 0.;
339 fMapCUAmplitudePeriodPhase[crystalID] = G4ThreeVector(0.,0.,0.);
340 }
341
342 fCUK2 = fCUK*fCUK;
344}
double z() const
double x() const
double y() const
void SetBendingAngle(G4double tetab, const G4LogicalVolume *crystallogic)

Referenced by SetCrystallineUndulatorParameters(), SetCrystallineUndulatorParameters(), and SetGeometryParameters().

◆ SetGeometryParameters()

void G4VChannelingFastSimCrystalData::SetGeometryParameters ( const G4LogicalVolume * crystallogic)

set geometry parameters from current logical volume

Definition at line 42 of file G4VChannelingFastSimCrystalData.cc.

44{
45 G4int crystalID = crystallogic->GetInstanceID();
46
47 //set bending angle if the it exists in the list, otherwise default = 0
48 (fMapBendingAngle.count(crystalID) > 0)
49 ? SetBendingAngle(fMapBendingAngle[crystalID],crystallogic)
50 : SetBendingAngle(0.,crystallogic);
51
52 //set miscut angle if the it exists in the list, otherwise default = 0
53 (fMapMiscutAngle.count(crystalID) > 0)
54 ? SetMiscutAngle(fMapMiscutAngle[crystalID],crystallogic)
55 : SetMiscutAngle(0.,crystallogic);
56
57 //set crystalline undulator parameters if they exist in the list,
58 //otherwise default = G4ThreeVector(0,0,0).
59 (fMapCUAmplitudePeriodPhase.count(crystalID) > 0)
60 ? SetCUParameters(fMapCUAmplitudePeriodPhase[crystalID],crystallogic)
61 : SetCUParameters(G4ThreeVector(0.,0.,0.),crystallogic);
62}
void SetMiscutAngle(G4double tetam, const G4LogicalVolume *crystallogic)

◆ SetMaterialProperties()

virtual void G4VChannelingFastSimCrystalData::SetMaterialProperties ( const G4Material * crystal,
const G4String & lattice,
const G4String & filePath )
pure virtual

find and upload crystal lattice input files, calculate all the basic values (to do only once)

Implemented in G4ChannelingFastSimCrystalData.

◆ SetMiscutAngle()

void G4VChannelingFastSimCrystalData::SetMiscutAngle ( G4double tetam,
const G4LogicalVolume * crystallogic )

fBendingAngle MAY BE NOT THE SAME AS THE BENDING ANGLE OF THE CRYSTAL VOLUME THE VOLUME OF A BENT CRYSTAL MAY BE G4Box, while the planes/axes inside may be bent set miscut angle (default fMiscutAngle=0), acceptable range +-1 mrad, otherwise geometry routines may be unstable

Definition at line 121 of file G4VChannelingFastSimCrystalData.cc.

123{
124 G4int crystalID = crystallogic->GetInstanceID();
125
126 //set the bending angle for this logical volume
127 fMapMiscutAngle[crystalID]=tetam;
128
129 // fMiscutAngle>0: rotation of xz coordinate planes clockwise in the xz plane
130 fMiscutAngle=tetam;
131 if (std::abs(tetam)>1.*CLHEP::mrad)
132 {
133 G4cout << "Channeling model: volume " << crystallogic->GetName() << G4endl;
134 G4cout << "Warning: miscut angle is higher than 1 mrad => " << G4endl;
135 G4cout << "coordinate transformation routines may be unstable" << G4endl;
136 }
139}

Referenced by SetGeometryParameters().

◆ SetParticleProperties()

void G4VChannelingFastSimCrystalData::SetParticleProperties ( G4double etotal,
G4double mp,
G4double charge,
const G4String & particleName )

recalculate all the important values (to do both at the trajectory start and after energy loss)

Definition at line 348 of file G4VChannelingFastSimCrystalData.cc.

352{
353 G4double teta1;
354 fZ2=charge;
355 G4double zz22=fZ2*fZ2;
356 fParticleName=particleName;
357
358// particle momentum and energy
359 G4double t=etotal*etotal-mass*mass; // economy of operations
360 fPz=std::sqrt(t); // momentum of particle
361 fPV=t/etotal; // pv
362 fBeta=fPz/etotal; // velocity/c
363 fTetaL = std::sqrt(std::abs(fZ2)*fVmax2/fPV); //Lindhard angle
364 fChannelingStep = fChangeStep/fTetaL; //standard simulation step
365
366// Energy losses
367 fV2 = fBeta*fBeta; // particle (velocity/c)^2
368 fGamma = etotal/mass; // Lorentz factor
369 fMe2Gamma = 2*CLHEP::electron_mass_c2*fGamma;
370// max ionization losses
371 fTmax = fMe2Gamma*fGamma*fV2/
372 (CLHEP::electron_mass_c2/mass*CLHEP::electron_mass_c2/mass +
373 1. + fMe2Gamma/mass);
374// max ionization losses for electrons
375 if(fParticleName=="e-"){fTmax/=2;}
376
377 for(G4int i=0; i<fNelements; i++)
378 {
379
380// minimal scattering angle by coulomb scattering on nuclei
381// defining by shielding by electrons
382// teta1=hdc/(fPz*fRF)*DSQRT(1.13D0+3.76D0*(alpha*fZ1*fZ2/fBeta)**2){ev*cm/(eV*cm)}
383 teta1=fTeta10[i]*std::sqrt(1.13+fK40[i]*zz22/fV2); // /fPz later to speed up
384 // the calculations
385
386// the coefficient for multiple scattering
387 fBB[i]=teta1*teta1*fPu11[i];
388 fE1XBbb[i]=expint(fBB[i]);
389 fBBDEXP[i]=(1.+fBB[i])*std::exp(fBB[i]);
390// necessary for suppression of incoherent scattering
391// by the atomic correlations in crystals for single scattering on nucleus
392// (screened atomic potential): EXP(-(fPz*teta*fU1)**2)=EXP(-fPzu11*teta**2).GE.ksi
393// =>no scattering
394 fPzu11[i]=fPu11[i]*fPz*fPz;
395
396 teta1=teta1/fPz; //
397 fTeta12[i]=teta1*teta1;
398// maximal scattering angle by coulomb scattering on nuclei
399// defining by nucleus radius
400// tetamax=hc/(fPz*1.D-6*fR0*fAN**(1.D0/3.D0))// {Mev*fermi/(MeV*fermi)}
401 G4double tetamax=fTetamax0[i]/fPz;
402 fTetamax2[i]=tetamax*tetamax;
404
405// a coefficient in a formula for scattering (for high speed of simulation)
406// fK2=(fZ2)**2*alphahbarc2*4.*pi*fN0*(fZ1/fPV)**2
407 fK2[i]=fK20[i]*zz22/fPV/fPV;
408 }
409
410// fK3=(fZ2)**2*alphahbarc2*pi/electron_mass_c2/(fV2)**2
411 fK3=fK30*zz22/fV2;
412}
std::vector< G4double > fK20
coefficients necessary for multiple and single coulomb scattering
std::vector< G4double > fTeta10
angles necessary for multiple and single coulomb scattering
std::vector< G4double > fPu11
coefficients for multiple scattering suppression

◆ SetVerbosity()

void G4VChannelingFastSimCrystalData::SetVerbosity ( G4int ver)
inline

Member Data Documentation

◆ fBB

std::vector<G4double> G4VChannelingFastSimCrystalData::fBB
protected

◆ fBBDEXP

std::vector<G4double> G4VChannelingFastSimCrystalData::fBBDEXP
protected

◆ fBending2R

◆ fBendingAngle

G4double G4VChannelingFastSimCrystalData::fBendingAngle =0.
protected

◆ fBendingR

◆ fBendingRsquare

G4double G4VChannelingFastSimCrystalData::fBendingRsquare =0.
protected

◆ fBent

◆ fChangeStep

G4double G4VChannelingFastSimCrystalData::fChangeStep =0
protected

◆ fCorrectionZ

◆ fCosMiscutAngle

◆ fCU

◆ fCUAmplitude

G4double G4VChannelingFastSimCrystalData::fCUAmplitude =0.
protected

Definition at line 261 of file G4VChannelingFastSimCrystalData.hh.

Referenced by GetCUx(), and SetCUParameters().

◆ fCUAmplitudeK

G4double G4VChannelingFastSimCrystalData::fCUAmplitudeK =0.
protected

Definition at line 264 of file G4VChannelingFastSimCrystalData.hh.

Referenced by GetCUtetax(), and SetCUParameters().

◆ fCUK

G4double G4VChannelingFastSimCrystalData::fCUK =0.
protected

Definition at line 262 of file G4VChannelingFastSimCrystalData.hh.

Referenced by GetCUtetax(), GetCUx(), and SetCUParameters().

◆ fCUK2

G4double G4VChannelingFastSimCrystalData::fCUK2 =0.
protected

Definition at line 265 of file G4VChannelingFastSimCrystalData.hh.

Referenced by GetCurv(), and SetCUParameters().

◆ fCUPhase

G4double G4VChannelingFastSimCrystalData::fCUPhase =0.
protected

Definition at line 263 of file G4VChannelingFastSimCrystalData.hh.

Referenced by GetCUtetax(), GetCUx(), and SetCUParameters().

◆ fCurv

G4double G4VChannelingFastSimCrystalData::fCurv =0.
protected

◆ fE1XBbb

std::vector<G4double> G4VChannelingFastSimCrystalData::fE1XBbb
protected

◆ fElectricFieldX

G4ChannelingFastSimInterpolation* G4VChannelingFastSimCrystalData::fElectricFieldX {nullptr}
protected

classes containing interpolation coefficients

Definition at line 225 of file G4VChannelingFastSimCrystalData.hh.

225{nullptr};

Referenced by Ex(), and G4ChannelingFastSimCrystalData::SetMaterialProperties().

◆ fElectricFieldY

G4ChannelingFastSimInterpolation* G4VChannelingFastSimCrystalData::fElectricFieldY {nullptr}
protected

Definition at line 227 of file G4VChannelingFastSimCrystalData.hh.

227{nullptr};

Referenced by Ey(), and G4ChannelingFastSimCrystalData::SetMaterialProperties().

◆ fElectronDensity

G4ChannelingFastSimInterpolation* G4VChannelingFastSimCrystalData::fElectronDensity {nullptr}
protected

◆ fHalfDimBoundingBox

G4ThreeVector G4VChannelingFastSimCrystalData::fHalfDimBoundingBox
protected

◆ fI0

std::vector<G4double> G4VChannelingFastSimCrystalData::fI0
protected

◆ fK2

std::vector<G4double> G4VChannelingFastSimCrystalData::fK2
protected

◆ fK20

std::vector<G4double> G4VChannelingFastSimCrystalData::fK20
protected

coefficients necessary for multiple and single coulomb scattering

Definition at line 297 of file G4VChannelingFastSimCrystalData.hh.

Referenced by G4ChannelingFastSimCrystalData::SetMaterialProperties(), and SetParticleProperties().

◆ fK3

G4double G4VChannelingFastSimCrystalData::fK3 =0
protected

◆ fK30

G4double G4VChannelingFastSimCrystalData::fK30 =0
protected

◆ fK40

std::vector<G4double> G4VChannelingFastSimCrystalData::fK40
protected

◆ fKD

std::vector<G4double> G4VChannelingFastSimCrystalData::fKD
protected

◆ fLogPlasmaEdI0

std::vector<G4double> G4VChannelingFastSimCrystalData::fLogPlasmaEdI0
protected

◆ fMinIonizationEnergy

G4ChannelingFastSimInterpolation* G4VChannelingFastSimCrystalData::fMinIonizationEnergy {nullptr}
protected

◆ fMiscutAngle

G4double G4VChannelingFastSimCrystalData::fMiscutAngle = 0.
protected

◆ fNelements

G4int G4VChannelingFastSimCrystalData::fNelements =1
protected

values related to the crystal lattice

Definition at line 268 of file G4VChannelingFastSimCrystalData.hh.

Referenced by GetNelements(), G4ChannelingFastSimCrystalData::SetMaterialProperties(), and SetParticleProperties().

◆ fNucleiDensity

std::vector<G4ChannelingFastSimInterpolation*> G4VChannelingFastSimCrystalData::fNucleiDensity
protected

◆ fPu11

std::vector<G4double> G4VChannelingFastSimCrystalData::fPu11
protected

coefficients for multiple scattering suppression

Definition at line 308 of file G4VChannelingFastSimCrystalData.hh.

Referenced by G4ChannelingFastSimCrystalData::SetMaterialProperties(), and SetParticleProperties().

◆ fPzu11

std::vector<G4double> G4VChannelingFastSimCrystalData::fPzu11
protected

◆ fRF

std::vector<G4double> G4VChannelingFastSimCrystalData::fRF
protected

◆ fSinMiscutAngle

◆ fTeta10

std::vector<G4double> G4VChannelingFastSimCrystalData::fTeta10
protected

angles necessary for multiple and single coulomb scattering

Definition at line 288 of file G4VChannelingFastSimCrystalData.hh.

Referenced by G4ChannelingFastSimCrystalData::SetMaterialProperties(), and SetParticleProperties().

◆ fTeta12

std::vector<G4double> G4VChannelingFastSimCrystalData::fTeta12
protected

◆ fTetamax0

std::vector<G4double> G4VChannelingFastSimCrystalData::fTetamax0
protected

◆ fTetamax12

std::vector<G4double> G4VChannelingFastSimCrystalData::fTetamax12
protected

◆ fTetamax2

std::vector<G4double> G4VChannelingFastSimCrystalData::fTetamax2
protected

◆ fVerbosity

G4int G4VChannelingFastSimCrystalData::fVerbosity = 1
protected

◆ fVmax

G4double G4VChannelingFastSimCrystalData::fVmax =0
protected

◆ fVmax2

G4double G4VChannelingFastSimCrystalData::fVmax2 =0
protected

◆ fVMinCrystal

G4double G4VChannelingFastSimCrystalData::fVMinCrystal =0
protected

◆ iModel

G4int G4VChannelingFastSimCrystalData::iModel =1
protected

The documentation for this class was generated from the following files: