Back to home page

EIC code displayed by LXR

 
 

    


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 ```