Belle II Software  release-05-01-25
PXD2TrackBase.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2021 Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Qingyuan Liu *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #pragma once
12 
13 #include <framework/datastore/RelationsObject.h>
14 #include <framework/datastore/StoreArray.h>
15 #include <tracking/dataobjects/RecoTrack.h>
16 
17 #include <framework/database/DBObjPtr.h>
18 #include <mdst/dbobjects/BeamSpot.h>
19 #include <mdst/dataobjects/Track.h>
20 #include <analysis/VertexFitting/RaveInterface/RaveVertexFitter.h>
21 
22 #include <TVector3.h>
23 #include <vector>
24 
25 
26 namespace Belle2 {
40  template <class T>
41  class PXD2TrackBase : public RelationsObject {
42 
43  public:
44 
46  typedef T baseType;
47 
49  PXD2TrackBase(): m_vx(0.0), m_vy(0.0), m_vz(0.0),
50  m_track_p(),
51  m_track_m()
52  {
53  }
54 
60  PXD2TrackBase(const TVector3& vertex, const T& track_p, const T& track_m):
61  m_vx(vertex.X()), m_vy(vertex.Y()), m_vz(vertex.Z()),
62  m_track_p(track_p), m_track_m(track_m)
63  {
64  }
65 
69  TVector3 getVertex() const { return TVector3(m_vx, m_vy, m_vz); }
70 
74  const T& getTrackP() const { return m_track_p; }
75 
79  const T& getTrackM() const { return m_track_m; }
80 
82  //bool setValues(const RelationVector<RecoTrack>& recoTracks);
83  virtual bool setValues(const StoreArray<RecoTrack>& recoTracks,
84  const std::string recoTracksName = "",
85  const std::string pxdInterceptsName = "",
86  const std::string pxdTrackClustersName = "PXDClustersFromTracks"
87  );
88 
89  protected:
90  float m_vx;
91  float m_vy;
92  float m_vz;
93  T m_track_p;
94  T m_track_m;
96  ClassDef(PXD2TrackBase, 1);
97  };
98 
99  template <class T>
101  const std::string recoTracksName,
102  const std::string pxdInterceptsName,
103  const std::string pxdTrackClustersName
104  )
105  {
106  // Exactly 2 tracks
107  //if(recoTracks.size() != 2) return false;
108  if (!recoTracks.isValid() or recoTracks.getEntries() != 2) return false;
109 
110  // Valid Tracks
111  auto track1Ptr = recoTracks[0]->getRelated<Track>("Tracks");
112  auto track2Ptr = recoTracks[1]->getRelated<Track>("Tracks");
113  if (!track1Ptr or !track2Ptr) return false;
114 
115  // Valid trackFitResults
116  auto tfr1Ptr = track1Ptr->getTrackFitResultWithClosestMass(Const::pion);
117  auto tfr2Ptr = track2Ptr->getTrackFitResultWithClosestMass(Const::pion);
118  if (!tfr1Ptr or !tfr2Ptr) return false;
119 
120  // Valid P Values
121  if (tfr1Ptr->getPValue() <= 0 or tfr2Ptr->getPValue() <= 0) return false;
122 
123  // Opposite charges
124  if (tfr1Ptr->getChargeSign() * tfr2Ptr->getChargeSign() >= 0) return false;
125 
126  // Setup Rave vertex fitter
127  auto bField = BFieldManager::getField(TVector3(0, 0, 0)).Z() / Unit::T;
128  B2DEBUG(20, "B Field = " << bField << " T");
131  try {
132  rvf.addTrack(tfr1Ptr);
133  rvf.addTrack(tfr2Ptr);
134  } catch (...) {
135  B2DEBUG(20, "Adding tracks to RaveVertexFitter failed.");
136  return false;
137  }
138  if (rvf.fit() == 0) return false;
139  // get vertex from fitting
140  auto vertex = rvf.getPos();
141  // Reset RAVE
143 
144  // Set vertex
145  m_vx = vertex.X();
146  m_vy = vertex.Y();
147  m_vz = vertex.Z();
148  B2DEBUG(20, "Vertex = (" << m_vx
149  << ", " << m_vy
150  << ", " << m_vz
151  << ")");
152 
153  // Set track containers
154  DBObjPtr<BeamSpot> beamSpotDB; // beam spot is required to correct d0/z0
155  auto ip = beamSpotDB->getIPPosition();
156  if (tfr1Ptr->getChargeSign() > 0) {
157  m_track_p.setValues(*recoTracks[0], ip, recoTracksName, pxdInterceptsName, pxdTrackClustersName);
158  m_track_m.setValues(*recoTracks[1], ip, recoTracksName, pxdInterceptsName, pxdTrackClustersName);
159  } else {
160  m_track_p.setValues(*recoTracks[1], ip, recoTracksName, pxdInterceptsName, pxdTrackClustersName);
161  m_track_m.setValues(*recoTracks[0], ip, recoTracksName, pxdInterceptsName, pxdTrackClustersName);
162  }
163  return true;
164  }
166 } // end namespace Belle2
Belle2::BFieldManager::getField
static void getField(const double *pos, double *field)
return the magnetic field at a given position.
Definition: BFieldManager.h:110
Belle2::PXD2TrackBase::getVertex
TVector3 getVertex() const
Get the vertex.
Definition: PXD2TrackBase.h:77
Belle2::PXD2TrackBase::getTrackM
const T & getTrackM() const
Get the track with negative charge.
Definition: PXD2TrackBase.h:87
Belle2::analysis::RaveVertexFitter::getPos
TVector3 getPos(VecSize vertexId=0) const
get the position of the fitted vertex.
Definition: RaveVertexFitter.cc:169
Belle2::PXD2TrackBase::setValues
virtual bool setValues(const StoreArray< RecoTrack > &recoTracks, const std::string recoTracksName="", const std::string pxdInterceptsName="", const std::string pxdTrackClustersName="PXDClustersFromTracks")
Set values from RecoTrack collection.
Definition: PXD2TrackBase.h:108
Belle2::PXD2TrackBase::m_vx
float m_vx
Position of the vertex in x.
Definition: PXD2TrackBase.h:98
Belle2::PXD2TrackBase::m_track_p
T m_track_p
Track with the positive charge.
Definition: PXD2TrackBase.h:101
Belle2::analysis::RaveSetup::initialize
static void initialize(int verbosity=1, double MagneticField=1.5)
Set everything up so everything needed for vertex fitting is there.
Definition: RaveSetup.cc:35
Belle2::PXD2TrackBase::m_track_m
T m_track_m
Track with the negative charge.
Definition: PXD2TrackBase.h:102
Belle2::PXD2TrackBase::m_vy
float m_vy
Position of the vertex in y.
Definition: PXD2TrackBase.h:99
Belle2::Const::pion
static const ChargedStable pion
charged pion particle
Definition: Const.h:535
Belle2::Unit::T
static const double T
[tesla]
Definition: Unit.h:130
Belle2::PXD2TrackBase::getTrackP
const T & getTrackP() const
Get the track with positive charge.
Definition: PXD2TrackBase.h:82
Belle2::Track::getTrackFitResultWithClosestMass
const TrackFitResult * getTrackFitResultWithClosestMass(const Const::ChargedStable &requestedType) const
Return the track fit for a fit hypothesis with the closest mass.
Definition: Track.cc:70
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::analysis::RaveVertexFitter::addTrack
void addTrack(const Particle *const aParticlePtr)
add a track (in the format of a Belle2::Particle) to set of tracks that should be fitted to a vertex
Definition: RaveVertexFitter.cc:87
Belle2::analysis::RaveSetup::reset
void reset()
frees memory allocated by initialize().
Definition: RaveSetup.cc:60
Belle2::StoreArray::isValid
bool isValid() const
Check wether the array was registered.
Definition: StoreArray.h:298
Belle2::PXD2TrackBase
Class PXD2TrackBase: Event data container for performance and calibration studies.
Definition: PXD2TrackBase.h:49
Belle2::RelationsObject
RelationsInterface< TObject > RelationsObject
Provides interface for getting/adding relations to objects in StoreArrays.
Definition: RelationsObject.h:443
Belle2::PXD2TrackBase::PXD2TrackBase
PXD2TrackBase()
default constructor for ROOT
Definition: PXD2TrackBase.h:57
Belle2::PXD2TrackBase::m_vz
float m_vz
Position of the vertex in z.
Definition: PXD2TrackBase.h:100
Belle2::analysis::RaveVertexFitter::fit
int fit(std::string options="default")
do the vertex fit with all tracks previously added with the addTrack or addMother function.
Definition: RaveVertexFitter.cc:121
Belle2::Track
Class that bundles various TrackFitResults.
Definition: Track.h:35
Belle2::StoreArray
Accessor to arrays stored in the data store.
Definition: ECLMatchingPerformanceExpertModule.h:33
Belle2::analysis::RaveVertexFitter
The RaveVertexFitter class is part of the RaveInterface together with RaveSetup.
Definition: RaveVertexFitter.h:46
Belle2::StoreArray::getEntries
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:226
Belle2::PXD2TrackBase::baseType
T baseType
The base type for a track structure.
Definition: PXD2TrackBase.h:54
Belle2::analysis::RaveSetup::getInstance
static RaveSetup * getInstance()
get the pointer to the instance to get/set any of options stored in RaveSetup
Definition: RaveSetup.h:45