19#include "TRestVolumeHits.h"
25TRestVolumeHits::TRestVolumeHits() {
29TRestVolumeHits::~TRestVolumeHits() {
33void TRestVolumeHits::AddHit(Double_t x, Double_t y, Double_t z, Double_t en, Double_t time,
34 REST_HitType type, Double_t sigmaX, Double_t sigmaY, Double_t sigmaZ) {
36 cout <<
"Error! Cannot add different typed hits into TRestVolumeHits!" << endl;
41 fSigmaX.push_back((Float_t)sigmaX);
42 fSigmaY.push_back((Float_t)sigmaY);
43 fSigmaZ.push_back((Float_t)sigmaZ);
46void TRestVolumeHits::AddHit(
const TVector3& pos, Double_t en, Double_t time, REST_HitType type,
47 const TVector3& sigma) {
49 cout <<
"Error! Cannot add different typed hits into TRestVolumeHits!" << endl;
54 fSigmaX.push_back((Float_t)sigma.X());
55 fSigmaY.push_back((Float_t)sigma.Y());
56 fSigmaZ.push_back((Float_t)sigma.Z());
60 Double_t x = hits.GetX(n);
61 Double_t y = hits.GetY(n);
62 Double_t z = hits.GetZ(n);
63 Double_t t = hits.GetTime(n);
64 Double_t en = hits.GetEnergy(n);
65 REST_HitType type = hits.GetType(n);
67 Double_t sx = hits.GetSigmaX(n);
68 Double_t sy = hits.GetSigmaY(n);
69 Double_t sz = hits.GetSigmaZ(n);
72 cout <<
"Error! Cannot add different typed hits into TRestVolumeHits!" << endl;
76 AddHit(x, y, z, en, t, type, sx, sy, sz);
88 if (
fType.size() == 0)
89 return TMath::IsNaN(
fZ[0]) && !TMath::IsNaN(
fX[0]) && !TMath::IsNaN(
fY[0]);
91 return fType[0] == XY;
94 if (
fType.size() == 0)
95 return !TMath::IsNaN(
fZ[0]) && !TMath::IsNaN(
fX[0]) && TMath::IsNaN(
fY[0]);
97 return fType[0] == XZ;
100 if (
fType.size() == 0)
101 return !TMath::IsNaN(
fZ[0]) && TMath::IsNaN(
fX[0]) && !TMath::IsNaN(
fY[0]);
103 return fType[0] == YZ;
106 if (
fType.size() == 0)
107 return !TMath::IsNaN(
fZ[0]) && !TMath::IsNaN(
fX[0]) && !TMath::IsNaN(
fY[0]);
109 return fType[0] == XYZ;
112void TRestVolumeHits::MergeHits(Int_t n, Int_t m) {
116 fSigmaX[n] = (fSigmaX[n] *
fEnergy[n] + fSigmaX[m] *
fEnergy[m]) / totalEnergy;
117 fSigmaY[n] = (fSigmaY[n] *
fEnergy[n] + fSigmaY[m] *
fEnergy[m]) / totalEnergy;
118 fSigmaZ[n] = (fSigmaZ[n] *
fEnergy[n] + fSigmaZ[m] *
fEnergy[m]) / totalEnergy;
120 fSigmaX.erase(fSigmaX.begin() + m);
121 fSigmaY.erase(fSigmaY.begin() + m);
122 fSigmaZ.erase(fSigmaZ.begin() + m);
130 fSigmaX.erase(fSigmaX.begin() + n);
131 fSigmaY.erase(fSigmaY.begin() + n);
132 fSigmaZ.erase(fSigmaZ.begin() + n);
135void TRestVolumeHits::SortByEnergy() {
137 for (
unsigned int i = 0; i < GetNumberOfHits(); i++) {
138 for (
unsigned int j = i + 1; j < GetNumberOfHits(); j++) {
139 if (GetEnergy(i) < GetEnergy(j))
SwapHits(i, j);
146 iter_swap(fSigmaX.begin() + i, fSigmaX.begin() + j);
147 iter_swap(fSigmaY.begin() + i, fSigmaY.begin() + j);
148 iter_swap(fSigmaZ.begin() + i, fSigmaZ.begin() + j);
153TVector3 TRestVolumeHits::GetSigma(
int n)
const {
154 return TVector3(((Double_t)fSigmaX[n]), ((Double_t)fSigmaY[n]), ((Double_t)fSigmaZ[n]));
157void TRestVolumeHits::PrintHits()
const {
158 for (
unsigned int n = 0; n < GetNumberOfHits(); n++) {
159 cout <<
"Hit " << n <<
" X: " << GetX(n) <<
" Y: " << GetY(n) <<
" Z: " << GetZ(n)
161 <<
" Energy: " << GetEnergy(n) << endl;
166 bool fixBoundaries) {
167 const int nodes = vHits.GetNumberOfHits();
168 vector<TRestVolumeHits> volHits(nodes);
170 TVector3 nullVector = TVector3(0, 0, 0);
171 std::vector<TVector3> centroid(nodes);
172 std::vector<TVector3> centroidOld(nodes, nullVector);
174 for (
int h = 0; h < nodes; h++) centroid[h] = vHits.
GetPosition(h);
176 for (
int it = 0; it < maxIt; it++) {
177 for (
int n = 0; n < nodes; n++) volHits[n].
RemoveHits();
178 for (
unsigned int i = 0; i < hits->GetNumberOfHits(); i++) {
179 double minDist = 1E9;
181 for (
int n = 0; n < nodes; n++) {
182 if (fixBoundaries && (n == 0 || n == nodes - 1))
continue;
184 double dist = (centroid[n] - hitPos).Mag();
185 if (dist < minDist) {
191 volHits[clIndex].AddHit(*hits, i);
195 bool converge =
true;
196 for (
int n = 0; n < nodes; n++) {
197 if (fixBoundaries && (n == 0 || n == nodes - 1))
continue;
198 centroid[n] = volHits[n].GetMeanPosition();
199 converge &= (centroid[n] == centroidOld[n]);
200 centroidOld[n] = centroid[n];
208 const TVector3 sigma(0., 0., 0.);
209 for (
int n = 0; n < nodes; n++) {
210 if (fixBoundaries && (n == 0 || n == nodes - 1)) {
211 vHits.AddHit(centroid[n], 0, 0, vHits.GetType(n), sigma);
213 if (volHits[n].GetNumberOfHits() > 0)
214 vHits.AddHit(volHits[n].
GetMeanPosition(), volHits[n].GetTotalEnergy(), 0,
215 volHits[n].GetType(0), sigma);
TVector3 GetMeanPosition() const
It calculates the mean position weighting with the energy of the hits. Each coordinate is calculated ...
virtual void RemoveHits()
It removes all hits inside the class.
virtual void MergeHits(int n, int m)
It merges hits n and m being the resulting hit placed at the weighted center and being its final ener...
Bool_t isSortedByEnergy() const
It returns true if the hits are ordered in increasing energies.
Double_t GetSigmaX() const
It calculates the hits standard deviation in the X-coordinate.
virtual void RemoveHit(int n)
It removes the hit at position n from the list.
std::vector< REST_HitType > fType
The type of hit X,Y,XY,XYZ, ...
std::vector< Float_t > fZ
Position on Z axis for each punctual deposition (units mm)
std::vector< Float_t > fY
Position on Y axis for each punctual deposition (units mm)
std::vector< Float_t > fX
Position on X axis for each punctual deposition (units mm)
std::vector< Float_t > fEnergy
Energy deposited at each 3-coordinate position (units keV)
void AddHit(const TVector3 &position, Double_t energy, Double_t time=0, REST_HitType type=XYZ)
Adds a new hit to the list of hits using a TVector3.
Double_t GetSigmaY() const
It calculates the hits standard deviation in the Y-coordinate.
virtual void SwapHits(Int_t i, Int_t j)
It exchanges hits n and m affecting to the ordering of the hits inside the list of hits.
TVector3 GetPosition(int n) const
It returns the position of hit number n.
void RemoveHit(int n)
It removes the hit at position n from the list.
Bool_t areXZ() const
It will return true only if all the hits inside are of type XZ.
Bool_t areXYZ() const
It will return true only if all the hits inside are of type XYZ.
void SwapHits(Int_t i, Int_t j)
It exchanges hits n and m affecting to the ordering of the hits inside the list of hits.
Bool_t areYZ() const
It will return true only if all the hits inside are of type YZ.
Bool_t areXY() const
It will return true only if all the hits inside are of type XY.
void RemoveHits()
It removes all hits inside the class.