/ElectroWeakAnalysis/ZEE/interface/SCEnergyCorrections.h

https://github.com/aivanov-cern/cmssw · C Header · 114 lines · 87 code · 23 blank · 4 comment · 10 complexity · c9362b2a642a6df7e9eb630876f1cb19 MD5 · raw file

  1. #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
  2. reco::CaloClusterPtrVector CaloClusterVectorCopier(const reco::SuperCluster& sc);
  3. reco::SuperCluster fEtaScCorr(const reco::SuperCluster& sc)
  4. {
  5. reco::CaloClusterPtrVector bcs = CaloClusterVectorCopier(sc);
  6. double ieta = fabs(sc.eta())*(5/0.087);
  7. double p0 = 40.2198;
  8. double p1 = -3.03103e-6;
  9. double newE;
  10. // std::cout << "Corrected E = Raw E * (1+ p1*(ieta - p0)*(ieta - p0))"<< std::endl;
  11. if ( ieta < p0 ) newE = sc.rawEnergy();
  12. else newE = sc.rawEnergy()/(1 + p1*(ieta - p0)*(ieta - p0));
  13. reco::SuperCluster corrSc(newE, sc.position(), sc.seed(), bcs, sc.preshowerEnergy(), 0., 0.);
  14. return corrSc;
  15. }
  16. reco::SuperCluster fBremScCorr(const reco::SuperCluster& sc, const edm::ParameterSet& ps)
  17. {
  18. std::vector<double> fBrem = ps.getParameter<std::vector<double> >("fBremVec");
  19. double bremFrLowThr = ps.getParameter<double>("brLinearLowThr");
  20. double bremFrHighThr = ps.getParameter<double>("brLinearHighThr");
  21. reco::CaloClusterPtrVector bcs = CaloClusterVectorCopier(sc);
  22. double bremFrac = sc.phiWidth()/sc.etaWidth();
  23. double newE = sc.energy();
  24. if(fabs(sc.eta()) < 1.479)
  25. {
  26. reco::SuperCluster fEtaSC = fEtaScCorr(sc);
  27. reco::CaloClusterPtrVector bcs = CaloClusterVectorCopier(sc);
  28. newE = fEtaSC.energy();
  29. }
  30. if(bremFrac < bremFrLowThr) bremFrac = bremFrLowThr;
  31. if(bremFrac < bremFrHighThr) bremFrac = bremFrHighThr;
  32. double p0 = fBrem[0];
  33. double p1 = fBrem[1];
  34. double p2 = fBrem[2];
  35. double p3 = fBrem[3];
  36. double p4 = fBrem[4];
  37. //
  38. double threshold = p4;
  39. double y = p0*threshold*threshold + p1*threshold + p2;
  40. double yprime = 2*p0*threshold + p1;
  41. double a = p3;
  42. double b = yprime - 2*a*threshold;
  43. double c = y - a*threshold*threshold - b*threshold;
  44. double fCorr = 1;
  45. if( bremFrac < threshold )
  46. fCorr = p0*bremFrac*bremFrac + p1*bremFrac + p2;
  47. else
  48. fCorr = a*bremFrac*bremFrac + b*bremFrac + c;
  49. newE /= fCorr;
  50. reco::SuperCluster corrSc(newE, sc.position(), sc.seed(), bcs, sc.preshowerEnergy(), 0., 0.);
  51. return corrSc;
  52. }
  53. reco::SuperCluster fEtEtaCorr(const reco::SuperCluster& sc, const edm::ParameterSet& ps)
  54. {
  55. // et -- Et of the SuperCluster (with respect to (0,0,0))
  56. // eta -- eta of the SuperCluster
  57. std::vector<double> fEtEtaParams = ps.getParameter<std::vector<double> >("fEtEtaParamsVec");
  58. reco::SuperCluster fBremSC = fBremScCorr(sc, ps);
  59. reco::CaloClusterPtrVector bcs = CaloClusterVectorCopier(sc);
  60. double eta = sc.eta();
  61. double et = fBremSC.energy()/cosh(eta);
  62. double fCorr = 0.;
  63. double p0 = fEtEtaParams[0] + fEtEtaParams[1]/(et + fEtEtaParams[ 2]) + fEtEtaParams[ 3]/(et*et);
  64. double p1 = fEtEtaParams[4] + fEtEtaParams[5]/(et + fEtEtaParams[ 6]) + fEtEtaParams[ 7]/(et*et);
  65. double p2 = fEtEtaParams[8] + fEtEtaParams[9]/(et + fEtEtaParams[10]) + fEtEtaParams[11]/(et*et);
  66. fCorr =
  67. p0 +
  68. p1 * atan(fEtEtaParams[12]*(fEtEtaParams[13]-fabs(eta))) + fEtEtaParams[14] * fabs(eta) +
  69. p1 * fEtEtaParams[15] * fabs(eta) +
  70. p2 * fEtEtaParams[16] * eta * eta;
  71. if ( fCorr < 0.5 ) fCorr = 0.5;
  72. double newE = et/(fCorr*cosh(eta));
  73. reco::SuperCluster corrSc(newE, sc.position(), sc.seed(), bcs, sc.preshowerEnergy(), 0., 0.);
  74. return corrSc;
  75. }
  76. reco::SuperCluster fEAddScCorr(const reco::SuperCluster& sc, double Ecorr)
  77. {
  78. reco::CaloClusterPtrVector bcs = CaloClusterVectorCopier(sc);
  79. double newE = sc.rawEnergy()+Ecorr;
  80. reco::SuperCluster corrSc(newE, sc.position(), sc.seed(), bcs, sc.preshowerEnergy(), 0., 0.);
  81. return corrSc;
  82. }
  83. reco::CaloClusterPtrVector CaloClusterVectorCopier(const reco::SuperCluster& sc)
  84. {
  85. reco::CaloClusterPtrVector clusters_v;
  86. for(reco::CaloCluster_iterator cluster = sc.clustersBegin(); cluster != sc.clustersEnd(); cluster ++)
  87. {
  88. clusters_v.push_back(*cluster);
  89. }
  90. return clusters_v;
  91. }