@@ -88,15 +88,17 @@ struct HfFilter { // Main struct for HF triggers
8888 Configurable<std::string> paramCharmMassShape{" paramCharmMassShape" , " 2023_pass3" , " Parametrisation of charm-hadron mass shape (options: 2023_pass3)" };
8989 Configurable<float > numSigmaDeltaMassCharmHad{" numSigmaDeltaMassCharmHad" , 2.5 , " Number of sigma for charm-hadron delta mass cut in B and D resonance triggers" };
9090 Configurable<std::vector<double >> pTBinsBHadron{" pTBinsBHadron" , std::vector<double >{hf_trigger_cuts_presel_beauty::vecBinsPt}, " pT bin limits for beauty hadrons preselections" };
91- Configurable<LabeledArray<double >> cutsBplus{" cutsBplus" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " B+ candidate selection per pT bin" };
92- Configurable<LabeledArray<double >> cutsBzeroToDstar{" cutsBzeroToDstar" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " B0 -> D*+ candidate selection per pT bin" };
93- Configurable<LabeledArray<double >> cutsBzero{" cutsBzero" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " B0 candidate selection per pT bin" };
94- Configurable<LabeledArray<double >> cutsBs{" cutsBs" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " Bs candidate selection per pT bin" };
95- Configurable<LabeledArray<double >> cutsBc{" cutsBc" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " Bc candidate selection per pT bin" };
96- Configurable<LabeledArray<double >> cutsLb{" cutsLb" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " Lb candidate selection per pT bin" };
97- Configurable<LabeledArray<double >> cutsXib{" cutsXib" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " Xib candidate selection per pT bin" };
98- Configurable<LabeledArray<double >> cutsBtoJPsiX{" cutsBtoJPsiX" , {hf_trigger_cuts_presel_beauty::cutsBtoJPsi[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVarsBtoJPsi, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsCutsBeautyToJPsi}, " B->JPsiX candidate selection" };
9991
92+ struct : o2::framework::ConfigurableGroup {
93+ Configurable<LabeledArray<double >> cutsBplus{" cutsBplus" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " B+ candidate selection per pT bin" };
94+ Configurable<LabeledArray<double >> cutsBzeroToDstar{" cutsBzeroToDstar" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " B0 -> D*+ candidate selection per pT bin" };
95+ Configurable<LabeledArray<double >> cutsBzero{" cutsBzero" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " B0 candidate selection per pT bin" };
96+ Configurable<LabeledArray<double >> cutsBs{" cutsBs" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " Bs candidate selection per pT bin" };
97+ Configurable<LabeledArray<double >> cutsBc{" cutsBc" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " Bc candidate selection per pT bin" };
98+ Configurable<LabeledArray<double >> cutsLb{" cutsLb" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " Lb candidate selection per pT bin" };
99+ Configurable<LabeledArray<double >> cutsXib{" cutsXib" , {hf_trigger_cuts_presel_beauty::cuts[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, " Xib candidate selection per pT bin" };
100+ Configurable<LabeledArray<double >> cutsBtoJPsiX{" cutsBtoJPsiX" , {hf_trigger_cuts_presel_beauty::cutsBtoJPsi[0 ], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVarsBtoJPsi, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsCutsBeautyToJPsi}, " B->JPsiX candidate selection" };
101+ } cutsBtoHadrons;
100102 // parameters for femto triggers
101103 Configurable<float > femtoMaxRelativeMomentum{" femtoMaxRelativeMomentum" , 2 ., " Maximal allowed value for relative momentum between charm-proton pairs in GeV/c" };
102104 Configurable<LabeledArray<int >> enableFemtoChannels{" enableFemtoChannels" , {activeFemtoChannels[0 ], 2 , 5 , labelsRowsFemtoChannels, labelsColumnsFemtoChannels}, " Flags to enable/disable femto channels" };
@@ -208,8 +210,8 @@ struct HfFilter { // Main struct for HF triggers
208210 helper.setPtLimitsLcResonanceBachelor (ptCuts->get (0u , 8u ), ptCuts->get (1u , 8u ));
209211 helper.setCutsSingleTrackBeauty (cutsTrackBeauty3Prong, cutsTrackBeauty4Prong, cutsTrackBeauty4Prong);
210212 helper.setCutsSingleTrackCharmBaryonBachelor (cutsTrackCharmBaryonBachelor);
211- helper.setCutsBhadrons (cutsBplus, cutsBzeroToDstar, cutsBzero, cutsBs, cutsBc, cutsLb, cutsXib);
212- helper.setCutsBtoJPsi (cutsBtoJPsiX);
213+ helper.setCutsBhadrons (cutsBtoHadrons. cutsBplus , cutsBtoHadrons. cutsBzeroToDstar , cutsBtoHadrons. cutsBc , cutsBtoHadrons. cutsBzero , cutsBtoHadrons. cutsBs , cutsBtoHadrons. cutsLb , cutsBtoHadrons. cutsXib );
214+ helper.setCutsBtoJPsi (cutsBtoHadrons. cutsBtoJPsiX );
213215 helper.setNsigmaProtonCutsForFemto (std::array{nSigmaPidCuts->get (0u , 3u ), nSigmaPidCuts->get (1u , 3u ), nSigmaPidCuts->get (2u , 3u ), nSigmaPidCuts->get (3u , 3u )});
214216 helper.setNsigmaDeuteronCutsForFemto (std::array{nSigmaPidCuts->get (0u , 6u ), nSigmaPidCuts->get (1u , 6u ), nSigmaPidCuts->get (2u , 6u ), nSigmaPidCuts->get (3u , 6u )});
215217 helper.setNsigmaProtonCutsForCharmBaryons (nSigmaPidCuts->get (0u , 0u ), nSigmaPidCuts->get (1u , 0u ));
@@ -487,7 +489,7 @@ struct HfFilter { // Main struct for HF triggers
487489 auto pt2Prong = RecoDecay::pt (pVec2Prong);
488490
489491 if (preselJPsiToMuMu) {
490- float ptMuonMin = cutsBtoJPsiX->get (0u , 0u ); // assuming that the cut is looser in the first pT bin
492+ float ptMuonMin = cutsBtoHadrons. cutsBtoJPsiX ->get (0u , 0u ); // assuming that the cut is looser in the first pT bin
491493 auto ptPos = RecoDecay::pt (pVecPos);
492494 auto ptNeg = RecoDecay::pt (pVecNeg);
493495 if (ptPos < ptMuonMin || ptNeg < ptMuonMin) {
@@ -1272,27 +1274,27 @@ struct HfFilter { // Main struct for HF triggers
12721274 getPxPyPz (trackParFourth, pVecFourth);
12731275 }
12741276
1275- int charmParticleID[kNBeautyParticles - 2 ] = {o2::constants::physics::Pdg::kDPlus , o2::constants::physics::Pdg::kDS , o2::constants::physics::Pdg::kLambdaCPlus , o2::constants::physics::Pdg::kXiCPlus };
1277+ int charmParticleID[kNBeautyParticles - 3 ] = {o2::constants::physics::Pdg::kDPlus , o2::constants::physics::Pdg::kDS , o2::constants::physics::Pdg::kLambdaCPlus , o2::constants::physics::Pdg::kXiCPlus };
12761278
1277- float massCharmHypos[kNBeautyParticles - 2 ] = {massDPlus, massDs, massLc, massXic};
1279+ float massCharmHypos[kNBeautyParticles - 3 ] = {massDPlus, massDs, massLc, massXic};
12781280 auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty <kBeauty4P >(track, trackParFourth, dcaFourth);
12791281 if (track.sign () * sign3Prong < 0 && TESTBIT (isTrackSelected, kForBeauty )) {
1280- for (int iHypo{0 }; iHypo < kNBeautyParticles - 2 && !keepEvent[kBeauty4P ]; ++iHypo) {
1282+ for (int iHypo{0 }; iHypo < kNBeautyParticles - 3 && !keepEvent[kBeauty4P ]; ++iHypo) {
12811283 if (isBeautyTagged[iHypo] && (TESTBIT (is3ProngInMass[iHypo], 0 ) || TESTBIT (is3ProngInMass[iHypo], 1 ))) {
12821284 auto massCandB = RecoDecay::m (std::array{pVec3Prong, pVecFourth}, std::array{massCharmHypos[iHypo], massPi});
12831285 auto pVecBeauty4Prong = RecoDecay::pVec (pVec3Prong, pVecFourth);
12841286 auto ptCandBeauty4Prong = RecoDecay::pt (pVecBeauty4Prong);
1285- if (helper.isSelectedBhadronInMassRange (ptCandBeauty4Prong, massCandB, iHypo + 2 )) { // + 2 to account for B+ and B0->D*+
1287+ if (helper.isSelectedBhadronInMassRange (ptCandBeauty4Prong, massCandB, iHypo + 3 )) { // + 3 to account for B+ and B0->D*+ and Bc
12861288 if (activateQA) {
1287- registry.fill (HIST (" fHfVtxStages" ), 1 + HfVtxStage::Skimmed, iHypo + 2 );
1289+ registry.fill (HIST (" fHfVtxStages" ), 1 + HfVtxStage::Skimmed, iHypo + 3 );
12881290 }
12891291 if (!activateSecVtxForB) {
12901292 keepEvent[kBeauty4P ] = true ;
12911293 if (applyOptimisation) {
12921294 optimisationTreeBeauty (thisCollId, charmParticleID[iHypo], pt3Prong, scores[iHypo][0 ], scores[iHypo][1 ], scores[iHypo][2 ], dcaFourth[0 ]);
12931295 }
12941296 if (activateQA) {
1295- hMassVsPtB[iHypo + 2 ]->Fill (ptCandBeauty4Prong, massCandB);
1297+ hMassVsPtB[iHypo + 3 ]->Fill (ptCandBeauty4Prong, massCandB);
12961298 }
12971299 } else {
12981300 df3.process (trackParFirst, trackParSecond, trackParThird);
@@ -1306,7 +1308,7 @@ struct HfFilter { // Main struct for HF triggers
13061308 auto pVec3ProngVtx = RecoDecay::pVec (pVecFirstVtx, pVecSecondVtx, pVecThirdVtx);
13071309 if (dfB.process (trackParD, trackParFourth) != 0 ) {
13081310 if (activateQA) {
1309- registry.fill (HIST (" fHfVtxStages" ), 1 + HfVtxStage::BeautyVertex, iHypo + 2 );
1311+ registry.fill (HIST (" fHfVtxStages" ), 1 + HfVtxStage::BeautyVertex, iHypo + 3 );
13101312 }
13111313 dfB.propagateTracksToVertex ();
13121314 const auto & secondaryVertexB = dfB.getPCACandidate ();
@@ -1315,19 +1317,19 @@ struct HfFilter { // Main struct for HF triggers
13151317 dfB.getTrack (1 ).getPxPyPzGlo (pVecFourtVtx);
13161318 o2::gpu::gpustd::array<float , 2 > dca3Prong; // {trackParD.dcaXY(), trackParD.dcaZ()};
13171319 o2::base::Propagator::Instance ()->propagateToDCABxByBz ({collision.posX (), collision.posY (), collision.posZ ()}, trackParD, 2 .f , noMatCorr, &dca3Prong);
1318- bool isBhad = helper.isSelectedBhadron (pVec3ProngVtx, pVecFourtVtx, dca3Prong, dcaFourth, std::array<double , 3 >{static_cast <double >(collision.posX ()), static_cast <double >(collision.posY ()), static_cast <double >(collision.posZ ())}, std::array{secondaryVertexB[0 ], secondaryVertexB[1 ], secondaryVertexB[2 ]}, iHypo + 2 );
1320+ bool isBhad = helper.isSelectedBhadron (pVec3ProngVtx, pVecFourtVtx, dca3Prong, dcaFourth, std::array<double , 3 >{static_cast <double >(collision.posX ()), static_cast <double >(collision.posY ()), static_cast <double >(collision.posZ ())}, std::array{secondaryVertexB[0 ], secondaryVertexB[1 ], secondaryVertexB[2 ]}, iHypo + 3 );
13191321 if (isBhad) {
13201322 keepEvent[kBeauty4P ] = true ;
13211323 // fill optimisation tree
13221324 if (applyOptimisation) {
13231325 optimisationTreeBeauty (thisCollId, charmParticleID[iHypo], pt3Prong, scores[iHypo][0 ], scores[iHypo][1 ], scores[iHypo][2 ], dcaFourth[0 ]);
13241326 }
13251327 if (activateQA) {
1326- registry.fill (HIST (" fHfVtxStages" ), 1 + HfVtxStage::CharmHadPiSelected, iHypo + 2 );
1327- hCpaVsPtB[iHypo + 2 ]->Fill (ptCandBeauty4Prong, RecoDecay::cpa (std::array<double , 3 >{static_cast <double >(collision.posX ()), static_cast <double >(collision.posY ()), static_cast <double >(collision.posZ ())}, std::array{secondaryVertexB[0 ], secondaryVertexB[1 ], secondaryVertexB[2 ]}, RecoDecay::pVec (pVec3ProngVtx, pVecFourtVtx)));
1328- hDecayLengthVsPtB[iHypo + 2 ]->Fill (ptCandBeauty4Prong, RecoDecay::distance (std::array<double , 3 >{static_cast <double >(collision.posX ()), static_cast <double >(collision.posY ()), static_cast <double >(collision.posZ ())}, std::array{secondaryVertexB[0 ], secondaryVertexB[1 ], secondaryVertexB[2 ]}));
1329- hImpactParamProductVsPtB[iHypo + 2 ]->Fill (ptCandBeauty4Prong, dca3Prong[0 ] * dcaFourth[0 ]);
1330- hMassVsPtB[iHypo + 2 ]->Fill (ptCandBeauty4Prong, massCandB);
1328+ registry.fill (HIST (" fHfVtxStages" ), 1 + HfVtxStage::CharmHadPiSelected, iHypo + 3 );
1329+ hCpaVsPtB[iHypo + 3 ]->Fill (ptCandBeauty4Prong, RecoDecay::cpa (std::array<double , 3 >{static_cast <double >(collision.posX ()), static_cast <double >(collision.posY ()), static_cast <double >(collision.posZ ())}, std::array{secondaryVertexB[0 ], secondaryVertexB[1 ], secondaryVertexB[2 ]}, RecoDecay::pVec (pVec3ProngVtx, pVecFourtVtx)));
1330+ hDecayLengthVsPtB[iHypo + 3 ]->Fill (ptCandBeauty4Prong, RecoDecay::distance (std::array<double , 3 >{static_cast <double >(collision.posX ()), static_cast <double >(collision.posY ()), static_cast <double >(collision.posZ ())}, std::array{secondaryVertexB[0 ], secondaryVertexB[1 ], secondaryVertexB[2 ]}));
1331+ hImpactParamProductVsPtB[iHypo + 3 ]->Fill (ptCandBeauty4Prong, dca3Prong[0 ] * dcaFourth[0 ]);
1332+ hMassVsPtB[iHypo + 3 ]->Fill (ptCandBeauty4Prong, massCandB);
13311333 }
13321334 }
13331335 }
0 commit comments