1 |
|
#include "UserCode/L1RpcTriggerAnalysis/interface/SynchroSelector.h" |
2 |
+ |
|
3 |
|
#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 |
|
|
7 |
– |
|
8 |
|
#include "DataFormats/TrackReco/interface/TrackFwd.h" |
9 |
|
#include "DataFormats/TrackReco/interface/Track.h" |
10 |
– |
#include "DataFormats/TrackReco/interface/print.h" |
10 |
|
|
12 |
– |
#include "DataFormats/L1GlobalMuonTrigger/interface/L1MuRegionalCand.h" |
13 |
– |
#include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTCand.h" |
14 |
– |
#include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTExtendedCand.h" |
15 |
– |
#include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTReadoutCollection.h" |
11 |
|
|
12 |
|
#include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h" |
13 |
|
#include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h" |
19 |
|
#include "TrackingTools/GeomPropagators/interface/Propagator.h" |
20 |
|
|
21 |
|
#include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h" |
27 |
– |
#include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h" |
28 |
– |
#include "DataFormats/GeometrySurface/interface/BoundCylinder.h" |
29 |
– |
#include "DataFormats/GeometrySurface/interface/SimpleCylinderBounds.h" |
30 |
– |
#include "DataFormats/GeometrySurface/interface/BoundDisk.h" |
31 |
– |
#include "DataFormats/GeometrySurface/interface/SimpleDiskBounds.h" |
32 |
– |
#include "DataFormats/BeamSpot/interface/BeamSpot.h" |
33 |
– |
|
22 |
|
|
23 |
|
#include "DataFormats/MuonDetId/interface/RPCDetId.h" |
24 |
+ |
#include "DataFormats/RPCRecHit/interface/RPCRecHitCollection.h" |
25 |
+ |
|
26 |
|
#include "TH1.h" |
27 |
|
#include <cmath> |
28 |
|
using namespace edm; |
29 |
|
using namespace std; |
30 |
|
|
31 |
|
SynchroSelector::SynchroSelector(const edm::ParameterSet & cfg) |
32 |
< |
: theConfig(cfg), hDxy(0),hNum(0),hDeltaEta(0),hDeltaPhi(0) |
32 |
> |
: theConfig(cfg), hPullX(0),hDistX(0) |
33 |
|
{ } |
34 |
|
|
35 |
< |
bool SynchroSelector::checkMatching( const TrajectoryStateOnSurface & tsos, |
46 |
< |
float rpcEta, float rpcPhi, const edm::Event&ev, const edm::EventSetup& es) |
35 |
> |
bool SynchroSelector::checkRpcDetMatching( const TrajectoryStateOnSurface & tsos, const RPCDetId & det, const edm::Event&ev, const edm::EventSetup& es) |
36 |
|
{ |
48 |
– |
edm::ESHandle<GlobalTrackingGeometry> globalGeometry; |
49 |
– |
es.get<GlobalTrackingGeometryRecord>().get(globalGeometry); |
50 |
– |
edm::ESHandle<MagneticField> magField; |
51 |
– |
es.get<IdealMagneticFieldRecord>().get(magField); |
52 |
– |
ReferenceCountingPointer<Surface> rpc; |
53 |
– |
if (rpcEta < -1.04) rpc = ReferenceCountingPointer<Surface>(new BoundDisk( GlobalPoint(0.,0.,-800.), TkRotation<float>(), SimpleDiskBounds( 300., 710., -10., 10. ) ) ); |
54 |
– |
else if (rpcEta < 1.04) rpc = ReferenceCountingPointer<Surface>(new BoundCylinder( GlobalPoint(0.,0.,0.), TkRotation<float>(), SimpleCylinderBounds( 500, 520, -700, 700 ) ) ); |
55 |
– |
else rpc = ReferenceCountingPointer<Surface>(new BoundDisk( GlobalPoint(0.,0.,800.), TkRotation<float>(), SimpleDiskBounds( 300., 710., -10., 10. ) ) ); |
37 |
|
edm::ESHandle<Propagator> propagator; |
38 |
< |
es.get<TrackingComponentsRecord>().get("SteppingHelixPropagatorAny", propagator); |
58 |
< |
TrajectoryStateOnSurface trackAtRPC = propagator->propagate(tsos, *rpc); |
59 |
< |
if (!trackAtRPC.isValid()) return false; |
60 |
< |
float phi = trackAtRPC.globalPosition().phi(); |
61 |
< |
float dphi = phi-rpcPhi; |
62 |
< |
if (dphi < -M_PI) dphi+=2*M_PI; |
63 |
< |
if (dphi > M_PI) dphi-=2*M_PI; |
64 |
< |
float eta = trackAtRPC.globalPosition().eta(); |
65 |
< |
float deta = eta-rpcEta; |
66 |
< |
if (fabs(dphi) < mindphi ) mindphi = fabs(dphi); |
67 |
< |
if (fabs(deta) < mindeta ) mindeta = fabs(deta); |
38 |
> |
es.get<TrackingComponentsRecord>().get("SteppingHelixPropagatorAlong", propagator); |
39 |
|
|
40 |
+ |
edm::ESHandle<GlobalTrackingGeometry> globalGeometry; |
41 |
+ |
es.get<GlobalTrackingGeometryRecord>().get(globalGeometry); |
42 |
|
|
43 |
< |
double maxDeltaEta = theConfig.getParameter<double>("maxDeltaEta"); |
44 |
< |
double maxDeltaPhi = theConfig.getParameter<double>("maxDeltaPhi"); |
45 |
< |
return ( fabs(dphi) < maxDeltaPhi && fabs(deta) < maxDeltaEta) ? true : false; |
43 |
> |
GlobalPoint detPos, trackPos; |
44 |
> |
// std::cout <<"BEFORE PROPAGATION POSITION:"<< tsos.globalPosition().perp()<<" GLOBAL MOMENTUM:"<<tsos.globalMomentum().mag()<< std::endl; |
45 |
> |
TrajectoryStateOnSurface trackAtRPC = propagator->propagate(tsos, globalGeometry->idToDet(det)->surface()); |
46 |
> |
if (!trackAtRPC.isValid()) return false; |
47 |
> |
// std::cout <<"AFTER PROPAGATION POSITION:"<< trackAtRPC.globalPosition().perp()<<" GLOBAL MOMENTUM:"<<trackAtRPC.globalMomentum().mag()<< std::endl; |
48 |
> |
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 propQuality = 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) propQuality = 0; |
66 |
> |
else if (trackAtRPC.localError().positionError().xx() > 500 || trackAtRPC.localError().positionError().yy() > 500) propQuality = 1; |
67 |
> |
else if (trackAtRPC.localError().positionError().xx() > 100 || trackAtRPC.localError().positionError().yy() > 100) propQuality = 2; |
68 |
> |
else propQuality = 3.; |
69 |
> |
|
70 |
> |
if (propQuality < theConfig.getParameter<int>("checkRpcDetMatching_minPropagationQuality") ) return false; |
71 |
> |
double scale = theConfig.getParameter<bool>("checkRpcDetMatching_matchingScaleAuto") ? propQuality : theConfig.getParameter<double>("checkRpcDetMatching_matchingScaleValue") ; |
72 |
> |
|
73 |
> |
bool inside = globalGeometry->idToDet(det)->surface().bounds().inside( trackAtRPC.localPosition(), trackAtRPC.localError().positionError(), scale); |
74 |
> |
//std::cout<<"In:"<<inside <<" detector r:" << detPos.perp()<<" phi:"<<detPos.phi()<<" z:"<<detPos.z() |
75 |
> |
// <<" track r:"<< trackPos.perp()<<" phi:"<<trackPos.phi()<<" z:"<<trackPos.z() <<"Error: "<<trackAtRPC.localError().positionError()<< std::endl; |
76 |
> |
return inside; |
77 |
|
} |
78 |
|
|
79 |
< |
bool SynchroSelector::checkTriggerMatching( const TrajectoryStateOnSurface & tsos, const edm::Event&ev, const edm::EventSetup& es) |
79 |
> |
bool SynchroSelector::checkUniqueRecHitMatching( const TrajectoryStateOnSurface & tsos, const RPCDetId & det, const edm::Event&ev, const edm::EventSetup& es) |
80 |
|
{ |
81 |
< |
edm::Handle<L1MuGMTReadoutCollection> pCollection; |
82 |
< |
InputTag l1MuReadout = theConfig.getParameter<edm::InputTag>("l1MuReadout"); |
83 |
< |
ev.getByLabel(l1MuReadout,pCollection); |
80 |
< |
L1MuGMTReadoutCollection const* gmtrc = pCollection.product(); |
81 |
< |
if (!gmtrc) return false; |
82 |
< |
|
83 |
< |
vector<L1MuGMTReadoutRecord> gmt_records = gmtrc->getRecords(); |
84 |
< |
vector<L1MuGMTReadoutRecord>::const_iterator RRItr; |
85 |
< |
typedef vector<L1MuRegionalCand>::const_iterator ITC; |
86 |
< |
for( RRItr = gmt_records.begin() ; RRItr != gmt_records.end() ; RRItr++ ) { |
87 |
< |
for (int i=1; i<=2; ++i) { |
88 |
< |
vector<L1MuRegionalCand> Cands = (i==1) ? RRItr->getBrlRPCCands() : RRItr->getFwdRPCCands(); |
89 |
< |
for(ITC it = Cands.begin() ; it != Cands.end() ; ++it ) { |
90 |
< |
if (it->empty()) continue; |
91 |
< |
if (checkMatching(tsos, it->etaValue(), it->phiValue(),ev,es)) return true; |
92 |
< |
} |
93 |
< |
} |
94 |
< |
} |
95 |
< |
return false; |
96 |
< |
} |
97 |
< |
|
98 |
< |
bool SynchroSelector::takeIt(const RPCDetId & det, const edm::Event&ev, const edm::EventSetup& es) |
99 |
< |
{ |
100 |
< |
std::string theOption = theConfig.getParameter<std::string>("collection"); |
101 |
< |
bool theCheckL1Matching = theConfig.getParameter<bool>("matchL1RPC"); |
102 |
< |
float theMaxTIP = theConfig.getParameter<double>("maxTIP"); |
103 |
< |
float theMinPt = theConfig.getParameter<double>("minPt"); |
104 |
< |
|
105 |
< |
edm::Handle<reco::TrackCollection> trackCollection; |
106 |
< |
ev.getByLabel(InputTag(theOption),trackCollection); |
107 |
< |
|
81 |
> |
//propagate to det |
82 |
> |
edm::ESHandle<Propagator> propagator; |
83 |
> |
es.get<TrackingComponentsRecord>().get("SteppingHelixPropagatorAny", propagator); |
84 |
|
edm::ESHandle<GlobalTrackingGeometry> globalGeometry; |
85 |
|
es.get<GlobalTrackingGeometryRecord>().get(globalGeometry); |
86 |
< |
|
87 |
< |
edm::ESHandle<MagneticField> magField; |
88 |
< |
es.get<IdealMagneticFieldRecord>().get(magField); |
89 |
< |
|
90 |
< |
math::XYZPoint reference(0.,0.,0.); |
91 |
< |
if (theConfig.exists("beamSpot")) { |
92 |
< |
edm::InputTag beamSpot = theConfig.getParameter<edm::InputTag>("beamSpot"); |
93 |
< |
edm::Handle<reco::BeamSpot> bsHandle; |
94 |
< |
ev.getByLabel( beamSpot, bsHandle); |
95 |
< |
if (bsHandle.isValid()) reference = math::XYZPoint(bsHandle->x0(), bsHandle->y0(), bsHandle->z0()); |
96 |
< |
} |
97 |
< |
|
98 |
< |
|
99 |
< |
reco::TrackCollection tracks = *(trackCollection.product()); |
100 |
< |
//cout <<"#RECONSTRUCTED tracks: " << tracks.size() << endl; |
101 |
< |
if (hNum) hNum->Fill(tracks.size()); |
102 |
< |
|
103 |
< |
bool inside = false; |
104 |
< |
mindeta = 100.; |
105 |
< |
mindphi = 100.; |
106 |
< |
|
107 |
< |
typedef reco::TrackCollection::const_iterator IT; |
108 |
< |
GlobalPoint detPos, trackPos; |
109 |
< |
for (IT it = tracks.begin(); it !=tracks.end(); ++it) { |
110 |
< |
const reco::Track & track = *it; |
135 |
< |
if (track.pt() < theMinPt ) continue; |
136 |
< |
double dxy = track.dxy(reference); |
137 |
< |
|
138 |
< |
TrajectoryStateOnSurface aTSOS = TrajectoryStateTransform().outerStateOnSurface(track, *globalGeometry, magField.product()); |
139 |
< |
if (theCheckL1Matching && !checkTriggerMatching(aTSOS, ev,es) ) continue; |
140 |
< |
|
141 |
< |
edm::ESHandle<Propagator> propagator; |
142 |
< |
es.get<TrackingComponentsRecord>().get("SteppingHelixPropagatorAny", propagator); |
143 |
< |
|
144 |
< |
TrajectoryStateOnSurface trackAtRPC = propagator->propagate(aTSOS, globalGeometry->idToDet(det)->surface()); |
145 |
< |
if (!trackAtRPC.isValid()) continue; |
146 |
< |
globalGeometry->idToDet(det)->specificSurface(); |
147 |
< |
detPos = globalGeometry->idToDet(det)->position(); |
148 |
< |
trackPos = trackAtRPC.globalPosition(); |
149 |
< |
std::cout <<" **** "<<theOption<<" position at RPC det:"<<det.rawId() |
150 |
< |
//<< is :"<globalGeometry->idToDet(det)->position() |
151 |
< |
<<", r= "<<trackAtRPC.globalPosition().perp() |
152 |
< |
<<", z= "<<trackAtRPC.globalPosition().z() |
153 |
< |
<<", phi= "<<trackAtRPC.globalPosition().phi() |
154 |
< |
<<", eta= "<<trackAtRPC.globalPosition().eta() |
155 |
< |
//<<" localPosition: "<<trackAtRPC.localPosition() |
156 |
< |
//<<" localError: (xx:"<<trackAtRPC.localError().positionError() |
157 |
< |
<<" isInside: "<< globalGeometry->idToDet(det)->surface().bounds().inside( trackAtRPC.localPosition()) |
158 |
< |
<< std::endl; |
159 |
< |
float scale = 0.; |
160 |
< |
if ( trackAtRPC.localError().positionError().xx() > 2500 || trackAtRPC.localError().positionError().yy() > 2500) continue; |
161 |
< |
else if (trackAtRPC.localError().positionError().xx() > 1000 || trackAtRPC.localError().positionError().yy() > 1000) scale = 0; |
162 |
< |
else if (trackAtRPC.localError().positionError().xx() > 500 || trackAtRPC.localError().positionError().yy() > 500) scale = 1; |
163 |
< |
else if (trackAtRPC.localError().positionError().xx() > 100 || trackAtRPC.localError().positionError().yy() > 100) scale = 2; |
164 |
< |
else scale = 3.; |
165 |
< |
|
166 |
< |
if (globalGeometry->idToDet(det)->surface().bounds().inside( trackAtRPC.localPosition(), trackAtRPC.localError().positionError(), scale)) { |
167 |
< |
if (hDxy) hDxy->Fill(dxy); |
168 |
< |
if (dxy < theMaxTIP) inside = true; |
169 |
< |
} |
170 |
< |
} |
171 |
< |
if (mindphi < 99.) hDeltaPhi->Fill(mindphi); |
172 |
< |
if (mindeta < 99.) hDeltaEta->Fill(mindeta); |
173 |
< |
|
174 |
< |
if (inside) { |
175 |
< |
std::cout <<" detector: " << detPos <<" track: "<< trackPos << std::endl; |
176 |
< |
thePos.push_back(trackPos); |
86 |
> |
TrajectoryStateOnSurface trackAtRPC = propagator->propagate(tsos, globalGeometry->idToDet(det)->surface()); |
87 |
> |
if (!trackAtRPC.isValid()) return false; |
88 |
> |
|
89 |
> |
LocalPoint trackAtRPCPoint = trackAtRPC.localPosition() ; |
90 |
> |
LocalError trackAtRPCError = trackAtRPC.localError().positionError(); |
91 |
> |
|
92 |
> |
edm::Handle<RPCRecHitCollection> rpcHits; |
93 |
> |
ev.getByType(rpcHits); |
94 |
> |
bool matched = false; |
95 |
> |
bool unique = true; |
96 |
> |
pair<RPCRecHitCollection::const_iterator, RPCRecHitCollection::const_iterator> recHitsInDet = rpcHits->get(det); |
97 |
> |
for (RPCRecHitCollection::const_iterator ih = recHitsInDet.first; ih != recHitsInDet.second; ++ih) { |
98 |
> |
LocalPoint hitPoint = ih->localPosition(); |
99 |
> |
LocalError hitError = ih->localPositionError(); |
100 |
> |
float distX = hitPoint.x()-trackAtRPCPoint.x(); |
101 |
> |
float pullX = distX/ sqrt( trackAtRPCError.xx()+hitError.xx()); |
102 |
> |
|
103 |
> |
if ( fabs(pullX) < theConfig.getParameter<double>("checkUniqueRecHitMatching_maxPull") |
104 |
> |
&& fabs(distX) < theConfig.getParameter<double>("checkUniqueRecHitMatching_maxDist") ) { |
105 |
> |
matched = true; |
106 |
> |
} else { |
107 |
> |
unique = false; |
108 |
> |
} |
109 |
> |
if (hPullX) hPullX->Fill(pullX); |
110 |
> |
if (hDistX) hDistX->Fill(distX); |
111 |
|
} |
112 |
< |
|
113 |
< |
return inside; |
114 |
< |
} |
112 |
> |
|
113 |
> |
return (matched && unique); |
114 |
> |
} |