00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "BDSGlobalConstants.hh"
00013 #include "BDSPrimaryGeneratorAction.hh"
00014
00015 #include "BDSDetectorConstruction.hh"
00016
00017 #include "G4Event.hh"
00018 #include "G4ParticleGun.hh"
00019 #include "G4ParticleTable.hh"
00020 #include "G4ParticleDefinition.hh"
00021 #include "G4EventManager.hh"
00022 #include "G4StackManager.hh"
00023 #include "G4Track.hh"
00024 #include "G4Trajectory.hh"
00025
00026 #include "Randomize.hh"
00027
00028 #include "BDSBunch.hh"
00029
00030 #include<iostream>
00031
00032 extern BDSBunch bdsBunch;
00033
00034
00035
00036 G4double
00037 initial_x, initial_xp,
00038 initial_y, initial_yp,
00039 initial_z, initial_zp,
00040 initial_E, initial_t,
00041 initial_weight;
00042
00043 BDSPrimaryGeneratorAction::BDSPrimaryGeneratorAction(
00044 BDSDetectorConstruction* BDSDC)
00045 :BDSDetector(BDSDC), itsBDSSynchrotronRadiation(NULL)
00046 {
00047
00048 particleGun = new G4ParticleGun(1);
00049
00050
00051
00052
00053
00054
00055
00056 #ifdef DEBUG
00057 G4cout << "BDSPrimaryGeneratorAction.cc: Primary particle is " << BDSGlobalConstants::Instance()->GetParticleDefinition()->GetParticleName() << G4endl;
00058 G4cout << "BDSPrimaryGeneratorAction.cc: Setting particle definition for gun..." << G4endl;
00059 particleGun->SetParticleDefinition(G4ParticleTable::GetParticleTable()->
00060 FindParticle("e-"));
00061 G4cout << "BDSPrimaryGeneratorAction.cc: Setting synch rad..." << G4endl;
00062 #endif
00063
00064 if(BDSGlobalConstants::Instance()->GetUseSynchPrimaryGen())
00065 {
00066 itsBDSSynchrotronRadiation=new BDSSynchrotronRadiation("tmpSynRad");
00067 G4double R=BDSGlobalConstants::Instance()->GetSynchPrimaryLength()/
00068 BDSGlobalConstants::Instance()->GetSynchPrimaryAngle();
00069 itsSynchCritEng=3./2.*hbarc/pow(electron_mass_c2,3)*
00070 pow(BDSGlobalConstants::Instance()->GetBeamKineticEnergy(),3)/R;
00071 #ifdef DEBUG
00072 G4cout<<" BDSPrimaryGeneratorAction: Critical Energy="<<
00073 itsSynchCritEng/keV<<" keV"<<G4endl;
00074 #endif
00075 particleGun->SetParticleDefinition(G4ParticleTable::GetParticleTable()->
00076 FindParticle("gamma"));
00077 }
00078
00079 #ifdef DEBUG
00080 G4cout << "Setting momentum..." << G4endl;
00081 #endif
00082 particleGun->SetParticleMomentumDirection(G4ThreeVector(0.,0.,1.));
00083 particleGun->SetParticlePosition(G4ThreeVector(0.*cm,0.*cm,0.*cm));
00084 particleGun->SetParticleEnergy(BDSGlobalConstants::Instance()->GetBeamKineticEnergy());
00085 particleGun->SetParticleTime(0);
00086 weight = 1;
00087 }
00088
00089
00090
00091 BDSPrimaryGeneratorAction::~BDSPrimaryGeneratorAction()
00092 {
00093 delete particleGun;
00094 delete itsBDSSynchrotronRadiation;
00095 }
00096
00097
00098
00099 void BDSPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
00100 {
00101
00102
00103 G4double x0, y0, z0, xp, yp, zp, t, E;
00104
00105 particleGun->SetParticleDefinition(BDSGlobalConstants::Instance()->GetParticleDefinition());
00106
00107 if(!BDSGlobalConstants::Instance()->getReadFromStack()){
00108 bdsBunch.GetNextParticle(x0,y0,z0,xp,yp,zp,t,E,weight);
00109 }
00110 else if(BDSGlobalConstants::Instance()->holdingQueue.size()!=0){
00111 tmpParticle holdingParticle = BDSGlobalConstants::Instance()->holdingQueue.front();
00112 tmpParticle outputParticle = BDSGlobalConstants::Instance()->outputQueue.front();
00113 x0 = outputParticle.x;
00114 y0 = outputParticle.y;
00115 z0 = outputParticle.z;
00116 t = holdingParticle.t;
00117 xp = holdingParticle.xp;
00118 yp = holdingParticle.yp;
00119 zp = holdingParticle.zp;
00120 E = holdingParticle.E;
00121 weight = holdingParticle.weight;
00122
00123
00124
00125
00126
00127 if(E<0){
00128 particleGun->SetParticleDefinition(
00129 G4ParticleTable::GetParticleTable()->FindParticle(
00130 BDSGlobalConstants::Instance()->GetParticleDefinition()->
00131 GetAntiPDGEncoding()));
00132 E*=-1;
00133 }
00134
00135 #ifdef DEBUG
00136 printf("Particles left %i: %f %f %f %f %f %f %f %f\n",
00137 (int)BDSGlobalConstants::Instance()->holdingQueue.size(),x0,y0,z0,xp,yp,zp,t,E);
00138 #endif
00139 }
00140 else if(!BDSGlobalConstants::Instance()->isReference) G4Exception("No new particles to fire...\n", "-1", FatalException, "");
00141
00142 if(E==0) G4cout << "Particle energy is 0! This will not be tracked." << G4endl;
00143
00144 G4ThreeVector PartMomDir(0,0,1);
00145 G4ThreeVector PartPosition(0,0,0);
00146
00147 G4ThreeVector LocalPos;
00148 G4ThreeVector LocalMomDir;
00149
00150 if(!BDSGlobalConstants::Instance()->isReference){
00151 PartMomDir=G4ThreeVector(xp,yp,zp);
00152 PartPosition=G4ThreeVector(x0,y0,z0);
00153
00154 if(BDSGlobalConstants::Instance()->GetRefVolume()!=""){
00155 const G4AffineTransform* tf = BDSGlobalConstants::Instance()->GetRefTransform();
00156 LocalPos = tf->TransformPoint(PartPosition);
00157 LocalMomDir = tf->TransformAxis(PartMomDir);
00158 #ifdef DEBUG
00159 G4cout << PartPosition << G4endl;
00160 G4cout << PartMomDir << G4endl;
00161 G4cout << LocalPos << G4endl;
00162 G4cout << LocalMomDir << G4endl;
00163 #endif
00164 PartPosition = LocalPos;
00165 PartMomDir = LocalMomDir;
00166 }
00167
00168 particleGun->SetParticlePosition(PartPosition);
00169 particleGun->SetParticleEnergy(E);
00170 particleGun->SetParticleMomentumDirection(PartMomDir);
00171 particleGun->SetParticleTime(t);
00172 }
00173
00174
00175 particleGun->GeneratePrimaryVertex(anEvent);
00176
00177
00178 #ifdef DEBUG
00179 G4cout << "BDSPrimaryGeneratorAction: setting weight = " << weight << G4endl;
00180 #endif
00181 anEvent->GetPrimaryVertex()->SetWeight(weight);
00182
00183 if(BDSGlobalConstants::Instance()->holdingQueue.size()!=0){
00184
00185
00186
00187
00188 BDSGlobalConstants::Instance()->holdingQueue.pop_front();
00189 BDSGlobalConstants::Instance()->outputQueue.pop_front();
00190 }
00191
00192 G4double totalE = E+particleGun->GetParticleDefinition()->GetPDGMass();
00193 #ifdef DEBUG
00194 G4cout
00195 << "BDSPrimaryGeneratorAction: " << G4endl
00196 << " position= " << particleGun->GetParticlePosition()/m<<" m"<<G4endl
00197 << " kinetic energy= " << E/GeV << " GeV" << G4endl
00198 << " total energy= " << totalE/GeV << " GeV" << G4endl
00199 << " momentum direction= " << PartMomDir << G4endl
00200 << " weight= " << anEvent->GetPrimaryVertex()->GetWeight() << G4endl;
00201 #endif
00202
00203
00204 initial_x=x0;
00205 initial_xp=xp;
00206 initial_y=y0;
00207 initial_yp=yp;
00208 initial_t=t;
00209 initial_z=z0;
00210 initial_zp=zp;
00211
00212 initial_E=totalE;
00213
00214 initial_weight=weight;
00215 }
00216
00217
00218
00219