CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/src/RecoLocalCalo/EcalRecAlgos/src/ESRecHitAnalyticAlgo.cc

Go to the documentation of this file.
00001 #include "RecoLocalCalo/EcalRecAlgos/interface/ESRecHitAnalyticAlgo.h"
00002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00003 
00004 #include <iostream>
00005 #include <cmath>
00006 
00007 ESRecHitAnalyticAlgo::ESRecHitAnalyticAlgo() {
00008 }
00009 
00010 ESRecHitAnalyticAlgo::~ESRecHitAnalyticAlgo() {
00011 }
00012 
00013 double* ESRecHitAnalyticAlgo::EvalAmplitude(const ESDataFrame& digi, double ped) const {
00014   
00015   double *fitresults = new double[3];
00016   double adc[3];  
00017 
00018   for (int i=0; i<digi.size(); i++) 
00019     adc[i] = digi.sample(i).adc() - ped;
00020 
00021   double status = 0;
00022   if (adc[0] > 20) status = 14;
00023   if (adc[1] < 0 || adc[2] < 0) status = 10;
00024   if (adc[0] > adc[1] && adc[0] > adc[2]) status = 8;
00025   if (adc[2] > adc[1] && adc[2] > adc[0]) status = 9;  
00026   double r12 = (adc[1] != 0) ? adc[0]/adc[1] : 99999;
00027   double r23 = (adc[2] != 0) ? adc[1]/adc[2] : 99999;
00028   if (r12 > ratioCuts_->getR12High()) status = 5;
00029   if (r23 > ratioCuts_->getR23High()) status = 6;
00030   if (r23 < ratioCuts_->getR23Low()) status = 7;
00031 
00032   if (int(status) == 0) {
00033 
00034     double A1 = adc[1];
00035     double A2 = adc[2];
00036 
00037     // t0 from analytical formula:
00038     double n = 1.798;
00039     double w = 0.07291;
00040     double DeltaT = 25.;
00041     double aaa = log(A2/A1)/n;
00042     double bbb = w/n*DeltaT;
00043     double ccc= exp(aaa+bbb);
00044 
00045     //double t0 = (2.-ccc)/(ccc-1) * DeltaT + 5;
00046     double t0 = (2.-ccc)/(1.-ccc) * DeltaT - 5;
00047 
00048     // A from analytical formula:
00049     double t1 = 20.;
00050     //double t2 = 45.;
00051     double A_1 =  pow(w/n*(t1),n) * exp(n-w*(t1));
00052     //double A_2 =  pow(w/n*(t2),n) * exp(n-w*(t2));
00053     double AA1 = A1 / A_1;
00054     //double AA2 = A2 / A_2;
00055 
00056     fitresults[0] = AA1;
00057     fitresults[1] = t0;
00058 
00059     if (adc[1] > 2800 && adc[2] > 2800) status = 11;
00060     else if (adc[1] > 2800) status = 12;
00061     else if (adc[2] > 2800) status = 13;
00062 
00063   } else {
00064     fitresults[0] = 0;
00065     fitresults[1] = -999;
00066   }
00067 
00068   fitresults[2] = status;
00069 
00070   return fitresults;
00071 }
00072 
00073 EcalRecHit ESRecHitAnalyticAlgo::reconstruct(const ESDataFrame& digi) const {
00074   
00075   ESPedestals::const_iterator it_ped = peds_->find(digi.id());
00076   
00077   ESIntercalibConstantMap::const_iterator it_mip = mips_->getMap().find(digi.id());
00078   ESAngleCorrectionFactors::const_iterator it_ang = ang_->getMap().find(digi.id());
00079 
00080   ESChannelStatusMap::const_iterator it_status = channelStatus_->getMap().find(digi.id());
00081 
00082   double* results;
00083 
00084   results = EvalAmplitude(digi, it_ped->getMean());
00085 
00086   double energy = results[0];
00087   double t0 = results[1];
00088   int status = (int) results[2];
00089   delete[] results;
00090 
00091   double mipCalib = (fabs(cos(*it_ang)) != 0.) ? (*it_mip)/fabs(cos(*it_ang)) : 0.;
00092   energy *= (mipCalib != 0.) ? MIPGeV_/mipCalib : 0.;
00093 
00094   DetId detId = digi.id();
00095 
00096   LogDebug("ESRecHitAnalyticAlgo") << "ESRecHitAnalyticAlgo : reconstructed energy "<<energy<<" T0 "<<t0;
00097 
00098   EcalRecHit rechit(digi.id(), energy, t0);
00099 
00100   if (it_status->getStatusCode() == 1) {
00101       rechit.setRecoFlag(EcalRecHit::kESDead);
00102   } else {
00103     if (status == 0) 
00104       rechit.setRecoFlag(EcalRecHit::kESGood);
00105     else if (status == 5) 
00106       rechit.setRecoFlag(EcalRecHit::kESBadRatioFor12);
00107     else if (status == 6) 
00108       rechit.setRecoFlag(EcalRecHit::kESBadRatioFor23Upper);
00109     else if (status == 7) 
00110       rechit.setRecoFlag(EcalRecHit::kESBadRatioFor23Lower);
00111     else if (status == 8) 
00112       rechit.setRecoFlag(EcalRecHit::kESTS1Largest);
00113     else if (status == 9) 
00114       rechit.setRecoFlag(EcalRecHit::kESTS3Largest);
00115     else if (status == 10) 
00116       rechit.setRecoFlag(EcalRecHit::kESTS3Negative);
00117     else if (status == 11) 
00118       rechit.setRecoFlag(EcalRecHit::kESSaturated);
00119     else if (status == 12) 
00120       rechit.setRecoFlag(EcalRecHit::kESTS2Saturated);
00121     else if (status == 13) 
00122       rechit.setRecoFlag(EcalRecHit::kESTS3Saturated);
00123     else if (status == 14) 
00124       rechit.setRecoFlag(EcalRecHit::kESTS13Sigmas);
00125   }
00126 
00127   return rechit;
00128 }
00129