1 |
konec |
1.1 |
#include "UserCode/L1RpcTriggerAnalysis/interface/SynchroSelector.h"
|
2 |
konec |
1.4 |
|
3 |
konec |
1.1 |
#include "FWCore/Framework/interface/Event.h"
|
4 |
|
|
#include "FWCore/Framework/interface/EventSetup.h"
|
5 |
|
|
#include "FWCore/Framework/interface/ESHandle.h"
|
6 |
|
|
#include "FWCore/Utilities/interface/InputTag.h"
|
7 |
|
|
|
8 |
|
|
#include "DataFormats/TrackReco/interface/TrackFwd.h"
|
9 |
|
|
#include "DataFormats/TrackReco/interface/Track.h"
|
10 |
|
|
|
11 |
|
|
|
12 |
|
|
#include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
|
13 |
|
|
#include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
|
14 |
|
|
|
15 |
|
|
#include "Geometry/CommonDetUnit/interface/GeomDet.h"
|
16 |
|
|
#include "MagneticField/Engine/interface/MagneticField.h"
|
17 |
|
|
#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
|
18 |
|
|
#include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
|
19 |
|
|
#include "TrackingTools/GeomPropagators/interface/Propagator.h"
|
20 |
|
|
|
21 |
|
|
#include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
|
22 |
|
|
|
23 |
|
|
#include "DataFormats/MuonDetId/interface/RPCDetId.h"
|
24 |
konec |
1.2 |
#include "DataFormats/RPCRecHit/interface/RPCRecHitCollection.h"
|
25 |
|
|
|
26 |
konec |
1.1 |
#include "TH1.h"
|
27 |
|
|
#include <cmath>
|
28 |
|
|
using namespace edm;
|
29 |
|
|
using namespace std;
|
30 |
|
|
|
31 |
|
|
SynchroSelector::SynchroSelector(const edm::ParameterSet & cfg)
|
32 |
konec |
1.4 |
: theConfig(cfg), hPullX(0),hDistX(0)
|
33 |
konec |
1.1 |
{ }
|
34 |
|
|
|
35 |
konec |
1.2 |
bool SynchroSelector::checkRpcDetMatching( const TrajectoryStateOnSurface & tsos, const RPCDetId & det, const edm::Event&ev, const edm::EventSetup& es)
|
36 |
|
|
{
|
37 |
|
|
edm::ESHandle<Propagator> propagator;
|
38 |
konec |
1.3 |
es.get<TrackingComponentsRecord>().get("SteppingHelixPropagatorAlong", propagator);
|
39 |
konec |
1.1 |
|
40 |
konec |
1.2 |
edm::ESHandle<GlobalTrackingGeometry> globalGeometry;
|
41 |
|
|
es.get<GlobalTrackingGeometryRecord>().get(globalGeometry);
|
42 |
konec |
1.1 |
|
43 |
konec |
1.2 |
GlobalPoint detPos, trackPos;
|
44 |
konec |
1.4 |
// std::cout <<"BEFORE PROPAGATION POSITION:"<< tsos.globalPosition().perp()<<" GLOBAL MOMENTUM:"<<tsos.globalMomentum().mag()<< std::endl;
|
45 |
konec |
1.2 |
TrajectoryStateOnSurface trackAtRPC = propagator->propagate(tsos, globalGeometry->idToDet(det)->surface());
|
46 |
|
|
if (!trackAtRPC.isValid()) return false;
|
47 |
konec |
1.4 |
// std::cout <<"AFTER PROPAGATION POSITION:"<< trackAtRPC.globalPosition().perp()<<" GLOBAL MOMENTUM:"<<trackAtRPC.globalMomentum().mag()<< std::endl;
|
48 |
konec |
1.2 |
detPos = globalGeometry->idToDet(det)->position();
|
49 |
|
|
trackPos = trackAtRPC.globalPosition();
|
50 |
|
|
|
51 |
|
|
/*
|
52 |
|
|
std::cout <<" **** "<<theConfig.getParameter<std::string>("collection")<<" position at RPC det:"<<det.rawId()
|
53 |
|
|
//<< is :"<globalGeometry->idToDet(det)->position()
|
54 |
|
|
<<", r= "<<trackAtRPC.globalPosition().perp()
|
55 |
|
|
<<", z= "<<trackAtRPC.globalPosition().z()
|
56 |
|
|
<<", phi= "<<trackAtRPC.globalPosition().phi()
|
57 |
|
|
<<", eta= "<<trackAtRPC.globalPosition().eta()
|
58 |
|
|
//<<" localPosition: "<<trackAtRPC.localPosition()
|
59 |
|
|
//<<" localError: (xx:"<<trackAtRPC.localError().positionError()
|
60 |
|
|
<<" isInside: "<< globalGeometry->idToDet(det)->surface().bounds().inside( trackAtRPC.localPosition())
|
61 |
|
|
<< std::endl;
|
62 |
|
|
*/
|
63 |
|
|
float scale = 0.;
|
64 |
|
|
if ( trackAtRPC.localError().positionError().xx() > 2500 || trackAtRPC.localError().positionError().yy() > 2500) return false;
|
65 |
|
|
else if (trackAtRPC.localError().positionError().xx() > 1000 || trackAtRPC.localError().positionError().yy() > 1000) scale = 0;
|
66 |
|
|
else if (trackAtRPC.localError().positionError().xx() > 500 || trackAtRPC.localError().positionError().yy() > 500) scale = 1;
|
67 |
|
|
else if (trackAtRPC.localError().positionError().xx() > 100 || trackAtRPC.localError().positionError().yy() > 100) scale = 2;
|
68 |
|
|
else scale = 3.;
|
69 |
|
|
|
70 |
|
|
bool inside = globalGeometry->idToDet(det)->surface().bounds().inside( trackAtRPC.localPosition(), trackAtRPC.localError().positionError(), scale);
|
71 |
konec |
1.4 |
//std::cout<<"In:"<<inside <<" detector r:" << detPos.perp()<<" phi:"<<detPos.phi()<<" z:"<<detPos.z()
|
72 |
|
|
// <<" track r:"<< trackPos.perp()<<" phi:"<<trackPos.phi()<<" z:"<<trackPos.z() <<"Error: "<<trackAtRPC.localError().positionError()<< std::endl;
|
73 |
konec |
1.1 |
return inside;
|
74 |
konec |
1.2 |
}
|
75 |
|
|
|
76 |
|
|
bool SynchroSelector::checkUniqueRecHitMatching( const TrajectoryStateOnSurface & tsos, const RPCDetId & det, const edm::Event&ev, const edm::EventSetup& es)
|
77 |
|
|
{
|
78 |
|
|
//propagate to det
|
79 |
|
|
edm::ESHandle<Propagator> propagator;
|
80 |
konec |
1.4 |
es.get<TrackingComponentsRecord>().get("SteppingHelixPropagatorAny", propagator);
|
81 |
konec |
1.2 |
edm::ESHandle<GlobalTrackingGeometry> globalGeometry;
|
82 |
|
|
es.get<GlobalTrackingGeometryRecord>().get(globalGeometry);
|
83 |
|
|
TrajectoryStateOnSurface trackAtRPC = propagator->propagate(tsos, globalGeometry->idToDet(det)->surface());
|
84 |
|
|
if (!trackAtRPC.isValid()) return false;
|
85 |
|
|
|
86 |
|
|
LocalPoint trackAtRPCPoint = trackAtRPC.localPosition() ;
|
87 |
|
|
LocalError trackAtRPCError = trackAtRPC.localError().positionError();
|
88 |
|
|
|
89 |
|
|
edm::Handle<RPCRecHitCollection> rpcHits;
|
90 |
|
|
ev.getByType(rpcHits);
|
91 |
|
|
bool matched = false;
|
92 |
|
|
bool unique = true;
|
93 |
|
|
pair<RPCRecHitCollection::const_iterator, RPCRecHitCollection::const_iterator> recHitsInDet = rpcHits->get(det);
|
94 |
|
|
for (RPCRecHitCollection::const_iterator ih = recHitsInDet.first; ih != recHitsInDet.second; ++ih) {
|
95 |
|
|
LocalPoint hitPoint = ih->localPosition();
|
96 |
|
|
LocalError hitError = ih->localPositionError();
|
97 |
|
|
float distX = hitPoint.x()-trackAtRPCPoint.x();
|
98 |
|
|
float pullX = distX/ sqrt( trackAtRPCError.xx()+hitError.xx());
|
99 |
|
|
|
100 |
konec |
1.4 |
if (fabs(pullX) < 2. && fabs(distX) < 5.) {
|
101 |
konec |
1.2 |
matched = true;
|
102 |
|
|
} else {
|
103 |
|
|
unique = false;
|
104 |
|
|
}
|
105 |
|
|
if (hPullX) hPullX->Fill(pullX);
|
106 |
|
|
if (hDistX) hDistX->Fill(distX);
|
107 |
|
|
}
|
108 |
|
|
|
109 |
|
|
return (matched && unique);
|
110 |
|
|
}
|