@@ -63,12 +63,19 @@ struct SecondaryVertexReconstruction {
6363 Produces<aod::DataSecondaryVertex2Prongs> sv2prongTableData;
6464 Produces<aod::DataSecondaryVertex2ProngIndices> sv2prongIndicesTableData;
6565
66+ Produces<aod::DataSecondaryVertexNProngs> svnprongTableData;
67+ Produces<aod::DataSecondaryVertexNProngIndices> svnprongIndicesTableData;
68+
6669 Produces<aod::MCDSecondaryVertex3Prongs> sv3prongTableMCD;
6770 Produces<aod::MCDSecondaryVertex3ProngIndices> sv3prongIndicesTableMCD;
6871
6972 Produces<aod::MCDSecondaryVertex2Prongs> sv2prongTableMCD;
7073 Produces<aod::MCDSecondaryVertex2ProngIndices> sv2prongIndicesTableMCD;
7174
75+ Produces<aod::MCDSecondaryVertexNProngs> svnprongTableMCD;
76+ Produces<aod::MCDSecondaryVertexNProngIndices> svnprongIndicesTableMCD;
77+
78+ Configurable<int > nProng{" nProng" , 3 , " number of prong" };
7279 Configurable<float > magneticField{" magneticField" , 20 .0f , " magnetic field in kG" };
7380 Configurable<bool > propagateToPCA{" propagateToPCA" , true , " create tracks version propagated to PCA" };
7481 Configurable<bool > useAbsDCA{" useAbsDCA" , false , " Minimise abs. distance rather than chi2" };
@@ -241,43 +248,77 @@ struct SecondaryVertexReconstruction {
241248 std::fill (massArray.begin (), massArray.end (), o2::constants::physics::MassPiPlus);
242249 double massSV = RecoDecay::m (arrayMomenta, massArray);
243250
251+ // calculate momentum
252+ double xMomenta = -1 ;
253+ double yMomenta = -1 ;
254+ double zMomenta = -1 ;
255+ if (numProngs == ThreeProngCount) {
256+ xMomenta = arrayMomenta[0 ][0 ] + arrayMomenta[1 ][0 ] + arrayMomenta[2 ][0 ];
257+ yMomenta = arrayMomenta[0 ][1 ] + arrayMomenta[1 ][1 ] + arrayMomenta[2 ][1 ];
258+ zMomenta = arrayMomenta[0 ][2 ] + arrayMomenta[1 ][2 ] + arrayMomenta[2 ][2 ];
259+ } else if (numProngs == TwoProngCount) {
260+ xMomenta = arrayMomenta[0 ][0 ] + arrayMomenta[1 ][0 ];
261+ yMomenta = arrayMomenta[0 ][1 ] + arrayMomenta[1 ][1 ];
262+ zMomenta = arrayMomenta[0 ][2 ] + arrayMomenta[1 ][2 ];
263+ } else {
264+ LOG (error) << " No process momenta\n " ;
265+ }
266+
244267 // fill candidate table rows
245268 if ((doprocessData3Prongs || doprocessData3ProngsExternalMagneticField) && numProngs == ThreeProngCount) {
246269 sv3prongTableData (analysisJet.globalIndex (),
247270 primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ (),
248271 secondaryVertex[0 ], secondaryVertex[1 ], secondaryVertex[2 ],
249- arrayMomenta[ 0 ][ 0 ] + arrayMomenta[ 1 ][ 0 ] + arrayMomenta[ 2 ][ 0 ] ,
250- arrayMomenta[ 0 ][ 1 ] + arrayMomenta[ 1 ][ 1 ] + arrayMomenta[ 2 ][ 1 ] ,
251- arrayMomenta[ 0 ][ 2 ] + arrayMomenta[ 1 ][ 2 ] + arrayMomenta[ 2 ][ 2 ] ,
272+ xMomenta ,
273+ yMomenta ,
274+ zMomenta ,
252275 energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
253276 svIndices.push_back (sv3prongTableData.lastIndex ());
254277 } else if ((doprocessData2Prongs || doprocessData2ProngsExternalMagneticField) && numProngs == TwoProngCount) {
255278 sv2prongTableData (analysisJet.globalIndex (),
256279 primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ (),
257280 secondaryVertex[0 ], secondaryVertex[1 ], secondaryVertex[2 ],
258- arrayMomenta[ 0 ][ 0 ] + arrayMomenta[ 1 ][ 0 ] ,
259- arrayMomenta[ 0 ][ 1 ] + arrayMomenta[ 1 ][ 1 ] ,
260- arrayMomenta[ 0 ][ 2 ] + arrayMomenta[ 1 ][ 2 ] ,
281+ xMomenta ,
282+ yMomenta ,
283+ zMomenta ,
261284 energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
262285 svIndices.push_back (sv2prongTableData.lastIndex ());
286+ } else if ((doprocessDataNProngs || doprocessDataNProngsExternalMagneticField) && numProngs == TwoProngCount) {
287+ svnprongTableData (analysisJet.globalIndex (),
288+ primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ (),
289+ secondaryVertex[0 ], secondaryVertex[1 ], secondaryVertex[2 ],
290+ xMomenta,
291+ yMomenta,
292+ zMomenta,
293+ energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
294+ svIndices.push_back (svnprongTableData.lastIndex ());
263295 } else if ((doprocessMCD3Prongs || doprocessMCD3ProngsExternalMagneticField) && numProngs == ThreeProngCount) {
264296 sv3prongTableMCD (analysisJet.globalIndex (),
265297 primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ (),
266298 secondaryVertex[0 ], secondaryVertex[1 ], secondaryVertex[2 ],
267- arrayMomenta[ 0 ][ 0 ] + arrayMomenta[ 1 ][ 0 ] + arrayMomenta[ 2 ][ 0 ] ,
268- arrayMomenta[ 0 ][ 1 ] + arrayMomenta[ 1 ][ 1 ] + arrayMomenta[ 2 ][ 1 ] ,
269- arrayMomenta[ 0 ][ 2 ] + arrayMomenta[ 1 ][ 2 ] + arrayMomenta[ 2 ][ 2 ] ,
299+ xMomenta ,
300+ yMomenta ,
301+ zMomenta ,
270302 energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
271303 svIndices.push_back (sv3prongTableMCD.lastIndex ());
272304 } else if ((doprocessMCD2Prongs || doprocessMCD2ProngsExternalMagneticField) && numProngs == TwoProngCount) {
273305 sv2prongTableMCD (analysisJet.globalIndex (),
274306 primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ (),
275307 secondaryVertex[0 ], secondaryVertex[1 ], secondaryVertex[2 ],
276- arrayMomenta[ 0 ][ 0 ] + arrayMomenta[ 1 ][ 0 ] ,
277- arrayMomenta[ 0 ][ 1 ] + arrayMomenta[ 1 ][ 1 ] ,
278- arrayMomenta[ 0 ][ 2 ] + arrayMomenta[ 1 ][ 2 ] ,
308+ xMomenta ,
309+ yMomenta ,
310+ zMomenta ,
279311 energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
280312 svIndices.push_back (sv2prongTableMCD.lastIndex ());
313+ } else if (doprocessMCDNProngs || doprocessMCDNProngsExternalMagneticField) {
314+ svnprongTableMCD (analysisJet.globalIndex (),
315+ primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ (),
316+ secondaryVertex[0 ], secondaryVertex[1 ], secondaryVertex[2 ],
317+ xMomenta,
318+ yMomenta,
319+ zMomenta,
320+ energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
321+ svIndices.push_back (svnprongTableMCD.lastIndex ());
281322 } else {
282323 LOG (error) << " No process specified\n " ;
283324 }
@@ -357,6 +398,40 @@ struct SecondaryVertexReconstruction {
357398 }
358399 PROCESS_SWITCH (SecondaryVertexReconstruction, processData2ProngsExternalMagneticField, " Reconstruct the data 2-prong secondary vertex with extrernal magnetic field" , false );
359400
401+ void processDataNProngs (JetCollisionwPIs::iterator const & collision, aod::Collisions const & /* realColl*/ , soa::Join<aod::ChargedJets, aod::ChargedJetConstituents> const & jets, JetTracksData const & tracks, OriginalTracks const & /* tracks*/ , aod::BCsWithTimestamps const & /* bcWithTimeStamps*/ )
402+ {
403+ for (const auto & jet : jets) {
404+ std::vector<int > svIndices;
405+ if (nProng == ThreeProngCount) {
406+ runCreatorNProng<ThreeProngCount, false >(collision.template collision_as <aod::Collisions>(), jet, tracks, svIndices, df3);
407+ svnprongIndicesTableData (svIndices);
408+ } else if (nProng == TwoProngCount) {
409+ runCreatorNProng<TwoProngCount, false >(collision.template collision_as <aod::Collisions>(), jet, tracks, svIndices, df2);
410+ svnprongIndicesTableData (svIndices);
411+ } else {
412+ LOG (error) << " set number of prong\n " ;
413+ }
414+ }
415+ }
416+ PROCESS_SWITCH (SecondaryVertexReconstruction, processDataNProngs, " Reconstruct the data mult-prong secondary vertex" , false );
417+
418+ void processDataNProngsExternalMagneticField (JetCollisionwPIs::iterator const & collision, aod::Collisions const & /* realColl*/ , soa::Join<aod::ChargedJets, aod::ChargedJetConstituents> const & jets, JetTracksData const & tracks, OriginalTracks const & /* tracks*/ )
419+ {
420+ for (const auto & jet : jets) {
421+ std::vector<int > svIndices;
422+ if (nProng == ThreeProngCount) {
423+ runCreatorNProng<ThreeProngCount, true >(collision.template collision_as <aod::Collisions>(), jet, tracks, svIndices, df3);
424+ svnprongIndicesTableData (svIndices);
425+ } else if (nProng == TwoProngCount) {
426+ runCreatorNProng<TwoProngCount, true >(collision.template collision_as <aod::Collisions>(), jet, tracks, svIndices, df2);
427+ svnprongIndicesTableData (svIndices);
428+ } else {
429+ LOG (error) << " set number of prong\n " ;
430+ }
431+ }
432+ }
433+ PROCESS_SWITCH (SecondaryVertexReconstruction, processDataNProngsExternalMagneticField, " Reconstruct the data mult-prong secondary vertex with extrernal magnetic field" , false );
434+
360435 void processMCD3Prongs (JetCollisionwPIs::iterator const & collision, aod::Collisions const & /* realColl*/ , soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const & mcdjets, JetTracksMCDwPIs const & tracks, OriginalTracks const & /* tracks*/ , aod::BCsWithTimestamps const & /* bcWithTimeStamps*/ )
361436 {
362437 for (const auto & jet : mcdjets) {
@@ -396,6 +471,40 @@ struct SecondaryVertexReconstruction {
396471 }
397472 }
398473 PROCESS_SWITCH (SecondaryVertexReconstruction, processMCD2ProngsExternalMagneticField, " Reconstruct the MCD 2-prong secondary vertex with external magnetic field" , false );
474+
475+ void processMCDNProngs (JetCollisionwPIs::iterator const & collision, aod::Collisions const & /* realColl*/ , soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const & mcdjets, JetTracksMCDwPIs const & tracks, OriginalTracks const & /* tracks*/ , aod::BCsWithTimestamps const & /* bcWithTimeStamps*/ )
476+ {
477+ for (const auto & jet : mcdjets) {
478+ std::vector<int > svIndices;
479+ if (nProng == ThreeProngCount) {
480+ runCreatorNProng<ThreeProngCount, false >(collision.template collision_as <aod::Collisions>(), jet, tracks, svIndices, df3);
481+ svnprongIndicesTableMCD (svIndices);
482+ } else if (nProng == TwoProngCount) {
483+ runCreatorNProng<TwoProngCount, false >(collision.template collision_as <aod::Collisions>(), jet, tracks, svIndices, df2);
484+ svnprongIndicesTableMCD (svIndices);
485+ } else {
486+ LOG (error) << " set number of prong\n " ;
487+ }
488+ }
489+ }
490+ PROCESS_SWITCH (SecondaryVertexReconstruction, processMCDNProngs, " Reconstruct the MCD n-prong secondary vertex" , false );
491+
492+ void processMCDNProngsExternalMagneticField (JetCollisionwPIs::iterator const & collision, aod::Collisions const & /* realColl*/ , soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const & mcdjets, JetTracksMCDwPIs const & tracks, OriginalTracks const & /* tracks*/ )
493+ {
494+ for (const auto & jet : mcdjets) {
495+ std::vector<int > svIndices;
496+ if (nProng == ThreeProngCount) {
497+ runCreatorNProng<ThreeProngCount, true >(collision.template collision_as <aod::Collisions>(), jet, tracks, svIndices, df3);
498+ svnprongIndicesTableMCD (svIndices);
499+ } else if (nProng == TwoProngCount) {
500+ runCreatorNProng<TwoProngCount, true >(collision.template collision_as <aod::Collisions>(), jet, tracks, svIndices, df2);
501+ svnprongIndicesTableMCD (svIndices);
502+ } else {
503+ LOG (error) << " set number of prong\n " ;
504+ }
505+ }
506+ }
507+ PROCESS_SWITCH (SecondaryVertexReconstruction, processMCDNProngsExternalMagneticField, " Reconstruct the MCD n-prong secondary vertex with external magnetic field" , false );
399508};
400509
401510WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments