00001 #include "CondTools/Ecal/interface/EvolutionECAL.h"
00002
00003
00004
00005
00006 EvolutionECAL::~EvolutionECAL()
00007 {
00008 }
00009
00010
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
00061
00062
00063
00064
00065
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
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;
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