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