HLTExoticaSubAnalysis

Level

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
#ifndef HLTriggerOffline_Exotica_HLTExoticaSubAnalysis_H
#define HLTriggerOffline_Exotica_HLTExoticaSubAnalysis_H

/** \class HLTExoticaSubAnalysis
 *  Generate histograms for trigger efficiencies Exotica related
 *  Documentation available on the CMS TWiki:
 *  https://twiki.cern.ch/twiki/bin/view/CMS/EXOTICATriggerValidation
 *
 *  \author  Thiago R. Fernandez Perez Tomei
 *           Based and adapted from:
 *           J. Duarte Campderros code from HLTriggerOffline/Higgs
 *           J. Klukas, M. Vander Donckt and J. Alcaraz code
 *           from the HLTriggerOffline/Muon package.
 */

#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Utilities/interface/InputTag.h"

#include "CommonTools/Utils/interface/StringCutObjectSelector.h"
#include "DQMServices/Core/interface/DQMStore.h"
#include "DataFormats/BeamSpot/interface/BeamSpot.h"
#include "DataFormats/Candidate/interface/LeafCandidate.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
#include "DataFormats/EgammaCandidates/interface/Photon.h"
#include "DataFormats/EgammaCandidates/interface/PhotonFwd.h"
#include "DataFormats/HepMCCandidate/interface/GenParticle.h"
#include "DataFormats/JetReco/interface/CaloJet.h"
#include "DataFormats/JetReco/interface/CaloJetCollection.h"
#include "DataFormats/JetReco/interface/PFJet.h"
#include "DataFormats/JetReco/interface/PFJetCollection.h"
#include "DataFormats/METReco/interface/CaloMET.h"
#include "DataFormats/METReco/interface/CaloMETCollection.h"
#include "DataFormats/METReco/interface/GenMET.h"
#include "DataFormats/METReco/interface/GenMETCollection.h"
#include "DataFormats/METReco/interface/PFMET.h"
#include "DataFormats/METReco/interface/PFMETCollection.h"
#include "DataFormats/MuonReco/interface/Muon.h"
#include "DataFormats/MuonReco/interface/MuonFwd.h"
#include "DataFormats/TauReco/interface/PFTau.h"
#include "DataFormats/TauReco/interface/PFTauFwd.h"
#include "DataFormats/TrackReco/interface/Track.h"
#include "DataFormats/TrackReco/interface/TrackFwd.h"
#include "HLTrigger/HLTcore/interface/HLTConfigProvider.h"

#include "HLTriggerOffline/Exotica/interface/HLTExoticaPlotter.h"

#include <cstring>
#include <map>
#include <set>
#include <vector>

/// Class to manage all object collections from a centralized place.
struct EVTColContainer;

/// This class is the main workhorse of the package.
/// It makes the histograms for one given analysis, taking care
/// of all HLT paths related to that analysis.
class HLTExoticaSubAnalysis {
public:
  typedef dqm::legacy::DQMStore DQMStore;
  typedef dqm::legacy::MonitorElement MonitorElement;

  enum class Level { GEN = 98, RECO = 99 };

  HLTExoticaSubAnalysis(const edm::ParameterSet &pset,
                        const std::string &analysisname,
                        edm::ConsumesCollector &&consCollector);
  ~HLTExoticaSubAnalysis();
  void beginJob();
  void beginRun(const edm::Run &iRun, const edm::EventSetup &iEventSetup);
  void endRun();

  /// Method to book all relevant histograms in the DQMStore.
  /// Uses the IBooker interface for thread safety.
  /// Intended to be called from master object.
  void subAnalysisBookHistos(DQMStore::IBooker &iBooker, const edm::Run &iRun, const edm::EventSetup &iSetup);

  /// Method to fill all relevant histograms.
  /// Notice that we update the EVTColContaner to point to the collections we
  /// want.
  void analyze(const edm::Event &iEvent, const edm::EventSetup &iEventSetup, EVTColContainer *cols);

private:
  /// Return the objects (muons,electrons,photons,...) needed by a HLT path.
  /// Will in general return: 0 for muon, 1 for electron, 2 for photon,
  /// 3 for PFMET, 4 for PFTau, 5 for Jet.
  /// Notice that this function is really based on a parsing of the name of
  /// the path; any incongruences there may lead to problems.
  const std::vector<unsigned int> getObjectsType(const std::string &hltpath) const;

  /// Creates the maps that map  which collection should come from which label
  void getNamesOfObjects(const edm::ParameterSet &anpset);
  /// Registers consumption of objects
  void registerConsumes(edm::ConsumesCollector &consCollector);
  /// Gets the collections themselves
  void getHandlesToObjects(const edm::Event &iEvent, EVTColContainer *col);
  /// Initializes the selectors of the objects based on which object it is
  void initSelector(const unsigned int &objtype);
  /// This function applies the selectors initialized previously to the objects,
  /// and matches the passing objects to HLT objects.
  void insertCandidates(const unsigned int &objtype,
                        const EVTColContainer *col,
                        std::vector<reco::LeafCandidate> *matches,
                        std::map<int, double> &theSumEt,
                        std::map<int, std::vector<const reco::Track *>> &trkObjs);

  /// The internal functions to book and fill histograms
  void bookHist(DQMStore::IBooker &iBooker,
                const std::string &source,
                const std::string &objType,
                const std::string &variable);
  void fillHist(const std::string &source, const std::string &objType, const std::string &variable, const float &value);

  /// Internal, working copy of the PSet passed from above.
  edm::ParameterSet _pset;

  /// The name of this sub-analysis
  std::string _analysisname;

  /// The minimum number of reco/gen candidates needed by the analysis
  unsigned int _minCandidates;

  /// The hlt paths to check for.
  std::vector<std::string> _hltPathsToCheck;
  /// The hlt paths found in the hltConfig
  std::set<std::string> _hltPaths;
  /// Relation between the short and long versions of the path
  std::map<std::string, std::string> _shortpath2long;

  /// The labels of the object collections to be used in this analysis.
  std::string _hltProcessName;
  edm::InputTag _genParticleLabel;
  edm::InputTag _trigResultsLabel;
  edm::InputTag _beamSpotLabel;
  std::map<unsigned int, edm::InputTag> _recLabels;
  /// And also the tokens to get the object collections
  edm::EDGetTokenT<reco::GenParticleCollection> _genParticleToken;
  edm::EDGetTokenT<edm::TriggerResults> _trigResultsToken;
  edm::EDGetTokenT<reco::BeamSpot> _bsToken;
  std::map<unsigned int, edm::EDGetToken> _tokens;

  /// Some kinematical parameters
  std::vector<double> _parametersEta;
  std::vector<double> _parametersPhi;
  std::vector<double> _parametersTurnOn;
  std::vector<double> _parametersTurnOnSumEt;
  std::vector<double> _parametersDxy;

  // flag to switch off
  bool _drop_pt2;
  bool _drop_pt3;

  /// gen/rec objects cuts
  std::map<unsigned int, std::string> _genCut;
  std::map<unsigned int, std::string> _recCut;
  /// gen/rec pt-leading objects cuts
  std::map<unsigned int, std::string> _genCut_leading;
  std::map<unsigned int, std::string> _recCut_leading;

  /// The concrete String selectors (use the string cuts introduced
  /// via the config python)
  std::map<unsigned int, StringCutObjectSelector<reco::GenParticle> *> _genSelectorMap;
  StringCutObjectSelector<reco::Muon> *_recMuonSelector;
  StringCutObjectSelector<reco::Track> *_recMuonTrkSelector;
  StringCutObjectSelector<reco::Track> *_recTrackSelector;
  StringCutObjectSelector<reco::GsfElectron> *_recElecSelector;
  StringCutObjectSelector<reco::MET> *_recMETSelector;
  StringCutObjectSelector<reco::PFMET> *_recPFMETSelector;
  StringCutObjectSelector<reco::PFMET> *_recPFMHTSelector;
  StringCutObjectSelector<reco::GenMET> *_genMETSelector;
  StringCutObjectSelector<reco::CaloMET> *_recCaloMETSelector;
  StringCutObjectSelector<reco::CaloMET> *_recCaloMHTSelector;
  StringCutObjectSelector<reco::PFTau> *_recPFTauSelector;
  StringCutObjectSelector<reco::Photon> *_recPhotonSelector;
  StringCutObjectSelector<reco::PFJet> *_recPFJetSelector;
  StringCutObjectSelector<reco::CaloJet> *_recCaloJetSelector;

  /// The plotters: managers of each hlt path where the plots are done
  std::vector<HLTExoticaPlotter> _plotters;

  /// counting HLT passed events
  std::map<std::string, int> _triggerCounter;

  /// Interface to the HLT information
  HLTConfigProvider _hltConfig;

  /// Structure of the MonitorElements
  std::map<std::string, MonitorElement *> _elements;
};

#endif