CMS 3D CMS Logo

BaseTreeFiller.cc
Go to the documentation of this file.
4 
6 
7 #include <TList.h>
8 #include <TObjString.h>
9 
10 #include <iostream>
11 using namespace std;
12 
14 
16 
18  if (external_) {
20  iEvent.getByToken(srcToken_, view);
21  passingProbes_.clear();
22  for (size_t i = 0, n = view->size(); i < n; ++i)
23  passingProbes_.push_back(view->refAt(i));
24  }
25 }
26 
27 void tnp::ProbeFlag::fill(const reco::CandidateBaseRef &probe) const {
28  if (external_) {
29  value_ = (std::find(passingProbes_.begin(), passingProbes_.end(), probe) != passingProbes_.end());
30  } else {
31  value_ = bool(cut_(*probe));
32  }
33 }
34 
36  // make trees as requested
38  tree_ = fs->make<TTree>(name, name);
39 
40  // add the branches
41  addBranches_(tree_, iConfig, iC, "");
42 
43  // set up weights, if needed
44  if (iConfig.existsAs<double>("eventWeight")) {
45  weightMode_ = Fixed;
46  weight_ = iConfig.getParameter<double>("eventWeight");
47  } else if (iConfig.existsAs<edm::InputTag>("eventWeight")) {
48  weightMode_ = External;
49  weightSrcToken_ = iC.consumes<GenEventInfoProduct>(iConfig.getParameter<edm::InputTag>("eventWeight"));
50  } else {
51  weightMode_ = None;
52  }
53  if (weightMode_ != None) {
54  tree_->Branch("weight", &weight_, "weight/F");
55  tree_->Branch("totWeight", &totWeight_, "totWeight/F");
56  }
57 
58  storePUweight_ = iConfig.existsAs<edm::InputTag>("PUWeightSrc") ? true : false;
59  if (storePUweight_) {
60  PUweightSrcToken_ = iC.consumes<double>(iConfig.getParameter<edm::InputTag>("PUWeightSrc"));
61  tree_->Branch("PUweight", &PUweight_, "PUweight/F");
62  }
63 
64  if (iConfig.existsAs<edm::InputTag>("pileupInfoTag"))
65  pileupInfoToken_ =
66  iC.consumes<std::vector<PileupSummaryInfo> >(iConfig.getParameter<edm::InputTag>("pileupInfoTag"));
67 
68  addRunLumiInfo_ = iConfig.existsAs<bool>("addRunLumiInfo") ? iConfig.getParameter<bool>("addRunLumiInfo") : false;
69  if (addRunLumiInfo_) {
70  tree_->Branch("run", &run_, "run/i");
71  tree_->Branch("lumi", &lumi_, "lumi/i");
72  tree_->Branch("event", &event_, "event/l");
73  tree_->Branch("truePU", &truePU_, "truePU/I");
74  }
75  addEventVariablesInfo_ =
76  iConfig.existsAs<bool>("addEventVariablesInfo") ? iConfig.getParameter<bool>("addEventVariablesInfo") : false;
77  if (addEventVariablesInfo_) {
79  edm::InputTag bsIT = iConfig.existsAs<edm::InputTag>("beamSpot") ? iConfig.getParameter<edm::InputTag>("beamSpot")
80  : edm::InputTag("offlineBeamSpot");
81  edm::InputTag vtxIT = iConfig.existsAs<edm::InputTag>("vertexCollection")
82  ? iConfig.getParameter<edm::InputTag>("vertexCollection")
83  : edm::InputTag("offlinePrimaryVertices");
84  edm::InputTag pfMetIT = iConfig.existsAs<edm::InputTag>("pfMet") ? iConfig.getParameter<edm::InputTag>("pfMet")
85  : edm::InputTag("pfMet");
86  edm::InputTag tcMetIT = iConfig.existsAs<edm::InputTag>("tcMet") ? iConfig.getParameter<edm::InputTag>("tcMet")
87  : edm::InputTag("tcMet");
88  edm::InputTag clMetIT =
89  iConfig.existsAs<edm::InputTag>("clMet") ? iConfig.getParameter<edm::InputTag>("clMet") : edm::InputTag("met");
90 
91  recVtxsToken_ = iC.consumes<reco::VertexCollection>(vtxIT);
92  beamSpotToken_ = iC.consumes<reco::BeamSpot>(bsIT);
93  pfmetToken_ = iC.mayConsume<reco::PFMETCollection>(pfMetIT);
94  pfmetTokenMiniAOD_ = iC.mayConsume<pat::METCollection>(pfMetIT);
95  addCaloMet_ = iConfig.existsAs<bool>("addCaloMet") ? iConfig.getParameter<bool>("addCaloMet") : true;
96  tree_->Branch("event_nPV", &mNPV_, "mNPV/I");
97  if (addCaloMet_) {
98  metToken_ = iC.mayConsume<reco::CaloMETCollection>(clMetIT);
99  tcmetToken_ = iC.mayConsume<reco::METCollection>(tcMetIT);
100  tree_->Branch("event_met_calomet", &mMET_, "mMET/F");
101  tree_->Branch("event_met_calosumet", &mSumET_, "mSumET/F");
102  tree_->Branch("event_met_calometsignificance", &mMETSign_, "mMETSign/F");
103  tree_->Branch("event_met_tcmet", &mtcMET_, "mtcMET/F");
104  tree_->Branch("event_met_tcsumet", &mtcSumET_, "mtcSumET/F");
105  tree_->Branch("event_met_tcmetsignificance", &mtcMETSign_, "mtcMETSign/F");
106  }
107  tree_->Branch("event_met_pfmet", &mpfMET_, "mpfMET/F");
108  tree_->Branch("event_met_pfphi", &mpfPhi_, "mpfPhi/F");
109  tree_->Branch("event_met_pfsumet", &mpfSumET_, "mpfSumET/F");
110 
111  tree_->Branch("event_met_pfmetsignificance", &mpfMETSign_, "mpfMETSign/F");
112  tree_->Branch("event_PrimaryVertex_x", &mPVx_, "mPVx/F");
113  tree_->Branch("event_PrimaryVertex_y", &mPVy_, "mPVy/F");
114  tree_->Branch("event_PrimaryVertex_z", &mPVz_, "mPVz/F");
115  tree_->Branch("event_BeamSpot_x", &mBSx_, "mBSx/F");
116  tree_->Branch("event_BeamSpot_y", &mBSy_, "mBSy/F");
117  tree_->Branch("event_BeamSpot_z", &mBSz_, "mBSz/F");
118  }
119 
120  addRho_ = iConfig.existsAs<edm::InputTag>("rho") ? true : false;
121  if (addRho_) {
122  rhoToken_ = iC.consumes<double>(iConfig.getParameter<edm::InputTag>("rho"));
123  tree_->Branch("event_rho", &rho_, "rho/F");
124  }
125 }
126 
128  const edm::ParameterSet &iConfig,
130  const std::string &branchNamePrefix)
131  : addRunLumiInfo_(false), addEventVariablesInfo_(false), tree_(nullptr) {
132  addRunLumiInfo_ = main.addRunLumiInfo_;
133  storePUweight_ = main.storePUweight_;
134  addBranches_(main.tree_, iConfig, iC, branchNamePrefix);
135 }
136 
138  const edm::ParameterSet &iConfig,
140  const std::string &branchNamePrefix) {
141  // set up variables
143  //.. the ones that are strings
144  std::vector<std::string> stringVars = variables.getParameterNamesForType<std::string>();
145  for (std::vector<std::string>::const_iterator it = stringVars.begin(), ed = stringVars.end(); it != ed; ++it) {
146  vars_.push_back(tnp::ProbeVariable(branchNamePrefix + *it, variables.getParameter<std::string>(*it)));
147  }
148  //.. the ones that are InputTags
149  std::vector<std::string> inputTagVars = variables.getParameterNamesForType<edm::InputTag>();
150  for (std::vector<std::string>::const_iterator it = inputTagVars.begin(), ed = inputTagVars.end(); it != ed; ++it) {
151  vars_.push_back(tnp::ProbeVariable(branchNamePrefix + *it,
152  iC.consumes<edm::ValueMap<float> >(variables.getParameter<edm::InputTag>(*it))));
153  }
154  // set up flags
156  //.. the ones that are strings
157  std::vector<std::string> stringFlags = flags.getParameterNamesForType<std::string>();
158  for (std::vector<std::string>::const_iterator it = stringFlags.begin(), ed = stringFlags.end(); it != ed; ++it) {
159  flags_.push_back(tnp::ProbeFlag(branchNamePrefix + *it, flags.getParameter<std::string>(*it)));
160  }
161  //.. the ones that are InputTags
162  std::vector<std::string> inputTagFlags = flags.getParameterNamesForType<edm::InputTag>();
163  for (std::vector<std::string>::const_iterator it = inputTagFlags.begin(), ed = inputTagFlags.end(); it != ed; ++it) {
164  flags_.push_back(tnp::ProbeFlag(branchNamePrefix + *it,
165  iC.consumes<edm::View<reco::Candidate> >(flags.getParameter<edm::InputTag>(*it))));
166  }
167 
168  // then make all the variables in the trees
169  for (std::vector<tnp::ProbeVariable>::iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
170  tree->Branch(it->name().c_str(), it->address(), (it->name() + "/F").c_str());
171  }
172 
173  for (std::vector<tnp::ProbeFlag>::iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
174  tree->Branch(it->name().c_str(), it->address(), (it->name() + "/I").c_str());
175  }
176 }
177 
179 
181  run_ = iEvent.id().run();
182  lumi_ = iEvent.id().luminosityBlock();
183  event_ = iEvent.id().event();
184 
185  truePU_ = 0;
186  if (!iEvent.isRealData() and !pileupInfoToken_.isUninitialized()) {
188  iEvent.getByToken(pileupInfoToken_, PupInfo);
189  truePU_ = PupInfo->begin()->getTrueNumInteractions();
190  }
191 
192  totWeight_ = 1.;
193  for (std::vector<tnp::ProbeVariable>::const_iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
194  it->init(iEvent);
195  }
196  for (std::vector<tnp::ProbeFlag>::const_iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
197  it->init(iEvent);
198  }
199  if (weightMode_ == External) {
200  // edm::Handle<double> weight;
201  // iEvent.getByToken(weightSrcToken_, weight);
202  // weight_ = *weight;
204  iEvent.getByToken(weightSrcToken_, weight);
205  weight_ = weight->weight();
206  totWeight_ *= weight_;
207  }
208 
210  PUweight_ = 1;
211  if (storePUweight_ and !PUweightSrcToken_.isUninitialized()) {
212  edm::Handle<double> weightPU;
213  bool isPresent = iEvent.getByToken(PUweightSrcToken_, weightPU);
214  if (isPresent)
215  PUweight_ = float(*weightPU);
216  totWeight_ *= PUweight_;
217  }
218 
219  if (addEventVariablesInfo_) {
223  iEvent.getByToken(recVtxsToken_, recVtxs);
224  mNPV_ = 0;
225  mPVx_ = 100.0;
226  mPVy_ = 100.0;
227  mPVz_ = 100.0;
228 
229  for (unsigned int ind = 0; ind < recVtxs->size(); ind++) {
230  if (!((*recVtxs)[ind].isFake()) && ((*recVtxs)[ind].ndof() > 4) && (fabs((*recVtxs)[ind].z()) <= 24.0) &&
231  ((*recVtxs)[ind].position().Rho() <= 2.0)) {
232  mNPV_++;
233  if (mNPV_ == 1) { // store the first good primary vertex
234  mPVx_ = (*recVtxs)[ind].x();
235  mPVy_ = (*recVtxs)[ind].y();
236  mPVz_ = (*recVtxs)[ind].z();
237  }
238  }
239  }
240 
243  iEvent.getByToken(beamSpotToken_, beamSpot);
244  mBSx_ = beamSpot->position().X();
245  mBSy_ = beamSpot->position().Y();
246  mBSz_ = beamSpot->position().Z();
247 
248  if (addCaloMet_) {
251  iEvent.getByToken(metToken_, met);
252  if (met->empty()) {
253  mMET_ = -1;
254  mSumET_ = -1;
255  mMETSign_ = -1;
256  } else {
257  mMET_ = (*met)[0].et();
258  mSumET_ = (*met)[0].sumEt();
259  mMETSign_ = (*met)[0].significance();
260  }
261 
264  iEvent.getByToken(tcmetToken_, tcmet);
265  if (tcmet->empty()) {
266  mtcMET_ = -1;
267  mtcSumET_ = -1;
268  mtcMETSign_ = -1;
269  } else {
270  mtcMET_ = (*tcmet)[0].et();
271  mtcSumET_ = (*tcmet)[0].sumEt();
272  mtcMETSign_ = (*tcmet)[0].significance();
273  }
274  }
275 
278  iEvent.getByToken(pfmetToken_, pfmet);
279  if (pfmet.isValid()) {
280  if (pfmet->empty()) {
281  mpfMET_ = -1;
282  mpfSumET_ = -1;
283  mpfMETSign_ = -1;
284  } else {
285  mpfMET_ = (*pfmet)[0].et();
286  mpfPhi_ = (*pfmet)[0].phi();
287  mpfSumET_ = (*pfmet)[0].sumEt();
288  mpfMETSign_ = (*pfmet)[0].significance();
289  }
290  } else {
292  iEvent.getByToken(pfmetTokenMiniAOD_, pfmet2);
293  const pat::MET &met = pfmet2->front();
294  mpfMET_ = met.pt();
295  mpfPhi_ = met.phi();
296  mpfSumET_ = met.sumEt();
297  mpfMETSign_ = met.significance();
298  }
299 
300  if (addRho_) {
301  edm::Handle<double> rhos;
302  iEvent.getByToken(rhoToken_, rhos);
303  rho_ = (float)*rhos;
304  }
305  }
306 }
307 
309  for (auto const &var : vars_)
310  var.fill(probe);
311  for (auto const &flag : flags_)
312  flag.fill(probe);
313 
314  if (tree_)
315  tree_->Fill();
316 }
318  TList *list = tree_->GetUserInfo();
319  list->Add(new TObjString(pset.dump().c_str()));
320 }
GenEventInfoProduct
Definition: GenEventInfoProduct.h:17
reco::PFMETCollection
std::vector< reco::PFMET > PFMETCollection
collection of PFMET objects
Definition: PFMETCollection.h:20
electrons_cff.bool
bool
Definition: electrons_cff.py:372
mps_fire.i
i
Definition: mps_fire.py:355
pwdgSkimBPark_cfi.beamSpot
beamSpot
Definition: pwdgSkimBPark_cfi.py:5
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
funct::false
false
Definition: Factorize.h:34
dqmiodumpmetadata.n
n
Definition: dqmiodumpmetadata.py:28
tnp::BaseTreeFiller::init
void init(const edm::Event &iEvent) const
To be called once per event, to load possible external variables.
Definition: BaseTreeFiller.cc:180
tnp::BaseTreeFiller::~BaseTreeFiller
~BaseTreeFiller()
Destructor, does nothing but it's out-of-line as we have complex data members.
Definition: BaseTreeFiller.cc:178
tnp::ProbeFlag
Definition: BaseTreeFiller.h:93
L1TEGammaDiff_cfi.variables
variables
Definition: L1TEGammaDiff_cfi.py:5
mps_merge.weight
weight
Definition: mps_merge.py:88
tree
Definition: tree.py:1
reco::VertexCollection
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
tnp::BaseTreeFiller::storePUweight_
bool storePUweight_
Store Pileup weight when running over Monte Carlo.
Definition: BaseTreeFiller.h:191
edm::ParameterSet::existsAs
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:160
spr::find
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
edm::Handle
Definition: AssociativeIterator.h:50
ColinsSoperVariables.h
BTaggingMonitor_cfi.met
met
Definition: BTaggingMonitor_cfi.py:84
reco::METCollection
std::vector< reco::MET > METCollection
collection of MET objects
Definition: METCollection.h:22
trigObjTnPSource_cfi.var
var
Definition: trigObjTnPSource_cfi.py:21
None
Definition: APVGainStruct.h:52
tnp::BaseTreeFiller::addRunLumiInfo_
bool addRunLumiInfo_
Add branches with run and lumisection number.
Definition: BaseTreeFiller.h:188
tnp::BaseTreeFiller::writeProvenance
void writeProvenance(const edm::ParameterSet &pset) const
Definition: BaseTreeFiller.cc:317
Service.h
reco::BeamSpot
Definition: BeamSpot.h:21
edm::ConsumesCollector::consumes
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
Definition: ConsumesCollector.h:49
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
TFileService.h
edm::View
Definition: CaloClusterFwd.h:14
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
tnp::BaseTreeFiller::fill
void fill(const reco::CandidateBaseRef &probe) const
To be called once per probe, to fill the values for this probe.
Definition: BaseTreeFiller.cc:308
edm::ConsumesCollector::mayConsume
EDGetTokenT< ProductType > mayConsume(edm::InputTag const &tag)
Definition: ConsumesCollector.h:61
event_
void event_()
edm::Service< TFileService >
iEvent
int iEvent
Definition: GenABIO.cc:224
pat::MET
Analysis-level MET class.
Definition: MET.h:40
tnp::ProbeFlag::fill
void fill(const reco::CandidateBaseRef &probe) const
To be called for each item.
Definition: BaseTreeFiller.cc:27
tnp::BaseTreeFiller::BaseTreeFiller
BaseTreeFiller(const char *name, const edm::ParameterSet &config, edm::ConsumesCollector &&iC)
specify the name of the TTree, and the configuration for it
Definition: BaseTreeFiller.h:140
pat::METCollection
std::vector< MET > METCollection
Definition: MET.h:31
tnp::ProbeFlag::~ProbeFlag
~ProbeFlag()
Destructor (does nothing)
Definition: BaseTreeFiller.cc:15
main
Definition: main.py:1
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
std
Definition: JetResolutionObject.h:76
BaseTreeFiller.h
tnp::BaseTreeFiller
Definition: BaseTreeFiller.h:137
edm::ValueMap< float >
tnp::ProbeVariable::~ProbeVariable
~ProbeVariable()
Destructor (does nothing)
Definition: BaseTreeFiller.cc:13
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
edm::RefToBase< Candidate >
list
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*", "!HLTx*" if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL. It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of "!*" before the partial wildcard feature was incorporated). Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
reco::CaloMETCollection
std::vector< reco::CaloMET > CaloMETCollection
collection of CaloMET objects
Definition: CaloMETCollection.h:20
tnp::ProbeVariable
A variable for the probe: can be a string expression or an external ValueMap<float>
Definition: BaseTreeFiller.h:44
edm::HandleBase::isValid
bool isValid() const
Definition: HandleBase.h:70
tnp::BaseTreeFiller::addBranches_
void addBranches_(TTree *tree, const edm::ParameterSet &iConfig, edm::ConsumesCollector &iC, const std::string &branchNamePrefix="")
Definition: BaseTreeFiller.cc:137
edm::Event
Definition: Event.h:73
HLT_2018_cff.flags
flags
Definition: HLT_2018_cff.py:11758
edm::InputTag
Definition: InputTag.h:15
edm::ConsumesCollector
Definition: ConsumesCollector.h:39
weight
Definition: weight.py:1
TFileService::make
T * make(const Args &... args) const
make new ROOT object
Definition: TFileService.h:64
muonDTDigis_cfi.pset
pset
Definition: muonDTDigis_cfi.py:27
RemoveAddSevLevel.flag
flag
Definition: RemoveAddSevLevel.py:116
tnp::ProbeFlag::init
void init(const edm::Event &iEvent) const
To be called at the beginning of the event (will fetch Candidate View if needed)
Definition: BaseTreeFiller.cc:17