00001 #include "PhysicsTools/StarterKit/interface/PatKitHelper.h"
00002
00003
00004 using namespace pat;
00005 using namespace std;
00006
00007 PatKitHelper::PatKitHelper( const edm::ParameterSet & iConfig ) :
00008 parameters_( iConfig ),
00009 physHistos_(0),
00010 verboseLevel_(0)
00011 {
00012 }
00013
00014
00015 PatKitHelper::~PatKitHelper()
00016 {
00017 if ( physHistos_ ) delete physHistos_;
00018 }
00019
00020 PhysicsHistograms::KinAxisLimits PatKitHelper::getAxisLimits(std::string name)
00021 {
00022 edm::ParameterSet axisLimitsSet = parameters_.getParameter<edm::ParameterSet>(name);
00023
00024 PhysicsHistograms::KinAxisLimits axisLimits;
00025
00026 axisLimits.pt1 = axisLimitsSet.getParameter<double>("pt1");
00027 axisLimits.pt2 = axisLimitsSet.getParameter<double>("pt2");
00028 axisLimits.m1 = axisLimitsSet.getParameter<double>("m1");
00029 axisLimits.m2 = axisLimitsSet.getParameter<double>("m2");
00030
00031 return axisLimits;
00032 }
00033
00034
00035 void PatKitHelper::bookHistos(edm::EDProducer * producer)
00036 {
00037
00038 edm::Service<TFileService> fs;
00039 TFileDirectory summary = TFileDirectory( fs->mkdir("summary") );
00040
00041
00042 physHistos_ = new PhysicsHistograms ( getAxisLimits("muonAxis"),
00043 getAxisLimits("electronAxis"),
00044 getAxisLimits("tauAxis"),
00045 getAxisLimits("jetAxis"),
00046 getAxisLimits("METAxis"),
00047 getAxisLimits("photonAxis"),
00048 getAxisLimits("trackAxis")
00049 );
00050
00051
00052 string histos_to_disable =
00053 parameters_.getParameter<string> ("disable");
00054 string histos_to_enable =
00055 parameters_.getParameter<string> ("enable");
00056 physHistos_->configure( histos_to_disable, histos_to_enable );
00057
00058
00059 physHistos_->addHisto( h_runNumber_ =
00060 new PhysVarHisto( "runNumber", "Run Number",
00061 10000, 0, 10000,
00062 &summary ,"", "I")
00063 );
00064 physHistos_->addHisto( h_eventNumber_ =
00065 new PhysVarHisto( "eventNumber", "Event Number",
00066 10000, 0, 10000,
00067 &summary ,"", "I")
00068 );
00069
00070
00071 h_runNumber_->makeTH1();
00072 h_eventNumber_->makeTH1();
00073
00074
00075
00076
00077
00078 string list_of_ntuple_vars =
00079 parameters_.getParameter<std::string> ("ntuplize");
00080
00081 if (list_of_ntuple_vars != "") {
00082
00083
00084
00085 physHistos_->select( list_of_ntuple_vars, ntVars_ );
00086
00087
00088 std::vector< PhysVarHisto* >::iterator
00089 p = ntVars_.begin(),
00090 pEnd = ntVars_.end();
00091
00092 for ( ; p != pEnd; ++p ) {
00093 cout << "Adding ntuple variable " << (*p)->name() << endl;
00094 addNtupleVar( producer, (*p)->name(), (*p)->type() );
00095 }
00096
00097 }
00098
00099 }
00100
00101
00102 void PatKitHelper::getHandles( edm::Event & event,
00103 edm::Handle<std::vector<pat::Muon> > & muonHandle,
00104 edm::Handle<std::vector<pat::Electron> > & electronHandle,
00105 edm::Handle<std::vector<pat::Tau> > & tauHandle,
00106 edm::Handle<std::vector<pat::Jet> > & jetHandle,
00107 edm::Handle<std::vector<pat::MET> > & METHandle,
00108 edm::Handle<std::vector<pat::Photon> > & photonHandle
00109 )
00110 {
00111
00112 edm::InputTag muonName = parameters_.getParameter<edm::InputTag>("muonSrc" );
00113 edm::InputTag electronName = parameters_.getParameter<edm::InputTag>("electronSrc");
00114 edm::InputTag tauName = parameters_.getParameter<edm::InputTag>("tauSrc" );
00115 edm::InputTag jetName = parameters_.getParameter<edm::InputTag>("jetSrc" );
00116 edm::InputTag METName = parameters_.getParameter<edm::InputTag>("METSrc" );
00117 edm::InputTag photonName = parameters_.getParameter<edm::InputTag>("photonSrc" );
00118
00119
00120
00121 event.getByLabel(muonName , muonHandle);
00122 event.getByLabel(electronName , electronHandle);
00123 event.getByLabel(tauName , tauHandle);
00124 event.getByLabel(jetName , jetHandle);
00125 event.getByLabel(METName , METHandle);
00126 event.getByLabel(photonName , photonHandle);
00127 }
00128
00129
00130 void PatKitHelper::fillHistograms(edm::Event & event,
00131 edm::Handle<std::vector<pat::Muon> > & muonHandle,
00132 edm::Handle<std::vector<pat::Electron> > & electronHandle,
00133 edm::Handle<std::vector<pat::Tau> > & tauHandle,
00134 edm::Handle<std::vector<pat::Jet> > & jetHandle,
00135 edm::Handle<std::vector<pat::MET> > & METHandle,
00136 edm::Handle<std::vector<pat::Photon> > & photonHandle
00137 )
00138 {
00139 physHistos_->clearVec();
00140 physHistos_->fillCollection(*muonHandle);
00141 physHistos_->fillCollection(*electronHandle);
00142 physHistos_->fillCollection(*tauHandle);
00143 physHistos_->fillCollection(*jetHandle);
00144 physHistos_->fillCollection(*METHandle);
00145 physHistos_->fillCollection(*photonHandle);
00146
00147
00148
00149
00150 saveNtuple( event, ntVars_ );
00151 }
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 void
00170 PatKitHelper::addNtupleVar( edm::EDProducer * producer, std::string name, std::string type )
00171 {
00172 if (type == "D") {
00173 producer->produces<double>( name ).setBranchAlias( name );
00174 }
00175 else if (type == "F") {
00176 producer->produces<float>( name ).setBranchAlias( name );
00177 }
00178 else if (type == "I") {
00179 producer->produces<int>( name ).setBranchAlias( name );
00180 }
00181 else if (type == "i") {
00182 producer->produces<unsigned int>( name ).setBranchAlias( name );
00183 }
00184 else if (type == "S") {
00185 producer->produces<short>( name ).setBranchAlias( name );
00186 }
00187 else if (type == "s") {
00188 producer->produces<unsigned short>( name ).setBranchAlias( name );
00189 }
00190 else if (type == "L") {
00191 producer->produces<long>( name ).setBranchAlias( name );
00192 }
00193 else if (type == "l") {
00194 producer->produces<unsigned long>( name ).setBranchAlias( name );
00195 }
00196 else if (type == "vD") {
00197 producer->produces<vector<double> >( name ).setBranchAlias( name );
00198 }
00199 else if (type == "vF") {
00200 producer->produces<vector<float> >( name ).setBranchAlias( name );
00201 }
00202 else if (type == "vI") {
00203 producer->produces<vector<int> >( name ).setBranchAlias( name );
00204 }
00205 else if (type == "vi") {
00206 producer->produces<vector<unsigned int> >( name ).setBranchAlias( name );
00207 }
00208 else if (type == "vS") {
00209 producer->produces<vector<short> >( name ).setBranchAlias( name );
00210 }
00211 else if (type == "vs") {
00212 producer->produces<vector<unsigned short> >( name ).setBranchAlias( name );
00213 }
00214 else if (type == "vL") {
00215 producer->produces<vector<long> >( name ).setBranchAlias( name );
00216 }
00217 else if (type == "vl") {
00218 producer->produces<vector<unsigned long> >( name ).setBranchAlias( name );
00219 }
00220
00221
00222
00223 else {
00224 std::cout << "PatAnalyzerKit::addNtupleVar (ERROR): "
00225 << "unknown type " << type << std::endl;
00226
00227
00228 }
00229 }
00230
00231
00232
00233
00234
00235
00236
00237 void
00238 PatKitHelper::saveNtuple( edm::Event & event,
00239 const std::vector<pat::PhysVarHisto*> & ntvars )
00240 {
00241
00242
00243 if ( verboseLevel_ > 0 )
00244 cout << "About to save ntuple" << endl;
00245 if ( ntvars.size() ) {
00246
00247
00248 std::vector< PhysVarHisto* >::const_iterator
00249 p = ntvars.begin(),
00250 pEnd = ntvars.end();
00251
00252 for ( ; p != pEnd; ++p ) {
00253
00254 if ((*p)->type() == "D") {
00255 saveNtupleVar<double>( event, (*p)->name(), (*p)->value() );
00256 }
00257 else if ((*p)->type() == "F") {
00258 saveNtupleVar<float>( event, (*p)->name(), (*p)->value() );
00259 }
00260 else if ((*p)->type() == "I") {
00261 saveNtupleVar<int>( event, (*p)->name(), static_cast<int>((*p)->value()) );
00262 }
00263 else if ((*p)->type() == "i") {
00264 saveNtupleVar<unsigned int>( event, (*p)->name(), static_cast<unsigned int>((*p)->value()) );
00265 }
00266 else if ((*p)->type() == "S") {
00267 saveNtupleVar<short>( event, (*p)->name(), static_cast<short>((*p)->value()) );
00268 }
00269 else if ((*p)->type() == "s") {
00270 saveNtupleVar<unsigned short>( event, (*p)->name(), static_cast<unsigned short>((*p)->value()) );
00271 }
00272 else if ((*p)->type() == "L") {
00273 saveNtupleVar<long>( event, (*p)->name(), static_cast<long>((*p)->value()) );
00274 }
00275 else if ((*p)->type() == "l") {
00276 saveNtupleVar<unsigned long>( event, (*p)->name(), static_cast<unsigned long>((*p)->value()) );
00277 }
00278 else if ((*p)->type() == "vD") {
00279 vector<double> retvec;
00280 (*p)->vec( retvec );
00281 saveNtupleVec<double>( event, (*p)->name(), retvec );
00282 }
00283 else if ((*p)->type() == "vF") {
00284 vector<float> retvec;
00285 (*p)->vec( retvec );
00286 saveNtupleVec<float>( event, (*p)->name(), retvec );
00287 }
00288 else if ((*p)->type() == "vI") {
00289 vector<int> retvec;
00290 (*p)->vec( retvec );
00291 saveNtupleVec<int>( event, (*p)->name(), retvec );
00292 }
00293 else if ((*p)->type() == "vi") {
00294 vector<unsigned int> retvec;
00295 (*p)->vec( retvec );
00296 saveNtupleVec<unsigned int>( event, (*p)->name(), retvec );
00297 }
00298 else if ((*p)->type() == "vS") {
00299 vector<short> retvec;
00300 (*p)->vec( retvec );
00301 saveNtupleVec<short>( event, (*p)->name(), retvec );
00302 }
00303 else if ((*p)->type() == "vs") {
00304 vector<unsigned short> retvec;
00305 (*p)->vec( retvec );
00306 saveNtupleVec<unsigned short>( event, (*p)->name(), retvec );
00307 }
00308 else if ((*p)->type() == "vL") {
00309 vector<long> retvec;
00310 (*p)->vec( retvec );
00311 saveNtupleVec<long>( event, (*p)->name(), retvec );
00312 }
00313 else if ((*p)->type() == "vl") {
00314 vector<unsigned long> retvec;
00315 (*p)->vec( retvec );
00316 saveNtupleVec<unsigned long>( event, (*p)->name(), retvec );
00317 }
00318
00319
00320
00321 else {
00322 std::cout << "PatAnalyzerKit::addNtupleVar (ERROR): "
00323 << "unknown type " << std::endl;
00324
00325
00326 }
00327
00328
00329 (*p)->clearVec();
00330
00331 }
00332
00333 }
00334 }
00335
00336
00337 template <class T>
00338 void
00339 PatKitHelper::saveNtupleVar( edm::Event & event,
00340 std::string name, T value )
00341 {
00342 std::auto_ptr<T> aptr( new T (value ) );
00343 if ( verboseLevel_ > 0 )
00344 cout << "Putting variable " << name << " with value " << value << " in event" << endl;
00345 event.put( aptr, name );
00346 }
00347
00348
00349 template <class T>
00350 void
00351 PatKitHelper::saveNtupleVec( edm::Event & event,
00352 std::string name, const vector<T> & value )
00353 {
00354 std::auto_ptr<vector<T> > aptr( new vector<T> ( value ) );
00355 if ( verboseLevel_ > 0 ) {
00356 cout << "Putting variable " << name << " with values : " << endl;
00357 typename vector<T>::const_iterator i = aptr->begin(), iend = aptr->end();
00358 for ( ; i != iend; ++i ) {
00359 cout << *i << " ";
00360 }
00361 cout << endl;
00362 }
00363 event.put( aptr, name );
00364 }
00365