CMS 3D CMS Logo

IPTagInfo.h
Go to the documentation of this file.
1 #ifndef DataFormats_BTauReco_IpTagInfo_h
2 #define DataFormats_BTauReco_IpTagInfo_h
3 
13 #include <cmath>
14 #include <map>
15 #include <Math/VectorUtil.h>
20 
21 namespace reco {
22 namespace btag {
23 
24 inline const reco::Track * toTrack(const reco::TrackBaseRef & t) {return &(*t);}
25 inline const reco::Track * toTrack(const reco::TrackRef & t) {return &(*t);}
26 inline const reco::Track * toTrack(const reco::CandidatePtr & c) {return (*c).bestTrack();}
27 
28  struct TrackIPData {
36  };
38  double a_dR, b_dR, a_pT, b_pT;
39  double min_pT, max_pT;
42  };
45 
46 }
47 
48 
49 
50 template <class Container, class Base>
51 class IPTagInfo : public Base {
52 public:
54  typedef Base base_class;
55 
57  const std::vector<btag::TrackIPData> & ipData,
58  const std::vector<float> & prob2d,
59  const std::vector<float> & prob3d,
60  const Container & selected,
61  const Base & base,
63  const GlobalVector & axis,
64  const TrackRef & ghostTrack) :
65  Base(base), m_data(ipData), m_prob2d(prob2d),
66  m_prob3d(prob3d), m_selected(selected), m_pv(pv),
67  m_axis(axis), m_ghostTrack(ghostTrack) {}
68 
69  IPTagInfo() {}
70 
71  ~IPTagInfo() override {}
72 
74  IPTagInfo * clone(void) const override
75  { return new IPTagInfo(*this); }
76 
85  virtual bool hasProbabilities() const
86  { return m_data.size() == m_prob3d.size(); }
87 
91  const std::vector<btag::TrackIPData> & impactParameterData() const
92  { return m_data; }
93 
98  const Container & selected() const { return m_selected; }
99 
100 //legacy name for compatibility
101  const Container & selectedTracks() const { return m_selected; }
102 
103  const std::vector<float> & probabilities(int ip) const {return (ip==0)?m_prob3d:m_prob2d; }
104 
105 
114  std::vector<size_t> sortedIndexesWithCut(float cut, btag::SortCriteria mode = reco::btag::IP3DSig) const;
115 
121  std::vector<bool> variableJTA(const btag::variableJTAParameters &params) const;
122  static bool passVariableJTA(const btag::variableJTAParameters &params, double jetpt, double trackpt, double jettrackdr) ;
123 
127  std::vector<size_t> sortedIndexes(btag::SortCriteria mode = reco::btag::IP3DSig) const;
128  Container sorted(const std::vector<size_t>& indexes) const;
129  Container sortedTracks(const std::vector<size_t>& indexes) const {return sorted(indexes);}
130 
131  TaggingVariableList taggingVariables(void) const override;
132 
133  const edm::Ref<VertexCollection> & primaryVertex() const { return m_pv; }
134 
135  const GlobalVector & axis() const { return m_axis; }
136  const TrackRef & ghostTrack() const { return m_ghostTrack; }
137 
138  const Track * selectedTrack(size_t i) const {return reco::btag::toTrack(m_selected[i]);}
139 
140  // Used by ROOT storage
142 
143 private:
144  std::vector<btag::TrackIPData> m_data;
145  std::vector<float> m_prob2d;
146  std::vector<float> m_prob3d;
147  Container m_selected;
149  GlobalVector m_axis;
150  TrackRef m_ghostTrack;
151 };
152 
153 
154 //Explicit templates:
155 //template <> const Track *IPTagInfo<TrackRefVector,JTATagInfo>::selectedTrack(size_t i) const {return &(*m_selected[i]);}
156 //template <> const Track *IPTagInfo<std::vector<CandidatePtr>,BaseTagInfo>::selectedTrack(size_t i) const {return (*m_selected[i]).bestTrack();}
157 
158 template <class Container, class Base> TaggingVariableList IPTagInfo<Container,Base>::taggingVariables(void) const {
160 
161  math::XYZVector jetDir = Base::jet()->momentum().Unit();
162  bool havePv = primaryVertex().isNonnull();
163  GlobalPoint pv;
164  if (havePv)
165  pv = GlobalPoint(primaryVertex()->x(),
166  primaryVertex()->y(),
167  primaryVertex()->z());
168 
169  std::vector<size_t> indexes = sortedIndexes(); // use default criterium
170  for(std::vector<size_t>::const_iterator it = indexes.begin();
171  it != indexes.end(); ++it)
172  {
173  using namespace ROOT::Math;
174  const Track * track = selectedTrack(*it);
175  const btag::TrackIPData *data = &m_data[*it];
176  const math::XYZVector& trackMom = track->momentum();
177  double trackMag = std::sqrt(trackMom.Mag2());
178 
179  vars.insert(btau::trackMomentum, trackMag, true);
180  vars.insert(btau::trackEta, trackMom.Eta(), true);
181  vars.insert(btau::trackEtaRel, reco::btau::etaRel(jetDir, trackMom), true);
182  vars.insert(btau::trackPtRel, VectorUtil::Perp(trackMom, jetDir), true);
183  vars.insert(btau::trackPPar, jetDir.Dot(trackMom), true);
184  vars.insert(btau::trackDeltaR, VectorUtil::DeltaR(trackMom, jetDir), true);
185  vars.insert(btau::trackPtRatio, VectorUtil::Perp(trackMom, jetDir) / trackMag, true);
186  vars.insert(btau::trackPParRatio, jetDir.Dot(trackMom) / trackMag, true);
187  vars.insert(btau::trackSip3dVal, data->ip3d.value(), true);
188  vars.insert(btau::trackSip3dSig, data->ip3d.significance(), true);
189  vars.insert(btau::trackSip2dVal, data->ip2d.value(), true);
190  vars.insert(btau::trackSip2dSig, data->ip2d.significance(), true);
191  vars.insert(btau::trackDecayLenVal, havePv ? (data->closestToJetAxis - pv).mag() : -1.0, true);
197  vars.insert(btau::trackChi2, track->normalizedChi2(), true);
200  }
201  vars.finalize();
202  return vars;
203 }
204 
205 template<class Container, class Base> Container IPTagInfo<Container,Base>::sorted(const std::vector<size_t>& indexes) const
206 {
207  Container tr;
208  for(size_t i =0 ; i < indexes.size(); i++) tr.push_back(m_selected[indexes[i]]);
209  return tr;
210 }
211 
212 template<class Container, class Base> std::vector<bool> IPTagInfo<Container,Base>::variableJTA(const btag::variableJTAParameters &params) const{
213 
214  std::vector<bool> result;
215 
216  //Jet parameters
217  double jetpT = Base::jet()->pt();
218  math::XYZVector jetDir = Base::jet()->momentum().Unit();
219 
220  for(size_t i = 0 ; i< m_selected.size(); i++) {
221 
222  //Track parameters
223  const Track * track = selectedTrack(i);
224  double trackpT = track->pt();
225  const math::XYZVector& trackMom = track->momentum();
226 
227  // do the math in passVariableJTA
228  result.push_back(passVariableJTA( params, jetpT, trackpT, ROOT::Math::VectorUtil::DeltaR(trackMom, jetDir)));
229 
230  }
231 
232  return result;
233 }
234 
235 
236 
237 
238 template<class Container, class Base> std::vector<size_t> IPTagInfo<Container,Base>::sortedIndexes(btag::SortCriteria mode) const
239 {
240  using namespace reco::btag;
241  float cut=-1e99;
242  if((mode == Prob3D || mode == Prob2D)) cut=1e99;
243  return sortedIndexesWithCut(cut,mode);
244 }
245 
246 template<class Container, class Base> std::vector<size_t> IPTagInfo<Container,Base>::sortedIndexesWithCut(float cut, btag::SortCriteria mode) const
247 {
248  std::multimap<float,size_t> sortedIdx;
249  size_t nSelectedTracks = m_selected.size();
250  std::vector<size_t> result;
251  using namespace reco::btag;
252 
253 //check if probabilities are available
254  if((mode == Prob3D || mode == Prob2D) && ! hasProbabilities())
255  {
256  return result;
257  }
258 
259  for(size_t i=0;i<nSelectedTracks;i++)
260  {
261  float sortingKey;
262  switch(mode)
263  {
264  case IP3DSig:
265  sortingKey=m_data[i].ip3d.significance();
266  break;
267  case IP2DSig:
268  sortingKey=m_data[i].ip2d.significance();
269  break;
270  case IP3DValue:
271  sortingKey=m_data[i].ip3d.value();
272  break;
273  case IP2DValue:
274  sortingKey=m_data[i].ip2d.value();
275  break;
276  case Prob3D:
277  sortingKey=m_prob3d[i];
278  break;
279  case Prob2D:
280  sortingKey=m_prob2d[i];
281  break;
282 
283  default:
284  sortingKey=i;
285  }
286  sortedIdx.insert(std::pair<float,size_t>(sortingKey,i));
287  }
288 
289 //Descending:
290 if(mode == IP3DSig || mode == IP2DSig ||mode == IP3DValue || mode == IP2DValue)
291  {
292  for(std::multimap<float,size_t>::reverse_iterator it = sortedIdx.rbegin(); it!=sortedIdx.rend(); it++)
293  if(it->first >= cut) result.push_back(it->second);
294  } else
295 //Ascending:
296  {
297  for(std::multimap<float,size_t>::iterator it = sortedIdx.begin(); it!=sortedIdx.end(); it++)
298  if(it->first <= cut) result.push_back(it->second);
299  }
300  return result;
301 }
302 
303 template<class Container, class Base> bool IPTagInfo<Container,Base>::passVariableJTA(const btag::variableJTAParameters &params, double jetpT, double trackpT, double jettrackdR) {
304 
305  bool pass = false;
306 
307  // intermediate pt range (between min_pT and max_pT), apply variable JTA !
308  if ( jetpT > params.min_pT && jetpT < params.max_pT ) {
309  double deltaRfunction_highpt = -jetpT * params.a_dR + params.b_dR;
310  double ptfunction_highpt = jetpT * params.a_pT + params.b_pT;
311 
312  if (jettrackdR < deltaRfunction_highpt
313  &&
314  trackpT > ptfunction_highpt)
315  pass = true;
316 
317  // cout << "IPTagInfo: passVariableJTA: dR and TrackpT " << jettrackdR << " " << trackpT << endl;
318 
319  //high pt range, apply fixed default cuts
320  }else if (jetpT > params.max_pT ) {
321  if (jettrackdR < params.max_pT_dRcut
322  &&
323  trackpT > params.max_pT_trackPTcut)
324  pass = true;
325 
326  // low pt range, apply fixed default cuts
327  }else {
328  if (jettrackdR < params.min_pT_dRcut)
329  pass = true;
330  }
331 
332  return pass;
333 }
334 }
335 #endif
IPTagInfo(const std::vector< btag::TrackIPData > &ipData, const std::vector< float > &prob2d, const std::vector< float > &prob3d, const Container &selected, const Base &base, const edm::Ref< VertexCollection > &pv, const GlobalVector &axis, const TrackRef &ghostTrack)
Definition: IPTagInfo.h:56
const GlobalVector & axis() const
Definition: IPTagInfo.h:135
const std::vector< float > & probabilities(int ip) const
Definition: IPTagInfo.h:103
std::vector< bool > variableJTA(const btag::variableJTAParameters &params) const
Definition: IPTagInfo.h:212
Container sorted(const std::vector< size_t > &indexes) const
Definition: IPTagInfo.h:205
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
Definition: TrackBase.h:600
int numberOfValidHits() const
Definition: HitPattern.h:896
double etaRel(const math::XYZVector &dir, const math::XYZVector &track)
Measurement1D ip2d
Definition: IPTagInfo.h:31
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
const Container & selectedTracks() const
Definition: IPTagInfo.h:101
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
def Base(process)
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:714
#define CMS_CLASS_VERSION(_version_)
const reco::Track * toTrack(const reco::TrackBaseRef &t)
Definition: IPTagInfo.h:24
Definition: Matching.h:10
const edm::Ref< VertexCollection > & primaryVertex() const
Definition: IPTagInfo.h:133
static bool passVariableJTA(const btag::variableJTAParameters &params, double jetpt, double trackpt, double jettrackdr)
Definition: IPTagInfo.h:303
std::vector< size_t > sortedIndexesWithCut(float cut, btag::SortCriteria mode=reco::btag::IP3DSig) const
Definition: IPTagInfo.h:246
~IPTagInfo() override
Definition: IPTagInfo.h:71
Measurement1D distanceToGhostTrack
Definition: IPTagInfo.h:34
const Container & selected() const
Definition: IPTagInfo.h:98
T sqrt(T t)
Definition: SSEVec.h:18
double pt() const
track transverse momentum
Definition: TrackBase.h:660
def pv(vc)
Definition: MetAnalyzer.py:7
IPTagInfo * clone(void) const override
clone
Definition: IPTagInfo.h:74
def template(fileName, svg, replaceme="REPLACEME")
Definition: svgfig.py:521
base
Make Sure CMSSW is Setup ##.
std::vector< size_t > sortedIndexes(btag::SortCriteria mode=reco::btag::IP3DSig) const
Definition: IPTagInfo.h:238
Measurement1D ip3d
Definition: IPTagInfo.h:32
const std::vector< btag::TrackIPData > & impactParameterData() const
Definition: IPTagInfo.h:91
const Track * selectedTrack(size_t i) const
Definition: IPTagInfo.h:138
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::GlobalCoordinateSystemTag > GlobalVector
vector in glovbal coordinate system
Definition: Vector3D.h:27
double significance() const
Definition: Measurement1D.h:29
GlobalPoint closestToJetAxis
Definition: IPTagInfo.h:29
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:485
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
double value() const
Definition: Measurement1D.h:25
Measurement1D distanceToJetAxis
Definition: IPTagInfo.h:33
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::GlobalCoordinateSystemTag > GlobalPoint
point in global coordinate system
Definition: Point3D.h:17
fixed size matrix
HLT enums.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
GlobalPoint closestToGhostTrack
Definition: IPTagInfo.h:30
const TrackRef & ghostTrack() const
Definition: IPTagInfo.h:136
int numberOfValidPixelHits() const
Definition: HitPattern.h:916
Container input_container
Definition: IPTagInfo.h:53
vars
Definition: DeepTauId.cc:77
Container sortedTracks(const std::vector< size_t > &indexes) const
Definition: IPTagInfo.h:129
edm::AssociationVector< reco::JetRefBaseProd, Values > Container
virtual bool hasProbabilities() const
Definition: IPTagInfo.h:85
void insert(const TaggingVariable &variable, bool delayed=false)