File indexing completed on 2026-07-26 08:22:15
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "traccc/geometry/detector.hpp"
0010 #include "traccc/geometry/host_detector.hpp"
0011 #include "traccc/seeding/detail/track_params_estimation_config.hpp"
0012 #include "traccc/utils/memory_resource.hpp"
0013 #include "traccc/utils/propagation.hpp"
0014
0015
0016 #include "traccc/io/read_cells.hpp"
0017 #include "traccc/io/read_detector.hpp"
0018 #include "traccc/io/read_detector_description.hpp"
0019 #include "traccc/io/utils.hpp"
0020 #include "traccc/io/write.hpp"
0021
0022
0023 #include "traccc/ambiguity_resolution/greedy_ambiguity_resolution_algorithm.hpp"
0024 #include "traccc/clusterization/clusterization_algorithm.hpp"
0025 #include "traccc/finding/combinatorial_kalman_filter_algorithm.hpp"
0026 #include "traccc/fitting/kalman_fitting_algorithm.hpp"
0027 #include "traccc/fitting/triplet_fitting_algorithm.hpp"
0028 #include "traccc/seeding/seeding_algorithm.hpp"
0029 #include "traccc/seeding/silicon_pixel_spacepoint_formation_algorithm.hpp"
0030 #include "traccc/seeding/track_params_estimation.hpp"
0031
0032
0033 #include "traccc/efficiency/finding_performance_writer.hpp"
0034 #include "traccc/efficiency/seeding_performance_writer.hpp"
0035 #include "traccc/performance/timer.hpp"
0036 #include "traccc/resolution/fitting_performance_writer.hpp"
0037
0038
0039 #include "traccc/options/clusterization.hpp"
0040 #include "traccc/options/detector.hpp"
0041 #include "traccc/options/input_data.hpp"
0042 #include "traccc/options/magnetic_field.hpp"
0043 #include "traccc/options/output_data.hpp"
0044 #include "traccc/options/performance.hpp"
0045 #include "traccc/options/program_options.hpp"
0046 #include "traccc/options/seed_matching.hpp"
0047 #include "traccc/options/track_finding.hpp"
0048 #include "traccc/options/track_fitting.hpp"
0049 #include "traccc/options/track_matching.hpp"
0050 #include "traccc/options/track_propagation.hpp"
0051 #include "traccc/options/track_resolution.hpp"
0052 #include "traccc/options/track_seeding.hpp"
0053 #include "traccc/options/truth_finding.hpp"
0054
0055
0056 #include "traccc/examples/make_magnetic_field.hpp"
0057
0058
0059 #include <vecmem/memory/host_memory_resource.hpp>
0060 #include <vecmem/utils/copy.hpp>
0061
0062
0063 #include <cstdint>
0064 #include <cstdlib>
0065 #include <exception>
0066 #include <iostream>
0067 #include <map>
0068 #include <memory>
0069
0070 int seq_run(const traccc::opts::input_data& input_opts,
0071 const traccc::opts::output_data& output_opts,
0072 const traccc::opts::detector& detector_opts,
0073 const traccc::opts::magnetic_field& bfield_opts,
0074 const traccc::opts::clusterization& ,
0075 const traccc::opts::track_seeding& seeding_opts,
0076 const traccc::opts::track_finding& finding_opts,
0077 const traccc::opts::track_propagation& propagation_opts,
0078 const traccc::opts::track_resolution& resolution_opts,
0079 const traccc::opts::track_fitting& fitting_opts,
0080 const traccc::opts::performance& performance_opts,
0081 const traccc::opts::truth_finding& truth_finding_opts,
0082 const traccc::opts::seed_matching& seed_matching_opts,
0083 const traccc::opts::track_matching& track_matching_opts,
0084 std::unique_ptr<const traccc::Logger> ilogger) {
0085 TRACCC_LOCAL_LOGGER(std::move(ilogger));
0086
0087
0088 vecmem::host_memory_resource host_mr;
0089
0090
0091 vecmem::copy copy;
0092
0093
0094 traccc::detector_design_description::host det_descr{host_mr};
0095 traccc::detector_conditions_description::host det_cond{host_mr};
0096 traccc::io::read_detector_description(
0097 det_descr, det_cond, detector_opts.detector_file,
0098 detector_opts.digitization_file, detector_opts.conditions_file,
0099 traccc::data_format::json);
0100 traccc::detector_design_description::data det_descr_data{
0101 vecmem::get_data(det_descr)};
0102 traccc::detector_conditions_description::data det_cond_data{
0103 vecmem::get_data(det_cond)};
0104
0105
0106 traccc::host_detector polymorphic_detector;
0107 traccc::io::read_detector(
0108 polymorphic_detector, host_mr, detector_opts.detector_file,
0109 detector_opts.material_file, detector_opts.grid_file);
0110
0111
0112 uint64_t n_cells = 0;
0113 uint64_t n_measurements = 0;
0114 uint64_t n_spacepoints = 0;
0115 uint64_t n_seeds = 0;
0116 uint64_t n_found_tracks = 0;
0117 uint64_t n_ambiguity_free_tracks = 0;
0118 uint64_t n_fitted_tracks = 0;
0119
0120
0121 using spacepoint_formation_algorithm =
0122 traccc::host::silicon_pixel_spacepoint_formation_algorithm;
0123 using finding_algorithm = traccc::host::combinatorial_kalman_filter_algorithm;
0124 using fitting_algorithm = traccc::host::kalman_fitting_algorithm;
0125
0126
0127 const traccc::vector3 field_vec(seeding_opts);
0128 const auto field = traccc::details::make_magnetic_field(bfield_opts);
0129
0130
0131 detray::propagation::config propagation_config(propagation_opts);
0132
0133 const traccc::seedfinder_config seedfinder_config(seeding_opts);
0134 const traccc::seedfilter_config seedfilter_config(seeding_opts);
0135 const traccc::spacepoint_grid_config spacepoint_grid_config(seeding_opts);
0136
0137 finding_algorithm::config_type finding_cfg(finding_opts);
0138 finding_cfg.propagation = propagation_config;
0139
0140 traccc::host::greedy_ambiguity_resolution_algorithm::config_type
0141 resolution_config(resolution_opts);
0142
0143 fitting_algorithm::config_type fitting_cfg(fitting_opts);
0144 fitting_cfg.propagation = propagation_config;
0145
0146
0147 traccc::host::sparse_ccl_algorithm cc(host_mr,
0148 logger().clone("SparseCclAlg"));
0149 traccc::host::measurement_creation_algorithm mc(
0150 host_mr, logger().clone("MeasCreationAlg"));
0151 spacepoint_formation_algorithm sf(host_mr, logger().clone("SpFormationAlg"));
0152 traccc::host::seeding_algorithm sa(seedfinder_config, spacepoint_grid_config,
0153 seedfilter_config, host_mr,
0154 logger().clone("SeedingAlg"));
0155 traccc::track_params_estimation_config track_params_estimation_config;
0156 traccc::host::track_params_estimation tp(track_params_estimation_config,
0157 host_mr,
0158 logger().clone("TrackParEstAlg"));
0159
0160 finding_algorithm finding_alg(finding_cfg, host_mr,
0161 logger().clone("FindingAlg"));
0162 traccc::host::greedy_ambiguity_resolution_algorithm resolution_alg(
0163 resolution_config, host_mr, logger().clone("AmbiguityResolutionAlg"));
0164 fitting_algorithm fitting_alg(fitting_cfg, host_mr, copy,
0165 logger().clone("FittingAlg"));
0166
0167
0168 traccc::seeding_performance_writer sd_performance_writer(
0169 traccc::seeding_performance_writer::config{
0170 .truth_config = truth_finding_opts,
0171 .seed_truth_config = seed_matching_opts},
0172 logger().clone("SeedingPerformanceWriter"));
0173 traccc::finding_performance_writer find_performance_writer(
0174 traccc::finding_performance_writer::config{
0175 .truth_config = truth_finding_opts,
0176 .track_truth_config = track_matching_opts},
0177 logger().clone("FindingPerformanceWriter"));
0178 traccc::finding_performance_writer::config ar_writer_cfg;
0179 ar_writer_cfg.file_path = "performance_track_ambiguity_resolution.root";
0180 ar_writer_cfg.algorithm_name = "ambiguity_resolution";
0181 traccc::finding_performance_writer ar_performance_writer(
0182 ar_writer_cfg, logger().clone("AmbiResFindingPerformanceWriter"));
0183 traccc::fitting_performance_writer fit_performance_writer(
0184 traccc::fitting_performance_writer::config{},
0185 logger().clone("FittingPerformanceWriter"));
0186
0187
0188 traccc::performance::timing_info elapsedTimes;
0189
0190
0191 for (std::size_t event = input_opts.skip;
0192 event < input_opts.events + input_opts.skip; ++event) {
0193 traccc::edm::silicon_cell_collection::host cells_per_event{host_mr};
0194 traccc::host::sparse_ccl_algorithm::output_type clusters_per_event{host_mr};
0195 traccc::host::measurement_creation_algorithm::output_type
0196 measurements_per_event{host_mr};
0197 spacepoint_formation_algorithm::output_type spacepoints_per_event{host_mr};
0198 traccc::host::seeding_algorithm::output_type seeds{host_mr};
0199 traccc::host::track_params_estimation::output_type params{&host_mr};
0200 finding_algorithm::output_type track_candidates{host_mr};
0201 traccc::host::greedy_ambiguity_resolution_algorithm::output_type
0202 resolved_track_candidates{host_mr};
0203 fitting_algorithm::output_type track_states{host_mr};
0204
0205 {
0206 traccc::performance::timer timer_wall{"Wall time", elapsedTimes};
0207
0208 {
0209 traccc::performance::timer timer{"Read cells", elapsedTimes};
0210
0211 static constexpr bool DEDUPLICATE = true;
0212 traccc::io::read_cells(cells_per_event, event, input_opts.directory,
0213 logger().clone(), &det_cond, input_opts.format,
0214 DEDUPLICATE, input_opts.use_acts_geom_source);
0215 }
0216
0217
0218
0219
0220
0221 {
0222 traccc::performance::timer timer{"Clusterization", elapsedTimes};
0223
0224 clusters_per_event =
0225 cc(vecmem::get_data(cells_per_event), vecmem::get_data(det_cond));
0226 measurements_per_event = mc(vecmem::get_data(cells_per_event),
0227 vecmem::get_data(clusters_per_event),
0228 det_descr_data, det_cond_data);
0229 }
0230
0231
0232
0233
0234
0235
0236
0237 {
0238 traccc::performance::timer timer{"Spacepoint formation", elapsedTimes};
0239 spacepoints_per_event =
0240 sf(polymorphic_detector, vecmem::get_data(measurements_per_event));
0241 }
0242 if (output_opts.directory != "") {
0243 traccc::io::write(event, output_opts.directory, output_opts.format,
0244 vecmem::get_data(spacepoints_per_event),
0245 vecmem::get_data(measurements_per_event));
0246 }
0247
0248
0249
0250
0251 {
0252 traccc::performance::timer timer{"Seeding", elapsedTimes};
0253 seeds = sa(vecmem::get_data(spacepoints_per_event));
0254 }
0255 if (output_opts.directory != "") {
0256 traccc::io::write(event, output_opts.directory, output_opts.format,
0257 vecmem::get_data(seeds),
0258 vecmem::get_data(spacepoints_per_event));
0259 }
0260
0261
0262
0263
0264
0265 {
0266 traccc::performance::timer timer{"Track params estimation",
0267 elapsedTimes};
0268 params = tp(vecmem::get_data(measurements_per_event),
0269 vecmem::get_data(spacepoints_per_event),
0270 vecmem::get_data(seeds), field_vec);
0271 }
0272
0273 {
0274 traccc::performance::timer timer{"Track finding", elapsedTimes};
0275 track_candidates = finding_alg(polymorphic_detector, field,
0276 vecmem::get_data(measurements_per_event),
0277 vecmem::get_data(params));
0278 }
0279 if (output_opts.directory != "") {
0280 traccc::io::write(
0281 event, output_opts.directory, output_opts.format,
0282 traccc::edm::track_container<traccc::default_algebra>::const_data(
0283 track_candidates),
0284 polymorphic_detector);
0285 }
0286
0287 {
0288
0289 traccc::performance::timer timer{"Track ambiguity resolution",
0290 elapsedTimes};
0291 resolved_track_candidates = resolution_alg(
0292 traccc::edm::track_container<traccc::default_algebra>::const_data(
0293 track_candidates));
0294 }
0295
0296 {
0297 traccc::performance::timer timer{"Track fitting", elapsedTimes};
0298 track_states = fitting_alg(
0299 polymorphic_detector, field,
0300 traccc::edm::track_container<traccc::default_algebra>::const_data(
0301 resolved_track_candidates));
0302 }
0303
0304
0305
0306
0307
0308 n_cells += cells_per_event.size();
0309 n_measurements += measurements_per_event.size();
0310 n_spacepoints += spacepoints_per_event.size();
0311 n_seeds += seeds.size();
0312 n_found_tracks += track_candidates.tracks.size();
0313 n_ambiguity_free_tracks += resolved_track_candidates.tracks.size();
0314 n_fitted_tracks += track_states.tracks.size();
0315
0316 }
0317
0318
0319
0320
0321
0322 if (performance_opts.run) {
0323 traccc::event_data evt_data(
0324 input_opts.directory, event, host_mr, input_opts.use_acts_geom_source,
0325 &polymorphic_detector, input_opts.format, true);
0326 evt_data.fill_cca_result(cells_per_event, clusters_per_event,
0327 measurements_per_event, det_cond);
0328
0329 sd_performance_writer.write(
0330 vecmem::get_data(seeds), vecmem::get_data(spacepoints_per_event),
0331 vecmem::get_data(measurements_per_event), evt_data);
0332 find_performance_writer.write(
0333 traccc::edm::track_container<traccc::default_algebra>::const_data(
0334 track_candidates),
0335 evt_data);
0336 ar_performance_writer.write(
0337 traccc::edm::track_container<traccc::default_algebra>::const_data(
0338 resolved_track_candidates),
0339 evt_data);
0340
0341 for (unsigned int i = 0; i < track_states.tracks.size(); i++) {
0342 host_detector_visitor<traccc::detector_type_list>(
0343 polymorphic_detector,
0344 [&]<typename detector_traits_t>(
0345 const typename detector_traits_t::host& det) {
0346 fit_performance_writer.write(
0347 track_states.tracks.at(i), track_states.states,
0348 measurements_per_event, det, evt_data);
0349 });
0350 }
0351 }
0352 }
0353
0354 if (performance_opts.run) {
0355 sd_performance_writer.finalize();
0356 find_performance_writer.finalize();
0357 ar_performance_writer.finalize();
0358 fit_performance_writer.finalize();
0359 }
0360
0361 std::cout << "==> Statistics ... " << std::endl;
0362 std::cout << "- read " << n_cells << " cells" << std::endl;
0363 std::cout << "- created " << n_measurements << " measurements. "
0364 << std::endl;
0365 std::cout << "- created " << n_spacepoints << " space points. " << std::endl;
0366 std::cout << "- created " << n_seeds << " seeds" << std::endl;
0367 std::cout << "- found " << n_found_tracks << " tracks" << std::endl;
0368 std::cout << "- resolved " << n_ambiguity_free_tracks << " tracks"
0369 << std::endl;
0370 std::cout << "- fitted " << n_fitted_tracks << " tracks" << std::endl;
0371 std::cout << "==> Elapsed times...\n" << elapsedTimes << std::endl;
0372
0373 return EXIT_SUCCESS;
0374 }
0375
0376
0377
0378 int main(int argc, char* argv[]) {
0379 std::unique_ptr<const traccc::Logger> logger = traccc::getDefaultLogger(
0380 "TracccExampleSeqCpu", traccc::Logging::Level::INFO);
0381
0382
0383 traccc::opts::detector detector_opts;
0384 traccc::opts::magnetic_field bfield_opts;
0385 traccc::opts::input_data input_opts;
0386 traccc::opts::output_data output_opts{traccc::data_format::obj, ""};
0387 traccc::opts::clusterization clusterization_opts;
0388 traccc::opts::track_seeding seeding_opts;
0389 traccc::opts::track_finding finding_opts;
0390 traccc::opts::track_propagation propagation_opts;
0391 traccc::opts::track_resolution resolution_opts;
0392 traccc::opts::track_fitting fitting_opts;
0393 traccc::opts::performance performance_opts;
0394 traccc::opts::truth_finding truth_finding_opts;
0395 traccc::opts::seed_matching seed_matching_opts;
0396 traccc::opts::track_matching track_matching_opts;
0397 traccc::opts::program_options program_opts{
0398 "Full Tracking Chain on the Host",
0399 {detector_opts, bfield_opts, input_opts, output_opts, clusterization_opts,
0400 seeding_opts, finding_opts, resolution_opts, fitting_opts,
0401 propagation_opts, performance_opts, truth_finding_opts,
0402 seed_matching_opts, track_matching_opts},
0403 argc,
0404 argv,
0405 logger->cloneWithSuffix("Options")};
0406
0407
0408 return seq_run(input_opts, output_opts, detector_opts, bfield_opts,
0409 clusterization_opts, seeding_opts, finding_opts,
0410 propagation_opts, resolution_opts, fitting_opts,
0411 performance_opts, truth_finding_opts, seed_matching_opts,
0412 track_matching_opts, logger->clone());
0413 }