Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 31 additions & 21 deletions PWGDQ/TableProducer/tableMaker_withAssoc.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,6 @@
Produces<ReducedEventsExtended> eventExtended;
Produces<ReducedEventsVtxCov> eventVtxCov;
Produces<ReducedEventsInfo> eventInfo;
Produces<ReducedEventsQvectorCentr> eventQvectorCentr;
Produces<ReducedEventsQvectorCentrExtra> eventQvectorCentrExtra;
Produces<ReducedZdcs> zdc;
Produces<ReducedFITs> fit;
Produces<ReducedEventsMultPV> multPV;
Expand All @@ -208,6 +206,12 @@
Produces<ReducedMFTsExtra> mftTrackExtra;
Produces<ReducedMFTAssoc> mftAssoc;

// Q-vector related tables, to be filled only if the user selects the corresponding option; since they are not needed for the skimming, we keep them in a separate group to avoid filling them when not needed
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would remove for the momento the q-vecotrs calculated by the CF framework. We need more tests to validate it properly

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I would remove the cumulant related tables and the part where I compute it. Though I do not use the GFW to fill these tables. I just need the FT0C amplitudes that I get from collisions tables.
Would it work if I add the FT0C cumulant part in dqFlow and a new process along with the existing processAllQvector and processQvecterFromCenter?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Ankyyadav maybe it is better to keep all the cumulant part in the dqFlow, and fully integrate it in the table-maker in a second moment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay. I have made the changes and put the cumulant part in dqFlow

struct : ProducesGroup {
Produces<ReducedEventsQvectorCentr> eventQvectorCentr;
Produces<ReducedEventsQvectorCentrExtra> eventQvectorCentrExtra;
} qvecGroup;

OutputObj<THashList> fOutputList{"output"}; //! the histogram manager output list
OutputObj<TList> fStatsList{"Statistics"}; //! skimming statistics

Expand Down Expand Up @@ -288,6 +292,11 @@
Configurable<bool> fConfigSaveElectronSample{"cfgSaveElectronSample", false, "If true, only save electron sample"};
} fConfigPostCalibTPC;

//
struct : ConfigurableGroup {
Configurable<bool> fConfigQvectCalibAvailable{"cfgQvectCalibAvailable", false, "If true, qvector calibration objects are available in CCDB for this run"};
} fConfigQvector;

struct : ConfigurableGroup {
// Track related options
Configurable<bool> fPropTrack{"cfgPropTrack", true, "Propagate tracks to associated collision to recalculate DCA and momentum vector"};
Expand Down Expand Up @@ -481,7 +490,7 @@
}
if (fConfigHistOutput.fConfigQA) {
// Barrel track histograms after selections; one histogram directory for each user specified selection
for (auto& cut : fTrackCuts) {

Check failure on line 493 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
histClasses += Form("TrackBarrel_%s;", cut->GetName());
}
}
Expand All @@ -500,7 +509,7 @@
}
if (fConfigHistOutput.fConfigQA) {
// Muon tracks after selections; one directory per selection
for (auto& muonCut : fMuonCuts) {

Check failure on line 512 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
histClasses += Form("Muons_%s;", muonCut->GetName());
}
}
Expand Down Expand Up @@ -546,7 +555,7 @@
TString addEvCutsStr = fConfigCuts.fConfigEventCutsJSON.value;
if (addEvCutsStr != "") {
std::vector<AnalysisCut*> addEvCuts = dqcuts::GetCutsFromJSON(addEvCutsStr.Data());
for (auto& cutIt : addEvCuts) {

Check failure on line 558 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
fEventCut->AddCut(cutIt);
}
}
Expand All @@ -563,7 +572,7 @@
TString addTrackCutsStr = fConfigCuts.fConfigTrackCutsJSON.value;
if (addTrackCutsStr != "") {
std::vector<AnalysisCut*> addTrackCuts = dqcuts::GetCutsFromJSON(addTrackCutsStr.Data());
for (auto& t : addTrackCuts) {

Check failure on line 575 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
fTrackCuts.push_back(reinterpret_cast<AnalysisCompositeCut*>(t));
}
}
Expand All @@ -580,7 +589,7 @@
TString addMuonCutsStr = fConfigCuts.fConfigMuonCutsJSON.value;
if (addMuonCutsStr != "") {
std::vector<AnalysisCut*> addMuonCuts = dqcuts::GetCutsFromJSON(addMuonCutsStr.Data());
for (auto& t : addMuonCuts) {

Check failure on line 592 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
fMuonCuts.push_back(reinterpret_cast<AnalysisCompositeCut*>(t));
}
}
Expand Down Expand Up @@ -785,7 +794,7 @@
// check if this collision is also within the short time range
bool isShort = (thisBC >= pastShortBC && thisBC < futureShortBC);
// loop over all collisions in this BC
for (auto& thisColl : colls) {

Check failure on line 797 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
// skip if this is the same collision
if (thisColl == collision) {
continue;
Expand Down Expand Up @@ -832,7 +841,7 @@
fOccup.oMedianTimeLongA[collision] = 0.0;
float sumMult = 0.0;
if (oTimeMapLongA.size() > 0) {
for (auto& [dt, mult] : oTimeMapLongA) {

Check failure on line 844 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
sumMult += mult;
if (sumMult > fOccup.oContribLongA[collision] / 2.0) {
fOccup.oMedianTimeLongA[collision] = dt;
Expand All @@ -843,7 +852,7 @@
fOccup.oMedianTimeLongC[collision] = 0.0;
sumMult = 0.0;
if (oTimeMapLongC.size() > 0) {
for (auto& [dt, mult] : oTimeMapLongC) {

Check failure on line 855 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
sumMult += mult;
if (sumMult > fOccup.oContribLongC[collision] / 2.0) {
fOccup.oMedianTimeLongC[collision] = dt;
Expand All @@ -854,7 +863,7 @@
fOccup.oMedianTimeShortA[collision] = 0.0;
sumMult = 0.0;
if (oTimeMapShortA.size() > 0) {
for (auto& [dt, mult] : oTimeMapShortA) {

Check failure on line 866 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
sumMult += mult;
if (sumMult > fOccup.oContribShortA[collision] / 2.0) {
fOccup.oMedianTimeShortA[collision] = dt;
Expand All @@ -865,7 +874,7 @@
fOccup.oMedianTimeShortC[collision] = 0.0;
sumMult = 0.0;
if (oTimeMapShortC.size() > 0) {
for (auto& [dt, mult] : oTimeMapShortC) {

Check failure on line 877 in PWGDQ/TableProducer/tableMaker_withAssoc.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
sumMult += mult;
if (sumMult > fOccup.oContribShortC[collision] / 2.0) {
fOccup.oMedianTimeShortC[collision] = dt;
Expand Down Expand Up @@ -1178,11 +1187,12 @@
eventInfo(collision.globalIndex());

if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionQvectCentr) > 0) {
eventQvectorCentr(collision.qvecFT0ARe(), collision.qvecFT0AIm(), collision.qvecFT0CRe(), collision.qvecFT0CIm(), collision.qvecFT0MRe(), collision.qvecFT0MIm(), collision.qvecFV0ARe(), collision.qvecFV0AIm(), collision.qvecTPCposRe(), collision.qvecTPCposIm(), collision.qvecTPCnegRe(), collision.qvecTPCnegIm(),
collision.sumAmplFT0A(), collision.sumAmplFT0C(), collision.sumAmplFT0M(), collision.sumAmplFV0A(), collision.nTrkTPCpos(), collision.nTrkTPCneg());
eventQvectorCentrExtra(collision.qvecTPCallRe(), collision.qvecTPCallIm(), collision.nTrkTPCall());
if (fConfigQvector.fConfigQvectCalibAvailable) {
qvecGroup.eventQvectorCentr(collision.qvecFT0ARe(), collision.qvecFT0AIm(), collision.qvecFT0CRe(), collision.qvecFT0CIm(), collision.qvecFT0MRe(), collision.qvecFT0MIm(), collision.qvecFV0ARe(), collision.qvecFV0AIm(), collision.qvecTPCposRe(), collision.qvecTPCposIm(), collision.qvecTPCnegRe(), collision.qvecTPCnegIm(),
collision.sumAmplFT0A(), collision.sumAmplFT0C(), collision.sumAmplFT0M(), collision.sumAmplFV0A(), collision.nTrkTPCpos(), collision.nTrkTPCneg());
qvecGroup.eventQvectorCentrExtra(collision.qvecTPCallRe(), collision.qvecTPCallIm(), collision.nTrkTPCall());
}
}

if constexpr ((TEventFillMap & VarManager::ObjTypes::Zdc) > 0) {
if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) {
// The DQRapidityGapFilter contains the index of the bc we want to get ZDC info from
Expand Down Expand Up @@ -1917,33 +1927,33 @@
}

// produce the full DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter
void processPbPb(MyEventsWithCentAndMults const& collisions, MyBCs const& bcs,
void processPbPb(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs,
MyBarrelTracksWithCov const& tracksBarrel,
MyMuonsWithCov const& muons, MFTTracks const& mftTracks,
TrackAssoc const& trackAssocs, FwdTrackAssoc const& fwdTrackAssocs,
MFTTrackAssoc const& mftAssocs)
MFTTrackAssoc const& mftAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds)
{
fullSkimming<gkEventFillMapWithCentAndMults, gkTrackFillMapWithCov, gkMuonFillMapWithCov, gkMFTFillMap>(collisions, bcs, nullptr, tracksBarrel, muons, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, nullptr, nullptr, nullptr, nullptr);
fullSkimming<gkEventFillMapWithCentAndMultsQvect, gkTrackFillMapWithCov, gkMuonFillMapWithCov, gkMFTFillMap>(collisions, bcs, nullptr, tracksBarrel, muons, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, nullptr, ft0s, fv0as, fdds);
}

// produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter
void processPbPbBarrelOnly(MyEventsWithCentAndMults const& collisions, MyBCs const& bcs,
void processPbPbBarrelOnly(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs,
MyBarrelTracksWithCov const& tracksBarrel,
TrackAssoc const& trackAssocs)
TrackAssoc const& trackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds)
{
computeOccupancyEstimators(collisions, tracksPosWithCov, tracksNegWithCov, presliceWithCov, bcs);
computeCollMergingTag(collisions, tracksBarrel, presliceWithCov);
fullSkimming<gkEventFillMapWithCentAndMults, gkTrackFillMapWithCov, 0u, 0u>(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
fullSkimming<gkEventFillMapWithCentAndMultsQvect, gkTrackFillMapWithCov, 0u, 0u>(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, nullptr, ft0s, fv0as, fdds);
}

// produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no TOF
void processPbPbBarrelOnlyNoTOF(MyEventsWithCentAndMults const& collisions, MyBCs const& bcs,
void processPbPbBarrelOnlyNoTOF(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs,
MyBarrelTracksWithCovNoTOF const& tracksBarrel,
TrackAssoc const& trackAssocs)
TrackAssoc const& trackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds)
{
computeOccupancyEstimators(collisions, tracksPosWithCovNoTOF, tracksNegWithCovNoTOF, presliceWithCovNoTOF, bcs);
computeCollMergingTag(collisions, tracksBarrel, presliceWithCovNoTOF);
fullSkimming<gkEventFillMapWithCentAndMults, gkTrackFillMapNoTOF, 0u, 0u>(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
fullSkimming<gkEventFillMapWithCentAndMultsQvect, gkTrackFillMapNoTOF, 0u, 0u>(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, nullptr, ft0s, fv0as, fdds);
}

// produce the barrel-only DQ skimmed data model typically for UPC Pb-Pb (no centrality), subscribe to the DQ rapidity gap event filter (filter-PbPb)
Expand All @@ -1957,23 +1967,23 @@
}

// produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter
void processPbPbBarrelOnlyWithV0Bits(MyEventsWithCentAndMults const& collisions, MyBCs const& bcs,
void processPbPbBarrelOnlyWithV0Bits(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs,
MyBarrelTracksWithV0Bits const& tracksBarrel,
TrackAssoc const& trackAssocs)
TrackAssoc const& trackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds)
{
computeOccupancyEstimators(collisions, tracksPos, tracksNeg, preslice, bcs);
computeCollMergingTag(collisions, tracksBarrel, preslice);
fullSkimming<gkEventFillMapWithCentAndMults, gkTrackFillMapWithV0Bits, 0u, 0u>(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
fullSkimming<gkEventFillMapWithCentAndMultsQvect, gkTrackFillMapWithV0Bits, 0u, 0u>(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, nullptr, ft0s, fv0as, fdds);
}

// produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter
void processPbPbBarrelOnlyWithV0BitsNoTOF(MyEventsWithCentAndMults const& collisions, MyBCs const& bcs,
void processPbPbBarrelOnlyWithV0BitsNoTOF(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs,
MyBarrelTracksWithV0BitsNoTOF const& tracksBarrel,
TrackAssoc const& trackAssocs)
TrackAssoc const& trackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds)
{
computeOccupancyEstimators(collisions, tracksPosNoTOF, tracksNegNoTOF, presliceNoTOF, bcs);
computeCollMergingTag(collisions, tracksBarrel, presliceNoTOF);
fullSkimming<gkEventFillMapWithCentAndMults, gkTrackFillMapWithV0BitsNoTOF, 0u, 0u>(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
fullSkimming<gkEventFillMapWithCentAndMultsQvect, gkTrackFillMapWithV0BitsNoTOF, 0u, 0u>(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, nullptr, ft0s, fv0as, fdds);
}

// produce the muon only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter
Expand Down
54 changes: 54 additions & 0 deletions PWGDQ/Tasks/dqFlow.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,53 @@ struct DQEventQvector {
// }
}

// Templated function instantianed for all of the process functions
template <uint32_t TEventFillMap, typename TEvent, typename TFT0s>
void runFillQvectorFromCentralFWWithFT0CCumulants(TEvent const& collision, TFT0s const& /*ft0s*/)
{
VarManager::ResetValues(0, VarManager::kNVars);
VarManager::FillEvent<TEventFillMap>(collision);

float S11C = collision.sumAmplFT0C();
float S12C = 0.f;
float S21C = S11C * S11C;

// Compute sum of squares of amplitudes from FT0C for flow analysis
if (collision.has_foundFT0()) {
auto ft0 = collision.foundFT0();
auto const& ampC = ft0.amplitudeC();
for (auto amp : ampC) {
if (amp > 0.f) {
S12C += amp * amp;
}
}
}
VarManager::FillQVectorFromCentralFW(collision);
std::complex<double> Q21C(collision.qvecFT0CRe() * S11C, collision.qvecFT0CIm() * S11C);

// Fill necessary quantities for cumulant calculations with weighted Q-vectors
float M11REF = S21C - S12C;
float CORR2REF = (norm(Q21C) - S12C) / M11REF;
CORR2REF = std::isnan(M11REF) || std::isinf(M11REF) || std::isnan(CORR2REF) || std::isinf(CORR2REF) ? 0 : CORR2REF;
M11REF = std::isnan(M11REF) || std::isinf(M11REF) || std::isnan(CORR2REF) || std::isinf(CORR2REF) ? 0 : M11REF;

if (fConfigQA) {
fHistMan->FillHistClass("Event_BeforeCuts_centralFW", VarManager::fgValues);
if (fEventCut->IsSelected(VarManager::fgValues)) {
fHistMan->FillHistClass("Event_AfterCuts_centralFW", VarManager::fgValues);
}
}

if (fEventCut->IsSelected(VarManager::fgValues)) {
// temporarily removed --> this table is filled in the table-maker directly
// eventQvectorCentr(collision.qvecFT0ARe(), collision.qvecFT0AIm(), collision.qvecFT0CRe(), collision.qvecFT0CIm(), collision.qvecFT0MRe(), collision.qvecFT0MIm(), collision.qvecFV0ARe(), collision.qvecFV0AIm(), collision.qvecTPCposRe(), collision.qvecTPCposIm(), collision.qvecTPCnegRe(), collision.qvecTPCnegIm(),
// collision.sumAmplFT0A(), collision.sumAmplFT0C(), collision.sumAmplFT0M(), collision.sumAmplFV0A(), collision.nTrkTPCpos(), collision.nTrkTPCneg());
// eventQvectorCentrExtra(collision.qvecTPCallRe(), collision.qvecTPCallIm(), collision.nTrkTPCall());
eventRefFlow(M11REF, -9999, -9999, CORR2REF, -9999, -9999, VarManager::fgValues[VarManager::kCentFT0C]);
eventQvectorExtra(-9999, -9999, -9999, -9999, S11C, S12C, -9999, -9999);
}
}

// Templated function instantianed for all of the process functions
template <uint32_t TEventFillMap, uint32_t TTrackFillMap, typename TEvent, typename TTracks>
void runFillQvector(TEvent const& collision, MyBcs const&, TTracks const& tracks1, aod::Zdcs const&)
Expand Down Expand Up @@ -576,6 +623,12 @@ struct DQEventQvector {
runFillQvectorFromCentralFW<gkEventFillMapRun3>(collisions);
}

// Process to fill Q vector using barrel tracks in a reduced event table for barrel/muon tracks flow related analyses Run 3
void processCentralQvectorWithFT0CCumulants(MyEventsWithCentQvectRun3::iterator const& collision, aod::FT0s const& ft0s)
{
runFillQvectorFromCentralFWWithFT0CCumulants<gkEventFillMapRun3>(collision, ft0s);
}

// Process to fill Q vector using forward tracks in a reduced event table for barrel/muon tracks flow related analyses Run 3
void processForwardQvector(MyEventsWithCentRun3::iterator const& collisions, MyBcs const& bcs, soa::Filtered<aod::MFTTracks> const& tracks, aod::Zdcs const& zdcs)
{
Expand All @@ -592,6 +645,7 @@ struct DQEventQvector {
PROCESS_SWITCH(DQEventQvector, processBarrelQvector, "Run q-vector task on barrel tracks for Run3", false);
PROCESS_SWITCH(DQEventQvector, processAllQvector, "Run q-vector task on barrel tracks for Run3 and using central q-vector", false);
PROCESS_SWITCH(DQEventQvector, processCentralQvector, "Run q-vector task using central q-vector", false);
PROCESS_SWITCH(DQEventQvector, processCentralQvectorWithFT0CCumulants, "Run q-vector task using central q-vector with FT0C cumulants", false);
PROCESS_SWITCH(DQEventQvector, processForwardQvector, "Run q-vector task on forward tracks for Run3", false);
PROCESS_SWITCH(DQEventQvector, processDummy, "Dummy function", false);
};
Expand Down
Loading