3 #define cnst static const fvec
21 #ifdef NonhomogeniousField
22 vector<L1FieldRegion>& vField,
24 vector<KFParticle>& Particles,
29 static const int NTrackTypes = 8;
31 int pdgPos[NTrackTypes]={-11,-13, 211, 321, 2212, 211, 321, 2212};
32 int pdgNeg[NTrackTypes]={ 11, 13,-211,-321,-2212, -211,-321,-2212};
34 vector<short> idPosSec[NTrackTypes];
35 vector<short> idNegSec[NTrackTypes];
37 vector<short> idPosPrim[NTrackTypes];
38 vector<short> idNegPrim[NTrackTypes];
40 for(
unsigned short iTr=0; iTr < vRTracks.size(); iTr++)
44 for(
unsigned short iT=0; iT<6; iT++)
45 ok = ok && finite(kfTrack.
GetTrack()[iT]);
46 for(
unsigned short iC=0; iC<21; iC++)
56 const int pdg = abs(vTrackPDG[iTr]);
61 case 11: pdgIndex = 0;
break;
62 case 13: pdgIndex = 1;
break;
63 case 211: pdgIndex = 2;
break;
64 case 321: pdgIndex = 3;
break;
65 case 2212: pdgIndex = 4;
break;
69 short pdgIndexMax = pdgIndex+incr;
74 pdgIndexMax = pdgIndex;
84 if( ChiToPrimVtx[iTr] < cuts[0][0] )
88 for(
int ipdg = pdgIndex; ipdg<=pdgIndexMax; ipdg+=incr )
92 for(
int ipdg = pdgIndex; ipdg<=pdgIndexMax; ipdg+=incr )
98 for(
int ipdg = pdgIndex; ipdg<=pdgIndexMax; ipdg+=incr )
101 for(
int ipdg = pdgIndex; ipdg<=pdgIndexMax; ipdg+=incr )
106 const int nPart = idPosSec[5].size() * idNegSec[5].size()+
107 idPosSec[5].size() * idNegSec[7].size()+
108 idPosSec[7].size() * idNegSec[5].size()+
109 idPosPrim[2].size() * idNegPrim[3].size() +
110 idPosPrim[3].size() * idNegPrim[2].size() +
111 idPosPrim[3].size() * idNegPrim[3].size() +
112 idPosPrim[4].size() * idNegPrim[3].size() +
113 idPosPrim[3].size() * idNegPrim[4].size() +
114 idPosPrim[0].size() * idNegPrim[0].size() +
115 idPosPrim[1].size() * idNegPrim[1].size();
118 Particles.reserve(vRTracks.size() + nPart);
120 const float massLambdaPDG = 1.115683;
121 const float massK0sPDG = 0.497614;
122 const float massXiPDG = 1.32171;
124 #if defined(PANDA_STT) || defined(PANDA_FTS)
125 const float massLambdaSigma=3.7e-3;
126 const float massK0sSigma=2.2e-3;
127 const float massXiSigma=2.e-3;
130 const float massLambdaSigma=5.9e-3;
131 const float massK0sSigma=17.7e-3;
132 const float massXiSigma=7.3e-3;
135 const float massLambdaSigma=5.9e-3;
136 const float massK0sSigma=17.7e-3;
137 const float massXiSigma=7.3e-3;
140 for(
unsigned short iTr=0; iTr < vRTracks.size(); iTr++) {
145 tmp.
SetId(Particles.size());
148 Particles.push_back(tmp);
151 vector<float> vLambdaTopoChi2Ndf;
152 vector<KFParticle> vLambdaSec;
153 vector<KFParticle> vLambdaPrim;
155 vector<float> vLambdaBarTopoChi2Ndf;
156 vector<KFParticle> vLambdaBarSec;
157 vector<KFParticle> vLambdaBarPrim;
159 vector<float> vK0sTopoChi2Ndf;
160 vector<KFParticle> vK0sPrim;
162 vector<KFParticle> vXiPrim;
163 vector<KFParticle> vXiSec;
164 vector<KFParticle> vXiBarPrim;
166 vector<KFParticle> vXiStarPrim;
167 vector<KFParticle> vXiStarBarPrim;
169 const float SecCuts[3] = {3.f,5.f,5.f};
175 #ifdef NonhomogeniousField
178 Particles, pdgNeg[5], pdgPos[5], 310,
179 idNegSec[5], idPosSec[5], PrimVtx, cuts[0], 0, &vK0sTopoChi2Ndf,
180 SecCuts, massK0sPDG, massK0sSigma, &vK0sPrim, 0);
183 #ifdef NonhomogeniousField
186 Particles, pdgNeg[5], pdgPos[7], 3122,
187 idNegSec[5], idPosSec[7], PrimVtx, cuts[1], 0,&vLambdaTopoChi2Ndf,
188 SecCuts, massLambdaPDG, massLambdaSigma, &vLambdaPrim, &vLambdaSec);
191 #ifdef NonhomogeniousField
194 Particles, pdgPos[5], pdgNeg[4], -3122,
195 idPosSec[5], idNegSec[4], PrimVtx, cuts[1], 0, &vLambdaBarTopoChi2Ndf,
196 SecCuts, massLambdaPDG, massLambdaSigma, &vLambdaBarPrim, &vLambdaBarSec);
199 #ifdef NonhomogeniousField
202 Particles, pdgPos[3], pdgNeg[2], 313,
203 idPosPrim[3], idNegPrim[2], PrimVtx, cuts[1], 1);
206 #ifdef NonhomogeniousField
209 Particles, pdgNeg[3], pdgPos[2], -313,
210 idNegPrim[3], idPosPrim[2], PrimVtx, cuts[1], 1);
213 #ifdef NonhomogeniousField
216 Particles, pdgNeg[3], pdgPos[4], 3124,
217 idNegPrim[3], idPosPrim[4], PrimVtx, cuts[1], 1);
220 #ifdef NonhomogeniousField
223 Particles, pdgNeg[4], pdgPos[3], -3124,
224 idNegPrim[4], idPosPrim[3], PrimVtx, cuts[1], 1);
227 #ifdef NonhomogeniousField
230 Particles, pdgNeg[3], pdgPos[3], 333,
231 idNegPrim[3], idPosPrim[3], PrimVtx, cuts[1], 1);
238 #ifdef NonhomogeniousField
241 Particles, pdgNeg[0], pdgPos[0], 22,
242 idNegPrim[0], idPosPrim[0], PrimVtx, cuts[1], 1);
244 #ifdef NonhomogeniousField
247 Particles, pdgNeg[0], pdgPos[0], 22,
248 idNegSec[0], idPosSec[0], PrimVtx, cuts[1], 0);
250 #ifdef NonhomogeniousField
253 Particles, pdgNeg[0], pdgPos[0], 22,
254 idNegSec[0], idPosPrim[0], PrimVtx, cuts[1], 0);
256 #ifdef NonhomogeniousField
259 Particles, pdgNeg[0], pdgPos[0], 22,
260 idNegPrim[0], idPosSec[0], PrimVtx, cuts[1], 0);
263 #ifdef NonhomogeniousField
266 Particles, pdgNeg[0], pdgPos[0], 443,
267 idNegPrim[0], idPosPrim[0], PrimVtx, cuts[1], 1, 1.
f);
270 #ifdef NonhomogeniousField
273 Particles, pdgNeg[1], pdgPos[1], 100443,
274 idNegPrim[1], idPosPrim[1], PrimVtx, cuts[1], 1, 1.
f);
277 #ifdef NonhomogeniousField
280 Particles, pdgNeg[0], pdgPos[0], 100113,
281 idNegPrim[0], idPosPrim[0], PrimVtx, cuts[1], 1, 0.2
f);
283 const float PCut = 1.f;
285 #ifdef NonhomogeniousField
288 Particles, pdgNeg[1], pdgPos[1], 200113,
289 idNegPrim[1], idPosPrim[1], PrimVtx, cuts[1], 1, 0.2
f, -100, 0, &PCut);
296 float cutXi[3] = {10.,5.,6.};
299 #ifdef NonhomogeniousField
302 pdgNeg[5], idNegSec[5],
303 PrimVtx, cutXi, 0, 0, &vXiPrim, massXiPDG, massXiSigma );
306 float cutLL[3] = {10.,10000000.,3.};
307 float cutLL2[3] = {10.,3.,3.};
308 vector<KFParticle> vLL;
310 #ifdef NonhomogeniousField
313 pdgNeg[5], idNegSec[5],
314 PrimVtx, cutLL, 0, &ChiToPrimVtx);
318 #ifdef NonhomogeniousField
321 pdgPos[4], idPosSec[4],
322 PrimVtx, cutLL2, 0, &ChiToPrimVtx);
324 float cutXiPlus[3] = {10.,5.,6.};
326 #ifdef NonhomogeniousField
329 pdgPos[5], idPosSec[5],
330 PrimVtx, cutXiPlus, 0, 0, &vXiBarPrim, massXiPDG, massXiSigma);
332 float cutOmega[3] = {10.,3.,3.};
334 #ifdef NonhomogeniousField
337 pdgNeg[6], idNegSec[6],
338 PrimVtx, cutOmega, 0, &ChiToPrimVtx);
340 float cutOmegaPlus[3] = {10.,3.,3.};
342 #ifdef NonhomogeniousField
345 pdgPos[6], idPosSec[6],
346 PrimVtx, cutOmegaPlus, 0, &ChiToPrimVtx);
348 float cutXiStarMinus[3] = {-100.,10000.,3.};
350 #ifdef NonhomogeniousField
353 pdgNeg[3], idNegPrim[3],
354 PrimVtx, cutXiStarMinus, 1);
356 float cutXiStarPlus[3] = {-100.,10000.,3.};
358 #ifdef NonhomogeniousField
361 pdgPos[3], idPosPrim[3],
362 PrimVtx, cutXiStarPlus, 1);
368 float cutXiStar0[3] = {-100.,10000.,3.};
370 #ifdef NonhomogeniousField
373 pdgPos[5], idPosPrim[5],
374 PrimVtx, cutXiStar0, 1, 0, &vXiStarPrim);
376 float cutXiBarStar0[3] = {-100.,10000.,3.};
378 #ifdef NonhomogeniousField
381 pdgNeg[5], idNegPrim[5],
382 PrimVtx, cutXiBarStar0, 1, 0, &vXiStarBarPrim);
384 const float cutOmegaStar[2] = {-100., 3.};
385 for(
unsigned int iPart=0; iPart<vXiStarPrim.size(); iPart++)
387 #ifdef NonhomogeniousField
390 Particles, vXiStarPrim[iPart], pdgNeg[3],
391 1003334, idNegPrim[3], cutOmegaStar, 0);
393 for(
unsigned int iPart=0; iPart<vXiStarBarPrim.size(); iPart++)
395 #ifdef NonhomogeniousField
398 Particles, vXiStarBarPrim[iPart], pdgPos[3],
399 -1003334, idPosPrim[3], cutOmegaStar, 0);
401 float cutKStarPlus[3] = {-100.,10000.,3.};
403 #ifdef NonhomogeniousField
406 pdgPos[5], idPosPrim[5],
407 PrimVtx, cutKStarPlus, 1, 0);
409 float cutKStarMinus[3] = {-100.,10000.,3.};
411 #ifdef NonhomogeniousField
414 pdgNeg[5], idNegPrim[5],
415 PrimVtx, cutKStarMinus, 1, 0);
417 float cutSigmaStarPlus[3] = {-100.,10000.,3.};
419 #ifdef NonhomogeniousField
422 pdgPos[5], idPosPrim[5],
423 PrimVtx, cutSigmaStarPlus, 1, 0);
425 float cutSigmaStarPlusBar[3] = {-100.,10000.,3.};
427 #ifdef NonhomogeniousField
430 pdgPos[5], idPosPrim[5],
431 PrimVtx, cutSigmaStarPlusBar, 1, 0);
433 float cutSigmaStarMinus[3] = {-100.,10000.,3.};
435 #ifdef NonhomogeniousField
438 pdgNeg[5], idNegPrim[5],
439 PrimVtx, cutSigmaStarMinus, 1, 0);
441 float cutSigmaStarMinusBar[3] = {-100.,10000.,3.};
443 #ifdef NonhomogeniousField
446 pdgNeg[5], idNegPrim[5],
447 PrimVtx, cutSigmaStarMinusBar, 1, 0);
451 vector<KFParticle> vHdibarion;
452 float cutHdb[3] = {3.,3.,3.};
453 for(
unsigned short iL=0; iL < vLambdaSec.size(); iL++)
457 vector<int> daughterIds;
458 for(
unsigned int iD=0; iD<vLambdaSec[iL].DaughterIds().size(); iD++)
459 daughterIds.push_back(vLambdaSec[iL].DaughterIds()[iD]);
460 FindHyperons(3000, vDaughters, daughterIds, vLambdaSec, vHdibarion, PrimVtx, cutHdb, iL+1);
463 for(
unsigned int iH=0; iH<vHdibarion.size(); iH++)
465 vHdibarion[iH].SetId(Particles.size());
466 Particles.push_back(vHdibarion[iH]);
469 const float cutsD[8][8] = {{ 6., 3., 0.04, 0.3, 3.},
470 { 6., 3., 0.04, 0.3, 3.},
471 { 6., 3., 0.04, 0.3, 3.},
472 { 6., 3., 0.04, 0.3, 3.},
473 { 6., 3., 0.04, 0.3, 3.},
474 { 6., 3., -100., 0.3, -100.},
475 { 6., 3., -100., 0.3, -100.},
476 { 6., 3., -100., 0.3, -100.}};
478 const int DMesLambdcDaughterPDG[5] = { 211, -321, -211, 321, 2212 };
479 const int DMesLambdcMotherPDG[8] = { 421, 411, 100421, 431, 4122, 10421, 10411, 20411 };
480 vector<short>* DMesLambdcIdTrack[5] = {&idPosSec[5],
486 #ifdef NonhomogeniousField
489 Particles, DMesLambdcDaughterPDG, DMesLambdcMotherPDG,
490 DMesLambdcIdTrack, PrimVtx, cutsD, ChiToPrimVtx);
492 const int DMesLambdcBarDaughterPDG[5] = { -211, 321, 211, -321, -2212 };
493 const int DMesLambdcBarMotherPDG[8] = { -421, -411, -100421, -431, -4122, -10421, -10411, -20411 };
494 vector<short>* DMesLambdcBarIdTrack[5] = {&idNegSec[5],
500 #ifdef NonhomogeniousField
503 Particles, DMesLambdcBarDaughterPDG, DMesLambdcBarMotherPDG,
504 DMesLambdcBarIdTrack, PrimVtx, cutsD, ChiToPrimVtx);
510 for(
unsigned int iL=0; iL<vParticles.size(); iL +=
fvecLen)
513 unsigned int nPart = vParticles.size();
515 unsigned int nEntries = (iL +
fvecLen < nPart) ?
fvecLen : (nPart - iL);
517 for(
unsigned short iv=0; iv<nEntries; iv++)
518 parts[iv] = &vParticles[iL+iv];
524 for(
unsigned int iv=0; iv<nEntries; iv++)
552 const fvec r2 = dx*dx + dy*dy + dz*
dz;
553 const fvec err2 = c0*dx*dx + c2*dy*dy + c5*dz*dz + 2*( c1*dx*dy + c3*dx*dz + c4*dy*
dz );
559 #ifdef NonhomogeniousField
560 const vector<L1FieldRegion>& vField,
562 vector<KFParticle>& Particles,
563 const int DaughterNegPDG,
564 const int DaughterPosPDG,
566 vector<short>& idNeg,
567 vector<short>& idPos,
571 vector<float>* vMotherTopoChi2Ndf,
572 const float* secCuts,
573 const float massMotherPDG,
574 const float massMotherPDGSigma,
575 vector<KFParticle>* vMotherPrim,
576 vector<KFParticle>* vMotherSec )
578 const int NPositive = idPos.size();
582 mother.
SetPDG( MotherPDG );
586 vector<KFParticleSIMD> posPart(NPosVect);
592 for(
unsigned short iTrP=0; iTrP < NPositive; iTrP +=
fvecLen)
594 const unsigned short NTracks = (iTrP +
fvecLen < NPositive) ?
fvecLen : (NPositive - iTrP);
596 #ifdef NonhomogeniousField
599 for(
unsigned short iv=0; iv<NTracks; iv++)
601 vvPos[iv] = &vTracks[idPos[iTrP+iv]];
602 #ifdef NonhomogeniousField
603 int entrSIMDPos = idPos[iTrP+iv] %
fvecLen;
604 int entrVecPos = idPos[iTrP+iv] /
fvecLen;
605 posField.
SetOneEntry(iv,vField[entrVecPos],entrSIMDPos);
609 posPart[iPosVect].Create(vvPos,NTracks,0,&DaughterPosPDG);
610 #ifdef NonhomogeniousField
611 posPart[iPosVect].SetField(posField);
614 for(
int iv=0; iv<NTracks; iv++)
615 posId[iv] = idPos[iTrP+iv];
616 posPart[iPosVect].SetId(posId);
620 for(
unsigned short iTrN=0; iTrN < idNeg.size(); iTrN++)
622 KFPTrack &kfTrackNeg = vTracks[idNeg[iTrN]];
624 #ifdef NonhomogeniousField
625 int entrSIMD = idNeg[iTrN] %
fvecLen;
626 int entrVec = idNeg[iTrN] /
fvecLen;
627 vDaughters[0].
SetField(vField[entrVec],1,entrSIMD);
629 vDaughters[0].
SetId(idNeg[iTrN]);
631 for(
unsigned short iTrP=0; iTrP < NPositive; iTrP +=
fvecLen)
633 const unsigned short NTracks = (iTrP +
fvecLen < NPositive) ?
fvecLen : (NPositive - iTrP);
635 vDaughters[1] = posPart[iTrP/
fvecLen];
644 const KFParticleSIMD* vDaughtersPointer[2] = {&vDaughters[0], &vDaughters[1]};
645 mother.
Construct(vDaughtersPointer, 2, 0);
649 const KFParticleSIMD* vDaughtersPointer[2] = {&vDaughters[0], &vDaughters[1]};
650 mother.
Construct(vDaughtersPointer, 2, 0);
653 if(vMotherTopoChi2Ndf)
678 for(
int iv=0; iv<NTracks; iv++)
680 if(!finite(mother.
GetChi2()[iv]))
continue;
681 if(!(mother.
GetChi2()[iv] > 0.0f))
continue;
683 fvec l, dl, isParticleFromVertex;
685 if((l/dl)[iv] < cuts[2])
continue;
686 if(isPrimary && ((l/dl)[iv]>3) )
continue;
687 if(!(isParticleFromVertex[iv]))
continue;
691 mother_temp.
SetId(Particles.size());
692 Particles.push_back(mother_temp);
693 float motherTopoChi2Ndf(0);
694 if(vMotherTopoChi2Ndf)
695 motherTopoChi2Ndf = motherTopo.
GetChi2()[iv]/motherTopo.
GetNDF()[iv];
701 mother_temp.
GetMass(mass, errMass);
702 if( (
fabs(mass - massMotherPDG)/massMotherPDGSigma) > secCuts[0] )
continue;
703 if((l/dl)[iv] < secCuts[2])
continue;
707 if( motherTopoChi2Ndf < secCuts[1] )
709 vMotherPrim->push_back(mother_temp);
714 vMotherSec->push_back(mother_temp);
724 #ifdef NonhomogeniousField
725 const vector<L1FieldRegion>& vField,
727 vector<KFParticle>& Particles,
728 const int DaughterNegPDG,
729 const int DaughterPosPDG,
731 vector<short>& idNeg,
732 vector<short>& idPos,
737 const float Chi2PrimCut,
738 vector<float>* ChiToPrimVtx,
741 vector<short> idPosPt;
742 vector<short> idNegPt;
744 for(
unsigned int iEl=0; iEl<idPos.size(); iEl++)
746 KFPTrack& kfTrack = vTracks[idPos[iEl]];
748 float p = kfTrack.
GetP();
750 if(p < *PCut)
continue;
751 if(pt<PtCut)
continue;
753 if(ChiToPrimVtx->at(idPos[iEl]) < Chi2PrimCut)
continue;
754 idPosPt.push_back(idPos[iEl]);
757 for(
unsigned int iEl=0; iEl<idNeg.size(); iEl++)
759 KFPTrack& kfTrack = vTracks[idNeg[iEl]];
761 float p = kfTrack.
GetP();
763 if(p < *PCut)
continue;
764 if(pt<PtCut)
continue;
766 if(ChiToPrimVtx->at(idNeg[iEl]) < Chi2PrimCut)
continue;
767 idNegPt.push_back(idNeg[iEl]);
771 #ifdef NonhomogeniousField
774 Particles, DaughterNegPDG, DaughterPosPDG, MotherPDG,
776 PrimVtx, cuts, isPrimary);
780 vector<KFParticle>& Particles,
781 vector<KFParticle>& vV0,
782 vector<KFPTrack>& vTracks,
783 #ifdef NonhomogeniousField
784 const vector<L1FieldRegion>& vField,
786 const int DaughterPDG,
787 vector<short>& idTrack,
791 vector<float>* ChiToPrimVtx,
792 vector<KFParticle>* vHyperonPrim,
793 float hyperonPrimMass,
794 float hyperonPrimMassErr,
795 vector<KFParticle>* vHyperonSec)
799 hyperon.
SetPDG( MotherPDG );
801 for(
unsigned short iV0=0; iV0 < vV0.size(); iV0++)
803 unsigned short nElements = 0;
807 #ifdef NonhomogeniousField
812 for(
unsigned short iTr=0; iTr < idTrack.size(); iTr++)
816 if( (ChiToPrimVtx->at(idTrack[iTr]) < 7) ) ok=0;
820 trId[nElements] = idTrack[iTr];
821 vvTr[nElements] = &vTracks[idTrack[iTr]];
822 #ifdef NonhomogeniousField
823 int entrSIMD = idTrack[iTr] %
fvecLen;
824 int entrVec = idTrack[iTr] /
fvecLen;
825 field.
SetOneEntry(nElements,vField[entrVec],entrSIMD);
829 else if( (iTr != idTrack.size()-1) )
continue;
831 if( (nElements ==
fvecLen) || ((iTr == idTrack.size()-1)&&(nElements>0)) )
833 vDaughters[1].
Create(vvTr,nElements,0,&DaughterPDG);
834 #ifdef NonhomogeniousField
837 vDaughters[1].
SetId(trId);
846 const KFParticleSIMD* vDaughtersPointer[2] = {&vDaughters[0], &vDaughters[1]};
847 hyperon.
Construct(vDaughtersPointer, 2, 0, -1, 0, 1);
851 const KFParticleSIMD* vDaughtersPointer[2] = {&vDaughters[0], &vDaughters[1]};
852 hyperon.
Construct(vDaughtersPointer, 2, 0);
858 for(
unsigned int iv=0; iv<nElements; iv++)
860 bool isSameTrack = 0;
861 for(
unsigned short iD=0; iD<vV0[iV0].DaughterIds().size(); iD++)
862 if(vV0[iV0].DaughterIds()[iD] == trId[iv]) isSameTrack=1;
864 if(isSameTrack)
continue;
865 if(!finite(hyperon.
GetChi2()[iv]))
continue;
866 if(!(hyperon.
GetChi2()[iv] > 0.0f))
continue;
869 fvec l, dl, isParticleFromVertex;
871 if(!(isParticleFromVertex[iv]))
continue;
874 if(((l/dl)[iv] < cuts[0]) )
continue;
879 if(!(isParticleFromVertex[iv]))
continue;
882 if(hyperonTopo.
GetChi2()[iv]/hyperonTopo.
GetNDF()[iv] > cuts[1] )
continue;
884 if( hyperon.
GetChi2()[iv]/hyperon.
GetNDF()[iv] > cuts[2] )
continue;
887 hyperon_temp.
SetId(Particles.size());
888 Particles.push_back(hyperon_temp);
894 hyperon_temp.
GetMass(mass, errMass);
897 if( (
fabs(mass - hyperonPrimMass)/hyperonPrimMassErr) <= 3 )
898 vHyperonPrim->push_back(hyperon_temp);
901 vHyperonSec->push_back(hyperon_temp);
912 vector<int>& daughterIds,
913 vector<KFParticle>& vLambdaSec,
914 vector<KFParticle>& vHyperon,
920 int nLambdasSec = vLambdaSec.size();
922 for(
unsigned short iL=startIndex; iL < vLambdaSec.size(); iL +=
fvecLen)
924 unsigned int nEntries = (iL +
fvecLen < nLambdasSec) ?
fvecLen : (nLambdasSec - iL);
926 for(
unsigned short iv=0; iv<nEntries; iv++)
927 lambdas[iv] = &vLambdaSec[iL+iv];
934 const KFParticleSIMD* vDaughtersPointer[2] = {&vDaughters[0], &vDaughters[1]};
935 hyperon.
Construct(vDaughtersPointer, 2, 0);
940 for(
unsigned int iv=0; iv<nEntries; iv++)
942 bool isSameTrack = 0;
943 for(
unsigned short iD=0; iD<lambdas[iv]->
DaughterIds().size(); iD++)
944 for(
unsigned short iD0=0; iD0<daughterIds.size(); iD0++)
945 if(lambdas[iv]->DaughterIds()[iD] == daughterIds[iD0]) isSameTrack=1;
947 if(isSameTrack)
continue;
948 if(!finite(hyperon.
GetChi2()[iv]))
continue;
949 if(!(hyperon.
GetChi2()[iv] > 0.0f))
continue;
952 fvec l, dl, isParticleFromVertex;
953 fvec l1, dl1, l2, dl2;
957 if(!(isParticleFromVertex[iv]))
continue;
959 if(((l/dl)[iv] < cuts[0]) )
continue;
960 if(((l1 - l)[iv] < 0) || ((l2 - l)[iv] < 0))
continue;
962 if(hyperonTopo.
GetChi2()[iv]/hyperonTopo.
GetNDF()[iv] > cuts[1] )
continue;
964 if( hyperon.
GetChi2()[iv]/hyperon.
GetNDF()[iv] > cuts[2] )
continue;
967 vHyperon.push_back(hyperon_temp);
973 #ifdef NonhomogeniousField
974 const vector<L1FieldRegion>& vField,
976 vector<KFParticle>& Particles,
977 const int DaughterPDG[5],
978 const int MotherPDG[8],
979 vector<short>* idTrack[5],
981 const float cuts[8][8],
982 vector<float> ChiToPrimVtx)
985 for(
int iId=0; iId<5; iId++)
987 for(
unsigned int iTr=0; iTr<idTrack[iId]->size(); iTr++)
989 KFPTrack& kfTrack = vTracks[idTrack[iId]->at(iTr)];
991 if(pt<cuts[0][3])
continue;
992 if(ChiToPrimVtx[idTrack[iId]->at(iTr)] < cuts[0][0])
continue;
993 id[iId].push_back(idTrack[iId]->at(iTr));
997 vector<KFParticle> kpi;
998 vector<KFParticle> kpipi;
999 vector<KFParticle> kpipipi;
1000 vector<KFParticle> kpik;
1001 vector<KFParticle> kpip;
1003 const float cutskpi[3] = {3., 3., -100.};
1005 #ifdef NonhomogeniousField
1008 kpi, DaughterPDG[0], DaughterPDG[1], MotherPDG[0],
1009 id[0],
id[1], PrimVtx, cutskpi, 0);
1011 for(
unsigned int iKPi=0; iKPi<kpi.size(); iKPi++)
1013 unsigned short startPiIndex = kpi[iKPi].DaughterIds()[0]+1;
1016 #ifdef NonhomogeniousField
1019 kpipi,kpi[iKPi],DaughterPDG[0], MotherPDG[1],
id[0], cuts[1], startPiIndex, 1);
1021 #ifdef NonhomogeniousField
1024 kpik ,kpi[iKPi],DaughterPDG[3], MotherPDG[3],
id[3], cuts[3], 0, 1);
1026 #ifdef NonhomogeniousField
1029 kpip ,kpi[iKPi],DaughterPDG[4], MotherPDG[4],
id[4], cuts[4], 0, 1);
1031 for(
unsigned int iKPiPi=0; iKPiPi<kpipi.size(); iKPiPi++)
1033 #ifdef NonhomogeniousField
1036 kpipipi,kpipi[iKPiPi],DaughterPDG[2], MotherPDG[2],
id[2], cuts[2], 0, 1);
1044 vector<KFParticle> d0pi;
1045 vector<KFParticle> d2pi;
1046 vector<KFParticle> d4pi;
1048 for(
unsigned int iKPiPi=0; iKPiPi<kpipi.size(); iKPiPi++)
1050 #ifdef NonhomogeniousField
1053 d0pi,kpipi[iKPiPi],DaughterPDG[2], MotherPDG[5],
id[2], cuts[5], 0, 0);
1055 for(
unsigned int iKPi=0; iKPi<kpi.size(); iKPi++)
1057 #ifdef NonhomogeniousField
1060 d2pi,kpi[iKPi],DaughterPDG[0], MotherPDG[6],
id[0], cuts[6], 0, 0);
1062 for(
unsigned int iKPiPiPi=0; iKPiPiPi<kpipipi.size(); iKPiPiPi++)
1064 #ifdef NonhomogeniousField
1067 d4pi,kpipipi[iKPiPiPi],DaughterPDG[0], MotherPDG[7],
id[0], cuts[7], 0, 0);
1075 #ifdef NonhomogeniousField
1076 const vector<L1FieldRegion>& vField,
1078 vector<KFParticle>& Particles,
1080 const int DaughterPDG,
1081 const int MotherPDG,
1084 const unsigned short startIndex,
1085 const bool IsSamePart)
1096 const unsigned short NTr =
id.size();
1097 for(
unsigned short iTr=startIndex; iTr < NTr; iTr +=
fvecLen)
1099 const unsigned short NTracks = (iTr +
fvecLen < NTr) ?
fvecLen : (NTr - iTr);
1101 #ifdef NonhomogeniousField
1104 for(
unsigned short iv=0; iv<NTracks; iv++)
1106 vTr[iv] = &vTracks[
id[iTr+iv]];
1107 #ifdef NonhomogeniousField
1108 int entrSIMDPos =
id[iTr+iv] %
fvecLen;
1109 int entrVecPos =
id[iTr+iv] /
fvecLen;
1110 trField.
SetOneEntry(iv,vField[entrVecPos],entrSIMDPos);
1114 vDaughters[1].
Create(vTr,NTracks,0,&DaughterPDG);
1115 #ifdef NonhomogeniousField
1119 for(
int iv=0; iv<NTracks; iv++)
1120 trId[iv] =
id[iTr+iv];
1121 vDaughters[1].
SetId(trId);
1124 mother.
SetPDG( MotherPDG );
1127 mother.
SetVtxGuess(vtxGuess[0], vtxGuess[1], vtxGuess[2]);
1130 const KFParticleSIMD* vDaughtersPointer[2] = {&vDaughters[0], &vDaughters[1]};
1131 mother.
Construct(vDaughtersPointer, 2, 0);
1133 for(
int iv=0; iv<NTracks; iv++)
1135 if(!finite(mother.
GetChi2()[iv]))
continue;
1136 if(!(mother.
GetChi2()[iv] > 0.0f))
continue;
1139 if( mother.
GetChi2()[iv]/mother.
GetNDF()[iv] > cuts[1] )
continue;
1141 bool isSameTrack = 0;
1142 for(
unsigned short iD=0; iD<part.
DaughterIds().size(); iD++)
1143 if(part.
DaughterIds()[iD] ==
id[iTr+iv]) isSameTrack=1;
1144 if(isSameTrack)
continue;
1150 for(
unsigned short iD=0; iD<part.
DaughterIds().size(); iD++)
1152 Particles.push_back(mother_temp);
1158 vector<KFParticle>& vCandidates,
1160 const float cuts[5])
1163 int nCand = vCandidates.size();
1165 for(
unsigned short iC=0; iC < nCand; iC +=
fvecLen)
1167 unsigned int nEntries = (iC +
fvecLen < nCand) ?
fvecLen : (nCand - iC);
1169 for(
unsigned short iv=0; iv<nEntries; iv++)
1170 cand[iv] = &vCandidates[iC+iv];
1176 for(
unsigned int iv=0; iv<nEntries; iv++)
1178 if(!finite(candTopo.
GetChi2()[iv]))
continue;
1179 if(!(candTopo.
GetChi2()[iv] > 0.0f))
continue;
1182 fvec l, dl, isParticleFromVertex;
1184 if(!(isParticleFromVertex[iv]))
continue;
1185 if(((l/dl)[iv] < cuts[2]) )
continue;
1187 if(candTopo.
GetChi2()[iv]/candTopo.
GetNDF()[iv] > cuts[4] )
continue;
1189 Particles.push_back(vCandidates[iC+iv]);
static void SetField(fvec Bz)
static void ExtrapolateToPV(std::vector< KFParticle > &vParticles, KFParticleSIMD &PrimVtx)
void Construct(const KFParticleSIMD *vDaughters[], int nDaughters, const KFParticleSIMD *ProdVtx=0, Float_t Mass=-1, Bool_t IsConstrained=0, Bool_t isAtVtxGuess=0)
static void FindTrackV0Decay(const int MotherPDG, std::vector< KFParticle > &Particles, std::vector< KFParticle > &vV0, std::vector< KFPTrack > &vTracks, const int DaughterPDG, std::vector< short > &idTrack, KFParticleSIMD &PrimVtx, const float *cuts=0, bool isPrimary=0, std::vector< float > *ChiToPrimVtx=0, std::vector< KFParticle > *vHyperonPrim=0, float hyperonPrimMass=0, float hyperonPrimMassErr=0, std::vector< KFParticle > *vHyperonSec=0)
void SetNonlinearMassConstraint(Double_t Mass)
friend F32vec4 sqrt(const F32vec4 &a)
void SetVtxErrGuess(fvec &x, fvec &y, fvec &z)
labels push_back("electron")
Double_t * CovarianceMatrix()
void GetDistanceToVertexLine(const KFParticleBaseSIMD &Vertex, fvec &l, fvec &dl, fvec *isParticleFromVertex=0) const
static void FindHyperons(int PDG, KFParticleSIMD vDaughters[2], std::vector< int > &daughterIds, std::vector< KFParticle > &vLambdaSec, std::vector< KFParticle > &vHyperon, KFParticleSIMD &PrimVtx, const float *cuts=0, int startIndex=0)
void SetVtxGuess(fvec x, fvec y, fvec z)
static void SelectParticleCandidates(std::vector< KFParticle > &Particles, std::vector< KFParticle > &vCandidates, KFParticleSIMD &PrimVtx, const float cuts[5])
static fvec GetChi2BetweenParticles(KFParticleSIMD &p1, KFParticleSIMD &p2)
TString pt(TString pts, TString exts="px py pz")
const float * GetTrack() const
static void FindDMesLambdac(std::vector< KFPTrack > &vTracks, std::vector< KFParticle > &Particles, const int DaughterPDG[5], const int MotherPDG[8], std::vector< short > *idTrack[5], KFParticleSIMD &PrimVtx, const float cuts[8][8], std::vector< float > ChiToPrimVtx)
fvec * CovarianceMatrix()
fvec GetCovariance(int i) const
void TransportToPoint(const fvec xyz[])
void SetNDaughters(int n)
friend F32vec4 fabs(const F32vec4 &a)
static const float DefaultCuts[2][3]
void AddDaughterId(int id)
static void FindParticles(std::vector< KFPTrack > &vRTracks, std::vector< float > &ChiToPrimVtx, std::vector< KFParticle > &Particles, KFParticleSIMD &PrimVtx, const std::vector< int > &vTrackPDG, const float cuts[2][3]=DefaultCuts)
static void Find2DaughterDecay(std::vector< KFPTrack > &vTracks, std::vector< KFParticle > &Particles, const int DaughterNegPDG, const int DaughterPosPDG, const int MotherPDG, std::vector< short > &idNeg, std::vector< short > &idPos, KFParticleSIMD &PrimVtx, const float *cuts=0, bool isPrimary=0, std::vector< float > *vMotherTopoChi2Ndf=0, const float *secCuts=0, const float massMotherPDG=0, const float massMotherPDGSigma=0, std::vector< KFParticle > *vMotherPrim=0, std::vector< KFParticle > *vMotherSec=0)
static void CombineTrackPart(std::vector< KFPTrack > &vTracks, std::vector< KFParticle > &Particles, KFParticle &part, const int DaughterPDG, const int MotherPDG, std::vector< short > &id, const float *cuts, const unsigned short startIndex=0, const bool IsSamePart=0)
const std::vector< int > & DaughterIds() const
const float * GetCovMatrix() const
void GetKFParticle(KFParticle &Part, int iPart=0)
void Create(const fvec Param[], const fvec Cov[], fvec Charge, fvec mass)
void SetOneEntry(const int i0, const L1FieldRegion &f1, const int i1)
void SetProductionVertex(const KFParticleSIMD &Vtx)