CMS 3D CMS Logo

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