Skip to content

Commit 70da5e8

Browse files
committed
Merge branch 'master' of https://github.com/AliceO2Group/O2Physics into doublephianalysisv12
2 parents cfa3e43 + 1e36b14 commit 70da5e8

File tree

14 files changed

+439
-230
lines changed

14 files changed

+439
-230
lines changed

Common/CCDB/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ o2physics_target_root_dictionary(AnalysisCCDB
1919
HEADERS EventSelectionParams.h
2020
HEADERS TriggerAliases.h
2121
HEADERS ctpRateFetcher.h
22+
HEADERS RCTSelectionFlags.h
2223
LINKDEF AnalysisCCDBLinkDef.h)

PWGDQ/Core/HistogramsLibrary.cxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,6 +1654,8 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h
16541654
hm->AddHistogram(histClass, "MassD0region_Rapidity_AveragePt", "", true, 140, 1.5, 2.2, VarManager::kMass, 10, -0.8, 0.8, VarManager::kRap, 150, 0.0, 30.0, VarManager::kPt);
16551655
hm->AddHistogram(histClass, "MassD0region_Pt_ITStrackOccupancy", "Pair mass vs pair Pt vs event ITS occupancy", false, 70, 1.5, 2.2, VarManager::kMass, 160, 0., 20., VarManager::kPt, 200, 0., 20000., VarManager::kTrackOccupancyInTimeRange);
16561656
hm->AddHistogram(histClass, "MassD0region_TPCnSigKa_pIN", "Pair mass vs kaon cand. pIN vs kaon cand. TPC n-#sigma(K)", false, 140, 1.5, 2.2, VarManager::kMass, 100, 0.0, 10.0, VarManager::kPin_leg1, 20, -5.0, 5.0, VarManager::kTPCnSigmaKa_leg1);
1657+
hm->AddHistogram(histClass, "Mass_Pt_Ft0cOccupancy", "", false, 150, 0.0, 5.0, VarManager::kMass, 10, 0., 10., VarManager::kPt, 20, 0., 20000., VarManager::kFT0COccupancyInTimeRange);
1658+
hm->AddHistogram(histClass, "Mass_Pt_ITStrackOccupancy", "", false, 150, 0.0, 5.0, VarManager::kMass, 10, 0., 10., VarManager::kPt, 20, 0., 20000., VarManager::kTrackOccupancyInTimeRange);
16571659
}
16581660
if (subGroupStr.Contains("lambdac")) {
16591661
hm->AddHistogram(histClass, "MassLambdacRegion", "", false, 50, 2.15, 2.4, VarManager::kMass);

PWGDQ/Tasks/dqEfficiency_withAssoc.cxx

Lines changed: 74 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,7 @@ struct AnalysisSameEventPairing {
12521252
Configurable<std::string> recSignals{"cfgBarrelMCRecSignals", "", "Comma separated list of MC signals (reconstructed)"};
12531253
Configurable<std::string> recSignalsJSON{"cfgMCRecSignalsJSON", "", "Comma separated list of MC signals (reconstructed) via JSON"};
12541254
Configurable<bool> skimSignalOnly{"cfgSkimSignalOnly", false, "Configurable to select only matched candidates"};
1255-
Configurable<bool> runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"};
1255+
// Configurable<bool> runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"};
12561256
} fConfigMC;
12571257

12581258
struct : ConfigurableGroup {
@@ -1267,6 +1267,7 @@ struct AnalysisSameEventPairing {
12671267
Service<o2::ccdb::BasicCCDBManager> fCCDB;
12681268

12691269
// Filter filterEventSelected = aod::dqanalysisflags::isEventSelected & uint32_t(1);
1270+
Filter eventFilter = aod::dqanalysisflags::isEventSelected > static_cast<uint32_t>(0);
12701271

12711272
HistogramManager* fHistMan;
12721273

@@ -1298,6 +1299,7 @@ struct AnalysisSameEventPairing {
12981299
if (context.mOptions.get<bool>("processDummy")) {
12991300
return;
13001301
}
1302+
bool isMCGen = context.mOptions.get<bool>("processMCGen") || context.mOptions.get<bool>("processMCGenWithEventSelection");
13011303
VarManager::SetDefaultVarNames();
13021304

13031305
fEnableBarrelHistos = context.mOptions.get<bool>("processAllSkimmed") || context.mOptions.get<bool>("processBarrelOnlySkimmed") || context.mOptions.get<bool>("processBarrelOnlyWithCollSkimmed");
@@ -1555,12 +1557,16 @@ struct AnalysisSameEventPairing {
15551557
}
15561558
}
15571559

1558-
for (auto& sig : fGenMCSignals) {
1559-
if (sig->GetNProngs() == 1) {
1560-
histNames += Form("MCTruthGen_%s;", sig->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function
1561-
} else if (sig->GetNProngs() == 2) {
1562-
histNames += Form("MCTruthGenPair_%s;", sig->GetName());
1563-
fHasTwoProngGenMCsignals = true;
1560+
if (isMCGen) {
1561+
for (auto& sig : fGenMCSignals) {
1562+
if (sig->GetNProngs() == 1) {
1563+
histNames += Form("MCTruthGen_%s;", sig->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function
1564+
histNames += Form("MCTruthGenSel_%s;", sig->GetName());
1565+
} else if (sig->GetNProngs() == 2) {
1566+
histNames += Form("MCTruthGenPair_%s;", sig->GetName());
1567+
histNames += Form("MCTruthGenPairSel_%s;", sig->GetName());
1568+
fHasTwoProngGenMCsignals = true;
1569+
}
15641570
}
15651571
}
15661572

@@ -2044,9 +2050,10 @@ struct AnalysisSameEventPairing {
20442050
{
20452051
runSameEventPairing<true, VarManager::kDecayToEE, gkEventFillMapWithCov, gkTrackFillMapWithCov>(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks);
20462052
runSameEventPairing<true, VarManager::kDecayToMuMu, gkEventFillMapWithCov, gkMuonFillMapWithCov>(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks);
2047-
if (fConfigMC.runMCGenPair) {
2053+
// Feature replaced by processMCGen and processMCGenWithEventSelection
2054+
/*if (fConfigMC.runMCGenPair) {
20482055
runMCGen(mcEvents, mcTracks);
2049-
}
2056+
}*/
20502057
// runSameEventPairing<true, VarManager::kElectronMuon, gkEventFillMap, gkTrackFillMap>(event, tracks, muons);
20512058
}
20522059

@@ -2055,30 +2062,81 @@ struct AnalysisSameEventPairing {
20552062
MyBarrelTracksWithCovWithAmbiguities const& barrelTracks, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks)
20562063
{
20572064
runSameEventPairing<true, VarManager::kDecayToEE, gkEventFillMapWithCov, gkTrackFillMapWithCov>(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks);
2058-
if (fConfigMC.runMCGenPair) {
2065+
// Feature replaced by processMCGen and processMCGenWithEventSelection
2066+
/*if (fConfigMC.runMCGenPair) {
20592067
runMCGen(mcEvents, mcTracks);
2060-
}
2068+
}*/
20612069
}
20622070

20632071
void processBarrelOnlyWithCollSkimmed(MyEventsVtxCovSelected const& events,
20642072
soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const& barrelAssocs,
20652073
MyBarrelTracksWithCovWithAmbiguitiesWithColl const& barrelTracks, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks)
20662074
{
20672075
runSameEventPairing<true, VarManager::kDecayToEE, gkEventFillMapWithCov, gkTrackFillMapWithCovWithColl>(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks);
2068-
if (fConfigMC.runMCGenPair) {
2076+
// Feature replaced by processMCGen and processMCGenWithEventSelection
2077+
/*if (fConfigMC.runMCGenPair) {
20692078
runMCGen(mcEvents, mcTracks);
2070-
}
2079+
}*/
20712080
}
20722081

20732082
void processMuonOnlySkimmed(MyEventsVtxCovSelected const& events,
20742083
soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks)
20752084
{
20762085
runSameEventPairing<true, VarManager::kDecayToMuMu, gkEventFillMapWithCov, gkMuonFillMapWithCov>(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks);
2077-
if (fConfigMC.runMCGenPair) {
2086+
// Feature replaced by processMCGen and processMCGenWithEventSelection
2087+
/*if (fConfigMC.runMCGenPair) {
20782088
runMCGen(mcEvents, mcTracks);
2089+
}*/
2090+
}
2091+
2092+
void processMCGen(ReducedMCTracks const& mcTracks)
2093+
{
2094+
// loop over mc stack and fill histograms for pure MC truth signals
2095+
// group all the MC tracks which belong to the MC event corresponding to the current reconstructed event
2096+
// auto groupedMCTracks = tracksMC.sliceBy(aod::reducedtrackMC::reducedMCeventId, event.reducedMCevent().globalIndex());
2097+
for (auto& mctrack : mcTracks) {
2098+
2099+
VarManager::FillTrackMC(mcTracks, mctrack);
2100+
// NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete.
2101+
// NOTE: However, the working model is that the decisions on MC signals are precomputed during skimming and are stored in the mcReducedFlags member.
2102+
// TODO: Use the mcReducedFlags to select signals
2103+
for (auto& sig : fGenMCSignals) {
2104+
if (sig->CheckSignal(true, mctrack)) {
2105+
fHistMan->FillHistClass(Form("MCTruthGen_%s", sig->GetName()), VarManager::fgValues);
2106+
}
2107+
}
20792108
}
20802109
}
20812110

2111+
PresliceUnsorted<ReducedMCTracks> perReducedMcGenEvent = aod::reducedtrackMC::reducedMCeventId;
2112+
2113+
void processMCGenWithEventSelection(soa::Filtered<MyEventsVtxCovSelected> const& events,
2114+
ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& mcTracks)
2115+
{
2116+
for (auto& event : events) {
2117+
if (!event.isEventSelected_bit(0)) {
2118+
continue;
2119+
}
2120+
if (!event.has_reducedMCevent()) {
2121+
continue;
2122+
}
2123+
2124+
auto groupedMCTracks = mcTracks.sliceBy(perReducedMcGenEvent, event.reducedMCeventId());
2125+
groupedMCTracks.bindInternalIndicesTo(&mcTracks);
2126+
for (auto& track : groupedMCTracks) {
2127+
2128+
VarManager::FillTrackMC(mcTracks, track);
2129+
2130+
auto track_raw = groupedMCTracks.rawIteratorAt(track.globalIndex());
2131+
for (auto& sig : fGenMCSignals) {
2132+
if (sig->CheckSignal(true, track_raw)) {
2133+
fHistMan->FillHistClass(Form("MCTruthGenSel_%s", sig->GetName()), VarManager::fgValues);
2134+
}
2135+
}
2136+
}
2137+
} // end loop over reconstructed events
2138+
}
2139+
20822140
void processDummy(MyEvents&)
20832141
{
20842142
// do nothing
@@ -2088,6 +2146,8 @@ struct AnalysisSameEventPairing {
20882146
PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlySkimmed, "Run barrel only pairing, with skimmed tracks", false);
20892147
PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlyWithCollSkimmed, "Run barrel only pairing, with skimmed tracks and with collision information", false);
20902148
PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmed, "Run muon only pairing, with skimmed tracks", false);
2149+
PROCESS_SWITCH(AnalysisSameEventPairing, processMCGen, "Loop over MC particle stack and fill generator level histograms", false);
2150+
PROCESS_SWITCH(AnalysisSameEventPairing, processMCGenWithEventSelection, "Loop over MC particle stack and fill generator level histograms with event selection", false);
20912151
PROCESS_SWITCH(AnalysisSameEventPairing, processDummy, "Dummy function, enabled only if none of the others are enabled", false);
20922152
};
20932153

PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,49 @@ struct MyConfigs : ConfigurableGroup {
160160

161161
struct lmeehfcocktailprefilter {
162162

163+
HistogramRegistry registry{"registry", {}};
164+
std::vector<std::shared_ptr<TH1>> hRapQuark;
163165
Produces<o2::aod::HfTable> hfTable;
166+
ConfigurableAxis fConfigRapBins{"cfgRapBins", {200, -10.f, 10.f}, "Quark rapidity binning"};
167+
168+
void init(o2::framework::InitContext&)
169+
{
170+
const int Nchannels = 2;
171+
const char* typeNamesSingle[Nchannels] = {"b", "c"};
172+
const char* typeTitlesSingle[Nchannels] = {"b", "c"};
173+
174+
AxisSpec rap_axis = {fConfigRapBins, "y_{b}"};
175+
176+
// quark histograms
177+
for (int i = 0; i < Nchannels; i++) {
178+
hRapQuark.push_back(registry.add<TH1>(Form("Quark_Rap_%s", typeNamesSingle[i]), Form("Rap Quark %s", typeTitlesSingle[i]), HistType::kTH1F, {rap_axis}, true));
179+
}
180+
}
181+
164182
void process(aod::McParticles const& mcParticles)
165183
{
166184
for (auto const& p : mcParticles) {
185+
// Look at quarks which fragment
186+
if (abs(p.pdgCode()) == 5 || abs(p.pdgCode()) == 4) {
187+
bool foundhadrons = kFALSE;
188+
if (p.has_daughters()) {
189+
const auto& daughtersSlice = p.daughters_as<aod::McParticles>();
190+
for (auto& d : daughtersSlice) {
191+
int pdgfragment = d.pdgCode();
192+
if (static_cast<int>(abs(pdgfragment) / 100.) == abs(p.pdgCode()) || static_cast<int>(abs(pdgfragment) / 1000.) == abs(p.pdgCode())) {
193+
foundhadrons = kTRUE;
194+
}
195+
}
196+
}
197+
if (foundhadrons) {
198+
if (abs(p.pdgCode()) == 4)
199+
hRapQuark[1]->Fill(p.y());
200+
else if (abs(p.pdgCode()) == 5)
201+
hRapQuark[0]->Fill(p.y());
202+
}
203+
}
167204

205+
// Look at electrons
168206
if (abs(p.pdgCode()) != 11 || o2::mcgenstatus::getHepMCStatusCode(p.statusCode()) != 1 || !p.has_mothers()) {
169207
hfTable(EFromHFType::kNoE, -1, -1, -1, -1, -1, -1, -999., -999.);
170208
continue;

PWGEM/Dilepton/Utils/MCUtilities.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -481,14 +481,16 @@ int searchMothers(T& p, U& mcParticles, int pdg, bool equal)
481481
for (int i : allmothersids) {
482482
auto mother = mcParticles.iteratorAt(i);
483483
int mpdg = mother.pdgCode();
484-
if (abs(mpdg) == pdg && mpdg * p.pdgCode() > 0) { // check for quark
485-
if (quark_id > -1 || next_mother_id > -1) { // we already found a possible candidate in the list of mothers, so now we have (at least) two
484+
// if (abs(mpdg) == pdg && mpdg * p.pdgCode() > 0) { // check for quark
485+
if (abs(mpdg) == pdg) { // check for quark to allow for beauty and charm + oscillation
486+
if (quark_id > -1 || next_mother_id > -1) { // we already found a possible candidate in the list of mothers, so now we have (at least) two
486487
// LOG(warning) << "Flavour tracking is ambiguous. Stopping here.";
487488
return -1;
488489
}
489490
quark_id = i;
490-
} else if ((static_cast<int>(abs(mpdg) / 100) == pdg || static_cast<int>(abs(mpdg) / 1000) == pdg) && mpdg * p.pdgCode() > 0) { // check for other mothers with flavour content
491-
if (quark_id > -1 || next_mother_id > -1) { // we already found a possible candidate in the list of mothers, so now we have (at least) two
491+
//} else if ((static_cast<int>(abs(mpdg) / 100) == pdg || static_cast<int>(abs(mpdg) / 1000) == pdg) && mpdg * p.pdgCode() > 0) { // check for other mothers with flavour content
492+
} else if ((static_cast<int>(abs(mpdg) / 100) == pdg || static_cast<int>(abs(mpdg) / 1000) == pdg)) { // check for other mothers with flavour content to allow for beauty and charm
493+
if (quark_id > -1 || next_mother_id > -1) { // we already found a possible candidate in the list of mothers, so now we have (at least) two
492494
// LOG(warning) << "Flavour tracking is ambiguous. Stopping here.";
493495
return -1;
494496
}

PWGEM/PhotonMeson/DataModel/bcWiseTables.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,29 +79,29 @@ DECLARE_SOA_COLUMN(StoredCentrality, storedCentrality, uint8_t); //! FT0M centra
7979
DECLARE_SOA_COLUMN(StoredZVtx, storedZVtx, int16_t); //! Z-vertex position (x1000)
8080

8181
DECLARE_SOA_DYNAMIC_COLUMN(Centrality, centrality, [](uint8_t storedcentrality) -> float { return storedcentrality / emdownscaling::downscalingFactors[emdownscaling::kFT0MCent]; }); //! Centrality (0-100)
82-
DECLARE_SOA_DYNAMIC_COLUMN(ZVtx, zVtx, [](uint8_t storedzvtx) -> float { return storedzvtx / emdownscaling::downscalingFactors[emdownscaling::kZVtx]; }); //! Centrality (0-100)
82+
DECLARE_SOA_DYNAMIC_COLUMN(ZVtx, zVtx, [](int16_t storedzvtx) -> float { return storedzvtx / emdownscaling::downscalingFactors[emdownscaling::kZVtx]; }); //! Centrality (0-100)
8383
} // namespace bcwisecollision
8484
DECLARE_SOA_TABLE(BCWiseCollisions, "AOD", "BCWISECOLL", //! table of skimmed EMCal clusters
8585
o2::soa::Index<>, BCWiseBCId, bcwisecollision::StoredCentrality, bcwisecollision::StoredZVtx,
8686
bcwisecollision::Centrality<bcwisecollision::StoredCentrality>, bcwisecollision::ZVtx<bcwisecollision::StoredZVtx>);
8787

8888
namespace bcwisecluster
8989
{
90-
DECLARE_SOA_COLUMN(StoredDefinition, storedDefinition, uint8_t); //! cluster definition, see EMCALClusterDefinition.h
91-
DECLARE_SOA_COLUMN(StoredE, storedE, uint16_t); //! cluster energy (1 MeV -> Maximum cluster energy of ~65 GeV)
92-
DECLARE_SOA_COLUMN(StoredEta, storedEta, int16_t); //! cluster pseudorapidity (x10,000)
93-
DECLARE_SOA_COLUMN(StoredPhi, storedPhi, uint16_t); //! cluster azimuthal angle (x10 000) from 0 to 2pi
94-
DECLARE_SOA_COLUMN(StoredNCells, storedNCells, uint8_t); //! number of cells in cluster
95-
DECLARE_SOA_COLUMN(StoredM02, storedM02, uint16_t); //! shower shape long axis (x10 000)
96-
DECLARE_SOA_COLUMN(StoredTime, storedTime, int16_t); //! cluster time (10 ps resolution)
97-
DECLARE_SOA_COLUMN(StoredIsExotic, storedIsExotic, bool); //! flag to mark cluster as exotic
98-
99-
DECLARE_SOA_DYNAMIC_COLUMN(Definition, definition, [](uint8_t storedDefinition) -> uint8_t { return storedDefinition; }); //! cluster definition, see EMCALClusterDefinition.h
100-
DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](uint16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! cluster energy (GeV)
90+
DECLARE_SOA_COLUMN(StoredDefinition, storedDefinition, int8_t); //! cluster definition, see EMCALClusterDefinition.h
91+
DECLARE_SOA_COLUMN(StoredE, storedE, int16_t); //! cluster energy (1 MeV -> Maximum cluster energy of ~32 GeV)
92+
DECLARE_SOA_COLUMN(StoredEta, storedEta, int16_t); //! cluster pseudorapidity (x10,000)
93+
DECLARE_SOA_COLUMN(StoredPhi, storedPhi, uint16_t); //! cluster azimuthal angle (x10 000) from 0 to 2pi
94+
DECLARE_SOA_COLUMN(StoredNCells, storedNCells, int8_t); //! number of cells in cluster
95+
DECLARE_SOA_COLUMN(StoredM02, storedM02, int16_t); //! shower shape long axis (x10 000)
96+
DECLARE_SOA_COLUMN(StoredTime, storedTime, int16_t); //! cluster time (10 ps resolution)
97+
DECLARE_SOA_COLUMN(StoredIsExotic, storedIsExotic, bool); //! flag to mark cluster as exotic
98+
99+
DECLARE_SOA_DYNAMIC_COLUMN(Definition, definition, [](int8_t storedDefinition) -> int8_t { return storedDefinition; }); //! cluster definition, see EMCALClusterDefinition.h
100+
DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](int16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! cluster energy (GeV)
101101
DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](int16_t storedEta) -> float { return storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta]; }); //! cluster pseudorapidity
102102
DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](uint16_t storedPhi) -> float { return storedPhi / emdownscaling::downscalingFactors[emdownscaling::kPhi]; }); //! cluster azimuthal angle (0 to 2pi)
103-
DECLARE_SOA_DYNAMIC_COLUMN(NCells, nCells, [](uint16_t storedNCells) -> uint16_t { return storedNCells; }); //! number of cells in cluster
104-
DECLARE_SOA_DYNAMIC_COLUMN(M02, m02, [](uint16_t storedM02) -> float { return storedM02 / emdownscaling::downscalingFactors[emdownscaling::kM02]; }); //! shower shape long axis
103+
DECLARE_SOA_DYNAMIC_COLUMN(NCells, nCells, [](int16_t storedNCells) -> int16_t { return storedNCells; }); //! number of cells in cluster
104+
DECLARE_SOA_DYNAMIC_COLUMN(M02, m02, [](int16_t storedM02) -> float { return storedM02 / emdownscaling::downscalingFactors[emdownscaling::kM02]; }); //! shower shape long axis
105105
DECLARE_SOA_DYNAMIC_COLUMN(Time, time, [](int16_t storedTime) -> float { return storedTime / emdownscaling::downscalingFactors[emdownscaling::kTime]; }); //! cluster time (ns)
106106
DECLARE_SOA_DYNAMIC_COLUMN(IsExotic, isExotic, [](bool storedIsExotic) -> bool { return storedIsExotic; }); //! flag to mark cluster as exotic
107107

0 commit comments

Comments
 (0)