Skip to content

Commit c35e678

Browse files
authored
Merge ae63253 into sapling-pr-archive-ktf
2 parents 80e149c + ae63253 commit c35e678

17 files changed

Lines changed: 452 additions & 260 deletions

Framework/AnalysisSupport/src/AODWriterHelpers.cxx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include "Framework/TableConsumer.h"
2222
#include "Framework/DataOutputDirector.h"
2323
#include "Framework/TableTreeHelpers.h"
24-
#include "Framework/Monitoring.h"
2524
#include "Framework/Signpost.h"
2625

2726
#include <Monitoring/Monitoring.h>
@@ -32,8 +31,6 @@
3231
#include <TMap.h>
3332
#include <TObjString.h>
3433
#include <arrow/table.h>
35-
#include <chrono>
36-
#include <ios>
3734

3835
O2_DECLARE_DYNAMIC_LOG(histogram_registry);
3936

@@ -157,7 +154,7 @@ AlgorithmSpec AODWriterHelpers::getOutputTTreeWriter(ConfigContext const& ctx)
157154
}
158155

159156
// skip non-AOD refs
160-
if (!DataSpecUtils::partialMatch(*ref.spec, writableAODOrigins)) {
157+
if (!DataSpecUtils::partialMatch(*ref.spec, AODOrigins)) {
161158
continue;
162159
}
163160
startTime = DataRefUtils::getHeader<DataProcessingHeader*>(ref)->startTime;

Framework/Core/include/Framework/ASoA.h

Lines changed: 151 additions & 111 deletions
Large diffs are not rendered by default.

Framework/Core/include/Framework/AnalysisDataModel.h

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ DECLARE_SOA_TABLE(BCFlags, "AOD", "BCFLAG", //! flag for tagging UPCs, joinable
5151
bc::Flags);
5252

5353
using BCs = BCs_001; // current version
54+
template <aod::is_origin_hash O>
55+
using BCsFrom = BCs_001From<O>;
5456
using BC = BCs::iterator;
5557

5658
namespace timestamp
@@ -66,7 +68,7 @@ using BCsWithTimestamps = soa::Join<aod::BCs, aod::Timestamps>;
6668

6769
namespace soa
6870
{
69-
extern template struct JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::BCs, aod::Timestamps>;
71+
extern template struct Join<aod::BCs, aod::Timestamps>;
7072
}
7173
namespace aod
7274
{
@@ -514,11 +516,11 @@ DECLARE_SOA_TABLE_FULL(StoredTracksIU, "Tracks_IU", "AOD", "TRACK_IU", //! On di
514516
track::Sign<track::Signed1Pt>,
515517
o2::soa::Marker<2>);
516518

517-
DECLARE_SOA_EXTENDED_TABLE(TracksIU, StoredTracksIU, "EXTRACK_IU", 0, //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking
518-
aod::track::Pt,
519-
aod::track::P,
520-
aod::track::Eta,
521-
aod::track::Phi);
519+
DECLARE_SOA_EXTENDED_TABLE_NG(TracksIU, StoredTracksIU, "EXTRACK_IU", 0, //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking
520+
aod::track::Pt,
521+
aod::track::P,
522+
aod::track::Eta,
523+
aod::track::Phi);
522524

523525
DECLARE_SOA_TABLE_FULL(StoredTracksCov, "TracksCov", "AOD", "TRACKCOV", //! On disk version of the TracksCov table at collision vertex
524526
track::SigmaY, track::SigmaZ, track::SigmaSnp, track::SigmaTgl, track::Sigma1Pt,
@@ -680,9 +682,9 @@ using Run2TrackExtra = Run2TrackExtras::iterator;
680682
} // namespace aod
681683
namespace soa
682684
{
683-
extern template struct soa::JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::Tracks, aod::TracksExtra>;
684-
extern template struct soa::JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::Tracks, aod::TracksCov, aod::TracksExtra>;
685-
extern template struct soa::JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::TracksExtension, aod::StoredTracks>;
685+
extern template struct soa::Join<aod::Tracks, aod::TracksExtra>;
686+
extern template struct soa::Join<aod::Tracks, aod::TracksCov, aod::TracksExtra>;
687+
extern template struct soa::Join<aod::TracksExtension, aod::StoredTracks>;
686688
} // namespace soa
687689
namespace aod
688690
{
@@ -926,6 +928,8 @@ using MFTTracks = MFTTracks_001;
926928
using StoredMFTTracks = StoredMFTTracks_001;
927929

928930
using MFTTrack = MFTTracks::iterator;
931+
template <aod::is_origin_hash O>
932+
using MFTTracksFrom = MFTTracks_001From<O>;
929933

930934
namespace fwdtrack // Index to MFTtrack column must be defined after table definition.
931935
{
@@ -1005,7 +1009,7 @@ using MFTTrackCovFwd = MFTTracksCov::iterator;
10051009
} // namespace aod
10061010
namespace soa
10071011
{
1008-
extern template struct JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::FwdTracks, aod::FwdTracksCov>;
1012+
extern template struct Join<aod::FwdTracks, aod::FwdTracksCov>;
10091013
}
10101014
namespace aod
10111015
{
@@ -2026,6 +2030,8 @@ DECLARE_SOA_EXTENDED_TABLE(McParticles_001, StoredMcParticles_001, "EXMCPARTICLE
20262030
using StoredMcParticles = StoredMcParticles_001;
20272031
using McParticles = McParticles_001;
20282032
using McParticle = McParticles::iterator;
2033+
template <aod::is_origin_hash O>
2034+
using McParticlesFrom = McParticles_001From<O>;
20292035
} // namespace aod
20302036
namespace soa
20312037
{
@@ -2191,11 +2197,11 @@ DECLARE_SOA_INDEX_COLUMN(FDD, fdd); //!
21912197
// First entry: Collision
21922198
#define INDEX_LIST_RUN2 indices::CollisionId, indices::ZdcId, indices::BCId, indices::FT0Id, indices::FV0AId, indices::FV0CId, indices::FDDId
21932199
DECLARE_SOA_INDEX_TABLE_EXCLUSIVE(Run2MatchedExclusive, BCs, "MA_RN2_EX", INDEX_LIST_RUN2); //!
2194-
DECLARE_SOA_INDEX_TABLE(Run2MatchedSparse, BCs, "MA_RN2_SP", INDEX_LIST_RUN2); //!
2200+
DECLARE_SOA_INDEX_TABLE(Run2MatchedSparse, BCs_001, "MA_RN2_SP", INDEX_LIST_RUN2); //!
21952201

21962202
#define INDEX_LIST_RUN3 indices::CollisionId, indices::ZdcId, indices::BCId, indices::FT0Id, indices::FV0AId, indices::FDDId
21972203
DECLARE_SOA_INDEX_TABLE_EXCLUSIVE(Run3MatchedExclusive, BCs, "MA_RN3_EX", INDEX_LIST_RUN3); //!
2198-
DECLARE_SOA_INDEX_TABLE(Run3MatchedSparse, BCs, "MA_RN3_SP", INDEX_LIST_RUN3); //!
2204+
DECLARE_SOA_INDEX_TABLE(Run3MatchedSparse, BCs_001, "MA_RN3_SP", INDEX_LIST_RUN3); //!
21992205

22002206
// First entry: BC
22012207
DECLARE_SOA_INDEX_TABLE_EXCLUSIVE(MatchedBCCollisionsExclusive, BCs, "MA_BCCOL_EX", //!
@@ -2225,8 +2231,8 @@ DECLARE_EQUIVALENT_FOR_INDEX(aod::StoredTracksIU, aod::McTrackLabels);
22252231
DECLARE_EQUIVALENT_FOR_INDEX(aod::Collisions, aod::McCollisionLabels);
22262232
// Joins with collisions (only for sparse ones)
22272233
// NOTE: index table needs to be always last argument
2228-
extern template struct JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::Collisions, aod::Run2MatchedSparse>;
2229-
extern template struct JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::Collisions, aod::Run3MatchedSparse>;
2234+
extern template struct Join<aod::Collisions, aod::Run2MatchedSparse>;
2235+
extern template struct Join<aod::Collisions, aod::Run3MatchedSparse>;
22302236
} // namespace soa
22312237
namespace aod
22322238
{

Framework/Core/include/Framework/AnalysisHelpers.h

Lines changed: 80 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ auto makeEmptyTable(const char* name)
7979
}
8080

8181
template <soa::TableRef R>
82+
requires(soa::not_void<typename aod::MetadataTrait<aod::Hash<R.desc_hash>>::metadata>)
8283
auto makeEmptyTable()
8384
{
8485
auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(typename aod::MetadataTrait<aod::Hash<R.desc_hash>>::metadata::persistent_columns_t{}));
@@ -93,6 +94,7 @@ auto makeEmptyTable(const char* name, framework::pack<Cs...> p)
9394
}
9495

9596
template <aod::is_aod_hash D>
97+
requires(soa::not_void<typename aod::MetadataTrait<D>::metadata>)
9698
auto makeEmptyTable(const char* name)
9799
{
98100
auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(typename aod::MetadataTrait<D>::metadata::persistent_columns_t{}));
@@ -216,6 +218,26 @@ inline constexpr auto getSourceSchemas()
216218
}.template operator()<T::sources.size(), T::sources>();
217219
}
218220

221+
template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<"AOD"_h>>
222+
inline constexpr auto getSources()
223+
{
224+
return []<size_t N, std::array<soa::TableRef, N> refs>() {
225+
return []<size_t... Is>(std::index_sequence<Is...>) {
226+
return std::vector{soa::tableRef2ConfigParamSpec<refs[Is]>()...};
227+
}(std::make_index_sequence<N>());
228+
}.template operator()<T::N, T::template generateSources<O>()>();
229+
}
230+
231+
template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<"AOD"_h>>
232+
inline constexpr auto getSourceSchemas()
233+
{
234+
return []<size_t N, std::array<soa::TableRef, N> refs>() {
235+
return []<size_t... Is>(std::index_sequence<Is...>) {
236+
return std::vector{soa::tableRef2Schema<refs[Is]>()...};
237+
}(std::make_index_sequence<N>());
238+
}.template operator()<T::N, T::template generateSources<O>()>();
239+
}
240+
219241
template <soa::with_ccdb_urls T>
220242
inline constexpr auto getCCDBUrls()
221243
{
@@ -257,7 +279,7 @@ inline constexpr auto getIndexMapping()
257279
using indices = T::index_pack_t;
258280
using Key = T::Key;
259281
[&idx]<size_t... Is>(std::index_sequence<Is...>) mutable {
260-
constexpr auto refs = T::sources;
282+
constexpr auto refs = T::generateSources();
261283
([&idx]<TableRef ref, typename C>() mutable {
262284
constexpr auto pos = o2::aod::MetadataTrait<o2::aod::Hash<ref.desc_hash>>::metadata::template getIndexPosToKey<Key>();
263285
if constexpr (pos == -1) {
@@ -272,6 +294,26 @@ inline constexpr auto getIndexMapping()
272294
return idx;
273295
}
274296

297+
template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<"AOD"_h>>
298+
constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
299+
{
300+
std::vector<framework::ConfigParamSpec> inputMetadata;
301+
302+
auto inputSources = getSources<T, O>();
303+
std::sort(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
304+
auto last = std::unique(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
305+
inputSources.erase(last, inputSources.end());
306+
inputMetadata.insert(inputMetadata.end(), inputSources.begin(), inputSources.end());
307+
308+
auto inputSchemas = getSourceSchemas<T, O>();
309+
std::sort(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
310+
last = std::unique(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
311+
inputSchemas.erase(last, inputSchemas.end());
312+
inputMetadata.insert(inputMetadata.end(), inputSchemas.begin(), inputSchemas.end());
313+
314+
return inputMetadata;
315+
}
316+
275317
template <soa::with_sources T>
276318
constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
277319
{
@@ -293,7 +335,7 @@ constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
293335
}
294336

295337
template <typename T>
296-
requires(!soa::with_sources<T>)
338+
requires(!(soa::with_sources<T> || soa::with_sources_generator<T>))
297339
constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
298340
{
299341
return {};
@@ -358,14 +400,19 @@ template <TableRef R>
358400
constexpr auto tableRef2InputSpec()
359401
{
360402
std::vector<framework::ConfigParamSpec> metadata;
361-
auto m = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
362-
metadata.insert(metadata.end(), m.begin(), m.end());
363-
auto ccdbMetadata = getCCDBMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
364-
metadata.insert(metadata.end(), ccdbMetadata.begin(), ccdbMetadata.end());
365-
auto p = getExpressionMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
366-
metadata.insert(metadata.end(), p.begin(), p.end());
367-
auto idx = getIndexMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
368-
metadata.insert(metadata.end(), idx.begin(), idx.end());
403+
std::vector<framework::ConfigParamSpec> sources;
404+
if constexpr (soa::with_sources<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>) {
405+
sources = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
406+
} else if constexpr (soa::with_sources_generator<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>) {
407+
sources = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata, o2::aod::Hash<R.origin_hash>>();
408+
}
409+
metadata.insert(metadata.end(), sources.begin(), sources.end());
410+
auto ccdbURLs = getCCDBMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
411+
metadata.insert(metadata.end(), ccdbURLs.begin(), ccdbURLs.end());
412+
auto expressions = getExpressionMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
413+
metadata.insert(metadata.end(), expressions.begin(), expressions.end());
414+
auto indices = getIndexMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
415+
metadata.insert(metadata.end(), indices.begin(), indices.end());
369416
if constexpr (!soa::with_ccdb_urls<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>) {
370417
metadata.emplace_back(framework::ConfigParamSpec{"schema", framework::VariantType::String, framework::serializeSchema(o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata::getSchema()), {"\"\""}});
371418
}
@@ -382,11 +429,22 @@ constexpr auto tableRef2InputSpec()
382429
template <TableRef R>
383430
constexpr auto tableRef2OutputSpec()
384431
{
432+
std::vector<framework::ConfigParamSpec> metadata;
433+
using md = typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata;
434+
if constexpr (soa::with_ccdb_urls<md>) {
435+
metadata.emplace_back("ccdb:", framework::VariantType::Bool, true, framework::ConfigParamSpec::HelpString{"\"\""});
436+
} else if constexpr (soa::with_expression_pack<md>) {
437+
metadata.emplace_back("projectors", framework::VariantType::Bool, true, framework::ConfigParamSpec::HelpString{"\"\""});
438+
} else if constexpr (soa::with_index_pack<md>) {
439+
metadata.emplace_back("index-records", framework::VariantType::Bool, true, framework::ConfigParamSpec::HelpString{"\"\""});
440+
}
385441
return framework::OutputSpec{
386442
framework::OutputLabel{o2::aod::label<R>()},
387443
o2::aod::origin<R>(),
388444
o2::aod::description(o2::aod::signature<R>()),
389-
R.version};
445+
R.version,
446+
framework::Lifetime::Timeframe,
447+
metadata};
390448
}
391449

392450
template <TableRef R>
@@ -504,14 +562,14 @@ struct OutputForTable {
504562
using table_t = decltype(typeWithRef<T>());
505563
using metadata = aod::MetadataTrait<o2::aod::Hash<table_t::ref.desc_hash>>::metadata;
506564

507-
static OutputSpec const spec()
565+
static constexpr auto spec()
508566
{
509-
return OutputSpec{OutputLabel{aod::label<table_t::ref>()}, o2::aod::origin<table_t::ref>(), o2::aod::description(o2::aod::signature<table_t::ref>()), table_t::ref.version};
567+
return soa::tableRef2OutputSpec<table_t::ref>();
510568
}
511569

512-
static OutputRef ref()
570+
static constexpr auto ref()
513571
{
514-
return OutputRef{aod::label<table_t::ref>(), table_t::ref.version};
572+
return soa::tableRef2OutputRef<table_t::ref>();
515573
}
516574
};
517575

@@ -544,7 +602,7 @@ concept is_produces_group = std::derived_from<T, ProducesGroup>;
544602
template <soa::is_metadata M, soa::TableRef Ref>
545603
struct TableTransform {
546604
using metadata = M;
547-
constexpr static auto sources = M::sources;
605+
constexpr static auto sources = M::template generateSources<o2::aod::Hash<Ref.origin_hash>>();
548606

549607
template <soa::TableRef R>
550608
static auto base_spec()
@@ -578,23 +636,23 @@ struct TableTransform {
578636
/// This helper struct allows you to declare extended tables which should be
579637
/// created by the task (as opposed to those pre-defined by data model)
580638
template <typename T>
581-
concept is_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>> && soa::has_extension<typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata>;
639+
concept is_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>> && soa::has_extension<typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata>;
582640

583641
template <typename T>
584-
concept is_dynamically_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>> && soa::has_configurable_extension<typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata>;
642+
concept is_dynamically_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>> && soa::has_configurable_extension<typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata>;
585643

586644
template <is_spawnable T>
587645
constexpr auto transformBase()
588646
{
589-
using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata;
590-
return TableTransform<metadata, metadata::extension_table_t::ref>{};
647+
using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata;
648+
return TableTransform<metadata, metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>::ref>{};
591649
}
592650

593651
template <is_spawnable T>
594652
struct Spawns : decltype(transformBase<T>()) {
595653
using spawnable_t = T;
596654
using metadata = decltype(transformBase<T>())::metadata;
597-
using extension_t = typename metadata::extension_table_t;
655+
using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
598656
using expression_pack_t = typename metadata::expression_pack_t;
599657
static constexpr size_t N = framework::pack_size(expression_pack_t{});
600658

@@ -644,7 +702,7 @@ struct Defines : decltype(transformBase<T>()) {
644702
static constexpr bool delayed = DELAYED;
645703
using spawnable_t = T;
646704
using metadata = decltype(transformBase<T>())::metadata;
647-
using extension_t = typename metadata::extension_table_t;
705+
using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
648706
using placeholders_pack_t = typename metadata::placeholders_pack_t;
649707
static constexpr size_t N = framework::pack_size(placeholders_pack_t{});
650708

0 commit comments

Comments
 (0)