CMS 3D CMS Logo

EgammaHLTGsfTrackVarProducer.cc
Go to the documentation of this file.
1 
10 
13 
17 
21 
24 
32 
34  recoEcalCandTag_ (consumes<reco::RecoEcalCandidateCollection>(config.getParameter<edm::InputTag>("recoEcalCandidateProducer"))),
35  inputCollectionTag1_ (consumes<reco::ElectronCollection>(config.getParameter<edm::InputTag>("inputCollection"))),
36  inputCollectionTag2_ (consumes<reco::GsfTrackCollection>(config.getParameter<edm::InputTag>("inputCollection"))),
37  beamSpotTag_ (consumes<reco::BeamSpot>(config.getParameter<edm::InputTag>("beamSpotProducer"))),
38  upperTrackNrToRemoveCut_ (config.getParameter<int>("upperTrackNrToRemoveCut")),
39  lowerTrackNrToRemoveCut_ (config.getParameter<int>("lowerTrackNrToRemoveCut")),
40  useDefaultValuesForBarrel_ (config.getParameter<bool>("useDefaultValuesForBarrel")),
41  useDefaultValuesForEndcap_ (config.getParameter<bool>("useDefaultValuesForEndcap"))
42 {
43 
44  //register your products
45  produces < reco::RecoEcalCandidateIsolationMap >( "Deta" ).setBranchAlias( "deta" );
46  produces < reco::RecoEcalCandidateIsolationMap >( "DetaSeed" ).setBranchAlias( "detaseed" );
47  produces < reco::RecoEcalCandidateIsolationMap >( "Dphi" ).setBranchAlias( "dphi" );
48  produces < reco::RecoEcalCandidateIsolationMap >( "OneOESuperMinusOneOP" );
49  produces < reco::RecoEcalCandidateIsolationMap >( "OneOESeedMinusOneOP" );
50  produces < reco::RecoEcalCandidateIsolationMap >( "MissingHits" ).setBranchAlias( "missinghits" );
51  produces < reco::RecoEcalCandidateIsolationMap >( "Chi2" ).setBranchAlias( "chi2" );
52  produces < reco::RecoEcalCandidateIsolationMap >( "ValidHits" ).setBranchAlias( "validhits" );
53 }
54 
56 {}
57 
60  desc.add<edm::InputTag>(("recoEcalCandidateProducer"), edm::InputTag("hltRecoEcalSuperClusterActivityCandidate"));
61  desc.add<edm::InputTag>(("inputCollection"), edm::InputTag("hltActivityElectronGsfTracks"));
62  desc.add<edm::InputTag>(("beamSpotProducer"), edm::InputTag("hltOnlineBeamSpot"));
63  desc.add<int>(("upperTrackNrToRemoveCut"), 9999);
64  desc.add<int>(("lowerTrackNrToRemoveCut"), -1);
65  desc.add<bool>(("useDefaultValuesForBarrel"),false);
66  desc.add<bool>(("useDefaultValuesForEndcap"),false);
67 
68  descriptions.add("hltEgammaHLTGsfTrackVarProducer", desc);
69 }
71 
72  trackExtrapolator_.setup(iSetup);
73 
74  // Get the HLT filtered objects
76  iEvent.getByToken(recoEcalCandTag_,recoEcalCandHandle);
77 
79  iEvent.getByToken(inputCollectionTag1_,electronHandle);
80 
82  if(!electronHandle.isValid())
83  iEvent.getByToken(inputCollectionTag2_, gsfTracksHandle);
84 
85  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
86  iEvent.getByToken(beamSpotTag_,recoBeamSpotHandle);
87  // gets its position
88  const reco::BeamSpot& beamSpot = *recoBeamSpotHandle;
89 
90  edm::ESHandle<MagneticField> theMagField;
91  iSetup.get<IdealMagneticFieldRecord>().get(theMagField);
92 
93  reco::RecoEcalCandidateIsolationMap dEtaMap(recoEcalCandHandle);
94  reco::RecoEcalCandidateIsolationMap dEtaSeedMap(recoEcalCandHandle);
95  reco::RecoEcalCandidateIsolationMap dPhiMap(recoEcalCandHandle);
96  reco::RecoEcalCandidateIsolationMap oneOverESuperMinusOneOverPMap(recoEcalCandHandle);
97  reco::RecoEcalCandidateIsolationMap oneOverESeedMinusOneOverPMap(recoEcalCandHandle);
98  reco::RecoEcalCandidateIsolationMap missingHitsMap(recoEcalCandHandle);
99  reco::RecoEcalCandidateIsolationMap validHitsMap(recoEcalCandHandle);
100  reco::RecoEcalCandidateIsolationMap chi2Map(recoEcalCandHandle);
101 
102  for(reco::RecoEcalCandidateCollection::const_iterator iRecoEcalCand = recoEcalCandHandle->begin(); iRecoEcalCand != recoEcalCandHandle->end(); iRecoEcalCand++){
103  reco::RecoEcalCandidateRef recoEcalCandRef(recoEcalCandHandle,iRecoEcalCand-recoEcalCandHandle->begin());
104 
105  const reco::SuperClusterRef scRef = recoEcalCandRef->superCluster();
106  bool isBarrel = std::abs(recoEcalCandRef->eta())<1.479;
107  //the idea is that we can take the tracks from properly associated electrons or just take all gsf tracks with that sc as a seed
108  std::vector<const reco::GsfTrack*> gsfTracks;
109  if(electronHandle.isValid()){
110  for(reco::ElectronCollection::const_iterator eleIt = electronHandle->begin(); eleIt != electronHandle->end(); eleIt++){
111  if(eleIt->superCluster()==scRef){
112  gsfTracks.push_back(&*eleIt->gsfTrack());
113  }
114  }
115  }else{
116  for(reco::GsfTrackCollection::const_iterator trkIt =gsfTracksHandle->begin();trkIt!=gsfTracksHandle->end();++trkIt){
117  edm::RefToBase<TrajectorySeed> seed = trkIt->extra()->seedRef() ;
119  edm::RefToBase<reco::CaloCluster> caloCluster = elseed->caloCluster() ;
120  reco::SuperClusterRef scRefFromTrk = caloCluster.castTo<reco::SuperClusterRef>() ;
121  if(scRefFromTrk==scRef){
122  gsfTracks.push_back(&*trkIt);
123  }
124  }
125 
126  }
127 
128  int validHitsValue = 0;
129  float chi2Value = 9999999.;
130  float missingHitsValue = 9999999;
131  float dEtaInValue=999999;
132  float dEtaSeedInValue=999999;
133  float dPhiInValue=999999;
134  float oneOverESuperMinusOneOverPValue=999999;
135  float oneOverESeedMinusOneOverPValue=999999;
136 
137  if(static_cast<int>(gsfTracks.size())>=upperTrackNrToRemoveCut_ ||
138  static_cast<int>(gsfTracks.size())<=lowerTrackNrToRemoveCut_ ||
139  (isBarrel && useDefaultValuesForBarrel_) ||
140  (!isBarrel && useDefaultValuesForEndcap_)){
141  dEtaInValue=0;
142  dEtaSeedInValue=0;
143  dPhiInValue=0;
144  missingHitsValue = 0;
145  validHitsValue = 100;
146  chi2Value = 0;
147  oneOverESuperMinusOneOverPValue = 0;
148  oneOverESeedMinusOneOverPValue = 0;
149  }else{
150  for(size_t trkNr=0;trkNr<gsfTracks.size();trkNr++){
151 
152  GlobalPoint scPos(scRef->x(),scRef->y(),scRef->z());
153  GlobalPoint trackExtrapToSC = trackExtrapolator_.extrapolateTrackPosToPoint(*gsfTracks[trkNr],scPos);
154  EleRelPointPair scAtVtx(scRef->position(),trackExtrapToSC,beamSpot.position());
155 
156  float trkP = gsfTracks[trkNr]->p();
157  if(scRef->energy()!=0 && trkP!=0){
158  if(fabs(1/scRef->energy() - 1/trkP)<oneOverESuperMinusOneOverPValue) oneOverESuperMinusOneOverPValue =fabs(1/scRef->energy() - 1/trkP);
159  }
160  if(scRef->seed().isNonnull() && scRef->seed()->energy()!=0 && trkP!=0){
161  if(fabs(1/scRef->seed()->energy() - 1/trkP)<oneOverESeedMinusOneOverPValue) oneOverESeedMinusOneOverPValue =fabs(1/scRef->seed()->energy() - 1/trkP);
162  }
163 
164 
165  if (gsfTracks[trkNr]->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS) < missingHitsValue)
166  missingHitsValue = gsfTracks[trkNr]->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS);
167 
168  if (gsfTracks[trkNr]->numberOfValidHits() < validHitsValue)
169  validHitsValue = gsfTracks[trkNr]->numberOfValidHits();
170 
171  if (gsfTracks[trkNr]->numberOfValidHits() < chi2Value)
172  chi2Value = gsfTracks[trkNr]->normalizedChi2();
173 
174  if (fabs(scAtVtx.dEta())<dEtaInValue)
175  dEtaInValue=fabs(scAtVtx.dEta()); //we are allowing them to come from different tracks
176 
177  if (fabs(scAtVtx.dEta())<dEtaSeedInValue)
178  dEtaSeedInValue = fabs(scAtVtx.dEta()-scRef->position().eta()+scRef->seed()->position().eta());
179 
180  if (fabs(scAtVtx.dPhi())<dPhiInValue)
181  dPhiInValue=fabs(scAtVtx.dPhi());//we are allowing them to come from different tracks
182  }
183  }
184 
185  dEtaMap.insert(recoEcalCandRef, dEtaInValue);
186  dEtaSeedMap.insert(recoEcalCandRef, dEtaSeedInValue);
187  dPhiMap.insert(recoEcalCandRef, dPhiInValue);
188  oneOverESuperMinusOneOverPMap.insert(recoEcalCandRef,oneOverESuperMinusOneOverPValue);
189  oneOverESeedMinusOneOverPMap.insert(recoEcalCandRef,oneOverESeedMinusOneOverPValue);
190  missingHitsMap.insert(recoEcalCandRef, missingHitsValue);
191  validHitsMap.insert(recoEcalCandRef, validHitsValue);
192  chi2Map.insert(recoEcalCandRef, chi2Value);
193  }
194 
195  auto dEtaMapForEvent = std::make_unique<reco::RecoEcalCandidateIsolationMap>(dEtaMap);
196  auto dEtaSeedMapForEvent = std::make_unique<reco::RecoEcalCandidateIsolationMap>(dEtaSeedMap);
197  auto dPhiMapForEvent = std::make_unique<reco::RecoEcalCandidateIsolationMap>(dPhiMap);
198  auto oneOverESuperMinusOneOverPMapForEvent = std::make_unique<reco::RecoEcalCandidateIsolationMap>(oneOverESuperMinusOneOverPMap);
199  auto oneOverESeedMinusOneOverPMapForEvent = std::make_unique<reco::RecoEcalCandidateIsolationMap>(oneOverESeedMinusOneOverPMap);
200  auto missingHitsForEvent = std::make_unique<reco::RecoEcalCandidateIsolationMap>(missingHitsMap);
201  auto validHitsForEvent = std::make_unique<reco::RecoEcalCandidateIsolationMap>(validHitsMap);
202  auto chi2ForEvent = std::make_unique<reco::RecoEcalCandidateIsolationMap>(chi2Map);
203 
204  iEvent.put(std::move(dEtaMapForEvent), "Deta" );
205  iEvent.put(std::move(dEtaSeedMapForEvent), "DetaSeed" );
206  iEvent.put(std::move(dPhiMapForEvent), "Dphi" );
207  iEvent.put(std::move(oneOverESuperMinusOneOverPMapForEvent), "OneOESuperMinusOneOP");
208  iEvent.put(std::move(oneOverESeedMinusOneOverPMapForEvent), "OneOESeedMinusOneOP");
209  iEvent.put(std::move(missingHitsForEvent), "MissingHits");
210  iEvent.put(std::move(validHitsForEvent), "ValidHits");
211  iEvent.put(std::move(chi2ForEvent), "Chi2");
212 }
213 
214 
216  cacheIDTDGeom_(rhs.cacheIDTDGeom_),
217  cacheIDMagField_(rhs.cacheIDMagField_),
218  magField_(rhs.magField_),
219  trackerHandle_(rhs.trackerHandle_),
220  mtsMode_(rhs.mtsMode_)
221 
222 {
224  else mtsTransform_ =nullptr;
225 
226 }
227 
229 {
230  if(this!=&rhs){ //just to ensure we're not copying ourselves
233  magField_ = rhs.magField_;
235  mtsMode_ = rhs.mtsMode_;
236 
237  delete mtsTransform_;
239  else mtsTransform_ =nullptr;
240  }
241  return this;
242 }
243 
245 {
246  bool updateField(false);
248  updateField = true;
249  cacheIDMagField_=iSetup.get<IdealMagneticFieldRecord>().cacheIdentifier();
250  iSetup.get<IdealMagneticFieldRecord>().get(magField_);
251  }
252 
253  bool updateGeometry(false);
255  updateGeometry = true;
256  cacheIDTDGeom_=iSetup.get<TrackerDigiGeometryRecord>().cacheIdentifier();
258  }
259 
260  if ( updateField || updateGeometry || !mtsTransform_ ) {
261  delete mtsTransform_;
263  }
264 }
265 
267 {
269  TrajectoryStateOnSurface posTSOS = mtsTransform()->extrapolatedState(innTSOS,pointToExtrapTo);
270  GlobalPoint extrapolatedPos;
271  mtsMode()->positionFromModeCartesian(posTSOS,extrapolatedPos);
272  return extrapolatedPos;
273 }
274 
276 {
278  TrajectoryStateOnSurface posTSOS = mtsTransform()->extrapolatedState(innTSOS,pointToExtrapTo);
279  GlobalVector extrapolatedMom;
280  mtsMode()->momentumFromModeCartesian(posTSOS,extrapolatedMom);
281  return extrapolatedMom;
282 }
283 
284 //define this as a plug-in
285 //DEFINE_FWK_MODULE(EgammaHLTTrackIsolationProducers);
unsigned long long cacheIdentifier() const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:136
bool positionFromModeCartesian(const TrajectoryStateOnSurface tsos, GlobalPoint &position) const
const MultiTrajectoryStateMode * mtsMode() const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
Definition: config.py:1
bool momentumFromModeCartesian(const TrajectoryStateOnSurface tsos, GlobalVector &momentum) const
const MultiTrajectoryStateTransform * mtsTransform() const
const edm::EDGetTokenT< reco::RecoEcalCandidateCollection > recoEcalCandTag_
GlobalPoint extrapolateTrackPosToPoint(const reco::GsfTrack &gsfTrack, const GlobalPoint &pointToExtrapTo)
const edm::EDGetTokenT< reco::GsfTrackCollection > inputCollectionTag2_
GlobalVector extrapolateTrackMomToPoint(const reco::GsfTrack &gsfTrack, const GlobalPoint &pointToExtrapTo)
int iEvent
Definition: GenABIO.cc:230
TrajectoryStateOnSurface extrapolatedState(const TrajectoryStateOnSurface tsos, const GlobalPoint &point) const
const edm::EDGetTokenT< reco::BeamSpot > beamSpotTag_
std::vector< GsfTrack > GsfTrackCollection
collection of GsfTracks
Definition: GsfTrackFwd.h:9
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
EgammaHLTGsfTrackVarProducer(const edm::ParameterSet &)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:74
std::vector< Electron > ElectronCollection
collectin of Electron objects
Definition: ElectronFwd.h:9
void produce(edm::Event &, const edm::EventSetup &) override
const edm::EDGetTokenT< reco::ElectronCollection > inputCollectionTag1_
TrackExtrapolator * operator=(const TrackExtrapolator &rhs)
void insert(const key_type &k, const data_type &v)
insert an association
REF castTo() const
Definition: RefToBase.h:286
const T & get() const
Definition: EventSetup.h:59
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
TrajectoryStateOnSurface innerStateOnSurface(const reco::GsfTrack &tk) const
std::vector< RecoEcalCandidate > RecoEcalCandidateCollection
collectin of RecoEcalCandidate objects
fixed size matrix
HLT enums.
const Point & position() const
position
Definition: BeamSpot.h:62
T const * product() const
Definition: ESHandle.h:86
def move(src, dest)
Definition: eostools.py:510