00001 #include "BDSBunchRing.hh" 00002 #include "BDSDebug.hh" 00003 00004 BDSBunchRing::BDSBunchRing() : 00005 BDSBunchInterface(), rMin(0), rMax(0) { 00006 #ifdef BDSDEBUG 00007 G4cout << __METHOD_NAME__ << G4endl; 00008 #endif 00009 FlatGen = new CLHEP::RandFlat(*CLHEP::HepRandom::getTheEngine()); 00010 } 00011 00012 BDSBunchRing::BDSBunchRing(G4double rMinIn, G4double rMaxIn, 00013 G4double X0In, G4double Y0In, G4double Z0In, G4double T0In, 00014 G4double Xp0In, G4double Yp0In, G4double Zp0In, 00015 G4double sigmaTIn, G4double sigmaEIn) : 00016 BDSBunchInterface(X0In,Y0In,Z0In,T0In,Xp0In,Yp0In,Zp0In,sigmaTIn,sigmaEIn), rMin(rMinIn), rMax(rMaxIn) { 00017 #ifdef BDSDEBUG 00018 G4cout << __METHOD_NAME__ << G4endl; 00019 #endif 00020 FlatGen = new CLHEP::RandFlat(*CLHEP::HepRandom::getTheEngine()); 00021 } 00022 00023 BDSBunchRing::~BDSBunchRing() { 00024 #ifdef BDSDEBUG 00025 G4cout << __METHOD_NAME__ << G4endl; 00026 #endif 00027 delete FlatGen; 00028 } 00029 00030 void BDSBunchRing::SetOptions(struct Options& opt) { 00031 #ifdef BDSDEBUG 00032 G4cout << __METHOD_NAME__ << G4endl; 00033 #endif 00034 00035 BDSBunchInterface::SetOptions(opt); 00036 SetRMin(opt.Rmin); 00037 SetRMax(opt.Rmax); 00038 } 00039 00040 void BDSBunchRing::GetNextParticle(G4double& x0, G4double& y0, G4double& z0, 00041 G4double& xp, G4double& yp, G4double& zp, 00042 G4double& t , G4double& E, G4double& weight) { 00043 #ifdef BDSDEBUG 00044 G4cout << __METHOD_NAME__ << G4endl; 00045 #endif 00046 double r = ( rMin + (rMax - rMin) * rand() / RAND_MAX ); 00047 double phi = 2 * CLHEP::pi * rand() / RAND_MAX; 00048 00049 x0 = ( X0 + r * sin(phi) ) * CLHEP::m; 00050 y0 = ( Y0 + r * cos(phi) ) * CLHEP::m; 00051 z0 = Z0 * CLHEP::m; 00052 xp = Xp0 * CLHEP::rad; 00053 yp = Yp0 * CLHEP::rad; 00054 zp = CalculateZp(xp,yp,Zp0); 00055 t = T0 * CLHEP::s; 00056 E = BDSGlobalConstants::Instance()->GetParticleKineticEnergy()* (1 + sigmaE/2. * (1. -2. * FlatGen->shoot())); 00057 weight = 1.0; 00058 } 00059