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 }