00001 #include "CalibTracker/SiStripCommon/interface/ShallowTrackClustersProducer.h" 00002 00003 #include "CalibTracker/SiStripCommon/interface/ShallowTools.h" 00004 00005 #include "TrackingTools/PatternTools/interface/Trajectory.h" 00006 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h" 00007 #include "TrackingTools/TrackFitters/interface/TrajectoryStateCombiner.h" 00008 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit1D.h" 00009 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h" 00010 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h" 00011 00012 #include "MagneticField/Engine/interface/MagneticField.h" 00013 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h" 00014 #include "CondFormats/SiStripObjects/interface/SiStripLorentzAngle.h" 00015 #include "CondFormats/DataRecord/interface/SiStripLorentzAngleRcd.h" 00016 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" 00017 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" 00018 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h" 00019 #include "Geometry/CommonTopologies/interface/StripTopology.h" 00020 #include "FWCore/Framework/interface/ESHandle.h" 00021 #include "FWCore/Framework/interface/Event.h" 00022 #include "FWCore/ParameterSet/interface/ParameterSet.h" 00023 #include "boost/foreach.hpp" 00024 00025 #include "CalibTracker/Records/interface/SiStripDependentRecords.h" 00026 00027 ShallowTrackClustersProducer::ShallowTrackClustersProducer(const edm::ParameterSet& iConfig) 00028 : theTracksLabel( iConfig.getParameter<edm::InputTag>("Tracks") ), 00029 theClustersLabel( iConfig.getParameter<edm::InputTag>("Clusters") ), 00030 Suffix ( iConfig.getParameter<std::string>("Suffix") ), 00031 Prefix ( iConfig.getParameter<std::string>("Prefix") ) 00032 { 00033 produces <std::vector<unsigned int> > ( Prefix + "trackmulti" + Suffix ); 00034 produces <std::vector<int> > ( Prefix + "trackindex" + Suffix ); 00035 produces <std::vector<float> > ( Prefix + "localtheta" + Suffix ); 00036 produces <std::vector<float> > ( Prefix + "localphi" + Suffix ); 00037 produces <std::vector<float> > ( Prefix + "localpitch" + Suffix ); 00038 produces <std::vector<float> > ( Prefix + "localx" + Suffix ); 00039 produces <std::vector<float> > ( Prefix + "localy" + Suffix ); 00040 produces <std::vector<float> > ( Prefix + "localz" + Suffix ); 00041 produces <std::vector<float> > ( Prefix + "strip" + Suffix ); 00042 produces <std::vector<float> > ( Prefix + "globaltheta" + Suffix ); 00043 produces <std::vector<float> > ( Prefix + "globalphi" + Suffix ); 00044 produces <std::vector<float> > ( Prefix + "globalx" + Suffix ); 00045 produces <std::vector<float> > ( Prefix + "globaly" + Suffix ); 00046 produces <std::vector<float> > ( Prefix + "globalz" + Suffix ); 00047 produces <std::vector<float> > ( Prefix + "insidistance"+ Suffix ); 00048 produces <std::vector<float> > ( Prefix + "covered" + Suffix ); 00049 produces <std::vector<float> > ( Prefix + "projwidth" + Suffix ); 00050 produces <std::vector<float> > ( Prefix + "BdotY" + Suffix ); 00051 00052 produces <std::vector<float> > ( Prefix + "rhlocalx" + Suffix ); 00053 produces <std::vector<float> > ( Prefix + "rhlocaly" + Suffix ); 00054 produces <std::vector<float> > ( Prefix + "rhlocalxerr" + Suffix ); 00055 produces <std::vector<float> > ( Prefix + "rhlocalyerr" + Suffix ); 00056 produces <std::vector<float> > ( Prefix + "rhglobalx" + Suffix ); 00057 produces <std::vector<float> > ( Prefix + "rhglobaly" + Suffix ); 00058 produces <std::vector<float> > ( Prefix + "rhglobalz" + Suffix ); 00059 produces <std::vector<float> > ( Prefix + "rhstrip" + Suffix ); 00060 produces <std::vector<float> > ( Prefix + "rhmerr" + Suffix ); 00061 00062 produces <std::vector<float> > ( Prefix + "ubstrip" + Suffix ); 00063 produces <std::vector<float> > ( Prefix + "ubmerr" + Suffix ); 00064 00065 produces <std::vector<float> > ( Prefix + "driftx" + Suffix ); 00066 produces <std::vector<float> > ( Prefix + "drifty" + Suffix ); 00067 produces <std::vector<float> > ( Prefix + "driftz" + Suffix ); 00068 produces <std::vector<float> > ( Prefix + "globalZofunitlocalY" + Suffix ); 00069 } 00070 00071 void ShallowTrackClustersProducer:: 00072 produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { 00073 shallow::CLUSTERMAP clustermap = shallow::make_cluster_map(iEvent,theClustersLabel); 00074 00075 int size = clustermap.size(); 00076 std::auto_ptr<std::vector<unsigned int> > trackmulti ( new std::vector<unsigned int>(size, 0) ); 00077 std::auto_ptr<std::vector<int> > trackindex ( new std::vector<int> (size, -1) ); 00078 std::auto_ptr<std::vector<float> > localtheta ( new std::vector<float> (size, -100) ); 00079 std::auto_ptr<std::vector<float> > localphi ( new std::vector<float> (size, -100) ); 00080 std::auto_ptr<std::vector<float> > localpitch ( new std::vector<float> (size, -100) ); 00081 std::auto_ptr<std::vector<float> > localx ( new std::vector<float> (size, -100) ); 00082 std::auto_ptr<std::vector<float> > localy ( new std::vector<float> (size, -100) ); 00083 std::auto_ptr<std::vector<float> > localz ( new std::vector<float> (size, -100) ); 00084 std::auto_ptr<std::vector<float> > strip ( new std::vector<float> (size, -100) ); 00085 std::auto_ptr<std::vector<float> > globaltheta ( new std::vector<float> (size, -100) ); 00086 std::auto_ptr<std::vector<float> > globalphi ( new std::vector<float> (size, -100) ); 00087 std::auto_ptr<std::vector<float> > globalx ( new std::vector<float> (size, -10000) ); 00088 std::auto_ptr<std::vector<float> > globaly ( new std::vector<float> (size, -10000) ); 00089 std::auto_ptr<std::vector<float> > globalz ( new std::vector<float> (size, -10000) ); 00090 std::auto_ptr<std::vector<float> > insidistance ( new std::vector<float> (size, -1) ); 00091 std::auto_ptr<std::vector<float> > projwidth ( new std::vector<float> (size, -1000) ); 00092 std::auto_ptr<std::vector<float> > BdotY ( new std::vector<float> (size, -1000) ); 00093 std::auto_ptr<std::vector<float> > covered ( new std::vector<float> (size, -1000) ); 00094 std::auto_ptr<std::vector<float> > rhlocalx ( new std::vector<float>(size, -10000 )); 00095 std::auto_ptr<std::vector<float> > rhlocaly ( new std::vector<float>(size, -10000 )); 00096 std::auto_ptr<std::vector<float> > rhlocalxerr ( new std::vector<float>(size, -1 )); 00097 std::auto_ptr<std::vector<float> > rhlocalyerr ( new std::vector<float>(size, -1 )); 00098 std::auto_ptr<std::vector<float> > rhglobalx ( new std::vector<float>(size, -10000 )); 00099 std::auto_ptr<std::vector<float> > rhglobaly ( new std::vector<float>(size, -10000 )); 00100 std::auto_ptr<std::vector<float> > rhglobalz ( new std::vector<float>(size, -10000 )); 00101 std::auto_ptr<std::vector<float> > rhstrip ( new std::vector<float>(size, -10000 )); 00102 std::auto_ptr<std::vector<float> > rhmerr ( new std::vector<float>(size, -10000 )); 00103 std::auto_ptr<std::vector<float> > ubstrip ( new std::vector<float>(size, -10000 )); 00104 std::auto_ptr<std::vector<float> > ubmerr ( new std::vector<float>(size, -10000 )); 00105 std::auto_ptr<std::vector<float> > driftx ( new std::vector<float>(size, -10000 )); 00106 std::auto_ptr<std::vector<float> > drifty ( new std::vector<float>(size, -10000 )); 00107 std::auto_ptr<std::vector<float> > driftz ( new std::vector<float>(size, -10000 )); 00108 std::auto_ptr<std::vector<float> > globalZofunitlocalY ( new std::vector<float>(size, -1000)); 00109 00110 edm::ESHandle<TrackerGeometry> theTrackerGeometry; iSetup.get<TrackerDigiGeometryRecord>().get( theTrackerGeometry ); 00111 edm::ESHandle<MagneticField> magfield; iSetup.get<IdealMagneticFieldRecord>().get(magfield); 00112 edm::ESHandle<SiStripLorentzAngle> SiStripLorentzAngle; iSetup.get<SiStripLorentzAngleDepRcd>().get(SiStripLorentzAngle); 00113 00114 edm::Handle<edm::View<reco::Track> > tracks; iEvent.getByLabel(theTracksLabel, tracks); 00115 edm::Handle<TrajTrackAssociationCollection> associations; iEvent.getByLabel(theTracksLabel, associations); 00116 00117 TrajectoryStateCombiner combiner; 00118 00119 for( TrajTrackAssociationCollection::const_iterator association = associations->begin(); 00120 association != associations->end(); association++) { 00121 const Trajectory* traj = association->key.get(); 00122 const reco::Track* track = association->val.get(); 00123 00124 BOOST_FOREACH( const TrajectoryMeasurement measurement, traj->measurements() ) { 00125 const TrajectoryStateOnSurface tsos = measurement.updatedState(); 00126 const TrajectoryStateOnSurface unbiased = combiner(measurement.forwardPredictedState(), measurement.backwardPredictedState()); 00127 00128 const TrackingRecHit* hit = measurement.recHit()->hit(); 00129 const SiStripRecHit1D* hit1D = dynamic_cast<const SiStripRecHit1D*>(hit); 00130 const SiStripRecHit2D* hit2D = dynamic_cast<const SiStripRecHit2D*>(hit); 00131 const SiStripMatchedRecHit2D* matchedhit = dynamic_cast<const SiStripMatchedRecHit2D*>(hit); 00132 00133 for(unsigned h=0; h<2; h++) { 00134 const SiStripCluster* cluster_ptr; 00135 if(!matchedhit && h==1) continue; else 00136 if( matchedhit && h==0) cluster_ptr = &matchedhit->monoCluster(); else 00137 if( matchedhit && h==1) cluster_ptr = &matchedhit->stereoCluster(); else 00138 if(hit2D) cluster_ptr = (hit2D->cluster()).get(); else 00139 if(hit1D) cluster_ptr = (hit1D->cluster()).get(); 00140 else continue; 00141 00142 shallow::CLUSTERMAP::const_iterator cluster = clustermap.find( std::make_pair( hit->geographicalId().rawId(), cluster_ptr->firstStrip() )); 00143 if(cluster == clustermap.end() ) throw cms::Exception("Logic Error") << "Cluster not found: this could be a configuration error" << std::endl; 00144 00145 unsigned i = cluster->second; 00146 if( 0 == (trackmulti->at(i))++ ) { 00147 const StripGeomDetUnit* theStripDet = dynamic_cast<const StripGeomDetUnit*>( theTrackerGeometry->idToDet( hit->geographicalId() ) ); 00148 LocalVector drift = shallow::drift( theStripDet, *magfield, *SiStripLorentzAngle); 00149 00150 trackindex->at(i) = shallow::findTrackIndex(tracks, track); 00151 localtheta->at(i) = (theStripDet->toLocal(tsos.globalDirection())).theta(); 00152 localphi->at(i) = (theStripDet->toLocal(tsos.globalDirection())).phi(); 00153 localpitch->at(i) = (theStripDet->specificTopology()).localPitch(theStripDet->toLocal(tsos.globalPosition())); 00154 localx->at(i) = (theStripDet->toLocal(tsos.globalPosition())).x(); 00155 localy->at(i) = (theStripDet->toLocal(tsos.globalPosition())).y(); 00156 localz->at(i) = (theStripDet->toLocal(tsos.globalPosition())).z(); 00157 strip->at(i) = (theStripDet->specificTopology()).strip(theStripDet->toLocal(tsos.globalPosition())); 00158 globaltheta->at(i) = tsos.globalDirection().theta(); 00159 globalphi->at(i) = tsos.globalDirection().phi(); 00160 globalx->at(i) = tsos.globalPosition().x(); 00161 globaly->at(i) = tsos.globalPosition().y(); 00162 globalz->at(i) = tsos.globalPosition().z(); 00163 insidistance->at(i) = 1./fabs(cos(localtheta->at(i))); 00164 projwidth->at(i) = tan(localtheta->at(i))*cos(localphi->at(i)); 00165 BdotY->at(i) = (theStripDet->surface()).toLocal( magfield->inTesla(theStripDet->surface().position())).y(); 00166 covered->at(i) = drift.z()/localpitch->at(i) * fabs(projwidth->at(i) - drift.x()/drift.z()); 00167 rhlocalx->at(i) = hit->localPosition().x(); 00168 rhlocaly->at(i) = hit->localPosition().y(); 00169 rhlocalxerr->at(i) = sqrt(hit->localPositionError().xx()); 00170 rhlocalyerr->at(i) = sqrt(hit->localPositionError().yy()); 00171 rhglobalx->at(i) = theStripDet->toGlobal(hit->localPosition()).x(); 00172 rhglobaly->at(i) = theStripDet->toGlobal(hit->localPosition()).y(); 00173 rhglobalz->at(i) = theStripDet->toGlobal(hit->localPosition()).z(); 00174 rhstrip->at(i) = theStripDet->specificTopology().strip(hit->localPosition()); 00175 rhmerr->at(i) = sqrt(theStripDet->specificTopology().measurementError(hit->localPosition(), hit->localPositionError()).uu()); 00176 ubstrip->at(i) = theStripDet->specificTopology().strip(unbiased.localPosition()); 00177 ubmerr->at(i) = sqrt(theStripDet->specificTopology().measurementError(unbiased.localPosition(), unbiased.localError().positionError()).uu()); 00178 driftx->at(i) = drift.x(); 00179 drifty->at(i) = drift.y(); 00180 driftz->at(i) = drift.z(); 00181 globalZofunitlocalY->at(i) = (theStripDet->toGlobal(LocalVector(0,1,0))).z(); 00182 } 00183 } 00184 } 00185 } 00186 00187 iEvent.put(trackmulti, Prefix + "trackmulti" + Suffix ); 00188 iEvent.put(trackindex, Prefix + "trackindex" + Suffix ); 00189 iEvent.put(localtheta, Prefix + "localtheta" + Suffix ); 00190 iEvent.put(localphi, Prefix + "localphi" + Suffix ); 00191 iEvent.put(localpitch, Prefix + "localpitch" + Suffix ); 00192 iEvent.put(localx, Prefix + "localx" + Suffix ); 00193 iEvent.put(localy, Prefix + "localy" + Suffix ); 00194 iEvent.put(localz, Prefix + "localz" + Suffix ); 00195 iEvent.put(strip, Prefix + "strip" + Suffix ); 00196 iEvent.put(globaltheta, Prefix + "globaltheta" + Suffix ); 00197 iEvent.put(globalphi, Prefix + "globalphi" + Suffix ); 00198 iEvent.put(globalx, Prefix + "globalx" + Suffix ); 00199 iEvent.put(globaly, Prefix + "globaly" + Suffix ); 00200 iEvent.put(globalz, Prefix + "globalz" + Suffix ); 00201 iEvent.put(insidistance,Prefix + "insidistance"+ Suffix ); 00202 iEvent.put(covered, Prefix + "covered" + Suffix ); 00203 iEvent.put(projwidth, Prefix + "projwidth" + Suffix ); 00204 iEvent.put(BdotY, Prefix + "BdotY" + Suffix ); 00205 iEvent.put(rhlocalx, Prefix + "rhlocalx" + Suffix ); 00206 iEvent.put(rhlocaly, Prefix + "rhlocaly" + Suffix ); 00207 iEvent.put(rhlocalxerr, Prefix + "rhlocalxerr" + Suffix ); 00208 iEvent.put(rhlocalyerr, Prefix + "rhlocalyerr" + Suffix ); 00209 iEvent.put(rhglobalx, Prefix + "rhglobalx" + Suffix ); 00210 iEvent.put(rhglobaly, Prefix + "rhglobaly" + Suffix ); 00211 iEvent.put(rhglobalz, Prefix + "rhglobalz" + Suffix ); 00212 iEvent.put(rhstrip, Prefix + "rhstrip" + Suffix ); 00213 iEvent.put(rhmerr, Prefix + "rhmerr" + Suffix ); 00214 iEvent.put(ubstrip, Prefix + "ubstrip" + Suffix ); 00215 iEvent.put(ubmerr, Prefix + "ubmerr" + Suffix ); 00216 iEvent.put( driftx, Prefix + "driftx" + Suffix ); 00217 iEvent.put( drifty, Prefix + "drifty" + Suffix ); 00218 iEvent.put( driftz, Prefix + "driftz" + Suffix ); 00219 iEvent.put( globalZofunitlocalY, Prefix + "globalZofunitlocalY" + Suffix ); 00220 }