00001 #include "DataFormats/Math/interface/LorentzVector.h"
00002 #include "RecoMET/METAlgorithms/interface/CaloSpecificAlgo.h"
00003 #include "DataFormats/CaloTowers/interface/CaloTowerDetId.h"
00004 #include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
00005 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
00006 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
00007
00008 using namespace reco;
00009 using namespace std;
00010
00011
00012
00013
00014
00015
00016
00017
00018 reco::CaloMET CaloSpecificAlgo::addInfo(edm::Handle<edm::View<Candidate> > towers, CommonMETData met, bool noHF, double globalThreshold)
00019 {
00020
00021 SpecificCaloMETData specific;
00022
00023 specific.MaxEtInEmTowers = 0.0;
00024 specific.MaxEtInHadTowers = 0.0;
00025 specific.HadEtInHO = 0.0;
00026 specific.HadEtInHB = 0.0;
00027 specific.HadEtInHF = 0.0;
00028 specific.HadEtInHE = 0.0;
00029 specific.EmEtInEB = 0.0;
00030 specific.EmEtInEE = 0.0;
00031 specific.EmEtInHF = 0.0;
00032 specific.EtFractionHadronic = 0.0;
00033 specific.EtFractionEm = 0.0;
00034 specific.METSignificance = -1.0;
00035 specific.CaloSETInpHF = 0.0;
00036 specific.CaloSETInmHF = 0.0;
00037 specific.CaloMETInpHF = 0.0;
00038 specific.CaloMETInmHF = 0.0;
00039 specific.CaloMETPhiInpHF = -999;
00040 specific.CaloMETPhiInmHF = -999;
00041
00042 double totalEt = 0.0;
00043 double totalEm = 0.0;
00044 double totalHad = 0.0;
00045 double MaxTowerEm = 0.0;
00046 double MaxTowerHad = 0.0;
00047 double sumEtInpHF = 0.0;
00048 double sumEtInmHF = 0.0;
00049 double MExInpHF = 0.0;
00050 double MEyInpHF = 0.0;
00051 double MExInmHF = 0.0;
00052 double MEyInmHF = 0.0;
00053
00054 if( towers->size() == 0 )
00055 {
00056
00057 const LorentzVector p4( met.mex, met.mey, 0.0, met.met );
00058 const Point vtx( 0.0, 0.0, 0.0 );
00059 CaloMET specificmet( specific, met.sumet, p4, vtx );
00060 return specificmet;
00061 }
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 edm::View<Candidate>::const_iterator towerCand = towers->begin();
00085
00086
00087 for( ; towerCand != towers->end(); towerCand++ )
00088 {
00089 const Candidate* candidate = &(*towerCand);
00090 if (candidate) {
00091 const CaloTower* calotower = dynamic_cast<const CaloTower*> (candidate);
00092 if (calotower)
00093 {
00094 if(calotower->et() < globalThreshold) continue;
00095 totalEt += calotower->et();
00096 totalEm += calotower->emEt();
00097
00098
00099
00100 bool hadIsDone = false;
00101 bool emIsDone = false;
00102 int cell = calotower->constituentsSize();
00103 while ( --cell >= 0 && (!hadIsDone || !emIsDone) )
00104 {
00105 DetId id = calotower->constituent( cell );
00106 if( !hadIsDone && id.det() == DetId::Hcal )
00107 {
00108 HcalSubdetector subdet = HcalDetId(id).subdet();
00109 if( subdet == HcalBarrel || subdet == HcalOuter )
00110 {
00111 if( calotower->hadEt() > MaxTowerHad ) MaxTowerHad = calotower->hadEt();
00112 specific.HadEtInHB += calotower->hadEt();
00113 specific.HadEtInHO += calotower->outerEt();
00114 }
00115 else if( subdet == HcalEndcap )
00116 {
00117 if( calotower->hadEt() > MaxTowerHad ) MaxTowerHad = calotower->hadEt();
00118 specific.HadEtInHE += calotower->hadEt();
00119 }
00120 else if( subdet == HcalForward )
00121 {
00122 if (!noHF)
00123 {
00124 if( calotower->hadEt() > MaxTowerHad ) MaxTowerHad = calotower->hadEt();
00125 if( calotower->emEt() > MaxTowerEm ) MaxTowerEm = calotower->emEt();
00126
00127 specific.HadEtInHF += calotower->hadEt();
00128 specific.EmEtInHF += calotower->emEt();
00129 }
00130 else
00131 {
00132
00133
00134 totalEm -= calotower->emEt();
00135 totalEt -= calotower->et();
00136 }
00137
00138
00139 if (calotower->eta()>=0)
00140 {
00141 sumEtInpHF += calotower->et();
00142 MExInpHF -= (calotower->et() * cos(calotower->phi()));
00143 MEyInpHF -= (calotower->et() * sin(calotower->phi()));
00144 }
00145 else
00146 {
00147 sumEtInmHF += calotower->et();
00148 MExInmHF -= (calotower->et() * cos(calotower->phi()));
00149 MEyInmHF -= (calotower->et() * sin(calotower->phi()));
00150 }
00151 }
00152 hadIsDone = true;
00153 }
00154 else if( !emIsDone && id.det() == DetId::Ecal )
00155 {
00156 EcalSubdetector subdet = EcalSubdetector( id.subdetId() );
00157 if( calotower->emEt() > MaxTowerEm ) MaxTowerEm = calotower->emEt();
00158 if( subdet == EcalBarrel )
00159 {
00160 specific.EmEtInEB += calotower->emEt();
00161 }
00162 else if( subdet == EcalEndcap )
00163 {
00164 specific.EmEtInEE += calotower->emEt();
00165 }
00166 emIsDone = true;
00167 }
00168 }
00169 }
00170 }
00171 }
00172
00173
00174
00175 totalHad += (totalEt - totalEm);
00176
00177 if(!noHF)
00178 {
00179 LorentzVector METpHF(MExInpHF, MEyInpHF, 0, sqrt(MExInpHF*MExInpHF + MEyInpHF*MEyInpHF));
00180 LorentzVector METmHF(MExInmHF, MEyInmHF, 0, sqrt(MExInmHF*MExInmHF + MEyInmHF*MEyInmHF));
00181 specific.CaloMETInpHF = METpHF.pt();
00182 specific.CaloMETInmHF = METmHF.pt();
00183 specific.CaloMETPhiInpHF = METpHF.Phi();
00184 specific.CaloMETPhiInmHF = METmHF.Phi();
00185 specific.CaloSETInpHF = sumEtInpHF;
00186 specific.CaloSETInmHF = sumEtInmHF;
00187 }
00188 else
00189 {
00190 met.mex -= (MExInmHF + MExInpHF);
00191 met.mey -= (MEyInmHF + MEyInpHF);
00192 met.sumet -= (sumEtInpHF + sumEtInmHF);
00193 met.met = sqrt(met.mex*met.mex + met.mey*met.mey);
00194 }
00195
00196 specific.MaxEtInEmTowers = MaxTowerEm;
00197 specific.MaxEtInHadTowers = MaxTowerHad;
00198 specific.EtFractionHadronic = totalHad / totalEt;
00199 specific.EtFractionEm = totalEm / totalEt;
00200
00201 const LorentzVector p4( met.mex, met.mey, 0.0, met.met );
00202 const Point vtx( 0.0, 0.0, 0.0 );
00203
00204
00205 CaloMET specificmet( specific, met.sumet, p4, vtx );
00206 return specificmet;
00207 }
00208