CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/SimG4CMS/Calo/src/EvolutionECAL.cc

Go to the documentation of this file.
00001 #include "SimG4CMS/Calo/interface/EvolutionECAL.h"
00002 
00003 
00004 // destructor 
00005 
00006 EvolutionECAL::~EvolutionECAL()
00007 {
00008 }
00009 
00010 // constructor 
00011 EvolutionECAL::EvolutionECAL()
00012 {
00013 }
00014 
00015 //_____________________________________________________
00016 double EvolutionECAL::LightCollectionEfficiency(double z, double mu)
00017 {
00018   double f = 0;
00019   if(z<=0) return f;
00020   if(z>=0.22) return f;
00021   
00022   double e0 =  6.91563e-02;
00023   double e1 =  1.64406e+00;
00024   double e2 =  6.42509e-01;
00025   double E =  e0/(1+exp(e1*(log10(mu)-e2)));
00026 
00027   double d0 =  3.85334e-01;
00028   double d1 = -1.04647e-02;
00029   double D = d0*exp(d1*mu);
00030 
00031   double c0 =  3.77629e-01;
00032   double c1 = -3.23755e-01;
00033   double c2 =  1.50247e+00;
00034   double c3 =  3.03278e-01;
00035   double C =  -1 + c0*exp(c1*mu)*(1+c2*exp(c3*mu));
00036 
00037   double b0 = -3.33575e-01;
00038   double b1 =  4.44856e-01;
00039   double b2 =  1.91766e+00;
00040   double b3 =  2.69423e+00;
00041   double b4 =  1.06905e+00;
00042   double B =  (1/mu)*(b0 + b1*log10(mu) + b2*pow(log10(mu),2) 
00043                       + b3*pow(log10(mu),3) + b4*pow(log10(mu),4));
00044 
00045   double a0 = 7.18248e-02; 
00046   double a1 = 1.89016e+00;
00047   double a2 = 2.15651e-02;
00048   double a3 = 2.30786e-02;
00049   double A =  exp(B*mu*0.015)*(a0/(exp(a1*(log10(mu)+a2))+1)+a3);
00050 
00051   double R = 0.01*D*( 4/(0.222+E)/(0.222+E) - 1/((0.22-z)*(z+E)) );
00052   f =  A * exp(-B*mu*(0.22-z)) * (1+C*exp(R));
00053   
00054   return f;
00055 }
00056 
00057 
00058 //_____________________________________________________
00059 //
00060 // This function is for CMSSW FullSim "slope_LY"
00061 // It returns weight<=1 for light collection from relative distance "z"
00062 //   0 < z < 1
00063 //   z = 0 at the face of a crystal
00064 //   z = 1 at the photo-detector
00065 //   weight = 1 for undamaged crystal at any z
00066 //
00067 
00068 /* double EvolutionECAL::LightCollectionEfficiencyWeightedOld(double z, double mu_ind)
00069 
00070 {
00071   if(z<=0) return 0;
00072   if(z>=1) return 0;
00073   if(mu_ind<0) return 1;
00074 
00075   double mu = mu_ind + 0.1; 
00076   double lmu = log10(mu);
00077   
00078   double e0 =  6.91563e-02;
00079   double e1 =  1.64406e+00;
00080   double e2 =  6.42509e-01;
00081   double E =  e0/(1+exp(e1*(lmu-e2)));
00082 
00083   double d0 =  3.85334e-01;
00084   double d1 = -1.04647e-02;
00085   double D = d0*exp(d1*mu);
00086 
00087   double c0 =  3.77629e-01;
00088   double c1 = -3.23755e-01;
00089   double c2 =  1.50247e+00;
00090   double c3 =  3.03278e-01;
00091   double C =  -1 + c0*exp(c1*mu)*(1+c2*exp(c3*mu));
00092 
00093   double b0 = -3.33575e-01;
00094   double b1 =  4.44856e-01;
00095   double b2 =  1.91766e+00;
00096   double b3 =  2.69423e+00;
00097   double b4 =  1.06905e+00;
00098   double B =  (1/mu)*(b0 + b1*lmu + b2*pow(lmu,2) 
00099                          + b3*pow(lmu,3) + b4*pow(lmu,4));
00100 
00101   double a0 = 7.18248e-02; 
00102   double a1 = 1.89016e+00;
00103   double a2 = 2.15651e-02;
00104   double a3 = 2.30786e-02;
00105   double A =  exp(B*mu*0.015)*(a0/(exp(a1*(lmu+a2))+1)+a3);
00106 
00107   double R = 0.01*D*( 4/(0.222+E)/(0.222+E) - 1/((0.22*0.22)*(1.-z)*(z+E/0.22)) );
00108 
00109   // for undamaged crystal, mu0 = 0.1
00110   double A0 =  0.0845209;
00111   double B0 = -4.85951;
00112   double C0 = -0.0681855;
00113   double D0 =  0.384931;
00114   double E0 =  0.0648029;
00115   double R0 = 0.01*D0*( 4/(0.222+E0)/(0.222+E0) - 1/((0.22*0.22)*(1.-z)*(z+E0/0.22)) );
00116   
00117   
00118   double f =  A/A0 * exp(-(B*mu-B0*0.1)*0.22*(1.-z)) * (1+C*exp(R))/(1+C0*exp(R0));
00119   
00120   return f;
00121 }
00122 
00123 */
00124 
00125 
00126 double EvolutionECAL::LightCollectionEfficiencyWeighted(double z, double mu_ind)
00127 {
00128   if(z<=0) return 0;
00129   if(z>=1) return 0;
00130   if(mu_ind<0) return 1;
00131 
00132   double mu = mu_ind + 0.7; 
00133   double lmu = log10(mu);
00134   
00135   double e0 =  6.91563e-02;
00136   double e1 =  1.64406e+00;
00137   double e2 =  6.42509e-01;
00138   double E =  e0/(1+exp(e1*(lmu-e2)));
00139 
00140   double d0 =  3.85334e-01;
00141   double d1 = -1.04647e-02;
00142   double D = d0*exp(d1*mu);
00143 
00144   double c0 =  3.77629e-01;
00145   double c1 = -3.23755e-01;
00146   double c2 =  1.50247e+00;
00147   double c3 =  3.03278e-01;
00148   double C =  -1 + c0*exp(c1*mu)*(1+c2*exp(c3*mu));
00149 
00150   double b0 = -3.33575e-01;
00151   double b1 =  4.44856e-01;
00152   double b2 =  1.91766e+00;
00153   double b3 =  2.69423e+00;
00154   double b4 =  1.06905e+00;
00155   double B =  (1/mu)*(b0 + b1*lmu + b2*pow(lmu,2) 
00156                       + b3*pow(lmu,3) + b4*pow(lmu,4));
00157 
00158   double a0 = 7.18248e-02; 
00159   double a1 = 1.89016e+00;
00160   double a2 = 2.15651e-02;
00161   double a3 = 2.30786e-02;
00162   double A =  exp(B*mu*0.015)*(a0/(exp(a1*(lmu+a2))+1)+a3);
00163 
00164   double R = 0.01*D*( 4/(0.222+E)/(0.222+E) - 1/((0.22*0.22)*(1.-z)*(z+E/0.22)) );
00165 
00166   // for undamaged crystal, mu0 = 0.7
00167   double A0 =  0.0631452;
00168   double B0 = -0.52267;
00169   double C0 = -0.139646;
00170   double D0 =  0.382522;
00171   double E0 =  0.054473;
00172   double R0 = 0.01*D0*( 4/(0.222+E0)/(0.222+E0) - 1/((0.22*0.22)*(1.-z)*(z+E0/0.22)) );
00173   
00174   
00175   double f =  A/A0 * exp(-(B*mu-B0*0.7)*0.22*(1.-z)) * (1+C*exp(R))/(1+C0*exp(R0));
00176   
00177   return f;
00178 }
00179 
00180 
00181 
00182 //_________________________________________________________
00183 double EvolutionECAL::DamageProfileEta(double eta)
00184 {
00185   double x = fabs(eta);
00186   if(x<1.497){
00187     return exp( -4.11065 + 0.258478*x );
00188   }else{
00189     return exp( -13.5112 + 7.913860*x - 0.998649*x*x );
00190   }
00191 }
00192 
00193 
00194 //_________________________________________________________
00195 double EvolutionECAL::DamageProfileEtaAPD(double eta)
00196 {
00197   double x = fabs(eta);
00198   if(x<1.497){
00199     double et=x/1.48*34.0;
00200     double etaprof=( 9.54827 + et*0.0379222 + 
00201                      et*et*(-0.00257047) + 
00202                      et*et*et*0.00073546 + 
00203                      et*et*et*et*(-1.49683e-05)
00204                      )/9.54827;
00205     return etaprof;
00206   }else{
00207     return 1.0;
00208   }
00209 }
00210 
00211 
00212 //_________________________________________________________
00213 double EvolutionECAL::InducedAbsorptionHadronic(double lumi, double eta)
00214 {
00215   double fluence = DamageProfileEta(eta) * 2.7e+13/500.0 * lumi;
00216   double mu = 2.08E-13 * pow( fluence, 1.0049);
00217   return mu;
00218 }
00219 
00220 
00221 //_________________________________________________________
00222 double EvolutionECAL::DoseLongitudinalProfile(double z)
00223 {
00224   double alpha = 4.72877e+00;
00225   double beta  = 5.91296e-01;
00226   double amp1  = 6.24495e+02;
00227   double amp2  = 1.84367e-01;
00228   double offset   = 2.00705e+01;
00229   if (z>=0.0 && z<=22.0) {
00230     double term1 = (amp1 / TMath::Gamma(alpha)) * pow((beta*z),(alpha-1)) * exp (-beta*z);
00231     double term2 = amp2*(z-11.0)*(z-11.0) + offset;
00232     return (term1 + term2)/150.44;
00233   } else {       
00234    return 0;
00235   }
00236 }
00237 
00238 
00239 
00240 //_________________________________________________________
00241 Double_t EvolutionECAL::EquilibriumFractionColorCentersEM(double *x, double *par)
00242 {
00243   double instantLumi = par[0];
00244   double eta = par[1];
00245   double rate =  DoseLongitudinalProfile(x[0])*5.0*DamageProfileEta(eta)*instantLumi/1e+34;
00246   if(rate<=0.0) rate=0.0;
00247   double alpha = par[2];
00248   return rate/(alpha + rate);
00249 }
00250 
00251 
00252  
00253 
00254 //____________________________________________________________
00255 double EvolutionECAL::InducedAbsorptionEM(double lumi, double eta)
00256 {
00257   double mu_max  = 2.0;
00258   double alpha1  = 3.41488e+00;
00259   
00260   TF1 *ftmp1 = new TF1("ftmp1",this,&EvolutionECAL::EquilibriumFractionColorCentersEM,
00261                        0.0,22.0,3,"EvolutionECAL" , "EquilibriumFractionColorCentersEM");
00262   ftmp1->SetParameters(lumi, eta, alpha1);
00263   double muEM = mu_max*ftmp1->Integral(0.0, 22.0)/22.0;
00264   
00265   delete ftmp1; 
00266   return muEM;
00267 }
00268 
00269 
00270 //_____________________________________________________________
00271 double EvolutionECAL::DegradationMeanEM50GeV(double mu)
00272 {
00273   double retval = 1.0;
00274   double x = mu;
00275   if( x<1e-4   ) return retval;
00276   if( x>=200.0 ) x=200.0;  // parameterization is not valid for large mu
00277 
00278   double par[11] = {  1.00000e+01,
00279                      -4.41441e-01, 7.08607e-02, -3.75572e-01, -3.60410e-01, 1.30130e-01,
00280                      -4.72350e-01, 3.36315e-01, -1.19872e-01,  1.99574e-02,-1.22910e-03  };
00281 
00282 
00283   double alpha = par[0];
00284 
00285   double f1 = par[1]*x + par[2]*x*x;  
00286   double u = log(x);
00287   double f2 = par[10];
00288   for(int i=9; i>=3; i--) f2 = par[i] + f2*u;
00289 
00290   retval = f1/(1.0+exp(alpha*u)) + f2/(1.0+exp(-alpha*u));
00291   retval = exp(retval);
00292   return retval;
00293   
00294 
00295 }
00296 
00297 
00298 
00299 
00300 //_____________________________________________________________
00301 double EvolutionECAL::DegradationNonLinearityEM50GeV(double mu, double ene)
00302 {
00303   if(ene<=1e-3) return 0.0;
00304 
00305   double x = mu;
00306   if( mu<=0.06  ) x=0.06;
00307   if( mu>=150.0 ) x=150.0;
00308 
00309   double par[9] = { 5.17712e-03, 1.97597e-02, 3.36596e-02, 2.84505e-02, 1.38480e-02,
00310                     1.11498e-02, 7.73634e-03, -1.30767e-03, -2.20628e-03 };
00311 
00312   double u = log10(x);
00313   double slope = par[8];
00314   for(int i=7; i>=0; i--) slope = par[i] + slope*u;
00315 
00316   double retval = 1.0 + slope*log10(ene/50.0);
00317   if(retval<=0.0) retval = 0.0;
00318   return retval;
00319 
00320 }
00321 
00322 
00323 //_____________________________________________________________
00324 double EvolutionECAL::ResolutionConstantTermEM50GeV(double mu)
00325 {
00326 
00327   double x = mu;
00328   if( mu<=0.01  ) x=0.01;
00329   if( mu>=200.0 ) x=200.0;
00330 
00331   double par[10] = { -6.21503e+00,  1.59759e+00, -4.75221e-02, -3.90299e-02,  3.97269e-03,
00332                       2.29574e-03, -1.05280e-04, -9.60963e-05, -1.29594e-06,  1.70850e-06  };
00333 
00334   double u = log(x);
00335   double f = par[9];
00336   for(int i=8; i>=0; i--) f = par[i] + f*u;
00337   return exp(f);
00338 
00339 }
00340 
00341 
00342 //__________________________________________________________
00343 double EvolutionECAL::ChargeVPTCathode(double instLumi, double eta, double integralLumi)
00344 {
00345   double charge = 0.0;
00346   double tmpLumi = 0.0;
00347   double stepLumi = 1.0;
00348   double muEM = InducedAbsorptionEM(instLumi, eta);
00349   while(tmpLumi<integralLumi)
00350     {
00351       tmpLumi += stepLumi;  
00352       double muHD = InducedAbsorptionHadronic(tmpLumi, eta);
00353       double SS0 = DegradationMeanEM50GeV(muEM+muHD);
00354       charge += SS0*0.26e-3*DamageProfileEta(eta)*stepLumi;
00355     }
00356   return charge;
00357 }
00358 
00359 
00360 
00361 
00362 
00363 //_________________________________________________________
00364 double EvolutionECAL::AgingVPT(double instLumi, double integralLumi, double eta) 
00365 {
00366   if(fabs(eta)<1.497) return 1.0;
00367   double Q = ChargeVPTCathode(instLumi, eta, integralLumi);
00368   double result = 0.772+0.228*(3.94304e-01*exp(-Q/5.99232e-04)+(1-3.94304e-01)*exp(-Q/1.58243e-02));
00369   return result;
00370 }
00371 
00372 
00373 
00374 //_________________________________________________________
00375 double EvolutionECAL::NoiseFactorFE(double lumi, double eta)
00376 {
00377   double  x = fabs(eta);
00378   if(x<1.497){
00379     return sqrt( 1.0 + 0.495*0.03512*lumi*DamageProfileEtaAPD(eta));
00380   }else{
00381     return 1.0;
00382   } 
00383 } 
00384