CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Classes | Public Member Functions
ConversionTrackPairFinder Class Reference

#include <ConversionTrackPairFinder.h>

Classes

class  ByNumOfHits
 

Public Member Functions

 ConversionTrackPairFinder ()
 
std::map< std::vector
< reco::TransientTrack >
, reco::CaloClusterPtr
run (std::vector< reco::TransientTrack > outIn, const edm::Handle< reco::TrackCollection > &outInTrkHandle, const edm::Handle< reco::TrackCaloClusterPtrAssociation > &outInTrackSCAssH, std::vector< reco::TransientTrack > inOut, const edm::Handle< reco::TrackCollection > &inOutTrkHandle, const edm::Handle< reco::TrackCaloClusterPtrAssociation > &inOutTrackSCAssH)
 
 ~ConversionTrackPairFinder ()
 

Detailed Description

Author
N. Marinelli - Univ. of Notre Dame
Version

Definition at line 33 of file ConversionTrackPairFinder.h.

Constructor & Destructor Documentation

ConversionTrackPairFinder::ConversionTrackPairFinder ( )

Definition at line 24 of file ConversionTrackPairFinder.cc.

References LogDebug.

24  {
25 
26  LogDebug("ConversionTrackPairFinder") << " CTOR " << "\n";
27 
28 }
#define LogDebug(id)
ConversionTrackPairFinder::~ConversionTrackPairFinder ( )

Definition at line 30 of file ConversionTrackPairFinder.cc.

References LogDebug.

30  {
31 
32  LogDebug("ConversionTrackPairFinder") << " DTOR " << "\n";
33 
34 }
#define LogDebug(id)

Member Function Documentation

std::map< std::vector< reco::TransientTrack >, reco::CaloClusterPtr > ConversionTrackPairFinder::run ( std::vector< reco::TransientTrack outIn,
const edm::Handle< reco::TrackCollection > &  outInTrkHandle,
const edm::Handle< reco::TrackCaloClusterPtrAssociation > &  outInTrackSCAssH,
std::vector< reco::TransientTrack inOut,
const edm::Handle< reco::TrackCollection > &  inOutTrkHandle,
const edm::Handle< reco::TrackCaloClusterPtrAssociation > &  inOutTrackSCAssH 
)

ONly one track in input to the finder

all cases above failed and some track-SC association is still missing

Definition at line 39 of file ConversionTrackPairFinder.cc.

References DeDxDiscriminatorTools::charge(), LogDebug, python.multivaluedict::map(), reco::TrackTransientTrack::persistentTrackRef(), and mathSSE::sqrt().

Referenced by ConvertedPhotonProducer::produce().

45 {
46 
47 
48  LogDebug("ConversionTrackPairFinder") << "ConversionTrackPairFinder::run " << "\n";
49 
50  std::vector<reco::TransientTrack> selectedOutInTk;
51  std::vector<reco::TransientTrack> selectedInOutTk;
52  std::vector<reco::TransientTrack> allSelectedTk;
53  std::map<reco::TransientTrack, reco::CaloClusterPtr> scTrkAssocMap;
54  std::multimap<int,reco::TransientTrack,std::greater<int> > auxMap;
55 
56  bool oneLeg=false;
57  bool noTrack=false;
58 
59 
60 
61  int iTrk=0;
62  for( std::vector<reco::TransientTrack>::iterator iTk = outInTrk.begin(); iTk != outInTrk.end(); iTk++) {
63  edm::Ref<reco::TrackCollection> trackRef(outInTrkHandle, iTrk );
64  iTrk++;
65 
66  if ( iTk->numberOfValidHits() <3 || iTk->normalizedChi2() > 5000 ) continue;
67  if ( fabs(iTk->impactPointState().globalPosition().x()) > 110 ||
68  fabs(iTk->impactPointState().globalPosition().y()) > 110 ||
69  fabs(iTk->impactPointState().globalPosition().z()) > 280 ) continue;
70 
71  // std::cout << " Out In Track charge " << iTk->charge() << " Num of RecHits " << iTk->recHitsSize() << " inner pt " << sqrt(iTk->track().innerMomentum().perp2()) << "\n";
72  const reco::TrackTransientTrack* ttt = dynamic_cast<const reco::TrackTransientTrack*>(iTk->basicTransientTrack());
73  reco::TrackRef myTkRef= ttt->persistentTrackRef();
74  //std::cout << " ConversionTrackPairFinder persistent track ref hits " << myTkRef->recHitsSize() << " inner pt " << sqrt(iTk->track().innerMomentum().perp2()) << "\n";
75  // std::cout << " ConversionTrackPairFinder track from handle hits " << trackRef->recHitsSize() << " inner pt " << sqrt(iTk->track().innerMomentum().perp2()) << "\n";
76 
77  const reco::CaloClusterPtr aClus = (*outInTrackSCAssH)[trackRef];
78 
79  // std::cout << "ConversionTrackPairFinder Reading the OutIn Map " << *outInTrackSCAss[trackRef] << " " << &outInTrackSCAss[trackRef] << std::endl;
80  // std::cout << "ConversionTrackPairFinder Out In track belonging to SC with energy " << aClus->energy() << "\n";
81 
82  int nHits=iTk->recHitsSize();
83  scTrkAssocMap[*iTk]= aClus;
84  auxMap.insert(std::pair<int,reco::TransientTrack >(nHits,(*iTk)) );
85  selectedOutInTk.push_back(*iTk);
86  allSelectedTk.push_back(*iTk);
87 
88 
89 
90  }
91 
92 
93  iTrk=0;
94  for( std::vector<reco::TransientTrack>::iterator iTk = inOutTrk.begin(); iTk != inOutTrk.end(); iTk++) {
95  edm::Ref<reco::TrackCollection> trackRef(inOutTrkHandle, iTrk );
96  iTrk++;
97 
98  if ( iTk->numberOfValidHits() <3 || iTk->normalizedChi2() >5000 ) continue;
99  if ( fabs(iTk->impactPointState().globalPosition().x()) > 110 ||
100  fabs(iTk->impactPointState().globalPosition().y()) > 110 ||
101  fabs(iTk->impactPointState().globalPosition().z()) > 280 ) continue;
102 
103  // std::cout << " In Out Track charge " << iTk->charge() << " Num of RecHits " << iTk->recHitsSize() << " inner pt " << sqrt(iTk->track().innerMomentum().perp2()) << "\n";
104  const reco::TrackTransientTrack* ttt = dynamic_cast<const reco::TrackTransientTrack*>(iTk->basicTransientTrack());
105  reco::TrackRef myTkRef= ttt->persistentTrackRef();
106  // std::cout << " ConversionTrackPairFinder persistent track ref hits " << myTkRef->recHitsSize() << " inner pt " << sqrt(iTk->track().innerMomentum().perp2()) << "\n";
107  // std::cout << " ConversionTrackPairFinder track from handle hits " << trackRef->recHitsSize() << " inner pt " << sqrt(iTk->track().innerMomentum().perp2()) << "\n";
108 
109  const reco::CaloClusterPtr aClus = (*inOutTrackSCAssH)[trackRef];
110 
111  // std::cout << "ConversionTrackPairFinder Filling the InOut Map " << &(*inOutTrackSCAss[trackRef]) << " " << &inOutTrackSCAss[trackRef] << std::endl;
112  // std::cout << "ConversionTrackPairFinder In Out track belonging to SC with energy " << aClus.energy() << "\n";
113 
114  scTrkAssocMap[*iTk]= aClus;
115  int nHits=iTk->recHitsSize();
116  auxMap.insert(std::pair<int,reco::TransientTrack >(nHits,(*iTk)) );
117  selectedInOutTk.push_back(*iTk);
118  allSelectedTk.push_back(*iTk);
119 
120 
121 
122  }
123 
124 
125  // std::cout << " ConversionTrackPairFinder allSelectedTk size " << allSelectedTk.size() << " scTrkAssocMap size " << scTrkAssocMap.size() << "\n";
126 
127  // Sort tracks in decreasing number of hits
128  if(selectedOutInTk.size() > 0)
129  std::stable_sort(selectedOutInTk.begin(), selectedOutInTk.end(), ByNumOfHits());
130  if(selectedInOutTk.size() > 0)
131  std::stable_sort(selectedInOutTk.begin(), selectedInOutTk.end(), ByNumOfHits());
132  if(allSelectedTk.size() > 0)
133  std::stable_sort(allSelectedTk.begin(), allSelectedTk.end(), ByNumOfHits());
134 
135 
136 
137  // for( std::vector<reco::TransientTrack>::const_iterator iTk = selectedOutInTk.begin(); iTk != selectedOutInTk.end(); iTk++) {
138  // std::cout << " Selected Out In Tracks charge " << iTk->charge() << " Num of RecHits " << iTk->recHitsSize() << " inner momentum " << iTk->track().innerMomentum() << "\n";
139  //}
140  // for( std::vector<reco::TransientTrack>::const_iterator iTk = selectedInOutTk.begin(); iTk != selectedInOutTk.end(); iTk++) {
141  // std::cout << " Selected In Out Tracks charge " << iTk->charge() << " Num of RecHits " << iTk->recHitsSize() << " inner momentum " << iTk->track().innerMomentum() << "\n";
142  // }
143  // for( std::vector<reco::TransientTrack>::const_iterator iTk = allSelectedTk.begin(); iTk != allSelectedTk.end(); iTk++) {
144  // std::cout << " All Selected Tracks charge " << iTk->charge() << " Num of RecHits " << iTk->recHitsSize() << " chi2 " << iTk->normalizedChi2() << " pt " << sqrt(iTk->track().innerMomentum().perp2()) << "\n";
145  //}
146 
147 
148 
149 
150  std::vector<reco::TransientTrack > thePair(2);
151  std::vector<std::vector<reco::TransientTrack> > allPairs;
152  std::map<std::vector<reco::TransientTrack>, reco::CaloClusterPtr > allPairSCAss;
153  std::map<std::vector<reco::TransientTrack>, reco::CaloClusterPtr > allPairOrdInPtSCAss;
154 
155  std::map<reco::TransientTrack, reco::CaloClusterPtr>::const_iterator iMap1;
156  std::map<reco::TransientTrack, reco::CaloClusterPtr>::const_iterator iMap2;
157 
158  for( iMap1 = scTrkAssocMap.begin(); iMap1 != scTrkAssocMap.end(); ++iMap1) {
159 
160  // std::cout << " Ass map track charge " << (iMap1->first).charge() <<" pt " << sqrt(((iMap1->first)).track().innerMomentum().Perp2()) << " SC E " << (iMap1->second)->energy() << " SC eta " << (iMap1->second)->eta() << " SC phi " << (iMap1->second)->phi() << std::endl;
161  }
162 
163 
164  std::multimap<int, reco::TransientTrack>::const_iterator iAux;
165 
166 
167  // for( iAux = auxMap.begin(); iAux!= auxMap.end(); ++iAux) {
168  // // std::cout << " Aux Map " << (iAux->first) <<" pt " << sqrt(((iAux->second)).track().innerMomentum().Perp2()) << std::endl;
169  // for( iMap1 = scTrkAssocMap.begin(); iMap1 != scTrkAssocMap.end(); ++iMap1) {
170  // if ( (iMap1->first) == (iAux->second) ) std::cout << " ass SC " << (iMap1->second)->energy() << std::endl;
171  // }
172  // }
173 
174  if ( scTrkAssocMap.size() > 2 ){
175 
176 
177  for( iMap1 = scTrkAssocMap.begin(); iMap1 != scTrkAssocMap.end(); ++iMap1) {
178  for( iMap2 = iMap1; iMap2 != scTrkAssocMap.end(); ++iMap2) {
179  // consider only tracks associated to the same SC
180 
181  if ( (iMap1->second) != (iMap2->second) ) continue;
182 
183  if ( ((iMap1->first)).charge() * ((iMap2->first)).charge() < 0 ) {
184 
185  // std::cout << " ConversionTrackPairFinde All selected from the map First Track charge " << (iMap1->first).charge() << " Num of RecHits " << ((iMap1->first)).recHitsSize() << " inner pt " << sqrt(((iMap1->first)).track().innerMomentum().Perp2()) << " Ass SC " << (iMap1->second)->energy() << "\n";
186 
187  // std::cout << " ConversionTrackPairFinde All selected from the map Second Track charge " << ((iMap2->first)).charge() << " Num of RecHits " << ((iMap2->first)).recHitsSize() << " inner pt " << sqrt(((iMap2->first)).track().innerMomentum().Perp2()) << " Ass SC " << (iMap2->second)->energy() << "\n";
188 
189 
190 
191  thePair.clear();
192  thePair.push_back( iMap1->first );
193  thePair.push_back( iMap2->first );
194  allPairs.push_back ( thePair );
195  allPairSCAss[thePair]= iMap1->second;
196 
197  }
198  }
199  }
200 
201  // std::cout << " ConversionTrackPairFinder INTERMIDIATE allPairSCAss size " << allPairSCAss.size() << "\n";
202 
203  if ( allPairSCAss.size() == 0) {
204  // std::cout << " All Tracks had the same charge: Need to send out a single track " << "\n";
205 
206  for( iMap1 = scTrkAssocMap.begin(); iMap1 != scTrkAssocMap.end(); ++iMap1) {
207 
208  thePair.clear();
209  thePair.push_back(iMap1->first);
210  allPairs.push_back ( thePair );
211  allPairSCAss[thePair]= iMap1->second;
212 
213  }
214 
215  }
216 
217 
218 
219 
220 
221  } else if ( (scTrkAssocMap.size() ==2) ) {
222 
223  iMap1=scTrkAssocMap.begin();//get the first
224  iMap2=iMap1;
225  iMap2++;//get the second
226  if ( (iMap1->second) == (iMap2->second) ) {
227  if ( (iMap1->first).charge() * (iMap2->first).charge() < 0 ) {
228 
229  // std::cout << " ConversionTrackPairFinder Case when (scTrkAssocMap.size() ==2) " << (iMap1->first).charge() << std::endl;
230  //std::cout << " Num of RecHits " << ((iMap1->first)).recHitsSize() << std::endl;
231  // std::cout << " inner pt " << sqrt(((iMap1->first)).track().innerMomentum().Perp2()) << std::endl;
232  //std::cout << " Ass SC " << (iMap1->second)->energy() << "\n";
233 
234  // std::cout << " ConversionTrackPairFinder Case when (scTrkAssocMap.size() ==2) " << (iMap2->first).charge() << std::endl;
235  // std::cout << " Num of RecHits " << ((iMap2->first)).recHitsSize() << std::endl;
236  //std::cout << " inner pt " << sqrt(((iMap2->first)).track().innerMomentum().Perp2()) << std::endl;
237  //std::cout << " Ass SC " << (iMap2->second)->energy() << "\n";
238 
239  thePair.clear();
240  thePair.push_back( iMap1->first );
241  thePair.push_back( iMap2->first );
242  allPairs.push_back ( thePair );
243 
244  allPairSCAss[thePair]= iMap1->second;
245 
246 
247  } else {
248  //std::cout << " ConversionTrackPairFinder oneLeg case when 2 tracks with same sign Pick up the longest one" << std::endl;
249  if ( ((iMap1->first)).recHitsSize() > ((iMap2->first)).recHitsSize() ) {
250  thePair.clear();
251  thePair.push_back(iMap1->first);
252  allPairs.push_back ( thePair );
253  allPairSCAss[thePair]= iMap1->second;
254  } else {
255  thePair.clear();
256  thePair.push_back(iMap2->first);
257  allPairs.push_back ( thePair );
258  allPairSCAss[thePair]= iMap2->second;
259  }
260  }
261 
262  }
263 
264  } else if (scTrkAssocMap.size() ==1 ) {
265  // std::cout << " ConversionTrackPairFinder oneLeg case when 1 track only " << std::endl;
266  oneLeg=true;
267  } else {
268  noTrack=true;
269  }
270 
271 
272  if ( oneLeg ) {
273  thePair.clear();
274  // std::cout << " ConversionTrackPairFinder oneLeg case charge " << std::endl;
275 
276 
277  iMap1=scTrkAssocMap.begin();
278 
279  //std::cout << " ConversionTrackPairFinder oneLeg case charge " << (iMap1->first).charge() << " Num of RecHits " << ((iMap1->first)).recHitsSize() << " inner pt " << sqrt(((iMap1->first)).track().innerMomentum().Perp2()) << " Ass SC " << (iMap1->second)->energy() << "\n";
280 
281  thePair.push_back(iMap1->first);
282  allPairs.push_back ( thePair );
283  allPairSCAss[thePair]= iMap1->second;
284 
285  // std::cout << " WARNING ConversionTrackPairFinder::tracks The candidate has just one leg. Need to find another way to evaltuate the vertex !!! " << "\n";
286  }
287 
288  if ( noTrack) {
289  // std::cout << " WARNING ConversionTrackPairFinder::tracks case noTrack " << "\n";
290  thePair.clear();
291  allPairSCAss.clear();
292  }
293 
294 
295 
297  for( iMap1 = scTrkAssocMap.begin(); iMap1 != scTrkAssocMap.end(); ++iMap1) {
298 
299  int nFound=0;
300  for ( std::map<std::vector<reco::TransientTrack>, reco::CaloClusterPtr>::const_iterator iPair= allPairSCAss.begin(); iPair!= allPairSCAss.end(); ++iPair ) {
301  if ( (iMap1->second) == (iPair->second) ) nFound++;
302  }
303 
304  if ( nFound == 0) {
305  // std::cout << " nFound zero case " << std::endl;
306  int iList=0;
307  for( iAux = auxMap.begin(); iAux!= auxMap.end(); ++iAux) {
308  if ( (iMap1->first) == (iAux->second) && iList==0 ) {
309  thePair.clear();
310  thePair.push_back(iAux->second);
311  allPairSCAss[thePair]= iMap1->second;
312 
313  }
314 
315  iList++;
316  }
317  }
318 
319  }
320 
321 
322 
323 
324  // order the tracks in the pair in order of decreasing pt
325  for ( std::map<std::vector<reco::TransientTrack>, reco::CaloClusterPtr>::const_iterator iPair= allPairSCAss.begin(); iPair!= allPairSCAss.end(); ++iPair ) {
326  thePair.clear();
327  if ( (iPair->first).size() ==2 ) {
328  if ( sqrt((iPair->first)[0].track().innerMomentum().perp2()) > sqrt((iPair->first)[1].track().innerMomentum().perp2()) ) {
329  thePair.push_back((iPair->first)[0]);
330  thePair.push_back((iPair->first)[1]);
331  } else {
332  thePair.push_back((iPair->first)[1]);
333  thePair.push_back((iPair->first)[0]);
334  }
335  } else {
336  thePair.push_back((iPair->first)[0]);
337  }
338 
339  allPairOrdInPtSCAss[thePair]=iPair->second;
340  }
341 
342 
343  // std::cout << " ConversionTrackPairFinder FINAL allPairOrdInPtSCAss size " << allPairOrdInPtSCAss.size() << "\n";
344  // for ( std::map<std::vector<reco::TransientTrack>, reco::CaloClusterPtr>::const_iterator iPair= allPairOrdInPtSCAss.begin(); iPair!= allPairOrdInPtSCAss.end(); ++iPair ) {
345  // std::cout << " ConversionTrackPairFindder FINAL allPairOrdInPtSCAss " << (iPair->first).size() << " SC Energy " << (iPair->second)->energy() << " eta " << (iPair->second)->eta() << " phi " << (iPair->second)->phi() << "\n";
346  // std::cout << " ConversionTrackPairFindder FINAL allPairOrdInPtSCAss (iPair->first).size() " << (iPair->first).size() << std::endl;
347 
348  // for ( std::vector<reco::TransientTrack>::const_iterator iTk=(iPair->first).begin(); iTk!= (iPair->first).end(); ++iTk) {
349  // std::cout << " ConversionTrackPair ordered track pt " << sqrt(iTk->track().innerMomentum().perp2()) << std::endl;
350  // }
351  //}
352 
353 
354 
355  return allPairOrdInPtSCAss;
356 
357 
358 }
#define LogDebug(id)
double charge(const std::vector< uint8_t > &Ampls)
TrackRef persistentTrackRef() const
T sqrt(T t)
Definition: SSEVec.h:28