trout
Phlex-based reconstruction framework for the SHiP experiment.
Loading...
Searching...
No Matches
SpectrometerHistogrammer.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 CERN for the benefit of the SHiP Collaboration
2//
3// SPDX-License-Identifier: LGPL-3.0-or-later
4
5// SpectrometerHistogrammer.hpp — spectrometer track validation histograms:
6// multiplicity plus reference-position distributions.
7
8#pragma once
9
10#include "HistoFileService.hpp"
11
12#include <ROOT/RHist.hxx>
13#include <ROOT/RHistConcurrentFiller.hxx>
14#include <ROOT/RHistFillContext.hxx>
15
16#include <SHiP/TrackFitResult.hpp>
17#include <cstdint>
18#include <memory>
19#include <oneapi/tbb/enumerable_thread_specific.h>
20#include <utility>
21#include <vector>
22
23namespace SHiP::trout {
24
26 public:
27 explicit SpectrometerHistogrammer(std::shared_ptr<HistoFileService> file_service)
28 : file_service_{std::move(file_service)},
29 h_multiplicity_{make_hist(1000, -0.5, 999.5)},
30 h_ref_x_{make_hist(200, -3000., 3000.)},
31 h_ref_y_{make_hist(200, -6000., 6000.)},
32 h_ref_z_{make_hist(200, -1000., 120000.)},
33 f_multiplicity_{h_multiplicity_},
34 f_ref_x_{h_ref_x_},
35 f_ref_y_{h_ref_y_},
36 f_ref_z_{h_ref_z_} {}
37
38 void observe(std::vector<SHiP::TrackFitResult> const& tracks) {
39 auto& ctxs = ensure_contexts();
40 ctxs.multiplicity->Fill(static_cast<double>(tracks.size()));
41 for (auto const& track : tracks) {
42 ctxs.ref_x->Fill(track.ref_loc[0]);
43 ctxs.ref_y->Fill(track.ref_loc[1]);
44 ctxs.ref_z->Fill(track.ref_loc[2]);
45 }
46 }
47
49 fill_contexts_.clear();
50 file_service_->put("h_spectrometer_track_multiplicity",
51 "Spectrometer tracks per event;N;Events", *h_multiplicity_);
52 file_service_->put("h_ref_x", "Spectrometer track reference x position;x [mm];Entries",
53 *h_ref_x_);
54 file_service_->put("h_ref_y", "Spectrometer track reference y position;y [mm];Entries",
55 *h_ref_y_);
56 file_service_->put("h_ref_z", "Spectrometer track reference z position;z [mm];Entries",
57 *h_ref_z_);
58 }
59
60 private:
61 using HistD = ROOT::Experimental::RHist<double>;
62 using FillerD = ROOT::Experimental::RHistConcurrentFiller<double>;
63 using ContextD = ROOT::Experimental::RHistFillContext<double>;
64
65 struct FillContexts {
66 std::shared_ptr<ContextD> multiplicity, ref_x, ref_y, ref_z;
67 };
68
69 FillContexts& ensure_contexts() {
70 auto& ctxs = fill_contexts_.local();
71 if (!ctxs.multiplicity) {
72 ctxs.multiplicity = f_multiplicity_.CreateFillContext();
73 ctxs.ref_x = f_ref_x_.CreateFillContext();
74 ctxs.ref_y = f_ref_y_.CreateFillContext();
75 ctxs.ref_z = f_ref_z_.CreateFillContext();
76 }
77 return ctxs;
78 }
79
80 std::shared_ptr<HistoFileService> file_service_;
81 std::shared_ptr<HistD> h_multiplicity_, h_ref_x_, h_ref_y_, h_ref_z_;
82 FillerD f_multiplicity_, f_ref_x_, f_ref_y_, f_ref_z_;
83 tbb::enumerable_thread_specific<FillContexts> fill_contexts_;
84};
85
86} // namespace SHiP::trout
~SpectrometerHistogrammer()
Definition SpectrometerHistogrammer.hpp:48
void observe(std::vector< SHiP::TrackFitResult > const &tracks)
Definition SpectrometerHistogrammer.hpp:38
SpectrometerHistogrammer(std::shared_ptr< HistoFileService > file_service)
Definition SpectrometerHistogrammer.hpp:27
Definition fit_seed.cpp:16
std::shared_ptr< ROOT::Experimental::RHist< double > > make_hist(std::uint64_t nbins, double low, double high)
Definition HistoFileService.hpp:56