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
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
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
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
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
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
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 }