SND@LHC Software
Loading...
Searching...
No Matches
sndVetoPlane.cxx
Go to the documentation of this file.
1#include "sndVetoPlane.h"
2
3#include <cmath>
4#include <algorithm>
5#include <numeric>
6#include <vector>
7
8#include "MuFilter.h"
9#include "MuFilterHit.h"
10#include "ShipUnit.h"
11#include "FairLogger.h"
12
13snd::analysis_tools::VetoPlane::VetoPlane(std::vector<MuFilterHit*> snd_hits, const Configuration &configuration, MuFilter *muon_filter_geometry, int station) : configuration_(configuration), station_(station)
14{
15 for ( auto mu_hit : snd_hits)
16 {
17 TVector3 A, B;
18 int detectorID = mu_hit->GetDetectorID();
19 muon_filter_geometry->GetPosition(detectorID, A, B);
20 const int n_sipms = muon_filter_geometry->GetnSiPMs(detectorID);
21 const int n_sides = muon_filter_geometry->GetnSides(detectorID);
22 for (int i{0}; i < n_sipms * n_sides; ++i)
23 {
24 if (mu_hit->isMasked(i) || mu_hit->GetSignal(i) < -990.) continue;
25 VetoHit hit;
26 hit.bar = static_cast<int>(detectorID % 1000);
27 hit.channel_index = n_sipms * n_sides * hit.bar + i;
28 hit.is_right = (i >= n_sipms) ? true : false;
29 hit.timestamp = configuration_.is_mc ? mu_hit->GetTime(i) / ShipUnit::snd_TDC2ns : mu_hit->GetTime(i);
30 hit.qdc = mu_hit->GetSignal(i);
31 // use the left and right measurements to calculate the x coordinate along the bar
32 if (!mu_hit->isVertical()) {
33 hit.is_x = false;
34 float tmp_x = mu_hit->GetImpactXpos(true, true, false, configuration_.is_mc);
35 hit.x = (tmp_x < -990.) ? std::nan("") : A.X() - tmp_x;
36 hit.y = A.Y();
37 }
38 else {
39 hit.is_x = true;
40 hit.x = A.X();
41 hit.y = std::nan("");
42 }
43 hit.z = A.Z();
44 hits_.push_back(hit);
45 }
46 }
47}
48
50{
51 double tot_qdc = std::accumulate(hits_.begin(), hits_.end(), 0.0,
52 [](double sum, const auto &b) {return sum + b.qdc;});
53 return tot_qdc;
54}
55
56const double snd::analysis_tools::VetoPlane::GetBarQdc(int bar_to_compute) const
57{
58 double bar_qdc = std::accumulate(hits_.begin(), hits_.end(), 0.0,
59 [bar_to_compute](double sum, const auto &b) {return (b.bar == bar_to_compute) ? sum + b.qdc : sum;});
60 return bar_qdc;
61}
62
63const int snd::analysis_tools::VetoPlane::GetBarNHits(int bar_to_compute) const
64{
65 int bar_hit = std::count_if(hits_.begin(), hits_.end(),
66 [bar_to_compute](const auto &hit) {return hit.bar == bar_to_compute;});
67 return bar_hit;
68}
69
70void snd::analysis_tools::VetoPlane::TimeFilter(double min_timestamp, double max_timestamp)
71{
72 hits_.erase(std::remove_if(hits_.begin(), hits_.end(),
73 [&](auto &hit)
74 { return hit.timestamp < min_timestamp || hit.timestamp > max_timestamp; }),
75 hits_.end());
76}
77
79{
80 int count{0};
81 for (int bar{0}; bar < configuration_.veto_bar_per_station; ++bar) {
82 if (GetBarNHits(bar) > configuration_.veto_min_hit_on_bar) count++;
83 }
84 return count;
85}
86
88{
89 LOGF(INFO, "VetoHit ch_idx :%d\tposition: (%f,%f,%f)\ttime: %f\tqdc: %f\tbar: %d\tis_x: %d\tis_right: %d", channel_index, x, y, z, timestamp, qdc, bar, is_x, is_right);
90}
Int_t GetnSides(Int_t detID)
Definition MuFilter.cxx:715
void GetPosition(Int_t id, TVector3 &vLeft, TVector3 &vRight)
Definition MuFilter.cxx:639
Int_t GetnSiPMs(Int_t detID)
Definition MuFilter.cxx:708
void TimeFilter(double min_timestamp, double max_timestamp)
VetoPlane(std::vector< MuFilterHit * > snd_hits, const Configuration &configuration, MuFilter *muon_filter_geometry, int station)
std::vector< VetoHit > hits_
const double GetTotQdc() const
const int GetBarNHits(int bar_to_compute) const
const double GetBarQdc(int bar_to_compute) const