CMS 3D CMS Logo

AlCaHBHEMuonProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //#define DebugLog
3 
4 // system include files
5 #include <atomic>
6 #include <memory>
7 #include <string>
8 #include <cmath>
9 #include <iostream>
10 #include <sstream>
11 #include <fstream>
12 #include <vector>
13 #include <boost/regex.hpp>
14 
15 // user include files
26 
36 
37 //
38 // class declaration
39 //
40 
41 namespace AlCaHBHEMuons {
42  struct Counters {
43  Counters() : nAll_(0), nGood_(0) {}
44  mutable std::atomic<unsigned int> nAll_, nGood_;
45  };
46 } // namespace AlCaHBHEMuons
47 
48 class AlCaHBHEMuonProducer : public edm::stream::EDProducer<edm::GlobalCache<AlCaHBHEMuons::Counters> > {
49 public:
51  ~AlCaHBHEMuonProducer() override;
52 
53  static std::unique_ptr<AlCaHBHEMuons::Counters> initializeGlobalCache(edm::ParameterSet const&) {
54  return std::make_unique<AlCaHBHEMuons::Counters>();
55  }
56 
57  void produce(edm::Event&, const edm::EventSetup&) override;
58  void endStream() override;
59  static void globalEndJob(const AlCaHBHEMuons::Counters* counters);
60 
61 private:
62  void beginRun(edm::Run const&, edm::EventSetup const&) override;
63  void endRun(edm::Run const&, edm::EventSetup const&) override;
64  bool select(const reco::MuonCollection&);
65 
66  // ----------member data ---------------------------
67  unsigned int nRun_, nAll_, nGood_;
69  edm::InputTag labelEB_, labelEE_, labelHBHE_, labelMuon_;
70  double pMuonMin_;
71 
78 };
79 
81  : nRun_(0), nAll_(0), nGood_(0) {
82  //Get the run parameters
83  labelBS_ = iConfig.getParameter<edm::InputTag>("BeamSpotLabel");
84  labelVtx_ = iConfig.getParameter<edm::InputTag>("VertexLabel");
85  labelEB_ = iConfig.getParameter<edm::InputTag>("EBRecHitLabel");
86  labelEE_ = iConfig.getParameter<edm::InputTag>("EERecHitLabel");
87  labelHBHE_ = iConfig.getParameter<edm::InputTag>("HBHERecHitLabel");
88  labelMuon_ = iConfig.getParameter<edm::InputTag>("MuonLabel");
89  pMuonMin_ = iConfig.getParameter<double>("MinimumMuonP");
90 
91  // define tokens for access
92  tok_Vtx_ = consumes<reco::VertexCollection>(labelVtx_);
93  tok_BS_ = consumes<reco::BeamSpot>(labelBS_);
94  tok_EB_ = consumes<EcalRecHitCollection>(labelEB_);
95  tok_EE_ = consumes<EcalRecHitCollection>(labelEE_);
96  tok_HBHE_ = consumes<HBHERecHitCollection>(labelHBHE_);
97  tok_Muon_ = consumes<reco::MuonCollection>(labelMuon_);
98 
99  edm::LogInfo("HcalHBHEMuon") << "Parameters read from config file \n"
100  << "\t minP of muon " << pMuonMin_ << "\t input labels " << labelBS_ << " " << labelVtx_
101  << " " << labelEB_ << " " << labelEE_ << " " << labelHBHE_ << " " << labelMuon_;
102 
103  //saves the following collections
104  produces<reco::BeamSpot>(labelBS_.label());
105  produces<reco::VertexCollection>(labelVtx_.label());
106  produces<EcalRecHitCollection>(labelEB_.instance());
107  produces<EcalRecHitCollection>(labelEE_.instance());
108  produces<HBHERecHitCollection>(labelHBHE_.label());
109  produces<reco::MuonCollection>(labelMuon_.label());
110 }
111 
113 
115  ++nAll_;
116  bool valid(true);
117 #ifdef DebugLog
118  edm::LogInfo("HcalHBHEMuon") << "AlCaHBHEMuonProducer::Run " << iEvent.id().run() << " Event " << iEvent.id().event()
119  << " Luminosity " << iEvent.luminosityBlock() << " Bunch " << iEvent.bunchCrossing();
120 #endif
121 
122  //Step1: Get all the relevant containers
124  iEvent.getByToken(tok_BS_, bmspot);
125  if (!bmspot.isValid()) {
126  edm::LogWarning("HcalHBHEMuon") << "AlCaHBHEMuonProducer: Error! can't get product " << labelBS_;
127  valid = false;
128  }
129 
131  iEvent.getByToken(tok_Vtx_, vt);
132  if (!vt.isValid()) {
133  edm::LogWarning("HcalHBHEMuon") << "AlCaHBHEMuonProducer: Error! can't get product " << labelVtx_;
134  valid = false;
135  }
136 
137  edm::Handle<EcalRecHitCollection> barrelRecHitsHandle;
138  iEvent.getByToken(tok_EB_, barrelRecHitsHandle);
139  if (!barrelRecHitsHandle.isValid()) {
140  edm::LogWarning("HcalHBHEMuon") << "AlCaHBHEMuonProducer: Error! can't get product " << labelEB_;
141  valid = false;
142  }
143 
144  edm::Handle<EcalRecHitCollection> endcapRecHitsHandle;
145  iEvent.getByToken(tok_EE_, endcapRecHitsHandle);
146  if (!endcapRecHitsHandle.isValid()) {
147  edm::LogWarning("HcalHBHEMuon") << "AlCaHBHEMuonProducer: Error! can't get product " << labelEE_;
148  valid = false;
149  }
150 
152  iEvent.getByToken(tok_HBHE_, hbhe);
153  if (!hbhe.isValid()) {
154  edm::LogWarning("HcalHBHEMuon") << "AlCaHBHEMuonProducer: Error! can't get product " << labelHBHE_;
155  valid = false;
156  }
157 
159  iEvent.getByToken(tok_Muon_, muonhandle);
160  if (!muonhandle.isValid()) {
161  edm::LogWarning("HcalHBHEMuon") << "AlCaHBHEMuonProducer: Error! can't get product " << labelMuon_;
162  valid = false;
163  }
164 
165 #ifdef DebugLog
166  edm::LogInfo("HcalHBHEMuon") << "AlCaHBHEMuonProducer::obtained the collections with validity flag " << valid;
167 #endif
168 
169  //For accepted events
170  auto outputBeamSpot = std::make_unique<reco::BeamSpot>();
171  auto outputVColl = std::make_unique<reco::VertexCollection>();
172  auto outputEBColl = std::make_unique<EBRecHitCollection>();
173  auto outputEEColl = std::make_unique<EERecHitCollection>();
174  auto outputHBHEColl = std::make_unique<HBHERecHitCollection>();
175  auto outputMColl = std::make_unique<reco::MuonCollection>();
176 
177  if (valid) {
178  const reco::BeamSpot beam = *(bmspot.product());
179  outputBeamSpot = std::make_unique<reco::BeamSpot>(
180  beam.position(), beam.sigmaZ(), beam.dxdz(), beam.dydz(), beam.BeamWidthX(), beam.covariance(), beam.type());
181  const reco::VertexCollection vtx = *(vt.product());
182  const EcalRecHitCollection ebcoll = *(barrelRecHitsHandle.product());
183  const EcalRecHitCollection eecoll = *(endcapRecHitsHandle.product());
184  const HBHERecHitCollection hbhecoll = *(hbhe.product());
185  const reco::MuonCollection muons = *(muonhandle.product());
186 
187  bool accept = select(muons);
188 
189  if (accept) {
190  ++nGood_;
191 
192  for (reco::VertexCollection::const_iterator vtr = vtx.begin(); vtr != vtx.end(); ++vtr)
193  outputVColl->push_back(*vtr);
194 
195  for (edm::SortedCollection<EcalRecHit>::const_iterator ehit = ebcoll.begin(); ehit != ebcoll.end(); ++ehit)
196  outputEBColl->push_back(*ehit);
197 
198  for (edm::SortedCollection<EcalRecHit>::const_iterator ehit = eecoll.begin(); ehit != eecoll.end(); ++ehit)
199  outputEEColl->push_back(*ehit);
200 
201  for (std::vector<HBHERecHit>::const_iterator hhit = hbhecoll.begin(); hhit != hbhecoll.end(); ++hhit)
202  outputHBHEColl->push_back(*hhit);
203 
204  for (reco::MuonCollection::const_iterator muon = muons.begin(); muon != muons.end(); ++muon)
205  outputMColl->push_back(*muon);
206  }
207  }
208 
209  iEvent.put(std::move(outputBeamSpot), labelBS_.label());
210  iEvent.put(std::move(outputVColl), labelVtx_.label());
211  iEvent.put(std::move(outputEBColl), labelEB_.instance());
212  iEvent.put(std::move(outputEEColl), labelEE_.instance());
213  iEvent.put(std::move(outputHBHEColl), labelHBHE_.label());
214  iEvent.put(std::move(outputMColl), labelMuon_.label());
215 }
216 
218  globalCache()->nAll_ += nAll_;
219  globalCache()->nGood_ += nGood_;
220 }
221 
223  edm::LogInfo("HcalHBHEMuon") << "Finds " << count->nGood_ << " good tracks in " << count->nAll_ << " events";
224 }
225 
226 void AlCaHBHEMuonProducer::beginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {
227  edm::LogInfo("HcalHBHEMuon") << "Run[" << nRun_ << "] " << iRun.run();
228 }
229 
231  ++nRun_;
232  edm::LogInfo("HcalHBHEMuon") << "endRun[" << nRun_ << "] " << iRun.run();
233 }
234 
236  bool ok(false);
237  for (unsigned int k = 0; k < muons.size(); ++k) {
238  if (muons[k].p() > pMuonMin_) {
239  ok = true;
240  break;
241  }
242  }
243  return ok;
244 }
245 
247 
RunNumber_t run() const
Definition: EventID.h:39
std::atomic< unsigned int > nGood_
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
bool select(const reco::MuonCollection &)
RunNumber_t run() const
Definition: RunBase.h:40
static std::unique_ptr< AlCaHBHEMuons::Counters > initializeGlobalCache(edm::ParameterSet const &)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
edm::EDGetTokenT< EcalRecHitCollection > tok_EE_
std::atomic< unsigned int > nAll_
void beginRun(edm::Run const &, edm::EventSetup const &) override
std::vector< T >::const_iterator const_iterator
int bunchCrossing() const
Definition: EventBase.h:64
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:61
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
void endRun(edm::Run const &, edm::EventSetup const &) override
AlCaHBHEMuonProducer(edm::ParameterSet const &, const AlCaHBHEMuons::Counters *count)
double dydz() const
dydz slope
Definition: BeamSpot.h:84
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::EDGetTokenT< HBHERecHitCollection > tok_HBHE_
double BeamWidthX() const
beam width X
Definition: BeamSpot.h:86
bool isValid() const
Definition: HandleBase.h:74
double dxdz() const
dxdz slope
Definition: BeamSpot.h:82
int k[5][pyjets_maxn]
const_iterator end() const
T const * product() const
Definition: Handle.h:74
double sigmaZ() const
sigma z
Definition: BeamSpot.h:80
edm::EDGetTokenT< EcalRecHitCollection > tok_EB_
edm::EDGetTokenT< reco::BeamSpot > tok_BS_
std::string const & label() const
Definition: InputTag.h:36
double covariance(int i, int j) const
(i,j)-th element of error matrix
Definition: BeamSpot.h:112
edm::EventID id() const
Definition: EventBase.h:59
void produce(edm::Event &, const edm::EventSetup &) override
edm::EDGetTokenT< reco::VertexCollection > tok_Vtx_
const Point & position() const
position
Definition: BeamSpot.h:62
static void globalEndJob(const AlCaHBHEMuons::Counters *counters)
std::string const & instance() const
Definition: InputTag.h:37
def move(src, dest)
Definition: eostools.py:511
edm::EDGetTokenT< reco::MuonCollection > tok_Muon_
const_iterator begin() const
Definition: Run.h:45
BeamType type() const
return beam type
Definition: BeamSpot.h:129