CMS 3D CMS Logo

DTResidualCalibration.cc
Go to the documentation of this file.
1 
2 /*
3  * See header file for a description of this class.
4  *
5  */
6 
8 
9 // Framework
15 
16 //Geometry
19 
20 //RecHit
23 
27 
28 #include "TFile.h"
29 #include "TH1F.h"
30 #include "TH2F.h"
31 
32 #include <algorithm>
33 
35  : histRange_(pset.getParameter<double>("histogramRange")),
36  segment4DLabel_(pset.getParameter<edm::InputTag>("segment4DLabel")),
37  rootBaseDir_(pset.getUntrackedParameter<std::string>("rootBaseDir", "DT/Residuals")),
38  detailedAnalysis_(pset.getUntrackedParameter<bool>("detailedAnalysis", false)),
39  dtGeomToken_(esConsumes<edm::Transition::BeginRun>()) {
41  select_ = new DTSegmentSelector(pset, collector);
42 
43  LogDebug("Calibration") << "[DTResidualCalibration] Constructor called.";
44  consumes<DTRecSegment4DCollection>(edm::InputTag(segment4DLabel_));
45  std::string rootFileName = pset.getUntrackedParameter<std::string>("rootFileName", "residuals.root");
46  rootFile_ = new TFile(rootFileName.c_str(), "RECREATE");
47  rootFile_->cd();
48 
49  segmok = 0;
50  segmbad = 0;
51  nevent = 0;
52 }
53 
55  delete select_;
56  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Destructor called.";
57  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Analyzed events: " << nevent;
58  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Good segments: " << segmok;
59  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Bad segments: " << segmbad;
60 }
61 
62 void DTResidualCalibration::beginJob() { TH1::SetDefaultSumw2(true); }
63 
65  // get the geometry
67  dtGeomH = setup.getHandle(dtGeomToken_);
68  dtGeom_ = dtGeomH.product();
69 
70  // Loop over all the chambers
71  if (histoMapTH1F_.empty()) {
72  for (auto ch_it : dtGeom_->chambers()) {
73  // Loop over the SLs
74  for (auto sl_it : ch_it->superLayers()) {
75  DTSuperLayerId slId = (sl_it)->id();
76  bookHistos(slId);
77  if (detailedAnalysis_) {
78  for (auto layer_it : (sl_it)->layers()) {
79  DTLayerId layerId = (layer_it)->id();
80  bookHistos(layerId);
81  }
82  }
83  }
84  }
85  }
86 }
87 
89  rootFile_->cd();
90  ++nevent;
91 
92  // Get the 4D rechits from the event
94  event.getByLabel(segment4DLabel_, segments4D);
95 
96  // Loop over segments by chamber
98  for (chamberIdIt = segments4D->id_begin(); chamberIdIt != segments4D->id_end(); ++chamberIdIt) {
99  const DTChamber* chamber = dtGeom_->chamber(*chamberIdIt);
100 
101  // Get the range for the corresponding ChamberId
102  DTRecSegment4DCollection::range range = segments4D->get((*chamberIdIt));
103  // Loop over the rechits of this DetUnit
104  for (DTRecSegment4DCollection::const_iterator segment = range.first; segment != range.second; ++segment) {
105  LogTrace("Calibration") << "Segment local pos (in chamber RF): " << (*segment).localPosition()
106  << "\nSegment global pos: " << chamber->toGlobal((*segment).localPosition());
107 
108  if (!(*select_)(*segment, event, setup)) {
109  segmbad++;
110  continue;
111  }
112  segmok++;
113 
114  // Get all 1D RecHits at step 3 within the 4D segment
115  std::vector<DTRecHit1D> recHits1D_S3;
116 
117  if ((*segment).hasPhi()) {
118  const DTChamberRecSegment2D* phiSeg = (*segment).phiSegment();
119  const std::vector<DTRecHit1D>& phiRecHits = phiSeg->specificRecHits();
120  std::copy(phiRecHits.begin(), phiRecHits.end(), back_inserter(recHits1D_S3));
121  }
122 
123  if ((*segment).hasZed()) {
124  const DTSLRecSegment2D* zSeg = (*segment).zSegment();
125  const std::vector<DTRecHit1D>& zRecHits = zSeg->specificRecHits();
126  std::copy(zRecHits.begin(), zRecHits.end(), back_inserter(recHits1D_S3));
127  }
128 
129  // Loop over 1D RecHit inside 4D segment
130  for (std::vector<DTRecHit1D>::const_iterator recHit1D = recHits1D_S3.begin(); recHit1D != recHits1D_S3.end();
131  ++recHit1D) {
132  const DTWireId wireId = recHit1D->wireId();
133 
134  float segmDistance = segmentToWireDistance(*recHit1D, *segment);
135  if (segmDistance > 2.1)
136  LogTrace("Calibration") << "WARNING: segment-wire distance: " << segmDistance;
137  else
138  LogTrace("Calibration") << "segment-wire distance: " << segmDistance;
139 
140  float residualOnDistance = DTRecHitSegmentResidual().compute(dtGeom_, *recHit1D, *segment);
141  LogTrace("Calibration") << "Wire Id " << wireId << " residual on distance: " << residualOnDistance;
142 
143  fillHistos(wireId.superlayerId(), segmDistance, residualOnDistance);
144  if (detailedAnalysis_)
145  fillHistos(wireId.layerId(), segmDistance, residualOnDistance);
146  }
147  }
148  }
149 }
150 
152  // Get the layer and the wire position
153  const DTWireId wireId = recHit1D.wireId();
154  const DTLayer* layer = dtGeom_->layer(wireId);
155  float wireX = layer->specificTopology().wirePosition(wireId.wire());
156 
157  // Extrapolate the segment to the z of the wire
158  // Get wire position in chamber RF
159  // (y and z must be those of the hit to be coherent in the transf. of RF in case of rotations of the layer alignment)
160  LocalPoint wirePosInLay(wireX, recHit1D.localPosition().y(), recHit1D.localPosition().z());
161  GlobalPoint wirePosGlob = layer->toGlobal(wirePosInLay);
162  const DTChamber* chamber = dtGeom_->chamber(wireId.layerId().chamberId());
163  LocalPoint wirePosInChamber = chamber->toLocal(wirePosGlob);
164 
165  // Segment position at Wire z in chamber local frame
166  LocalPoint segPosAtZWire =
167  segment.localPosition() + segment.localDirection() * wirePosInChamber.z() / cos(segment.localDirection().theta());
168 
169  // Compute the distance of the segment from the wire
170  int sl = wireId.superlayer();
171  float segmDistance = -1;
172  if (sl == 1 || sl == 3)
173  segmDistance = fabs(wirePosInChamber.x() - segPosAtZWire.x());
174  else if (sl == 2)
175  segmDistance = fabs(segPosAtZWire.y() - wirePosInChamber.y());
176 
177  return segmDistance;
178 }
179 
181  LogDebug("Calibration") << "[DTResidualCalibration] Writing histos to file.";
182  rootFile_->cd();
183  rootFile_->Write();
184  rootFile_->Close();
185 
186  /*std::map<DTSuperLayerId, TH1F* >::const_iterator itSlHistos = histoMapTH1F_.begin();
187  std::map<DTSuperLayerId, TH1F* >::const_iterator itSlHistos_end = histoMapTH1F_.end();
188  for(; itSlHistos != itSlHistos_end; ++itSlHistos){
189  std::vector<TH1F*>::const_iterator itHistTH1F = (*itSlHistos).second.begin();
190  std::vector<TH1F*>::const_iterator itHistTH1F_end = (*itSlHistos).second.end();
191  for(; itHistTH1F != itHistTH1F_end; ++itHistTH1F) (*itHistTH1F)->Write();
192 
193  std::vector<TH2F*>::const_iterator itHistTH2F = histoMapTH2F_[(*itSlHistos).first].begin();
194  std::vector<TH2F*>::const_iterator itHistTH2F_end = histoMapTH2F_[(*itSlHistos).first].end();
195  for(; itHistTH2F != itHistTH2F_end; ++itHistTH2F) (*itHistTH2F)->Write();
196  }*/
197 }
198 
200  TH1AddDirectorySentry addDir;
201  rootFile_->cd();
202 
203  LogDebug("Calibration") << "[DTResidualCalibration] Booking histos for SL: " << slId;
204 
205  // Compose the chamber name
206  // Define the step
207  int step = 3;
208 
209  std::string wheelStr = std::to_string(slId.wheel());
210  std::string stationStr = std::to_string(slId.station());
211  std::string sectorStr = std::to_string(slId.sector());
212 
213  std::string slHistoName = "_STEP" + std::to_string(step) + "_W" + wheelStr + "_St" + stationStr + "_Sec" + sectorStr +
214  "_SL" + std::to_string(slId.superlayer());
215 
216  LogDebug("Calibration") << "Accessing " << rootBaseDir_;
217  TDirectory* baseDir = rootFile_->GetDirectory(rootBaseDir_.c_str());
218  if (!baseDir)
219  baseDir = rootFile_->mkdir(rootBaseDir_.c_str());
220  LogDebug("Calibration") << "Accessing " << ("Wheel" + wheelStr);
221  TDirectory* wheelDir = baseDir->GetDirectory(("Wheel" + wheelStr).c_str());
222  if (!wheelDir)
223  wheelDir = baseDir->mkdir(("Wheel" + wheelStr).c_str());
224  LogDebug("Calibration") << "Accessing " << ("Station" + stationStr);
225  TDirectory* stationDir = wheelDir->GetDirectory(("Station" + stationStr).c_str());
226  if (!stationDir)
227  stationDir = wheelDir->mkdir(("Station" + stationStr).c_str());
228  LogDebug("Calibration") << "Accessing " << ("Sector" + sectorStr);
229  TDirectory* sectorDir = stationDir->GetDirectory(("Sector" + sectorStr).c_str());
230  if (!sectorDir)
231  sectorDir = stationDir->mkdir(("Sector" + sectorStr).c_str());
232 
233  sectorDir->cd();
234 
235  // Create the monitor elements
236  TH1F* histosTH1F = new TH1F(("hResDist" + slHistoName).c_str(),
237  "Residuals on the distance from wire (rec_hit - segm_extr) (cm)",
238  200,
239  -histRange_,
240  histRange_);
241  TH2F* histosTH2F = new TH2F(("hResDistVsDist" + slHistoName).c_str(),
242  "Residuals on the dist. (cm) from wire (rec_hit - segm_extr) vs dist. (cm)",
243  100,
244  0,
245  2.5,
246  200,
247  -histRange_,
248  histRange_);
249  histoMapTH1F_[slId] = histosTH1F;
250  histoMapTH2F_[slId] = histosTH2F;
251 }
252 
254  TH1AddDirectorySentry addDir;
255  rootFile_->cd();
256 
257  LogDebug("Calibration") << "[DTResidualCalibration] Booking histos for layer: " << layerId;
258 
259  // Compose the chamber name
260  std::string wheelStr = std::to_string(layerId.wheel());
261  std::string stationStr = std::to_string(layerId.station());
262  std::string sectorStr = std::to_string(layerId.sector());
263  std::string superLayerStr = std::to_string(layerId.superlayer());
264  std::string layerStr = std::to_string(layerId.layer());
265  // Define the step
266  int step = 3;
267 
268  std::string layerHistoName = "_STEP" + std::to_string(step) + "_W" + wheelStr + "_St" + stationStr + "_Sec" +
269  sectorStr + "_SL" + superLayerStr + "_Layer" + layerStr;
270 
271  LogDebug("Calibration") << "Accessing " << rootBaseDir_;
272  TDirectory* baseDir = rootFile_->GetDirectory(rootBaseDir_.c_str());
273  if (!baseDir)
274  baseDir = rootFile_->mkdir(rootBaseDir_.c_str());
275  LogDebug("Calibration") << "Accessing " << ("Wheel" + wheelStr);
276  TDirectory* wheelDir = baseDir->GetDirectory(("Wheel" + wheelStr).c_str());
277  if (!wheelDir)
278  wheelDir = baseDir->mkdir(("Wheel" + wheelStr).c_str());
279  LogDebug("Calibration") << "Accessing " << ("Station" + stationStr);
280  TDirectory* stationDir = wheelDir->GetDirectory(("Station" + stationStr).c_str());
281  if (!stationDir)
282  stationDir = wheelDir->mkdir(("Station" + stationStr).c_str());
283  LogDebug("Calibration") << "Accessing " << ("Sector" + sectorStr);
284  TDirectory* sectorDir = stationDir->GetDirectory(("Sector" + sectorStr).c_str());
285  if (!sectorDir)
286  sectorDir = stationDir->mkdir(("Sector" + sectorStr).c_str());
287  LogDebug("Calibration") << "Accessing " << ("SL" + superLayerStr);
288  TDirectory* superLayerDir = sectorDir->GetDirectory(("SL" + superLayerStr).c_str());
289  if (!superLayerDir)
290  superLayerDir = sectorDir->mkdir(("SL" + superLayerStr).c_str());
291 
292  superLayerDir->cd();
293  // Create histograms
294  TH1F* histosTH1F = new TH1F(("hResDist" + layerHistoName).c_str(),
295  "Residuals on the distance from wire (rec_hit - segm_extr) (cm)",
296  200,
297  -histRange_,
298  histRange_);
299  TH2F* histosTH2F = new TH2F(("hResDistVsDist" + layerHistoName).c_str(),
300  "Residuals on the dist. (cm) from wire (rec_hit - segm_extr) vs dist. (cm)",
301  100,
302  0,
303  2.5,
304  200,
305  -histRange_,
306  histRange_);
307  histoMapPerLayerTH1F_[layerId] = histosTH1F;
308  histoMapPerLayerTH2F_[layerId] = histosTH2F;
309 }
310 
311 // Fill a set of histograms for a given SL
312 void DTResidualCalibration::fillHistos(DTSuperLayerId slId, float distance, float residualOnDistance) {
313  histoMapTH1F_[slId]->Fill(residualOnDistance);
314  histoMapTH2F_[slId]->Fill(distance, residualOnDistance);
315 }
316 
317 // Fill a set of histograms for a given layer
318 void DTResidualCalibration::fillHistos(DTLayerId layerId, float distance, float residualOnDistance) {
319  histoMapPerLayerTH1F_[layerId]->Fill(residualOnDistance);
320  histoMapPerLayerTH2F_[layerId]->Fill(distance, residualOnDistance);
321 }
Log< level::Info, true > LogVerbatim
int station() const
Return the station number.
Definition: DTChamberId.h:42
std::map< DTSuperLayerId, TH1F * > histoMapTH1F_
std::map< DTLayerId, TH2F * > histoMapPerLayerTH2F_
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
DTSegmentSelector * select_
std::pair< const_iterator, const_iterator > range
iterator range
Definition: RangeMap.h:50
int wire() const
Return the wire number.
Definition: DTWireId.h:42
void fillHistos(DTSuperLayerId slId, float distance, float residualOnDistance)
void bookHistos(DTSuperLayerId slId)
DTResidualCalibration(const edm::ParameterSet &pset)
Constructor.
T z() const
Definition: PV3DBase.h:61
LocalVector localDirection() const override
Local direction in Chamber frame.
identifier iterator
Definition: RangeMap.h:130
std::string to_string(const V &value)
Definition: OMSAccess.h:71
LocalPoint localPosition() const override
Local position in Chamber frame.
#define LogTrace(id)
constexpr std::array< uint8_t, layerIndexSize > layer
C::const_iterator const_iterator
constant access iterator type
Definition: RangeMap.h:43
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
T const * product() const
Definition: ESHandle.h:86
DTChamberId chamberId() const
Return the corresponding ChamberId.
const edm::ESGetToken< DTGeometry, MuonGeometryRecord > dtGeomToken_
void beginRun(const edm::Run &, const edm::EventSetup &) override
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Transition
Definition: Transition.h:12
~DTResidualCalibration() override
Destructor.
std::map< DTSuperLayerId, TH2F * > histoMapTH2F_
int superlayer() const
Return the superlayer number (deprecated method name)
void analyze(const edm::Event &event, const edm::EventSetup &setup) override
std::vector< DTRecHit1D > specificRecHits() const
Access to specific components.
float compute(const DTGeometry *, const DTRecHit1D &, const DTRecSegment4D &)
int layer() const
Return the layer number.
Definition: DTLayerId.h:42
const DTGeometry * dtGeom_
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:39
HLT enums.
DTWireId wireId() const
Return the wireId.
Definition: DTRecHit1D.h:76
int sector() const
Definition: DTChamberId.h:49
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:45
const std::vector< const DTChamber * > & chambers() const
Return a vector of all Chamber.
Definition: DTGeometry.cc:84
step
Definition: StallMonitor.cc:98
float segmentToWireDistance(const DTRecHit1D &recHit1D, const DTRecSegment4D &segment)
DTLayerId layerId() const
Return the corresponding LayerId.
Definition: DTWireId.h:45
std::map< DTLayerId, TH1F * > histoMapPerLayerTH1F_
LocalPoint localPosition() const override
Return the 3-dimensional local position.
Definition: DTRecHit1D.h:47
const DTChamber * chamber(const DTChamberId &id) const
Return a DTChamber given its id.
Definition: DTGeometry.cc:90
Definition: event.py:1
Definition: Run.h:45
Geom::Theta< T > theta() const
Definition: PV3DBase.h:72
#define LogDebug(id)
const DTLayer * layer(const DTLayerId &id) const
Return a layer given its id.
Definition: DTGeometry.cc:96