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  select_(pset),
36  histRange_(pset.getParameter<double>("histogramRange")),
37  segment4DLabel_(pset.getParameter<edm::InputTag>("segment4DLabel")),
38  rootBaseDir_(pset.getUntrackedParameter<std::string>("rootBaseDir","DT/Residuals")),
39  detailedAnalysis_(pset.getUntrackedParameter<bool>("detailedAnalysis",false)) {
40 
41  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Constructor called.";
42  consumes< DTRecSegment4DCollection >(edm::InputTag(segment4DLabel_));
43  std::string rootFileName = pset.getUntrackedParameter<std::string>("rootFileName","residuals.root");
44  rootFile_ = new TFile(rootFileName.c_str(), "RECREATE");
45  rootFile_->cd();
46 
47  segmok=0;
48  segmbad=0;
49  nevent=0;
50 }
51 
53  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Destructor called.";
54  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Analyzed events: " << nevent;
55  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Good segments: " << segmok;
56  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Bad segments: " << segmbad;
57 }
58 
60  TH1::SetDefaultSumw2(true);
61 }
62 
64 
65  // get the geometry
67  setup.get<MuonGeometryRecord>().get(dtGeomH);
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
97  DTRecSegment4DCollection::id_iterator chamberIdIt;
98  for(chamberIdIt = segments4D->id_begin(); chamberIdIt != segments4D->id_end(); ++chamberIdIt){
99 
100  const DTChamber* chamber = dtGeom_->chamber(*chamberIdIt);
101 
102  // Get the range for the corresponding ChamberId
103  DTRecSegment4DCollection::range range = segments4D->get((*chamberIdIt));
104  // Loop over the rechits of this DetUnit
105  for(DTRecSegment4DCollection::const_iterator segment = range.first;
106  segment != range.second; ++segment){
107 
108  LogTrace("Calibration") << "Segment local pos (in chamber RF): " << (*segment).localPosition()
109  << "\nSegment global pos: " << chamber->toGlobal((*segment).localPosition());
110 
111  if( !select_(*segment, event, setup) ) { segmbad++; continue; }
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();
131  recHit1D != recHits1D_S3.end(); ++recHit1D) {
132  const DTWireId wireId = recHit1D->wireId();
133 
134  float segmDistance = segmentToWireDistance(*recHit1D,*segment);
135  if(segmDistance > 2.1) LogTrace("Calibration") << "WARNING: segment-wire distance: " << segmDistance;
136  else LogTrace("Calibration") << "segment-wire distance: " << segmDistance;
137 
138  float residualOnDistance = DTRecHitSegmentResidual().compute(dtGeom_,*recHit1D,*segment);
139  LogTrace("Calibration") << "Wire Id " << wireId << " residual on distance: " << residualOnDistance;
140 
141  fillHistos(wireId.superlayerId(), segmDistance, residualOnDistance);
142  if(detailedAnalysis_) fillHistos(wireId.layerId(), segmDistance, residualOnDistance);
143  }
144  }
145  }
146 }
147 
149 
150  // Get the layer and the wire position
151  const DTWireId wireId = recHit1D.wireId();
152  const DTLayer* layer = dtGeom_->layer(wireId);
153  float wireX = layer->specificTopology().wirePosition(wireId.wire());
154 
155  // Extrapolate the segment to the z of the wire
156  // Get wire position in chamber RF
157  // (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)
158  LocalPoint wirePosInLay(wireX,recHit1D.localPosition().y(),recHit1D.localPosition().z());
159  GlobalPoint wirePosGlob = layer->toGlobal(wirePosInLay);
160  const DTChamber* chamber = dtGeom_->chamber(wireId.layerId().chamberId());
161  LocalPoint wirePosInChamber = chamber->toLocal(wirePosGlob);
162 
163  // Segment position at Wire z in chamber local frame
164  LocalPoint segPosAtZWire = segment.localPosition() + segment.localDirection()*wirePosInChamber.z()/cos(segment.localDirection().theta());
165 
166  // Compute the distance of the segment from the wire
167  int sl = wireId.superlayer();
168  float segmDistance = -1;
169  if(sl == 1 || sl == 3) segmDistance = fabs(wirePosInChamber.x() - segPosAtZWire.x());
170  else if(sl == 2) segmDistance = fabs(segPosAtZWire.y() - wirePosInChamber.y());
171 
172  return segmDistance;
173 }
174 
176 
177  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Writing histos to file.";
178  rootFile_->cd();
179  rootFile_->Write();
180  rootFile_->Close();
181 
182  /*std::map<DTSuperLayerId, std::vector<TH1F*> >::const_iterator itSlHistos = histoMapTH1F_.begin();
183  std::map<DTSuperLayerId, std::vector<TH1F*> >::const_iterator itSlHistos_end = histoMapTH1F_.end();
184  for(; itSlHistos != itSlHistos_end; ++itSlHistos){
185  std::vector<TH1F*>::const_iterator itHistTH1F = (*itSlHistos).second.begin();
186  std::vector<TH1F*>::const_iterator itHistTH1F_end = (*itSlHistos).second.end();
187  for(; itHistTH1F != itHistTH1F_end; ++itHistTH1F) (*itHistTH1F)->Write();
188 
189  std::vector<TH2F*>::const_iterator itHistTH2F = histoMapTH2F_[(*itSlHistos).first].begin();
190  std::vector<TH2F*>::const_iterator itHistTH2F_end = histoMapTH2F_[(*itSlHistos).first].end();
191  for(; itHistTH2F != itHistTH2F_end; ++itHistTH2F) (*itHistTH2F)->Write();
192  }*/
193 
194 }
195 
197  TH1AddDirectorySentry addDir;
198  rootFile_->cd();
199 
200  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Booking histos for SL: " << slId;
201 
202  // Compose the chamber name
203  // Define the step
204  int step = 3;
205 
206  std::string wheelStr = std::to_string(slId.wheel());
207  std::string stationStr = std::to_string(slId.station());
208  std::string sectorStr = std::to_string(slId.sector());
209 
210  std::string slHistoName =
211  "_STEP" + std::to_string(step) +
212  "_W" + wheelStr +
213  "_St" + stationStr +
214  "_Sec" + sectorStr +
215  "_SL" + std::to_string(slId.superlayer());
216 
217  edm::LogVerbatim("Calibration") << "Accessing " << rootBaseDir_;
218  TDirectory* baseDir = rootFile_->GetDirectory(rootBaseDir_.c_str());
219  if(!baseDir) baseDir = rootFile_->mkdir(rootBaseDir_.c_str());
220  edm::LogVerbatim("Calibration") << "Accessing " << ("Wheel" + wheelStr);
221  TDirectory* wheelDir = baseDir->GetDirectory(("Wheel" + wheelStr).c_str());
222  if(!wheelDir) wheelDir = baseDir->mkdir(("Wheel" + wheelStr).c_str());
223  edm::LogVerbatim("Calibration") << "Accessing " << ("Station" + stationStr);
224  TDirectory* stationDir = wheelDir->GetDirectory(("Station" + stationStr).c_str());
225  if(!stationDir) stationDir = wheelDir->mkdir(("Station" + stationStr).c_str());
226  edm::LogVerbatim("Calibration") << "Accessing " << ("Sector" + sectorStr);
227  TDirectory* sectorDir = stationDir->GetDirectory(("Sector" + sectorStr).c_str());
228  if(!sectorDir) sectorDir = stationDir->mkdir(("Sector" + sectorStr).c_str());
229 
230  sectorDir->cd();
231 
232  // Create the monitor elements
233  std::vector<TH1F*> histosTH1F;
234  histosTH1F.push_back(new TH1F(("hResDist"+slHistoName).c_str(),
235  "Residuals on the distance from wire (rec_hit - segm_extr) (cm)",
236  200, -histRange_, histRange_));
237  std::vector<TH2F*> histosTH2F;
238  histosTH2F.push_back(new TH2F(("hResDistVsDist"+slHistoName).c_str(),
239  "Residuals on the dist. (cm) from wire (rec_hit - segm_extr) vs dist. (cm)",
240  100, 0, 2.5, 200, -histRange_, histRange_));
241  histoMapTH1F_[slId] = histosTH1F;
242  histoMapTH2F_[slId] = histosTH2F;
243 }
244 
246  TH1AddDirectorySentry addDir;
247  rootFile_->cd();
248 
249  edm::LogVerbatim("Calibration") << "[DTResidualCalibration] Booking histos for layer: " << layerId;
250 
251  // Compose the chamber name
252  std::string wheelStr = std::to_string(layerId.wheel());
253  std::string stationStr = std::to_string(layerId.station());
254  std::string sectorStr = std::to_string(layerId.sector());
255  std::string superLayerStr = std::to_string(layerId.superlayer());
256  std::string layerStr = std::to_string(layerId.layer());
257  // Define the step
258  int step = 3;
259 
260  std::string layerHistoName =
261  "_STEP" + std::to_string(step) +
262  "_W" + wheelStr +
263  "_St" + stationStr +
264  "_Sec" + sectorStr +
265  "_SL" + superLayerStr +
266  "_Layer" + layerStr;
267 
268  edm::LogVerbatim("Calibration") << "Accessing " << rootBaseDir_;
269  TDirectory* baseDir = rootFile_->GetDirectory(rootBaseDir_.c_str());
270  if(!baseDir) baseDir = rootFile_->mkdir(rootBaseDir_.c_str());
271  edm::LogVerbatim("Calibration") << "Accessing " << ("Wheel" + wheelStr);
272  TDirectory* wheelDir = baseDir->GetDirectory(("Wheel" + wheelStr).c_str());
273  if(!wheelDir) wheelDir = baseDir->mkdir(("Wheel" + wheelStr).c_str());
274  edm::LogVerbatim("Calibration") << "Accessing " << ("Station" + stationStr);
275  TDirectory* stationDir = wheelDir->GetDirectory(("Station" + stationStr).c_str());
276  if(!stationDir) stationDir = wheelDir->mkdir(("Station" + stationStr).c_str());
277  edm::LogVerbatim("Calibration") << "Accessing " << ("Sector" + sectorStr);
278  TDirectory* sectorDir = stationDir->GetDirectory(("Sector" + sectorStr).c_str());
279  if(!sectorDir) sectorDir = stationDir->mkdir(("Sector" + sectorStr).c_str());
280  edm::LogVerbatim("Calibration") << "Accessing " << ("SL" + superLayerStr);
281  TDirectory* superLayerDir = sectorDir->GetDirectory(("SL" + superLayerStr).c_str());
282  if(!superLayerDir) superLayerDir = sectorDir->mkdir(("SL" + superLayerStr).c_str());
283 
284  superLayerDir->cd();
285  // Create histograms
286  std::vector<TH1F*> histosTH1F;
287  histosTH1F.push_back(new TH1F(("hResDist"+layerHistoName).c_str(),
288  "Residuals on the distance from wire (rec_hit - segm_extr) (cm)",
289  200, -histRange_, histRange_));
290  std::vector<TH2F*> histosTH2F;
291  histosTH2F.push_back(new TH2F(("hResDistVsDist"+layerHistoName).c_str(),
292  "Residuals on the dist. (cm) from wire (rec_hit - segm_extr) vs dist. (cm)",
293  100, 0, 2.5, 200, -histRange_, histRange_));
294  histoMapPerLayerTH1F_[layerId] = histosTH1F;
295  histoMapPerLayerTH2F_[layerId] = histosTH2F;
296 }
297 
298 // Fill a set of histograms for a given SL
300  float distance,
301  float residualOnDistance) {
302  std::vector<TH1F*> const& histosTH1F = histoMapTH1F_[slId];
303  std::vector<TH2F*> const& histosTH2F = histoMapTH2F_[slId];
304  histosTH1F[0]->Fill(residualOnDistance);
305  histosTH2F[0]->Fill(distance, residualOnDistance);
306 }
307 
308 // Fill a set of histograms for a given layer
310  float distance,
311  float residualOnDistance) {
312  std::vector<TH1F*> const& histosTH1F = histoMapPerLayerTH1F_[layerId];
313  std::vector<TH2F*> const& histosTH2F = histoMapPerLayerTH2F_[layerId];
314  histosTH1F[0]->Fill(residualOnDistance);
315  histosTH2F[0]->Fill(distance, residualOnDistance);
316 }
317 
LocalPoint localPosition() const override
Return the 3-dimensional local position.
Definition: DTRecHit1D.h:60
T getUntrackedParameter(std::string const &, T const &) const
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:86
const std::vector< const DTChamber * > & chambers() const
Return a vector of all Chamber.
Definition: DTGeometry.cc:102
LocalPoint localPosition() const override
Local position in Chamber frame.
std::pair< const_iterator, const_iterator > range
iterator range
Definition: RangeMap.h:50
std::vector< LayerSetAndLayers > layers(const SeedingLayerSetsHits &sets)
Definition: LayerTriplets.cc:4
def copy(args, dbName)
void fillHistos(DTSuperLayerId slId, float distance, float residualOnDistance)
void bookHistos(DTSuperLayerId slId)
const DTChamber * chamber(const DTChamberId &id) const
Return a DTChamber given its id.
Definition: DTGeometry.cc:117
std::map< DTLayerId, std::vector< TH1F * > > histoMapPerLayerTH1F_
LocalVector localDirection() const override
Local direction in Chamber frame.
DTResidualCalibration(const edm::ParameterSet &pset)
Constructor.
DTChamberId chamberId() const
Return the corresponding ChamberId.
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:54
T y() const
Definition: PV3DBase.h:63
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:2
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:69
int layer() const
Return the layer number.
Definition: DTLayerId.h:53
DTSuperLayerId superlayerId() const
Return the corresponding SuperLayerId.
Definition: DTLayerId.h:59
Geom::Theta< T > theta() const
Definition: PV3DBase.h:75
const DTTopology & specificTopology() const
Definition: DTLayer.cc:42
std::map< DTSuperLayerId, std::vector< TH1F * > > histoMapTH1F_
void beginRun(const edm::Run &, const edm::EventSetup &) override
std::map< DTLayerId, std::vector< TH2F * > > histoMapPerLayerTH2F_
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
std::map< DTSuperLayerId, std::vector< TH2F * > > histoMapTH2F_
#define LogTrace(id)
std::vector< DTRecHit1D > specificRecHits() const
Access to specific components.
~DTResidualCalibration() override
Destructor.
int wire() const
Return the wire number.
Definition: DTWireId.h:56
int superlayer() const
Return the superlayer number (deprecated method name)
void analyze(const edm::Event &event, const edm::EventSetup &setup) override
float compute(const DTGeometry *, const DTRecHit1D &, const DTRecSegment4D &)
const DTGeometry * dtGeom_
DTLayerId layerId() const
Return the corresponding LayerId.
Definition: DTWireId.h:62
HLT enums.
int sector() const
Definition: DTChamberId.h:61
T get() const
Definition: EventSetup.h:62
step
const DTLayer * layer(const DTLayerId &id) const
Return a layer given its id.
Definition: DTGeometry.cc:127
float segmentToWireDistance(const DTRecHit1D &recHit1D, const DTRecSegment4D &segment)
int station() const
Return the station number.
Definition: DTChamberId.h:51
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:45
T x() const
Definition: PV3DBase.h:62
T const * product() const
Definition: ESHandle.h:86
Definition: event.py:1
Definition: Run.h:44
DTWireId wireId() const
Return the wireId.
Definition: DTRecHit1D.h:107