diff --git a/.gitignore b/.gitignore index 3361733931..ebc9e016fd 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,8 @@ install/* *.out *.m_app +# Apple stuff +.DS_Store ##### i g n o r i n g I D E s ##### diff --git a/src/algorithms/digi/SiliconTrackerDigi.cc b/src/algorithms/digi/SiliconTrackerDigi.cc index b5f21216eb..7c1cc87cba 100644 --- a/src/algorithms/digi/SiliconTrackerDigi.cc +++ b/src/algorithms/digi/SiliconTrackerDigi.cc @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include @@ -28,20 +28,42 @@ void SiliconTrackerDigi::init() { }; } +// Logic: timeResolution is the smearing of the time. +// Smeared time marks the beginning of a bucket. If another hit falls within the same bucket, +// the energy is summed up. If not, a new hit is created. void SiliconTrackerDigi::process( - const SiliconTrackerDigi::Input& input, - const SiliconTrackerDigi::Output& output) const { + const SiliconTrackerDigi::Input& input, + const SiliconTrackerDigi::Output& output) const { const auto [sim_hits] = input; auto [raw_hits,associations] = output; // A map of unique cellIDs with temporary structure RawHit - std::unordered_map cell_hit_map; - + std::unordered_map> cell_hit_map; + + auto bucket_width = (std::int32_t) (m_cfg.integrationWindow * 1e3); + + // Some detectors have a steady pulse of hits - generate empty time buckets for those + // Conundrum: We can't know the number of buckets without knowing the timeSlice length + // Assuming this is only used for MAPS, and that the time slice length is <= 1ms, + // we need at most 1ms / 2000ns = 500 buckets + // Let's use 1000, and pad with over and underflow to allow smearing out of range + if ( m_cfg.prepopulate ) { + for (auto cell : cell_hit_map) { + auto& hits = cell.second; + for (int i = -1; i <= 1001; i++) { + hits.push_back( + edm4eic::MutableRawTrackerHit{ + cell.first, + 0, + 0 + } ); + } + } + } for (const auto& sim_hit : *sim_hits) { - // time smearing double time_smearing = m_gauss(); double result_time = sim_hit.getTime() + time_smearing; @@ -58,52 +80,74 @@ void SiliconTrackerDigi::process( debug(" time smearing: {:.4f}, resulting time = {:.4f} [ns]", time_smearing, result_time); debug(" hit_time_stamp: {} [~ps]", hit_time_stamp); - if (sim_hit.getEDep() < m_cfg.threshold) { debug(" edep is below threshold of {:.2f} [keV]", m_cfg.threshold / dd4hep::keV); continue; } - if (cell_hit_map.count(sim_hit.getCellID()) == 0) { - // This cell doesn't have hits - cell_hit_map[sim_hit.getCellID()] = { + bool bucket_found = false; + if (cell_hit_map.count(sim_hit.getCellID()) == 1) { + // Update an existing hit? + for (auto& hit : cell_hit_map[sim_hit.getCellID()]) { + auto existing_time = hit.getTimeStamp(); + // TODO: edge cases? + if ( hit_time_stamp >= existing_time && hit_time_stamp <= existing_time + bucket_width ) { + // There is already a hit within the same time window + debug(" Hit already exists in cell ID={}, within the same time bucket. Time stamp: {}, bucket from {} to {}", + sim_hit.getCellID(), hit.getTimeStamp(), existing_time, existing_time + bucket_width); + // sum deposited energy + auto charge = hit.getCharge(); + hit.setCharge(charge + (std::int32_t) std::llround(sim_hit.getEDep() * 1e6)); + bucket_found = true; + break; + } // time bucket found + } // loop over existing hits + } // cellID found + + if (!bucket_found) { + // There is no hit in the same time bucket + debug(" No pre-existing hit in cell ID={} in the same time bucket. Time stamp: {}", + sim_hit.getCellID(), sim_hit.getTime()); + + // Create a new hit + // Note: time uncertainty in the TrackerHitReconstruction is set independently + // It would probably be better to move it into the RawTrackerHit class + // (same for spatial uncertainty, actually) + // Note 2: It's possible to not fall into a bucket but still be close enough to one or + // more that uncertainties overlap. Cannot be avoided in the current setup. + // It could lead to ambiguity which bucket is chosen for a third hit in this area. + // In reality, this is probably more like dead time; revisit later. + cell_hit_map[sim_hit.getCellID()].push_back( + edm4eic::MutableRawTrackerHit{ sim_hit.getCellID(), (std::int32_t) std::llround(sim_hit.getEDep() * 1e6), - hit_time_stamp // ns->ps - }; - } else { - // There is previous values in the cell - auto& hit = cell_hit_map[sim_hit.getCellID()]; - debug(" Hit already exists in cell ID={}, prev. hit time: {}", sim_hit.getCellID(), hit.getTimeStamp()); - - // keep earliest time for hit - auto time_stamp = hit.getTimeStamp(); - hit.setTimeStamp(std::min(hit_time_stamp, hit.getTimeStamp())); - - // sum deposited energy - auto charge = hit.getCharge(); - hit.setCharge(charge + (std::int32_t) std::llround(sim_hit.getEDep() * 1e6)); - } - } - - for (auto item : cell_hit_map) { - raw_hits->push_back(item.second); - - for (const auto& sim_hit : *sim_hits) { - if (item.first == sim_hit.getCellID()) { - // set association - auto hitassoc = associations->create(); - hitassoc.setWeight(1.0); - hitassoc.setRawHit(item.second); + hit_time_stamp + } ); + } // bucket found + } // loop over sim hits + + // Make associations + for (auto cell : cell_hit_map) { + for (auto& hit : cell.second) { + raw_hits->push_back(hit); + + for (const auto& sim_hit : *sim_hits) { + if (cell.first == sim_hit.getCellID()) { + // set association + auto hitassoc = associations->create(); + hitassoc.setWeight(1.0); + hitassoc.setRawHit(hit); #if EDM4EIC_VERSION_MAJOR >= 6 - hitassoc.setSimHit(sim_hit); + hitassoc.setSimHit(sim_hit); #else - hitassoc.addToSimHits(sim_hit); + hitassoc.addToSimHits(sim_hit); #endif - } - } + } // if cellID matches + } // sim_hits + } //hits + } // cell_hit_map - } -} + +} // process } // namespace eicrecon diff --git a/src/algorithms/digi/SiliconTrackerDigiConfig.h b/src/algorithms/digi/SiliconTrackerDigiConfig.h index fb66db252b..456aa32235 100644 --- a/src/algorithms/digi/SiliconTrackerDigiConfig.h +++ b/src/algorithms/digi/SiliconTrackerDigiConfig.h @@ -4,6 +4,8 @@ #pragma once #include +#include + namespace eicrecon { @@ -11,7 +13,9 @@ namespace eicrecon { // sub-systems should overwrite their own // NB: be aware of thresholds in npsim! E.g. https://github.com/eic/npsim/pull/9/files double threshold = 0 * dd4hep::keV; - double timeResolution = 8; /// TODO 8 of what units??? Same TODO in juggler. Probably [ns] + double timeResolution = 2000 * edm4eic::unit::ns; // Source for 8? This is arbitrary --> however, it should be >0, maybe large, to not distort the fitter by default. Choosing 2us for now. + double integrationWindow = 2000 * edm4eic::unit::ns; // Source for 8? This is arbitrary --> however, it should be >0, maybe large, to not distort the fitter by default. Choosing 2us for now. + bool prepopulate = false; // prepopulate cellHit map with empty hits, for MAPS }; } // eicrecon diff --git a/src/algorithms/tracking/TrackerHitReconstructionConfig.h b/src/algorithms/tracking/TrackerHitReconstructionConfig.h index 35d81adbe4..0e1c06f97c 100644 --- a/src/algorithms/tracking/TrackerHitReconstructionConfig.h +++ b/src/algorithms/tracking/TrackerHitReconstructionConfig.h @@ -2,9 +2,10 @@ // Copyright (C) 2022 Whitney Armstrong, Sylvester Joosten, Wouter Deconinck, Dmitry Romanov #pragma once +#include namespace eicrecon { struct TrackerHitReconstructionConfig { - float timeResolution = 10; + double timeResolution = 2000 * edm4eic::unit::ns; // It should be >0, maybe large, to not distort the fitter by default. Choosing 2us for now. }; } diff --git a/src/detectors/B0TRK/B0TRK.cc b/src/detectors/B0TRK/B0TRK.cc index 213ecc5b91..9a57681357 100644 --- a/src/detectors/B0TRK/B0TRK.cc +++ b/src/detectors/B0TRK/B0TRK.cc @@ -19,6 +19,8 @@ void InitPlugin(JApplication *app) { using namespace eicrecon; // Digitization + auto B0TrackerTimeResolution = 0.02 * dd4hep::ns; // 15-20 ps + auto B0TrackerIntegrationWindow = 0.750 * dd4hep::ns; // 750 ps shaping time app->Add(new JOmniFactoryGeneratorT( "B0TrackerRawHits", { @@ -30,7 +32,8 @@ void InitPlugin(JApplication *app) { }, { .threshold = 10.0 * dd4hep::keV, - .timeResolution = 8, + .timeResolution = B0TrackerTimeResolution, + .integrationWindow = B0TrackerIntegrationWindow, }, app )); @@ -41,7 +44,7 @@ void InitPlugin(JApplication *app) { {"B0TrackerRawHits"}, {"B0TrackerRecHits"}, { - .timeResolution = 8, + .timeResolution = B0TrackerTimeResolution, }, app )); diff --git a/src/detectors/BTOF/BTOF.cc b/src/detectors/BTOF/BTOF.cc index ef0ba38593..526cee9254 100644 --- a/src/detectors/BTOF/BTOF.cc +++ b/src/detectors/BTOF/BTOF.cc @@ -30,6 +30,8 @@ void InitPlugin(JApplication *app) { using namespace eicrecon; // Digitization + auto BTOFBarrelTimeResolution = 0.02 * dd4hep::ns; // 20 ps bin width + auto BTOFBarrelIntegrationWindow = 5.0 * dd4hep::ns; // shaping time app->Add(new JOmniFactoryGeneratorT( "TOFBarrelRawHit", { @@ -41,7 +43,8 @@ void InitPlugin(JApplication *app) { }, { .threshold = 6.0 * dd4hep::keV, - .timeResolution = 0.025, // [ns] + .timeResolution = BTOFBarrelTimeResolution, + .integrationWindow = BTOFBarrelIntegrationWindow, }, app )); @@ -52,7 +55,7 @@ void InitPlugin(JApplication *app) { {"TOFBarrelRawHit"}, // Input data collection tags {"TOFBarrelRecHit"}, // Output data tag { - .timeResolution = 10, + .timeResolution = BTOFBarrelTimeResolution, }, app )); // Hit reco default config for factories diff --git a/src/detectors/BTRK/BTRK.cc b/src/detectors/BTRK/BTRK.cc index 5bc3463e55..0cd2c53ca5 100644 --- a/src/detectors/BTRK/BTRK.cc +++ b/src/detectors/BTRK/BTRK.cc @@ -1,7 +1,5 @@ // Copyright 2022, Dmitry Romanov // Subject to the terms in the LICENSE file found in the top-level directory. -// -// #include #include @@ -19,6 +17,8 @@ void InitPlugin(JApplication *app) { using namespace eicrecon; // Digitization + auto BTRKBarrelTimeResolution = 2000 * dd4hep::ns; + auto BTRKBarrelIntegrationWindow = 2000 * dd4hep::ns; // shaping time app->Add(new JOmniFactoryGeneratorT( "SiBarrelRawHits", { @@ -30,17 +30,21 @@ void InitPlugin(JApplication *app) { }, { .threshold = 0.54 * dd4hep::keV, + .timeResolution = BTRKBarrelTimeResolution, + .integrationWindow = BTRKBarrelIntegrationWindow, + .prepopulate = true, // for MAPS, initialize digitization with a "pulse" of empty hits }, app )); - // Convert raw digitized hits into hits with geometry info (ready for tracking) app->Add(new JOmniFactoryGeneratorT( "SiBarrelTrackerRecHits", {"SiBarrelRawHits"}, {"SiBarrelTrackerRecHits"}, - {}, // default config + { + .timeResolution = BTRKBarrelTimeResolution, + }, app )); diff --git a/src/detectors/BVTX/BVTX.cc b/src/detectors/BVTX/BVTX.cc index 4129e083b9..e05c4d8e9f 100644 --- a/src/detectors/BVTX/BVTX.cc +++ b/src/detectors/BVTX/BVTX.cc @@ -19,6 +19,8 @@ void InitPlugin(JApplication *app) { using namespace eicrecon; // Digitization + auto SiBarrelVertexTimeResolution = 2000 * dd4hep::ns; + auto SiBarrelVertexIntegrationWindow = 2000 * dd4hep::ns; app->Add(new JOmniFactoryGeneratorT( "SiBarrelVertexRawHits", { @@ -30,6 +32,9 @@ void InitPlugin(JApplication *app) { }, { .threshold = 0.54 * dd4hep::keV, + .timeResolution = SiBarrelVertexTimeResolution, + .integrationWindow = SiBarrelVertexIntegrationWindow, + .prepopulate = true, // for MAPS, initialize digitization with a "pulse" of empty hits }, app )); @@ -39,7 +44,9 @@ void InitPlugin(JApplication *app) { "SiBarrelVertexRecHits", {"SiBarrelVertexRawHits"}, {"SiBarrelVertexRecHits"}, - {}, // default config + { + .timeResolution = SiBarrelVertexTimeResolution, + }, app )); diff --git a/src/detectors/ECTOF/ECTOF.cc b/src/detectors/ECTOF/ECTOF.cc index 06d04a9e0f..ec776393cf 100644 --- a/src/detectors/ECTOF/ECTOF.cc +++ b/src/detectors/ECTOF/ECTOF.cc @@ -19,6 +19,8 @@ void InitPlugin(JApplication *app) { using namespace eicrecon; // Digitization + auto TOFEndcapTimeResolution = 20.0 * dd4hep::ns; // 20 ps bin width + auto TOFEndcapIntegrationWindow = 5.0 * dd4hep::ns; // shaping time app->Add(new JOmniFactoryGeneratorT( "TOFEndcapRawHits", { @@ -29,7 +31,9 @@ void InitPlugin(JApplication *app) { }, { .threshold = 6.0 * dd4hep::keV, - .timeResolution = 0.025, + .timeResolution = TOFEndcapTimeResolution, + .integrationWindow = TOFEndcapIntegrationWindow, + }, app )); @@ -40,7 +44,7 @@ void InitPlugin(JApplication *app) { {"TOFEndcapRawHits"}, // Input data collection tags {"TOFEndcapRecHits"}, // Output data tag { - .timeResolution = 0.025, + .timeResolution = TOFEndcapTimeResolution, }, app )); diff --git a/src/detectors/ECTRK/ECTRK.cc b/src/detectors/ECTRK/ECTRK.cc index 2ed05da2b7..225e65f8f9 100644 --- a/src/detectors/ECTRK/ECTRK.cc +++ b/src/detectors/ECTRK/ECTRK.cc @@ -19,6 +19,8 @@ void InitPlugin(JApplication *app) { using namespace eicrecon; // Digitization + auto SiEndcapTrackerTimeResolution = 2000. * dd4hep::ns; + auto SiEndcapTrackerIntegrationWindow = 2000. * dd4hep::ns; app->Add(new JOmniFactoryGeneratorT( "SiEndcapTrackerRawHits", { @@ -30,6 +32,9 @@ void InitPlugin(JApplication *app) { }, { .threshold = 0.54 * dd4hep::keV, + .timeResolution = SiEndcapTrackerTimeResolution, + .integrationWindow = SiEndcapTrackerIntegrationWindow, + .prepopulate = true, // for MAPS, initialize digitization with a "pulse" of empty hits }, app )); @@ -39,7 +44,9 @@ void InitPlugin(JApplication *app) { "SiEndcapTrackerRecHits", {"SiEndcapTrackerRawHits"}, {"SiEndcapTrackerRecHits"}, - {}, // default config + { + .timeResolution = SiEndcapTrackerTimeResolution, + }, app )); diff --git a/src/detectors/FOFFMTRK/FOFFMTRK.cc b/src/detectors/FOFFMTRK/FOFFMTRK.cc index 24a37ee54c..7b0c7ab505 100644 --- a/src/detectors/FOFFMTRK/FOFFMTRK.cc +++ b/src/detectors/FOFFMTRK/FOFFMTRK.cc @@ -22,6 +22,8 @@ void InitPlugin(JApplication *app) { MatrixTransferStaticConfig recon_cfg; //Digitized hits, especially for thresholds + auto ForwardOffMTrackerTimeResolution = 0.015 * dd4hep::ns; // 15-20 ps + auto ForwardOffMTrackerIntegrationWindow = 0.750 * dd4hep::ns; // 750 ps shaping time app->Add(new JOmniFactoryGeneratorT( "ForwardOffMTrackerRawHits", { @@ -33,7 +35,8 @@ void InitPlugin(JApplication *app) { }, { .threshold = 10.0 * dd4hep::keV, - .timeResolution = 8, + .timeResolution = ForwardOffMTrackerTimeResolution, + .integrationWindow = ForwardOffMTrackerIntegrationWindow, }, app )); @@ -43,7 +46,7 @@ void InitPlugin(JApplication *app) { {"ForwardOffMTrackerRawHits"}, {"ForwardOffMTrackerRecHits"}, { - .timeResolution = 8, + .timeResolution = ForwardOffMTrackerTimeResolution, }, app )); diff --git a/src/detectors/LOWQ2/LOWQ2.cc b/src/detectors/LOWQ2/LOWQ2.cc index 34e7a19676..7cc71cad72 100644 --- a/src/detectors/LOWQ2/LOWQ2.cc +++ b/src/detectors/LOWQ2/LOWQ2.cc @@ -35,18 +35,21 @@ extern "C" { std::string tracker_readout = "TaggerTrackerHits"; // Digitization of silicon hits + auto TaggerTrackerTimeResolution = 0.195 * dd4hep::ns; + auto TaggerTrackerIntegrationWindow = 25.0 * dd4hep::ns; app->Add(new JOmniFactoryGeneratorT( "TaggerTrackerRawHits", { - "TaggerTrackerHits" + "TaggerTrackerHits" }, { - "TaggerTrackerRawHits", - "TaggerTrackerHitAssociations" + "TaggerTrackerRawHits", + "TaggerTrackerHitAssociations" }, { - .threshold = 1.5 * dd4hep::keV, - .timeResolution = 2 * dd4hep::ns, + .threshold = 1.5 * dd4hep::keV, + .timeResolution = TaggerTrackerTimeResolution, + .integrationWindow = TaggerTrackerIntegrationWindow, }, app )); diff --git a/src/detectors/MPGD/MPGD.cc b/src/detectors/MPGD/MPGD.cc index e2f4c6fdb4..df119f1be2 100644 --- a/src/detectors/MPGD/MPGD.cc +++ b/src/detectors/MPGD/MPGD.cc @@ -19,6 +19,8 @@ void InitPlugin(JApplication *app) { using namespace eicrecon; // Digitization + auto MPGDBarrelTimeResolution = 20.0 * dd4hep::ns; // 1 / (50 MHz) + auto MPGDBarrelIntegrationWindow = 500.0 * dd4hep::ns; // shaping time app->Add(new JOmniFactoryGeneratorT( "MPGDBarrelRawHits", { @@ -30,7 +32,8 @@ void InitPlugin(JApplication *app) { }, { .threshold = 0.25 * dd4hep::keV, - .timeResolution = 10, + .timeResolution = MPGDBarrelTimeResolution, + .integrationWindow = MPGDBarrelIntegrationWindow, }, app )); @@ -41,12 +44,14 @@ void InitPlugin(JApplication *app) { {"MPGDBarrelRawHits"}, // Input data collection tags {"MPGDBarrelRecHits"}, // Output data tag { - .timeResolution = 10, + .timeResolution = MPGDBarrelTimeResolution, }, app )); // Digitization + auto OuterMPGDBarrelTimeResolution = 20.0 * dd4hep::ns; // 1 / (50 MHz) + auto OuterMPGDBarrelIntegrationWindow = 500.0 * dd4hep::ns; // shaping time app->Add(new JOmniFactoryGeneratorT( "OuterMPGDBarrelRawHits", { @@ -58,7 +63,8 @@ void InitPlugin(JApplication *app) { }, { .threshold = 0.25 * dd4hep::keV, - .timeResolution = 10, + .timeResolution = OuterMPGDBarrelTimeResolution, + .integrationWindow = OuterMPGDBarrelIntegrationWindow, }, app )); @@ -69,12 +75,14 @@ void InitPlugin(JApplication *app) { {"OuterMPGDBarrelRawHits"}, // Input data collection tags {"OuterMPGDBarrelRecHits"}, // Output data tag { - .timeResolution = 10, + .timeResolution = OuterMPGDBarrelTimeResolution, }, app )); // Digitization + auto BackwardMPGDEndcapTimeResolution = 20.0 * dd4hep::ns; // 1 / (50 MHz) + auto BackwardMPGDEndcapIntegrationWindow = 500.0 * dd4hep::ns; // shaping time app->Add(new JOmniFactoryGeneratorT( "BackwardMPGDEndcapRawHits", { @@ -86,7 +94,8 @@ void InitPlugin(JApplication *app) { }, { .threshold = 0.25 * dd4hep::keV, - .timeResolution = 10, + .timeResolution = BackwardMPGDEndcapTimeResolution, + .integrationWindow = BackwardMPGDEndcapIntegrationWindow, }, app )); @@ -97,12 +106,14 @@ void InitPlugin(JApplication *app) { {"BackwardMPGDEndcapRawHits"}, // Input data collection tags {"BackwardMPGDEndcapRecHits"}, // Output data tag { - .timeResolution = 10, + .timeResolution = BackwardMPGDEndcapTimeResolution, }, app )); // Digitization + auto ForwardMPGDEndcapTimeResolution = 20.0 * dd4hep::ns; // 1 / (50 MHz) + auto ForwardMPGDEndcapIntegrationWindow = 500.0 * dd4hep::ns; // shaping time app->Add(new JOmniFactoryGeneratorT( "ForwardMPGDEndcapRawHits", { @@ -114,7 +125,8 @@ void InitPlugin(JApplication *app) { }, { .threshold = 0.25 * dd4hep::keV, - .timeResolution = 10, + .timeResolution = ForwardMPGDEndcapTimeResolution, + .integrationWindow = ForwardMPGDEndcapIntegrationWindow, }, app )); @@ -125,7 +137,7 @@ void InitPlugin(JApplication *app) { {"ForwardMPGDEndcapRawHits"}, // Input data collection tags {"ForwardMPGDEndcapRecHits"}, // Output data tag { - .timeResolution = 10, + .timeResolution = ForwardMPGDEndcapTimeResolution, }, app )); diff --git a/src/detectors/RPOTS/RPOTS.cc b/src/detectors/RPOTS/RPOTS.cc index cf76ce7781..8ffa9edbd7 100644 --- a/src/detectors/RPOTS/RPOTS.cc +++ b/src/detectors/RPOTS/RPOTS.cc @@ -22,18 +22,21 @@ void InitPlugin(JApplication *app) { MatrixTransferStaticConfig recon_cfg; //Digitized hits, especially for thresholds + auto ForwardRomanPotTimeResolution = 0.015 * dd4hep::ns; // 15-20 ps + auto ForwardRomanPotIntegrationWindow = 0.750 * dd4hep::ns; // 750 ps shaping time app->Add(new JOmniFactoryGeneratorT( "ForwardRomanPotRawHits", { - "ForwardRomanPotHits" + "ForwardRomanPotHits" }, { - "ForwardRomanPotRawHits", - "ForwardRomanPotHitAssociations" + "ForwardRomanPotRawHits", + "ForwardRomanPotHitAssociations" }, { .threshold = 10.0 * dd4hep::keV, - .timeResolution = 8, + .timeResolution = ForwardRomanPotTimeResolution, + .integrationWindow = ForwardRomanPotIntegrationWindow, }, app )); @@ -43,7 +46,7 @@ void InitPlugin(JApplication *app) { {"ForwardRomanPotRawHits"}, {"ForwardRomanPotRecHits"}, { - .timeResolution = 8, + .timeResolution = ForwardRomanPotTimeResolution, }, app )); diff --git a/src/factories/tracking/TrackerHitReconstruction_factory.h b/src/factories/tracking/TrackerHitReconstruction_factory.h index ad59096931..eb27b57d1a 100644 --- a/src/factories/tracking/TrackerHitReconstruction_factory.h +++ b/src/factories/tracking/TrackerHitReconstruction_factory.h @@ -7,7 +7,6 @@ #include "services/geometry/dd4hep/DD4hep_service.h" #include "extensions/jana/JOmniFactory.h" - namespace eicrecon { class TrackerHitReconstruction_factory : @@ -18,7 +17,7 @@ public JOmniFactory m_raw_hits_input {this}; PodioOutput m_rec_hits_output {this}; - ParameterRef m_timeResolution {this, "timeResolution", config().timeResolution}; + ParameterRef m_timeResolution {this, "timeResolution", config().timeResolution}; Service m_geoSvc {this};