LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
DirOfGamma.cxx
Go to the documentation of this file.
1 #include "DirOfGamma.h"
2 
4 
5 #include "larcore/CoreUtils/ServiceUtil.h" // lar::providerFrom<>()
10 
12 
13 #include "TMath.h"
14 
16  : fHit(src)
17 {
18  auto const& wireReadoutGeom = art::ServiceHandle<geo::WireReadout>()->Get();
19  auto const& wireID = src->WireID();
20 
21  auto const wireCenter = wireReadoutGeom.Wire(wireID).GetCenter();
22  double const x = detProp.ConvertTicksToX(src->PeakTime(), wireID);
23 
24  double const globalWire = wireReadoutGeom.Plane({wireID.Cryostat, wireID.TPC % 2, wireID.Plane})
25  .WireCoordinate(wireCenter);
26  fPoint.Set(globalWire, x);
27  fCharge = src->ROISummedADC();
28 }
29 
30 ems::Bin2D::Bin2D(const TVector2& center) : fCenter2D(center), fTotCharge(0.0), fSize(0) {}
31 
33 {
34  fHits2D.push_back(hit);
35  fTotCharge += hit->GetCharge();
36  fSize = fHits2D.size();
37  SortLess();
38 }
39 
41 {
42  return std::sort(fHits2D.begin(), fHits2D.end(), bDistCentMore2D(fCenter2D));
43 }
44 
46 {
47  return std::sort(fHits2D.begin(), fHits2D.end(), bDistCentLess2D(fCenter2D));
48 }
49 
50 std::vector<art::Ptr<recob::Hit>> ems::Bin2D::GetIniHits(const double radius,
51  const unsigned int nhits) const
52 {
53 
54  std::vector<art::Ptr<recob::Hit>> vec;
55  for (unsigned int i = 0; i < fHits2D.size(); i++) {
56  if (pma::Dist2(fHits2D[i]->GetPointCm(), fCenter2D) < radius * radius) {
57  vec.push_back(fHits2D[i]->GetHitPtr());
58  if (vec.size() == nhits) break;
59  }
60  }
61 
62  return vec;
63 }
64 
65 ems::EndPoint::EndPoint(const Hit2D& center, const std::vector<Hit2D*>& hits, unsigned int nbins)
66  : fCenter2D(center), fPoints2D(hits), fNbins(nbins)
67 {
68 
69  for (unsigned int i = 0; i < fNbins; i++) {
70  fBins.push_back(Bin2D(center.GetPointCm()));
71  }
72 
73  FillBins();
76 
77  fPlane = center.GetHitPtr()->WireID().Plane;
78  fTpc = center.GetHitPtr()->WireID().TPC;
79  fCryo = center.GetHitPtr()->WireID().Cryostat;
80 }
81 
83 {
84  TVector2 vstart(0, 1);
85 
86  unsigned int saveid = 0;
87  bool exist = false;
88  for (unsigned int i = 0; i < fPoints2D.size(); i++) {
89  if (fPoints2D[i]->GetHitPtr().key() != fCenter2D.GetHitPtr().key()) {
90  TVector2 pos(fPoints2D[i]->GetPointCm());
91  TVector2 centre(fCenter2D.GetPointCm());
92  TVector2 vecp = pos - centre;
93  float sinsign = (vstart.X() * vecp.Y()) - (vstart.Y() * vecp.X());
94  float cosine = (vstart * vecp) / vecp.Mod();
95  float theta = 180.0F * (std::acos(cosine)) / TMath::Pi();
96 
97  unsigned int id = 0;
98  double bin = double(360.0) / double(fNbins);
99 
100  if (sinsign >= 0)
101  id = int(theta / bin);
102  else if (sinsign < 0)
103  id = int(theta / bin) + (fNbins / 2);
104  if (id > (fNbins - 1)) id = (fNbins - 1);
105 
106  fBins[id].Add(fPoints2D[i]);
107  fBins[(id + 1) % fNbins].Add(fPoints2D[i]);
108  }
109  else {
110  saveid = i;
111  exist = true;
112  }
113  }
114 
115  if (exist)
116  for (unsigned int id = 0; id < fNbins; id++)
117  fBins[id].Add(fPoints2D[saveid]);
118 }
119 
121 {
122  fMaxCharge = 0.0;
123  unsigned int saveid = 0;
124  for (unsigned int i = 0; i < fNbins; i++)
125  if (fBins[i].Size() && (fMaxCharge < fBins[i].GetTotCharge())) {
126  fMaxCharge = fBins[i].GetTotCharge();
127  saveid = i;
128  }
129 
130  fMaxChargeIdBin = saveid;
131 }
132 
134 {
135  fMeanCharge = 0.0;
136  if (fNbins == 0) return;
137 
138  unsigned int iprev, inext;
139 
140  if (fMaxChargeIdBin > 0)
141  iprev = fMaxChargeIdBin - 1;
142  else
143  iprev = fNbins - 1;
144 
145  inext = (fMaxChargeIdBin + 1) % fNbins;
146 
147  double sumcharge = 0.0;
148  for (unsigned int i = 0; i < fNbins; i++)
149  if ((i != fMaxChargeIdBin) && (i != iprev) && (i != inext))
150  sumcharge += fBins[i].GetTotCharge();
151 
152  fMeanCharge = sumcharge / double(fNbins);
153 }
154 
156 {
157  if ((fMaxCharge + fMeanCharge) == 0) return 0.0;
158  return ((fMaxCharge - fMeanCharge) / (fMaxCharge + fMeanCharge));
159 }
160 
162  const std::vector<art::Ptr<recob::Hit>>& src,
163  unsigned int nbins,
164  unsigned int idcl)
165  : fNbins(nbins), fIdCl(idcl), fCandidateID(0), fIsCandidateIDset(false)
166 {
167  fHits = src;
168 
169  for (unsigned int i = 0; i < src.size(); i++) {
170  Hit2D* hit = new Hit2D(detProp, src[i]);
171  fPoints2D.push_back(hit);
172  }
173 
175 
176  for (unsigned int i = 0; i < fNbins; i++)
177  fBins.push_back(Bin2D(fBaryCenter));
178 
179  FillBins();
180  ComputeMaxDist();
181  if (FindCandidates()) {
183  FindInitialPart();
184  }
185 }
186 
188 {
189  double nomx = 0.0;
190  double nomy = 0.0;
191  double denom = 0.0;
192  for (unsigned int i = 0; i < fPoints2D.size(); i++) {
193  nomx += fPoints2D[i]->GetPointCm().X() * fPoints2D[i]->GetCharge();
194  nomy += fPoints2D[i]->GetPointCm().Y() * fPoints2D[i]->GetCharge();
195  denom += fPoints2D[i]->GetCharge();
196  }
197 
198  double bx = nomx / denom;
199  double by = nomy / denom;
200  fBaryCenter.Set(bx, by);
201 }
202 
204 {
205  TVector2 vstart(0, 1);
206 
207  for (unsigned int i = 0; i < fPoints2D.size(); i++) {
208  TVector2 pos(fPoints2D[i]->GetPointCm().X(), fPoints2D[i]->GetPointCm().Y());
209  TVector2 vecp = pos - fBaryCenter;
210  float sinsign = (vstart.X() * vecp.Y()) - (vstart.Y() * vecp.X());
211  float cosine = (vstart * vecp) / (vstart.Mod() * vecp.Mod());
212  float theta = 180.0F * (std::acos(cosine)) / TMath::Pi();
213 
214  unsigned int id = 0;
215  double bin = double(360.0) / double(fNbins);
216 
217  if (sinsign >= 0)
218  id = int(theta / bin);
219  else if (sinsign < 0)
220  id = int(theta / bin) + (fNbins / 2);
221  if (id > (fNbins - 1)) id = (fNbins - 1);
222 
223  fBins[id].Add(fPoints2D[i]);
224  }
225 
226  for (unsigned int id = 0; id < fBins.size(); id++)
227  fBins[id].Sort();
228 }
229 
231 {
232  double maxdist2 = 0.0;
233 
234  for (unsigned int id = 0; id < fBins.size(); id++) {
235 
236  if (!fBins[id].Size()) continue;
237 
238  Hit2D* candidate = fBins[id].GetHits2D().front();
239  if (candidate) {
240  double dist2 = pma::Dist2(candidate->GetPointCm(), fBaryCenter);
241  if (dist2 > maxdist2) { maxdist2 = dist2; }
242  }
243  }
244 
245  fNormDist = std::sqrt(maxdist2);
246 }
247 
249 {
250  float rad = 0.5F * fNormDist;
251  unsigned int nbins = fNbins * 4;
252  for (unsigned int id = 0; id < fNbins; id++) {
253 
254  if (!fBins[id].Size()) continue;
255 
256  std::vector<Hit2D*> points;
257  Hit2D* candidate2D = fBins[id].GetHits2D().front();
258 
259  for (unsigned int i = 0; i < fPoints2D.size(); i++) {
260  double distnorm = std::sqrt(pma::Dist2(candidate2D->GetPointCm(), fBaryCenter)) / fNormDist;
261  double dist2 = pma::Dist2(candidate2D->GetPointCm(), fPoints2D[i]->GetPointCm());
262 
263  if ((distnorm > 0.5) && (dist2 < rad * rad)) points.push_back(fPoints2D[i]);
264  }
265 
266  if (fBins[id].Size() > 1) {
267  EndPoint ep(*candidate2D, points, nbins);
268  fCandidates.push_back(ep);
269  }
270  }
271  if (fCandidates.size())
272  return true;
273  else
274  return false;
275 }
276 
278 {
279  fNormCharge = 0.0;
280  for (unsigned int i = 0; i < fCandidates.size(); i++) {
281  if (fCandidates[i].GetMaxCharge() > fNormCharge) {
282  fNormCharge = fCandidates[i].GetMaxCharge();
283  }
284  }
285 }
286 
288 {
289  double max_asymmetry = 0.0;
290  unsigned int saveid = 0;
291  bool found = false;
292 
293  double maxdist2 = 0.0;
294  double maxcharge = 0.0;
295  unsigned int idmaxdist = 0;
296  unsigned int idmaxcharge = 0;
297 
298  for (unsigned int i = 0; i < fCandidates.size(); i++) {
299  double dist2 = pma::Dist2(fCandidates[i].GetPosition(), fBaryCenter);
300  double charge = fCandidates[i].GetMaxCharge();
301  if (dist2 > maxdist2) {
302  maxdist2 = dist2;
303  idmaxdist = i;
304  }
305  if (charge > maxcharge) {
306  maxcharge = charge;
307  idmaxcharge = i;
308  }
309  }
310 
311  maxdist2 = 0.0;
312  unsigned int idmaxdistb = 0;
313  for (size_t i = 0; i < fCandidates.size(); i++) {
314  if ((i == idmaxdist) || (i == idmaxcharge)) continue;
315 
316  double dist2 = pma::Dist2(fCandidates[i].GetPosition(), fCandidates[idmaxdist].GetPosition());
317  if (dist2 > maxdist2) {
318  maxdist2 = dist2;
319  idmaxdistb = i;
320  }
321  }
322 
323  if (fCandidates.size() > 2) {
324  for (unsigned int i = 0; i < fCandidates.size(); i++) {
325  double asymmetry = fCandidates[i].GetAsymmetry();
326 
327  if ((i == idmaxdist) || (i == idmaxcharge) || (i == idmaxdistb)) {
328  if (asymmetry > max_asymmetry) {
329  max_asymmetry = asymmetry;
330  saveid = i;
331  found = true;
332  }
333  }
334  }
335  }
336  else {
337  for (unsigned int i = 0; i < fCandidates.size(); i++) {
338  double asymmetry = fCandidates[i].GetAsymmetry();
339 
340  if ((i == idmaxdist) || (i == idmaxdistb)) {
341  if (asymmetry > max_asymmetry) {
342  max_asymmetry = asymmetry;
343  saveid = i;
344  found = true;
345  }
346  }
347  }
348  }
349 
350  if (!found)
351  mf::LogError("DirOfGamma") << fCandidates.size() << "DirOfGamma - Find Initial Part problem.";
352 
353  fStartHit = fCandidates[saveid].GetHit();
354  fStartPoint = fCandidates[saveid].GetPosition();
355  fIniHits = fCandidates[saveid].MaxChargeBin().GetIniHits();
356  fCandidateID = saveid;
357 }
Float_t x
Definition: compare.C:6
void SortLess()
Definition: DirOfGamma.cxx:45
void FindInitialPart()
Definition: DirOfGamma.cxx:287
TVector2 fPoint
Definition: DirOfGamma.h:43
DirOfGamma(const detinfo::DetectorPropertiesData &detProp, const std::vector< art::Ptr< recob::Hit >> &src, unsigned int nbins, unsigned int idcl)
Definition: DirOfGamma.cxx:161
Utilities related to art service access.
void FillBins()
Definition: DirOfGamma.cxx:82
double Dist2(const TVector2 &v1, const TVector2 &v2)
Definition: Utilities.cxx:39
void Add(Hit2D *hit)
Definition: DirOfGamma.cxx:32
Float_t Y
Definition: plot.C:37
std::vector< art::Ptr< recob::Hit > > fHits
Definition: DirOfGamma.h:171
CryostatID_t Cryostat
Index of cryostat.
Definition: geo_types.h:195
cout<< "Opened file "<< fin<< " ixs= "<< ixs<< endl;if(ixs==0) hhh=(TH1F *) fff-> Get("h1")
Definition: AddMC.C:8
std::vector< Hit2D * > fPoints2D
Definition: DirOfGamma.h:100
WireID_t Wire
Index of the wire within its plane.
Definition: geo_types.h:430
geo::WireID const & WireID() const
Initial tdc tick for hit.
Definition: Hit.h:290
MaybeLogger_< ELseverityLevel::ELsev_error, false > LogError
std::vector< Hit2D * > fHits2D
Definition: DirOfGamma.h:71
void ComputeMaxCharge()
Definition: DirOfGamma.cxx:120
bool FindCandidates()
Definition: DirOfGamma.cxx:248
art::Ptr< recob::Hit > const & GetHitPtr() const
Definition: DirOfGamma.h:38
TVector2 fBaryCenter
Definition: DirOfGamma.h:183
size_t fNbins
Definition: DirOfGamma.h:101
std::vector< Bin2D > fBins
Definition: DirOfGamma.h:165
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:289
Hit2D fCenter2D
Definition: DirOfGamma.h:99
unsigned int fSize
Definition: DirOfGamma.h:73
void hits()
Definition: readHits.C:15
void ComputeMaxDist()
Definition: DirOfGamma.cxx:230
Float_t radius
Definition: plot.C:23
const TVector2 & fCenter2D
Definition: DirOfGamma.h:70
key_type key() const noexcept
Definition: Ptr.h:166
double fTotCharge
Definition: DirOfGamma.h:72
Hit2D(detinfo::DetectorPropertiesData const &detProp, art::Ptr< recob::Hit > src)
Definition: DirOfGamma.cxx:15
EndPoint(const Hit2D &center, const std::vector< Hit2D * > &hits, unsigned int nbins)
Definition: DirOfGamma.cxx:65
double GetCharge() const
Definition: DirOfGamma.h:36
size_t fPlane
Definition: DirOfGamma.h:114
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:373
float bin[41]
Definition: plottest35.C:14
std::vector< art::Ptr< recob::Hit > > GetIniHits(const double radius=10.0, const unsigned int nhits=10) const
Definition: DirOfGamma.cxx:50
Detector simulation of raw signals on wires.
Encapsulate the geometry of a wire .
double ConvertTicksToX(double ticks, int p, int t, int c) const
size_t fMaxChargeIdBin
Definition: DirOfGamma.h:108
float ROISummedADC() const
The sum of calibrated ADC counts of the ROI (0. by default)
Definition: Hit.h:246
double fCharge
Definition: DirOfGamma.h:41
Implementation of the Projection Matching Algorithm.
float PeakTime() const
Time of the signal peak, in tick units.
Definition: Hit.h:226
size_t fCandidateID
Definition: DirOfGamma.h:162
Encapsulate the construction of a single detector plane .
void ComputeBaryCenter()
Definition: DirOfGamma.cxx:187
void ComputeMaxCharge()
Definition: DirOfGamma.cxx:277
TVector2 fStartPoint
Definition: DirOfGamma.h:169
void Sort()
Definition: DirOfGamma.cxx:40
std::vector< EndPoint > fCandidates
Definition: DirOfGamma.h:166
TVector2 const & GetPointCm() const
Definition: DirOfGamma.h:35
double fMeanCharge
Definition: DirOfGamma.h:104
void ComputeMeanCharge()
Definition: DirOfGamma.cxx:133
double fMaxCharge
Definition: DirOfGamma.h:103
double GetAsymmetry() const
Definition: DirOfGamma.cxx:155
TPCID_t TPC
Index of the TPC within its cryostat.
Definition: geo_types.h:315
Float_t X
Definition: plot.C:37
std::vector< Bin2D > fBins
Definition: DirOfGamma.h:106
art::Ptr< recob::Hit > fStartHit
Definition: DirOfGamma.h:168
std::vector< art::Ptr< recob::Hit > > fIniHits
Definition: DirOfGamma.h:170
std::vector< Hit2D * > fPoints2D
Definition: DirOfGamma.h:164
size_t fCryo
Definition: DirOfGamma.h:116
Bin2D(const TVector2 &center)
Definition: DirOfGamma.cxx:30