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
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) {
116  statusMap = &setup.getData(statusMapToken_);
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:
cmsHarvester.nevents
nevents
Definition: cmsHarvester.py:3176
DTSegmentAnalysisTask::topHistoFolder
std::string topHistoFolder
Definition: DTSegmentAnalysisTask.h:89
DTSegmentAnalysisTask::statusMap
const DTStatusFlag * statusMap
Definition: DTSegmentAnalysisTask.h:70
DTSLRecSegment2D
Definition: DTSLRecSegment2D.h:15
DTSegmentAnalysisTask::nhitsCut
int nhitsCut
Definition: DTSegmentAnalysisTask.h:95
FastTimerService_cff.range
range
Definition: FastTimerService_cff.py:34
DTSegmentAnalysisTask::checkNoisyChannels
bool checkNoisyChannels
Definition: DTSegmentAnalysisTask.h:76
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
DTSegmentAnalysisTask::dtGeom
const DTGeometry * dtGeom
Definition: DTSegmentAnalysisTask.h:66
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
DTSegmentAnalysisTask::statusMapToken_
edm::ESGetToken< DTStatusFlag, DTStatusFlagRcd > statusMapToken_
Definition: DTSegmentAnalysisTask.h:69
DQMStore.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:57
visDQMUpload.context
context
Definition: visDQMUpload.py:37
DTSegmentAnalysisTask::muonGeomToken_
edm::ESGetToken< DTGeometry, MuonGeometryRecord > muonGeomToken_
Definition: DTSegmentAnalysisTask.h:65
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
DTStatusFlag.h
DTSegmentAnalysisTask::~DTSegmentAnalysisTask
~DTSegmentAnalysisTask() override
Destructor.
Definition: DTSegmentAnalysisTask.cc:52
DTGeometry.h
DTSegmentAnalysisTask::fillHistos
void fillHistos(DTChamberId chamberId, int nHits, float chi2)
Definition: DTSegmentAnalysisTask.cc:269
edm::ParameterSet
Definition: ParameterSet.h:47
edm::Transition
Transition
Definition: Transition.h:12
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
DTSegmentAnalysisTask::analyze
void analyze(const edm::Event &event, const edm::EventSetup &setup) override
Definition: DTSegmentAnalysisTask.cc:105
DTSegmentAnalysisTask.h
combine.histos
histos
Definition: combine.py:4
DTSegmentAnalysisTask::nEventMonitor
MonitorElement * nEventMonitor
Definition: DTSegmentAnalysisTask.h:97
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:91
DTSegmentAnalysisTask::histosPerCh
std::map< DTChamberId, std::vector< MonitorElement * > > histosPerCh
Definition: DTSegmentAnalysisTask.h:84
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
edm::Transition::BeginRun
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:62
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:85
Pi
const double Pi
Definition: CosmicMuonParameters.h:18
DTSegmentAnalysisTask::recHits4DToken_
edm::EDGetTokenT< DTRecSegment4DCollection > recHits4DToken_
Definition: DTSegmentAnalysisTask.h:73
DTSegmentAnalysisTask::bookHistos
void bookHistos(DQMStore::IBooker &ibooker, DTChamberId chamberId)
Definition: DTSegmentAnalysisTask.cc:243
DTSegmentAnalysisTask::bookHistograms
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
Definition: DTSegmentAnalysisTask.cc:62
DTChamberId
Definition: DTChamberId.h:14
DTSegmentAnalysisTask::nevents
int nevents
Definition: DTSegmentAnalysisTask.h:87
ParameterSet.h
DTSegmentAnalysisTask::DTSegmentAnalysisTask
DTSegmentAnalysisTask(const edm::ParameterSet &pset)
Constructor.
Definition: DTSegmentAnalysisTask.cc:33
edm::HandleBase::isValid
bool isValid() const
Definition: HandleBase.h:70
event
Definition: event.py:1
DeDxTools::esConsumes
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::Event
Definition: Event.h:73
HLT_FULL_cff.distance
distance
Definition: HLT_FULL_cff.py:7746
DTTopology.h
DTSegmentAnalysisTask::phiSegmCut
double phiSegmCut
Definition: DTSegmentAnalysisTask.h:93
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