28 #include <Math/Functions.h>
29 #include <Math/SVector.h>
30 #include <Math/SMatrix.h>
38 const double piMass = 0.13957018;
39 const double piMassSquared = piMass*piMass;
41 const double protonMassSquared = protonMass*
protonMass;
42 const double kShortMass = 0.497614;
43 const double lambdaMass = 1.115683;
46 typedef ROOT::Math::SMatrix<double, 3, 3, ROOT::Math::MatRepSym<double, 3> >
SMatrixSym3D;
47 typedef ROOT::Math::SVector<double, 3>
SVector3;
94 if (!theTrackHandle->size())
return;
106 referenceVtx = vertices->at(0);
107 referencePos = referenceVtx.position();
114 std::vector<reco::TrackRef> theTrackRefs;
115 std::vector<reco::TransientTrack> theTransTracks;
118 for (reco::TrackCollection::const_iterator iTk = theTrackCollection->begin(); iTk != theTrackCollection->end(); ++iTk) {
126 theTrackRefs.push_back(
std::move(tmpRef));
128 theTransTracks.push_back(
std::move(tmpTransient));
134 for (
unsigned int trdx1 = 0; trdx1 < theTrackRefs.size(); ++trdx1) {
135 for (
unsigned int trdx2 = trdx1 + 1; trdx2 < theTrackRefs.size(); ++trdx2) {
142 if (theTrackRefs[trdx1]->
charge() < 0. && theTrackRefs[trdx2]->charge() > 0.) {
143 negativeTrackRef = theTrackRefs[trdx1];
144 positiveTrackRef = theTrackRefs[trdx2];
145 negTransTkPtr = &theTransTracks[trdx1];
146 posTransTkPtr = &theTransTracks[trdx2];
147 }
else if (theTrackRefs[trdx1]->
charge() > 0. && theTrackRefs[trdx2]->charge() < 0.) {
148 negativeTrackRef = theTrackRefs[trdx2];
149 positiveTrackRef = theTrackRefs[trdx1];
150 negTransTkPtr = &theTransTracks[trdx2];
151 posTransTkPtr = &theTransTracks[trdx1];
162 if (!cApp.
status())
continue;
168 if (
sqrt(cxPt.
x()*cxPt.
x() + cxPt.
y()*cxPt.
y()) > 120. ||
std::abs(cxPt.
z()) > 300.)
continue;
178 double totalESq = totalE*totalE;
180 double mass =
sqrt(totalESq - totalPSq);
184 std::vector<reco::TransientTrack> transTracks;
185 transTracks.reserve(2);
186 transTracks.push_back(*posTransTkPtr);
187 transTracks.push_back(*negTransTkPtr);
193 theRecoVertex = theKalmanFitter.
vertex(transTracks);
197 theRecoVertex = theAdaptiveFitter.
vertex(transTracks);
199 if (!theRecoVertex.
isValid())
continue;
208 SVector3 distVecXY(vtxPos.x()-referencePos.x(), vtxPos.y()-referencePos.y(), 0.);
209 double distMagXY = ROOT::Math::Mag(distVecXY);
210 double sigmaDistMagXY =
sqrt(ROOT::Math::Similarity(totalCov, distVecXY)) / distMagXY;
214 SVector3 distVecXYZ(vtxPos.x()-referencePos.x(), vtxPos.y()-referencePos.y(), vtxPos.z()-referencePos.z());
215 double distMagXYZ = ROOT::Math::Mag(distVecXYZ);
216 double sigmaDistMagXYZ =
sqrt(ROOT::Math::Similarity(totalCov, distVecXYZ)) / distMagXYZ;
222 double posTkHitPosD2 = (posTkHitPos.x()-referencePos.x())*(posTkHitPos.x()-referencePos.x()) +
223 (posTkHitPos.y()-referencePos.y())*(posTkHitPos.y()-referencePos.y());
228 double negTkHitPosD2 = (negTkHitPos.x()-referencePos.x())*(negTkHitPos.x()-referencePos.x()) +
229 (negTkHitPos.y()-referencePos.y())*(negTkHitPos.y()-referencePos.y());
233 std::auto_ptr<TrajectoryStateClosestToPoint> trajPlus;
234 std::auto_ptr<TrajectoryStateClosestToPoint> trajMins;
235 std::vector<reco::TransientTrack> theRefTracks;
243 for (std::vector<reco::TransientTrack>::iterator iTrack = theRefTracks.begin(); iTrack != theRefTracks.end(); ++iTrack) {
244 if (iTrack->track().charge() > 0.) {
245 thePositiveRefTrack = &*iTrack;
246 }
else if (iTrack->track().charge() < 0.) {
247 theNegativeRefTrack = &*iTrack;
250 if (thePositiveRefTrack == 0 || theNegativeRefTrack == 0)
continue;
258 if (trajPlus.get() == 0 || trajMins.get() == 0 || !trajPlus->isValid() || !trajMins->isValid())
continue;
265 double dx = theVtx.
x()-referencePos.x();
266 double dy = theVtx.
y()-referencePos.y();
267 double px = totalP.x();
268 double py = totalP.y();
269 double angleXY = (dx*px+dy*py)/(
sqrt(dx*dx+dy*dy)*
sqrt(px*px+py*py));
273 double dz = theVtx.
z()-referencePos.z();
274 double pz = totalP.z();
275 double angleXYZ = (dx*px+dy*py+dz*pz)/(
sqrt(dx*dx+dy*dy+dz*dz)*
sqrt(px*px+py*py+pz*pz));
279 double piPlusE =
sqrt(positiveP.mag2() + piMassSquared);
280 double piMinusE =
sqrt(negativeP.mag2() + piMassSquared);
281 double protonE =
sqrt(positiveP.mag2() + protonMassSquared);
282 double antiProtonE =
sqrt(negativeP.mag2() + protonMassSquared);
283 double kShortETot = piPlusE + piMinusE;
284 double lambdaEtot = protonE + piMinusE;
285 double lambdaBarEtot = antiProtonE + piPlusE;
294 double vtxChi2(theVtx.
chi2());
295 double vtxNdof(theVtx.
ndof());
306 if (positiveP.mag2() > negativeP.mag2()) {
316 thePiPlusCand.
setTrack(positiveTrackRef);
320 thePiMinusCand.
setTrack(negativeTrackRef);
324 theProtonCand.
setTrack(positiveTrackRef);
328 theAntiProtonCand.
setTrack(negativeTrackRef);
333 theKshort->addDaughter(thePiPlusCand);
334 theKshort->addDaughter(thePiMinusCand);
335 theKshort->setPdgId(310);
336 addp4.
set(*theKshort);
338 theKshorts.push_back(
std::move(*theKshort));
345 addp4.
set( *theLambda );
347 theLambdas.push_back(
std::move(*theLambda));
353 addp4.
set(*theLambdaBar);
355 theLambdas.push_back(
std::move(*theLambdaBar));
362 theKshort = theLambda = theLambdaBar =
nullptr;
T getParameter(std::string const &) const
std::vector< VertexCompositeCandidate > VertexCompositeCandidateCollection
collection of Candidate objects
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepSym< double, 3 > > SMatrixSym3D
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
TrajectoryStateClosestToPoint impactPointTSCP() const
const FreeTrajectoryState & theState() const
double dxyError() const
error on dxy
edm::EDGetTokenT< std::vector< reco::Vertex > > token_vertices
double y() const
y coordinate
virtual void setPdgId(int pdgId) final
virtual CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &tracks) const
std::vector< Track > TrackCollection
collection of Tracks
PreciseFloatType< T, U >::Type dot(const Vector3DBase< U, FrameTag > &v) const
double covariance(int i, int j) const
(i, j)-th element of error matrix, i, j = 0, ... 2
bool hasRefittedTracks() const
double vtxDecaySigXYZCut_
math::Error< dimension >::type CovarianceMatrix
covariance error matrix (3x3)
virtual GlobalPoint crossingPoint() const
edm::EDGetTokenT< reco::TrackCollection > token_tracks
double pt() const
track transverse momentum
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
virtual CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &) const
math::XYZPoint Point
point in the space
Abs< T >::type abs(const T &t)
double chi2() const
chi-squares
double z() const
y coordinate
void fitAll(const edm::Event &iEvent, const edm::EventSetup &iSetup, reco::VertexCompositeCandidateCollection &k, reco::VertexCompositeCandidateCollection &l)
math::XYZPoint Point
point in the space
unsigned short numberOfValidHits() const
number of valid hits found
V0Fitter(const edm::ParameterSet &theParams, edm::ConsumesCollector &&iC)
virtual double mass() const final
mass
void addDaughter(const Candidate &, const std::string &s="")
add a clone of the passed candidate as daughter
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
double dzError() const
error on dz
double x() const
x coordinate
virtual bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb)
T const * product() const
XYZPointD XYZPoint
point in space with cartesian internal representation
TrajectoryStateClosestToPoint trajectoryStateClosestToPoint(const GlobalPoint &point) const
T const * product() const
const Point & position() const
position
edm::EDGetTokenT< reco::BeamSpot > token_beamSpot
std::vector< reco::TransientTrack > const & refittedTracks() const
void set(reco::Candidate &c) const
set up a candidate
double normalizedChi2() const
chi-squared divided by n.d.o.f.
Covariance3DMatrix rotatedCovariance3D() const
ROOT::Math::SVector< double, 3 > SVector3
void setTrack(const reco::TrackRef &r)
set reference to track
virtual float distance() const
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
math::XYZTLorentzVector LorentzVector
Lorentz vector.
virtual bool status() const
GlobalVector momentum() const