/scratch0/jsnuveri/BDSIM/BDSIMgit/bdsim/src/BDSBunchGaussian.cc

00001 #include "BDSBunchGaussian.hh"
00002 #include <cstring>
00003 #include "BDSDebug.hh"
00004 
00005 BDSBunchGaussian::BDSBunchGaussian() : 
00006   BDSBunchInterface(),
00007   sigmaX(0.0),sigmaY(0.0),sigmaXp(0.0),sigmaYp(0.0)
00008 {
00009 #ifdef BDSDEBUG 
00010   G4cout << __METHOD_NAME__ << G4endl;
00011 #endif
00012 
00013   meansGM = CLHEP::HepVector(6);
00014   sigmaGM = CLHEP::HepSymMatrix(6);
00015   GaussMultiGen = NULL;
00016 }
00017 
00018 BDSBunchGaussian::BDSBunchGaussian(G4double sigmaXIn, G4double sigmaYIn, G4double sigmaXpIn, G4double sigmaYpIn, 
00019                                    G4double X0In,     G4double Y0In,     G4double Z0In,      G4double T0In,
00020                                    G4double Xp0In,    G4double Yp0In,    G4double Zp0In, 
00021                                    G4double sigmaTIn, G4double sigmaEIn) :
00022   BDSBunchInterface(X0In,Y0In, Z0In, T0In, Xp0In, Yp0In, Zp0In, sigmaTIn, sigmaEIn), 
00023   sigmaX(sigmaXIn), sigmaY(sigmaYIn), sigmaXp(sigmaXpIn), sigmaYp(sigmaYpIn)
00024 {
00025 #ifdef BDSDEBUG 
00026   G4cout << __METHOD_NAME__ << G4endl;
00027 #endif
00028 
00029   meansGM = CLHEP::HepVector(6);
00030   sigmaGM = CLHEP::HepSymMatrix(6);
00031 
00032   // Fill means 
00033   meansGM[0] = X0;
00034   meansGM[1] = Xp0;
00035   meansGM[2] = Y0;
00036   meansGM[3] = Yp0;
00037   meansGM[4] = T0;
00038   meansGM[5] = 1;
00039 
00040   // Fill sigmas 
00041   sigmaGM[0][0] = pow(sigmaX,2); 
00042   sigmaGM[1][1] = pow(sigmaXp,2); 
00043   sigmaGM[2][2] = pow(sigmaY,2); 
00044   sigmaGM[3][3] = pow(sigmaYp,2);
00045   sigmaGM[4][4] = pow(sigmaT,2); 
00046   sigmaGM[5][5] = pow(sigmaE,2);
00047 
00048   // Create multi dim gaussian generator
00049   GaussMultiGen = CreateMultiGauss(*CLHEP::HepRandom::getTheEngine(),meansGM,sigmaGM);
00050   G4cout << CLHEP::HepRandom::getTheEngine() << G4endl;
00051 }
00052 
00053 BDSBunchGaussian::BDSBunchGaussian(G4double *sigma, 
00054                                    G4double X0In,     G4double Y0In,  G4double Z0In,  G4double T0In,
00055                                    G4double Xp0In,    G4double Yp0In, G4double Zp0In, 
00056                                    G4double sigmaTIn, G4double sigmaEIn) :
00057   BDSBunchInterface(X0In,Y0In, Z0In, T0In, Xp0In, Yp0In, Zp0In, sigmaTIn, sigmaEIn),
00058   sigmaX(0.0),sigmaY(0.0),sigmaXp(0.0),sigmaYp(0.0)
00059 {
00060 #ifdef BDSDEBUG 
00061   G4cout << __METHOD_NAME__ << G4endl;
00062 #endif
00063 
00064   meansGM = CLHEP::HepVector(6);
00065   sigmaGM = CLHEP::HepSymMatrix(6);
00066 
00067   // Fill means 
00068   meansGM[0] = X0;
00069   meansGM[1] = Xp0;
00070   meansGM[2] = Y0;
00071   meansGM[3] = Yp0;
00072   meansGM[4] = T0;
00073   meansGM[5] = 1;
00074 
00075   // Fill sigmas 
00076   sigmaGM[0][0] = sigma[0]; 
00077   sigmaGM[0][1] = sigma[1];
00078   sigmaGM[0][2] = sigma[2];
00079   sigmaGM[0][3] = sigma[3];
00080   sigmaGM[0][4] = sigma[4];
00081   sigmaGM[0][5] = sigma[5];  
00082   sigmaGM[1][1] = sigma[6];
00083   sigmaGM[1][2] = sigma[7];
00084   sigmaGM[1][3] = sigma[8];
00085   sigmaGM[1][4] = sigma[9];
00086   sigmaGM[1][5] = sigma[10];  
00087   sigmaGM[2][2] = sigma[11];
00088   sigmaGM[2][3] = sigma[12];
00089   sigmaGM[2][4] = sigma[13];
00090   sigmaGM[2][5] = sigma[14];  
00091   sigmaGM[3][3] = sigma[15];
00092   sigmaGM[3][4] = sigma[16];
00093   sigmaGM[3][5] = sigma[17];  
00094   sigmaGM[4][4] = sigma[18];
00095   sigmaGM[4][5] = sigma[19];  
00096   sigmaGM[5][5] = sigma[20];
00097 
00098   // Create multi dim gaussian
00099   GaussMultiGen = CreateMultiGauss(*CLHEP::HepRandom::getTheEngine(),meansGM,sigmaGM);
00100   G4cout << CLHEP::HepRandom::getTheEngine() << G4endl;
00101 }
00102 
00103 BDSBunchGaussian::~BDSBunchGaussian() {
00104 #ifdef BDSDEBUG 
00105   G4cout << __METHOD_NAME__ << G4endl;
00106 #endif
00107 
00108   delete GaussMultiGen;
00109 }
00110 
00111 void BDSBunchGaussian::SetOptions(struct Options& opt) {
00112 #ifdef BDSDEBUG 
00113   G4cout << __METHOD_NAME__ << G4endl;
00114 #endif
00115 
00116   BDSBunchInterface::SetOptions(opt);
00117   
00118   SetSigmaX(opt.sigmaX); 
00119   SetSigmaY(opt.sigmaY);
00120   SetSigmaXp(opt.sigmaXp);
00121   SetSigmaYp(opt.sigmaYp);
00122   
00123   meansGM[0]    = X0;
00124   meansGM[1]    = Xp0;
00125   meansGM[2]    = Y0;
00126   meansGM[3]    = Yp0;
00127   meansGM[4]    = T0;
00128   meansGM[5]    = 1;
00129       
00130   if(strcmp(opt.distribType.data(),"gaussmatrix") == 0) {
00131     sigmaGM[0][0] = opt.sigma11; 
00132     sigmaGM[0][1] = opt.sigma12;
00133     sigmaGM[0][2] = opt.sigma13;
00134     sigmaGM[0][3] = opt.sigma14;
00135     sigmaGM[0][4] = opt.sigma15;
00136     sigmaGM[0][5] = opt.sigma16;  
00137     sigmaGM[1][1] = opt.sigma22;
00138     sigmaGM[1][2] = opt.sigma23;
00139     sigmaGM[1][3] = opt.sigma24;
00140     sigmaGM[1][4] = opt.sigma25;
00141     sigmaGM[1][5] = opt.sigma26;  
00142     sigmaGM[2][2] = opt.sigma33;
00143     sigmaGM[2][3] = opt.sigma34;
00144     sigmaGM[2][4] = opt.sigma35;
00145     sigmaGM[2][5] = opt.sigma36;  
00146     sigmaGM[3][3] = opt.sigma44;
00147     sigmaGM[3][4] = opt.sigma45;
00148     sigmaGM[3][5] = opt.sigma46;  
00149     sigmaGM[4][4] = opt.sigma55;
00150     sigmaGM[4][5] = opt.sigma56;  
00151     sigmaGM[5][5] = opt.sigma66;
00152   }
00153   else if (strcmp(opt.distribType.data(),"gauss") == 0) 
00154   {    
00155     sigmaGM[0][0] = pow(opt.sigmaX,2); 
00156     sigmaGM[1][1] = pow(opt.sigmaXp,2); 
00157     sigmaGM[2][2] = pow(opt.sigmaY,2); 
00158     sigmaGM[3][3] = pow(opt.sigmaYp,2);       
00159     sigmaGM[4][4] = pow(opt.sigmaT,2); 
00160     sigmaGM[5][5] = pow(opt.sigmaE,2);
00161   }
00162 
00163   delete GaussMultiGen;
00164   GaussMultiGen = CreateMultiGauss(*CLHEP::HepRandom::getTheEngine(),meansGM,sigmaGM);
00165   return;
00166 }
00167 
00168 void BDSBunchGaussian::GetNextParticle(G4double& x0, G4double& y0, G4double& z0, 
00169                                        G4double& xp, G4double& yp, G4double& zp,
00170                                        G4double& t , G4double&  E, G4double& weight) {
00171 #ifdef BDSDEBUG 
00172   G4cout << __METHOD_NAME__ << G4endl;
00173 #endif
00174 
00175   CLHEP::HepVector v = GaussMultiGen->fire();
00176   x0 = v[0] * CLHEP::m;
00177   xp = v[1] * CLHEP::rad;
00178   y0 = v[2] * CLHEP::m;
00179   yp = v[3] * CLHEP::rad;
00180   t  = v[4] * CLHEP::s;
00181   zp = 0.0  * CLHEP::rad;
00182   z0 = Z0*CLHEP::m + t*CLHEP::c_light;
00183   E  = BDSGlobalConstants::Instance()->GetParticleKineticEnergy() * v[5];
00184   
00185   zp = CalculateZp(xp,yp,Zp0);
00186 
00187   weight = 1.0;
00188   return;
00189 }

Generated on 28 Jun 2015 for BDSIM by  doxygen 1.4.7