00001 #include "PhysicsTools/TagAndProbe/interface/BaseTreeFiller.h"
00002 #include "FWCore/ServiceRegistry/interface/Service.h"
00003 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00004
00005 #include "DataFormats/METReco/interface/MET.h"
00006 #include "DataFormats/METReco/interface/METCollection.h"
00007 #include "DataFormats/METReco/interface/CaloMET.h"
00008 #include "DataFormats/METReco/interface/CaloMETCollection.h"
00009 #include "DataFormats/METReco/interface/PFMET.h"
00010 #include "DataFormats/METReco/interface/PFMETCollection.h"
00011 #include "DataFormats/VertexReco/interface/Vertex.h"
00012 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00013 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00014 #include "PhysicsTools/TagAndProbe/interface/ColinsSoperVariables.h"
00015
00016 #include <TList.h>
00017 #include <TObjString.h>
00018
00019 tnp::ProbeVariable::~ProbeVariable() {}
00020
00021 tnp::ProbeFlag::~ProbeFlag() {}
00022
00023 void tnp::ProbeFlag::init(const edm::Event &iEvent) const {
00024 if (external_) {
00025 edm::Handle<edm::View<reco::Candidate> > view;
00026 iEvent.getByLabel(src_, view);
00027 passingProbes_.clear();
00028 for (size_t i = 0, n = view->size(); i < n; ++i) passingProbes_.push_back(view->refAt(i));
00029 }
00030
00031 }
00032
00033 void tnp::ProbeFlag::fill(const reco::CandidateBaseRef &probe) const {
00034 if (external_) {
00035 value_ = (std::find(passingProbes_.begin(), passingProbes_.end(), probe) != passingProbes_.end());
00036 } else {
00037 value_ = bool(cut_(*probe));
00038 }
00039 }
00040
00041 tnp::BaseTreeFiller::BaseTreeFiller(const char *name, const edm::ParameterSet iConfig) {
00042
00043 edm::Service<TFileService> fs;
00044 tree_ = fs->make<TTree>(name,name);
00045
00046
00047 addBranches_(tree_, iConfig, "");
00048
00049
00050 if (iConfig.existsAs<double>("eventWeight")) {
00051 weightMode_ = Fixed;
00052 weight_ = iConfig.getParameter<double>("eventWeight");
00053 } else if (iConfig.existsAs<edm::InputTag>("eventWeight")) {
00054 weightMode_ = External;
00055 weightSrc_ = iConfig.getParameter<edm::InputTag>("eventWeight");
00056 } else {
00057 weightMode_ = None;
00058 }
00059 if (weightMode_ != None) {
00060 tree_->Branch("weight", &weight_, "weight/F");
00061 }
00062
00063 addRunLumiInfo_ = iConfig.existsAs<bool>("addRunLumiInfo") ? iConfig.getParameter<bool>("addRunLumiInfo") : false;
00064 if (addRunLumiInfo_) {
00065 tree_->Branch("run", &run_, "run/i");
00066 tree_->Branch("lumi", &lumi_, "lumi/i");
00067 tree_->Branch("event", &event_, "event/i");
00068 }
00069 addEventVariablesInfo_ = iConfig.existsAs<bool>("addEventVariablesInfo") ? iConfig.getParameter<bool>("addEventVariablesInfo") : false;
00070 if (addEventVariablesInfo_) {
00071 tree_->Branch("event_nPV" ,&mNPV_ ,"mNPV/I");
00072 tree_->Branch("event_met_calomet" ,&mMET_ ,"mMET/F");
00073 tree_->Branch("event_met_calosumet" ,&mSumET_ ,"mSumET/F");
00074 tree_->Branch("event_met_calometsignificance",&mMETSign_ ,"mMETSign/F");
00075 tree_->Branch("event_met_tcmet" ,&mtcMET_ ,"mtcMET/F");
00076 tree_->Branch("event_met_tcsumet" ,&mtcSumET_ ,"mtcSumET/F");
00077 tree_->Branch("event_met_tcmetsignificance",&mtcMETSign_ ,"mtcMETSign/F");
00078 tree_->Branch("event_met_pfmet" ,&mpfMET_ ,"mpfMET/F");
00079 tree_->Branch("event_met_pfsumet" ,&mpfSumET_ ,"mpfSumET/F");
00080 tree_->Branch("event_met_pfmetsignificance",&mpfMETSign_ ,"mpfMETSign/F");
00081 tree_->Branch("event_PrimaryVertex_x" ,&mPVx_ ,"mPVx/F");
00082 tree_->Branch("event_PrimaryVertex_y" ,&mPVy_ ,"mPVy/F");
00083 tree_->Branch("event_PrimaryVertex_z" ,&mPVz_ ,"mPVz/F");
00084 tree_->Branch("event_BeamSpot_x" ,&mBSx_ ,"mBSx/F");
00085 tree_->Branch("event_BeamSpot_y" ,&mBSy_ ,"mBSy/F");
00086 tree_->Branch("event_BeamSpot_z" ,&mBSz_ ,"mBSz/F");
00087 }
00088
00089 ignoreExceptions_ = iConfig.existsAs<bool>("ignoreExceptions") ? iConfig.getParameter<bool>("ignoreExceptions") : false;
00090 }
00091
00092 tnp::BaseTreeFiller::BaseTreeFiller(BaseTreeFiller &main, const edm::ParameterSet &iConfig, const std::string &branchNamePrefix) :
00093 addEventVariablesInfo_(false),
00094 tree_(0)
00095 {
00096 addBranches_(main.tree_, iConfig, branchNamePrefix);
00097 }
00098
00099 void
00100 tnp::BaseTreeFiller::addBranches_(TTree *tree, const edm::ParameterSet &iConfig, const std::string &branchNamePrefix) {
00101
00102 edm::ParameterSet variables = iConfig.getParameter<edm::ParameterSet>("variables");
00103
00104 std::vector<std::string> stringVars = variables.getParameterNamesForType<std::string>();
00105 for (std::vector<std::string>::const_iterator it = stringVars.begin(), ed = stringVars.end(); it != ed; ++it) {
00106 vars_.push_back(tnp::ProbeVariable(branchNamePrefix + *it, variables.getParameter<std::string>(*it)));
00107 }
00108
00109 std::vector<std::string> inputTagVars = variables.getParameterNamesForType<edm::InputTag>();
00110 for (std::vector<std::string>::const_iterator it = inputTagVars.begin(), ed = inputTagVars.end(); it != ed; ++it) {
00111 vars_.push_back(tnp::ProbeVariable(branchNamePrefix + *it, variables.getParameter<edm::InputTag>(*it)));
00112 }
00113
00114 edm::ParameterSet flags = iConfig.getParameter<edm::ParameterSet>("flags");
00115
00116 std::vector<std::string> stringFlags = flags.getParameterNamesForType<std::string>();
00117 for (std::vector<std::string>::const_iterator it = stringFlags.begin(), ed = stringFlags.end(); it != ed; ++it) {
00118 flags_.push_back(tnp::ProbeFlag(branchNamePrefix + *it, flags.getParameter<std::string>(*it)));
00119 }
00120
00121 std::vector<std::string> inputTagFlags = flags.getParameterNamesForType<edm::InputTag>();
00122 for (std::vector<std::string>::const_iterator it = inputTagFlags.begin(), ed = inputTagFlags.end(); it != ed; ++it) {
00123 flags_.push_back(tnp::ProbeFlag(branchNamePrefix + *it, flags.getParameter<edm::InputTag>(*it)));
00124 }
00125
00126
00127 for (std::vector<tnp::ProbeVariable>::iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
00128 tree->Branch(it->name().c_str(), it->address(), (it->name()+"/F").c_str());
00129 }
00130
00131 for (std::vector<tnp::ProbeFlag>::iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
00132 tree->Branch(it->name().c_str(), it->address(), (it->name()+"/I").c_str());
00133 }
00134
00135 }
00136
00137 tnp::BaseTreeFiller::~BaseTreeFiller() { }
00138
00139 void tnp::BaseTreeFiller::init(const edm::Event &iEvent) const {
00140 run_ = iEvent.id().run();
00141 lumi_ = iEvent.id().luminosityBlock();
00142 event_ = iEvent.id().event();
00143
00144 for (std::vector<tnp::ProbeVariable>::const_iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
00145 it->init(iEvent);
00146 }
00147 for (std::vector<tnp::ProbeFlag>::const_iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
00148 it->init(iEvent);
00149 }
00150 if (weightMode_ == External) {
00151 edm::Handle<double> weight;
00152 iEvent.getByLabel(weightSrc_, weight);
00153 weight_ = *weight;
00154 }
00155
00156 if (addEventVariablesInfo_) {
00159 edm::Handle<reco::VertexCollection> recVtxs;
00160 iEvent.getByLabel("offlinePrimaryVertices",recVtxs);
00161 mNPV_ = 0;
00162 mPVx_ = 100.0;
00163 mPVy_ = 100.0;
00164 mPVz_ = 100.0;
00165
00166 for(unsigned int ind=0;ind<recVtxs->size();ind++) {
00167 if (!((*recVtxs)[ind].isFake()) && ((*recVtxs)[ind].ndof()>4)
00168 && (fabs((*recVtxs)[ind].z())<=24.0) &&
00169 ((*recVtxs)[ind].position().Rho()<=2.0) ) {
00170 mNPV_++;
00171 if(mNPV_==1) {
00172 mPVx_ = (*recVtxs)[ind].x();
00173 mPVy_ = (*recVtxs)[ind].y();
00174 mPVz_ = (*recVtxs)[ind].z();
00175 }
00176 }
00177 }
00178
00179
00181 edm::Handle<reco::BeamSpot> beamSpot;
00182 iEvent.getByLabel("offlineBeamSpot", beamSpot);
00183 mBSx_ = beamSpot->position().X();
00184 mBSy_ = beamSpot->position().Y();
00185 mBSz_ = beamSpot->position().Z();
00186
00187
00189 edm::Handle<reco::CaloMETCollection> met;
00190 iEvent.getByLabel("met",met);
00191 if (met->size() == 0) {
00192 mMET_ = -1;
00193 mSumET_ = -1;
00194 mMETSign_ = -1;
00195 }
00196 else {
00197 mMET_ = (*met)[0].et();
00198 mSumET_ = (*met)[0].sumEt();
00199 mMETSign_ = (*met)[0].significance();
00200 }
00201
00203 edm::Handle<reco::METCollection> tcmet;
00204 iEvent.getByLabel("tcMet", tcmet);
00205 if (tcmet->size() == 0) {
00206 mtcMET_ = -1;
00207 mtcSumET_ = -1;
00208 mtcMETSign_ = -1;
00209 }
00210 else {
00211 mtcMET_ = (*tcmet)[0].et();
00212 mtcSumET_ = (*tcmet)[0].sumEt();
00213 mtcMETSign_ = (*tcmet)[0].significance();
00214 }
00215
00217 edm::Handle<reco::PFMETCollection> pfmet;
00218 iEvent.getByLabel("pfMet", pfmet);
00219 if (pfmet->size() == 0) {
00220 mpfMET_ = -1;
00221 mpfSumET_ = -1;
00222 mpfMETSign_ = -1;
00223 }
00224 else {
00225 mpfMET_ = (*pfmet)[0].et();
00226 mpfSumET_ = (*pfmet)[0].sumEt();
00227 mpfMETSign_ = (*pfmet)[0].significance();
00228 }
00229 }
00230
00231 }
00232
00233 void tnp::BaseTreeFiller::fill(const reco::CandidateBaseRef &probe) const {
00234 for (std::vector<tnp::ProbeVariable>::const_iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
00235 if (ignoreExceptions_) {
00236 try{ it->fill(probe); } catch(cms::Exception &ex ){}
00237 } else {
00238 it->fill(probe);
00239 }
00240 }
00241
00242 for (std::vector<tnp::ProbeFlag>::const_iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
00243 if (ignoreExceptions_) {
00244 try{ it->fill(probe); } catch(cms::Exception &ex ){}
00245 } else {
00246 it->fill(probe);
00247 }
00248 }
00249 if (tree_) tree_->Fill();
00250 }
00251 void tnp::BaseTreeFiller::writeProvenance(const edm::ParameterSet &pset) const {
00252 TList *list = tree_->GetUserInfo();
00253 list->Add(new TObjString(pset.dump().c_str()));
00254 }