00001 #include "SimG4CMS/Calo/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
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
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
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;
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