Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "RecoMuon/TrackingTools/interface/SegmentsTrackAssociator.h"
00013
00014 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00015 #include "DataFormats/TrackReco/interface/Track.h"
00016 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
00017 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
00018 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
00019 #include "DataFormats/DetId/interface/DetId.h"
00020 #include "DataFormats/Common/interface/getRef.h"
00021 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00022 #include "DataFormats/DTRecHit/interface/DTRecSegment4D.h"
00023 #include "DataFormats/TrackingRecHit/interface/RecSegment.h"
00024
00025 #include "DataFormats/DTRecHit/interface/DTRecSegment4DCollection.h"
00026 #include "DataFormats/CSCRecHit/interface/CSCSegmentCollection.h"
00027 #include "DataFormats/RPCRecHit/interface/RPCRecHitCollection.h"
00028 #include "DataFormats/DTRecHit/interface/DTRecHitCollection.h"
00029 #include "DataFormats/CSCRecHit/interface/CSCRecHit2DCollection.h"
00030
00031 #include "MagneticField/Engine/interface/MagneticField.h"
00032 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00033 #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
00034 #include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
00035 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00036
00037 #include <vector>
00038
00039 using namespace edm;
00040 using namespace std;
00041
00042
00043
00044 SegmentsTrackAssociator::SegmentsTrackAssociator(const ParameterSet& iConfig)
00045 {
00046 theDTSegmentLabel = iConfig.getUntrackedParameter<InputTag>("segmentsDt");
00047 theCSCSegmentLabel = iConfig.getUntrackedParameter<InputTag>("segmentsCSC");
00048 theSegmentContainerName = iConfig.getUntrackedParameter<InputTag>("SelectedSegments");
00049
00050 numRecHit=0;
00051 numRecHitDT=0;
00052 numRecHitCSC=0;
00053 metname = "SegmentsTrackAssociator";
00054 }
00055
00056
00057 SegmentsTrackAssociator::~SegmentsTrackAssociator() {}
00058
00059
00060 MuonTransientTrackingRecHit::MuonRecHitContainer SegmentsTrackAssociator::associate(const Event& iEvent, const EventSetup& iSetup, const reco::Track& Track){
00061
00062
00063 Handle<DTRecSegment4DCollection> dtSegments;
00064 iEvent.getByLabel(theDTSegmentLabel, dtSegments);
00065 Handle<CSCSegmentCollection> cscSegments;
00066 iEvent.getByLabel(theCSCSegmentLabel, cscSegments);
00067 ESHandle<GlobalTrackingGeometry> theTrackingGeometry;
00068 iSetup.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry);
00069
00070
00071 DTRecSegment4DCollection::const_iterator segment;
00072 CSCSegmentCollection::const_iterator segment2;
00073 MuonTransientTrackingRecHit::MuonRecHitContainer selectedSegments;
00074 MuonTransientTrackingRecHit::MuonRecHitContainer selectedDtSegments;
00075 MuonTransientTrackingRecHit::MuonRecHitContainer selectedCscSegments;
00076
00077
00078 for(trackingRecHit_iterator recHit = Track.recHitsBegin(); recHit != Track.recHitsEnd(); ++recHit){
00079
00080 if(!(*recHit)->isValid()) continue;
00081
00082
00083 numRecHit++;
00084
00085
00086 DetId idRivHit = (*recHit)->geographicalId();
00087
00088
00089
00090 if (idRivHit.det() == DetId::Muon && idRivHit.subdetId() == MuonSubdetId::DT ) {
00091
00092
00093 LocalPoint posTrackRecHit = (*recHit)->localPosition();
00094
00095 DTRecSegment4DCollection::range range;
00096 numRecHitDT++;
00097
00098
00099 DTChamberId chamberId(idRivHit.rawId());
00100
00101 range = dtSegments->get(chamberId);
00102
00103
00104 for (segment = range.first; segment!=range.second; segment++){
00105
00106 DetId id = segment->geographicalId();
00107 const GeomDet* det = theTrackingGeometry->idToDet(id);
00108 vector<const TrackingRecHit*> segments2D = (&(*segment))->recHits();
00109
00110 vector <const TrackingRecHit*> dtRecHits;
00111
00112 for(vector<const TrackingRecHit*>::const_iterator segm2D = segments2D.begin();
00113 segm2D != segments2D.end();
00114 segm2D++) {
00115
00116 vector <const TrackingRecHit*> rHits1D = (*segm2D)->recHits();
00117 for (int hit=0; hit<int(rHits1D.size()); hit++){
00118 dtRecHits.push_back(rHits1D[hit]);
00119 }
00120
00121 }
00122
00123
00124 for (unsigned int hit = 0; hit < dtRecHits.size(); hit++) {
00125
00126 DetId idRivHitSeg = (*dtRecHits[hit]).geographicalId();
00127 LocalPoint posDTSegment= segment->localPosition();
00128 LocalPoint posSegDTRecHit = (*dtRecHits[hit]).localPosition();
00129
00130 double rDT=sqrt(pow((posSegDTRecHit.x()-posTrackRecHit.x()),2) +pow((posSegDTRecHit.y()-posTrackRecHit.y()),2) + pow((posSegDTRecHit.z()-posTrackRecHit.z()),2));
00131
00132 if (idRivHit == idRivHitSeg && rDT<0.0001){
00133
00134 if (selectedDtSegments.empty()){
00135 selectedDtSegments.push_back(MuonTransientTrackingRecHit::specificBuild(det,&*segment));
00136 LogTrace(metname) <<"First selected segment (from DT). Position : "<<posDTSegment<<" Chamber : "<<segment->chamberId();
00137 }
00138 else{
00139 int check=0;
00140 for(int segm=0; segm < int(selectedDtSegments.size()); ++segm) {
00141 double dist=sqrt(pow((((*(selectedDtSegments[segm])).localPosition()).x()-posDTSegment.x()),2) +pow((((*(selectedDtSegments[segm])).localPosition()).y()-posDTSegment.y()),2) + pow((((*(selectedDtSegments[segm])).localPosition()).z()-posDTSegment.z()),2));
00142 if(dist>30) check++;
00143 }
00144
00145 if(check==int(selectedDtSegments.size())){
00146 selectedDtSegments.push_back(MuonTransientTrackingRecHit::specificBuild(det,&*segment));
00147 LogTrace(metname) <<"New DT selected segment. Position : "<<posDTSegment<<" Chamber : "<<segment->chamberId();
00148 }
00149 }
00150 }
00151
00152 }
00153
00154 }
00155 }
00156
00157
00158
00159 if (idRivHit.det() == DetId::Muon && idRivHit.subdetId() == MuonSubdetId::CSC ) {
00160
00161
00162 LocalPoint posTrackRecHit = (*recHit)->localPosition();
00163
00164 CSCSegmentCollection::range range;
00165 numRecHitCSC++;
00166
00167
00168 CSCDetId tempchamberId(idRivHit.rawId());
00169
00170 int ring = tempchamberId.ring();
00171 int station = tempchamberId.station();
00172 int endcap = tempchamberId.endcap();
00173 int chamber = tempchamberId.chamber();
00174 CSCDetId chamberId(endcap, station, ring, chamber, 0);
00175
00176
00177 range = cscSegments->get(chamberId);
00178
00179 for(segment2 = range.first; segment2!=range.second; segment2++){
00180
00181 DetId id2 = segment2->geographicalId();
00182 const GeomDet* det2 = theTrackingGeometry->idToDet(id2);
00183
00184
00185 vector<const TrackingRecHit*> cscRecHits = (&(*segment2))->recHits();
00186
00187
00188 for (unsigned int hit = 0; hit < cscRecHits.size(); hit++) {
00189
00190 DetId idRivHitSeg = (*cscRecHits[hit]).geographicalId();
00191 LocalPoint posSegCSCRecHit = (*cscRecHits[hit]).localPosition();
00192 LocalPoint posCSCSegment= segment2->localPosition();
00193
00194 double rCSC=sqrt(pow((posSegCSCRecHit.x()-posTrackRecHit.x()),2) +pow((posSegCSCRecHit.y()-posTrackRecHit.y()),2) + pow((posSegCSCRecHit.z()-posTrackRecHit.z()),2));
00195
00196 if (idRivHit==idRivHitSeg && rCSC < 0.0001){
00197
00198 if (selectedCscSegments.empty()){
00199 selectedCscSegments.push_back(MuonTransientTrackingRecHit::specificBuild(det2,&*segment2));
00200 LogTrace(metname) <<"First selected segment (from CSC). Position: "<<posCSCSegment;
00201 }
00202 else{
00203 int check=0;
00204 for(int n=0; n< int(selectedCscSegments.size()); n++){
00205 double dist = sqrt(pow(((*(selectedCscSegments[n])).localPosition().x()-posCSCSegment.x()),2) +pow(((*(selectedCscSegments[n])).localPosition().y()-posCSCSegment.y()),2) + pow(((*(selectedCscSegments[n])).localPosition().z()-posCSCSegment.z()),2));
00206 if(dist>30) check++;
00207 }
00208 if(check==int(selectedCscSegments.size())){
00209 selectedCscSegments.push_back(MuonTransientTrackingRecHit::specificBuild(det2,&*segment2));
00210 LogTrace(metname) <<"New CSC segment selected. Position : "<<posCSCSegment;
00211 }
00212 }
00213
00214 }
00215
00216 }
00217
00218 }
00219 }
00220
00221 }
00222
00223 LogTrace(metname) <<"N recHit:"<<numRecHit;
00224 numRecHit=0;
00225 LogTrace(metname) <<"N recHit DT:"<<numRecHitDT;
00226 numRecHitDT=0;
00227 LogTrace(metname) <<"N recHit CSC:"<<numRecHitCSC;
00228 numRecHitCSC=0;
00229
00230 copy(selectedDtSegments.begin(), selectedDtSegments.end(), back_inserter(selectedSegments));
00231 LogTrace(metname) <<"N selected Dt segments:"<<selectedDtSegments.size();
00232 copy(selectedCscSegments.begin(), selectedCscSegments.end(), back_inserter(selectedSegments));
00233 LogTrace(metname) <<"N selected Csc segments:"<<selectedCscSegments.size();
00234 LogTrace(metname) <<"N selected segments:"<<selectedSegments.size();
00235
00236 return selectedSegments;
00237
00238 }