00001 #include "BDSBunchCircle.hh" 00002 #include "BDSDebug.hh" 00003 00004 BDSBunchCircle::BDSBunchCircle() : 00005 BDSBunchInterface(), envelopeR(0.0), envelopeRp(0.0), envelopeT(0.0), envelopeE(0.0) 00006 { 00007 #ifdef BDSDEBUG 00008 G4cout << __METHOD_NAME__ << G4endl; 00009 #endif 00010 00011 FlatGen = new CLHEP::RandFlat(*CLHEP::HepRandom::getTheEngine()); 00012 } 00013 00014 BDSBunchCircle::BDSBunchCircle(G4double envelopeRIn, G4double envelopeRpIn, 00015 G4double envelopeTIn, G4double envelopeEIn, 00016 G4double X0In, G4double Y0In, G4double Z0In, G4double T0In, 00017 G4double Xp0In, G4double Yp0In, G4double Zp0In) : 00018 BDSBunchInterface(X0In,Y0In,Z0In,T0In,Xp0In,Yp0In,Zp0In,0.0,0.0), 00019 envelopeR(envelopeRIn), envelopeRp(envelopeRpIn), envelopeT(envelopeTIn), envelopeE(envelopeEIn) 00020 { 00021 #ifdef BDSDEBUG 00022 G4cout << __METHOD_NAME__ << G4endl; 00023 #endif 00024 FlatGen = new CLHEP::RandFlat(*CLHEP::HepRandom::getTheEngine()); 00025 } 00026 00027 BDSBunchCircle::~BDSBunchCircle() 00028 { 00029 #ifdef BDSDEBUG 00030 G4cout << __METHOD_NAME__ << G4endl; 00031 #endif 00032 delete FlatGen; 00033 } 00034 00035 void BDSBunchCircle::SetOptions(struct Options &opt) { 00036 #ifdef BDSDEBUG 00037 G4cout << __METHOD_NAME__ << G4endl; 00038 #endif 00039 SetEnvelopeR(opt.envelopeX); 00040 SetEnvelopeRp(opt.envelopeXp); 00041 SetEnvelopeT(opt.envelopeT); 00042 SetEnvelopeE(opt.envelopeE); 00043 return; 00044 } 00045 00046 void BDSBunchCircle::GetNextParticle(G4double& x0, G4double& y0, G4double& z0, 00047 G4double& xp, G4double& yp, G4double& zp, 00048 G4double& t , G4double& E, G4double& weight) { 00049 #ifdef BDSDEBUG 00050 G4cout << __METHOD_NAME__ << G4endl; 00051 #endif 00052 x0 = X0 * CLHEP::m; 00053 y0 = Y0 * CLHEP::m; 00054 z0 = Z0 * CLHEP::m; 00055 xp = Xp0 * CLHEP::rad; 00056 yp = Yp0 * CLHEP::rad; 00057 z0 = Z0 * CLHEP::m + (T0 - envelopeT * (1.-2.*FlatGen->shoot())) * CLHEP::c_light * CLHEP::s; 00058 00059 G4double phiR = FlatGen->shoot()*2*CLHEP::pi; 00060 G4double phiRp = FlatGen->shoot()*2*CLHEP::pi; 00061 G4double r = FlatGen->shoot()*envelopeR; 00062 G4double rp = FlatGen->shoot()*envelopeRp; 00063 00064 x0 += cos(phiR) * r * CLHEP::m; 00065 y0 += sin(phiR) * r * CLHEP::m; 00066 xp += cos(phiRp) * rp * CLHEP::rad; 00067 yp += sin(phiRp) * rp * CLHEP::rad; 00068 00069 zp = CalculateZp(xp,yp,Zp0); 00070 t = 0.0; 00071 E = BDSGlobalConstants::Instance()->GetParticleKineticEnergy() * (1 + envelopeE * (1-2*FlatGen->shoot())); 00072 00073 weight = 1.0; 00074 return; 00075 }