CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DTSegmentAnalysisTask.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author G. Cerminara - INFN Torino
5  * revised by G. Mila - INFN Torino
6  */
7 
9 
10 // Framework
16 
19 
20 //Geometry
24 
26 
27 #include <iterator>
28 #include "TMath.h"
29 
30 using namespace edm;
31 using namespace std;
32 
34  : muonGeomToken_(esConsumes<edm::Transition::BeginRun>()), statusMapToken_(esConsumes()), nevents(0) {
35  edm::LogVerbatim("DTDQM|DTMonitorModule|DTSegmentAnalysisTask") << "[DTSegmentAnalysisTask] Constructor called!";
36 
37  // switch for detailed analysis
38  detailedAnalysis = pset.getUntrackedParameter<bool>("detailedAnalysis", false);
39  // the name of the 4D rec hits collection
40  recHits4DToken_ = consumes<DTRecSegment4DCollection>(edm::InputTag(pset.getParameter<string>("recHits4DLabel")));
41  // Get the map of noisy channels
42  checkNoisyChannels = pset.getUntrackedParameter<bool>("checkNoisyChannels", false);
43  phiSegmCut = pset.getUntrackedParameter<double>("phiSegmCut", 30.);
44  nhitsCut = pset.getUntrackedParameter<int>("nhitsCut", 12);
45 
46  // top folder for the histograms in DQMStore
47  topHistoFolder = pset.getUntrackedParameter<string>("topHistoFolder", "DT/02-Segments");
48  // hlt DQM mode
49  hltDQMMode = pset.getUntrackedParameter<bool>("hltDQMMode", false);
50 }
51 
53  //FR moved fron endjob
54  edm::LogVerbatim("DTDQM|DTMonitorModule|DTSegmentAnalysisTask") << "[DTSegmentAnalysisTask] Destructor called!";
55 }
56 
58  // Get the DT Geometry
59  dtGeom = &context.getData(muonGeomToken_);
60 }
61 
63  edm::Run const& iRun,
64  edm::EventSetup const& context) {
65  if (!hltDQMMode) {
66  ibooker.setCurrentFolder("DT/EventInfo/Counters");
67  nEventMonitor = ibooker.bookFloat("nProcessedEventsSegment");
68  }
69 
70  for (int wh = -2; wh <= 2; wh++) {
71  stringstream wheel;
72  wheel << wh;
73  ibooker.setCurrentFolder(topHistoFolder + "/Wheel" + wheel.str());
74  string histoName = "numberOfSegments_W" + wheel.str();
75 
76  summaryHistos[wh] = ibooker.book2D(histoName.c_str(), histoName.c_str(), 12, 1, 13, 4, 1, 5);
77  summaryHistos[wh]->setAxisTitle("Sector", 1);
78  summaryHistos[wh]->setBinLabel(1, "1", 1);
79  summaryHistos[wh]->setBinLabel(2, "2", 1);
80  summaryHistos[wh]->setBinLabel(3, "3", 1);
81  summaryHistos[wh]->setBinLabel(4, "4", 1);
82  summaryHistos[wh]->setBinLabel(5, "5", 1);
83  summaryHistos[wh]->setBinLabel(6, "6", 1);
84  summaryHistos[wh]->setBinLabel(7, "7", 1);
85  summaryHistos[wh]->setBinLabel(8, "8", 1);
86  summaryHistos[wh]->setBinLabel(9, "9", 1);
87  summaryHistos[wh]->setBinLabel(10, "10", 1);
88  summaryHistos[wh]->setBinLabel(11, "11", 1);
89  summaryHistos[wh]->setBinLabel(12, "12", 1);
90  summaryHistos[wh]->setBinLabel(1, "MB1", 2);
91  summaryHistos[wh]->setBinLabel(2, "MB2", 2);
92  summaryHistos[wh]->setBinLabel(3, "MB3", 2);
93  summaryHistos[wh]->setBinLabel(4, "MB4", 2);
94  }
95 
96  // loop over all the DT chambers & book the histos
97  const vector<const DTChamber*>& chambers = dtGeom->chambers();
98  vector<const DTChamber*>::const_iterator ch_it = chambers.begin();
99  vector<const DTChamber*>::const_iterator ch_end = chambers.end();
100  for (; ch_it != ch_end; ++ch_it) {
101  bookHistos(ibooker, (*ch_it)->id());
102  }
103 }
104 
106  nevents++;
108 
109  edm::LogVerbatim("DTDQM|DTMonitorModule|DTSegmentAnalysisTask")
110  << "[DTSegmentAnalysisTask] Analyze #Run: " << event.id().run() << " #Event: " << event.id().event();
111  if (!(event.id().event() % 1000))
112  edm::LogVerbatim("DTDQM|DTMonitorModule|DTSegmentAnalysisTask")
113  << "[DTSegmentAnalysisTask] Analyze #Run: " << event.id().run() << " #Event: " << event.id().event();
114 
115  if (checkNoisyChannels) {
117  }
118 
119  // -- 4D segment analysis -----------------------------------------------------
120 
121  // Get the 4D segment collection from the event
123  event.getByToken(recHits4DToken_, all4DSegments);
124 
125  if (!all4DSegments.isValid())
126  return;
127 
128  // Loop over all chambers containing a segment
130  for (chamberId = all4DSegments->id_begin(); chamberId != all4DSegments->id_end(); ++chamberId) {
131  // Get the range for the corresponding ChamerId
132  DTRecSegment4DCollection::range range = all4DSegments->get(*chamberId);
133 
134  edm::LogVerbatim("DTDQM|DTMonitorModule|DTSegmentAnalysisTask")
135  << " Chamber: " << *chamberId << " has " << distance(range.first, range.second) << " 4D segments";
136 
137  // Loop over the rechits of this ChamerId
138  for (DTRecSegment4DCollection::const_iterator segment4D = range.first; segment4D != range.second; ++segment4D) {
139  //FOR NOISY CHANNELS////////////////////////////////
140  bool segmNoisy = false;
141  if (checkNoisyChannels) {
142  if ((*segment4D).hasPhi()) {
143  const DTChamberRecSegment2D* phiSeg = (*segment4D).phiSegment();
144  vector<DTRecHit1D> phiHits = phiSeg->specificRecHits();
145  map<DTSuperLayerId, vector<DTRecHit1D> > hitsBySLMap;
146  for (vector<DTRecHit1D>::const_iterator hit = phiHits.begin(); hit != phiHits.end(); ++hit) {
147  DTWireId wireId = (*hit).wireId();
148 
149  // Check for noisy channels to skip them
150  bool isNoisy = false;
151  bool isFEMasked = false;
152  bool isTDCMasked = false;
153  bool isTrigMask = false;
154  bool isDead = false;
155  bool isNohv = false;
156  statusMap->cellStatus(wireId, isNoisy, isFEMasked, isTDCMasked, isTrigMask, isDead, isNohv);
157  if (isNoisy) {
158  edm::LogVerbatim("DTDQM|DTMonitorModule|DTSegmentAnalysisTask")
159  << "Wire: " << wireId << " is noisy, skipping!";
160  segmNoisy = true;
161  }
162  }
163  }
164 
165  if ((*segment4D).hasZed()) {
166  const DTSLRecSegment2D* zSeg = (*segment4D).zSegment(); // zSeg lives in the SL RF
167  // Check for noisy channels to skip them
168  vector<DTRecHit1D> zHits = zSeg->specificRecHits();
169  for (vector<DTRecHit1D>::const_iterator hit = zHits.begin(); hit != zHits.end(); ++hit) {
170  DTWireId wireId = (*hit).wireId();
171  bool isNoisy = false;
172  bool isFEMasked = false;
173  bool isTDCMasked = false;
174  bool isTrigMask = false;
175  bool isDead = false;
176  bool isNohv = false;
177  statusMap->cellStatus(wireId, isNoisy, isFEMasked, isTDCMasked, isTrigMask, isDead, isNohv);
178  if (isNoisy) {
179  edm::LogVerbatim("DTDQM|DTMonitorModule|DTSegmentAnalysisTask")
180  << "Wire: " << wireId << " is noisy, skipping!";
181  segmNoisy = true;
182  }
183  }
184  }
185 
186  } // end of switch on noisy channels
187  if (segmNoisy) {
188  edm::LogVerbatim("DTDQM|DTMonitorModule|DTSegmentAnalysisTask")
189  << "skipping the segment: it contains noisy cells";
190  continue;
191  }
192  //END FOR NOISY CHANNELS////////////////////////////////
193 
194  int nHits = 0;
195  if ((*segment4D).hasPhi())
196  nHits = (((*segment4D).phiSegment())->specificRecHits()).size();
197  if ((*segment4D).hasZed())
198  nHits = nHits + ((((*segment4D).zSegment())->specificRecHits()).size());
199 
200  double anglePhiSegm(0.);
201  if ((*segment4D).hasPhi()) {
202  double xdir = (*segment4D).phiSegment()->localDirection().x();
203  double zdir = (*segment4D).phiSegment()->localDirection().z();
204 
205  anglePhiSegm = atan(xdir / zdir) * 180. / TMath::Pi();
206  }
207  if (fabs(anglePhiSegm) > phiSegmCut)
208  continue;
209  // If the segment is in Wh+-2/SecX/MB1, get the DT chambers just above and check if there is a segment
210  // to validate the segment present in MB1
211  if (fabs((*chamberId).wheel()) == 2 && (*chamberId).station() == 1) {
212  bool segmOk = false;
213  int mb(2);
214  while (mb < 4) {
215  DTChamberId checkMB((*chamberId).wheel(), mb, (*chamberId).sector());
216  DTRecSegment4DCollection::range ckrange = all4DSegments->get(checkMB);
217 
218  for (DTRecSegment4DCollection::const_iterator cksegment4D = ckrange.first; cksegment4D != ckrange.second;
219  ++cksegment4D) {
220  int nHits = 0;
221  if ((*cksegment4D).hasPhi())
222  nHits = (((*cksegment4D).phiSegment())->specificRecHits()).size();
223  if ((*cksegment4D).hasZed())
224  nHits = nHits + ((((*cksegment4D).zSegment())->specificRecHits()).size());
225 
226  if (nHits >= nhitsCut)
227  segmOk = true;
228  }
229  mb++;
230  }
231 
232  if (!segmOk)
233  continue;
234  }
235  fillHistos(*chamberId, nHits, (*segment4D).chi2() / (*segment4D).degreesOfFreedom());
236  }
237  }
238 
239  // -----------------------------------------------------------------------------
240 }
241 
242 // Book a set of histograms for a give chamber
244  edm::LogVerbatim("DTDQM|DTMonitorModule|DTSegmentAnalysisTask") << " Booking histos for chamber: " << chamberId;
245 
246  // Compose the chamber name
247  stringstream wheel;
248  wheel << chamberId.wheel();
249  stringstream station;
250  station << chamberId.station();
251  stringstream sector;
252  sector << chamberId.sector();
253 
254  string chamberHistoName = "_W" + wheel.str() + "_St" + station.str() + "_Sec" + sector.str();
255 
256  ibooker.setCurrentFolder(topHistoFolder + "/Wheel" + wheel.str() + "/Sector" + sector.str() + "/Station" +
257  station.str());
258 
259  // Create the monitor elements
260  vector<MonitorElement*> histos;
261  histos.push_back(ibooker.book1D("h4DSegmNHits" + chamberHistoName, "# of hits per segment", 16, 0.5, 16.5));
262  if (detailedAnalysis) {
263  histos.push_back(ibooker.book1D("h4DChi2" + chamberHistoName, "4D Segment reduced Chi2", 20, 0, 20));
264  }
265  histosPerCh[chamberId] = histos;
266 }
267 
268 // Fill a set of histograms for a give chamber
270  int sector = chamberId.sector();
271  if (chamberId.sector() == 13) {
272  sector = 4;
273  } else if (chamberId.sector() == 14) {
274  sector = 10;
275  }
276 
277  summaryHistos[chamberId.wheel()]->Fill(sector, chamberId.station());
278 
279  vector<MonitorElement*> histos = histosPerCh[chamberId];
280  histos[0]->Fill(nHits);
281  if (detailedAnalysis) {
282  histos[1]->Fill(chi2);
283  }
284 }
285 
286 // Local Variables:
287 // show-trailing-whitespace: t
288 // truncate-lines: t
289 // End:
const double Pi
Log< level::Info, true > LogVerbatim
EventNumber_t event() const
Definition: EventID.h:40
void fillHistos(DTChamberId chamberId, int nHits, float chi2)
T getUntrackedParameter(std::string const &, T const &) const
const std::vector< const DTChamber * > & chambers() const
Return a vector of all Chamber.
Definition: DTGeometry.cc:84
MonitorElement * bookFloat(TString const &name, FUNC onbooking=NOOP())
Definition: DQMStore.h:80
std::pair< const_iterator, const_iterator > range
iterator range
Definition: RangeMap.h:50
const DTGeometry * dtGeom
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
void analyze(const edm::Event &event, const edm::EventSetup &setup) override
identifier iterator
Definition: RangeMap.h:130
edm::ESGetToken< DTStatusFlag, DTStatusFlagRcd > statusMapToken_
edm::ESGetToken< DTGeometry, MuonGeometryRecord > muonGeomToken_
std::map< DTChamberId, std::vector< MonitorElement * > > histosPerCh
const uint16_t range(const Frame &aFrame)
void Fill(long long x)
bool getData(T &iHolder) const
Definition: EventSetup.h:128
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
C::const_iterator const_iterator
constant access iterator type
Definition: RangeMap.h:43
~DTSegmentAnalysisTask() override
Destructor.
void bookHistos(DQMStore::IBooker &ibooker, DTChamberId chamberId)
Transition
Definition: Transition.h:12
bool isValid() const
Definition: HandleBase.h:70
std::vector< DTRecHit1D > specificRecHits() const
Access to specific components.
const DTStatusFlag * statusMap
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:177
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
caConstants::TupleMultiplicity const CAHitNtupletGeneratorKernelsGPU::HitToTuple const cms::cuda::AtomicPairCounter GPUCACell const *__restrict__ uint32_t const *__restrict__ gpuPixelDoublets::CellNeighborsVector const gpuPixelDoublets::CellTracksVector const GPUCACell::OuterHitOfCell const int32_t nHits
int cellStatus(int wheelId, int stationId, int sectorId, int slId, int layerId, int cellId, bool &noiseFlag, bool &feMask, bool &tdcMask, bool &trigMask, bool &deadFlag, bool &nohvFlag) const
get content
Definition: DTStatusFlag.h:90
MonitorElement * nEventMonitor
void dqmBeginRun(const edm::Run &, const edm::EventSetup &) override
BeginRun.
edm::EventID id() const
Definition: EventBase.h:59
int sector() const
Definition: DTChamberId.h:49
std::map< int, MonitorElement * > summaryHistos
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
int station() const
Return the station number.
Definition: DTChamberId.h:42
static char chambers[264][20]
Definition: ReadPGInfo.cc:243
edm::EDGetTokenT< DTRecSegment4DCollection > recHits4DToken_
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:39
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
tuple size
Write out results.
DTSegmentAnalysisTask(const edm::ParameterSet &pset)
Constructor.
Definition: Run.h:45