@@ -65,9 +65,17 @@ struct HfTaskCharmHadronsFemtoDream {
6565 NegativeCharge = -1
6666 };
6767
68+ enum PairSign {
69+ PairNotDefined = 0 ,
70+ LikeSignPair = 1 ,
71+ UnLikeSignPair = 2
72+ };
73+
6874 constexpr static int OriginRecPrompt = 1 ;
6975 constexpr static int OriginRecFD = 2 ;
76+ constexpr static int CutBitChargePositive = 2 ;
7077
78+ Produces<o2::aod::FDHfPairs> rowFemtoResultPairs;
7179 Produces<o2::aod::FDHfCharm> rowFemtoResultCharm;
7280 Produces<o2::aod::FDHfTrk> rowFemtoResultTrk;
7381 Produces<o2::aod::FDHfColl> rowFemtoResultColl;
@@ -131,7 +139,7 @@ struct HfTaskCharmHadronsFemtoDream {
131139 using FilteredCharmMcCands = soa::Filtered<soa::Join<aod::FDHfCand, aod::FDHfCandMC>>;
132140 using FilteredCharmMcCand = FilteredCharmMcCands::iterator;
133141
134- using FilteredColisions = soa::Filtered<soa::Join<FDCollisions, FDColMasks>>;
142+ using FilteredColisions = soa::Filtered<soa::Join<FDCollisions, FDColMasks, aod::Collisions >>;
135143 using FilteredColision = FilteredColisions::iterator;
136144
137145 using FilteredMcColisions = soa::Filtered<soa::Join<aod::FDCollisions, FDColMasks, aod::FDMCCollLabels>>;
@@ -294,7 +302,7 @@ struct HfTaskCharmHadronsFemtoDream {
294302 void doSameEvent (PartitionType& sliceTrk1, CandType& sliceCharmHad, TableTracks const & parts, Collision const & col)
295303 {
296304 fillCollision (col);
297-
305+ processType = 1 ; // for same event
298306 for (auto const & [p1, p2] : combinations (CombinationsFullIndexPolicy (sliceTrk1, sliceCharmHad))) {
299307
300308 if (p1.trackId () == p2.prong0Id () || p1.trackId () == p2.prong1Id () || p1.trackId () == p2.prong2Id ())
@@ -310,15 +318,6 @@ struct HfTaskCharmHadronsFemtoDream {
310318 continue ;
311319 }
312320
313- constexpr int CutBitChargePositive = 2 ;
314- // proton track charge
315- float chargeTrack = 0 .;
316- if ((p1.cut () & CutBitChargePositive) == CutBitChargePositive) {
317- chargeTrack = PositiveCharge;
318- } else {
319- chargeTrack = NegativeCharge;
320- }
321-
322321 float kstar = FemtoDreamMath::getkstar (p1, massOne, p2, massTwo);
323322 if (kstar > highkstarCut) {
324323 continue ;
@@ -333,6 +332,21 @@ struct HfTaskCharmHadronsFemtoDream {
333332 if (p2.pt () < charmHadMinPt || p2.pt () > charmHadMaxPt) {
334333 continue ;
335334 }
335+
336+ // proton track charge
337+ float chargeTrack = 0 .;
338+ if ((p1.cut () & CutBitChargePositive) == CutBitChargePositive) {
339+ chargeTrack = PositiveCharge;
340+ } else {
341+ chargeTrack = NegativeCharge;
342+ }
343+ int pairSign = 0 ;
344+ if (chargeTrack == p2.charge ()) {
345+ pairSign = LikeSignPair;
346+ } else {
347+ pairSign = UnLikeSignPair;
348+ }
349+
336350 // / Filling QA histograms of the selected tracks
337351 selectedTrackHisto.fillQA <isMc, true >(p1, static_cast <aod::femtodreamparticle::MomentumType>(confTempFitVarMomentum.value ), col.multNtr (), col.multV0M ());
338352
@@ -343,47 +357,32 @@ struct HfTaskCharmHadronsFemtoDream {
343357 originType = p2.originMcRec ();
344358 }
345359
346- rowFemtoResultCharm (
347- col.globalIndex (),
348- p2.timeStamp (),
360+ rowFemtoResultPairs (
349361 invMass,
350362 p2.pt (),
351- p2.eta (),
352- p2.phi (),
353- p2.charge (),
363+ p1.pt (),
354364 p2.bdtBkg (),
355365 p2.bdtPrompt (),
356366 p2.bdtFD (),
367+ kstar,
368+ FemtoDreamMath::getkT (p1, massOne, p2, massTwo),
369+ FemtoDreamMath::getmT (p1, massOne, p2, massTwo),
370+ col.multNtr (),
371+ col.multV0M (),
372+ p2.charge (),
373+ pairSign,
374+ processType,
357375 charmHadMc,
358376 originType);
359377
360- rowFemtoResultTrk (
361- col.globalIndex (),
362- p2.timeStamp (),
363- p1.pt (),
364- p1.eta (),
365- p1.phi (),
366- chargeTrack,
367- p1.tpcNClsFound (),
368- p1.tpcNClsFindable (),
369- p1.tpcNClsCrossedRows (),
370- p1.tpcNSigmaPr (),
371- p1.tofNSigmaPr ());
372-
373- rowFemtoResultColl (
374- col.globalIndex (),
375- p2.timeStamp (),
376- col.posZ (),
377- col.multNtr ());
378-
379378 sameEventCont.setPair <isMc, true >(p1, p2, col.multNtr (), col.multV0M (), use4D, extendedPlots, smearingByOrigin);
380379 }
381380 }
382381
383382 template <bool isMc, typename CollisionType, typename PartType, typename PartitionType1, typename PartitionType2, typename BinningType>
384383 void doMixedEvent (CollisionType const & cols, PartType const & parts, PartitionType1& part1, PartitionType2& part2, BinningType policy)
385384 {
386-
385+ processType = 2 ; // for mixed event
387386 // Mixed events that contain the pair of interest
388387 Partition<CollisionType> partitionMaskedCol1 = (aod::femtodreamcollision::bitmaskTrackOne & bitMask) == bitMask;
389388 partitionMaskedCol1.bindTable (cols);
@@ -427,8 +426,45 @@ struct HfTaskCharmHadronsFemtoDream {
427426 if (p2.pt () < charmHadMinPt || p2.pt () > charmHadMaxPt) {
428427 continue ;
429428 }
429+ // proton track charge
430+ float chargeTrack = 0 .;
431+ if ((p1.cut () & CutBitChargePositive) == CutBitChargePositive) {
432+ chargeTrack = PositiveCharge;
433+ } else {
434+ chargeTrack = NegativeCharge;
435+ }
436+ int pairSign = 0 ;
437+ if (chargeTrack == p2.charge ()) {
438+ pairSign = LikeSignPair;
439+ } else {
440+ pairSign = UnLikeSignPair;
441+ }
442+
443+ int charmHadMc = 0 ;
444+ int originType = 0 ;
445+ if constexpr (isMc) {
446+ charmHadMc = p2.flagMc ();
447+ originType = p2.originMcRec ();
448+ }
449+
450+ rowFemtoResultPairs (
451+ invMass,
452+ p2.pt (),
453+ p1.pt (),
454+ p2.bdtBkg (),
455+ p2.bdtPrompt (),
456+ p2.bdtFD (),
457+ kstar,
458+ FemtoDreamMath::getkT (p1, massOne, p2, massTwo),
459+ FemtoDreamMath::getmT (p1, massOne, p2, massTwo),
460+ collision1.multNtr (),
461+ collision1.multV0M (),
462+ p2.charge (),
463+ pairSign,
464+ processType,
465+ charmHadMc,
466+ originType);
430467
431- // if constexpr (!isMc) mixedEventCont.setPair<isMc, true>(p1, p2, collision1.multNtr(), collision1.multV0M(), use4D, extendedPlots, smearingByOrigin);
432468 mixedEventCont.setPair <isMc, true >(p1, p2, collision1.multNtr (), collision1.multV0M (), use4D, extendedPlots, smearingByOrigin);
433469 }
434470 }
@@ -441,15 +477,60 @@ struct HfTaskCharmHadronsFemtoDream {
441477 eventHisto.fillQA (col);
442478 auto sliceTrk1 = partitionTrk1->sliceByCached (aod::femtodreamparticle::fdCollisionId, col.globalIndex (), cache);
443479 auto sliceCharmHad = partitionCharmHadron->sliceByCached (aod::femtodreamparticle::fdCollisionId, col.globalIndex (), cache);
480+ auto bc = col.template bc_as <aod::BCsWithTimestamps>();
481+ int64_t timeStamp = bc.timestamp ();
482+
444483 // / Filling QA histograms of the all tracks and all charm hadrons before pairing
445484 for (auto const & part : sliceTrk1) {
446485 allTrackHisto.fillQA <false , true >(part, static_cast <aod::femtodreamparticle::MomentumType>(confTempFitVarMomentum.value ), col.multNtr (), col.multV0M ());
486+
487+ // proton track charge
488+ float chargeTrack = 0 .;
489+ if ((part.cut () & CutBitChargePositive) == CutBitChargePositive) {
490+ chargeTrack = PositiveCharge;
491+ } else {
492+ chargeTrack = NegativeCharge;
493+ }
494+
495+ rowFemtoResultTrk (
496+ col.globalIndex (),
497+ timeStamp,
498+ part.pt (),
499+ part.eta (),
500+ part.phi (),
501+ part.trackId (),
502+ chargeTrack,
503+ part.tpcNClsFound (),
504+ part.tpcNClsFindable (),
505+ part.tpcNClsCrossedRows (),
506+ part.tpcNSigmaPr (),
507+ part.tofNSigmaPr ());
447508 }
448509 for (auto const & part : sliceCharmHad) {
449510 float invMass = getCharmHadronMass (part);
450511 registryCharmHadronQa.fill (HIST (" CharmHadronQA/hPtVsMass" ), part.pt (), invMass);
512+ rowFemtoResultCharm (
513+ col.globalIndex (),
514+ timeStamp,
515+ invMass,
516+ part.pt (),
517+ part.eta (),
518+ part.phi (),
519+ part.prong0Id (),
520+ part.prong1Id (),
521+ part.prong2Id (),
522+ part.charge (),
523+ part.bdtBkg (),
524+ part.bdtPrompt (),
525+ part.bdtFD ());
451526 }
452527
528+ rowFemtoResultColl (
529+ col.globalIndex (),
530+ timeStamp,
531+ col.posZ (),
532+ col.multNtr ());
533+
453534 if ((col.bitmaskTrackOne () & bitMask) != bitMask || (col.bitmaskTrackTwo () & bitMask) != bitMask) {
454535 return ;
455536 }
0 commit comments