8 namespace TopSingleLepton {
15 static const double WMASS = 80.4;
18 label_(label), elecIso_(0), elecSelect_(0), muonIso_(0), muonSelect_(0), jetIDSelect_(0), includeBTag_(
false), lowerEdge_(-1.), upperEdge_(-1.), logged_(0)
33 if( elecExtras.
existsAs<std::string>(
"select") ){
38 if( elecExtras.
existsAs<std::string>(
"isolation") ){
53 if( muonExtras.
existsAs<std::string>(
"select") ){
58 if( muonExtras.
existsAs<std::string>(
"isolation") ){
69 if( jetExtras.
existsAs<std::string>(
"jetCorrector") ){
81 if( jetExtras.
existsAs<std::string>(
"select") ){
122 if(monitoring.
getParameter<std::string>(
"verbosity") ==
"DEBUG" )
124 if(monitoring.
getParameter<std::string>(
"verbosity") ==
"VERBOSE" )
126 if(monitoring.
getParameter<std::string>(
"verbosity") ==
"STANDARD")
160 hists_[
"triggerEff_" ] =
store_->
book1D(
"TriggerEff" ,
"Eff(trigger)" , nPaths, 0., nPaths);
162 hists_[
"triggerMon_" ] =
store_->
book1D(
"TriggerMon" ,
"Mon(trigger)" , nPaths, 0., nPaths);
179 hists_[
"muonRelIso_" ] =
store_->
book1D(
"MuonRelIso" ,
"Iso_{Rel}(#mu)" , 50, 0., 1.);
185 hists_[
"jetMultBEff_"] =
store_->
book1D(
"JetMultBEff",
"N_{30}(b/eff)" , 10, 0., 10.);
187 hists_[
"jetBDiscEff_"] =
store_->
book1D(
"JetBDiscEff",
"Disc_{b/eff}(jet)", 100, 0., 10.);
203 hists_[
"muonDelXY_" ] =
store_->
book2D(
"MuonDelXY" ,
"d_{xy}(#mu)" , 50, -0.1, 0.1, 50, -0.1, 0.1);
206 hists_[
"muonDelXY_" ]->setAxisTitle(
"x [cm]", 1);
hists_[
"muonDelXY_" ]->setAxisTitle(
"y [cm]", 2);
212 hists_[
"muonTrkIso_" ] =
store_->
book1D(
"MuonTrkIso" ,
"Iso_{Trk}(#mu)" , 50, 0., 1.);
214 hists_[
"muonCalIso_" ] =
store_->
book1D(
"MuonCalIso" ,
"Iso_{Ecal}(#mu)" , 50, 0., 1.);
220 hists_[
"jetMultBPur_"] =
store_->
book1D(
"JetMultBPur",
"N_{30}(b/pur)" , 10, 0., 10.);
222 hists_[
"jetBDiscPur_"] =
store_->
book1D(
"JetBDiscPur",
"Disc_{b/pur}(Jet)", 100, 0., 10.);
224 hists_[
"jetMultBVtx_"] =
store_->
book1D(
"JetMultBVtx",
"N_{30}(b/vtx)" , 10, 0., 10.);
226 hists_[
"jetBDiscVtx_"] =
store_->
book1D(
"JetBDiscVtx",
"Disc_{b/vtx}(Jet)", 35, -1., 6.);
228 hists_[
"jet1PtRaw_" ] =
store_->
book1D(
"Jet1PtRaw" ,
"pt_{Raw}(jet1)" , 60, 0., 300.);
230 hists_[
"jet2PtRaw_" ] =
store_->
book1D(
"Jet2PtRaw" ,
"pt_{Raw}(jet2)" , 60, 0., 300.);
232 hists_[
"jet3PtRaw_" ] =
store_->
book1D(
"Jet3PtRaw" ,
"pt_{Raw}(jet3)" , 60, 0., 300.);
234 hists_[
"jet4PtRaw_" ] =
store_->
book1D(
"Jet4PtRaw" ,
"pt_{Raw}(jet4)" , 60, 0., 300.);
236 hists_[
"eventLogger_"] =
store_->
book2D(
"EventLogger",
"Logged Events" , 9, 0., 9., 10, 0., 10.);
239 hists_[
"eventLogger_"]->getTH1()->SetOption(
"TEXT");
240 hists_[
"eventLogger_"]->setBinLabel( 1 ,
"Run" , 1);
241 hists_[
"eventLogger_"]->setBinLabel( 2 ,
"Block" , 1);
242 hists_[
"eventLogger_"]->setBinLabel( 3 ,
"Event" , 1);
243 hists_[
"eventLogger_"]->setBinLabel( 4 ,
"pt_{L2L3}(jet1)" , 1);
244 hists_[
"eventLogger_"]->setBinLabel( 5 ,
"pt_{L2L3}(jet2)" , 1);
245 hists_[
"eventLogger_"]->setBinLabel( 6 ,
"pt_{L2L3}(jet3)" , 1);
246 hists_[
"eventLogger_"]->setBinLabel( 7 ,
"pt_{L2L3}(jet4)" , 1);
247 hists_[
"eventLogger_"]->setBinLabel( 8 ,
"M_{W}" , 1);
248 hists_[
"eventLogger_"]->setBinLabel( 9 ,
"M_{Top}" , 1);
249 hists_[
"eventLogger_"]->setAxisTitle(
"logged evts" , 2);
281 unsigned int eMult=0, eMultIso=0;
282 std::vector<const reco::GsfElectron*> isoElecs;
284 unsigned int idx = elec-elecs->begin();
286 if(
electronId_.
label().empty() ?
true : (*electronId)[elecs->refAt(idx)]>0.99 ){
288 double isolationTrk = elec->pt()/(elec->pt()+elec->dr03TkSumPt());
289 double isolationCal = elec->pt()/(elec->pt()+elec->dr03EcalRecHitSumEt()+elec->dr03HcalTowerSumEt());
290 double isolationRel = (elec->dr03TkSumPt()+elec->dr03EcalRecHitSumEt()+elec->dr03HcalTowerSumEt())/elec->pt();
293 fill(
"elecPt_" , elec->pt() );
294 fill(
"elecEta_", elec->eta());
295 fill(
"elecRelIso_" , isolationRel );
296 fill(
"elecTrkIso_" , isolationTrk );
297 fill(
"elecCalIso_" , isolationCal );
301 ++eMult;
if(!
elecIso_ || (*
elecIso_)(*elec)){ isoElecs.push_back(&(*elec)); ++eMultIso;}
305 fill(
"elecMult_", eMult );
306 fill(
"elecMultIso_", eMultIso);
317 unsigned int mMult=0, mMultIso=0;
324 if(
muon->isGlobalMuon() ){
325 fill(
"muonDelZ_" ,
muon->globalTrack()->vz());
326 fill(
"muonDelXY_",
muon->globalTrack()->vx(),
muon->globalTrack()->vy());
329 double isolationTrk =
muon->pt()/(
muon->pt()+
muon->isolationR03().sumPt);
330 double isolationCal =
muon->pt()/(
muon->pt()+
muon->isolationR03().emEt+
muon->isolationR03().hadEt);
331 double isolationRel = (
muon->isolationR03().sumPt+
muon->isolationR03().emEt+
muon->isolationR03().hadEt)/
muon->pt();
336 fill(
"muonRelIso_" , isolationRel );
337 fill(
"muonTrkIso_" , isolationTrk );
338 fill(
"muonCalIso_" , isolationCal );
344 fill(
"muonMult_", mMult );
345 fill(
"muonMultIso_", mMultIso);
366 if(setup.
find( edm::eventsetup::EventSetupRecordKey::makeKey<JetCorrectionsRecord>() )){
372 <<
"------------------------------------------------------------------------------------- \n"
373 <<
" No JetCorrectionsRecord available from EventSetup: \n"
374 <<
" - Jets will not be corrected. \n"
375 <<
" - If you want to change this add the following lines to your cfg file: \n"
377 <<
" ## load jet corrections \n"
378 <<
" process.load(\"JetMETCorrections.Configuration.JetCorrectionServicesAllAlgos_cff\") \n"
379 <<
" process.prefer(\"ak5CaloL2L3\") \n"
381 <<
"------------------------------------------------------------------------------------- \n";
386 std::vector<reco::Jet> correctedJets;
387 unsigned int mult=0, multBEff=0, multBPur=0, multBVtx=0;
400 unsigned int idx =
jet-jets->begin();
401 if(
jetIDSelect_ && dynamic_cast<const reco::CaloJet*>(jets->refAt(idx).get())){
402 if(!(*
jetIDSelect_)((*jetID)[jets->refAt(idx)]))
continue;
405 if(dynamic_cast<const reco::CaloJet*>(&*
jet)){
409 else if(dynamic_cast<const reco::PFJet*>(&*
jet)){
419 for(std::vector<const reco::GsfElectron*>::const_iterator elec=isoElecs.begin(); elec!=isoElecs.end(); ++elec){
420 if(
reco::deltaR((*elec)->eta(), (*elec)->phi(),
jet->eta(),
jet->phi())<0.4){overlap=
true;
break;}
421 }
if(overlap){
continue;}
424 correctedJets.push_back(monitorJet);
429 fill(
"jetBDiscEff_", (*btagEff)[jetRef]);
if( (*btagEff)[jetRef]>
btagEffWP_ ) ++multBEff;
430 fill(
"jetBDiscPur_", (*btagPur)[jetRef]);
if( (*btagPur)[jetRef]>
btagPurWP_ ) ++multBPur;
431 fill(
"jetBDiscVtx_", (*btagVtx)[jetRef]);
if( (*btagVtx)[jetRef]>
btagVtxWP_ ) ++multBVtx;
434 if(idx==0) {
fill(
"jet1Pt_" , monitorJet.
pt());
fill(
"jet1PtRaw_",
jet->pt() );}
435 if(idx==1) {
fill(
"jet2Pt_" , monitorJet.
pt());
fill(
"jet2PtRaw_",
jet->pt() );}
436 if(idx==2) {
fill(
"jet3Pt_" , monitorJet.
pt());
fill(
"jet3PtRaw_",
jet->pt() );}
437 if(idx==3) {
fill(
"jet4Pt_" , monitorJet.
pt());
fill(
"jet4PtRaw_",
jet->pt() );}
439 fill(
"jetMult_" , mult );
440 fill(
"jetMultBEff_", multBEff);
441 fill(
"jetMultBPur_", multBPur);
442 fill(
"jetMultBVtx_", multBVtx);
453 for(std::vector<edm::InputTag>::const_iterator met_=
mets_.begin(); met_!=
mets_.end(); ++met_){
456 if(met->begin()!=met->end()){
457 unsigned int idx=met_-
mets_.begin();
458 if(idx==0)
fill(
"metCalo_" , met->begin()->et());
459 if(idx==1)
fill(
"metTC_" , met->begin()->et());
460 if(idx==2)
fill(
"metPflow_", met->begin()->et());
474 double wMass = eventKinematics.
massWBoson (correctedJets);
475 double topMass = eventKinematics.
massTopQuark(correctedJets);
476 if(wMass>=0 && topMass>=0) {
fill(
"massW_" , wMass );
fill(
"massTop_" , topMass);}
480 if(
logged_<=
hists_.find(
"eventLogger_")->second->getNbinsY()){
486 if(correctedJets.size()>0)
fill(
"eventLogger_", 3.5,
logged_+0.5, correctedJets[0].
pt());
487 if(correctedJets.size()>1)
fill(
"eventLogger_", 4.5,
logged_+0.5, correctedJets[1].
pt());
488 if(correctedJets.size()>2)
fill(
"eventLogger_", 5.5,
logged_+0.5, correctedJets[2].
pt());
489 if(correctedJets.size()>3)
fill(
"eventLogger_", 6.5,
logged_+0.5, correctedJets[3].
pt());
521 std::vector<edm::ParameterSet>
sel=cfg.
getParameter<std::vector<edm::ParameterSet> >(
"selection");
522 for(
unsigned int i=0;
i<sel.size(); ++
i){
542 unsigned int passed=0;
551 if(step.
select(event)){ ++passed;
557 if(step.
select(event)){ ++passed;
563 if(step.
select(event, setup)){ ++passed;
567 if(
type==
"jets/pf" ){
569 if(step.
select(event, setup)){ ++passed;
573 if(
type==
"jets/calo" ){
575 if(step.
select(event, setup)){ ++passed;
581 if(step.
select(event)){ ++passed;
std::map< std::string, MonitorElement * > hists_
histogram container
T getParameter(std::string const &) const
int logged_
number of logged interesting events
double btagEffWP_
btag working points
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
Jets made from CaloTowers.
bool select(const edm::Event &event)
apply selection
edm::InputTag elecs_
input sources for monitoring
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
edm::InputTag triggerTable_
trigger table
std::vector< edm::InputTag > mets_
considers a vector of METs
std::vector< std::string > triggerPaths_
virtual double correction(const LorentzVector &fJet) const =0
get correction using Jet information only
Base class for all types of Jets.
double massTopQuark(const std::vector< reco::Jet > &jets)
calculate W boson mass estimate
StringCutObjectSelector< reco::BeamSpot > * beamspotSelect_
string cut selector
TopSingleLeptonDQM(const edm::ParameterSet &cfg)
default constructor
virtual void scaleEnergy(double fScale)
scale energy of the jet
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Jets made from PFObjects.
std::vector< std::string > triggerPaths_
trigger paths
double massWBoson(const std::vector< reco::Jet > &jets)
calculate W boson mass estimate
std::vector< std::string > selectionOrder_
std::string selectionStep(const std::string &label)
LuminosityBlockNumber_t luminosityBlock() const
const eventsetup::EventSetupRecord * find(const eventsetup::EventSetupRecordKey &) const
double deltaR(double eta1, double phi1, double eta2, double phi2)
Level verbosity_
verbosity level for booking
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
edm::InputTag vertex_
primary vertex
static const double WMASS
double lowerEdge_
mass window upper and lower edge
edm::InputTag btagEff_
btag discriminator labels
Helper class for the calculation of a top and a W boson mass estime.
std::map< std::string, std::pair< edm::ParameterSet, TopSingleLepton::MonitorEnsemble * > > selection_
edm::InputTag beamspot_
beamspot
StringCutObjectSelector< reco::Muon > * muonSelect_
extra selection on muons
void book(std::string directory)
book histograms in subdirectory directory
edm::InputTag triggerTable_
trigger table
StringCutObjectSelector< reco::GsfElectron > * elecIso_
extra isolation criterion on electron
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 but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
EventAuxiliary const & eventAuxiliary() const
edm::InputTag jetIDLabel_
jetID as an extra selection type
std::string label_
instance label
virtual double pt() const
transverse momentum
static const JetCorrector * getJetCorrector(const std::string &fName, const edm::EventSetup &fSetup)
retrieve corrector from the event setup. troughs exception if something is missing ...
StringCutObjectSelector< reco::GsfElectron > * elecSelect_
extra selection on electrons
Templated helper class to allow a selection on a certain object collection.
std::string objectType(const std::string &label)
StringCutObjectSelector< reco::Muon > * muonIso_
extra isolation criterion on muon
void fill(const edm::Event &event, const edm::EventSetup &setup)
fill monitor histograms with electronId and jetCorrections
edm::InputTag electronId_
electronId
void triggerBinLabels(std::string channel, const std::vector< std::string > labels)
set configurable labels for trigger monitoring histograms
std::string jetCorrector_
jetCorrector
static const unsigned int MAXJETS
MonitorElement * book2D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Book 2D histogram.
MonitorEnsemble(const char *label, const edm::ParameterSet &cfg)
default contructor
EventNumber_t event() const
StringCutObjectSelector< reco::JetID > * jetIDSelect_
extra jetID selection on calo jets
void setCurrentFolder(const std::string &fullpath)
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup)
do this during the event loop
StringCutObjectSelector< reco::Vertex > * vertexSelect_
string cut selector
DQMStore * store_
storage manager