Geant4 11.2.2
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)
 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)
 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)=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 SetCUParameters (const G4ThreeVector &amplitudePeriodPhase, const G4LogicalVolume *crystallogic)
 
void SetParticleProperties (G4double etotal, G4double mp, G4double charge, G4bool ifhadron)
 
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< 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 57 of file G4VChannelingFastSimCrystalData.hh.

Constructor & Destructor Documentation

◆ G4VChannelingFastSimCrystalData()

G4VChannelingFastSimCrystalData::G4VChannelingFastSimCrystalData ( )

Definition at line 32 of file G4VChannelingFastSimCrystalData.cc.

33{
34
35}

◆ ~G4VChannelingFastSimCrystalData()

G4VChannelingFastSimCrystalData::~G4VChannelingFastSimCrystalData ( )
virtual

Definition at line 39 of file G4VChannelingFastSimCrystalData.cc.

39{;}

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 333 of file G4VChannelingFastSimCrystalData.cc.

337{
338 G4double tx = 0.;//horizontal scattering angle
339 G4double ty = 0.;//vertical scattering angle
340
341 G4double ksi=0.1;
342
343// calculation of the teta2-minimal possible angle of a single scattering
344 G4double e1=fK2[ielement]*effectiveStep; //for high speed of a program
345// (real formula is (4*pi*fN0*wpl(x)*dz*fZ1*zz2*alpha*hdc/fPV)**2)
346 G4double teta122=fTetamax12[ielement]/(ksi*fTetamax12[ielement]/e1+1.);
347 // teta122=fTeta12+teta22=teta1^2+teta2^2
348
349 G4double teta22;
350 G4double t;
351// if the angle of a single scattering is less teta1 - minimal possible
352// angle of coulomb scattering defining by the electron shielding than
353// multiple scattering by both nuclei and electrons and electrons will not
354// occur => minimal possible angle of a single scattering is equal to teta1
355 if (teta122<=fTeta12[ielement]*1.000125)
356 {
357 teta22=0.;
358 teta122=fTeta12[ielement];
359 }
360 else
361 {
362 teta22=teta122-fTeta12[ielement];
363 G4double aa=teta22/fTeta12[ielement];
364 G4double aa1=1.+aa;
365
366// crystal, with scattering suppression
367 G4double tetamsi=e1*(G4Log(aa1)+
368 (1.-std::exp(-aa*fBB[ielement]))/aa1+
369 fBBDEXP[ielement]*
370 (expint(fBB[ielement]*aa1)-fE1XBbb[ielement]));
371
372// sumilation of multiple coulomb scattering by nuclei and electrons
373// for high speed of a program, real formula is
374// 4*pi*fN0*wpl(x)*dz*(fZ1*zz2*alpha*hdc/fPV)**2*
375// *(ln(1+a)+(1-exp(-a*b))/(1+a)+(1+b)*exp(b)*(E1XB(b*(1+a))-E1XB(b)))
376
377 ksi=G4UniformRand();
378 t=std::sqrt(-tetamsi*G4Log(ksi));
379
380 ksi=G4UniformRand();
381
382 tx+=t*std::cos(CLHEP::twopi*ksi);
383 ty+=t*std::sin(CLHEP::twopi*ksi);
384
385 }
386// simulation of single coulomb scattering by nuclei (with screened potential)
387 G4double zss=0.;
388 G4double dzss=step;
389
390// (calculation of a distance, at which another single scattering can happen)
391 ksi=G4UniformRand();
392
393 zss=-G4Log(ksi)*step/(e1*(1./teta122-1./fTetamax12[ielement]));
394 G4double tt;
395
396// At some step several single scattering can occur.
397// So,if the distance of the next scattering is less than the step,
398// another scattering can occur. If the distance of the next scattering
399// is less than the difference between the step and the distance of
400// the previous scattering, another scattering can occur. And so on, and so on.
401// In the cycle we simulate each of them. The cycle is finished, when
402// the remaining part of step is less than a distance of the next single scattering.
403//********************************************
404// if at a step a single scattering occurs
405 while (zss<dzss)
406 {
407
408// simulation by Monte-Carlo of angles of single scattering
409 ksi=G4UniformRand();
410
411 tt=fTetamax12[ielement]/(1.+ksi*(fTetamax2[ielement]-teta22)/teta122)-
412 fTeta12[ielement];
413
414 ksi=G4UniformRand();
415
416// suppression of incoherent scattering by the atomic correlations in crystals
417 t=fPzu11[ielement]*tt;
418 t=std::exp(-t);
419
420 if (t<ksi) //if scattering takes place
421 {
422 //scattering angle
423 t=std::sqrt(tt);
424 ksi=G4UniformRand();
425
426 tx+=t*std::cos(CLHEP::twopi*ksi);
427 ty+=t*std::sin(CLHEP::twopi*ksi);
428 }
429
430 dzss-=zss;
431// (calculation of a distance, at which another single scattering can happen)
432 ksi=G4UniformRand();
433
434 zss=-G4Log(ksi)*step/(e1*(1./teta122-1./fTetamax12[ielement]));
435 }
436//********************************************
437 return G4ThreeVector(tx,ty,0.);
438}
G4double G4Log(G4double x)
Definition G4Log.hh:227
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 442 of file G4VChannelingFastSimCrystalData.cc.

446{
447
448 G4double zss=0.;
449 G4double dzss=step;
450 G4double ksi = 0.;
451
452 G4double tx = 0.;//horizontal scattering angle
453 G4double ty = 0.;//vertical scattering angle
454 G4double eloss = 0.;//energy loss
455
456 // eMinIonization - minimal energy transfered to electron
457 // a cut to reduce the number of calls of electron scattering
458 // is needed only at low density regions, in many cases does not do anything at all
459 if (eMinIonization<0.5*eV){eMinIonization=0.5*eV;}
460
461 // single scattering on electrons routine
462 if ((eMinIonization<fTmax)&&(electronDensity>DBL_EPSILON))
463 {
464
465// (calculation of a distance, at which another single scattering can happen)
466// simulation of scattering length (by the same way single scattering by nucleus
467 ksi=G4UniformRand();
468
469 zss=-1.0*G4Log(ksi)/(fK3*electronDensity)/(1./eMinIonization-1./fTmax);
470
471//********************************************
472// if at a step a single scattering occur
473 while (zss<dzss)
474 {
475// simulation by Monte-Carlo of angles of single scattering
476 ksi=G4UniformRand();
477
478// energy transfered to electron
479 G4double e1=eMinIonization/(1.-ksi*(1.-eMinIonization/fTmax));
480
481// scattering angle
482 G4double t=std::sqrt(e1*(e1+2.*CLHEP::electron_mass_c2))/fPz;
483
484 // energy losses
485 if (fHadron) {eloss=e1;} // we don't calculate ionization losses for e+-
486
487 ksi=G4UniformRand();
488
489 tx+=t*std::cos(CLHEP::twopi*ksi);
490 ty+=t*std::sin(CLHEP::twopi*ksi);
491
492 dzss-=zss;
493// (calculation of a distance, at which another single scattering can happen)
494// simulation of scattering length
495// (by the same way single scattering by nucleus
496 ksi=G4UniformRand();
497
498 zss=-1.0*G4Log(ksi)/(fK3*electronDensity)/(1./eMinIonization-1./fTmax);
499 }
500//********************************************
501 }
502 return G4ThreeVector(tx,ty,eloss);
503}
#define DBL_EPSILON
Definition templates.hh:66

Referenced by G4ChannelingFastSimModel::DoIt().

◆ ElectronDensity()

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

electron density function

Definition at line 68 of file G4VChannelingFastSimCrystalData.hh.

69 {
71 if(nel0<0.) {nel0=0.;}//exception, errors of interpolation functions
72 return nel0;
73 }
G4double GetIF(G4double xx, G4double yy)
Get Spline Function.
G4ChannelingFastSimInterpolation * fElectronDensity

Referenced by G4ChannelingFastSimModel::DoIt().

◆ Ex()

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

electric fields produced by crystal lattice

Definition at line 64 of file G4VChannelingFastSimCrystalData.hh.

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

Referenced by G4ChannelingFastSimModel::DoIt().

◆ Ey()

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

Definition at line 65 of file G4VChannelingFastSimCrystalData.hh.

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

Referenced by G4ChannelingFastSimModel::DoIt().

◆ GetBendingAngle()

G4double G4VChannelingFastSimCrystalData::GetBendingAngle ( )
inline

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

Definition at line 103 of file G4VChannelingFastSimCrystalData.hh.

◆ GetBeta()

G4double G4VChannelingFastSimCrystalData::GetBeta ( )
inline

get particle velocity/c

Definition at line 96 of file G4VChannelingFastSimCrystalData.hh.

96{return fBeta;}

Referenced by G4ChannelingFastSimModel::DoIt().

◆ GetCorrectionZ()

G4double G4VChannelingFastSimCrystalData::GetCorrectionZ ( )
inline

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

Definition at line 172 of file G4VChannelingFastSimCrystalData.hh.

Referenced by G4ChannelingFastSimModel::DoIt().

◆ 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 111 of file G4VChannelingFastSimCrystalData.hh.

Referenced by G4ChannelingFastSimModel::DoIt().

◆ GetCUtetax()

G4double G4VChannelingFastSimCrystalData::GetCUtetax ( G4double z)
inline

◆ GetCUx()

G4double G4VChannelingFastSimCrystalData::GetCUx ( G4double z)
inline

◆ GetLindhardAngle() [1/2]

G4double G4VChannelingFastSimCrystalData::GetLindhardAngle ( )

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

Definition at line 288 of file G4VChannelingFastSimCrystalData.cc.

289{
290 return fTetaL; //return the Lindhard angle value calculated in SetParticleProperties
291}

Referenced by GetMaxSimulationStep().

◆ GetLindhardAngle() [2/2]

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

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

Definition at line 279 of file G4VChannelingFastSimCrystalData.cc.

280{
281 G4double pv0 = etotal-mass*mass/etotal;
282 return std::sqrt(2*fVmax/pv0); //Calculate the value of the Lindhard angle
283 //(!!! the value for a straight crystal)
284}

Referenced by G4ChannelingFastSimModel::DoIt(), and G4ChannelingFastSimModel::ModelTrigger().

◆ GetMaxSimulationStep()

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

Calculate maximal simulation step (standard value for channeling particles)

Definition at line 324 of file G4VChannelingFastSimCrystalData.cc.

326{
327 //standard value of step for channeling particles which is the maximal possible step
328 return fChangeStep/GetLindhardAngle(etotal, mass);
329}
G4double GetLindhardAngle()
Calculate the value of the Lindhard angle (!!! the value for a straight crystal)

Referenced by G4ChannelingFastSimModel::ModelTrigger().

◆ 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 107 of file G4VChannelingFastSimCrystalData.hh.

◆ GetModel()

G4int G4VChannelingFastSimCrystalData::GetModel ( )
inline

◆ GetNelements()

G4int G4VChannelingFastSimCrystalData::GetNelements ( )
inline

Definition at line 98 of file G4VChannelingFastSimCrystalData.hh.

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

Referenced by G4ChannelingFastSimModel::DoIt().

◆ 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 295 of file G4VChannelingFastSimCrystalData.cc.

296{
297 G4double simulationstep;
298 //find angle of particle w.r.t. the plane or axis
299 G4double angle=0.;
300 if (iModel==1)//1D model
301 {
302 angle = std::abs(tx);
303 }
304 else if (iModel==2)//2D model
305 {
306 angle = std::sqrt(tx*tx+ty*ty);
307 }
308
309 //compare this angle with the Lindhard angle
310 if (angle<fTetaL)
311 {
312 simulationstep = fChannelingStep;
313 }
314 else
315 {
316 simulationstep = fChangeStep/angle;
317 }
318
319 return simulationstep;
320}

Referenced by G4ChannelingFastSimModel::DoIt().

◆ IonizationLosses()

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

ionization losses

Definition at line 507 of file G4VChannelingFastSimCrystalData.cc.

509{
510 G4double elosses = 0.;
511 if (fHadron) {elosses=fKD[ielement]/fV2*
512 (G4Log(fMe2Gamma*fV2/fI0[ielement]/fGamma) - fV2)*dz;}
513 return elosses;
514}

Referenced by G4ChannelingFastSimModel::DoIt().

◆ MinIonizationEnergy()

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

minimum energy of ionization function

Definition at line 75 of file G4VChannelingFastSimCrystalData.hh.

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

Referenced by G4ChannelingFastSimModel::DoIt().

◆ NuclearDensity()

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

nuclear density function (normalized to average nuclear density)

Definition at line 78 of file G4VChannelingFastSimCrystalData.hh.

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

Referenced by G4ChannelingFastSimModel::DoIt().

◆ 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 67 of file G4VChannelingFastSimCrystalData.cc.

69{
70 G4int crystalID = crystallogic->GetInstanceID();
71
72 //set the bending angle for this logical volume
73 fMapBendingAngle[crystalID]=tetab;
74
75 G4ThreeVector limboxmin;//minimal limits of the box bounding the logical volume
76 G4ThreeVector limboxmax;//maximal limits of the box bounding the logical volume
77 //save the limits of the box bounding the logical volume
78 crystallogic->GetSolid()->BoundingLimits(limboxmin,limboxmax);
79
80 //bounding box half dimensions
81 fHalfDimBoundingBox = (limboxmax-limboxmin)/2.;
82
83 G4double lcr = limboxmax.getZ()-limboxmin.getZ();//crystal thickness
84
85 fBendingAngle=std::abs(tetab);
86 if (fBendingAngle<0.000001)//no bending less then 1 urad
87 {
89 {
90 G4cout << "Channeling model: volume " << crystallogic->GetName() << G4endl;
91 G4cout << "Warning: bending angle is lower than 1 urad => set to 0" << G4endl;
92 }
93
94 fBent=0;
96 fBendingR=0.;//just for convenience (infinity in reality)
97 fBending2R=0.;
99 fCurv=0.;
100
101 fCorrectionZ = 1.;
102 }
103 else
104 {
105 fBent=1;
109 fCurv=1./fBendingR;
110
111 if (tetab<0.)
112 {
113 G4cout << "Channeling model: volume " << crystallogic->GetName() << G4endl;
114 G4cout << "Warning: bending angle is negative => set to be positive" << G4endl;
115 }
116 }
117
118}
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:665

Referenced by SetCUParameters(), and SetGeometryParameters().

◆ SetCrystallineUndulatorParameters()

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 144 of file G4VChannelingFastSimCrystalData.cc.

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

◆ 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 165 of file G4VChannelingFastSimCrystalData.cc.

168{
169 G4int crystalID = crystallogic->GetInstanceID();
170
171 //set the crystalline undulator parameters for this logical volume
172 fMapCUAmplitudePeriodPhase[crystalID]=amplitudePeriodPhase;
173 fCUAmplitude=amplitudePeriodPhase.x();
174 G4double period = amplitudePeriodPhase.y();
175 fCUPhase = amplitudePeriodPhase.z();
176
177 //if the amplidude of the crystalline undulator is 0 => no undulator
179 {
180 //crystalline undulator flag
181 fCU = true;
182
183 fCUK = CLHEP::twopi/period;
184
186 {
187 //bent and periodically bent crystal are not compatible
188 SetBendingAngle(0,crystallogic);
189
190 G4cout << "Channeling model: volume " << crystallogic->GetName() << G4endl;
191 G4cout << "Warning: crystalline undulator is not compatible with "
192 "a bent crystal mode => setting bending angle to 0." << G4endl;
193 }
194 }
195 else
196 {
197 fCU = false;
198 fCUAmplitude = 0.;
199 fCUK = 0.;
200 fCUPhase = 0.;
201 fMapCUAmplitudePeriodPhase[crystalID] = G4ThreeVector(0.,0.,0.);
202 }
203
204 fCUK2 = fCUK*fCUK;
206}
double z() const
double x() const
double y() const
void SetBendingAngle(G4double tetab, const G4LogicalVolume *crystallogic)

Referenced by SetCrystallineUndulatorParameters(), and SetGeometryParameters().

◆ SetGeometryParameters()

void G4VChannelingFastSimCrystalData::SetGeometryParameters ( const G4LogicalVolume * crystallogic)

set geometry parameters from current logical volume

Definition at line 43 of file G4VChannelingFastSimCrystalData.cc.

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

Referenced by G4ChannelingFastSimModel::DoIt(), and G4ChannelingFastSimModel::ModelTrigger().

◆ SetMaterialProperties()

virtual void G4VChannelingFastSimCrystalData::SetMaterialProperties ( const G4Material * crystal,
const G4String & lattice )
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 122 of file G4VChannelingFastSimCrystalData.cc.

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

Referenced by SetGeometryParameters().

◆ SetParticleProperties()

void G4VChannelingFastSimCrystalData::SetParticleProperties ( G4double etotal,
G4double mp,
G4double charge,
G4bool ifhadron )

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

Definition at line 210 of file G4VChannelingFastSimCrystalData.cc.

214{
215 G4double teta1;
216 fZ2=charge;
217 G4double zz22=fZ2*fZ2;
218 fHadron=ifhadron;
219
220// particle momentum and energy
221 G4double t=etotal*etotal-mass*mass; // economy of operations
222 fPz=std::sqrt(t); // momentum of particle
223 fPV=t/etotal; // pv
224 fBeta=fPz/etotal; // velocity/c
225 fTetaL = std::sqrt(fVmax2/fPV); //Lindhard angle
226 fChannelingStep = fChangeStep/fTetaL; //standard simulation step
227
228// Energy losses
229 fV2 = fBeta*fBeta; // particle (velocity/c)^2
230 fGamma = etotal/mass; // Lorentz factor
231 fMe2Gamma = 2*CLHEP::electron_mass_c2*fGamma;
232// max ionization losses
233 fTmax = fMe2Gamma*fGamma*fV2/
234 (CLHEP::electron_mass_c2/mass*CLHEP::electron_mass_c2/mass +
235 1. + fMe2Gamma/mass);
236
237 for(G4int i=0; i<fNelements; i++)
238 {
239
240// minimal scattering angle by coulomb scattering on nuclei
241// defining by shielding by electrons
242// teta1=hdc/(fPz*fRF)*DSQRT(1.13D0+3.76D0*(alpha*fZ1*fZ2/fBeta)**2){ev*cm/(eV*cm)}
243 teta1=fTeta10[i]*std::sqrt(1.13+fK40[i]*zz22/fV2); // /fPz later to speed up
244 // the calculations
245
246// the coefficient for multiple scattering
247 fBB[i]=teta1*teta1*fPu11[i];
248 fE1XBbb[i]=expint(fBB[i]);
249 fBBDEXP[i]=(1.+fBB[i])*std::exp(fBB[i]);
250// necessary for suppression of incoherent scattering
251// by the atomic correlations in crystals for single scattering on nucleus
252// (screened atomic potential): EXP(-(fPz*teta*fU1)**2)=EXP(-fPzu11*teta**2).GE.ksi
253// =>no scattering
254 fPzu11[i]=fPu11[i]*fPz*fPz;
255
256 teta1=teta1/fPz; //
257 fTeta12[i]=teta1*teta1;
258// maximal scattering angle by coulomb scattering on nuclei
259// defining by nucleus radius
260// tetamax=hc/(fPz*1.D-6*fR0*fAN**(1.D0/3.D0))// {Mev*fermi/(MeV*fermi)}
261 G4double tetamax=fTetamax0[i]/fPz;
262 fTetamax2[i]=tetamax*tetamax;
264
265// a cofficient in a formula for scattering (for high speed of simulation)
266// fK2=(fZ2*alpha*hdc)**2*4.*pi*fN0*(fZ1/fPV)**2
267// fK3=(fZ2*alpha*hdc)**2*4.*pi*fN0/(fPV)**2
268 fK2[i]=fK20[i]*zz22/fPV/fPV;
269 }
270
271// nuclear diffractive scattering angle
272 //tetaQEL=1./sqrt(2.*(9.26-4.94/sqrt(fPz/GeV)+0.28*log(fPz/GeV)));
273
274 fK3=fK30/fV2;
275}
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

Referenced by G4ChannelingFastSimModel::DoIt().

◆ 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 239 of file G4VChannelingFastSimCrystalData.hh.

Referenced by GetCUx(), and SetCUParameters().

◆ fCUAmplitudeK

G4double G4VChannelingFastSimCrystalData::fCUAmplitudeK =0.
protected

Definition at line 242 of file G4VChannelingFastSimCrystalData.hh.

Referenced by GetCUtetax(), and SetCUParameters().

◆ fCUK

G4double G4VChannelingFastSimCrystalData::fCUK =0.
protected

Definition at line 240 of file G4VChannelingFastSimCrystalData.hh.

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

◆ fCUK2

G4double G4VChannelingFastSimCrystalData::fCUK2 =0.
protected

Definition at line 243 of file G4VChannelingFastSimCrystalData.hh.

Referenced by GetCurv(), and SetCUParameters().

◆ fCUPhase

G4double G4VChannelingFastSimCrystalData::fCUPhase =0.
protected

Definition at line 241 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 203 of file G4VChannelingFastSimCrystalData.hh.

203{nullptr};

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

◆ fElectricFieldY

G4ChannelingFastSimInterpolation* G4VChannelingFastSimCrystalData::fElectricFieldY {nullptr}
protected

Definition at line 205 of file G4VChannelingFastSimCrystalData.hh.

205{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 275 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

◆ 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 246 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 285 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 266 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: