SND@LHC Software
Loading...
Searching...
No Matches
sndDSPlane.cxx
Go to the documentation of this file.
1#include "sndDSPlane.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::DSPlane::DSPlane(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 DSHit 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 int snd::analysis_tools::DSPlane::GetBarNHits(int bar_to_compute) const
57{
58 int bar_hit = std::count_if(hits_.begin(), hits_.end(),
59 [bar_to_compute](const auto &hit) {return hit.bar == bar_to_compute;});
60 return bar_hit;
61}
62
63void snd::analysis_tools::DSPlane::TimeFilter(double min_timestamp, double max_timestamp)
64{
65 hits_.erase(std::remove_if(hits_.begin(), hits_.end(),
66 [&](auto &hit)
67 { return hit.timestamp < min_timestamp || hit.timestamp > max_timestamp; }),
68 hits_.end());
69}
70
72{
73 int count{0};
74 for (int bar{0}; bar < 2*configuration_.ds_bar_per_station; ++bar) {
75 if (GetBarNHits(bar) > 0) count++;
76 }
77 return count;
78}
79
81{
82 LOGF(INFO, "DSHit 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);
83}
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
DSPlane(std::vector< MuFilterHit * > snd_hits, const Configuration &configuration, MuFilter *muon_filter_geometry, int station)
std::vector< DSHit > hits_
Definition sndDSPlane.h:55
void TimeFilter(double min_timestamp, double max_timestamp)
const double GetTotQdc() const
const int GetBarNHits(int bar_to_compute) const
const int GetNHitBars() const