CMS 3D CMS Logo

List of all members | Public Member Functions | Private Attributes
LaserBeamsTEC1 Class Reference

#include <LaserBeamsTEC1.h>

Inheritance diagram for LaserBeamsTEC1:

Public Member Functions

void GeneratePrimaries (G4Event *myEvent) override
 shoot optical photons into the detector at the beginning of an event More...
 
 LaserBeamsTEC1 ()
 default constructor More...
 
 LaserBeamsTEC1 (G4int nPhotonsInGun, G4int nPhotonsInBeam, G4double PhotonEnergy)
 constructor More...
 
void setOptPhotonPolar (G4double Angle)
 set the polarisation of the photons More...
 
 ~LaserBeamsTEC1 () override
 destructor More...
 

Private Attributes

CLHEP::DRand48Engine * theDRand48Engine
 
G4int thenParticle
 
G4int thenParticleInGun
 
G4ParticleGun * theParticleGun
 
G4double thePhotonEnergy
 

Detailed Description

Laser Beams in the right Endcap

Date
2007/06/11 14:44:28
Revision
1.3
Author
Maarten Thomas

Definition at line 21 of file LaserBeamsTEC1.h.

Constructor & Destructor Documentation

LaserBeamsTEC1::LaserBeamsTEC1 ( )

default constructor

Definition at line 21 of file LaserBeamsTEC1.cc.

21  :
22  theParticleGun(nullptr),
23  theDRand48Engine(nullptr)
24 {
25  G4int nPhotonsGun = 1;
26  G4int nPhotonsBeam = 1;
27  G4double Energy = 1.15 * eV;
28  // call constructor with options
29  LaserBeamsTEC1(nPhotonsGun, nPhotonsBeam, Energy);
30 }
LaserBeamsTEC1()
default constructor
CLHEP::DRand48Engine * theDRand48Engine
G4ParticleGun * theParticleGun
LaserBeamsTEC1::LaserBeamsTEC1 ( G4int  nPhotonsInGun,
G4int  nPhotonsInBeam,
G4double  PhotonEnergy 
)

constructor

Definition at line 32 of file LaserBeamsTEC1.cc.

References setOptPhotonPolar(), theDRand48Engine, thenParticle, thenParticleInGun, theParticleGun, and thePhotonEnergy.

32  :
34  thenParticle(0),
36 {
37  /* *********************************************************************** */
38  /* initialize and configure the particle gun */
39  /* *********************************************************************** */
40 
41  // the Photon energy
42  thePhotonEnergy = PhotonEnergy;
43 
44  // number of particles in the Laser beam
45  thenParticleInGun = nPhotonsInGun;
46 
47  // number of particles in one beam. ATTENTION: each beam contains nParticleInGun with the same
48  // startpoint and direction. nParticle gives the number of particles in the beam with a different
49  // startpoint. They are used to simulate the gaussian beamprofile of the Laser Beams.
50  thenParticle = nPhotonsInBeam;
51 
52  // create the particle gun
53  theParticleGun = new G4ParticleGun(thenParticleInGun);
54 
55  // default kinematics
56  G4ParticleTable * theParticleTable = G4ParticleTable::GetParticleTable();
57  G4ParticleDefinition * theOpticalPhoton = theParticleTable->FindParticle("opticalphoton");
58 
59  theParticleGun->SetParticleDefinition(theOpticalPhoton);
60  theParticleGun->SetParticleTime(0.0 * ns);
61  theParticleGun->SetParticlePosition(G4ThreeVector(-500.0 * cm, 0.0 * cm, 0.0 * cm));
62  theParticleGun->SetParticleMomentumDirection(G4ThreeVector(5.0, 3.0, 0.0));
63  theParticleGun->SetParticleEnergy(10.0 * keV);
64  setOptPhotonPolar(90.0);
65 
66  // initialize the random number engine
67  theDRand48Engine = new CLHEP::DRand48Engine();
68 
69 }
G4double thePhotonEnergy
G4int thenParticleInGun
CLHEP::DRand48Engine * theDRand48Engine
void setOptPhotonPolar(G4double Angle)
set the polarisation of the photons
G4ParticleGun * theParticleGun
LaserBeamsTEC1::~LaserBeamsTEC1 ( )
override

destructor

Definition at line 71 of file LaserBeamsTEC1.cc.

References theDRand48Engine, and theParticleGun.

72 {
73  if ( theParticleGun != nullptr ) { delete theParticleGun; }
74  if ( theDRand48Engine != nullptr ) { delete theDRand48Engine; }
75 }
CLHEP::DRand48Engine * theDRand48Engine
G4ParticleGun * theParticleGun

Member Function Documentation

void LaserBeamsTEC1::GeneratePrimaries ( G4Event *  myEvent)
override

shoot optical photons into the detector at the beginning of an event

Definition at line 77 of file LaserBeamsTEC1.cc.

References funct::cos(), M_PI, edm::RandomNumberGenerator::mySeed(), SurveyInfoScenario_cff::seed, setOptPhotonPolar(), funct::sin(), theDRand48Engine, thenParticle, theParticleGun, and thePhotonEnergy.

Referenced by LaserPrimaryGeneratorAction::GeneratePrimaries().

78 {
79  // this function is called at the beginning of an Event in LaserAlignment::upDate(const BeginOfEvent * myEvent)
80 
81  // use the random number generator service of the framework
83  unsigned int seed = rng->mySeed();
84 
85  // set the seed
86  theDRand48Engine->setSeed(seed);
87 
88  // number of LaserRings and Laserdiodes
89  const G4int nLaserRings = 2;
90  const G4int nLaserBeams = 8;
91 
92  // z position of the sixth Tracker Endcap Disc, where the Laserdiodes are positioned
93  G4double LaserPositionZ = 2057.5 * mm;
94 
95  // Radius of the inner and outer Laser ring
96  G4double LaserRingRadius[nLaserRings] = {564.0 * mm, 840.0 * mm};
97 
98  // phi position of the first Laserdiode
99  G4double LaserPhi0 = 0.392699082;
100 
101  // width of the LaserBeams
102  G4double LaserRingSigmaX[nLaserRings] = {0.5 * mm, 0.5 * mm};
103  G4double LaserRingSigmaY[nLaserRings] = {0.5 * mm, 0.5 * mm};
104 
105  // get the definition of the optical photon
106  G4ParticleTable * theParticleTable = G4ParticleTable::GetParticleTable();
107  G4ParticleDefinition * theOpticalPhoton= theParticleTable->FindParticle("opticalphoton");
108 
109  // loop over the LaserRings
110  for (int theRing = 0; theRing < nLaserRings; theRing++)
111  {
112  // loop over the LaserBeams
113  for (int theBeam = 0; theBeam < nLaserBeams; theBeam++)
114  {
115  // code for forward and backward beam
116  // calculate the right phi for the current beam
117  G4double LaserPositionPhi = LaserPhi0 + G4double(theBeam * G4double(G4double(2 * M_PI) / nLaserBeams));
118 
119  // calculate x and y position for the current beam
120  G4double LaserPositionX = cos(LaserPositionPhi) * LaserRingRadius[theRing];
121  G4double LaserPositionY = sin(LaserPositionPhi) * LaserRingRadius[theRing];
122 
123  // loop over all the particles in one beam
124  for (int theParticle = 0; theParticle < thenParticle; theParticle++)
125  {
126  // get randomnumbers and calculate the position
127  CLHEP::RandGaussQ aGaussObjX( *theDRand48Engine, LaserPositionX, LaserRingSigmaX[theRing] );
128  CLHEP::RandGaussQ aGaussObjY( *theDRand48Engine, LaserPositionY, LaserRingSigmaY[theRing] );
129 
130  G4double theXPosition = aGaussObjX.fire();
131  G4double theYPosition = aGaussObjY.fire();
132  G4double theZPosition = LaserPositionZ;
133 
134  // set the properties of the newly created particle
135  theParticleGun->SetParticleDefinition(theOpticalPhoton);
136  theParticleGun->SetParticleTime(0.0 * ns);
137  theParticleGun->SetParticlePosition(G4ThreeVector(theXPosition, theYPosition, theZPosition));
138  theParticleGun->SetParticleEnergy(thePhotonEnergy);
139 
140  // loop over both directions of the beam
141  for (int theDirection = 0; theDirection < 2; theDirection++)
142  {
143  // shoot in both beam directions ...
144  if (theDirection == 0) // shoot in forward direction (+z)
145  {
146  theParticleGun->SetParticleMomentumDirection(G4ThreeVector(0.0, 0.0, 1.0));
147  // set the polarization
148  setOptPhotonPolar(90.0);
149  // generate the particle
150  theParticleGun->GeneratePrimaryVertex(myEvent);
151  }
152 
153  if (theDirection == 1) // shoot in backward direction (-z)
154  {
155  theParticleGun->SetParticleMomentumDirection(G4ThreeVector(0.0, 0.0, -1.0));
156  // set the polarization
157  setOptPhotonPolar(90.0);
158  // generate the particle
159  theParticleGun->GeneratePrimaryVertex(myEvent);
160  }
161  } // end loop over both beam directions
162  } // end loop over particles in beam
163  } // end loop over beams
164  } // end loop over rings
165 }
G4double thePhotonEnergy
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
CLHEP::DRand48Engine * theDRand48Engine
virtual std::uint32_t mySeed() const =0
#define M_PI
void setOptPhotonPolar(G4double Angle)
set the polarisation of the photons
G4ParticleGun * theParticleGun
void LaserBeamsTEC1::setOptPhotonPolar ( G4double  Angle)

set the polarisation of the photons

Definition at line 167 of file LaserBeamsTEC1.cc.

References funct::cos(), funct::sin(), mathSSE::sqrt(), and theParticleGun.

Referenced by GeneratePrimaries(), and LaserBeamsTEC1().

168 {
169  /* *********************************************************************** */
170  /* to get optical processes working properly, you have to make sure *
171  * that the photon polarisation is defined. */
172  /* *********************************************************************** */
173 
174  // first check if we have an optical photon
175  if ( theParticleGun->GetParticleDefinition()->GetParticleName() != "opticalphoton" )
176  {
177  edm::LogWarning("SimLaserAlignment:LaserBeamsTEC1") << "<LaserBeamsTEC1::SetOptPhotonPolar()>: WARNING! The ParticleGun is not an optical photon";
178  return;
179  }
180 
181 // G4cout << " AC1CMS: The ParticleGun is an " << theParticleGun->GetParticleDefinition()->GetParticleName();
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;
186 
187  G4ThreeVector e_perpendicular(0.0, 0.0, 1.0);
188 
189  if ( modul2 > 0.0 ) { e_perpendicular = (1.0 / sqrt(modul2)) * product; }
190 
191  G4ThreeVector e_parallel = e_perpendicular.cross(kphoton);
192 
193  G4ThreeVector polar = cos(Angle) * e_parallel + sin(Angle) * e_perpendicular;
194 
195 // G4cout << ", the polarization = " << polar << G4endl;
196  theParticleGun->SetParticlePolarization(polar);
197 }
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
T sqrt(T t)
Definition: SSEVec.h:18
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Definition: Angle.h:17
G4ParticleGun * theParticleGun

Member Data Documentation

CLHEP::DRand48Engine* LaserBeamsTEC1::theDRand48Engine
private

Definition at line 46 of file LaserBeamsTEC1.h.

Referenced by GeneratePrimaries(), LaserBeamsTEC1(), and ~LaserBeamsTEC1().

G4int LaserBeamsTEC1::thenParticle
private

Definition at line 39 of file LaserBeamsTEC1.h.

Referenced by GeneratePrimaries(), and LaserBeamsTEC1().

G4int LaserBeamsTEC1::thenParticleInGun
private

Definition at line 38 of file LaserBeamsTEC1.h.

Referenced by LaserBeamsTEC1().

G4ParticleGun* LaserBeamsTEC1::theParticleGun
private
G4double LaserBeamsTEC1::thePhotonEnergy
private

Definition at line 40 of file LaserBeamsTEC1.h.

Referenced by GeneratePrimaries(), and LaserBeamsTEC1().