Perform the real analysis.
133 map<DTSuperLayerId, PSimHitContainer > simHitsPerSl;
134 for(PSimHitContainer::const_iterator
simHit = simHits->begin();
139 simHitsPerSl[slId].push_back(*
simHit);
148 <<
" in this event, skipping!" << endl;
153 DTRecSegment2DCollection::id_iterator slId;
154 for (slId = segment2Ds->id_begin();
155 slId != segment2Ds->id_end();
165 int nMuSimHit = muSimHitPerWire.size();
166 if(nMuSimHit == 0 || nMuSimHit == 1) {
167 if(
debug && nMuSimHit == 1)
168 cout <<
"[DTSegment2DQuality] Only " << nMuSimHit <<
" mu SimHit in this SL, skipping!" << endl;
172 cout <<
"=== SL " << (*slId) <<
" has " << nMuSimHit <<
" SimHits" << endl;
177 if(inAndOutSimHit.first ==inAndOutSimHit.second ) {
178 cout <<
"[DTHitQualityUtils]***Warning: outermost and innermost SimHit are the same!" << endl;
186 LocalVector simSegmLocalDir = dirAndPosSimSegm.first;
187 LocalPoint simSegmLocalPos = dirAndPosSimSegm.second;
189 cout<<
" Simulated segment: local direction "<<simSegmLocalDir<<endl
190 <<
" local position "<<simSegmLocalPos<<endl;
196 float posSimSeg = simSegmLocalPos.
x();
198 float etaSimSeg = simSegmGlobalPos.
eta();
199 float phiSimSeg = simSegmGlobalPos.
phi();
204 bool recHitFound =
false;
206 int nsegm =
distance(range.first, range.second);
208 cout <<
" Sl: " << *slId <<
" has " << nsegm
209 <<
" 2D segments" << endl;
218 bool bestRecHitFound =
false;
219 double deltaAlpha = 99999;
223 segment2D!=range.second;
226 if((*segment2D).dimension() != 2) {
227 if(
debug)
cout <<
"[DTSegment2DQuality]***Error: This is not 2D segment!!!" << endl;
231 LocalVector recSegDirection = (*segment2D).localDirection();
232 LocalPoint recSegPosition = (*segment2D).localPosition();
236 cout <<
" RecSegment direction: " << recSegDirection << endl
237 <<
" position : " << recSegPosition << endl
238 <<
" alpha : " << recSegAlpha << endl;
240 if(fabs(recSegAlpha - angleSimSeg) < deltaAlpha) {
241 deltaAlpha = fabs(recSegAlpha - angleSimSeg);
242 bestRecHit = &(*segment2D);
243 bestRecHitFound =
true;
247 if(bestRecHitFound) {
258 fabs(bestRecHitLocalPos.
x() - posSimSeg) < 5*
sigmaResPos) {
264 if((*slId).superlayer() == 1 || (*slId).superlayer() == 3) {
266 }
else if((*slId).superlayer() == 2) {
270 bestRecHitLocalPos.
x(),
273 sqrt(bestRecHitLocalPosErr.
xx()),
274 sqrt(bestRecHitLocalDirErr.
xx())
276 if(
abs((*slId).wheel()) == 0)
278 else if(
abs((*slId).wheel()) == 1)
280 else if(
abs((*slId).wheel()) == 2)
283 hRes->
Fill(angleSimSeg,
286 bestRecHitLocalPos.
x(),
289 sqrt(bestRecHitLocalPosErr.
xx()),
290 sqrt(bestRecHitLocalDirErr.
xx())
297 if((*slId).superlayer() == 1 || (*slId).superlayer() == 3) {
299 }
else if((*slId).superlayer() == 2) {
300 h2DHitEff_RZ->
Fill(etaSimSeg, phiSimSeg, posSimSeg, angleSimSeg, recHitFound);
301 if(
abs((*slId).wheel()) == 0)
303 else if(
abs((*slId).wheel()) == 1)
305 else if(
abs((*slId).wheel()) == 2)
308 hEff->
Fill(etaSimSeg, phiSimSeg, posSimSeg, angleSimSeg, recHitFound);
LocalError localPositionError() const override
local position error in SL frame
std::pair< const_iterator, const_iterator > range
iterator range
edm::EDGetTokenT< edm::PSimHitContainer > simHitToken_
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Geom::Phi< T > phi() const
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)
Abs< T >::type abs(const T &t)
HEff2DHit * h2DHitEff_RZ_W0
edm::EDGetTokenT< DTRecSegment2DCollection > segment2DToken_
static std::pair< double, double > findSegmentAlphaAndBeta(const LocalVector &direction)
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
HEff2DHit * h2DHitEff_RZ_W1
HEff2DHit * h2DHitEff_RPhi
void Fill(float etaSimSegm, float phiSimSegm, float posSimSegm, float angleSimSegm, bool fillRecHit)
edm::InputTag segment2DLabel
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.
HEff2DHit * h2DHitEff_RZ_W2
const DTSuperLayer * superLayer(const DTSuperLayerId &id) const
Return a DTSuperLayer given its id.