src/BDSPrimaryGeneratorAction.cc

00001 /* BDSIM code.    Version 1.0
00002    Author: Grahame A. Blair, Royal Holloway, Univ. of London.
00003    Last modified 28.12.2004
00004    Copyright (c) 2004 by G.A.Blair.  ALL RIGHTS RESERVED. 
00005 
00006    Modified 22.03.05 by J.C.Carter, Royal Holloway, Univ. of London.
00007    Added GABs SynchGen code
00008 */
00009 
00010 //==================================================================
00011 //==================================================================
00012 #include "BDSGlobalConstants.hh" // must be first in include list
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 // Keep initial point in phase space for diagnostics
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); // 1-particle gun
00049 
00050   // initialize with default values... 
00051   // they will be overridden in GeneratePrimaries function
00052 
00053   //  particleGun->SetParticleDefinition(BDSGlobalConstants::Instance()->
00054   //                                      GetParticleDefinition());
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()) // synchrotron radiation generator
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   //this function is called at the begining of event
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); // get next starting point
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     //flag for secondaries from previous runs
00124     //    if(outputParticle.parentID != 0)
00125       //      anEvent->SetEventID(-(anEvent->GetEventID()));
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   //Set the weight
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 //    anEvent->    GetTrack()->SetTrackID(outputParticle.trackID);
00186 //    anEvent->    GetTrack()->SetParentID(outputParticle.parentID);
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   // save initial values outside scope for entry into the samplers:
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   // total energy is used elsewhere:
00212   initial_E=totalE;
00213   // weight
00214   initial_weight=weight;
00215 }
00216 
00217 
00218 //===================================================
00219 

Generated on 27 Aug 2013 for BDSIM by  doxygen 1.4.7