CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2_patch1/src/CondTools/Ecal/src/EvolutionECAL.cc

Go to the documentation of this file.
00001 #include "CondTools/Ecal/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 double EvolutionECAL::LightCollectionEfficiencyWeighted(double z, double mu_ind)
00068 {
00069   if(z<=0) return 0;
00070   if(z>=1) return 0;
00071   if(mu_ind<0) return 1;
00072 
00073   double mu = mu_ind + 0.1; 
00074   double lmu = log10(mu);
00075   
00076   double e0 =  6.91563e-02;
00077   double e1 =  1.64406e+00;
00078   double e2 =  6.42509e-01;
00079   double E =  e0/(1+exp(e1*(lmu-e2)));
00080 
00081   double d0 =  3.85334e-01;
00082   double d1 = -1.04647e-02;
00083   double D = d0*exp(d1*mu);
00084 
00085   double c0 =  3.77629e-01;
00086   double c1 = -3.23755e-01;
00087   double c2 =  1.50247e+00;
00088   double c3 =  3.03278e-01;
00089   double C =  -1 + c0*exp(c1*mu)*(1+c2*exp(c3*mu));
00090 
00091   double b0 = -3.33575e-01;
00092   double b1 =  4.44856e-01;
00093   double b2 =  1.91766e+00;
00094   double b3 =  2.69423e+00;
00095   double b4 =  1.06905e+00;
00096   double B =  (1/mu)*(b0 + b1*lmu + b2*pow(lmu,2) 
00097                          + b3*pow(lmu,3) + b4*pow(lmu,4));
00098 
00099   double a0 = 7.18248e-02; 
00100   double a1 = 1.89016e+00;
00101   double a2 = 2.15651e-02;
00102   double a3 = 2.30786e-02;
00103   double A =  exp(B*mu*0.015)*(a0/(exp(a1*(lmu+a2))+1)+a3);
00104 
00105   double R = 0.01*D*( 4/(0.222+E)/(0.222+E) - 1/((0.22*0.22)*(1.-z)*(z+E/0.22)) );
00106 
00107   // for undamaged crystal, mu0 = 0.1
00108   double A0 =  0.0845209;
00109   double B0 = -4.85951;
00110   double C0 = -0.0681855;
00111   double D0 =  0.384931;
00112   double E0 =  0.0648029;
00113   double R0 = 0.01*D0*( 4/(0.222+E0)/(0.222+E0) - 1/((0.22*0.22)*(1.-z)*(z+E0/0.22)) );
00114   
00115   
00116   double f =  A/A0 * exp(-(B*mu-B0*0.1)*0.22*(1.-z)) * (1+C*exp(R))/(1+C0*exp(R0));
00117   
00118   return f;
00119 }
00120 
00121 
00122 
00123 //_________________________________________________________
00124 double EvolutionECAL::DamageProfileEta(double eta)
00125 {
00126   double x = fabs(eta);
00127   if(x<1.497){
00128     return exp( -4.11065 + 0.258478*x );
00129   }else{
00130     return exp( -13.5112 + 7.913860*x - 0.998649*x*x );
00131   }
00132 }
00133 
00134 
00135 //_________________________________________________________
00136 double EvolutionECAL::DamageProfileEtaAPD(double eta)
00137 {
00138   double x = fabs(eta);
00139   if(x<1.497){
00140     double et=x/1.48*34.0;
00141     double etaprof=( 9.54827 + et*0.0379222 + 
00142                      et*et*(-0.00257047) + 
00143                      et*et*et*0.00073546 + 
00144                      et*et*et*et*(-1.49683e-05)
00145                      )/9.54827;
00146     return etaprof;
00147   }else{
00148     return 1.0;
00149   }
00150 }
00151 
00152 
00153 //_________________________________________________________
00154 double EvolutionECAL::InducedAbsorptionHadronic(double lumi, double eta)
00155 {
00156   double fluence = DamageProfileEta(eta) * 2.7e+13/500.0 * lumi;
00157   double mu = 2.08E-13 * pow( fluence, 1.0049);
00158   return mu;
00159 }
00160 
00161 
00162 //_________________________________________________________
00163 double EvolutionECAL::DoseLongitudinalProfile(double z)
00164 {
00165   double alpha = 4.72877e+00;
00166   double beta  = 5.91296e-01;
00167   double amp1  = 6.24495e+02;
00168   double amp2  = 1.84367e-01;
00169   double offset   = 2.00705e+01;
00170   if (z>=0.0 && z<=22.0) {
00171     double term1 = (amp1 / TMath::Gamma(alpha)) * pow((beta*z),(alpha-1)) * exp (-beta*z);
00172     double term2 = amp2*(z-11.0)*(z-11.0) + offset;
00173     return (term1 + term2)/150.44;
00174   } else {       
00175    return 0;
00176   }
00177 }
00178 
00179 
00180 
00181 //_________________________________________________________
00182 Double_t EvolutionECAL::EquilibriumFractionColorCentersEM(double *x, double *par)
00183 {
00184   double instantLumi = par[0];
00185   double eta = par[1];
00186   double rate =  DoseLongitudinalProfile(x[0])*5.0*DamageProfileEta(eta)*instantLumi/1e+34;
00187   if(rate<=0.0) rate=0.0;
00188   double alpha = par[2];
00189   return rate/(alpha + rate);
00190 }
00191 
00192 
00193  
00194 
00195 //____________________________________________________________
00196 double EvolutionECAL::InducedAbsorptionEM(double lumi, double eta)
00197 {
00198   double mu_max  = 2.0;
00199   double alpha1  = 3.41488e+00;
00200   
00201   TF1 *ftmp1 = new TF1("ftmp1",this,&EvolutionECAL::EquilibriumFractionColorCentersEM,
00202                        0.0,22.0,3,"EvolutionECAL" , "EquilibriumFractionColorCentersEM");
00203   ftmp1->SetParameters(lumi, eta, alpha1);
00204   double muEM = mu_max*ftmp1->Integral(0.0, 22.0)/22.0;
00205   
00206   delete ftmp1; 
00207   return muEM;
00208 }
00209 
00210 
00211 //_____________________________________________________________
00212 double EvolutionECAL::DegradationMeanEM50GeV(double mu)
00213 {
00214   double retval = 1.0;
00215   double x = mu;
00216   if( x<1e-4   ) return retval;
00217   if( x>=200.0 ) x=200.0;  // parameterization is not valid for large mu
00218 
00219   double par[11] = {  1.00000e+01,
00220                      -4.41441e-01, 7.08607e-02, -3.75572e-01, -3.60410e-01, 1.30130e-01,
00221                      -4.72350e-01, 3.36315e-01, -1.19872e-01,  1.99574e-02,-1.22910e-03  };
00222 
00223 
00224   double alpha = par[0];
00225 
00226   double f1 = par[1]*x + par[2]*x*x;  
00227   double u = log(x);
00228   double f2 = par[10];
00229   for(int i=9; i>=3; i--) f2 = par[i] + f2*u;
00230 
00231   retval = f1/(1.0+exp(alpha*u)) + f2/(1.0+exp(-alpha*u));
00232   retval = exp(retval);
00233   return retval;
00234   
00235 
00236 }
00237 
00238 
00239 
00240 
00241 //_____________________________________________________________
00242 double EvolutionECAL::DegradationNonLinearityEM50GeV(double mu, double ene)
00243 {
00244   if(ene<=1e-3) return 0.0;
00245 
00246   double x = mu;
00247   if( mu<=0.06  ) x=0.06;
00248   if( mu>=150.0 ) x=150.0;
00249 
00250   double par[9] = { 5.17712e-03, 1.97597e-02, 3.36596e-02, 2.84505e-02, 1.38480e-02,
00251                     1.11498e-02, 7.73634e-03, -1.30767e-03, -2.20628e-03 };
00252 
00253   double u = log10(x);
00254   double slope = par[8];
00255   for(int i=7; i>=0; i--) slope = par[i] + slope*u;
00256 
00257   double retval = 1.0 + slope*log10(ene/50.0);
00258   if(retval<=0.0) retval = 0.0;
00259   return retval;
00260 
00261 }
00262 
00263 
00264 //_____________________________________________________________
00265 double EvolutionECAL::ResolutionConstantTermEM50GeV(double mu)
00266 {
00267 
00268   double x = mu;
00269   if( mu<=0.01  ) x=0.01;
00270   if( mu>=200.0 ) x=200.0;
00271 
00272   double par[10] = { -6.21503e+00,  1.59759e+00, -4.75221e-02, -3.90299e-02,  3.97269e-03,
00273                       2.29574e-03, -1.05280e-04, -9.60963e-05, -1.29594e-06,  1.70850e-06  };
00274 
00275   double u = log(x);
00276   double f = par[9];
00277   for(int i=8; i>=0; i--) f = par[i] + f*u;
00278   return exp(f);
00279 
00280 }
00281 
00282 
00283 //__________________________________________________________
00284 double EvolutionECAL::ChargeVPTCathode(double instLumi, double eta, double integralLumi)
00285 {
00286   double charge = 0.0;
00287   double tmpLumi = 0.0;
00288   double stepLumi = 1.0;
00289   double muEM = InducedAbsorptionEM(instLumi, eta);
00290   while(tmpLumi<integralLumi)
00291     {
00292       tmpLumi += stepLumi;  
00293       double muHD = InducedAbsorptionHadronic(tmpLumi, eta);
00294       double SS0 = DegradationMeanEM50GeV(muEM+muHD);
00295       charge += SS0*0.26e-3*DamageProfileEta(eta)*stepLumi;
00296     }
00297   return charge;
00298 }
00299 
00300 
00301 
00302 
00303 
00304 //_________________________________________________________
00305 double EvolutionECAL::AgingVPT(double instLumi, double integralLumi, double eta) 
00306 {
00307   if(fabs(eta)<1.497) return 1.0;
00308   double Q = ChargeVPTCathode(instLumi, eta, integralLumi);
00309   double result = 0.772+0.228*(3.94304e-01*exp(-Q/5.99232e-04)+(1-3.94304e-01)*exp(-Q/1.58243e-02));
00310   return result;
00311 }
00312 
00313 
00314 
00315 //_________________________________________________________
00316 double EvolutionECAL::NoiseFactorFE(double lumi, double eta)
00317 {
00318   double  x = fabs(eta);
00319   if(x<1.497){
00320     return sqrt( 1.0 + 0.495*0.03512*lumi*DamageProfileEtaAPD(eta));
00321   }else{
00322     return 1.0;
00323   } 
00324 } 
00325