28 : file_service_{std::move(file_service)},
29 h_multiplicity_{
make_hist(1000, -0.5, 999.5)},
32 h_ref_z_{
make_hist(200, -1000., 120000.)},
33 f_multiplicity_{h_multiplicity_},
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]);
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",
54 file_service_->put(
"h_ref_y",
"Spectrometer track reference y position;y [mm];Entries",
56 file_service_->put(
"h_ref_z",
"Spectrometer track reference z position;z [mm];Entries",
61 using HistD = ROOT::Experimental::RHist<double>;
62 using FillerD = ROOT::Experimental::RHistConcurrentFiller<double>;
63 using ContextD = ROOT::Experimental::RHistFillContext<double>;
66 std::shared_ptr<ContextD> multiplicity, ref_x, ref_y, ref_z;
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();
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_;
std::shared_ptr< ROOT::Experimental::RHist< double > > make_hist(std::uint64_t nbins, double low, double high)
Definition HistoFileService.hpp:56