109 {
110
111
112 if (!recoTracks.isValid() or recoTracks.getEntries() != 2) return false;
113
114
115 auto track1Ptr = recoTracks[0]->getRelated<Track>("Tracks");
116 auto track2Ptr = recoTracks[1]->getRelated<Track>("Tracks");
117 if (!track1Ptr or !track2Ptr) return false;
118
119
120 auto tfr1Ptr = track1Ptr->getTrackFitResultWithClosestMass(Const::pion);
121 auto tfr2Ptr = track2Ptr->getTrackFitResultWithClosestMass(Const::pion);
122 if (!tfr1Ptr or !tfr2Ptr) return false;
123
124
125 if (tfr1Ptr->getPValue() <= 0 or tfr2Ptr->getPValue() <= 0) return false;
126
127
128 if (tfr1Ptr->getChargeSign() * tfr2Ptr->getChargeSign() >= 0) return false;
129
130
131 auto bField = BFieldManager::getFieldInTesla(ROOT::Math::XYZVector(0, 0, 0)).Z();
132 B2DEBUG(20, "B Field = " << bField << " T");
133 analysis::RaveSetup::initialize(1, bField);
134 analysis::RaveVertexFitter rvf;
135 try {
136 rvf.addTrack(tfr1Ptr);
137 rvf.addTrack(tfr2Ptr);
138 } catch (...) {
139 B2DEBUG(20, "Adding tracks to RaveVertexFitter failed.");
140 return false;
141 }
142 if (rvf.fit() == 0) return false;
143
144 auto vertex = rvf.getPos();
145
146 analysis::RaveSetup::getInstance()->reset();
147
148
149 m_vx = vertex.X();
150 m_vy = vertex.Y();
151 m_vz = vertex.Z();
152 B2DEBUG(20, "Vertex = (" << m_vx
153 << ", " << m_vy
154 << ", " << m_vz
155 << ")");
156
157
158 DBObjPtr<BeamSpot> beamSpotDB;
159 auto ip = ROOT::Math::XYZVector(beamSpotDB->getIPPosition());
160 if (tfr1Ptr->getChargeSign() > 0) {
161 m_track_p.setValues(*recoTracks[0], ip, recoTracksName, pxdInterceptsName, pxdTrackClustersName);
162 m_track_m.setValues(*recoTracks[1], ip, recoTracksName, pxdInterceptsName, pxdTrackClustersName);
163 } else {
164 m_track_p.setValues(*recoTracks[1], ip, recoTracksName, pxdInterceptsName, pxdTrackClustersName);
165 m_track_m.setValues(*recoTracks[0], ip, recoTracksName, pxdInterceptsName, pxdTrackClustersName);
166 }
167 return true;
168 }