@@ -484,7 +484,10 @@ struct TreeWriterTpcV0 {
484484 Preslice<Trks> perCollisionTracks = aod::track::collisionId;
485485 Preslice<V0sWithID> perCollisionV0s = aod::v0data::collisionId;
486486 Preslice<CascsWithID> perCollisionCascs = aod::cascdata::collisionId;
487- void processWithdEdxTrQA (Colls const & collisions, Trks const & myTracks, V0sWithID const & myV0s, CascsWithID const & myCascs, aod::BCsWithTimestamps const &, aod::TracksQAVersion const & tracksQA)
487+ Preslice<TrksWithDEdxCorrection> perCollisionTracksWithNewDEdx = aod::track::collisionId;
488+
489+ template <bool IsCorrecteddEdx, typename TrksType>
490+ void runWithdEdxTrQA (Colls const & collisions, TrksType const & myTracks, V0sWithID const & myV0s, CascsWithID const & myCascs, aod::TracksQAVersion const & tracksQA, Preslice<TrksType> const & perCollisionTracksType)
488491 {
489492 std::vector<int64_t > labelTrack2TrackQA;
490493 labelTrack2TrackQA.clear ();
@@ -495,7 +498,7 @@ struct TreeWriterTpcV0 {
495498 labelTrack2TrackQA[trackId] = trackQAIndex;
496499 }
497500 for (const auto & collision : collisions) {
498- auto tracks = myTracks.sliceBy (perCollisionTracks , collision.globalIndex ());
501+ auto tracks = myTracks.sliceBy (perCollisionTracksType , collision.globalIndex ());
499502 auto v0s = myV0s.sliceBy (perCollisionV0s, collision.globalIndex ());
500503 auto cascs = myCascs.sliceBy (perCollisionCascs, collision.globalIndex ());
501504 // / Check event slection
@@ -508,8 +511,8 @@ struct TreeWriterTpcV0 {
508511 rowTPCTreeWithTrkQA.reserve (tracks.size ());
509512 // / Loop over v0 candidates
510513 for (const auto & v0 : v0s) {
511- auto posTrack = v0.posTrack_as <Trks >();
512- auto negTrack = v0.negTrack_as <Trks >();
514+ auto posTrack = v0.posTrack_as <TrksType >();
515+ auto negTrack = v0.negTrack_as <TrksType >();
513516 if (v0.v0addid () == -1 ) {
514517 continue ;
515518 }
@@ -535,48 +538,48 @@ struct TreeWriterTpcV0 {
535538 // gamma
536539 if (static_cast <bool >(posTrack.pidbit () & (1 << 0 )) && static_cast <bool >(negTrack.pidbit () & (1 << 0 ))) {
537540 if (downsampleTsalisCharged (posTrack.pt (), downsamplingTsalisElectrons, MassElectorn, maxPt4dwnsmplTsalisElectrons)) {
538- fillSkimmedV0TableWithdEdxTrQA (v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaEl (), posTrack.tofNSigmaEl (), posTrack.tpcExpSignalEl (posTrack. tpcSignal ( )), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate);
541+ fillSkimmedV0TableWithdEdxTrQA<IsCorrecteddEdx> (v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaEl (), posTrack.tofNSigmaEl (), posTrack.tpcExpSignalEl (tpcSignalGeneric<IsCorrecteddEdx>(posTrack )), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate);
539542 }
540543 if (downsampleTsalisCharged (negTrack.pt (), downsamplingTsalisElectrons, MassElectorn, maxPt4dwnsmplTsalisElectrons)) {
541- fillSkimmedV0TableWithdEdxTrQA (v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaEl (), negTrack.tofNSigmaEl (), negTrack.tpcExpSignalEl (negTrack. tpcSignal ( )), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate);
544+ fillSkimmedV0TableWithdEdxTrQA<IsCorrecteddEdx> (v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaEl (), negTrack.tofNSigmaEl (), negTrack.tpcExpSignalEl (tpcSignalGeneric<IsCorrecteddEdx>(negTrack )), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate);
542545 }
543546 }
544547 // Ks0
545548 if (static_cast <bool >(posTrack.pidbit () & (1 << 1 )) && static_cast <bool >(negTrack.pidbit () & (1 << 1 ))) {
546549 if (downsampleTsalisCharged (posTrack.pt (), downsamplingTsalisPions, MassPion, maxPt4dwnsmplTsalisPions)) {
547- fillSkimmedV0TableWithdEdxTrQA (v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi (), posTrack.tofNSigmaPi (), posTrack.tpcExpSignalPi (posTrack. tpcSignal ( )), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
550+ fillSkimmedV0TableWithdEdxTrQA<IsCorrecteddEdx> (v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi (), posTrack.tofNSigmaPi (), posTrack.tpcExpSignalPi (tpcSignalGeneric<IsCorrecteddEdx>(posTrack )), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
548551 }
549552 if (downsampleTsalisCharged (negTrack.pt (), downsamplingTsalisPions, MassPion, maxPt4dwnsmplTsalisPions)) {
550- fillSkimmedV0TableWithdEdxTrQA (v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi (), negTrack.tofNSigmaPi (), negTrack.tpcExpSignalPi (negTrack. tpcSignal ( )), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
553+ fillSkimmedV0TableWithdEdxTrQA<IsCorrecteddEdx> (v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi (), negTrack.tofNSigmaPi (), negTrack.tpcExpSignalPi (tpcSignalGeneric<IsCorrecteddEdx>(negTrack )), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
551554 }
552555 }
553556 // Lambda
554557 if (static_cast <bool >(posTrack.pidbit () & (1 << 2 )) && static_cast <bool >(negTrack.pidbit () & (1 << 2 ))) {
555558 if (downsampleTsalisCharged (posTrack.pt (), downsamplingTsalisProtons, MassProton, maxPt4dwnsmplTsalisProtons)) {
556559 if (std::abs (posTrack.tofNSigmaPr ()) <= nSigmaTOFdautrack) {
557- fillSkimmedV0TableWithdEdxTrQA (v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPr (), posTrack.tofNSigmaPr (), posTrack.tpcExpSignalPr (posTrack. tpcSignal ( )), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate);
560+ fillSkimmedV0TableWithdEdxTrQA<IsCorrecteddEdx> (v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPr (), posTrack.tofNSigmaPr (), posTrack.tpcExpSignalPr (tpcSignalGeneric<IsCorrecteddEdx>(posTrack )), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate);
558561 }
559562 }
560563 if (downsampleTsalisCharged (negTrack.pt (), downsamplingTsalisPions, MassPion, maxPt4dwnsmplTsalisPions)) {
561- fillSkimmedV0TableWithdEdxTrQA (v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi (), negTrack.tofNSigmaPi (), negTrack.tpcExpSignalPi (negTrack. tpcSignal ( )), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
564+ fillSkimmedV0TableWithdEdxTrQA<IsCorrecteddEdx> (v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi (), negTrack.tofNSigmaPi (), negTrack.tpcExpSignalPi (tpcSignalGeneric<IsCorrecteddEdx>(negTrack )), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
562565 }
563566 }
564567 // Antilambda
565568 if (static_cast <bool >(posTrack.pidbit () & (1 << 3 )) && static_cast <bool >(negTrack.pidbit () & (1 << 3 ))) {
566569 if (downsampleTsalisCharged (posTrack.pt (), downsamplingTsalisPions, MassPion, maxPt4dwnsmplTsalisPions)) {
567- fillSkimmedV0TableWithdEdxTrQA (v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi (), posTrack.tofNSigmaPi (), posTrack.tpcExpSignalPi (posTrack. tpcSignal ( )), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
570+ fillSkimmedV0TableWithdEdxTrQA<IsCorrecteddEdx> (v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi (), posTrack.tofNSigmaPi (), posTrack.tpcExpSignalPi (tpcSignalGeneric<IsCorrecteddEdx>(posTrack )), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
568571 }
569572 if (downsampleTsalisCharged (negTrack.pt (), downsamplingTsalisProtons, MassProton, maxPt4dwnsmplTsalisProtons)) {
570573 if (std::abs (negTrack.tofNSigmaPr ()) <= nSigmaTOFdautrack) {
571- fillSkimmedV0TableWithdEdxTrQA (v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPr (), negTrack.tofNSigmaPr (), negTrack.tpcExpSignalPr (negTrack. tpcSignal ( )), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate);
574+ fillSkimmedV0TableWithdEdxTrQA<IsCorrecteddEdx> (v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPr (), negTrack.tofNSigmaPr (), negTrack.tpcExpSignalPr (tpcSignalGeneric<IsCorrecteddEdx>(negTrack )), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate);
572575 }
573576 }
574577 }
575578 }
576579
577580 // / Loop over cascade candidates
578581 for (const auto & casc : cascs) {
579- auto bachTrack = casc.bachelor_as <Trks >();
582+ auto bachTrack = casc.bachelor_as <TrksType >();
580583 if (casc.cascaddid () == kUndef ) {
581584 continue ;
582585 }
@@ -594,130 +597,23 @@ struct TreeWriterTpcV0 {
594597 // Omega and antiomega
595598 if (static_cast <bool >(bachTrack.pidbit () & (1 << kOmega )) || static_cast <bool >(bachTrack.pidbit () & (1 << kAntiOmega ))) {
596599 if (downsampleTsalisCharged (bachTrack.pt (), downsamplingTsalisKaons, MassKaon, maxPt4dwnsmplTsalisKaons)) {
597- fillSkimmedV0TableWithdEdxTrQA (casc, bachTrack, bachTrackQA, existBachTrkQA, collision, bachTrack.tpcNSigmaKa (), bachTrack.tofNSigmaKa (), bachTrack.tpcExpSignalKa (bachTrack. tpcSignal ( )), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate);
600+ fillSkimmedV0TableWithdEdxTrQA<IsCorrecteddEdx> (casc, bachTrack, bachTrackQA, existBachTrkQA, collision, bachTrack.tpcNSigmaKa (), bachTrack.tofNSigmaKa (), bachTrack.tpcExpSignalKa (tpcSignalGeneric<IsCorrecteddEdx>(bachTrack )), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate);
598601 }
599602 }
600603 }
601604 }
605+ }
606+
607+
608+ void processWithdEdxTrQA (Colls const & collisions, Trks const & myTracks, V0sWithID const & myV0s, CascsWithID const & myCascs, aod::BCsWithTimestamps const &, aod::TracksQAVersion const & tracksQA)
609+ {
610+ runWithdEdxTrQA<false >(collisions, myTracks, myV0s, myCascs, tracksQA, perCollisionTracks);
602611 } // / process with dEdx from TrackQA
603612 PROCESS_SWITCH (TreeWriterTpcV0, processWithdEdxTrQA, " Standard V0 Samples with dEdx from Track QA for PID" , false );
604613
605- Preslice<TrksWithDEdxCorrection> perCollisionTracksWithNewDEdx = aod::track::collisionId;
606614 void processWithdEdxTrQAWithCorrecteddEdx (Colls const & collisions, TrksWithDEdxCorrection const & myTracks, V0sWithID const & myV0s, CascsWithID const & myCascs, aod::BCsWithTimestamps const &, aod::TracksQAVersion const & tracksQA)
607615 {
608- std::vector<int64_t > labelTrack2TrackQA;
609- labelTrack2TrackQA.clear ();
610- labelTrack2TrackQA.resize (myTracks.size (), -1 );
611- for (const auto & trackQA : tracksQA) {
612- int64_t trackId = trackQA.trackId ();
613- int64_t trackQAIndex = trackQA.globalIndex ();
614- labelTrack2TrackQA[trackId] = trackQAIndex;
615- }
616- for (const auto & collision : collisions) {
617- auto tracks = myTracks.sliceBy (perCollisionTracksWithNewDEdx, collision.globalIndex ());
618- auto v0s = myV0s.sliceBy (perCollisionV0s, collision.globalIndex ());
619- auto cascs = myCascs.sliceBy (perCollisionCascs, collision.globalIndex ());
620- // / Check event slection
621- if (!isEventSelected (collision, tracks)) {
622- continue ;
623- }
624- auto bc = collision.bc_as <aod::BCsWithTimestamps>();
625- const int runnumber = bc.runNumber ();
626- float hadronicRate = mRateFetcher .fetch (ccdb.service , bc.timestamp (), runnumber, irSource) * 1 .e -3 ;
627- rowTPCTreeWithTrkQA.reserve (tracks.size ());
628- // / Loop over v0 candidates
629- for (const auto & v0 : v0s) {
630- auto posTrack = v0.posTrack_as <TrksWithDEdxCorrection>();
631- auto negTrack = v0.negTrack_as <TrksWithDEdxCorrection>();
632- if (v0.v0addid () == -1 ) {
633- continue ;
634- }
635- aod::TracksQA posTrackQA;
636- aod::TracksQA negTrackQA;
637- bool existPosTrkQA;
638- bool existNegTrkQA;
639- if (labelTrack2TrackQA[posTrack.globalIndex ()] != -1 ) {
640- posTrackQA = tracksQA.iteratorAt (labelTrack2TrackQA[posTrack.globalIndex ()]);
641- existPosTrkQA = true ;
642- } else {
643- posTrackQA = tracksQA.iteratorAt (0 );
644- existPosTrkQA = false ;
645- }
646- if (labelTrack2TrackQA[negTrack.globalIndex ()] != -1 ) {
647- negTrackQA = tracksQA.iteratorAt (labelTrack2TrackQA[negTrack.globalIndex ()]);
648- existNegTrkQA = true ;
649- } else {
650- negTrackQA = tracksQA.iteratorAt (0 );
651- existNegTrkQA = false ;
652- }
653-
654- // gamma
655- if (static_cast <bool >(posTrack.pidbit () & (1 << 0 )) && static_cast <bool >(negTrack.pidbit () & (1 << 0 ))) {
656- if (downsampleTsalisCharged (posTrack.pt (), downsamplingTsalisElectrons, MassElectorn, maxPt4dwnsmplTsalisElectrons)) {
657- fillSkimmedV0TableWithdEdxTrQA<true >(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaEl (), posTrack.tofNSigmaEl (), posTrack.tpcExpSignalEl (posTrack.tpcSignalCorrected ()), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate);
658- }
659- if (downsampleTsalisCharged (negTrack.pt (), downsamplingTsalisElectrons, MassElectorn, maxPt4dwnsmplTsalisElectrons)) {
660- fillSkimmedV0TableWithdEdxTrQA<true >(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaEl (), negTrack.tofNSigmaEl (), negTrack.tpcExpSignalEl (negTrack.tpcSignalCorrected ()), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate);
661- }
662- }
663- // Ks0
664- if (static_cast <bool >(posTrack.pidbit () & (1 << 1 )) && static_cast <bool >(negTrack.pidbit () & (1 << 1 ))) {
665- if (downsampleTsalisCharged (posTrack.pt (), downsamplingTsalisPions, MassPion, maxPt4dwnsmplTsalisPions)) {
666- fillSkimmedV0TableWithdEdxTrQA<true >(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi (), posTrack.tofNSigmaPi (), posTrack.tpcExpSignalPi (posTrack.tpcSignalCorrected ()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
667- }
668- if (downsampleTsalisCharged (negTrack.pt (), downsamplingTsalisPions, MassPion, maxPt4dwnsmplTsalisPions)) {
669- fillSkimmedV0TableWithdEdxTrQA<true >(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi (), negTrack.tofNSigmaPi (), negTrack.tpcExpSignalPi (negTrack.tpcSignalCorrected ()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
670- }
671- }
672- // Lambda
673- if (static_cast <bool >(posTrack.pidbit () & (1 << 2 )) && static_cast <bool >(negTrack.pidbit () & (1 << 2 ))) {
674- if (downsampleTsalisCharged (posTrack.pt (), downsamplingTsalisProtons, MassProton, maxPt4dwnsmplTsalisProtons)) {
675- if (std::abs (posTrack.tofNSigmaPr ()) <= nSigmaTOFdautrack) {
676- fillSkimmedV0TableWithdEdxTrQA<true >(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPr (), posTrack.tofNSigmaPr (), posTrack.tpcExpSignalPr (posTrack.tpcSignal ()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate);
677- }
678- }
679- if (downsampleTsalisCharged (negTrack.pt (), downsamplingTsalisPions, MassPion, maxPt4dwnsmplTsalisPions)) {
680- fillSkimmedV0TableWithdEdxTrQA<true >(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi (), negTrack.tofNSigmaPi (), negTrack.tpcExpSignalPi (negTrack.tpcSignalCorrected ()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
681- }
682- }
683- // Antilambda
684- if (static_cast <bool >(posTrack.pidbit () & (1 << 3 )) && static_cast <bool >(negTrack.pidbit () & (1 << 3 ))) {
685- if (downsampleTsalisCharged (posTrack.pt (), downsamplingTsalisPions, MassPion, maxPt4dwnsmplTsalisPions)) {
686- fillSkimmedV0TableWithdEdxTrQA<true >(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi (), posTrack.tofNSigmaPi (), posTrack.tpcExpSignalPi (posTrack.tpcSignalCorrected ()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate);
687- }
688- if (downsampleTsalisCharged (negTrack.pt (), downsamplingTsalisProtons, MassProton, maxPt4dwnsmplTsalisProtons)) {
689- if (std::abs (negTrack.tofNSigmaPr ()) <= nSigmaTOFdautrack) {
690- fillSkimmedV0TableWithdEdxTrQA<true >(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPr (), negTrack.tofNSigmaPr (), negTrack.tpcExpSignalPr (negTrack.tpcSignalCorrected ()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate);
691- }
692- }
693- }
694- }
695-
696- // / Loop over cascade candidates
697- for (const auto & casc : cascs) {
698- auto bachTrack = casc.bachelor_as <TrksWithDEdxCorrection>();
699- if (casc.cascaddid () == kUndef ) {
700- continue ;
701- }
702-
703- aod::TracksQA bachTrackQA;
704- bool existBachTrkQA;
705- if (labelTrack2TrackQA[bachTrack.globalIndex ()] != -1 ) {
706- bachTrackQA = tracksQA.iteratorAt (labelTrack2TrackQA[bachTrack.globalIndex ()]);
707- existBachTrkQA = true ;
708- } else {
709- bachTrackQA = tracksQA.iteratorAt (0 );
710- existBachTrkQA = false ;
711- }
712-
713- // Omega and antiomega
714- if (static_cast <bool >(bachTrack.pidbit () & (1 << kOmega )) || static_cast <bool >(bachTrack.pidbit () & (1 << kAntiOmega ))) {
715- if (downsampleTsalisCharged (bachTrack.pt (), downsamplingTsalisKaons, MassKaon, maxPt4dwnsmplTsalisKaons)) {
716- fillSkimmedV0TableWithdEdxTrQA<true >(casc, bachTrack, bachTrackQA, existBachTrkQA, collision, bachTrack.tpcNSigmaKa (), bachTrack.tofNSigmaKa (), bachTrack.tpcExpSignalKa (bachTrack.tpcSignal ()), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate);
717- }
718- }
719- }
720- }
616+ runWithdEdxTrQA<true >(collisions, myTracks, myV0s, myCascs, tracksQA, perCollisionTracksWithNewDEdx);
721617 } // / process with dEdx from TrackQA
722618 PROCESS_SWITCH (TreeWriterTpcV0, processWithdEdxTrQAWithCorrecteddEdx, " Standard V0 Samples with dEdx from Track QA for PID with corrected dEdx" , false );
723619
0 commit comments