CMS 3D CMS Logo

DTSegment2DSLPhiQuality.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author S. Bolognesi and G. Cerminara - INFN Torino
5  */
6 
7 #include <iostream>
8 #include <map>
9 
21 
23 #include "Histograms.h"
24 
25 using namespace std;
26 using namespace edm;
27 
28 struct Histograms {
31 };
32 
33 // Constructor
35  // Get the debug parameter for verbose output
36  debug_ = pset.getUntrackedParameter<bool>("debug");
37  DTHitQualityUtils::debug = debug_;
38 
39  // the name of the simhit collection
40  simHitLabel_ = pset.getUntrackedParameter<InputTag>("simHitLabel");
41  simHitToken_ = consumes<PSimHitContainer>(pset.getUntrackedParameter<InputTag>("simHitLabel"));
42  // the name of the 2D rec hit collection
43  segment4DLabel_ = pset.getUntrackedParameter<InputTag>("segment4DLabel");
44  segment4DToken_ = consumes<DTRecSegment4DCollection>(pset.getUntrackedParameter<InputTag>("segment4DLabel"));
45 
46  // sigma resolution on position
47  sigmaResPos_ = pset.getParameter<double>("sigmaResPos");
48  // sigma resolution on angle
49  sigmaResAngle_ = pset.getParameter<double>("sigmaResAngle");
50  doall_ = pset.getUntrackedParameter<bool>("doall", false);
51  local_ = pset.getUntrackedParameter<bool>("local", false);
52 }
53 
55  // Book the histos
56  histograms.h2DHitSuperPhi = new HRes2DHit ("SuperPhi", booker, doall_, local_);
57  if (doall_) { histograms.h2DHitEff_SuperPhi = new HEff2DHit ("SuperPhi", booker);
58 }
59 }
60 
61 // The real analysis
63  // Get the DT Geometry
64  ESHandle<DTGeometry> dtGeom;
65  setup.get<MuonGeometryRecord>().get(dtGeom);
66 
67  // Get the SimHit collection from the event
69  event.getByToken(simHitToken_, simHits); // FIXME: second string to be removed
70 
71  // Map simHits by chamber
72  map<DTChamberId, PSimHitContainer > simHitsPerCh;
73  for (const auto & simHit : *simHits) {
74  // Create the id of the chamber (the simHits in the DT known their wireId)
75  DTChamberId chamberId = (((DTWireId(simHit.detUnitId())).layerId()).superlayerId()).chamberId();
76  // Fill the map
77  simHitsPerCh[chamberId].push_back(simHit);
78  }
79 
80  // Get the 4D rechits from the event
82  event.getByToken(segment4DToken_, segment4Ds);
83 
84  if (!segment4Ds.isValid()) {
85  if (debug_) {
86  cout << "[DTSegment2DSLPhiQuality]**Warning: no 4D Segments with label: " << segment4DLabel_
87  << " in this event, skipping!" << endl;
88 }
89  return;
90  }
91 
92  // Loop over all chambers containing a segment
93  DTRecSegment4DCollection::id_iterator chamberId;
94  for (chamberId = segment4Ds->id_begin();
95  chamberId != segment4Ds->id_end();
96  ++chamberId) {
97 
98  //------------------------- simHits ---------------------------//
99  // Get simHits of each chamber
100  PSimHitContainer simHits = simHitsPerCh[(*chamberId)];
101 
102  // Map simhits per wire
103  map<DTWireId, PSimHitContainer > simHitsPerWire = DTHitQualityUtils::mapSimHitsPerWire(simHits);
104  map<DTWireId, const PSimHit*> muSimHitPerWire = DTHitQualityUtils::mapMuSimHitsPerWire(simHitsPerWire);
105  int nMuSimHit = muSimHitPerWire.size();
106  if (nMuSimHit == 0 || nMuSimHit == 1) {
107  if (debug_ && nMuSimHit == 1) {
108  cout << "[DTSegment2DSLPhiQuality] Only " << nMuSimHit << " mu SimHit in this chamber, skipping!" << endl;
109 }
110  continue; // If no or only one mu SimHit is found skip this chamber
111  }
112  if (debug_) {
113  cout << "=== Chamber " << (*chamberId) << " has " << nMuSimHit << " SimHits" << endl;
114 }
115 
116  // Find outer and inner mu SimHit to build a segment
117  pair<const PSimHit*, const PSimHit*> inAndOutSimHit = DTHitQualityUtils::findMuSimSegment(muSimHitPerWire);
118 
119  // Find direction and position of the sim Segment in Chamber RF
120  pair<LocalVector, LocalPoint> dirAndPosSimSegm = DTHitQualityUtils::findMuSimSegmentDirAndPos(inAndOutSimHit,
121  (*chamberId),&(*dtGeom));
122 
123  LocalVector simSegmLocalDir = dirAndPosSimSegm.first;
124  LocalPoint simSegmLocalPos = dirAndPosSimSegm.second;
125  const DTChamber* chamber = dtGeom->chamber(*chamberId);
126  GlobalPoint simSegmGlobalPos = chamber->toGlobal(simSegmLocalPos);
127 
128  // Atan(x/z) angle and x position in SL RF
129  float angleSimSeg = DTHitQualityUtils::findSegmentAlphaAndBeta(simSegmLocalDir).first;
130  float posSimSeg = simSegmLocalPos.x();
131  // Position (in eta, phi coordinates) in lobal RF
132  float etaSimSeg = simSegmGlobalPos.eta();
133  float phiSimSeg = simSegmGlobalPos.phi();
134 
135  if (debug_) {
136  cout << " Simulated segment: local direction " << simSegmLocalDir << endl
137  << " local position " << simSegmLocalPos << endl
138  << " angle " << angleSimSeg << endl;
139 }
140 
141  //---------------------------- recHits --------------------------//
142  // Get the range of rechit for the corresponding chamberId
143  bool recHitFound = false;
144  DTRecSegment4DCollection::range range = segment4Ds->get(*chamberId);
145  int nsegm = distance(range.first, range.second);
146  if (debug_) {
147  cout << " Chamber: " << *chamberId << " has " << nsegm
148  << " 4D segments" << endl;
149 }
150 
151  if (nsegm!= 0) {
152  // Find the best RecHit: look for the 4D RecHit with the phi angle closest
153  // to that of segment made of SimHits.
154  // RecHits must have delta alpha and delta position within 5 sigma of
155  // the residual distribution (we are looking for residuals of segments
156  // usefull to the track fit) for efficency purpose
157  const DTRecSegment2D* bestRecHit = nullptr;
158  bool bestRecHitFound = false;
159  double deltaAlpha = 99999;
160 
161  // Loop over the recHits of this chamberId
162  for (DTRecSegment4DCollection::const_iterator segment4D = range.first;
163  segment4D!= range.second;
164  ++segment4D) {
165  // Check the dimension
166  if ((*segment4D).dimension() != 4) {
167  if (debug_) { cout << "[DTSegment2DSLPhiQuality]***Error: This is not 4D segment!!!" << endl;
168 }
169  continue;
170  }
171 
172  // Get 2D superPhi segments from 4D segments
173  const DTChamberRecSegment2D* phiSegment2D = (*segment4D).phiSegment();
174  if ((*phiSegment2D).dimension() != 2) {
175  if (debug_) { cout << "[DTSegment2DQuality]***Error: This is not 2D segment!!!" << endl;
176 }
177  abort();
178  }
179 
180  // Segment Local Direction and position (in Chamber RF)
181  LocalVector recSegDirection = (*phiSegment2D).localDirection();
182 
183  float recSegAlpha = DTHitQualityUtils::findSegmentAlphaAndBeta(recSegDirection).first;
184  if (debug_) {
185  cout << " RecSegment direction: " << recSegDirection << endl
186  << " position : " << (*phiSegment2D).localPosition() << endl
187  << " alpha : " << recSegAlpha << endl;
188 }
189 
190  if (fabs(recSegAlpha - angleSimSeg) < deltaAlpha) {
191  deltaAlpha = fabs(recSegAlpha - angleSimSeg);
192  bestRecHit = &(*phiSegment2D);
193  bestRecHitFound = true;
194  }
195  } // End of Loop over all 4D RecHits of this chambers
196 
197  if (bestRecHitFound) {
198  // Best rechit direction and position in Chamber RF
199  LocalPoint bestRecHitLocalPos = bestRecHit->localPosition();
200  LocalVector bestRecHitLocalDir = bestRecHit->localDirection();
201 
202  LocalError bestRecHitLocalPosErr = bestRecHit->localPositionError();
203  LocalError bestRecHitLocalDirErr = bestRecHit->localDirectionError();
204 
205  float angleBestRHit = DTHitQualityUtils::findSegmentAlphaAndBeta(bestRecHitLocalDir).first;
206  if (fabs(angleBestRHit - angleSimSeg) < 5*sigmaResAngle_ &&
207  fabs(bestRecHitLocalPos.x() - posSimSeg) < 5*sigmaResPos_) {
208  recHitFound = true;
209  }
210 
211  // Fill Residual histos
212  histograms.h2DHitSuperPhi->fill(angleSimSeg,
213  angleBestRHit,
214  posSimSeg,
215  bestRecHitLocalPos.x(),
216  etaSimSeg,
217  phiSimSeg,
218  sqrt(bestRecHitLocalPosErr.xx()),
219  sqrt(bestRecHitLocalDirErr.xx())
220  );
221  }
222  } // end of if (nsegm!= 0)
223 
224  // Fill Efficiency plot
225  if (doall_) {
226  histograms.h2DHitEff_SuperPhi->fill(etaSimSeg,
227  phiSimSeg,
228  posSimSeg,
229  angleSimSeg,
230  recHitFound);
231  }
232  } // End of loop over chambers
233 }
234 
235 // declare this as a framework plugin
LocalError localPositionError() const override
local position error in SL frame
T getParameter(std::string const &) const
DTSegment2DSLPhiQuality(const edm::ParameterSet &pset)
Constructor.
void fill(float angleSimSegment, float angleRecSegment, float posSimSegment, float posRecSegment, float etaSimSegment, float phiSimSegment, float sigmaPos, float sigmaAngle)
Definition: Histograms.h:245
T getUntrackedParameter(std::string const &, T const &) const
float xx() const
Definition: LocalError.h:24
std::pair< const_iterator, const_iterator > range
iterator range
Definition: RangeMap.h:50
void dqmAnalyze(edm::Event const &, edm::EventSetup const &, Histograms const &) const override
Perform the real analysis.
const DTChamber * chamber(const DTChamberId &id) const
Return a DTChamber given its id.
Definition: DTGeometry.cc:99
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:54
void fill(float etaSimSegm, float phiSimSegm, float posSimSegm, float angleSimSegm, bool fillRecHit)
Definition: Histograms.h:309
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:1
static std::map< DTWireId, const PSimHit * > mapMuSimHitsPerWire(const std::map< DTWireId, edm::PSimHitContainer > &simHitWireMap)
Create a map between the Mu SimHits and corresponding MuBarWireId ;.
static std::pair< const PSimHit *, const PSimHit * > findMuSimSegment(const std::map< DTWireId, const PSimHit * > &mapWireAndMuSimHit)
Find Innermost and outermost SimHit from Mu in a SL (they identify a simulated segment) ...
T sqrt(T t)
Definition: SSEVec.h:18
bool isValid() const
Definition: HandleBase.h:74
static std::pair< double, double > findSegmentAlphaAndBeta(const LocalVector &direction)
void bookHistograms(DQMStore::ConcurrentBooker &, edm::Run const &, edm::EventSetup const &, Histograms &) const override
Book the DQM plots.
static std::pair< LocalVector, LocalPoint > findMuSimSegmentDirAndPos(const std::pair< const PSimHit *, const PSimHit * > &inAndOutSimHit, const DetId detId, const DTGeometry *muonGeom)
Find direction and position of a segment (in local RF) from outer and inner mu SimHit in the RF of ob...
LocalPoint localPosition() const override
local position in SL frame
const T & get() const
Definition: EventSetup.h:59
HEff2DHit * h2DHitEff_SuperPhi
T eta() const
Definition: PV3DBase.h:76
HLT enums.
LocalVector localDirection() const override
the local direction in SL frame
std::vector< PSimHit > PSimHitContainer
static std::map< DTWireId, edm::PSimHitContainer > mapSimHitsPerWire(const edm::PSimHitContainer &simhits)
LocalError localDirectionError() const override
the local direction error (xx,xy,yy) in SL frame: only xx is not 0.
T x() const
Definition: PV3DBase.h:62
Definition: event.py:1
Definition: Run.h:43
HRes2DHit * h2DHitSuperPhi