Go to the documentation of this file.00001 #ifndef PhysicsTools_TagAndProbe_BaseTreeFiller_h
00002 #define PhysicsTools_TagAndProbe_BaseTreeFiller_h
00003
00004 #include <vector>
00005 #include <string>
00006 #include <stdint.h>
00007
00008 #include "DataFormats/Common/interface/Handle.h"
00009 #include "DataFormats/Common/interface/ValueMap.h"
00010 #include "DataFormats/Candidate/interface/Candidate.h"
00011 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00012 #include "FWCore/Framework/interface/Event.h"
00013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00014 #include "FWCore/Utilities/interface/InputTag.h"
00015 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
00016 #include "CommonTools/Utils/interface/StringObjectFunction.h"
00017
00018 #include <TTree.h>
00019 #include <boost/utility.hpp>
00020
00021
00028 namespace tnp {
00029
00031 class ProbeVariable {
00032 public:
00034 ProbeVariable(const std::string &name, const std::string &expression) :
00035 name_(name), external_(false), function_(expression) {}
00036
00038 ProbeVariable(const std::string &name, const edm::InputTag &src) :
00039 name_(name), external_(true), function_("-1"), src_(src) {}
00040
00042 ~ProbeVariable() ;
00043
00045 float * address() const { return &value_; }
00046
00048 const std::string & name() const { return name_; }
00049
00051 void init(const edm::Event &iEvent) const {
00052 if (external_) iEvent.getByLabel(src_, handle_);
00053 }
00054
00056 void fill(const reco::CandidateBaseRef &probe) const {
00057 value_ = external_ ? (*handle_)[probe] : function_(*probe);
00058 }
00059
00060 private:
00062 std::string name_;
00064 mutable float value_;
00065
00067 bool external_;
00068
00070 StringObjectFunction<reco::Candidate,true> function_;
00071
00072
00073
00074
00076 edm::InputTag src_;
00078 mutable edm::Handle<edm::ValueMap<float> > handle_;
00079 };
00080
00081 class ProbeFlag {
00082 public:
00084 ProbeFlag(const std::string &name, const std::string &cut) :
00085 name_(name), external_(false), cut_(cut) {}
00086
00088 ProbeFlag(const std::string &name, const edm::InputTag &src) :
00089 name_(name), external_(true), cut_(""), src_(src) {}
00090
00092 ~ProbeFlag() ;
00093
00095 int32_t * address() const { return &value_; }
00096
00098 const std::string & name() const { return name_; }
00099
00101 void init(const edm::Event &iEvent) const ;
00102
00104 void fill(const reco::CandidateBaseRef &probe) const ;
00105
00106 private:
00108 std::string name_;
00110 mutable int32_t value_;
00111
00113 bool external_;
00114
00116 StringCutObjectSelector<reco::Candidate,true> cut_;
00117
00118
00120 edm::InputTag src_;
00122 mutable std::vector<reco::CandidateBaseRef> passingProbes_;
00123 };
00124
00125
00126
00127 class BaseTreeFiller : boost::noncopyable {
00128 public:
00130 BaseTreeFiller(const char *name, const edm::ParameterSet config);
00131
00133 BaseTreeFiller(BaseTreeFiller &main, const edm::ParameterSet &iConfig, const std::string &branchNamePrefix);
00134
00136 ~BaseTreeFiller();
00137
00138
00139
00140
00142 void init(const edm::Event &iEvent) const ;
00143
00145 void fill(const reco::CandidateBaseRef &probe) const ;
00146
00149 void writeProvenance(const edm::ParameterSet &pset) const ;
00150 protected:
00151
00152 std::vector<ProbeVariable> vars_;
00153 std::vector<ProbeFlag> flags_;
00154
00156 enum WeightMode { None, Fixed, External };
00157 WeightMode weightMode_;
00158 edm::InputTag weightSrc_;
00159
00161 bool ignoreExceptions_;
00162
00164 bool addRunLumiInfo_;
00165
00167 bool addEventVariablesInfo_;
00168
00169 void addBranches_(TTree *tree, const edm::ParameterSet &iConfig, const std::string &branchNamePrefix="") ;
00170
00171
00172 mutable TTree * tree_;
00173 mutable float weight_;
00174 mutable uint32_t run_, lumi_, event_, mNPV_;
00175
00176 mutable float mPVx_,mPVy_,mPVz_,mBSx_,mBSy_,mBSz_;
00177
00178 mutable float mMET_,mSumET_,mMETSign_,mtcMET_,mtcSumET_,
00179 mtcMETSign_,mpfMET_,mpfSumET_,mpfMETSign_;
00180 };
00181
00182
00183 }
00184
00185 #endif