diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt index db58a6cfc..63b0487c4 100644 --- a/src/examples/CMakeLists.txt +++ b/src/examples/CMakeLists.txt @@ -10,6 +10,7 @@ add_subdirectory(UnitTestingExample) add_subdirectory(PodioDatamodel) add_subdirectory(PodioFileReader) add_subdirectory(PodioFileWriter) +add_subdirectory(PodioFactories) add_subdirectory(PodioExample) add_subdirectory(TimesliceExample) add_subdirectory(RootDatamodelExample) diff --git a/src/examples/PodioFactories/CMakeLists.txt b/src/examples/PodioFactories/CMakeLists.txt new file mode 100644 index 000000000..8f0389e23 --- /dev/null +++ b/src/examples/PodioFactories/CMakeLists.txt @@ -0,0 +1,14 @@ + +if (USE_PODIO) + + add_jana_plugin(PodioFactories) + target_link_libraries(PodioFactories PUBLIC PodioDatamodel PodioDatamodelDict) + +else() + + message(STATUS "Skipping examples/PodioFactories because USE_PODIO=Off") + +endif() + + + diff --git a/src/examples/PodioFactories/PodioClusteringFactory.h b/src/examples/PodioFactories/PodioClusteringFactory.h new file mode 100644 index 000000000..a26ea89ee --- /dev/null +++ b/src/examples/PodioFactories/PodioClusteringFactory.h @@ -0,0 +1,35 @@ + +#include +#include +#include +#include + + +struct PodioClusteringFactory : public JOmniFactory { + + PodioInput m_protoclusters_in {this}; + PodioOutput m_clusters_out {this}; + + Parameter m_scale {this, "scale", 1.0, "Scaling factor"}; + Parameter m_offset {this, "offset", 0.0, "Amount to offset [mm]"}; + + void Configure() { + } + + void ChangeRun(int32_t /*run_nr*/) { + } + + void Execute(int32_t /*run_nr*/, uint64_t /*evt_nr*/) { + + auto cs = std::make_unique(); + + for (auto protocluster : *m_protoclusters_in()) { + auto cluster = cs->create(); + cluster.energy((m_scale() * protocluster.energy()) + m_offset()); + } + + m_clusters_out() = std::move(cs); + } +}; + + diff --git a/src/examples/PodioFactories/PodioFactories.cc b/src/examples/PodioFactories/PodioFactories.cc new file mode 100644 index 000000000..661864e1a --- /dev/null +++ b/src/examples/PodioFactories/PodioFactories.cc @@ -0,0 +1,32 @@ + +#include +#include +#include "PodioClusteringFactory.h" +#include "PodioProtoclusteringFactory.h" + +extern "C"{ +void InitPlugin(JApplication *app) { + + InitJANAPlugin(app); + + auto cluster_gen = new JOmniFactoryGeneratorT(); + + cluster_gen->AddWiring("clusterizer", + {"protoclusters"}, + {"clusters"}, + {{"offset", "1000"}}); + + app->Add(cluster_gen); + + + + auto protocluster_gen = new JOmniFactoryGeneratorT(); + + protocluster_gen->AddWiring("protoclusterizer", + {"hits"}, + {"protoclusters"}); + + app->Add(protocluster_gen); + +} +} // "C" diff --git a/src/examples/PodioFactories/PodioProtoclusteringFactory.h b/src/examples/PodioFactories/PodioProtoclusteringFactory.h new file mode 100644 index 000000000..795895b1f --- /dev/null +++ b/src/examples/PodioFactories/PodioProtoclusteringFactory.h @@ -0,0 +1,34 @@ +// Copyright 2024, Jefferson Science Associates, LLC. +// Subject to the terms in the LICENSE file found in the top-level directory. + +#pragma once + +#include +#include +#include + + +struct PodioProtoclusteringFactory : public JOmniFactory { + + PodioInput hits_in {this}; + PodioOutput clusters_out {this}; + + void Configure() { + } + + void ChangeRun(int32_t /*run_nr*/) { + } + + void Execute(int32_t /*run_nr*/, uint64_t /*evt_nr*/) { + + auto cs = std::make_unique(); + for (auto hit : *hits_in()) { + auto cluster = cs->create(); + cluster.energy(hit.energy()); + cluster.addHits(hit); + } + clusters_out() = std::move(cs); + } +}; + + diff --git a/src/examples/PodioFileWriter/PodioFileWriter.cc b/src/examples/PodioFileWriter/PodioFileWriter.cc index ece66c778..14ac91899 100644 --- a/src/examples/PodioFileWriter/PodioFileWriter.cc +++ b/src/examples/PodioFileWriter/PodioFileWriter.cc @@ -40,7 +40,7 @@ class PodioFileWriter : public JEventProcessor { m_writer->finish(); } - void Process(const JEvent& event) override { + void ProcessParallel(const JEvent& event) override { for (const auto& collection_name : *m_collection_names) { @@ -50,6 +50,9 @@ class PodioFileWriter : public JEventProcessor { // may contain dangling references and segfault upon reading. event.GetCollectionBase(collection_name); } + } + + void Process(const JEvent& event) override { auto* frame = event.GetSingle(); // This will throw if no PODIO frame is found.