15 #include "CLHEP/Units/GlobalSystemOfUnits.h"
16 #include "CLHEP/Random/RandGaussQ.h"
18 #include "G4ParticleDefinition.hh"
19 #include "G4ParticleGun.hh"
25 G4int nPhotonsGun = 1;
26 G4int nPhotonsBeam = 1;
27 G4double Energy = 1.15 * eV;
56 G4ParticleTable * theParticleTable = G4ParticleTable::GetParticleTable();
57 G4ParticleDefinition * theOpticalPhoton = theParticleTable->FindParticle(
"opticalphoton");
61 theParticleGun->SetParticlePosition(G4ThreeVector(-500.0 * cm, 0.0 * cm, 0.0 * cm));
62 theParticleGun->SetParticleMomentumDirection(G4ThreeVector(5.0, 3.0, 0.0));
89 const G4int nLaserRings = 2;
90 const G4int nLaserBeams = 8;
93 G4double LaserPositionZ = 2057.5 * mm;
96 G4double LaserRingRadius[nLaserRings] = {564.0 * mm, 840.0 * mm};
99 G4double LaserPhi0 = 0.392699082;
102 G4double LaserRingSigmaX[nLaserRings] = {0.5 * mm, 0.5 * mm};
103 G4double LaserRingSigmaY[nLaserRings] = {0.5 * mm, 0.5 * mm};
106 G4ParticleTable * theParticleTable = G4ParticleTable::GetParticleTable();
107 G4ParticleDefinition * theOpticalPhoton= theParticleTable->FindParticle(
"opticalphoton");
110 for (
int theRing = 0; theRing < nLaserRings; theRing++)
113 for (
int theBeam = 0; theBeam < nLaserBeams; theBeam++)
117 G4double LaserPositionPhi = LaserPhi0 + G4double(theBeam * G4double(G4double(2 *
M_PI) / nLaserBeams));
120 G4double LaserPositionX =
cos(LaserPositionPhi) * LaserRingRadius[theRing];
121 G4double LaserPositionY =
sin(LaserPositionPhi) * LaserRingRadius[theRing];
124 for (
int theParticle = 0; theParticle <
thenParticle; theParticle++)
127 CLHEP::RandGaussQ aGaussObjX( *
theDRand48Engine, LaserPositionX, LaserRingSigmaX[theRing] );
128 CLHEP::RandGaussQ aGaussObjY( *
theDRand48Engine, LaserPositionY, LaserRingSigmaY[theRing] );
130 G4double theXPosition = aGaussObjX.fire();
131 G4double theYPosition = aGaussObjY.fire();
132 G4double theZPosition = LaserPositionZ;
137 theParticleGun->SetParticlePosition(G4ThreeVector(theXPosition, theYPosition, theZPosition));
141 for (
int theDirection = 0; theDirection < 2; theDirection++)
144 if (theDirection == 0)
146 theParticleGun->SetParticleMomentumDirection(G4ThreeVector(0.0, 0.0, 1.0));
153 if (theDirection == 1)
155 theParticleGun->SetParticleMomentumDirection(G4ThreeVector(0.0, 0.0, -1.0));
175 if (
theParticleGun->GetParticleDefinition()->GetParticleName() !=
"opticalphoton" )
177 edm::LogWarning(
"SimLaserAlignment:LaserBeamsTEC1") <<
"<LaserBeamsTEC1::SetOptPhotonPolar()>: WARNING! The ParticleGun is not an optical photon";
182 G4ThreeVector normal(1.0, 0.0, 0.0);
183 G4ThreeVector kphoton =
theParticleGun->GetParticleMomentumDirection();
184 G4ThreeVector product = normal.cross(kphoton);
185 G4double modul2 = product * product;
187 G4ThreeVector e_perpendicular(0.0, 0.0, 1.0);
189 if ( modul2 > 0.0 ) { e_perpendicular = (1.0 /
sqrt(modul2)) * product; }
191 G4ThreeVector e_parallel = e_perpendicular.cross(kphoton);
193 G4ThreeVector polar =
cos(Angle) * e_parallel +
sin(Angle) * e_perpendicular;
Sin< T >::type sin(const T &t)
virtual std::uint32_t mySeed() const =0
Cos< T >::type cos(const T &t)
void GeneratePrimaries(G4Event *myEvent)
shoot optical photons into the detector at the beginning of an event
LaserBeamsTEC1()
default constructor
CLHEP::DRand48Engine * theDRand48Engine
~LaserBeamsTEC1()
destructor
void setOptPhotonPolar(G4double Angle)
set the polarisation of the photons
G4ParticleGun * theParticleGun