00001 #include "DataFormats/Math/interface/LorentzVector.h"
00002 #include "RecoMET/METAlgorithms/interface/SignCaloSpecificAlgo.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 #include "RecoMET/METAlgorithms/interface/SigInputObj.h"
00008 #include "RecoMET/METAlgorithms/interface/significanceAlgo.h"
00009 #include "RecoMET/METAlgorithms/interface/SignAlgoResolutions.h"
00010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00011 #include "DataFormats/CaloTowers/interface/CaloTowerFwd.h"
00012
00013 #include <string>
00014 using namespace reco;
00015 using namespace std;
00016
00017
00018
00019
00020
00035
00036
00037
00038
00039
00040
00041
00042 SignCaloSpecificAlgo::SignCaloSpecificAlgo():
00043 significance_(0.),
00044 matrix_(2,2)
00045 {
00046 matrix_(0,0)=matrix_(1,0)=matrix_(0,1)=matrix_(1,1)=0.;
00047 }
00048 SignCaloSpecificAlgo::~SignCaloSpecificAlgo()
00049 {
00050 }
00051
00052 void SignCaloSpecificAlgo::usePreviousSignif(const std::vector<double> &values)
00053 {
00054 if(values.size()!=4)
00055 return;
00056 matrix_(0,0)=values[0];
00057 matrix_(0,1)=values[1];
00058 matrix_(1,0)=values[2];
00059 matrix_(1,1)=values[3];
00060 return;
00061 }
00063
00064
00065
00066 std::vector<metsig::SigInputObj>
00067 SignCaloSpecificAlgo::makeVectorOutOfCaloTowers(edm::Handle<edm::View<reco::Candidate> > towers, const::metsig::SignAlgoResolutions& resolutions, bool noHF, double globalThreshold)
00068 {
00069
00070 edm::View<Candidate>::const_iterator towerCand = towers->begin();
00071 std::vector<metsig::SigInputObj> signInputVec;
00072
00073 for( ; towerCand != towers->end(); towerCand++ ) {
00074 const Candidate *candidate = &(*towerCand);
00075 if(candidate){
00076 const CaloTower * calotower = dynamic_cast<const CaloTower*> (candidate);
00077 if(calotower){
00078 double sign_tower_et = calotower->et();
00079 if(sign_tower_et<globalThreshold)
00080 continue;
00081 bool wasused=false;
00082 double sign_tower_phi = calotower->phi();
00083 double sign_tower_sigma_et = 0;
00084 double sign_tower_sigma_phi = 0;
00085 std::string sign_tower_type = "";
00086
00087 bool hadIsDone = false;
00088 bool emIsDone = false;
00089 int cell = calotower->constituentsSize();
00090
00091 while ( --cell >= 0 && (!hadIsDone || !emIsDone) )
00092 {
00093 DetId id = calotower->constituent( cell );
00094 if( !hadIsDone && id.det() == DetId::Hcal )
00095 {
00096 HcalSubdetector subdet = HcalDetId(id).subdet();
00097 if(subdet == HcalBarrel){
00098 sign_tower_type = "hadcalotower";
00099 sign_tower_et = calotower->hadEt();
00100 sign_tower_sigma_et = resolutions.eval(metsig::caloHB,metsig::ET,sign_tower_et,calotower->phi(),calotower->eta());
00101 sign_tower_sigma_phi = resolutions.eval(metsig::caloHB,metsig::PHI,sign_tower_et,calotower->phi(),calotower->eta());
00102 }
00103 else if(subdet==HcalOuter){
00104 sign_tower_type = "hadcalotower";
00105 sign_tower_et = calotower->outerEt();
00106 sign_tower_sigma_et = resolutions.eval(metsig::caloHO,metsig::ET,sign_tower_et,calotower->phi(),calotower->eta());
00107 sign_tower_sigma_phi = resolutions.eval(metsig::caloHO,metsig::PHI,sign_tower_et,calotower->phi(),calotower->eta());
00108 }
00109 else if(subdet==HcalEndcap){
00110 sign_tower_type = "hadcalotower";
00111 sign_tower_et = calotower->hadEt();
00112 sign_tower_sigma_et = resolutions.eval(metsig::caloHE,metsig::ET,sign_tower_et,calotower->phi(),calotower->eta());
00113 sign_tower_sigma_phi = resolutions.eval(metsig::caloHE,metsig::PHI,sign_tower_et,calotower->phi(),calotower->eta());
00114 }
00115 else if(subdet == HcalForward){
00116 sign_tower_type = "hadcalotower";
00117 sign_tower_et = calotower->et();
00118 sign_tower_sigma_et = resolutions.eval(metsig::caloHF,metsig::ET,sign_tower_et,calotower->phi(),calotower->eta());
00119 sign_tower_sigma_phi = resolutions.eval(metsig::caloHF,metsig::PHI,sign_tower_et,calotower->phi(),calotower->eta());
00120 }
00121 else{
00122 edm::LogWarning("SignCaloSpecificAlgo") << " HCAL tower cell not assigned to an HCAL subdetector!!!" << std::endl;
00123 }
00124
00125 metsig::SigInputObj temp(sign_tower_type,sign_tower_et,sign_tower_phi,sign_tower_sigma_et,sign_tower_sigma_phi);
00126 if(!noHF || subdet !=HcalForward)
00127 signInputVec.push_back(temp);
00128
00129 wasused=1;
00130 hadIsDone = true;
00131 }
00132 else if( !emIsDone && id.det() == DetId::Ecal )
00133 {
00134 EcalSubdetector subdet = EcalSubdetector( id.subdetId() );
00135
00136 if(subdet == EcalBarrel){
00137 sign_tower_type = "emcalotower";
00138 sign_tower_et = calotower->emEt();
00139 sign_tower_sigma_et = resolutions.eval(metsig::caloEB,metsig::ET,sign_tower_et,calotower->phi(),calotower->eta());
00140 sign_tower_sigma_phi = resolutions.eval(metsig::caloEB,metsig::PHI,sign_tower_et,calotower->phi(),calotower->eta());
00141 }
00142 else if(subdet == EcalEndcap ){
00143 sign_tower_type = "emcalotower";
00144 sign_tower_et = calotower->emEt();
00145 sign_tower_sigma_et = resolutions.eval(metsig::caloEE,metsig::ET,sign_tower_et,calotower->phi(),calotower->eta());
00146 sign_tower_sigma_phi = resolutions.eval(metsig::caloEE,metsig::PHI,sign_tower_et,calotower->phi(),calotower->eta());
00147
00148 }
00149 else{
00150 edm::LogWarning("SignCaloSpecificAlgo") << " ECAL tower cell not assigned to an ECAL subdetector!!!" << std::endl;
00151 }
00152 metsig::SigInputObj temp(sign_tower_type,sign_tower_et,sign_tower_phi,sign_tower_sigma_et,sign_tower_sigma_phi);
00153 signInputVec.push_back(temp);
00154 wasused=1;
00155 emIsDone = true;
00156 }
00157 }
00158 if(wasused==0)
00159 edm::LogWarning("SignCaloSpecificAlgo") << "found non-assigned cell, " << std::endl;
00160 }
00161 }
00162 }
00163 return signInputVec;
00164 }
00166
00167
00168 void SignCaloSpecificAlgo::calculateBaseCaloMET(edm::Handle<edm::View<reco::Candidate> > towers, CommonMETData met,const metsig::SignAlgoResolutions& resolutions, bool noHF, double globalThreshold)
00169 {
00170
00171
00172
00173
00174
00175
00176
00177
00178 std::vector<metsig::SigInputObj> signInputVec = makeVectorOutOfCaloTowers(towers, resolutions, noHF, globalThreshold);
00179
00180
00181
00182 double sign_calo_met_total=0;
00183 double sign_calo_met_phi=0;
00184 double sign_calo_met_set=0;
00185 metsig::significanceAlgo signifalgo;
00186
00187 signifalgo.addSignifMatrix(matrix_);
00188 signifalgo.addObjects(signInputVec);
00189 matrix_=signifalgo.getSignifMatrix();
00190 significance_ = signifalgo.significance( sign_calo_met_total, sign_calo_met_phi, sign_calo_met_set);
00191
00192 signInputVec.clear();
00193
00194 }
00195
00196