diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index e0755f246b5..fe28e625320 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1104,9 +1104,10 @@ class VarManager : public TObject return false; } - // Flag to set PV recalculation via KF - static void SetPVrecalculationKF(const bool pvRecalKF) { - fgPVrecalKF = pvRecalKF; + // Flag to set PV recalculation via KF + static void SetPVrecalculationKF(const bool pvRecalKF) + { + fgPVrecalKF = pvRecalKF; } // Setup the collision system @@ -1311,7 +1312,7 @@ class VarManager : public TObject static void FillQuadMC(T1 const& t1, T2 const& t2, T2 const& t3, float* values = nullptr); template static void FillPairVertexing(C const& collision, T const& t1, T const& t2, bool propToSV = false, float* values = nullptr); - template + template static void FillPairVertexingRecomputePV(C const& /*collision*/, T const& t1, T const& t2, o2::dataformats::VertexBase pvRefitted, float* values = nullptr); template static void FillTripletVertexing(C const& collision, T const& t1, T const& t2, T const& t3, PairCandidateType tripletType, float* values = nullptr); @@ -4202,7 +4203,7 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2, if constexpr ((pairType == kDecayToEE || pairType == kDecayToKPi) && trackHasCov) { secondaryVertex = fgFitterTwoProngBarrel.getPCACandidate(); - // printf("secVtx (first) %f %f %f \n",secondaryVertex[0],secondaryVertex[1],secondaryVertex[2]); + // printf("secVtx (first) %f %f %f \n",secondaryVertex[0],secondaryVertex[1],secondaryVertex[2]); covMatrixPCA = fgFitterTwoProngBarrel.calcPCACovMatrixFlat(); auto chi2PCA = fgFitterTwoProngBarrel.getChi2AtPCACandidate(); auto trackParVar0 = fgFitterTwoProngBarrel.getTrack(0); @@ -4211,7 +4212,8 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2, v1 = {trackParVar0.getPt(), trackParVar0.getEta(), trackParVar0.getPhi(), m1}; v2 = {trackParVar1.getPt(), trackParVar1.getEta(), trackParVar1.getPhi(), m2}; v12 = v1 + v2; - if(fgPVrecalKF) primaryVertexNew = RecalculatePrimaryVertex(t1, t2, collision); + if (fgPVrecalKF) + primaryVertexNew = RecalculatePrimaryVertex(t1, t2, collision); } else if constexpr (pairType == kDecayToMuMu && muonHasCov) { // Get pca candidate from forward DCA fitter @@ -4269,14 +4271,15 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2, values[kVertexingLxyProjected] = values[kVertexingLxyProjected] / TMath::Sqrt((v12.Px() * v12.Px()) + (v12.Py() * v12.Py())); values[kVertexingLxyzProjected] = ((secondaryVertex[0] - collision.posX()) * v12.Px()) + ((secondaryVertex[1] - collision.posY()) * v12.Py()) + ((secondaryVertex[2] - collision.posZ()) * v12.Pz()); values[kVertexingLxyzProjected] = values[kVertexingLxyzProjected] / TMath::Sqrt((v12.Px() * v12.Px()) + (v12.Py() * v12.Py()) + (v12.Pz() * v12.Pz())); - if(fgPVrecalKF){ - values[kVertexingLxyProjectedRecalculatePV] = (secondaryVertex[0] - primaryVertexNew.getX()) * v12.Px() + (secondaryVertex[1] - primaryVertexNew.getY()) * v12.Py(); - values[kVertexingLxyProjectedRecalculatePV] = values[kVertexingLxyProjectedRecalculatePV] / v12.Pt(); + if (fgPVrecalKF) { + values[kVertexingLxyProjectedRecalculatePV] = (secondaryVertex[0] - primaryVertexNew.getX()) * v12.Px() + (secondaryVertex[1] - primaryVertexNew.getY()) * v12.Py(); + values[kVertexingLxyProjectedRecalculatePV] = values[kVertexingLxyProjectedRecalculatePV] / v12.Pt(); } values[kVertexingTauxyProjected] = values[kVertexingLxyProjected] * v12.M() / (v12.Pt()); values[kVertexingTauxyProjectedPoleJPsiMass] = values[kVertexingLxyProjected] * o2::constants::physics::MassJPsi / (v12.Pt()); values[kVertexingTauxyProjectedNs] = values[kVertexingTauxyProjected] / o2::constants::physics::LightSpeedCm2NS; - if(fgPVrecalKF) values[kVertexingTauxyProjectedPoleJPsiMassRecalculatePV] = values[kVertexingLxyProjectedRecalculatePV] * o2::constants::physics::MassJPsi / (v12.Pt()); + if (fgPVrecalKF) + values[kVertexingTauxyProjectedPoleJPsiMassRecalculatePV] = values[kVertexingLxyProjectedRecalculatePV] * o2::constants::physics::MassJPsi / (v12.Pt()); values[kVertexingTauzProjected] = values[kVertexingLzProjected] * v12.M() / TMath::Abs(v12.Pz()); values[kVertexingTauxyzProjected] = values[kVertexingLxyzProjected] * v12.M() / (v12.P()); } @@ -4495,37 +4498,38 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2, } template -void VarManager::FillPairVertexingRecomputePV(C const& /*collision*/, T const& t1, T const& t2, o2::dataformats::VertexBase pvRefitted, float* values ) -{ - // recompute decay lenght variables using updated primary vertex +void VarManager::FillPairVertexingRecomputePV(C const& /*collision*/, T const& t1, T const& t2, o2::dataformats::VertexBase pvRefitted, float* values) +{ + // recompute decay lenght variables using updated primary vertex - // check at compile time that the event and cov matrix have the cov matrix - constexpr bool eventHasVtxCov = ((collFillMap & Collision) > 0 || (collFillMap & ReducedEventVtxCov) > 0); - constexpr bool trackHasCov = ((fillMap & TrackCov) > 0 || (fillMap & ReducedTrackBarrelCov) > 0); - constexpr bool muonHasCov = ((fillMap & MuonCov) > 0 || (fillMap & ReducedMuonCov) > 0); + // check at compile time that the event and cov matrix have the cov matrix + constexpr bool eventHasVtxCov = ((collFillMap & Collision) > 0 || (collFillMap & ReducedEventVtxCov) > 0); + constexpr bool trackHasCov = ((fillMap & TrackCov) > 0 || (fillMap & ReducedTrackBarrelCov) > 0); + constexpr bool muonHasCov = ((fillMap & MuonCov) > 0 || (fillMap & ReducedMuonCov) > 0); - if (!values) { + if (!values) { values = fgValues; - } + } - float m1 = o2::constants::physics::MassElectron; - float m2 = o2::constants::physics::MassElectron; - if constexpr (pairType == kDecayToKPi) { + float m1 = o2::constants::physics::MassElectron; + float m2 = o2::constants::physics::MassElectron; + if constexpr (pairType == kDecayToKPi) { m1 = o2::constants::physics::MassKaonCharged; m2 = o2::constants::physics::MassPionCharged; - } - if constexpr (pairType == kDecayToMuMu && muonHasCov) { + } + if constexpr (pairType == kDecayToMuMu && muonHasCov) { m1 = o2::constants::physics::MassMuon; m2 = o2::constants::physics::MassMuon; - } - ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), m1); - ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), m2); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + } + ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), m1); + ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), m2); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if(fgFitterTwoProngBarrel.getNCandidates() == 0) return; - Vec3D secondaryVertex; + if (fgFitterTwoProngBarrel.getNCandidates() == 0) + return; + Vec3D secondaryVertex; - if (!fgUsedKF) { // to be updated when seconday vertex is computed with KF + if (!fgUsedKF) { // to be updated when seconday vertex is computed with KF if constexpr (eventHasVtxCov) { if constexpr ((pairType == kDecayToEE || pairType == kDecayToKPi) && trackHasCov) { @@ -4554,7 +4558,6 @@ void VarManager::FillPairVertexingRecomputePV(C const& /*collision*/, T const& t values[kVertexingTauxyProjectedPoleJPsiMassRecalculatePV] = values[kVertexingLxyProjectedRecalculatePV] * o2::constants::physics::MassJPsi / (v12.Pt()); } } - } template diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx index ba0c7ab139a..3a9c27cb956 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx @@ -23,9 +23,6 @@ #include "PWGDQ/Core/MixingLibrary.h" #include "PWGDQ/Core/VarManager.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" -#include -#include -#include #include "Common/Core/PID/PIDTOFParamService.h" #include "Common/Core/TableHelper.h" @@ -34,6 +31,7 @@ #include "Common/DataModel/McCollisionExtra.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" +#include #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" @@ -46,6 +44,8 @@ #include "Framework/AnalysisHelpers.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" +#include +#include #include "TGeoGlobalMagField.h" #include @@ -1163,7 +1163,6 @@ struct AnalysisSameEventPairing { std::vector pvContribTrackPars; std::vector vec_useTrk_PVrefit; - // keep histogram class names in maps, so we don't have to buld their names in the pair loops std::map> fTrackHistNames; std::map> fBarrelHistNamesMCmatched; @@ -1509,17 +1508,16 @@ struct AnalysisSameEventPairing { cout << "AnalysisSameEventPairing::init() completed" << endl; } - void initParamsFromCCDB(uint64_t timestamp, bool withTwoProngFitter = true) { cout << "AnalysisSameEventPairing::initParamsFromCCDB() called for timestamp " << timestamp << endl; if (fConfigOptions.useRemoteField.value) { o2::parameters::GRPMagField* grpmag = fCCDB->getForTimeStamp(fConfigCCDB.grpMagPath, timestamp); - o2::base::MatLayerCylSet* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(fCCDB->get(fConfigCCDB.lutPath)); + o2::base::MatLayerCylSet* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(fCCDB->get(fConfigCCDB.lutPath)); float magField = 0.0; if (grpmag != nullptr) { magField = grpmag->getNominalL3Field(); - o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::initFieldFromGRP(grpmag); o2::base::Propagator::Instance()->setMatLUT(lut); } else { LOGF(fatal, "GRP object is not available in CCDB at timestamp=%llu", timestamp); @@ -1549,53 +1547,56 @@ struct AnalysisSameEventPairing { cout << "AnalysisSameEventPairing::initParamsFromCCDB() completed" << endl; } -template -bool refitPVWithPVertexer(Events const& collision, TTracks const& tracks, Tracks const& t1, Tracks const& t2, o2::dataformats::VertexBase& pvRefitted) -{ - // --- build PV contributor list --- - pvContribGlobIDs.clear(); - pvContribTrackPars.clear(); - // int nMyPVContrib = 0; int nMyPVContribOrig = 0; - for (auto const& trk : tracks) { - // check if it is PV contributor - if (!trk.isPVContributor()) continue; - // check if it contributes to the vtx of this collision - if (trk.collisionId() != collision.globalIndex()) continue; - // nMyPVContribOrig++; - // --- remove t1 and t2 if they are PV contributors --- - if (trk.globalIndex() == t1.globalIndex() || trk.globalIndex() == t2.globalIndex()) continue; - // add tracks and parameters to the list - pvContribGlobIDs.push_back(trk.globalIndex()); - pvContribTrackPars.push_back(getTrackParCov(trk)); - // nMyPVContrib++; - } + template + bool refitPVWithPVertexer(Events const& collision, TTracks const& tracks, Tracks const& t1, Tracks const& t2, o2::dataformats::VertexBase& pvRefitted) + { + // --- build PV contributor list --- + pvContribGlobIDs.clear(); + pvContribTrackPars.clear(); + // int nMyPVContrib = 0; int nMyPVContribOrig = 0; + for (auto const& trk : tracks) { + // check if it is PV contributor + if (!trk.isPVContributor()) + continue; + // check if it contributes to the vtx of this collision + if (trk.collisionId() != collision.globalIndex()) + continue; + // nMyPVContribOrig++; + // --- remove t1 and t2 if they are PV contributors --- + if (trk.globalIndex() == t1.globalIndex() || trk.globalIndex() == t2.globalIndex()) + continue; + // add tracks and parameters to the list + pvContribGlobIDs.push_back(trk.globalIndex()); + pvContribTrackPars.push_back(getTrackParCov(trk)); + // nMyPVContrib++; + } - // cout << "contributors from collision: " << collision.numContrib() << " - from refitting: before -> " << nMyPVContribOrig << " after -> " << nMyPVContrib << endl; - vec_useTrk_PVrefit.assign(pvContribGlobIDs.size(), true); - // --- build VertexBase from event collision --- - o2::dataformats::VertexBase Pvtx; - Pvtx.setX(collision.posX()); - Pvtx.setY(collision.posY()); - Pvtx.setZ(collision.posZ()); - Pvtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), - collision.covXZ(), collision.covYZ(), collision.covZZ()); - - // --- configure vertexer --- - o2::vertexing::PVertexer vertexer; - if (fConfigOptions.removeDiamondConstrPV) { - o2::conf::ConfigurableParam::updateFromString("pvertexer.useMeanVertexConstraint=false"); - } - vertexer.init(); + // cout << "contributors from collision: " << collision.numContrib() << " - from refitting: before -> " << nMyPVContribOrig << " after -> " << nMyPVContrib << endl; + vec_useTrk_PVrefit.assign(pvContribGlobIDs.size(), true); + // --- build VertexBase from event collision --- + o2::dataformats::VertexBase Pvtx; + Pvtx.setX(collision.posX()); + Pvtx.setY(collision.posY()); + Pvtx.setZ(collision.posZ()); + Pvtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), + collision.covXZ(), collision.covYZ(), collision.covZZ()); - bool PVrefit_doable = vertexer.prepareVertexRefit(pvContribTrackPars, Pvtx); - if (!PVrefit_doable) return false; + // --- configure vertexer --- + o2::vertexing::PVertexer vertexer; + if (fConfigOptions.removeDiamondConstrPV) { + o2::conf::ConfigurableParam::updateFromString("pvertexer.useMeanVertexConstraint=false"); + } + vertexer.init(); - // --- do the refit --- - pvRefitted = vertexer.refitVertex(vec_useTrk_PVrefit, Pvtx); + bool PVrefit_doable = vertexer.prepareVertexRefit(pvContribTrackPars, Pvtx); + if (!PVrefit_doable) + return false; - return true; -} + // --- do the refit --- + pvRefitted = vertexer.refitVertex(vec_useTrk_PVrefit, Pvtx); + return true; + } // Template function to run same event pairing (barrel-barrel, muon-muon, barrel-muon) template @@ -1710,17 +1711,18 @@ bool refitPVWithPVertexer(Events const& collision, TTracks const& tracks, Track } if constexpr (TTwoProngFitter) { VarManager::FillPairVertexing(event, t1, t2, fConfigOptions.propToPCA); - if(fConfigOptions.recomputePV){ - VarManager::SetPVrecalculationKF(false); - VarManager::ResetValues(VarManager::kVertexingLxyProjectedRecalculatePV, VarManager::kVertexingLxyProjectedRecalculatePV+1); - VarManager::ResetValues(VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV, VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV+1); - // cout << "primary vertex (before): x -> " << event.posX() << " y -> " << event.posY() << " z -> " << event.posZ() << endl; - o2::dataformats::VertexBase pvRefit; - bool ok = refitPVWithPVertexer(event, tracks, t1, t2, pvRefit); - if(ok) VarManager::FillPairVertexingRecomputePV(event, t1, t2, pvRefit); - // cout << "primary vertex (after): ok -> " << ok << " x -> " << pvRefit.getX() << " y -> " << pvRefit.getY() << " z -> " << pvRefit.getZ() << endl; + if (fConfigOptions.recomputePV) { + VarManager::SetPVrecalculationKF(false); + VarManager::ResetValues(VarManager::kVertexingLxyProjectedRecalculatePV, VarManager::kVertexingLxyProjectedRecalculatePV + 1); + VarManager::ResetValues(VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV, VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV + 1); + // cout << "primary vertex (before): x -> " << event.posX() << " y -> " << event.posY() << " z -> " << event.posZ() << endl; + o2::dataformats::VertexBase pvRefit; + bool ok = refitPVWithPVertexer(event, tracks, t1, t2, pvRefit); + if (ok) + VarManager::FillPairVertexingRecomputePV(event, t1, t2, pvRefit); + // cout << "primary vertex (after): ok -> " << ok << " x -> " << pvRefit.getX() << " y -> " << pvRefit.getY() << " z -> " << pvRefit.getZ() << endl; } - } + } if constexpr (eventHasQvector) { VarManager::FillPairVn(t1, t2); } @@ -1858,7 +1860,7 @@ bool refitPVWithPVertexer(Events const& collision, TTracks const& tracks, Track fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); // reconstructed, unmatched for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals if (mcDecision & (static_cast(1) << isig)) { - PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kRap], VarManager::fgValues[VarManager::kPhi], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMass], VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV], isAmbiInBunch, isAmbiOutOfBunch, isCorrect_pair, VarManager::fgValues[VarManager::kMultFT0A], VarManager::fgValues[VarManager::kMultFT0C], VarManager::fgValues[VarManager::kCentFT0M], VarManager::fgValues[VarManager::kVtxNcontribReal]); + PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kRap], VarManager::fgValues[VarManager::kPhi], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMass], VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV], isAmbiInBunch, isAmbiOutOfBunch, isCorrect_pair, VarManager::fgValues[VarManager::kMultFT0A], VarManager::fgValues[VarManager::kMultFT0C], VarManager::fgValues[VarManager::kCentFT0M], VarManager::fgValues[VarManager::kVtxNcontribReal]); fHistMan->FillHistClass(histNamesMC[icut * fRecMCSignals.size() + isig][0].Data(), VarManager::fgValues); // matched signal /*if (fConfigOptions.fConfigMiniTree) { if constexpr (TPairType == VarManager::kDecayToMuMu) { diff --git a/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx b/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx index 826997bf84b..ff750f6f4cb 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx @@ -21,9 +21,6 @@ #include "PWGDQ/Core/MixingLibrary.h" #include "PWGDQ/Core/VarManager.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" -#include -#include -#include #include "Common/Core/PID/PIDTOFParamService.h" #include "Common/Core/TableHelper.h" @@ -32,6 +29,7 @@ #include "Common/DataModel/McCollisionExtra.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" +#include #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" @@ -44,6 +42,8 @@ #include "Framework/AnalysisHelpers.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" +#include +#include #include "TGeoGlobalMagField.h" #include @@ -378,7 +378,7 @@ struct AnalysisEventSelection { hash(hh); } } - + cout << "AnalysisEventSelection::runEventSelection() completed" << endl; } @@ -386,12 +386,12 @@ struct AnalysisEventSelection { void publishSelections(TEvents const& events) { cout << "AnalysisEventSelection::publishSelections() called" << endl; - std::map collisionSplittingMap; // key: event global index, value: whether pileup event is a possible splitting + std::map collisionSplittingMap; // key: event global index, value: whether pileup event is a possible splitting - // Reset the fValues array and fill event observables + // Reset the fValues array and fill event observables VarManager::ResetValues(0, VarManager::kNEventWiseVariables); - // loop over the BC map, get the collision vectors and make in-bunch and out of bunch 2-event correlations + // loop over the BC map, get the collision vectors and make in-bunch and out of bunch 2-event correlations for (auto bc1It = fBCCollMap.begin(); bc1It != fBCCollMap.end(); ++bc1It) { uint64_t bc1 = bc1It->first; auto const& bc1Events = bc1It->second; @@ -443,7 +443,7 @@ struct AnalysisEventSelection { } } - // publish the table + // publish the table uint32_t evSel = static_cast(0); for (auto& event : events) { evSel = 0; @@ -471,14 +471,14 @@ struct AnalysisEventSelection { cout << "AnalysisEventSelection::processDirect() completed" << endl; } - void processDummy(aod::Collisions&) { } + void processDummy(aod::Collisions&) {} PROCESS_SWITCH(AnalysisEventSelection, processDirect, "Run event selection on framework AO2Ds", false); PROCESS_SWITCH(AnalysisEventSelection, processDummy, "Dummy function", true); }; struct AnalysisTrackSelection { - + Produces trackSel; Produces trackAmbiguities; OutputObj fOutputList{"output"}; @@ -506,11 +506,12 @@ struct AnalysisTrackSelection { std::map> fNAssocsInBunch; // key: track global index, value: vector of global index for events associated in-bunch (events that have in-bunch pileup or splitting) std::map> fNAssocsOutOfBunch; // key: track global index, value: vector of global index for events associated out-of-bunch (events that have no in-bunch pileup) - + void init(o2::framework::InitContext& context) { cout << "AnalysisTrackSelection::init() called" << endl; - if (context.mOptions.get("processDummy")) return; + if (context.mOptions.get("processDummy")) + return; VarManager::SetDefaultVarNames(); fCurrentRun = 0; @@ -555,7 +556,7 @@ struct AnalysisTrackSelection { } dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); // ad-hoc histograms via JSON - VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill + VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } @@ -574,14 +575,15 @@ struct AnalysisTrackSelection { cout << "AnalysisTrackSelection::runTrackSelection() called" << endl; // determine if TEvents table contains aod::Collisions // bool hasCollisions = std::is_same::value; - + fNAssocsInBunch.clear(); fNAssocsOutOfBunch.clear(); VarManager::ResetValues(0, VarManager::kNVars); VarManager::FillTimeFrame(events); VarManager::FillTimeFrame(tracks); - if (fConfigQA) fHistMan->FillHistClass("TimeFrameStats", VarManager::fgValues); + if (fConfigQA) + fHistMan->FillHistClass("TimeFrameStats", VarManager::fgValues); if (bcs.size() > 0 && fCurrentRun != bcs.begin().runNumber()) { if (fConfigComputeTPCpostCalib) { @@ -624,7 +626,8 @@ struct AnalysisTrackSelection { // compute quantities which depend on the associated collision, such as DCA VarManager::FillTrackCollision(track, event); - if (fConfigQA) fHistMan->FillHistClass("AssocsBarrel_BeforeCuts", VarManager::fgValues); + if (fConfigQA) + fHistMan->FillHistClass("AssocsBarrel_BeforeCuts", VarManager::fgValues); int iCut = 0; uint32_t filterMap = static_cast(0); @@ -637,7 +640,7 @@ struct AnalysisTrackSelection { } } // end loop over cuts trackSel(filterMap); - + // count the number of associations per track if (fConfigPublishAmbiguity && filterMap > 0) { if (event.isEventSelected_bit(1)) { @@ -664,7 +667,7 @@ struct AnalysisTrackSelection { // QA the collision-track associations // TODO: some tracks can be associated to both collisions that have in bunch pileup and collisions from different bunches // So one could QA these tracks separately - if (fConfigPublishAmbiguity) { + if (fConfigPublishAmbiguity) { if (fConfigQA) { for (auto& [trackIdx, evIndices] : fNAssocsInBunch) { if (evIndices.size() == 1) { @@ -718,7 +721,7 @@ struct AnalysisTrackSelection { cout << "AnalysisTrackSelection::processWithCovTOFService() called" << endl; fTofResponse->processSetup(bcs.iteratorAt(0)); auto tracksWithTOFservice = soa::Attach(tracks); + o2::aod::TOFNSigmaDynKa, o2::aod::TOFNSigmaDynPr>(tracks); runTrackSelection(assocs, bcs, events, tracksWithTOFservice); cout << "AnalysisTrackSelection::processWithCovTOFService() completed" << endl; } @@ -730,7 +733,6 @@ struct AnalysisTrackSelection { PROCESS_SWITCH(AnalysisTrackSelection, processDummy, "Dummy function", true); }; - struct AnalysisPrefilterSelection { Produces prefilter; // joinable with TracksAssoc @@ -922,18 +924,17 @@ struct AnalysisPrefilterSelection { PROCESS_SWITCH(AnalysisPrefilterSelection, processDummy, "Do nothing", true); }; -struct AnalysisSameEventPairing -{ +struct AnalysisSameEventPairing { Produces dielectronList; Produces dielectronsExtraList; Produces dielectronInfoList; Produces dielectronAllList; Produces dileptonInfoList; Produces PromptNonPromptSepTable; - + o2::base::MatLayerCylSet* fLUT = nullptr; int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. - + OutputObj fOutputList{"output"}; // Histogram manager @@ -942,7 +943,7 @@ struct AnalysisSameEventPairing // Config options // ConfigOptions fConfigOptions; -struct : ConfigurableGroup { + struct : ConfigurableGroup { Configurable track{"cfgTrackCuts", "jpsiO2MCdebugCuts2", "Comma separated list of barrel track cuts"}; Configurable muon{"cfgMuonCuts", "", "Comma separated list of muon cuts"}; Configurable pair{"cfgPairCuts", "", "Comma separated list of pair cuts, !!! Use only if you know what you are doing, otherwise leave empty"}; @@ -966,8 +967,8 @@ struct : ConfigurableGroup { Configurable fConfigMiniTreeMinMass{"cfgMiniTreeMinMass", 2, "Min. mass cut for minitree"}; Configurable fConfigMiniTreeMaxMass{"cfgMiniTreeMaxMass", 5, "Max. mass cut for minitree"}; } fConfigOptions; - - struct : ConfigurableGroup { + + struct : ConfigurableGroup { Configurable url{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpMagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; @@ -980,14 +981,14 @@ struct : ConfigurableGroup { std::vector pvContribGlobIDs; std::vector pvContribTrackPars; std::vector vec_useTrk_PVrefit; - + // keep histogram class names in maps, so we don't have to buld their names in the pair loops std::map> fTrackHistNames; std::map> fMuonHistNames; std::vector fPairCuts; AnalysisCompositeCut fMCGenAccCut; - //bool fUseMCGenAccCut = false; + // bool fUseMCGenAccCut = false; uint32_t fTrackFilterMask; // mask for the track cuts required in this task to be applied on the barrel cuts produced upstream uint32_t fMuonFilterMask; // mask for the muon cuts required in this task to be applied on the muon cuts produced upstream @@ -997,9 +998,8 @@ struct : ConfigurableGroup { bool fHasTwoProngGenMCsignals = false; bool fEnableBarrelHistos; - - Preslice> trackAssocsPerCollision = aod::track_association::collisionId; + Preslice> trackAssocsPerCollision = aod::track_association::collisionId; // Preslice> muonAssocsPerCollision = aod::reducedtrack_association::reducedeventId; void init(o2::framework::InitContext& context) @@ -1195,8 +1195,6 @@ struct : ConfigurableGroup { } // end if (muonCutsStr) */ - - fCurrentRun = 0; fCCDB->setURL(fConfigCCDB.url.value); @@ -1228,17 +1226,16 @@ struct : ConfigurableGroup { cout << "AnalysisSameEventPairing::init() completed" << endl; } - -void initParamsFromCCDB(uint64_t timestamp, bool withTwoProngFitter = true) + void initParamsFromCCDB(uint64_t timestamp, bool withTwoProngFitter = true) { cout << "AnalysisSameEventPairing::initParamsFromCCDB() called for timestamp " << timestamp << endl; if (fConfigOptions.useRemoteField.value) { o2::parameters::GRPMagField* grpmag = fCCDB->getForTimeStamp(fConfigCCDB.grpMagPath, timestamp); - o2::base::MatLayerCylSet* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(fCCDB->get(fConfigCCDB.lutPath)); + o2::base::MatLayerCylSet* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(fCCDB->get(fConfigCCDB.lutPath)); float magField = 0.0; if (grpmag != nullptr) { magField = grpmag->getNominalL3Field(); - o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::initFieldFromGRP(grpmag); o2::base::Propagator::Instance()->setMatLUT(lut); } else { LOGF(fatal, "GRP object is not available in CCDB at timestamp=%llu", timestamp); @@ -1268,53 +1265,56 @@ void initParamsFromCCDB(uint64_t timestamp, bool withTwoProngFitter = true) cout << "AnalysisSameEventPairing::initParamsFromCCDB() completed" << endl; } + template + bool refitPVWithPVertexer(Events const& collision, TTracks const& tracks, Tracks const& t1, Tracks const& t2, o2::dataformats::VertexBase& pvRefitted) + { + // --- build PV contributor list --- + pvContribGlobIDs.clear(); + pvContribTrackPars.clear(); + // int nMyPVContrib = 0; int nMyPVContribOrig = 0; + for (auto const& trk : tracks) { + // check if it is PV contributor + if (!trk.isPVContributor()) + continue; + // check if it contributes to the vtx of this collision + if (trk.collisionId() != collision.globalIndex()) + continue; + // nMyPVContribOrig++; + // --- remove t1 and t2 if they are PV contributors --- + if (trk.globalIndex() == t1.globalIndex() || trk.globalIndex() == t2.globalIndex()) + continue; + // add tracks and parameters to the list + pvContribGlobIDs.push_back(trk.globalIndex()); + pvContribTrackPars.push_back(getTrackParCov(trk)); + // nMyPVContrib++; + } -template -bool refitPVWithPVertexer(Events const& collision, TTracks const& tracks, Tracks const& t1, Tracks const& t2, o2::dataformats::VertexBase& pvRefitted) -{ - // --- build PV contributor list --- - pvContribGlobIDs.clear(); - pvContribTrackPars.clear(); - // int nMyPVContrib = 0; int nMyPVContribOrig = 0; - for (auto const& trk : tracks) { - // check if it is PV contributor - if (!trk.isPVContributor()) continue; - // check if it contributes to the vtx of this collision - if (trk.collisionId() != collision.globalIndex()) continue; - // nMyPVContribOrig++; - // --- remove t1 and t2 if they are PV contributors --- - if (trk.globalIndex() == t1.globalIndex() || trk.globalIndex() == t2.globalIndex()) continue; - // add tracks and parameters to the list - pvContribGlobIDs.push_back(trk.globalIndex()); - pvContribTrackPars.push_back(getTrackParCov(trk)); - // nMyPVContrib++; - } - - // cout << "contributors from collision: " << collision.numContrib() << " - from refitting: before -> " << nMyPVContribOrig << " after -> " << nMyPVContrib << endl; - vec_useTrk_PVrefit.assign(pvContribGlobIDs.size(), true); - // --- build VertexBase from event collision --- - o2::dataformats::VertexBase Pvtx; - Pvtx.setX(collision.posX()); - Pvtx.setY(collision.posY()); - Pvtx.setZ(collision.posZ()); - Pvtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), - collision.covXZ(), collision.covYZ(), collision.covZZ()); - - // --- configure vertexer --- - o2::vertexing::PVertexer vertexer; - if (fConfigOptions.removeDiamondConstrPV) { - o2::conf::ConfigurableParam::updateFromString("pvertexer.useMeanVertexConstraint=false"); - } - vertexer.init(); + // cout << "contributors from collision: " << collision.numContrib() << " - from refitting: before -> " << nMyPVContribOrig << " after -> " << nMyPVContrib << endl; + vec_useTrk_PVrefit.assign(pvContribGlobIDs.size(), true); + // --- build VertexBase from event collision --- + o2::dataformats::VertexBase Pvtx; + Pvtx.setX(collision.posX()); + Pvtx.setY(collision.posY()); + Pvtx.setZ(collision.posZ()); + Pvtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), + collision.covXZ(), collision.covYZ(), collision.covZZ()); + + // --- configure vertexer --- + o2::vertexing::PVertexer vertexer; + if (fConfigOptions.removeDiamondConstrPV) { + o2::conf::ConfigurableParam::updateFromString("pvertexer.useMeanVertexConstraint=false"); + } + vertexer.init(); - bool PVrefit_doable = vertexer.prepareVertexRefit(pvContribTrackPars, Pvtx); - if (!PVrefit_doable) return false; + bool PVrefit_doable = vertexer.prepareVertexRefit(pvContribTrackPars, Pvtx); + if (!PVrefit_doable) + return false; - // --- do the refit --- - pvRefitted = vertexer.refitVertex(vec_useTrk_PVrefit, Pvtx); + // --- do the refit --- + pvRefitted = vertexer.refitVertex(vec_useTrk_PVrefit, Pvtx); - return true; -} + return true; + } // Template function to run same event pairing (barrel-barrel, muon-muon, barrel-muon) template @@ -1337,45 +1337,47 @@ bool refitPVWithPVertexer(Events const& collision, TTracks const& tracks, Track uint32_t twoTrackFilter = 0; int sign1 = 0; int sign2 = 0; - + dielectronList.reserve(1); // dimuonList.reserve(1); dielectronsExtraList.reserve(1); // dimuonsExtraList.reserve(1); dielectronInfoList.reserve(1); dileptonInfoList.reserve(1); - + if (fConfigOptions.flatTables.value) { dielectronAllList.reserve(1); // dimuonAllList.reserve(1); } - + constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0); constexpr bool trackHasCov = ((TTrackFillMap & VarManager::ObjTypes::TrackCov) > 0); - for (auto& event : events) { - if (!event.isEventSelected_bit(0)) continue; + if (!event.isEventSelected_bit(0)) + continue; VarManager::ResetValues(0, VarManager::kNVars); VarManager::FillEvent(event, VarManager::fgValues); auto groupedAssocs = assocs.sliceBy(preslice, event.globalIndex()); - if (groupedAssocs.size() == 0) continue; + if (groupedAssocs.size() == 0) + continue; for (auto& [a1, a2] : o2::soa::combinations(groupedAssocs, groupedAssocs)) { - - if constexpr (TPairType == VarManager::kDecayToEE) { - - twoTrackFilter = a1.isBarrelSelected_raw() & a2.isBarrelSelected_raw() & a1.isBarrelSelectedPrefilter_raw() & a2.isBarrelSelectedPrefilter_raw() & fTrackFilterMask; - if (!twoTrackFilter) continue; - - auto t1 = a1.template track_as(); - auto t2 = a2.template track_as(); - sign1 = t1.sign(); - sign2 = t2.sign(); - - // store the ambiguity number of the two dilepton legs in the last 4 digits of the two-track filter + + if constexpr (TPairType == VarManager::kDecayToEE) { + + twoTrackFilter = a1.isBarrelSelected_raw() & a2.isBarrelSelected_raw() & a1.isBarrelSelectedPrefilter_raw() & a2.isBarrelSelectedPrefilter_raw() & fTrackFilterMask; + if (!twoTrackFilter) + continue; + + auto t1 = a1.template track_as(); + auto t2 = a2.template track_as(); + sign1 = t1.sign(); + sign2 = t2.sign(); + + // store the ambiguity number of the two dilepton legs in the last 4 digits of the two-track filter if (t1.barrelAmbiguityInBunch() > 1) { twoTrackFilter |= (static_cast(1) << 28); } @@ -1389,100 +1391,101 @@ bool refitPVWithPVertexer(Events const& collision, TTracks const& tracks, Track twoTrackFilter |= (static_cast(1) << 31); } - VarManager::FillPair(t1, t2); - // fill tables - dielectronList(event.globalIndex(), VarManager::fgValues[VarManager::kMass], - VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], - t1.sign() + t2.sign(), twoTrackFilter, -1); + VarManager::FillPair(t1, t2); + // fill tables + dielectronList(event.globalIndex(), VarManager::fgValues[VarManager::kMass], + VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], + t1.sign() + t2.sign(), twoTrackFilter, -1); - dielectronInfoList(event.globalIndex(), t1.globalIndex(), t2.globalIndex()); - dileptonInfoList(event.globalIndex(), event.posX(), event.posY(), event.posZ()); - - if (fConfigOptions.fPropTrack) { + dielectronInfoList(event.globalIndex(), t1.globalIndex(), t2.globalIndex()); + dileptonInfoList(event.globalIndex(), event.posX(), event.posY(), event.posZ()); + + if (fConfigOptions.fPropTrack) { VarManager::FillPairCollision(event, t1, t2); } - if constexpr (TTwoProngFitter) { - VarManager::FillPairVertexing(event, t1, t2, fConfigOptions.propToPCA); - o2::dataformats::VertexBase pvRefit; - if(fConfigOptions.recomputePV){ - VarManager::SetPVrecalculationKF(false); - VarManager::ResetValues(VarManager::kVertexingLxyProjectedRecalculatePV, VarManager::kVertexingLxyProjectedRecalculatePV+1); - VarManager::ResetValues(VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV, VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV+1); - // cout << "primary vertex (before): x -> " << event.posX() << " y -> " << event.posY() << " z -> " << event.posZ() << endl; - o2::dataformats::VertexBase pvRefit; - bool ok = refitPVWithPVertexer(event, tracks, t1, t2, pvRefit); - if(ok) VarManager::FillPairVertexingRecomputePV(event, t1, t2, pvRefit); - // cout << "primary vertex (after): ok -> " << ok << " x -> " << pvRefit.getX() << " y -> " << pvRefit.getY() << " z -> " << pvRefit.getZ() << endl; - } - } - - if constexpr (trackHasCov && TTwoProngFitter) { - dielectronsExtraList(t1.globalIndex(), t2.globalIndex(), VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]); - if (fConfigOptions.flatTables.value) { - dielectronAllList(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], t1.sign() + t2.sign(), twoTrackFilter,-1, - // t1.pt(), t1.eta(), t1.phi(), t1.itsClusterMap(), t1.itsChi2NCl(), t1.tpcNClsCrossedRows(), t1.tpcNClsFound(), t1.tpcChi2NCl(), t1.dcaXY(), t1.dcaZ(), t1.tpcSignal(), t1.tpcNSigmaEl(), t1.tpcNSigmaPi(), t1.tpcNSigmaPr(), t1.beta(), t1.tofNSigmaEl(), t1.tofNSigmaPi(), t1.tofNSigmaPr(), - t1.pt(), t1.eta(), t1.phi(), t1.itsClusterMap(), t1.itsChi2NCl(), t1.tpcNClsCrossedRows(), t1.tpcNClsFound(), t1.tpcChi2NCl(), t1.dcaXY(), t1.dcaZ(), t1.tpcSignal(), t1.tpcNSigmaEl(), t1.tpcNSigmaPi(), t1.tpcNSigmaPr(), -999.0, -999.0, -999.0, -999.0, - // t2.pt(), t2.eta(), t2.phi(), t2.itsClusterMap(), t2.itsChi2NCl(), t2.tpcNClsCrossedRows(), t2.tpcNClsFound(), t2.tpcChi2NCl(), t2.dcaXY(), t2.dcaZ(), t2.tpcSignal(), t2.tpcNSigmaEl(), t2.tpcNSigmaPi(), t2.tpcNSigmaPr(), t2.beta(), t2.tofNSigmaEl(), t2.tofNSigmaPi(), t2.tofNSigmaPr(), - t2.pt(), t2.eta(), t2.phi(), t2.itsClusterMap(), t2.itsChi2NCl(), t2.tpcNClsCrossedRows(), t2.tpcNClsFound(), t2.tpcChi2NCl(), t2.dcaXY(), t2.dcaZ(), t2.tpcSignal(), t2.tpcNSigmaEl(), t2.tpcNSigmaPi(), t2.tpcNSigmaPr(), -999.0, -999.0, -999.0, -999.0, - VarManager::fgValues[VarManager::kKFTrack0DCAxyz], VarManager::fgValues[VarManager::kKFTrack1DCAxyz], VarManager::fgValues[VarManager::kKFDCAxyzBetweenProngs], VarManager::fgValues[VarManager::kKFTrack0DCAxy], VarManager::fgValues[VarManager::kKFTrack1DCAxy], VarManager::fgValues[VarManager::kKFDCAxyBetweenProngs], - VarManager::fgValues[VarManager::kKFTrack0DeviationFromPV], VarManager::fgValues[VarManager::kKFTrack1DeviationFromPV], VarManager::fgValues[VarManager::kKFTrack0DeviationxyFromPV], VarManager::fgValues[VarManager::kKFTrack1DeviationxyFromPV], - VarManager::fgValues[VarManager::kKFMass], VarManager::fgValues[VarManager::kKFChi2OverNDFGeo], VarManager::fgValues[VarManager::kVertexingLxyz], VarManager::fgValues[VarManager::kVertexingLxyzOverErr], VarManager::fgValues[VarManager::kVertexingLxy], VarManager::fgValues[VarManager::kVertexingLxyOverErr], VarManager::fgValues[VarManager::kVertexingTauxy], VarManager::fgValues[VarManager::kVertexingTauxyErr], VarManager::fgValues[VarManager::kKFCosPA], VarManager::fgValues[VarManager::kKFJpsiDCAxyz], VarManager::fgValues[VarManager::kKFJpsiDCAxy], - VarManager::fgValues[VarManager::kKFPairDeviationFromPV], VarManager::fgValues[VarManager::kKFPairDeviationxyFromPV], - VarManager::fgValues[VarManager::kKFMassGeoTop], VarManager::fgValues[VarManager::kKFChi2OverNDFGeoTop], - VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjected], - VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]); - } + if constexpr (TTwoProngFitter) { + VarManager::FillPairVertexing(event, t1, t2, fConfigOptions.propToPCA); + o2::dataformats::VertexBase pvRefit; + if (fConfigOptions.recomputePV) { + VarManager::SetPVrecalculationKF(false); + VarManager::ResetValues(VarManager::kVertexingLxyProjectedRecalculatePV, VarManager::kVertexingLxyProjectedRecalculatePV + 1); + VarManager::ResetValues(VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV, VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV + 1); + // cout << "primary vertex (before): x -> " << event.posX() << " y -> " << event.posY() << " z -> " << event.posZ() << endl; + o2::dataformats::VertexBase pvRefit; + bool ok = refitPVWithPVertexer(event, tracks, t1, t2, pvRefit); + if (ok) + VarManager::FillPairVertexingRecomputePV(event, t1, t2, pvRefit); + // cout << "primary vertex (after): ok -> " << ok << " x -> " << pvRefit.getX() << " y -> " << pvRefit.getY() << " z -> " << pvRefit.getZ() << endl; } - - - if constexpr (eventHasQvector) { - VarManager::FillPairVn(t1, t2); + } + + if constexpr (trackHasCov && TTwoProngFitter) { + dielectronsExtraList(t1.globalIndex(), t2.globalIndex(), VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]); + if (fConfigOptions.flatTables.value) { + dielectronAllList(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], t1.sign() + t2.sign(), twoTrackFilter, -1, + // t1.pt(), t1.eta(), t1.phi(), t1.itsClusterMap(), t1.itsChi2NCl(), t1.tpcNClsCrossedRows(), t1.tpcNClsFound(), t1.tpcChi2NCl(), t1.dcaXY(), t1.dcaZ(), t1.tpcSignal(), t1.tpcNSigmaEl(), t1.tpcNSigmaPi(), t1.tpcNSigmaPr(), t1.beta(), t1.tofNSigmaEl(), t1.tofNSigmaPi(), t1.tofNSigmaPr(), + t1.pt(), t1.eta(), t1.phi(), t1.itsClusterMap(), t1.itsChi2NCl(), t1.tpcNClsCrossedRows(), t1.tpcNClsFound(), t1.tpcChi2NCl(), t1.dcaXY(), t1.dcaZ(), t1.tpcSignal(), t1.tpcNSigmaEl(), t1.tpcNSigmaPi(), t1.tpcNSigmaPr(), -999.0, -999.0, -999.0, -999.0, + // t2.pt(), t2.eta(), t2.phi(), t2.itsClusterMap(), t2.itsChi2NCl(), t2.tpcNClsCrossedRows(), t2.tpcNClsFound(), t2.tpcChi2NCl(), t2.dcaXY(), t2.dcaZ(), t2.tpcSignal(), t2.tpcNSigmaEl(), t2.tpcNSigmaPi(), t2.tpcNSigmaPr(), t2.beta(), t2.tofNSigmaEl(), t2.tofNSigmaPi(), t2.tofNSigmaPr(), + t2.pt(), t2.eta(), t2.phi(), t2.itsClusterMap(), t2.itsChi2NCl(), t2.tpcNClsCrossedRows(), t2.tpcNClsFound(), t2.tpcChi2NCl(), t2.dcaXY(), t2.dcaZ(), t2.tpcSignal(), t2.tpcNSigmaEl(), t2.tpcNSigmaPi(), t2.tpcNSigmaPr(), -999.0, -999.0, -999.0, -999.0, + VarManager::fgValues[VarManager::kKFTrack0DCAxyz], VarManager::fgValues[VarManager::kKFTrack1DCAxyz], VarManager::fgValues[VarManager::kKFDCAxyzBetweenProngs], VarManager::fgValues[VarManager::kKFTrack0DCAxy], VarManager::fgValues[VarManager::kKFTrack1DCAxy], VarManager::fgValues[VarManager::kKFDCAxyBetweenProngs], + VarManager::fgValues[VarManager::kKFTrack0DeviationFromPV], VarManager::fgValues[VarManager::kKFTrack1DeviationFromPV], VarManager::fgValues[VarManager::kKFTrack0DeviationxyFromPV], VarManager::fgValues[VarManager::kKFTrack1DeviationxyFromPV], + VarManager::fgValues[VarManager::kKFMass], VarManager::fgValues[VarManager::kKFChi2OverNDFGeo], VarManager::fgValues[VarManager::kVertexingLxyz], VarManager::fgValues[VarManager::kVertexingLxyzOverErr], VarManager::fgValues[VarManager::kVertexingLxy], VarManager::fgValues[VarManager::kVertexingLxyOverErr], VarManager::fgValues[VarManager::kVertexingTauxy], VarManager::fgValues[VarManager::kVertexingTauxyErr], VarManager::fgValues[VarManager::kKFCosPA], VarManager::fgValues[VarManager::kKFJpsiDCAxyz], VarManager::fgValues[VarManager::kKFJpsiDCAxy], + VarManager::fgValues[VarManager::kKFPairDeviationFromPV], VarManager::fgValues[VarManager::kKFPairDeviationxyFromPV], + VarManager::fgValues[VarManager::kKFMassGeoTop], VarManager::fgValues[VarManager::kKFChi2OverNDFGeoTop], + VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjected], + VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]); } + } + + if constexpr (eventHasQvector) { + VarManager::FillPairVn(t1, t2); + } } // Fill normal histograms bool isAmbiInBunch = (twoTrackFilter & (1 << 28)) || (twoTrackFilter & (1 << 29)); bool isAmbiOutOfBunch = (twoTrackFilter & (1 << 30)) || (twoTrackFilter & (1 << 31)); for (int icut = 0; icut < ncuts; icut++) { // loop over cut definitions - if (twoTrackFilter & (static_cast(1) << icut)) { + if (twoTrackFilter & (static_cast(1) << icut)) { if (sign1 * sign2 < 0) { // opposite sign pairs - fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kRap], VarManager::fgValues[VarManager::kPhi], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMass], VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV], isAmbiInBunch, isAmbiOutOfBunch, VarManager::fgValues[VarManager::kMultFT0A], VarManager::fgValues[VarManager::kMultFT0C], VarManager::fgValues[VarManager::kCentFT0M], VarManager::fgValues[VarManager::kVtxNcontribReal]); if (fConfigOptions.fConfigQA) { - if (isAmbiInBunch) { - fHistMan->FillHistClass(histNames[icut][3].Data(), VarManager::fgValues); - } - if (isAmbiOutOfBunch) { - fHistMan->FillHistClass(histNames[icut][3 + 3].Data(), VarManager::fgValues); - } + if (isAmbiInBunch) { + fHistMan->FillHistClass(histNames[icut][3].Data(), VarManager::fgValues); + } + if (isAmbiOutOfBunch) { + fHistMan->FillHistClass(histNames[icut][3 + 3].Data(), VarManager::fgValues); } + } } else if (sign1 > 0) { // ++ pairs fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues); - if (fConfigOptions.fConfigQA) { - if (isAmbiInBunch) { - fHistMan->FillHistClass(histNames[icut][4].Data(), VarManager::fgValues); - } - if (isAmbiOutOfBunch) { - fHistMan->FillHistClass(histNames[icut][4 + 3].Data(), VarManager::fgValues); - } + if (fConfigOptions.fConfigQA) { + if (isAmbiInBunch) { + fHistMan->FillHistClass(histNames[icut][4].Data(), VarManager::fgValues); } + if (isAmbiOutOfBunch) { + fHistMan->FillHistClass(histNames[icut][4 + 3].Data(), VarManager::fgValues); + } + } } else { // -- pairs fHistMan->FillHistClass(histNames[icut][2].Data(), VarManager::fgValues); - if (fConfigOptions.fConfigQA) { - if (isAmbiInBunch) { - fHistMan->FillHistClass(histNames[icut][5].Data(), VarManager::fgValues); - } - if (isAmbiOutOfBunch) { - fHistMan->FillHistClass(histNames[icut][5 + 3].Data(), VarManager::fgValues); - } + if (fConfigOptions.fConfigQA) { + if (isAmbiInBunch) { + fHistMan->FillHistClass(histNames[icut][5].Data(), VarManager::fgValues); + } + if (isAmbiOutOfBunch) { + fHistMan->FillHistClass(histNames[icut][5 + 3].Data(), VarManager::fgValues); } + } } // Pair cuts for (unsigned int iPairCut = 0; iPairCut < fPairCuts.size(); iPairCut++) { AnalysisCompositeCut cut = fPairCuts.at(iPairCut); - if (!cut.IsSelected(VarManager::fgValues)) continue; // apply pair cuts + if (!cut.IsSelected(VarManager::fgValues)) + continue; // apply pair cuts if (sign1 * sign2 < 0) { // opposite sign pairs fHistMan->FillHistClass(histNames[ncuts + icut * fPairCuts.size() + iPairCut][0].Data(), VarManager::fgValues); } else if (sign1 > 0) { // ++ pairs @@ -1492,13 +1495,13 @@ bool refitPVWithPVertexer(Events const& collision, TTracks const& tracks, Track } } // end loop (pair cuts) } - }// end loop (cuts) + } // end loop (cuts) } // end loop over pairs of track associations - } // end loop over events + } // end loop over events cout << "AnalysisSameEventPairing::runSameEventPairing() completed" << endl; } - + void processBarrelOnly(MyEventsSelected const& events, BCsWithTimestamps const& bcs, soa::Join const& barrelAssocs, MyBarrelTracksWithCovWithAmbiguities const& barrelTracks) @@ -1523,7 +1526,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc)}; - //adaptAnalysisTask(cfgc)}; + // adaptAnalysisTask(cfgc)}; } void DefineHistograms(HistogramManager* histMan, TString histClasses, const char* histGroups) @@ -1614,8 +1617,6 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses, const char } // end loop over histogram classes } - - /* struct AnalysisDileptonTrack { int fCurrentRun = -1;