10 #include <analysis/VertexFitting/RaveInterface/RaveVertexFitter.h> 
   11 #include <analysis/VertexFitting/RaveInterface/RaveSetup.h> 
   12 #include <mdst/dataobjects/Track.h> 
   14 #include <rave/VertexFactory.h> 
   17 #include <Math/ProbFunc.h> 
   18 #include <Math/Vector3D.h> 
   19 #include <Math/Vector4D.h> 
   26 using namespace analysis;
 
   34     B2FATAL(
"RaveSetup::initialize was not called. It has to be called before RaveSetup or RaveVertexFitter are used");
 
   45     B2FATAL(
"RaveSetup::initialize was not called. It has to be called before RaveSetup or RaveVertexFitter are used");
 
   70   rave::Vector6D ravestate(pos.
X(), pos.
Y(), pos.
Z(),
 
   71                            mom.
X(), mom.
Y(), mom.
Z());
 
   73   rave::Covariance6D ravecov(cov(0, 0), cov(1, 0), cov(2, 0),
 
   74                              cov(1, 1), cov(2, 1), cov(2, 2),
 
   75                              cov(3, 0), cov(4, 0), cov(5, 0),
 
   76                              cov(3, 1), cov(4, 1), cov(5, 1),
 
   77                              cov(3, 2), cov(4, 2), cov(5, 2),
 
   78                              cov(3, 3), cov(4, 3), cov(5, 3),
 
   79                              cov(4, 4), cov(5, 4), cov(5, 5));
 
   81   return rave::Track(
id, ravestate, ravecov, rave::Charge(aTrackPtr->
getChargeSign()), 1,
 
   90   const ROOT::Math::XYZVector& pos = aParticlePtr->
getVertex();
 
   91   const ROOT::Math::XYZVector& mom = aParticlePtr->
getMomentum();
 
   92   rave::Vector6D ravestate(pos.X(), pos.Y(), pos.Z(), mom.X(), mom.Y(), mom.Z());
 
   96   rave::Covariance6D ravecov(cov(4, 4), cov(4, 5), cov(4, 6),
 
   97                              cov(5, 5), cov(5, 6), cov(6, 6),
 
   98                              cov(0, 4), cov(1, 4), cov(2, 4),
 
   99                              cov(0, 5), cov(1, 5), cov(2, 5),
 
  100                              cov(0, 6), cov(1, 6), cov(2, 6),
 
  101                              cov(0, 0), cov(0, 1), cov(0, 2),
 
  102                              cov(1, 1), cov(1, 2), cov(2, 2));
 
  105   m_raveTracks.emplace_back(
id, ravestate, ravecov, rave::Charge(aParticlePtr->
getCharge() + 0.1), 1, 1);
 
  112   vector<Particle*> daughters = aMotherParticlePtr->
getDaughters();
 
  114   int nDaughters = daughters.size();
 
  115   for (
int i = 0; i not_eq nDaughters; ++i) {
 
  125   if (options == 
"default") {
 
  138   int nOfVertices = -100;
 
  143     const rave::Covariance3D bsCovRave(bsCov(0, 0), bsCov(0, 1), bsCov(0, 2), bsCov(1, 1), bsCov(1, 2), bsCov(2, 2));
 
  159     B2ERROR(
"There is no fitted Vertex. Maybe you did not call fit() or maybe the fit was not successful");
 
  163     B2ERROR(
"The Vertex id " << vertexId << 
" does not correspond to any fitted vertex");
 
  183   const std::vector < std::pair < float, rave::Track > >& weightedTracks = 
m_raveVertices[vertexId].weightedTracks();
 
  184   for (
unsigned int i = 0; i not_eq weightedTracks.size(); ++i) {
 
  185     if (weightedTracks[i].second.id() == trackId) {
 
  187       return weightedTracks[i].first;
 
  197   const std::vector < std::pair < float, rave::Track > >& weightedTracks = 
m_raveVertices[vertexId].weightedTracks();
 
  198   const int n = weightedTracks.size();
 
  199   vector<int> trackIds(n);
 
  200   for (
int i = 0; i not_eq n; ++i) {
 
  201     trackIds[i] = weightedTracks[i].second.id();
 
  241   Cov(1, 0) = Cov(0, 1);
 
  242   Cov(2, 1) = Cov(1, 2);
 
  243   Cov(2, 0) = Cov(0, 2);
 
  253     B2ERROR(
"RaveVertexFitter: Daughters update works only with a single vertex");
 
  258     B2WARNING(
"RaveVertexFitter: Fitted vertex has no refitted tracks");
 
  264   for (
unsigned int i = 0; i < rTracks.size(); i++) {
 
  266     const rave::Point3D fittedV = rtrk.position();
 
  267     const rave::Vector3D fittedP = rtrk.momentum();
 
  268     const rave::Covariance6D& fittedCov = rtrk.error();
 
  270     ROOT::Math::XYZVector x3(fittedV.x(), fittedV.y(), fittedV.z());
 
  272     ROOT::Math::PxPyPzEVector p4(fittedP.x(), fittedP.y(), fittedP.z(), fittedE);
 
  274     TMatrixDSym fitted7CovPart = 
m_belleDaughters[i]->getMomentumVertexErrorMatrix() ;
 
  277     TMatrixDSym fitted7CovM(7);
 
  278     fitted7CovM(0, 0) = fittedCov.dpxpx();    fitted7CovM(0, 0) = fitted7CovM(0, 0);
 
  279     fitted7CovM(0, 1) = fittedCov.dpxpy();    fitted7CovM(1, 0) = fitted7CovM(0, 1);
 
  280     fitted7CovM(0, 2) = fittedCov.dpxpz();    fitted7CovM(2, 0) = fitted7CovM(0, 2);
 
  281     fitted7CovM(0, 3) = fitted7CovPart(0, 3); fitted7CovM(3, 0) = fitted7CovM(0, 3);
 
  282     fitted7CovM(0, 4) = fittedCov.dxpx();     fitted7CovM(4, 0) = fitted7CovM(0, 4);
 
  283     fitted7CovM(0, 5) = fittedCov.dypx();     fitted7CovM(5, 0) = fitted7CovM(0, 5);
 
  284     fitted7CovM(0, 6) = fittedCov.dzpx();     fitted7CovM(6, 0) = fitted7CovM(0, 6);
 
  286     fitted7CovM(1, 1) = fittedCov.dpypy();    fitted7CovM(1, 1) = fitted7CovM(1, 1);
 
  287     fitted7CovM(1, 2) = fittedCov.dpypz();    fitted7CovM(2, 1) = fitted7CovM(1, 2);
 
  288     fitted7CovM(1, 3) = fitted7CovPart(1, 3); fitted7CovM(3, 1) = fitted7CovM(1, 3);
 
  289     fitted7CovM(1, 4) = fittedCov.dxpy();     fitted7CovM(4, 1) = fitted7CovM(1, 4);
 
  290     fitted7CovM(1, 5) = fittedCov.dypy();     fitted7CovM(5, 1) = fitted7CovM(1, 5);
 
  291     fitted7CovM(1, 6) = fittedCov.dzpy();     fitted7CovM(6, 1) = fitted7CovM(1, 6);
 
  293     fitted7CovM(2, 2) = fittedCov.dpzpz();    fitted7CovM(2, 2) = fitted7CovM(2, 2);
 
  294     fitted7CovM(2, 3) = fitted7CovPart(2, 3); fitted7CovM(3, 2) = fitted7CovM(2, 3);
 
  295     fitted7CovM(2, 4) = fittedCov.dxpz();     fitted7CovM(4, 2) = fitted7CovM(2, 4);
 
  296     fitted7CovM(2, 5) = fittedCov.dypz();     fitted7CovM(5, 2) = fitted7CovM(2, 5);
 
  297     fitted7CovM(2, 6) = fittedCov.dzpz();     fitted7CovM(6, 2) = fitted7CovM(2, 6);
 
  299     fitted7CovM(3, 3) = fitted7CovPart(3, 3); fitted7CovM(3, 3) = fitted7CovM(3, 3);
 
  300     fitted7CovM(3, 4) = fitted7CovPart(3, 4); fitted7CovM(4, 3) = fitted7CovM(3, 4);
 
  301     fitted7CovM(3, 5) = fitted7CovPart(3, 5); fitted7CovM(5, 3) = fitted7CovM(3, 5);
 
  302     fitted7CovM(3, 6) = fitted7CovPart(3, 6); fitted7CovM(6, 3) = fitted7CovM(3, 6);
 
  304     fitted7CovM(4, 4) = fittedCov.dxx();      fitted7CovM(4, 4) = fitted7CovM(4, 4);
 
  305     fitted7CovM(4, 5) = fittedCov.dxy();      fitted7CovM(5, 4) = fitted7CovM(4, 5);
 
  306     fitted7CovM(4, 6) = fittedCov.dxz();      fitted7CovM(6, 4) = fitted7CovM(4, 6);
 
  308     fitted7CovM(5, 5) = fittedCov.dyy();      fitted7CovM(5, 5) = fitted7CovM(5, 5);
 
  309     fitted7CovM(5, 6) = fittedCov.dyz();      fitted7CovM(6, 5) = fitted7CovM(5, 6);
 
  311     fitted7CovM(6, 6) = fittedCov.dzz();      fitted7CovM(6, 6) = fitted7CovM(6, 6);
 
DataType Z() const
access variable Z (= .at(2) without boundary check)
DataType X() const
access variable X (= .at(0) without boundary check)
DataType Y() const
access variable Y (= .at(1) without boundary check)
Class to store reconstructed particles.
ROOT::Math::XYZVector getVertex() const
Returns vertex position (POCA for charged, IP for neutral FS particles)
std::vector< Belle2::Particle * > getDaughters() const
Returns a vector of pointers to daughter particles.
double getCharge(void) const
Returns particle charge.
ROOT::Math::XYZVector getMomentum() const
Returns momentum vector.
TMatrixFSym getMomentumVertexErrorMatrix() const
Returns 7x7 error matrix.
Values of the result of a track fit with a given particle hypothesis.
short getChargeSign() const
Return track charge (1 or -1).
TMatrixDSym getCovariance6() const
Position and Momentum Covariance Matrix.
TVector3 getMomentum() const
Getter for vector of momentum at closest approach of track in r/phi projection.
TVector3 getPosition() const
Getter for vector of position at closest approach of track in r/phi projection.
TMatrixDSym m_beamSpotCov
beam spot position covariance matrix.
bool m_useBeamSpot
flag determines if beam spot information should be used for vertex fit.
static RaveSetup * getRawInstance()
Same as getInstance(), but no check if the instance is initialised.
B2Vector3D m_beamSpot
beam spot position.
rave::VertexFactory * m_raveVertexFactory
The RAVE vertex factory is the principal interface offered by the RAVE vertex fitting library.
std::vector< Particle * > m_belleDaughters
Belle Particle pointers input.
~RaveVertexFitter()
Destructor.
TMatrixDSym getCov(VecSize vertexId=0) const
get the covariance matrix (3x3) of the of the fitted vertex position.
bool m_useBeamSpot
flag determines if the beam spot will be used or not.
int fit(std::string options="default")
do the vertex fit with all tracks previously added with the addTrack or addMother function.
std::vector< int >::size_type VecSize
I am using std::vector<int>::size_type because it is the official return value of ....
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
std::vector< int > getTrackIdsForOneVertex(VecSize vertexId=0) const
get the ids of the tracks Rave associated with a specific vertex.
double getNdf(VecSize vertexId=0) const
get the number of degrees of freedom (NDF) of the fitted vertex.
rave::Track TrackFitResultToRaveTrack(const TrackFitResult *const aTrackPtr) const
converts a track from Belle2::TrackFitResult format to rave::Track format
double getChi2(VecSize vertexId=0) const
get the χ² of the fitted vertex.
B2Vector3D getPos(VecSize vertexId=0) const
get the position of the fitted vertex.
std::vector< rave::Vertex > m_raveVertices
holds the fitted vertices after fit() was called in the format used by Rave
void isVertexIdValid(const VecSize vertexId) const
checks if the vertex the user requested via one of the getters it actually there
void initBeamSpotMember()
Initialize m_useBeamSpot.
void updateDaughters()
update the Daughters particles
double getWeight(int trackId, VecSize vertexId=0) const
get the weight Rave assigned to a specific input track.
double getPValue(VecSize vertexId=0) const
get the p value of the fitted vertex.
RaveVertexFitter()
The constructor.
std::vector< rave::Track > m_raveTracks
holds the tracks that were added to a RaveVertexFitter object in the format used by Rave
void addMother(const Particle *const aMotherParticlePtr)
All daughters of the argument of this function will be used as input for the vertex fit.
B2Vector3< double > B2Vector3D
typedef for common usage with double
Abstract base class for different kinds of events.