CMS 3D CMS Logo

BaseTreeFiller.cc
Go to the documentation of this file.
4 
5 #include <TList.h>
6 #include <TObjString.h>
7 
8 #include <iostream>
9 using namespace std;
10 
12 
14 
16  if (external_) {
18  iEvent.getByToken(srcToken_, view);
19  passingProbes_.clear();
20  for (size_t i = 0, n = view->size(); i < n; ++i)
21  passingProbes_.push_back(view->refAt(i));
22  }
23 }
24 
25 void tnp::ProbeFlag::fill(const reco::CandidateBaseRef &probe) const {
26  if (external_) {
27  value_ = (std::find(passingProbes_.begin(), passingProbes_.end(), probe) != passingProbes_.end());
28  } else {
29  value_ = bool(cut_(*probe));
30  }
31 }
32 
34  // make trees as requested
36  tree_ = fs->make<TTree>(name, name);
37 
38  // add the branches
39  addBranches_(tree_, iConfig, iC, "");
40 
41  // set up weights, if needed
42  if (iConfig.existsAs<double>("eventWeight")) {
43  weightMode_ = Fixed;
44  weight_ = iConfig.getParameter<double>("eventWeight");
45  } else if (iConfig.existsAs<edm::InputTag>("eventWeight")) {
46  weightMode_ = External;
47  weightSrcToken_ = iC.consumes<GenEventInfoProduct>(iConfig.getParameter<edm::InputTag>("eventWeight"));
48  tree_->Branch("psWeight", &psWeight_, "psWeight[5]/F");
49  } else {
50  weightMode_ = None;
51  }
52  if (weightMode_ != None) {
53  tree_->Branch("weight", &weight_, "weight/F");
54  tree_->Branch("totWeight", &totWeight_, "totWeight/F");
55  }
56 
57  LHEinfo_ = iConfig.existsAs<edm::InputTag>("LHEWeightSrc");
58  if (LHEinfo_) {
59  _LHECollection = iC.consumes<LHEEventProduct>(iConfig.getParameter<edm::InputTag>("LHEWeightSrc"));
60  tree_->Branch("lheWeight", &lheWeight_, "lheWeight[9]/F");
61  tree_->Branch("lhe_ht", &lhe_ht_, "lhe_ht/F");
62  }
63 
64  storePUweight_ = iConfig.existsAs<edm::InputTag>("PUWeightSrc") ? true : false;
65  if (storePUweight_) {
66  PUweightSrcToken_ = iC.consumes<double>(iConfig.getParameter<edm::InputTag>("PUWeightSrc"));
67  tree_->Branch("PUweight", &PUweight_, "PUweight/F");
68  }
69 
70  if (iConfig.existsAs<edm::InputTag>("pileupInfoTag"))
71  pileupInfoToken_ =
72  iC.consumes<std::vector<PileupSummaryInfo> >(iConfig.getParameter<edm::InputTag>("pileupInfoTag"));
73 
74  addRunLumiInfo_ = iConfig.existsAs<bool>("addRunLumiInfo") ? iConfig.getParameter<bool>("addRunLumiInfo") : false;
75  if (addRunLumiInfo_) {
76  tree_->Branch("run", &run_, "run/i");
77  tree_->Branch("lumi", &lumi_, "lumi/i");
78  tree_->Branch("event", &event_, "event/l");
79  tree_->Branch("truePU", &truePU_, "truePU/I");
80  }
81  addEventVariablesInfo_ =
82  iConfig.existsAs<bool>("addEventVariablesInfo") ? iConfig.getParameter<bool>("addEventVariablesInfo") : false;
83  if (addEventVariablesInfo_) {
85  edm::InputTag bsIT = iConfig.existsAs<edm::InputTag>("beamSpot") ? iConfig.getParameter<edm::InputTag>("beamSpot")
86  : edm::InputTag("offlineBeamSpot");
87  edm::InputTag vtxIT = iConfig.existsAs<edm::InputTag>("vertexCollection")
88  ? iConfig.getParameter<edm::InputTag>("vertexCollection")
89  : edm::InputTag("offlinePrimaryVertices");
90  edm::InputTag pfMetIT = iConfig.existsAs<edm::InputTag>("pfMet") ? iConfig.getParameter<edm::InputTag>("pfMet")
91  : edm::InputTag("pfMet");
92  edm::InputTag tcMetIT = iConfig.existsAs<edm::InputTag>("tcMet") ? iConfig.getParameter<edm::InputTag>("tcMet")
93  : edm::InputTag("tcMet");
94  edm::InputTag clMetIT =
95  iConfig.existsAs<edm::InputTag>("clMet") ? iConfig.getParameter<edm::InputTag>("clMet") : edm::InputTag("met");
96 
97  recVtxsToken_ = iC.consumes<reco::VertexCollection>(vtxIT);
98  beamSpotToken_ = iC.consumes<reco::BeamSpot>(bsIT);
99  pfmetToken_ = iC.mayConsume<reco::PFMETCollection>(pfMetIT);
100  pfmetTokenMiniAOD_ = iC.mayConsume<pat::METCollection>(pfMetIT);
101  addCaloMet_ = iConfig.existsAs<bool>("addCaloMet") ? iConfig.getParameter<bool>("addCaloMet") : true;
102  tree_->Branch("event_nPV", &mNPV_, "mNPV/I");
103  if (addCaloMet_) {
104  metToken_ = iC.mayConsume<reco::CaloMETCollection>(clMetIT);
105  tcmetToken_ = iC.mayConsume<reco::METCollection>(tcMetIT);
106  tree_->Branch("event_met_calomet", &mMET_, "mMET/F");
107  tree_->Branch("event_met_calosumet", &mSumET_, "mSumET/F");
108  tree_->Branch("event_met_calometsignificance", &mMETSign_, "mMETSign/F");
109  tree_->Branch("event_met_tcmet", &mtcMET_, "mtcMET/F");
110  tree_->Branch("event_met_tcsumet", &mtcSumET_, "mtcSumET/F");
111  tree_->Branch("event_met_tcmetsignificance", &mtcMETSign_, "mtcMETSign/F");
112  }
113  tree_->Branch("event_met_pfmet", &mpfMET_, "mpfMET/F");
114  tree_->Branch("event_met_pfphi", &mpfPhi_, "mpfPhi/F");
115  tree_->Branch("event_met_pfsumet", &mpfSumET_, "mpfSumET/F");
116 
117  tree_->Branch("event_met_pfmetsignificance", &mpfMETSign_, "mpfMETSign/F");
118  tree_->Branch("event_PrimaryVertex_x", &mPVx_, "mPVx/F");
119  tree_->Branch("event_PrimaryVertex_y", &mPVy_, "mPVy/F");
120  tree_->Branch("event_PrimaryVertex_z", &mPVz_, "mPVz/F");
121  tree_->Branch("event_BeamSpot_x", &mBSx_, "mBSx/F");
122  tree_->Branch("event_BeamSpot_y", &mBSy_, "mBSy/F");
123  tree_->Branch("event_BeamSpot_z", &mBSz_, "mBSz/F");
124  }
125 
126  addRho_ = iConfig.existsAs<edm::InputTag>("rho") ? true : false;
127  if (addRho_) {
128  rhoToken_ = iC.consumes<double>(iConfig.getParameter<edm::InputTag>("rho"));
129  tree_->Branch("event_rho", &rho_, "rho/F");
130  }
131 }
132 
134  const edm::ParameterSet &iConfig,
136  const std::string &branchNamePrefix)
137  : addRunLumiInfo_(false), addEventVariablesInfo_(false), tree_(nullptr) {
138  addRunLumiInfo_ = main.addRunLumiInfo_;
139  storePUweight_ = main.storePUweight_;
140  addBranches_(main.tree_, iConfig, iC, branchNamePrefix);
141 }
142 
144  const edm::ParameterSet &iConfig,
146  const std::string &branchNamePrefix) {
147  // set up variables
149  //.. the ones that are strings
150  std::vector<std::string> stringVars = variables.getParameterNamesForType<std::string>();
151  for (std::vector<std::string>::const_iterator it = stringVars.begin(), ed = stringVars.end(); it != ed; ++it) {
152  vars_.push_back(tnp::ProbeVariable(branchNamePrefix + *it, variables.getParameter<std::string>(*it)));
153  }
154  //.. the ones that are InputTags
155  std::vector<std::string> inputTagVars = variables.getParameterNamesForType<edm::InputTag>();
156  for (std::vector<std::string>::const_iterator it = inputTagVars.begin(), ed = inputTagVars.end(); it != ed; ++it) {
157  vars_.push_back(tnp::ProbeVariable(branchNamePrefix + *it,
158  iC.consumes<edm::ValueMap<float> >(variables.getParameter<edm::InputTag>(*it))));
159  }
160  // set up flags
162  //.. the ones that are strings
163  std::vector<std::string> stringFlags = flags.getParameterNamesForType<std::string>();
164  for (std::vector<std::string>::const_iterator it = stringFlags.begin(), ed = stringFlags.end(); it != ed; ++it) {
165  flags_.push_back(tnp::ProbeFlag(branchNamePrefix + *it, flags.getParameter<std::string>(*it)));
166  }
167  //.. the ones that are InputTags
168  std::vector<std::string> inputTagFlags = flags.getParameterNamesForType<edm::InputTag>();
169  for (std::vector<std::string>::const_iterator it = inputTagFlags.begin(), ed = inputTagFlags.end(); it != ed; ++it) {
170  flags_.push_back(tnp::ProbeFlag(branchNamePrefix + *it,
171  iC.consumes<edm::View<reco::Candidate> >(flags.getParameter<edm::InputTag>(*it))));
172  }
173 
174  // then make all the variables in the trees
175  for (std::vector<tnp::ProbeVariable>::iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
176  tree->Branch(it->name().c_str(), it->address(), (it->name() + "/F").c_str());
177  }
178 
179  for (std::vector<tnp::ProbeFlag>::iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
180  tree->Branch(it->name().c_str(), it->address(), (it->name() + "/I").c_str());
181  }
182 }
183 
185 
187  run_ = iEvent.id().run();
188  lumi_ = iEvent.id().luminosityBlock();
189  event_ = iEvent.id().event();
190 
191  truePU_ = 0;
192  if (!iEvent.isRealData() and !pileupInfoToken_.isUninitialized()) {
194  iEvent.getByToken(pileupInfoToken_, PupInfo);
195  truePU_ = PupInfo->begin()->getTrueNumInteractions();
196  }
197 
198  totWeight_ = 1.;
199  for (std::vector<tnp::ProbeVariable>::const_iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
200  it->init(iEvent);
201  }
202  for (std::vector<tnp::ProbeFlag>::const_iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
203  it->init(iEvent);
204  }
205  for (int i = 0; i < 5; i++) {
206  psWeight_[i] = 1.; // init
207  }
208  if (weightMode_ == External) {
209  // edm::Handle<double> weight;
210  // iEvent.getByToken(weightSrcToken_, weight);
211  // weight_ = *weight;
213  iEvent.getByToken(weightSrcToken_, weight);
214  weight_ = weight->weight();
215  totWeight_ *= weight_;
216  if (weight->weights().size() >= 10) {
217  int k = 1;
218  for (int i = 6; i < 10; i++) {
219  // hardcoded Pythia 8 isrDefHi,fsrDefHi,isrDefLo,fsrDefLo
220  psWeight_[k] = weight->weights().at(i) / weight->weight();
221  k++;
222  }
223  }
224  }
225 
226  for (unsigned int i = 0; i < 9; i++) {
227  lheWeight_[i] = 1.; // init
228  }
229  lhe_ht_ = 0.;
230  if (LHEinfo_ and !_LHECollection.isUninitialized()) {
231  edm::Handle<LHEEventProduct> lheEventHandle;
232  iEvent.getByToken(_LHECollection, lheEventHandle);
233  for (unsigned int i = 0; i < 9; i++) {
234  lheWeight_[i] = lheEventHandle->weights().at(i).wgt / lheEventHandle->originalXWGTUP();
235  }
236  for (int i = 0; i < lheEventHandle->hepeup().NUP; i++) {
237  int id = lheEventHandle->hepeup().IDUP[i];
238  int st = lheEventHandle->hepeup().ISTUP[i];
239 
240  // calculate HT at LHE level
241  if ((abs(id) < 6 || id == 21) && st > 0) {
242  lhe_ht_ += sqrt(pow(lheEventHandle->hepeup().PUP[i][0], 2) + pow(lheEventHandle->hepeup().PUP[i][1], 2));
243  }
244  }
245  }
246 
248  PUweight_ = 1;
249  if (storePUweight_ and !PUweightSrcToken_.isUninitialized()) {
250  edm::Handle<double> weightPU;
251  bool isPresent = iEvent.getByToken(PUweightSrcToken_, weightPU);
252  if (isPresent)
253  PUweight_ = float(*weightPU);
254  totWeight_ *= PUweight_;
255  }
256 
257  if (addEventVariablesInfo_) {
261  iEvent.getByToken(recVtxsToken_, recVtxs);
262  mNPV_ = 0;
263  mPVx_ = 100.0;
264  mPVy_ = 100.0;
265  mPVz_ = 100.0;
266 
267  for (unsigned int ind = 0; ind < recVtxs->size(); ind++) {
268  if (!((*recVtxs)[ind].isFake()) && ((*recVtxs)[ind].ndof() > 4) && (fabs((*recVtxs)[ind].z()) <= 24.0) &&
269  ((*recVtxs)[ind].position().Rho() <= 2.0)) {
270  mNPV_++;
271  if (mNPV_ == 1) { // store the first good primary vertex
272  mPVx_ = (*recVtxs)[ind].x();
273  mPVy_ = (*recVtxs)[ind].y();
274  mPVz_ = (*recVtxs)[ind].z();
275  }
276  }
277  }
278 
281  iEvent.getByToken(beamSpotToken_, beamSpot);
282  mBSx_ = beamSpot->position().X();
283  mBSy_ = beamSpot->position().Y();
284  mBSz_ = beamSpot->position().Z();
285 
286  if (addCaloMet_) {
289  iEvent.getByToken(metToken_, met);
290  if (met->empty()) {
291  mMET_ = -1;
292  mSumET_ = -1;
293  mMETSign_ = -1;
294  } else {
295  mMET_ = (*met)[0].et();
296  mSumET_ = (*met)[0].sumEt();
297  mMETSign_ = (*met)[0].significance();
298  }
299 
302  iEvent.getByToken(tcmetToken_, tcmet);
303  if (tcmet->empty()) {
304  mtcMET_ = -1;
305  mtcSumET_ = -1;
306  mtcMETSign_ = -1;
307  } else {
308  mtcMET_ = (*tcmet)[0].et();
309  mtcSumET_ = (*tcmet)[0].sumEt();
310  mtcMETSign_ = (*tcmet)[0].significance();
311  }
312  }
313 
316  iEvent.getByToken(pfmetToken_, pfmet);
317  if (pfmet.isValid()) {
318  if (pfmet->empty()) {
319  mpfMET_ = -1;
320  mpfSumET_ = -1;
321  mpfMETSign_ = -1;
322  } else {
323  mpfMET_ = (*pfmet)[0].et();
324  mpfPhi_ = (*pfmet)[0].phi();
325  mpfSumET_ = (*pfmet)[0].sumEt();
326  mpfMETSign_ = (*pfmet)[0].significance();
327  }
328  } else {
330  iEvent.getByToken(pfmetTokenMiniAOD_, pfmet2);
331  const pat::MET &met = pfmet2->front();
332  mpfMET_ = met.pt();
333  mpfPhi_ = met.phi();
334  mpfSumET_ = met.sumEt();
335  mpfMETSign_ = met.significance();
336  }
337 
338  if (addRho_) {
339  edm::Handle<double> rhos;
340  iEvent.getByToken(rhoToken_, rhos);
341  rho_ = (float)*rhos;
342  }
343  }
344 }
345 
347  for (auto const &var : vars_)
348  var.fill(probe);
349  for (auto const &flag : flags_)
350  flag.fill(probe);
351 
352  if (tree_)
353  tree_->Fill();
354 }
356  TList *list = tree_->GetUserInfo();
357  list->Add(new TObjString(pset.dump().c_str()));
358 }
void fill(const reco::CandidateBaseRef &probe) const
To be called for each item.
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
Analysis-level MET class.
Definition: MET.h:40
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
EDGetTokenT< ProductType > mayConsume(edm::InputTag const &tag)
bool addRunLumiInfo_
Add branches with run and lumisection number.
double originalXWGTUP() const
std::vector< MET > METCollection
Definition: MET.h:31
~ProbeFlag()
Destructor (does nothing)
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
Definition: weight.py:1
constexpr int pow(int x)
Definition: conifer.h:24
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:171
void fill(const reco::CandidateBaseRef &probe) const
To be called once per probe, to fill the values for this probe.
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
BaseTreeFiller(const BaseTreeFiller &)=delete
std::vector< reco::MET > METCollection
collection of MET objects
Definition: METCollection.h:22
A variable for the probe: can be a string expression or an external ValueMap<float> ...
~BaseTreeFiller()
Destructor, does nothing but it&#39;s out-of-line as we have complex data members.
int iEvent
Definition: GenABIO.cc:224
T sqrt(T t)
Definition: SSEVec.h:19
std::vector< FiveVector > PUP
Definition: LesHouches.h:246
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< int > ISTUP
Definition: LesHouches.h:228
std::vector< int > IDUP
Definition: LesHouches.h:223
void init(const edm::Event &iEvent) const
To be called at the beginning of the event (will fetch Candidate View if needed)
~ProbeVariable()
Destructor (does nothing)
void addBranches_(TTree *tree, const edm::ParameterSet &iConfig, edm::ConsumesCollector &iC, const std::string &branchNamePrefix="")
std::vector< reco::CaloMET > CaloMETCollection
collection of CaloMET objects
void writeProvenance(const edm::ParameterSet &pset) const
bool isValid() const
Definition: HandleBase.h:70
std::vector< reco::PFMET > PFMETCollection
collection of PFMET objects
void init(const edm::Event &iEvent) const
To be called once per event, to load possible external variables.
Definition: main.py:1
Definition: tree.py:1
bool storePUweight_
Store Pileup weight when running over Monte Carlo.
const std::vector< WGT > & weights() const
const lhef::HEPEUP & hepeup() const