CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
BaseTreeFiller.cc
Go to the documentation of this file.
4 
6 
7 #include <TList.h>
8 #include <TObjString.h>
9 
11 
13 
15  if (external_) {
17  iEvent.getByToken(srcToken_, view);
18  passingProbes_.clear();
19  for (size_t i = 0, n = view->size(); i < n; ++i) passingProbes_.push_back(view->refAt(i));
20  }
21 
22 }
23 
24 void tnp::ProbeFlag::fill(const reco::CandidateBaseRef &probe) const {
25  if (external_) {
26  value_ = (std::find(passingProbes_.begin(), passingProbes_.end(), probe) != passingProbes_.end());
27  } else {
28  value_ = bool(cut_(*probe));
29  }
30 }
31 
33  // make trees as requested
35  tree_ = fs->make<TTree>(name,name);
36 
37  // add the branches
38  addBranches_(tree_, iConfig, iC, "");
39 
40  // set up weights, if needed
41  if (iConfig.existsAs<double>("eventWeight")) {
42  weightMode_ = Fixed;
43  weight_ = iConfig.getParameter<double>("eventWeight");
44  } else if (iConfig.existsAs<edm::InputTag>("eventWeight")) {
45  weightMode_ = External;
46  weightSrcToken_ = iC.consumes<double>(iConfig.getParameter<edm::InputTag>("eventWeight"));
47  } else {
48  weightMode_ = None;
49  }
50  if (weightMode_ != None) {
51  tree_->Branch("weight", &weight_, "weight/F");
52  }
53  storePUweight_ = iConfig.existsAs<edm::InputTag>("PUWeightSrc") ? true: false;
54  if(storePUweight_) {
55  PUweightSrcToken_ = iC.consumes<double>(iConfig.getParameter<edm::InputTag>("PUWeightSrc"));
56  tree_->Branch("PUweight", &PUweight_, "PUweight/F");
57  }
58 
59  addRunLumiInfo_ = iConfig.existsAs<bool>("addRunLumiInfo") ? iConfig.getParameter<bool>("addRunLumiInfo") : false;
60  if (addRunLumiInfo_) {
61  tree_->Branch("run", &run_, "run/i");
62  tree_->Branch("lumi", &lumi_, "lumi/i");
63  tree_->Branch("event", &event_, "event/l");
64  }
65  addEventVariablesInfo_ = iConfig.existsAs<bool>("addEventVariablesInfo") ? iConfig.getParameter<bool>("addEventVariablesInfo") : false;
66  if (addEventVariablesInfo_) {
67  recVtxsToken_ = iC.consumes<reco::VertexCollection>(edm::InputTag("offlinePrimaryVertices"));
68  beamSpotToken_ = iC.consumes<reco::BeamSpot>(edm::InputTag("offlineBeamSpot"));
69  metToken_ = iC.consumes<reco::CaloMETCollection>(edm::InputTag("met"));
70  tcmetToken_ = iC.consumes<reco::METCollection>(edm::InputTag("tcMet"));
71  pfmetToken_ = iC.consumes<reco::PFMETCollection>(edm::InputTag("pfMet"));
72  tree_->Branch("event_nPV" ,&mNPV_ ,"mNPV/I");
73  tree_->Branch("event_met_calomet" ,&mMET_ ,"mMET/F");
74  tree_->Branch("event_met_calosumet" ,&mSumET_ ,"mSumET/F");
75  tree_->Branch("event_met_calometsignificance",&mMETSign_ ,"mMETSign/F");
76  tree_->Branch("event_met_tcmet" ,&mtcMET_ ,"mtcMET/F");
77  tree_->Branch("event_met_tcsumet" ,&mtcSumET_ ,"mtcSumET/F");
78  tree_->Branch("event_met_tcmetsignificance",&mtcMETSign_ ,"mtcMETSign/F");
79  tree_->Branch("event_met_pfmet" ,&mpfMET_ ,"mpfMET/F");
80  tree_->Branch("event_met_pfsumet" ,&mpfSumET_ ,"mpfSumET/F");
81  tree_->Branch("event_met_pfmetsignificance",&mpfMETSign_ ,"mpfMETSign/F");
82  tree_->Branch("event_PrimaryVertex_x" ,&mPVx_ ,"mPVx/F");
83  tree_->Branch("event_PrimaryVertex_y" ,&mPVy_ ,"mPVy/F");
84  tree_->Branch("event_PrimaryVertex_z" ,&mPVz_ ,"mPVz/F");
85  tree_->Branch("event_BeamSpot_x" ,&mBSx_ ,"mBSx/F");
86  tree_->Branch("event_BeamSpot_y" ,&mBSy_ ,"mBSy/F");
87  tree_->Branch("event_BeamSpot_z" ,&mBSz_ ,"mBSz/F");
88  }
89 
90  ignoreExceptions_ = iConfig.existsAs<bool>("ignoreExceptions") ? iConfig.getParameter<bool>("ignoreExceptions") : false;
91 }
92 
94  addRunLumiInfo_(false),
95  addEventVariablesInfo_(false),
96  tree_(0)
97 {
100  addBranches_(main.tree_, iConfig, iC, branchNamePrefix);
101 }
102 
103 void
104 tnp::BaseTreeFiller::addBranches_(TTree *tree, const edm::ParameterSet &iConfig, edm::ConsumesCollector & iC, const std::string &branchNamePrefix) {
105  // set up variables
107  //.. the ones that are strings
108  std::vector<std::string> stringVars = variables.getParameterNamesForType<std::string>();
109  for (std::vector<std::string>::const_iterator it = stringVars.begin(), ed = stringVars.end(); it != ed; ++it) {
110  vars_.push_back(tnp::ProbeVariable(branchNamePrefix + *it, variables.getParameter<std::string>(*it)));
111  }
112  //.. the ones that are InputTags
113  std::vector<std::string> inputTagVars = variables.getParameterNamesForType<edm::InputTag>();
114  for (std::vector<std::string>::const_iterator it = inputTagVars.begin(), ed = inputTagVars.end(); it != ed; ++it) {
115  vars_.push_back(tnp::ProbeVariable(branchNamePrefix + *it, iC.consumes<edm::ValueMap<float> >(variables.getParameter<edm::InputTag>(*it))));
116  }
117  // set up flags
119  //.. the ones that are strings
120  std::vector<std::string> stringFlags = flags.getParameterNamesForType<std::string>();
121  for (std::vector<std::string>::const_iterator it = stringFlags.begin(), ed = stringFlags.end(); it != ed; ++it) {
122  flags_.push_back(tnp::ProbeFlag(branchNamePrefix + *it, flags.getParameter<std::string>(*it)));
123  }
124  //.. the ones that are InputTags
125  std::vector<std::string> inputTagFlags = flags.getParameterNamesForType<edm::InputTag>();
126  for (std::vector<std::string>::const_iterator it = inputTagFlags.begin(), ed = inputTagFlags.end(); it != ed; ++it) {
127  flags_.push_back(tnp::ProbeFlag(branchNamePrefix + *it, iC.consumes<edm::View<reco::Candidate> >(flags.getParameter<edm::InputTag>(*it))));
128  }
129 
130  // then make all the variables in the trees
131  for (std::vector<tnp::ProbeVariable>::iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
132  tree->Branch(it->name().c_str(), it->address(), (it->name()+"/F").c_str());
133  }
134 
135  for (std::vector<tnp::ProbeFlag>::iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
136  tree->Branch(it->name().c_str(), it->address(), (it->name()+"/I").c_str());
137  }
138 
139 }
140 
142 
144  run_ = iEvent.id().run();
145  lumi_ = iEvent.id().luminosityBlock();
146  event_ = iEvent.id().event();
147 
148  for (std::vector<tnp::ProbeVariable>::const_iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
149  it->init(iEvent);
150  }
151  for (std::vector<tnp::ProbeFlag>::const_iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
152  it->init(iEvent);
153  }
154  if (weightMode_ == External) {
156  iEvent.getByToken(weightSrcToken_, weight);
157  weight_ = *weight;
158  }
159 
162  if(storePUweight_) {
163  bool isPresent = iEvent.getByToken(PUweightSrcToken_, weightPU);
164  if(isPresent) PUweight_ = (*weightPU).at(0);
165  else PUweight_ = 1.0;
166  }
167 
168  if (addEventVariablesInfo_) {
172  iEvent.getByToken(recVtxsToken_,recVtxs);
173  mNPV_ = 0;
174  mPVx_ = 100.0;
175  mPVy_ = 100.0;
176  mPVz_ = 100.0;
177 
178  for(unsigned int ind=0;ind<recVtxs->size();ind++) {
179  if (!((*recVtxs)[ind].isFake()) && ((*recVtxs)[ind].ndof()>4)
180  && (fabs((*recVtxs)[ind].z())<=24.0) &&
181  ((*recVtxs)[ind].position().Rho()<=2.0) ) {
182  mNPV_++;
183  if(mNPV_==1) { // store the first good primary vertex
184  mPVx_ = (*recVtxs)[ind].x();
185  mPVy_ = (*recVtxs)[ind].y();
186  mPVz_ = (*recVtxs)[ind].z();
187  }
188  }
189  }
190 
191 
194  iEvent.getByToken(beamSpotToken_, beamSpot);
195  mBSx_ = beamSpot->position().X();
196  mBSy_ = beamSpot->position().Y();
197  mBSz_ = beamSpot->position().Z();
198 
199 
202  iEvent.getByToken(metToken_,met);
203  if (met->size() == 0) {
204  mMET_ = -1;
205  mSumET_ = -1;
206  mMETSign_ = -1;
207  }
208  else {
209  mMET_ = (*met)[0].et();
210  mSumET_ = (*met)[0].sumEt();
211  mMETSign_ = (*met)[0].significance();
212  }
213 
216  iEvent.getByToken(tcmetToken_, tcmet);
217  if (tcmet->size() == 0) {
218  mtcMET_ = -1;
219  mtcSumET_ = -1;
220  mtcMETSign_ = -1;
221  }
222  else {
223  mtcMET_ = (*tcmet)[0].et();
224  mtcSumET_ = (*tcmet)[0].sumEt();
225  mtcMETSign_ = (*tcmet)[0].significance();
226  }
227 
230  iEvent.getByToken(pfmetToken_, pfmet);
231  if (pfmet->size() == 0) {
232  mpfMET_ = -1;
233  mpfSumET_ = -1;
234  mpfMETSign_ = -1;
235  }
236  else {
237  mpfMET_ = (*pfmet)[0].et();
238  mpfSumET_ = (*pfmet)[0].sumEt();
239  mpfMETSign_ = (*pfmet)[0].significance();
240  }
241  }
242 
243 }
244 
246  for (std::vector<tnp::ProbeVariable>::const_iterator it = vars_.begin(), ed = vars_.end(); it != ed; ++it) {
247  if (ignoreExceptions_) {
248  try{ it->fill(probe); } catch(cms::Exception &ex ){}
249  } else {
250  it->fill(probe);
251  }
252  }
253 
254  for (std::vector<tnp::ProbeFlag>::const_iterator it = flags_.begin(), ed = flags_.end(); it != ed; ++it) {
255  if (ignoreExceptions_) {
256  try{ it->fill(probe); } catch(cms::Exception &ex ){}
257  } else {
258  it->fill(probe);
259  }
260  }
261  if (tree_) tree_->Fill();
262 }
264  TList *list = tree_->GetUserInfo();
265  list->Add(new TObjString(pset.dump().c_str()));
266 }
RunNumber_t run() const
Definition: EventID.h:39
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
int i
Definition: DBlmapReader.cc:9
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:186
void init(const edm::Event &iEvent) const
To be called at the beginning of the event (will fetch Candidate View if needed)
bool addRunLumiInfo_
Add branches with run and lumisection number.
void writeProvenance(const edm::ParameterSet &pset) const
std::string dump(unsigned int indent=0) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
void fill(const reco::CandidateBaseRef &probe) const
To be called for each item.
std::vector< Variable::Flags > flags
Definition: MVATrainer.cc:135
~ProbeFlag()
Destructor (does nothing)
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:40
std::vector< reco::MET > METCollection
collection of MET objects
Definition: METCollection.h:23
void fill(const reco::CandidateBaseRef &probe) const
To be called once per probe, to fill the values for this probe.
A variable for the probe: can be a string expression or an external ValueMap&lt;float&gt; ...
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:194
~BaseTreeFiller()
Destructor, does nothing but it&#39;s out-of-line as we have complex data members.
int iEvent
Definition: GenABIO.cc:230
void init(const edm::Event &iEvent) const
To be called once per event, to load possible external variables.
~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
edm::EventID id() const
Definition: EventBase.h:60
std::vector< reco::PFMET > PFMETCollection
collection of PFMET objects
void event_()
volatile std::atomic< bool > shutdown_flag false
bool storePUweight_
Store Pileup weight when running over Monte Carlo.
BaseTreeFiller(const char *name, const edm::ParameterSet &config, edm::ConsumesCollector &&iC)
specify the name of the TTree, and the configuration for it
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