CMS 3D CMS Logo

EgammaHLTGsfTrackVarProducer.cc
Go to the documentation of this file.
1 
9 // this class is designed to calculate dEtaIn,dPhiIn gsf track - supercluster
10 // pairs it can take as input std::vector<Electron> which the gsf track-sc is
11 // already done or it can run over the std::vector<GsfTrack> directly in which
12 // case it will pick the smallest dEta,dPhi the dEta, dPhi do not have to be
13 // from the same track it can optionally set dEta, dPhi to 0 based on the number
14 // of tracks found
15 
40 
42 public:
45  void operator()(const reco::GsfTrack& trk,
46  const reco::SuperCluster& sc,
47  const MultiTrajectoryStateTransform& mtsTransform);
51 
54  };
55 
56 public:
58  void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
59  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
60  void fillAbsAbleVar(float& existVal, const float newVal) const {
61  if (std::abs(newVal) < std::abs(existVal)) {
62  existVal = produceAbsValues_ ? std::abs(newVal) : newVal;
63  }
64  }
65 
66 private:
71 
74 
79  const bool produceAbsValues_;
80 
91 };
92 
93 namespace {
94 
95  float calRelDelta(float a, float b, float defaultVal = 0.f) { return a != 0.f ? (a - b) / a : defaultVal; }
96 
97 } // namespace
98 
100  : recoEcalCandToken_(
101  consumes<reco::RecoEcalCandidateCollection>(config.getParameter<edm::InputTag>("recoEcalCandidateProducer"))),
102  electronToken_{consumes<reco::ElectronCollection>(config.getParameter<edm::InputTag>("inputCollection"))},
103  gsfTrackToken_{consumes<reco::GsfTrackCollection>(config.getParameter<edm::InputTag>("inputCollection"))},
104  beamSpotToken_{consumes<reco::BeamSpot>(config.getParameter<edm::InputTag>("beamSpotProducer"))},
105  magneticFieldToken_{esConsumes()},
106  trackerGeometryToken_{esConsumes()},
107  upperTrackNrToRemoveCut_{config.getParameter<int>("upperTrackNrToRemoveCut")},
108  lowerTrackNrToRemoveCut_{config.getParameter<int>("lowerTrackNrToRemoveCut")},
109  useDefaultValuesForBarrel_{config.getParameter<bool>("useDefaultValuesForBarrel")},
110  useDefaultValuesForEndcap_{config.getParameter<bool>("useDefaultValuesForEndcap")},
111  produceAbsValues_{config.getParameter<bool>("produceAbsValues")},
112  dEtaMapPutToken_{produces<reco::RecoEcalCandidateIsolationMap>("Deta").setBranchAlias("deta")},
113  dEtaSeedMapPutToken_{produces<reco::RecoEcalCandidateIsolationMap>("DetaSeed").setBranchAlias("detaseed")},
114  dPhiMapPutToken_{produces<reco::RecoEcalCandidateIsolationMap>("Dphi").setBranchAlias("dphi")},
115  oneOverESuperMinusOneOverPMapPutToken_{produces<reco::RecoEcalCandidateIsolationMap>("OneOESuperMinusOneOP")},
116  oneOverESeedMinusOneOverPMapPutToken_{produces<reco::RecoEcalCandidateIsolationMap>("OneOESeedMinusOneOP")},
117  missingHitsMapPutToken_{
118  produces<reco::RecoEcalCandidateIsolationMap>("MissingHits").setBranchAlias("missinghits")},
119  validHitsMapPutToken_{produces<reco::RecoEcalCandidateIsolationMap>("ValidHits").setBranchAlias("validhits")},
120  nLayerITMapPutToken_{produces<reco::RecoEcalCandidateIsolationMap>("NLayerIT").setBranchAlias("nlayerit")},
121  chi2MapPutToken_{produces<reco::RecoEcalCandidateIsolationMap>("Chi2").setBranchAlias("chi2")},
122  fbremMapPutToken_{produces<reco::RecoEcalCandidateIsolationMap>("fbrem")} {}
123 
126  desc.add<edm::InputTag>(("recoEcalCandidateProducer"), edm::InputTag("hltRecoEcalSuperClusterActivityCandidate"));
127  desc.add<edm::InputTag>(("inputCollection"), edm::InputTag("hltActivityElectronGsfTracks"));
128  desc.add<edm::InputTag>(("beamSpotProducer"), edm::InputTag("hltOnlineBeamSpot"));
129  desc.add<int>(("upperTrackNrToRemoveCut"), 9999);
130  desc.add<int>(("lowerTrackNrToRemoveCut"), -1);
131  desc.add<bool>(("useDefaultValuesForBarrel"), false);
132  desc.add<bool>(("useDefaultValuesForEndcap"), false);
133  desc.add<bool>(("produceAbsValues"), false);
134 
135  descriptions.add("hltEgammaHLTGsfTrackVarProducer", desc);
136 }
138  // Get the HLT filtered objects
139  auto recoEcalCandHandle = iEvent.getHandle(recoEcalCandToken_);
140 
141  auto const& beamSpotPosition = iEvent.get(beamSpotToken_).position();
142  auto const& magneticField = iSetup.getData(magneticFieldToken_);
143  auto const& trackerGeometry = iSetup.getData(trackerGeometryToken_);
144 
147 
148  reco::RecoEcalCandidateIsolationMap dEtaMap(recoEcalCandHandle);
149  reco::RecoEcalCandidateIsolationMap dEtaSeedMap(recoEcalCandHandle);
150  reco::RecoEcalCandidateIsolationMap dPhiMap(recoEcalCandHandle);
151  reco::RecoEcalCandidateIsolationMap oneOverESuperMinusOneOverPMap(recoEcalCandHandle);
152  reco::RecoEcalCandidateIsolationMap oneOverESeedMinusOneOverPMap(recoEcalCandHandle);
153  reco::RecoEcalCandidateIsolationMap missingHitsMap(recoEcalCandHandle);
154  reco::RecoEcalCandidateIsolationMap validHitsMap(recoEcalCandHandle);
155  reco::RecoEcalCandidateIsolationMap nLayerITMap(recoEcalCandHandle);
156  reco::RecoEcalCandidateIsolationMap chi2Map(recoEcalCandHandle);
157  reco::RecoEcalCandidateIsolationMap fbremMap(recoEcalCandHandle);
158 
159  for (unsigned int iRecoEcalCand = 0; iRecoEcalCand < recoEcalCandHandle->size(); ++iRecoEcalCand) {
160  reco::RecoEcalCandidateRef recoEcalCandRef(recoEcalCandHandle, iRecoEcalCand);
161 
162  const reco::SuperClusterRef scRef = recoEcalCandRef->superCluster();
163  // the idea is that we can take the tracks from properly associated
164  // electrons or just take all gsf tracks with that sc as a seed
165  std::vector<const reco::GsfTrack*> gsfTracks;
166  if (auto electronHandle = iEvent.getHandle(electronToken_)) {
167  for (auto const& ele : *electronHandle) {
168  if (ele.superCluster() == scRef) {
169  gsfTracks.push_back(ele.gsfTrack().get());
170  }
171  }
172  } else {
173  for (auto const& trk : iEvent.get(gsfTrackToken_)) {
174  auto elseed = trk.extra()->seedRef().castTo<reco::ElectronSeedRef>();
175  if (elseed->caloCluster().castTo<reco::SuperClusterRef>() == scRef) {
176  gsfTracks.push_back(&trk);
177  }
178  }
179  }
180 
181  int nLayerITValue = -1;
182  int validHitsValue = 0;
183  float chi2Value = 9999999.;
184  float missingHitsValue = 9999999;
185  float dEtaInValue = 999999;
186  float dEtaSeedInValue = 999999;
187  float dPhiInValue = 999999;
188  float oneOverESuperMinusOneOverPValue = 999999;
189  float oneOverESeedMinusOneOverPValue = 999999;
190  float fbrem = 999999;
191 
192  const int nrTracks = gsfTracks.size();
193  const bool rmCutsDueToNrTracks = nrTracks <= lowerTrackNrToRemoveCut_ || nrTracks >= upperTrackNrToRemoveCut_;
194  // to use the default values, we require at least one track...
195  const bool useDefaultValues = std::abs(recoEcalCandRef->eta()) < 1.479
196  ? useDefaultValuesForBarrel_ && nrTracks >= 1
197  : useDefaultValuesForEndcap_ && nrTracks >= 1;
198 
199  MultiTrajectoryStateTransform mtsTransform(&trackerGeometry, &magneticField);
200  GsfTrackExtrapolations gsfTrackExtrapolations;
201 
202  if (rmCutsDueToNrTracks || useDefaultValues) {
203  nLayerITValue = 100;
204  dEtaInValue = 0;
205  dEtaSeedInValue = 0;
206  dPhiInValue = 0;
207  missingHitsValue = 0;
208  validHitsValue = 100;
209  chi2Value = 0;
210  oneOverESuperMinusOneOverPValue = 0;
211  oneOverESeedMinusOneOverPValue = 0;
212  fbrem = 0;
213  } else {
214  for (size_t trkNr = 0; trkNr < gsfTracks.size(); trkNr++) {
215  GlobalPoint scPos(scRef->x(), scRef->y(), scRef->z());
216 
217  gsfTrackExtrapolations(*gsfTracks[trkNr], *scRef, mtsTransform);
218 
219  EleRelPointPair scAtVtx(scRef->position(), gsfTrackExtrapolations.sclPos, beamSpotPosition);
220 
221  fbrem = calRelDelta(gsfTrackExtrapolations.innMom.mag(), gsfTrackExtrapolations.outMom.mag(), fbrem);
222 
223  float trkP = gsfTracks[trkNr]->p();
224  if (scRef->energy() != 0 && trkP != 0) {
225  fillAbsAbleVar(oneOverESuperMinusOneOverPValue, 1 / scRef->energy() - 1 / trkP);
226  }
227  if (scRef->seed().isNonnull() && scRef->seed()->energy() != 0 && trkP != 0) {
228  fillAbsAbleVar(oneOverESeedMinusOneOverPValue, 1 / scRef->seed()->energy() - 1 / trkP);
229  }
230 
231  if (gsfTracks[trkNr]->missingInnerHits() < missingHitsValue) {
232  missingHitsValue = gsfTracks[trkNr]->missingInnerHits();
233  }
234 
235  // we are saving the best value, and highest value of validHits is the
236  // best
237  if (gsfTracks[trkNr]->numberOfValidHits() > validHitsValue) {
238  validHitsValue = gsfTracks[trkNr]->numberOfValidHits();
239  }
240 
241  if (gsfTracks[trkNr]->hitPattern().pixelLayersWithMeasurement() > nLayerITValue) {
242  nLayerITValue = gsfTracks[trkNr]->hitPattern().pixelLayersWithMeasurement();
243  }
244 
245  if (gsfTracks[trkNr]->normalizedChi2() < chi2Value) {
246  chi2Value = gsfTracks[trkNr]->normalizedChi2();
247  }
248 
249  fillAbsAbleVar(dEtaInValue, scAtVtx.dEta());
250  fillAbsAbleVar(dEtaSeedInValue, scAtVtx.dEta() - scRef->position().eta() + scRef->seed()->position().eta());
251  fillAbsAbleVar(dPhiInValue, scAtVtx.dPhi());
252  }
253  }
254 
255  dEtaMap.insert(recoEcalCandRef, dEtaInValue);
256  dEtaSeedMap.insert(recoEcalCandRef, dEtaSeedInValue);
257  dPhiMap.insert(recoEcalCandRef, dPhiInValue);
258  oneOverESuperMinusOneOverPMap.insert(recoEcalCandRef, oneOverESuperMinusOneOverPValue);
259  oneOverESeedMinusOneOverPMap.insert(recoEcalCandRef, oneOverESeedMinusOneOverPValue);
260  missingHitsMap.insert(recoEcalCandRef, missingHitsValue);
261  validHitsMap.insert(recoEcalCandRef, validHitsValue);
262  nLayerITMap.insert(recoEcalCandRef, nLayerITValue);
263  chi2Map.insert(recoEcalCandRef, chi2Value);
264  fbremMap.insert(recoEcalCandRef, fbrem);
265  }
266 
267  iEvent.emplace(dEtaMapPutToken_, dEtaMap);
268  iEvent.emplace(dEtaSeedMapPutToken_, dEtaSeedMap);
269  iEvent.emplace(dPhiMapPutToken_, dPhiMap);
270  iEvent.emplace(oneOverESuperMinusOneOverPMapPutToken_, oneOverESuperMinusOneOverPMap);
271  iEvent.emplace(oneOverESeedMinusOneOverPMapPutToken_, oneOverESeedMinusOneOverPMap);
272  iEvent.emplace(missingHitsMapPutToken_, missingHitsMap);
273  iEvent.emplace(validHitsMapPutToken_, validHitsMap);
274  iEvent.emplace(nLayerITMapPutToken_, nLayerITMap);
275  iEvent.emplace(chi2MapPutToken_, chi2Map);
276  iEvent.emplace(fbremMapPutToken_, fbremMap);
277 }
278 
280  const reco::GsfTrack& trk, const reco::SuperCluster& sc, const MultiTrajectoryStateTransform& mtsTransform) {
281  innTSOS = mtsTransform.innerStateOnSurface(trk);
282  outTSOS = mtsTransform.outerStateOnSurface(trk);
283  sclTSOS = mtsTransform.extrapolatedState(innTSOS, GlobalPoint(sc.x(), sc.y(), sc.z()));
284 
288 }
289 
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
const edm::EDGetTokenT< reco::ElectronCollection > electronToken_
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
TrajectoryStateOnSurface outerStateOnSurface(const reco::GsfTrack &tk) const
const edm::EDGetTokenT< reco::RecoEcalCandidateCollection > recoEcalCandToken_
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
Definition: config.py:1
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > oneOverESuperMinusOneOverPMapPutToken_
double x() const
x coordinate of cluster centroid
Definition: CaloCluster.h:172
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > trackerGeometryToken_
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > chi2MapPutToken_
const edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
int iEvent
Definition: GenABIO.cc:224
bool positionFromModeCartesian(TrajectoryStateOnSurface const &tsos, GlobalPoint &position)
TrajectoryStateOnSurface innerStateOnSurface(const reco::GsfTrack &tk) const
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > validHitsMapPutToken_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double z() const
z coordinate of cluster centroid
Definition: CaloCluster.h:178
double y() const
y coordinate of cluster centroid
Definition: CaloCluster.h:175
EgammaHLTGsfTrackVarProducer(const edm::ParameterSet &)
double f[11][100]
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > dEtaMapPutToken_
void operator()(const reco::GsfTrack &trk, const reco::SuperCluster &sc, const MultiTrajectoryStateTransform &mtsTransform)
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magneticFieldToken_
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > fbremMapPutToken_
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > oneOverESeedMinusOneOverPMapPutToken_
void insert(const key_type &k, const data_type &v)
insert an association
TrajectoryStateOnSurface extrapolatedState(const TrajectoryStateOnSurface tsos, const GlobalPoint &point) const
double b
Definition: hdecay.h:120
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void fillAbsAbleVar(float &existVal, const float newVal) const
std::vector< RecoEcalCandidate > RecoEcalCandidateCollection
collectin of RecoEcalCandidate objects
fixed size matrix
HLT enums.
double a
Definition: hdecay.h:121
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > dPhiMapPutToken_
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > nLayerITMapPutToken_
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > dEtaSeedMapPutToken_
const edm::EDGetTokenT< reco::GsfTrackCollection > gsfTrackToken_
bool momentumFromModeCartesian(TrajectoryStateOnSurface const &tsos, GlobalVector &momentum)
const edm::EDPutTokenT< reco::RecoEcalCandidateIsolationMap > missingHitsMapPutToken_