00001 #include "BDSBunchEShell.hh" 00002 #include "BDSDebug.hh" 00003 00004 BDSBunchEShell::BDSBunchEShell() : 00005 BDSBunchInterface(), shellX(0.0), shellXp(0.0), shellY(0.0), shellYp(0.0), 00006 shellXWidth(0.0), shellXpWidth(0.0), shellYWidth(0.0), shellYpWidth(0.0) 00007 { 00008 #ifdef BDSDEBUG 00009 G4cout << __METHOD_NAME__ << G4endl; 00010 #endif 00011 FlatGen = new CLHEP::RandFlat(*CLHEP::HepRandom::getTheEngine()); 00012 } 00013 00014 BDSBunchEShell::BDSBunchEShell(G4double shellXIn, G4double shellXpIn, 00015 G4double shellYIn, G4double shellYpIn, 00016 G4double shellXWidthIn, G4double shellXpWidthIn, 00017 G4double shellYWidthIn, G4double shellYpWidthIn, 00018 G4double X0In, G4double Y0In, G4double Z0In, G4double T0In, 00019 G4double Xp0In, G4double Yp0In, G4double Zp0In, 00020 G4double sigmaTIn, G4double sigmaEIn) : 00021 BDSBunchInterface(X0In,Y0In,Z0In,T0In,Xp0In,Yp0In,Zp0In,sigmaTIn,sigmaEIn), 00022 shellX(shellXIn), shellXp(shellXpIn), shellY(shellYIn), shellYp(shellYpIn), 00023 shellXWidth(shellXWidthIn), shellXpWidth(shellXpWidthIn), 00024 shellYWidth(shellYWidthIn), shellYpWidth(shellYpWidthIn) 00025 { 00026 #ifdef BDSDEBUG 00027 G4cout << __METHOD_NAME__ << G4endl; 00028 #endif 00029 FlatGen = new CLHEP::RandFlat(*CLHEP::HepRandom::getTheEngine()); 00030 } 00031 00032 BDSBunchEShell::~BDSBunchEShell() 00033 { 00034 #ifdef BDSDEBUG 00035 G4cout << __METHOD_NAME__ << G4endl; 00036 #endif 00037 delete FlatGen; 00038 } 00039 00040 void BDSBunchEShell::SetOptions(struct Options& opt) { 00041 #ifdef BDSDEBUG 00042 G4cout << __METHOD_NAME__ << G4endl; 00043 #endif 00044 BDSBunchInterface::SetOptions(opt); 00045 SetShellX (opt.shellX); 00046 SetShellY (opt.shellY); 00047 SetShellXp(opt.shellXp); 00048 SetShellYp(opt.shellYp); 00049 SetShellXWidth (opt.shellXWidth ); 00050 SetShellXpWidth(opt.shellXpWidth); 00051 SetShellYWidth (opt.shellYWidth ); 00052 SetShellYpWidth(opt.shellYpWidth); 00053 } 00054 00055 void BDSBunchEShell::GetNextParticle(G4double& x0, G4double& y0, G4double& z0, 00056 G4double& xp, G4double& yp, G4double& zp, 00057 G4double& t , G4double& E, G4double& weight) { 00058 #ifdef BDSDEBUG 00059 G4cout << __METHOD_NAME__ << G4endl; 00060 #endif 00061 G4double phi = 2 * CLHEP::pi * FlatGen->shoot(); 00062 G4double xamp = 0.5 - FlatGen->shoot(); 00063 G4double yamp = 0.5 - FlatGen->shoot(); 00064 G4double xpamp = 0.5 - FlatGen->shoot(); 00065 G4double ypamp = 0.5 - FlatGen->shoot(); 00066 00067 x0 = (X0 + (sin(phi) * shellX) + xamp * shellXWidth) * CLHEP::m; 00068 xp = (Xp0 + (cos(phi) * shellXp) + xpamp * shellXpWidth); 00069 00070 phi = 2 * CLHEP::pi * FlatGen->shoot(); 00071 00072 y0 = (Y0 + (sin(phi) * shellY) + yamp * shellYWidth) * CLHEP::m; 00073 yp = (Yp0 + (cos(phi) * shellYp) + ypamp * shellYpWidth); 00074 00075 z0 = Z0 * CLHEP::m; 00076 zp = CalculateZp(xp,yp,Zp0); 00077 00078 t = T0 * CLHEP::s; 00079 E = BDSGlobalConstants::Instance()->GetParticleKineticEnergy()* (1 + sigmaE/2. * (1. -2. * FlatGen->shoot())); 00080 weight = 1.0; 00081 00082 return; 00083 } 00084