CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
CommonModeAnalyzer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SiStripTools
4 // Class: CommonModeAnalyzer
5 //
13 //
14 // Original Author: Andrea Venturi
15 // Created: Tue Jul 19 11:56:00 CEST 2009
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 
22 // user include files
23 #include "TH1D.h"
24 #include "TProfile.h"
25 #include <vector>
26 #include <algorithm>
27 #include <string>
28 
32 
35 
37 
39 
42 
44 
47 
50 
53 
56 
61 //
62 // class decleration
63 //
64 
66 public:
67  explicit CommonModeAnalyzer(const edm::ParameterSet&);
68  ~CommonModeAnalyzer() override;
69 
70 private:
71  void beginJob() override;
72  void beginRun(const edm::Run&, const edm::EventSetup&) override;
73  void endRun(const edm::Run&, const edm::EventSetup&) override;
74  void analyze(const edm::Event&, const edm::EventSetup&) override;
75  void endJob() override;
76 
77  void updateDetCabling(const SiStripDetCablingRcd& iRcd);
78 
79  // ----------member data ---------------------------
80 
86  const bool m_ignorebadfedmod;
88  int m_nevents;
89 
90  std::vector<DetIdSelector> m_selections;
91  std::vector<std::string> m_labels;
92  std::vector<TH1D*> m_cmdist;
93  std::vector<TH1D*> m_nmodules;
94  std::vector<TH1D*> m_napvs;
95  std::vector<TProfile*> m_cmvsdbxincycle;
96  std::vector<TProfile**> m_cmvsbxrun;
97  std::vector<TProfile**> m_cmvsorbitrun;
98 
100 
103  const SiStripDetCabling* m_detCabling = nullptr;
104 };
105 
106 //
107 // constants, enums and typedefs
108 //
109 
110 //
111 // static data member definitions
112 //
113 
114 //
115 // constructors and destructor
116 //
118  : m_digicollectionToken(
119  consumes<edm::DetSetVector<SiStripRawDigi> >(iConfig.getParameter<edm::InputTag>("digiCollection"))),
120  m_historyProductToken(consumes<EventWithHistory>(iConfig.getParameter<edm::InputTag>("historyProduct"))),
121  m_apvphasecollToken(consumes<APVCyclePhaseCollection>(iConfig.getParameter<edm::InputTag>("apvPhaseCollection"))),
122  m_digibadmodulecollectionToken(
123  consumes<DetIdCollection>(iConfig.getParameter<edm::InputTag>("badModuleDigiCollection"))),
124  m_phasepart(iConfig.getUntrackedParameter<std::string>("phasePartition", "None")),
125  m_ignorebadfedmod(iConfig.getParameter<bool>("ignoreBadFEDMod")),
126  m_ignorenotconnected(iConfig.getParameter<bool>("ignoreNotConnected")),
127  m_nevents(0),
128  m_selections(),
129  m_labels(),
130  m_cmdist(),
131  m_nmodules(),
132  m_napvs(),
133  m_cmvsdbxincycle(),
134  m_cmvsbxrun(),
135  m_cmvsorbitrun(),
136  m_rhm(consumesCollector()),
137  m_detCablingWatcher(this, &CommonModeAnalyzer::updateDetCabling),
138  m_detCablingToken(esConsumes()) {
139  //now do what ever initialization is needed
140 
142 
143  std::vector<edm::ParameterSet> selconfigs = iConfig.getParameter<std::vector<edm::ParameterSet> >("selections");
144 
145  for (std::vector<edm::ParameterSet>::const_iterator selconfig = selconfigs.begin(); selconfig != selconfigs.end();
146  ++selconfig) {
147  std::string label = selconfig->getParameter<std::string>("label");
148  DetIdSelector selection(*selconfig);
149  m_selections.push_back(selection);
150 
151  {
152  std::string hname = label + "_CommonMode";
153  std::string htitle = label + " Common Mode";
154  m_cmdist.push_back(tfserv->make<TH1D>(hname.c_str(), htitle.c_str(), 1024, -0.5, 1024 - 0.5));
155  m_cmdist.back()->GetXaxis()->SetTitle("ADC");
156  }
157  {
158  std::string hname = label + "_nmodules";
159  std::string htitle = label + " Number of Modules with CM value";
160  m_nmodules.push_back(tfserv->make<TH1D>(hname.c_str(), htitle.c_str(), 20000, -0.5, 20000 - 0.5));
161  m_nmodules.back()->GetXaxis()->SetTitle("#modules");
162  }
163  {
164  std::string hname = label + "_napvs";
165  std::string htitle = label + " Number of APVs with CM value";
166  m_napvs.push_back(tfserv->make<TH1D>(hname.c_str(), htitle.c_str(), 2000, -0.5, 80000 - 0.5));
167  m_napvs.back()->GetXaxis()->SetTitle("#apvs");
168  }
169  {
170  std::string hname = label + "_CMvsDBXinCycle";
171  std::string htitle = label + " Common Mode vs DBX in Cycle";
172  m_cmvsdbxincycle.push_back(tfserv->make<TProfile>(hname.c_str(), htitle.c_str(), 1000, -0.5, 1000 - 0.5));
173  m_cmvsdbxincycle.back()->GetXaxis()->SetTitle("DBX in cycle");
174  m_cmvsdbxincycle.back()->GetYaxis()->SetTitle("CM (ADC counts)");
175  }
176  {
177  std::string hname = label + "_CMvsBX";
178  std::string htitle = label + " Common Mode vs BX";
179  m_cmvsbxrun.push_back(m_rhm.makeTProfile(hname.c_str(), htitle.c_str(), 3565, -0.5, 3565 - 0.5));
180  }
181  {
182  std::string hname = label + "_CMvsOrbit";
183  std::string htitle = label + " Common Mode vs Orbit";
184  m_cmvsorbitrun.push_back(m_rhm.makeTProfile(hname.c_str(), htitle.c_str(), 4 * 500, 0, 500 * 262144));
185  }
186  }
187 }
188 
190  // do anything here that needs to be done at desctruction time
191  // (e.g. close files, deallocate resources etc.)
192 }
193 
194 //
195 // member functions
196 //
197 
198 // ------------ method called to for each event ------------
200  using namespace edm;
201 
202  m_detCablingWatcher.check(iSetup);
203 
204  m_nevents++;
205 
208 
210  iEvent.getByToken(m_apvphasecollToken, apvphase);
211 
212  Handle<DetIdCollection> badmodules;
213  iEvent.getByToken(m_digibadmodulecollectionToken, badmodules);
214 
215  int thephase = APVCyclePhaseCollection::invalid;
216  if (apvphase.isValid() && !apvphase.failedToGet()) {
217  thephase = apvphase->getPhase(m_phasepart);
218  }
219  bool isphaseok = (thephase != APVCyclePhaseCollection::invalid && thephase != APVCyclePhaseCollection::multiphase &&
221 
223  iEvent.getByToken(m_digicollectionToken, digis);
224 
225  // loop on detector with digis
226 
227  std::vector<int> nmodules(m_selections.size(), 0);
228  std::vector<int> napvs(m_selections.size(), 0);
229 
230  for (edm::DetSetVector<SiStripRawDigi>::const_iterator mod = digis->begin(); mod != digis->end(); mod++) {
231  std::vector<const FedChannelConnection*> conns = m_detCabling->getConnections(mod->detId());
232 
233  if (!m_ignorebadfedmod || std::find(badmodules->begin(), badmodules->end(), mod->detId()) == badmodules->end()) {
234  for (unsigned int isel = 0; isel < m_selections.size(); ++isel) {
235  if (m_selections[isel].isSelected(mod->detId())) {
236  unsigned int strip = 0;
237  ++nmodules[isel];
238  for (edm::DetSet<SiStripRawDigi>::const_iterator digi = mod->begin(); digi != mod->end(); digi++, strip++) {
239  LogDebug("StripNumber") << "Strip number " << strip;
240  if (!m_ignorenotconnected ||
241  ((conns.size() > strip / 2) && conns[strip / 2] && conns[strip / 2]->isConnected())) {
242  ++napvs[isel];
243  m_cmdist[isel]->Fill(digi->adc());
244  if (isphaseok)
245  m_cmvsdbxincycle[isel]->Fill(he->deltaBXinCycle(thephase), digi->adc());
246  if (m_cmvsbxrun[isel] && *(m_cmvsbxrun[isel]))
247  (*(m_cmvsbxrun[isel]))->Fill(iEvent.bunchCrossing(), digi->adc());
248  if (m_cmvsorbitrun[isel] && *(m_cmvsorbitrun[isel]))
249  (*(m_cmvsorbitrun[isel]))->Fill(iEvent.orbitNumber(), digi->adc());
250  } else if (digi->adc() > 0) {
251  edm::LogWarning("NonZeroCMWhenDisconnected")
252  << " Non zero CM in " << mod->detId() << " APV " << strip << " with " << conns.size()
253  << " connections and connection pointer" << conns[strip / 2];
254  }
255  }
256  }
257  }
258  }
259  }
260  for (unsigned int isel = 0; isel < m_selections.size(); ++isel) {
261  m_nmodules[isel]->Fill(nmodules[isel]);
262  m_napvs[isel]->Fill(napvs[isel]);
263  }
264 }
265 
267  m_rhm.beginRun(iRun);
268 
269  for (std::vector<TProfile**>::const_iterator cmvsbx = m_cmvsbxrun.begin(); cmvsbx != m_cmvsbxrun.end(); ++cmvsbx) {
270  if (*cmvsbx && *(*cmvsbx)) {
271  (*(*cmvsbx))->GetXaxis()->SetTitle("BX");
272  (*(*cmvsbx))->GetYaxis()->SetTitle("CM (ADC counts)");
273  }
274  }
275  for (std::vector<TProfile**>::const_iterator cmvsorbit = m_cmvsorbitrun.begin(); cmvsorbit != m_cmvsorbitrun.end();
276  ++cmvsorbit) {
277  if (*cmvsorbit && *(*cmvsorbit)) {
278  (*(*cmvsorbit))->GetXaxis()->SetTitle("orbit");
279  (*(*cmvsorbit))->GetYaxis()->SetTitle("CM (ADC counts)");
280  (*(*cmvsorbit))->SetCanExtend(TH1::kXaxis);
281  }
282  }
283 }
284 
286 
287 // ------------ method called once each job just before starting event loop ------------
289 
290 // ------------ method called once each job just after ending the event loop ------------
291 void CommonModeAnalyzer::endJob() { edm::LogInfo("EndOfJob") << m_nevents << " analyzed events"; }
292 
295 }
296 
297 //define this as a plug-in
std::vector< TH1D * > m_nmodules
void endRun(const edm::Run &, const edm::EventSetup &) override
void analyze(const edm::Event &, const edm::EventSetup &) override
std::vector< TProfile ** > m_cmvsbxrun
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
std::vector< TH1D * > m_cmdist
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void beginRun(const edm::Run &, const edm::EventSetup &) override
selection
main part
Definition: corrVsCorr.py:100
int bunchCrossing() const
Definition: EventBase.h:64
const SiStripDetCabling * m_detCabling
The cabling object.
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
edm::ESGetToken< SiStripDetCabling, SiStripDetCablingRcd > m_detCablingToken
const std::string m_phasepart
void beginJob() override
const std::vector< const FedChannelConnection * > & getConnections(uint32_t det_id) const
char const * label
int iEvent
Definition: GenABIO.cc:224
const bool m_ignorenotconnected
ProductT const & get(ESGetToken< ProductT, DepRecordT > const &iToken) const
std::vector< TProfile ** > m_cmvsorbitrun
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
m_rhm(consumesCollector())
void endJob() override
TProfile ** makeTProfile(const char *name, const char *title, const unsigned int nbinx, const double xmin, const double xmax)
CommonModeAnalyzer(const edm::ParameterSet &)
edm::EDGetTokenT< EventWithHistory > m_historyProductToken
int orbitNumber() const
Definition: EventBase.h:65
RunHistogramManager m_rhm
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > m_digicollectionToken
edm::ESWatcher< SiStripDetCablingRcd > m_detCablingWatcher
Log< level::Info, false > LogInfo
std::vector< std::string > m_labels
void beginRun(const edm::Run &iRun)
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
bool isSelected(const std::vector< L1HPSPFTauQualityCut > &qualityCuts, const l1t::PFCandidate &pfCand, float_t primaryVertexZ)
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
std::vector< DetIdSelector > m_selections
std::vector< TProfile * > m_cmvsdbxincycle
edm::EDGetTokenT< DetIdCollection > m_digibadmodulecollectionToken
void updateDetCabling(const SiStripDetCablingRcd &iRcd)
Log< level::Warning, false > LogWarning
collection_type::const_iterator const_iterator
Definition: DetSet.h:31
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
std::vector< TH1D * > m_napvs
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
T mod(const T &a, const T &b)
Definition: ecalDccMap.h:4
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
Definition: Run.h:45
edm::EDGetTokenT< APVCyclePhaseCollection > m_apvphasecollToken
#define LogDebug(id)