Warning, /EICrecon/src/extensions/jana/README.md is written in an unsupported language. File is not indexed.
0001
0002 We have a chain that looks like this:
0003
0004 ```mermaid
0005 flowchart TB
0006 classDef alg fill:#f96;
0007 subgraph Simulation output
0008 direction LR
0009 tracker_endcap_collections(Endcap trk:<br />TrackerEndcapHits1<br/>TrackerEndcapHits2<br/>TrackerEndcapHits3<br/><strong>edm4hep::SimHit</strong>)
0010 tracker_barrel_collections(Endcap trk:<br />TrackerBarrelHits1<br/>TrackerBarrelHits2<br/>TrackerBarrelHits3<br/><strong>edm4hep::SimHit</strong>)
0011 end
0012
0013 tracker_barrel_collections --> TrackerDigi[TrackerDigi]:::alg
0014 TrackerDigi --> TrackerBarrelRawHits(TrackerBarrelRawHits<br/><strong>edm4eic::RawTrackingHit</strong>)
0015
0016 tracker_endcap_collections --> TrackerDigi2[TrackerDigi]:::alg
0017 TrackerDigi2 --> TrackerEndcapRawHits(TrackerEndcapRawHits<br/><strong>edm4eic::RawTrackingHit</strong>)
0018
0019 TrackerSourceLinker[SomeReconstruction]:::alg
0020
0021 TrackerBarrelRawHits --> TrackerSourceLinker
0022 TrackerEndcapRawHits --> TrackerSourceLinker
0023 ```
0024
0025
0026 The proposed solution:
0027
0028 ```
0029 JChainFactoryGeneratorT.h
0030 JChainFactoryT.h
0031 ```
0032
0033 Requirements satisfied
0034
0035 - Works in JANA paradigm
0036 - Has the right defaults
0037 - Can be changed/rewired without recompilation
0038 - Can be replaced by other plugin
0039
0040
0041 To simplify lets look at one chain:
0042
0043
0044 ```mermaid
0045 flowchart TB
0046 classDef alg fill:#f96;
0047
0048 tracker_barrel_collections(Endcap trk:<br />TrackerBarrelHits1<br/>TrackerBarrelHits2<br/>TrackerBarrelHits3<br/><strong>SimHit</strong>)
0049
0050 tracker_barrel_collections --> TrackerDigi[TrackerDigi<br /><strong>SimHit</strong> to <strong>RawTrackerHit</strong>]:::alg
0051 TrackerDigi --> TrackerBarrelRawHits(TrackerBarrelRawHits<br/><strong>edm4eic::RawTrackingHit</strong>)
0052
0053 TrackerSourceLinker[SomeReconstruction<br /><strong>RawTrackerHit</strong> to <strong>RecoParticle</strong>]:::alg
0054 TrackerBarrelRawHits --> TrackerSourceLinker
0055 ```
0056
0057
0058 How it works:
0059
0060 1- JChainFactoryT is a JFactoryT, that have just one additional property:
0061
0062 ```c++
0063 std::vector<std::string> m_default_input_tags;
0064 ```
0065
0066 2- JChainFactoryGeneratorT allows to construct JChainFactoryT with default input tags and output tag name:
0067
0068 ```c++
0069 extern "C" {
0070 void InitPlugin(JApplication *m_app) {
0071 InitJANAPlugin(m_app);
0072
0073 using namespace eicrecon;
0074 // Digitization
0075 m_app->Add(new JChainFactoryGeneratorT<SiliconTrackerDigi_factory>({"TrackerBarrelHits1", "TrackerBarrelHits2"},"BarrelTrackerRawHit"));
0076
0077 // Convert raw digitized hits into hits with geometry info (ready for tracking)
0078 m_app->Add(new JChainFactoryGeneratorT<TrackerHitReconstruction_factory>({"BarrelTrackerRawHit"}, "SiBarrelTrackerRecHits"));
0079
0080 // ...
0081 ```
0082
0083 3- On factory level we allow users to change input tags and (maybe) even output tag and check if default or overridden values to be used:
0084
0085 ```C++
0086
0087 // Declared in SiliconTrackerDigi_factory
0088 std::vector<std::string> m_input_tags;
0089
0090 void eicrecon::SiliconTrackerDigi_factory::Init() {
0091 // Parameters names is defined by factory tag
0092 std::string param_prefix = "SiTrkDigi_" + GetTag(); // Will be something like SiTrkDigi_BarrelTrackerRawHit
0093
0094 // ...
0095 pm->SetDefaultParameter(param_prefix + ":input_tags", m_input_tags, "Input data tag names");
0096 }
0097
0098
0099 void eicrecon::SiliconTrackerDigi_factory::Process(const std::shared_ptr<const JEvent> &event) {
0100
0101 // Now we check that user provided an input names
0102 std::vector<std::string> &input_tags = m_input_tags;
0103 if(input_tags.size() == 0) {
0104 input_tags = GetDefaultInputTags();
0105 }
0106
0107 // Collect all hits from input sources
0108 for(auto input_tag: input_tags) {
0109 auto simHits = event->Get<edm4hep::SimTrackerHit>(input_tag);
0110 // DO SOMETHING
0111 }
0112 //...
0113 }
0114 ```
0115
0116 Now everything is wired by default. But users can replace wiring by:
0117
0118 ```sh
0119 eicrecon ... -PSiTrkDigi_BarrelTrackerRawHit:input_tags=AnotherSource1,AnotherHitSource2
0120 ```