CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EgAmbiguityTools.cc
Go to the documentation of this file.
3 
9 //#include "RecoEgamma/EgammaElectronAlgos/interface/ElectronHcalHelper.h"
10 
24 
30 
37 
39 
41 
44 
47 
50 
53 
54 #include "CLHEP/Units/GlobalPhysicalConstants.h"
55 #include <TMath.h>
56 #include <Math/VectorUtil.h>
57 #include <Math/Point3D.h>
58 #include <sstream>
59 #include <algorithm>
60 
61 using namespace edm ;
62 using namespace std ;
63 using namespace reco ;
64 
65 namespace EgAmbiguityTools
66  {
67 
68 bool isBetter( const reco::GsfElectron * e1, const reco::GsfElectron * e2 )
69  { return (std::abs(e1->eSuperClusterOverP()-1)<std::abs(e2->eSuperClusterOverP()-1)) ; }
70 
72  ( const reco::GsfElectron * e1, const reco::GsfElectron * e2 )
73  {
74  reco::HitPattern gsfHitPattern1 = e1->gsfTrack()->hitPattern() ;
75  reco::HitPattern gsfHitPattern2 = e2->gsfTrack()->hitPattern() ;
76 
77  // retreive first valid hit
78  int gsfHitCounter1 = 0 ;
79  trackingRecHit_iterator elHitsIt1 ;
80  for
81  ( elHitsIt1 = e1->gsfTrack()->recHitsBegin() ;
82  elHitsIt1 != e1->gsfTrack()->recHitsEnd() ;
83  elHitsIt1++, gsfHitCounter1++ )
84  { if (((**elHitsIt1).isValid())) break ; }
85 
86  int gsfHitCounter2 = 0 ;
87  trackingRecHit_iterator elHitsIt2 ;
88  for
89  ( elHitsIt2 = e2->gsfTrack()->recHitsBegin() ;
90  elHitsIt2 != e2->gsfTrack()->recHitsEnd() ;
91  elHitsIt2++, gsfHitCounter2++ )
92  { if (((**elHitsIt2).isValid())) break ; }
93 
94  uint32_t gsfHit1 = gsfHitPattern1.getHitPattern(gsfHitCounter1) ;
95  uint32_t gsfHit2 = gsfHitPattern2.getHitPattern(gsfHitCounter2) ;
96  if (gsfHitPattern1.getSubStructure(gsfHit1)!=gsfHitPattern2.getSubStructure(gsfHit2))
97  { return (gsfHitPattern1.getSubStructure(gsfHit1)<gsfHitPattern2.getSubStructure(gsfHit2)) ; }
98  else if (gsfHitPattern1.getLayer(gsfHit1)!=gsfHitPattern2.getLayer(gsfHit2))
99  { return (gsfHitPattern1.getLayer(gsfHit1)<gsfHitPattern2.getLayer(gsfHit2)) ; }
100  else
101  { return isBetter(e1,e2) ; }
102  }
103 
104 int sharedHits( const GsfTrackRef & gsfTrackRef1, const GsfTrackRef & gsfTrackRef2 )
105  {
106  //get the Hit Pattern for the gsfTracks
107  const HitPattern & gsfHitPattern1 = gsfTrackRef1->hitPattern() ;
108  const HitPattern & gsfHitPattern2 = gsfTrackRef2->hitPattern() ;
109 
110  unsigned int shared = 0;
111 
112  int gsfHitCounter1 = 0;
113  for(trackingRecHit_iterator elHitsIt1 = gsfTrackRef1->recHitsBegin();
114  elHitsIt1 != gsfTrackRef1->recHitsEnd(); elHitsIt1++, gsfHitCounter1++) {
115  if(!((**elHitsIt1).isValid())) //count only valid Hits
116  continue;
117  //if (gsfHitCounter1>1) continue; // test only the first hit of the track 1
118  uint32_t gsfHit = gsfHitPattern1.getHitPattern(gsfHitCounter1);
119  if(!(gsfHitPattern1.pixelHitFilter(gsfHit)
120  || gsfHitPattern1.stripTIBHitFilter(gsfHit)
121  || gsfHitPattern1.stripTOBHitFilter(gsfHit)
122  || gsfHitPattern1.stripTECHitFilter(gsfHit)
123  || gsfHitPattern1.stripTIDHitFilter(gsfHit) )
124  ) continue;
125  int gsfHitsCounter2 = 0;
126  for(trackingRecHit_iterator gsfHitsIt2 = gsfTrackRef2->recHitsBegin();
127  gsfHitsIt2 != gsfTrackRef2->recHitsEnd(); gsfHitsIt2++, gsfHitsCounter2++) {
128  if(!((**gsfHitsIt2).isValid())) //count only valid Hits!
129  continue;
130 
131  uint32_t gsfHit2 = gsfHitPattern2.getHitPattern(gsfHitsCounter2);
132  if(!(gsfHitPattern2.pixelHitFilter(gsfHit2)
133  || gsfHitPattern2.stripTIBHitFilter(gsfHit2)
134  || gsfHitPattern2.stripTOBHitFilter(gsfHit2)
135  || gsfHitPattern2.stripTECHitFilter(gsfHit2)
136  || gsfHitPattern2.stripTIDHitFilter(gsfHit2) )
137  ) continue;
138  if( (**elHitsIt1).sharesInput(&(**gsfHitsIt2), TrackingRecHit::some) ) {
139 // if (comp.equals(&(**elHitsIt1),&(**gsfHitsIt2))) {
140  //std::cout << "found shared hit " << gsfHit2 << std::endl;
141  shared++;
142  }
143  }//gsfHits2 iterator
144  }//gsfHits1 iterator
145 
146  //std::cout << "[sharedHits] number of shared hits " << shared << std::endl;
147  return shared;
148 
149 }
150 
151 int sharedDets(const GsfTrackRef& gsfTrackRef1, const
152  GsfTrackRef& gsfTrackRef2 ) {
153 
154  //get the Hit Pattern for the gsfTracks
155  const HitPattern& gsfHitPattern1 = gsfTrackRef1->hitPattern();
156  const HitPattern& gsfHitPattern2 = gsfTrackRef2->hitPattern();
157 
158  unsigned int shared = 0;
159 
160  int gsfHitCounter1 = 0;
161  for(trackingRecHit_iterator elHitsIt1 = gsfTrackRef1->recHitsBegin();
162  elHitsIt1 != gsfTrackRef1->recHitsEnd(); elHitsIt1++, gsfHitCounter1++) {
163  if(!((**elHitsIt1).isValid())) //count only valid Hits
164  continue;
165  //if (gsfHitCounter1>1) continue; // to test only the first hit of the track 1
166  uint32_t gsfHit = gsfHitPattern1.getHitPattern(gsfHitCounter1);
167  if(!(gsfHitPattern1.pixelHitFilter(gsfHit)
168  || gsfHitPattern1.stripTIBHitFilter(gsfHit)
169  || gsfHitPattern1.stripTOBHitFilter(gsfHit)
170  || gsfHitPattern1.stripTECHitFilter(gsfHit)
171  || gsfHitPattern1.stripTIDHitFilter(gsfHit) )
172  ) continue;
173  int gsfHitsCounter2 = 0;
174  for(trackingRecHit_iterator gsfHitsIt2 = gsfTrackRef2->recHitsBegin();
175  gsfHitsIt2 != gsfTrackRef2->recHitsEnd(); gsfHitsIt2++, gsfHitsCounter2++) {
176  if(!((**gsfHitsIt2).isValid())) //count only valid Hits!
177  continue;
178 
179  uint32_t gsfHit2 = gsfHitPattern2.getHitPattern(gsfHitsCounter2);
180  if(!(gsfHitPattern2.pixelHitFilter(gsfHit2)
181  || gsfHitPattern2.stripTIBHitFilter(gsfHit2)
182  || gsfHitPattern1.stripTOBHitFilter(gsfHit2)
183  || gsfHitPattern2.stripTECHitFilter(gsfHit2)
184  || gsfHitPattern2.stripTIDHitFilter(gsfHit2) )
185  ) continue;
186  if ((**elHitsIt1).geographicalId() == (**gsfHitsIt2).geographicalId()) shared++;
187  }//gsfHits2 iterator
188  }//gsfHits1 iterator
189 
190  //std::cout << "[sharedHits] number of shared dets " << shared << std::endl;
191  //return shared/min(gsfTrackRef1->numberOfValidHits(),gsfTrackRef2->numberOfValidHits());
192  return shared;
193 
194 }
195 
196 float sharedEnergy(const CaloCluster *clu1, const CaloCluster *clu2,
197  edm::Handle<EcalRecHitCollection> & reducedEBRecHits,
198  edm::Handle<EcalRecHitCollection> & reducedEERecHits ) {
199 
200  double fractionShared = 0;
201 
202  std::vector< std::pair<DetId, float> > v_id1 = clu1->hitsAndFractions();
203  std::vector< std::pair<DetId, float> > v_id2 = clu2->hitsAndFractions();
204  std::vector< std::pair<DetId, float> >::iterator ih1;
205  std::vector< std::pair<DetId, float> >::iterator ih2;
206 
207  for(ih1 = v_id1.begin();ih1 != v_id1.end(); ih1++) {
208 
209  for(ih2 = v_id2.begin();ih2 != v_id2.end(); ih2++) {
210 
211  if ( (*ih1).first != (*ih2).first ) continue;
212 
213  // here we have common Xtal id
215  if ((*ih1).first.subdetId() == EcalBarrel) {
216  if ((itt=reducedEBRecHits->find((*ih1).first))!=reducedEBRecHits->end())
217  fractionShared += itt->energy();
218  } else if ((*ih1).first.subdetId() == EcalEndcap) {
219  if ((itt=reducedEERecHits->find((*ih1).first))!=reducedEERecHits->end())
220  fractionShared += itt->energy();
221  }
222 
223  }
224  }
225 
226  //std::cout << "[sharedEnergy] shared energy /min(energy1,energy2) " << fractionShared << std::endl;
227  return fractionShared;
228 
229 }
230 
231 float sharedEnergy(const SuperClusterRef& sc1, const SuperClusterRef& sc2,
232  edm::Handle<EcalRecHitCollection> & reducedEBRecHits,
233  edm::Handle<EcalRecHitCollection> & reducedEERecHits ) {
234 
235  double energyShared = 0;
236  for(CaloCluster_iterator icl1=sc1->clustersBegin();icl1!=sc1->clustersEnd(); icl1++) {
237  for(CaloCluster_iterator icl2=sc2->clustersBegin();icl2!=sc2->clustersEnd(); icl2++) {
238  energyShared += sharedEnergy(&(**icl1),&(**icl2),reducedEBRecHits,reducedEERecHits );
239  }
240  }
241  return energyShared;
242 
243 }
244 
245 }
uint32_t getSubStructure(uint32_t pattern) const
Definition: HitPattern.cc:133
float eSuperClusterOverP() const
Definition: GsfElectron.h:201
bool isBetter(const reco::GsfElectron *, const reco::GsfElectron *)
std::vector< T >::const_iterator const_iterator
#define abs(x)
Definition: mlp_lapack.h:159
bool stripTIBHitFilter(uint32_t pattern) const
Definition: HitPattern.cc:170
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:178
uint32_t getLayer(uint32_t pattern) const
Definition: HitPattern.cc:219
int sharedHits(const reco::GsfTrackRef &, const reco::GsfTrackRef &)
bool stripTOBHitFilter(uint32_t pattern) const
Definition: HitPattern.cc:184
bool pixelHitFilter(uint32_t pattern) const
Definition: HitPattern.cc:138
int sharedDets(const reco::GsfTrackRef &, const reco::GsfTrackRef &)
float sharedEnergy(const reco::CaloCluster *, const reco::CaloCluster *, edm::Handle< EcalRecHitCollection > &reducedEBRecHits, edm::Handle< EcalRecHitCollection > &reducedEERecHits)
uint32_t getHitPattern(int position) const
Definition: HitPattern.cc:86
bool stripTIDHitFilter(uint32_t pattern) const
Definition: HitPattern.cc:177
bool stripTECHitFilter(uint32_t pattern) const
Definition: HitPattern.cc:191