48 LogDebug(
"ConversionTrackPairFinder") <<
"ConversionTrackPairFinder::run " <<
"\n";
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;
62 for( std::vector<reco::TransientTrack>::iterator iTk = outInTrk.begin(); iTk != outInTrk.end(); iTk++) {
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;
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);
94 for( std::vector<reco::TransientTrack>::iterator iTk = inOutTrk.begin(); iTk != inOutTrk.end(); iTk++) {
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;
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);
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());
150 std::vector<reco::TransientTrack > thePair(2);
151 std::vector<std::vector<reco::TransientTrack> > allPairs;
155 std::map<reco::TransientTrack, reco::CaloClusterPtr>::const_iterator iMap1;
156 std::map<reco::TransientTrack, reco::CaloClusterPtr>::const_iterator iMap2;
158 for( iMap1 = scTrkAssocMap.begin(); iMap1 != scTrkAssocMap.end(); ++iMap1) {
164 std::multimap<int, reco::TransientTrack>::const_iterator iAux;
174 if ( scTrkAssocMap.size() > 2 ){
177 for( iMap1 = scTrkAssocMap.begin(); iMap1 != scTrkAssocMap.end(); ++iMap1) {
178 for( iMap2 = iMap1; iMap2 != scTrkAssocMap.end(); ++iMap2) {
181 if ( (iMap1->second) != (iMap2->second) )
continue;
183 if ( ((iMap1->first)).
charge() * ((iMap2->first)).charge() < 0 ) {
192 thePair.push_back( iMap1->first );
193 thePair.push_back( iMap2->first );
194 allPairs.push_back ( thePair );
195 allPairSCAss[thePair]= iMap1->second;
203 if ( allPairSCAss.size() == 0) {
206 for( iMap1 = scTrkAssocMap.begin(); iMap1 != scTrkAssocMap.end(); ++iMap1) {
209 thePair.push_back(iMap1->first);
210 allPairs.push_back ( thePair );
211 allPairSCAss[thePair]= iMap1->second;
221 }
else if ( (scTrkAssocMap.size() ==2) ) {
223 iMap1=scTrkAssocMap.begin();
226 if ( (iMap1->second) == (iMap2->second) ) {
227 if ( (iMap1->first).charge() * (iMap2->first).
charge() < 0 ) {
240 thePair.push_back( iMap1->first );
241 thePair.push_back( iMap2->first );
242 allPairs.push_back ( thePair );
244 allPairSCAss[thePair]= iMap1->second;
249 if ( ((iMap1->first)).recHitsSize() > ((iMap2->first)).recHitsSize() ) {
251 thePair.push_back(iMap1->first);
252 allPairs.push_back ( thePair );
253 allPairSCAss[thePair]= iMap1->second;
256 thePair.push_back(iMap2->first);
257 allPairs.push_back ( thePair );
258 allPairSCAss[thePair]= iMap2->second;
264 }
else if (scTrkAssocMap.size() ==1 ) {
277 iMap1=scTrkAssocMap.begin();
281 thePair.push_back(iMap1->first);
282 allPairs.push_back ( thePair );
283 allPairSCAss[thePair]= iMap1->second;
291 allPairSCAss.clear();
297 for( iMap1 = scTrkAssocMap.begin(); iMap1 != scTrkAssocMap.end(); ++iMap1) {
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++;
307 for( iAux = auxMap.begin(); iAux!= auxMap.end(); ++iAux) {
308 if ( (iMap1->first) == (iAux->second) && iList==0 ) {
310 thePair.push_back(iAux->second);
311 allPairSCAss[thePair]= iMap1->second;
325 for (
std::map<std::vector<reco::TransientTrack>,
reco::CaloClusterPtr>::const_iterator iPair= allPairSCAss.begin(); iPair!= allPairSCAss.end(); ++iPair ) {
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]);
332 thePair.push_back((iPair->first)[1]);
333 thePair.push_back((iPair->first)[0]);
336 thePair.push_back((iPair->first)[0]);
339 allPairOrdInPtSCAss[thePair]=iPair->second;
355 return allPairOrdInPtSCAss;
TrackRef persistentTrackRef() const