Perform the real analysis.
116 map<DTChamberId, PSimHitContainer > simHitsPerCh;
117 for(PSimHitContainer::const_iterator simHit = simHits->begin();
118 simHit != simHits->end(); simHit++){
120 DTChamberId chamberId = (((
DTWireId(simHit->detUnitId())).layerId()).superlayerId()).chamberId();
122 simHitsPerCh[chamberId].push_back(*simHit);
131 <<
" in this event, skipping!" << endl;
136 DTRecSegment4DCollection::id_iterator chamberId;
137 for (chamberId = segment4Ds->id_begin();
138 chamberId != segment4Ds->id_end();
148 int nMuSimHit = muSimHitPerWire.size();
149 if(nMuSimHit == 0 || nMuSimHit == 1) {
150 if(
debug && nMuSimHit == 1)
151 cout <<
"[DTSegment2DSLPhiQuality] Only " << nMuSimHit <<
" mu SimHit in this chamber, skipping!" << endl;
155 cout <<
"=== Chamber " << (*chamberId) <<
" has " << nMuSimHit <<
" SimHits" << endl;
162 (*chamberId),&(*dtGeom));
164 LocalVector simSegmLocalDir = dirAndPosSimSegm.first;
165 LocalPoint simSegmLocalPos = dirAndPosSimSegm.second;
166 const DTChamber* chamber = dtGeom->chamber(*chamberId);
171 float posSimSeg = simSegmLocalPos.
x();
173 float etaSimSeg = simSegmGlobalPos.
eta();
174 float phiSimSeg = simSegmGlobalPos.
phi();
177 cout<<
" Simulated segment: local direction "<<simSegmLocalDir<<endl
178 <<
" local position "<<simSegmLocalPos<<endl
179 <<
" angle "<<angleSimSeg<<endl;
183 bool recHitFound =
false;
185 int nsegm = distance(range.first, range.second);
187 cout <<
" Chamber: " << *chamberId <<
" has " << nsegm
188 <<
" 4D segments" << endl;
197 bool bestRecHitFound =
false;
198 double deltaAlpha = 99999;
202 segment4D!=range.second;
205 if((*segment4D).dimension() != 4) {
206 if(
debug)
cout <<
"[DTSegment2DSLPhiQuality]***Error: This is not 4D segment!!!" << endl;
212 if((*phiSegment2D).dimension() != 2) {
213 if(
debug)
cout <<
"[DTSegment2DQuality]***Error: This is not 2D segment!!!" << endl;
218 LocalVector recSegDirection = (*phiSegment2D).localDirection();
222 cout <<
" RecSegment direction: " << recSegDirection << endl
223 <<
" position : " << (*phiSegment2D).localPosition() << endl
224 <<
" alpha : " << recSegAlpha << endl;
226 if(fabs(recSegAlpha - angleSimSeg) < deltaAlpha) {
227 deltaAlpha = fabs(recSegAlpha - angleSimSeg);
228 bestRecHit = &(*phiSegment2D);
229 bestRecHitFound =
true;
233 if(bestRecHitFound) {
243 fabs(bestRecHitLocalPos.
x() - posSimSeg) < 5*
sigmaResPos) {
251 bestRecHitLocalPos.
x(),
254 sqrt(bestRecHitLocalPosErr.
xx()),
255 sqrt(bestRecHitLocalDirErr.
xx())
virtual LocalError localPositionError() const
local position error in SL frame
std::pair< const_iterator, const_iterator > range
iterator range
HEff2DHit * h2DHitEff_SuperPhi
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Geom::Phi< T > phi() const
virtual LocalError localDirectionError() const
the local direction error (xx,xy,yy) in SL frame: only xx is not 0.
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) ...
void Fill(float angleSimSegment, float angleRecSegment, float posSimSegment, float posRecSegment, float etaSimSegment, float phiSimSegment, float sigmaPos, float sigmaAngle)
HRes2DHit * h2DHitSuperPhi
static std::pair< double, double > findSegmentAlphaAndBeta(const LocalVector &direction)
Find the angles from a segment direction:
virtual LocalPoint localPosition() const
local position in SL frame
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...
void Fill(float etaSimSegm, float phiSimSegm, float posSimSegm, float angleSimSegm, bool fillRecHit)
virtual LocalVector localDirection() const
the local direction in SL frame
edm::InputTag segment4DLabel
std::vector< PSimHit > PSimHitContainer
static std::map< DTWireId, edm::PSimHitContainer > mapSimHitsPerWire(const edm::PSimHitContainer &simhits)
edm::InputTag simHitLabel