1 |
#include "UserCode/ShallowTools/interface/ShallowTrackClustersProducer.h"
|
2 |
|
3 |
#include "UserCode/ShallowTools/interface/ShallowTools.h"
|
4 |
|
5 |
#include "TrackingTools/PatternTools/interface/Trajectory.h"
|
6 |
#include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
|
7 |
#include "TrackingTools/TrackFitters/interface/TrajectoryStateCombiner.h"
|
8 |
#include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
|
9 |
|
10 |
#include "MagneticField/Engine/interface/MagneticField.h"
|
11 |
#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
|
12 |
#include "CondFormats/SiStripObjects/interface/SiStripLorentzAngle.h"
|
13 |
#include "CondFormats/DataRecord/interface/SiStripLorentzAngleRcd.h"
|
14 |
#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
|
15 |
#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
|
16 |
#include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
|
17 |
#include "Geometry/CommonTopologies/interface/StripTopology.h"
|
18 |
#include "FWCore/Framework/interface/ESHandle.h"
|
19 |
#include "FWCore/Framework/interface/Event.h"
|
20 |
#include "boost/foreach.hpp"
|
21 |
|
22 |
|
23 |
ShallowTrackClustersProducer::ShallowTrackClustersProducer(const edm::ParameterSet& iConfig)
|
24 |
: theTracksLabel( iConfig.getParameter<edm::InputTag>("Tracks") ),
|
25 |
theClustersLabel( iConfig.getParameter<edm::InputTag>("Clusters") ),
|
26 |
Suffix ( iConfig.getParameter<std::string>("Suffix") ),
|
27 |
Prefix ( iConfig.getParameter<std::string>("Prefix") )
|
28 |
{
|
29 |
produces <std::vector<unsigned int> > ( Prefix + "trackmulti" + Suffix );
|
30 |
produces <std::vector<int> > ( Prefix + "trackindex" + Suffix );
|
31 |
produces <std::vector<float> > ( Prefix + "localtheta" + Suffix );
|
32 |
produces <std::vector<float> > ( Prefix + "localphi" + Suffix );
|
33 |
produces <std::vector<float> > ( Prefix + "localpitch" + Suffix );
|
34 |
produces <std::vector<float> > ( Prefix + "localx" + Suffix );
|
35 |
produces <std::vector<float> > ( Prefix + "localy" + Suffix );
|
36 |
produces <std::vector<float> > ( Prefix + "localz" + Suffix );
|
37 |
produces <std::vector<float> > ( Prefix + "strip" + Suffix );
|
38 |
produces <std::vector<float> > ( Prefix + "globaltheta" + Suffix );
|
39 |
produces <std::vector<float> > ( Prefix + "globalphi" + Suffix );
|
40 |
produces <std::vector<float> > ( Prefix + "globalx" + Suffix );
|
41 |
produces <std::vector<float> > ( Prefix + "globaly" + Suffix );
|
42 |
produces <std::vector<float> > ( Prefix + "globalz" + Suffix );
|
43 |
produces <std::vector<float> > ( Prefix + "insidistance"+ Suffix );
|
44 |
produces <std::vector<float> > ( Prefix + "covered" + Suffix );
|
45 |
produces <std::vector<float> > ( Prefix + "projwidth" + Suffix );
|
46 |
produces <std::vector<float> > ( Prefix + "BdotY" + Suffix );
|
47 |
|
48 |
produces <std::vector<float> > ( Prefix + "rhlocalx" + Suffix );
|
49 |
produces <std::vector<float> > ( Prefix + "rhlocaly" + Suffix );
|
50 |
produces <std::vector<float> > ( Prefix + "rhlocalxerr" + Suffix );
|
51 |
produces <std::vector<float> > ( Prefix + "rhlocalyerr" + Suffix );
|
52 |
produces <std::vector<float> > ( Prefix + "rhglobalx" + Suffix );
|
53 |
produces <std::vector<float> > ( Prefix + "rhglobaly" + Suffix );
|
54 |
produces <std::vector<float> > ( Prefix + "rhglobalz" + Suffix );
|
55 |
produces <std::vector<float> > ( Prefix + "rhstrip" + Suffix );
|
56 |
produces <std::vector<float> > ( Prefix + "rhmerr" + Suffix );
|
57 |
|
58 |
produces <std::vector<float> > ( Prefix + "ubstrip" + Suffix );
|
59 |
produces <std::vector<float> > ( Prefix + "ubmerr" + Suffix );
|
60 |
|
61 |
produces <std::vector<float> > ( Prefix + "driftx" + Suffix );
|
62 |
produces <std::vector<float> > ( Prefix + "drifty" + Suffix );
|
63 |
produces <std::vector<float> > ( Prefix + "driftz" + Suffix );
|
64 |
produces <std::vector<float> > ( Prefix + "globalZofunitlocalY" + Suffix );
|
65 |
}
|
66 |
|
67 |
void ShallowTrackClustersProducer::
|
68 |
produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
|
69 |
shallow::CLUSTERMAP clustermap = shallow::make_cluster_map(iEvent,theClustersLabel);
|
70 |
|
71 |
int size = clustermap.size();
|
72 |
std::auto_ptr<std::vector<unsigned int> > trackmulti ( new std::vector<unsigned int>(size, 0) );
|
73 |
std::auto_ptr<std::vector<int> > trackindex ( new std::vector<int> (size, -1) );
|
74 |
std::auto_ptr<std::vector<float> > localtheta ( new std::vector<float> (size, -100) );
|
75 |
std::auto_ptr<std::vector<float> > localphi ( new std::vector<float> (size, -100) );
|
76 |
std::auto_ptr<std::vector<float> > localpitch ( new std::vector<float> (size, -100) );
|
77 |
std::auto_ptr<std::vector<float> > localx ( new std::vector<float> (size, -100) );
|
78 |
std::auto_ptr<std::vector<float> > localy ( new std::vector<float> (size, -100) );
|
79 |
std::auto_ptr<std::vector<float> > localz ( new std::vector<float> (size, -100) );
|
80 |
std::auto_ptr<std::vector<float> > strip ( new std::vector<float> (size, -100) );
|
81 |
std::auto_ptr<std::vector<float> > globaltheta ( new std::vector<float> (size, -100) );
|
82 |
std::auto_ptr<std::vector<float> > globalphi ( new std::vector<float> (size, -100) );
|
83 |
std::auto_ptr<std::vector<float> > globalx ( new std::vector<float> (size, -10000) );
|
84 |
std::auto_ptr<std::vector<float> > globaly ( new std::vector<float> (size, -10000) );
|
85 |
std::auto_ptr<std::vector<float> > globalz ( new std::vector<float> (size, -10000) );
|
86 |
std::auto_ptr<std::vector<float> > insidistance ( new std::vector<float> (size, -1) );
|
87 |
std::auto_ptr<std::vector<float> > projwidth ( new std::vector<float> (size, -1000) );
|
88 |
std::auto_ptr<std::vector<float> > BdotY ( new std::vector<float> (size, -1000) );
|
89 |
std::auto_ptr<std::vector<float> > covered ( new std::vector<float> (size, -1000) );
|
90 |
std::auto_ptr<std::vector<float> > rhlocalx ( new std::vector<float>(size, -10000 ));
|
91 |
std::auto_ptr<std::vector<float> > rhlocaly ( new std::vector<float>(size, -10000 ));
|
92 |
std::auto_ptr<std::vector<float> > rhlocalxerr ( new std::vector<float>(size, -1 ));
|
93 |
std::auto_ptr<std::vector<float> > rhlocalyerr ( new std::vector<float>(size, -1 ));
|
94 |
std::auto_ptr<std::vector<float> > rhglobalx ( new std::vector<float>(size, -10000 ));
|
95 |
std::auto_ptr<std::vector<float> > rhglobaly ( new std::vector<float>(size, -10000 ));
|
96 |
std::auto_ptr<std::vector<float> > rhglobalz ( new std::vector<float>(size, -10000 ));
|
97 |
std::auto_ptr<std::vector<float> > rhstrip ( new std::vector<float>(size, -10000 ));
|
98 |
std::auto_ptr<std::vector<float> > rhmerr ( new std::vector<float>(size, -10000 ));
|
99 |
std::auto_ptr<std::vector<float> > ubstrip ( new std::vector<float>(size, -10000 ));
|
100 |
std::auto_ptr<std::vector<float> > ubmerr ( new std::vector<float>(size, -10000 ));
|
101 |
std::auto_ptr<std::vector<float> > driftx ( new std::vector<float>(size, -10000 ));
|
102 |
std::auto_ptr<std::vector<float> > drifty ( new std::vector<float>(size, -10000 ));
|
103 |
std::auto_ptr<std::vector<float> > driftz ( new std::vector<float>(size, -10000 ));
|
104 |
std::auto_ptr<std::vector<float> > globalZofunitlocalY ( new std::vector<float>(size, -1000));
|
105 |
|
106 |
edm::ESHandle<TrackerGeometry> theTrackerGeometry; iSetup.get<TrackerDigiGeometryRecord>().get( theTrackerGeometry );
|
107 |
edm::ESHandle<MagneticField> magfield; iSetup.get<IdealMagneticFieldRecord>().get(magfield);
|
108 |
edm::ESHandle<SiStripLorentzAngle> SiStripLorentzAngle; iSetup.get<SiStripLorentzAngleRcd>().get(SiStripLorentzAngle);
|
109 |
|
110 |
edm::Handle<edm::View<reco::Track> > tracks; iEvent.getByLabel(theTracksLabel, tracks);
|
111 |
edm::Handle<TrajTrackAssociationCollection> associations; iEvent.getByLabel(theTracksLabel, associations);
|
112 |
|
113 |
TrajectoryStateCombiner combiner;
|
114 |
|
115 |
for( TrajTrackAssociationCollection::const_iterator association = associations->begin();
|
116 |
association != associations->end(); association++) {
|
117 |
const Trajectory* traj = association->key.get();
|
118 |
const reco::Track* track = association->val.get();
|
119 |
|
120 |
BOOST_FOREACH( const TrajectoryMeasurement measurement, traj->measurements() ) {
|
121 |
const TrajectoryStateOnSurface tsos = measurement.updatedState();
|
122 |
const TrajectoryStateOnSurface unbiased = combiner(measurement.forwardPredictedState(), measurement.backwardPredictedState());
|
123 |
const SiStripRecHit2D* hit = dynamic_cast<const SiStripRecHit2D*> ( measurement.recHit()->hit() );
|
124 |
|
125 |
if(!hit) continue;
|
126 |
shallow::CLUSTERMAP::const_iterator cluster = clustermap.find( std::make_pair(hit->geographicalId().rawId(), hit->cluster()->firstStrip() ));
|
127 |
if(cluster == clustermap.end() ) throw cms::Exception("Logic Error") << "Cluster not found: this could be a configuration error" << std::endl;
|
128 |
|
129 |
unsigned i = cluster->second;
|
130 |
if( 0 == (trackmulti->at(i))++ ) {
|
131 |
const StripGeomDetUnit* theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTrackerGeometry->idToDet( hit->geographicalId() ) );
|
132 |
LocalVector drift = shallow::drift( theStripDet, *magfield, *SiStripLorentzAngle);
|
133 |
|
134 |
trackindex->at(i) = shallow::findTrackIndex(tracks, track);
|
135 |
localtheta->at(i) = (theStripDet->toLocal(tsos.globalDirection())).theta();
|
136 |
localphi->at(i) = (theStripDet->toLocal(tsos.globalDirection())).phi();
|
137 |
localpitch->at(i) = (theStripDet->specificTopology()).localPitch(theStripDet->toLocal(tsos.globalPosition()));
|
138 |
localx->at(i) = (theStripDet->toLocal(tsos.globalPosition())).x();
|
139 |
localy->at(i) = (theStripDet->toLocal(tsos.globalPosition())).y();
|
140 |
localz->at(i) = (theStripDet->toLocal(tsos.globalPosition())).z();
|
141 |
strip->at(i) = (theStripDet->specificTopology()).strip(theStripDet->toLocal(tsos.globalPosition()));
|
142 |
globaltheta->at(i) = tsos.globalDirection().theta();
|
143 |
globalphi->at(i) = tsos.globalDirection().phi();
|
144 |
globalx->at(i) = tsos.globalPosition().x();
|
145 |
globaly->at(i) = tsos.globalPosition().y();
|
146 |
globalz->at(i) = tsos.globalPosition().z();
|
147 |
insidistance->at(i) = 1./fabs(cos(localtheta->at(i)));
|
148 |
projwidth->at(i) = tan(localtheta->at(i))*cos(localphi->at(i));
|
149 |
BdotY->at(i) = (theStripDet->surface()).toLocal( magfield->inTesla(theStripDet->surface().position())).y();
|
150 |
covered->at(i) = drift.z()/localpitch->at(i) * fabs(projwidth->at(i) - drift.x()/drift.z());
|
151 |
rhlocalx->at(i) = hit->localPosition().x();
|
152 |
rhlocaly->at(i) = hit->localPosition().y();
|
153 |
rhlocalxerr->at(i) = sqrt(hit->localPositionError().xx());
|
154 |
rhlocalyerr->at(i) = sqrt(hit->localPositionError().yy());
|
155 |
rhglobalx->at(i) = theStripDet->toGlobal(hit->localPosition()).x();
|
156 |
rhglobaly->at(i) = theStripDet->toGlobal(hit->localPosition()).y();
|
157 |
rhglobalz->at(i) = theStripDet->toGlobal(hit->localPosition()).z();
|
158 |
rhstrip->at(i) = theStripDet->specificTopology().strip(hit->localPosition());
|
159 |
rhmerr->at(i) = sqrt(theStripDet->specificTopology().measurementError(hit->localPosition(), hit->localPositionError()).uu());
|
160 |
ubstrip->at(i) = theStripDet->specificTopology().strip(unbiased.localPosition());
|
161 |
ubmerr->at(i) = sqrt(theStripDet->specificTopology().measurementError(unbiased.localPosition(), unbiased.localError().positionError()).uu());
|
162 |
driftx->at(i) = drift.x();
|
163 |
drifty->at(i) = drift.y();
|
164 |
driftz->at(i) = drift.z();
|
165 |
globalZofunitlocalY->at(i) = (theStripDet->toGlobal(LocalVector(0,1,0))).z();
|
166 |
}
|
167 |
}
|
168 |
}
|
169 |
|
170 |
iEvent.put(trackmulti, Prefix + "trackmulti" + Suffix );
|
171 |
iEvent.put(trackindex, Prefix + "trackindex" + Suffix );
|
172 |
iEvent.put(localtheta, Prefix + "localtheta" + Suffix );
|
173 |
iEvent.put(localphi, Prefix + "localphi" + Suffix );
|
174 |
iEvent.put(localpitch, Prefix + "localpitch" + Suffix );
|
175 |
iEvent.put(localx, Prefix + "localx" + Suffix );
|
176 |
iEvent.put(localy, Prefix + "localy" + Suffix );
|
177 |
iEvent.put(localz, Prefix + "localz" + Suffix );
|
178 |
iEvent.put(strip, Prefix + "strip" + Suffix );
|
179 |
iEvent.put(globaltheta, Prefix + "globaltheta" + Suffix );
|
180 |
iEvent.put(globalphi, Prefix + "globalphi" + Suffix );
|
181 |
iEvent.put(globalx, Prefix + "globalx" + Suffix );
|
182 |
iEvent.put(globaly, Prefix + "globaly" + Suffix );
|
183 |
iEvent.put(globalz, Prefix + "globalz" + Suffix );
|
184 |
iEvent.put(insidistance,Prefix + "insidistance"+ Suffix );
|
185 |
iEvent.put(covered, Prefix + "covered" + Suffix );
|
186 |
iEvent.put(projwidth, Prefix + "projwidth" + Suffix );
|
187 |
iEvent.put(BdotY, Prefix + "BdotY" + Suffix );
|
188 |
iEvent.put(rhlocalx, Prefix + "rhlocalx" + Suffix );
|
189 |
iEvent.put(rhlocaly, Prefix + "rhlocaly" + Suffix );
|
190 |
iEvent.put(rhlocalxerr, Prefix + "rhlocalxerr" + Suffix );
|
191 |
iEvent.put(rhlocalyerr, Prefix + "rhlocalyerr" + Suffix );
|
192 |
iEvent.put(rhglobalx, Prefix + "rhglobalx" + Suffix );
|
193 |
iEvent.put(rhglobaly, Prefix + "rhglobaly" + Suffix );
|
194 |
iEvent.put(rhglobalz, Prefix + "rhglobalz" + Suffix );
|
195 |
iEvent.put(rhstrip, Prefix + "rhstrip" + Suffix );
|
196 |
iEvent.put(rhmerr, Prefix + "rhmerr" + Suffix );
|
197 |
iEvent.put(ubstrip, Prefix + "ubstrip" + Suffix );
|
198 |
iEvent.put(ubmerr, Prefix + "ubmerr" + Suffix );
|
199 |
iEvent.put( driftx, Prefix + "driftx" + Suffix );
|
200 |
iEvent.put( drifty, Prefix + "drifty" + Suffix );
|
201 |
iEvent.put( driftz, Prefix + "driftz" + Suffix );
|
202 |
iEvent.put( globalZofunitlocalY, Prefix + "globalZofunitlocalY" + Suffix );
|
203 |
}
|