ATLAS Offline Software
AlfaLocalHits.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #define AlfaLocalHits_cxx
6 
7 // C, C++ headers
8 #include <cstdio>
9 #include <cstdlib>
10 #include <iostream>
11 
12 #include "AlfaLocalHits.h"
15 
16 using std::cout;
17 using std::endl;
18 
20 //
21 // implementation of AlfaLocalHit
22 // which stores information about one hit
23 //
26  m_pot (0),
27  m_potname (""),
28  m_ishit (0),
29  m_x (0.0),
30  m_y (0.0),
31  m_z (0.0),
32  m_LocRecCorr (nullptr)
33 {
34 }
35 
36 
38  // explicit constructor
39  SetHit(LocRecCorrHit);
40 }
41 
43  m_pot = h->GetPotNum();
45  m_ishit = 1;
46  m_x = h->GetX();
47  m_y = h->GetY();
48  m_z = h->GetZ();
49  m_LocRecCorr = h->GetLocRecCorr();
50 }
51 
52 
53 void AlfaLocalHit::SetHit(const ALFA_LocRecCorrEvent * LocRecCorrHit){
54  m_pot = LocRecCorrHit->getPotNum();
55  //cout << "AlfaLocalHit::SetHit... m_pot = " << m_pot << endl;
57  m_ishit = 1;
58  m_x = LocRecCorrHit->getXpositionLHC();
59  m_y = LocRecCorrHit->getYpositionLHC();
60  m_LocRecCorr = LocRecCorrHit;
61  AssignZ();
62 }
63 
64 
66  if(m_pot < 0) {
67  throw std::runtime_error("AlfaLocalHit::AssignZ() m_pot not assigned");
68  }
69  m_z = 1.e10;
70  if(m_potname.Contains("B7L1U")) m_z = 241528.;
71  if(m_potname.Contains("A7L1U")) m_z = 237388.;
72  if(m_potname.Contains("B7L1L")) m_z = 241538.;
73  if(m_potname.Contains("A7L1L")) m_z = 237398.;
74  if(m_potname.Contains("B7R1U")) m_z = -241548.;
75  if(m_potname.Contains("A7R1U")) m_z = -237408.;
76  if(m_potname.Contains("B7R1L")) m_z = -241538.;
77  if(m_potname.Contains("A7R1L")) m_z = -237398.;
78  if(!(m_z < 1.e10)){
79  throw std::runtime_error("AlfaLocalHit::AssignZ: z coordinate was not assigned for the hit");
80  }
81 }
82 
84  cout << "pot = " << m_pot
85  << " i.e " << m_potname.Data()
86  << " x = " << m_x
87  << " m_y = " << m_y
88  ;
89 }
90 
91 int AlfaLocalHit::GetMDindex(const char * name){
92  TString n(name);
93  if(n.Contains("B7L1U")) return 0;
94  if(n.Contains("B7L1L")) return 1;
95  if(n.Contains("A7L1U")) return 2;
96  if(n.Contains("A7L1L")) return 3;
97  if(n.Contains("A7R1U")) return 4;
98  if(n.Contains("A7R1L")) return 5;
99  if(n.Contains("B7R1U")) return 6;
100  if(n.Contains("B7R1L")) return 7;
101  throw std::runtime_error("AlfaLocalHit::GetMDindex ... Not recognised detector name: " + n);
102 }
104  if(i == 0) return {"B7L1U"};
105  if(i == 1) return {"B7L1L"};
106  if(i == 2) return {"A7L1U"};
107  if(i == 3) return {"A7L1L"};
108  if(i == 4) return {"A7R1U"};
109  if(i == 5) return {"A7R1L"};
110  if(i == 6) return {"B7R1U"};
111  if(i == 7) return {"B7R1L"};
112  throw std::runtime_error("AlfaLocalHit::GetMDname ... Not recognised detector number: " + std::to_string(i));
113 }
114 
115 
116 
118 //
119 // implementation of AlfaLocalHits
120 // which stores ithe AlfaLocalHit objects
121 //
123 // .. default ctor.
125  m_hits.clear();
126  m_paths.clear();
127  m_nhits = m_hits.size();
128  m_npaths = m_paths.size();
129  m_pathpattern ="";
130 }
132  m_nhits = m_hits.size();
133  m_npaths = m_paths.size();
134 }
136  m_hits.push_back(h);
137  update();
138  return m_hits.size();
139 }
141  m_hits.clear();
142  m_paths.clear();
143  m_pathpattern ="";
144  update();
145 }
147  m_paths.clear();
148  m_pathpattern ="";
149  update();
150 }
151 
152 // .. size
154  if(m_nhits != (int) m_hits.size()){
155  throw std::runtime_error("Class AlfaLocalHits: m_nhits != m_hits.size() !!! ");
156  }
157  return m_nhits;
158 }
159 // .. Dump
161  if(m_nhits == 0){
162  cout << "Cannot dump the AlfaLocalHits object, it has zero size." << endl;
163  }else{
164  cout << "Dumping object of AlfaLocalHits class:" << endl;
165  for(Int_t i = 0; i < m_nhits; i++){
166  cout << "at " << i << " ";
167  m_hits.at(i).Print();
168  cout << endl;
169  }
170  }
171 }
173  cout << "Dumping paths for " << m_pathpattern.Data() << " pattern" << endl;
174  for(int i = 0; i < m_npaths; i++){
175  m_paths.at(i).Dump();
176  }
177 }
178 
181 // ... apply path pattern to all the hits
182 // paths will be the same objects contaioning
183 // only the wanted hits
184 // pattern examples: B7L1U_A7L1U_X_B7R1L etc. X ... anything
187  TString ts_pattern(pattern);
188  TObjArray toa_tokenized_pattern(4,0);
189  toa_tokenized_pattern = * ts_pattern.Tokenize("_");
190  if(toa_tokenized_pattern.GetEntries() != 4){
191  std::runtime_error("AlfaLocalHits: Pattern of wrong length!!! " + ts_pattern);
192  }
193  TString patternitem("");
194  AlfaLocalHits alh_tmp;
195  for(int i1 = 0; i1 < m_nhits; i1++){
196  int i1last = (i1 == m_nhits-1);
197  AlfaLocalHit h1(m_hits.at(i1));
198  TString patternitem0 = TString(((TObjString*) toa_tokenized_pattern.At(0))->GetString());
199  if((h1.GetPotName().Contains(patternitem0))
200  || (i1last && patternitem0.Contains("X"))
201  ){
202  for(int i2 = 0; i2 < m_nhits; i2++){
203  int i2last = (i2 == m_nhits-1);
204  if(i2 == i1 && !i2last) continue;
205  AlfaLocalHit h2(m_hits.at(i2));
206  TString patternitem1 = TString(((TObjString*) toa_tokenized_pattern.At(1))->GetString());
207  if((h2.GetPotName().Contains(patternitem1))
208  ||(i2last && patternitem1.Contains("X"))
209  ){
210  for(int i3 = 0; i3 < m_nhits; i3++){
211  int i3last = (i3 == m_nhits-1);
212  if(i3 == i1 && !i3last) continue;
213  if(i3 == i2 && !i3last) continue;
214  AlfaLocalHit h3(m_hits.at(i3));
215  TString patternitem2 = TString(((TObjString*) toa_tokenized_pattern.At(2))->GetString());
216  if((h3.GetPotName().Contains(patternitem2))
217  ||(i3last && patternitem2.Contains("X"))
218  ){
219  for(int i4 = 0; i4 < m_nhits; i4++){
220  int i4last = (i4 == m_nhits-1);
221  if(i4 == i1 && !i4last) continue;
222  if(i4 == i2 && !i4last) continue;
223  if(i4 == i3 && !i4last) continue;
224  AlfaLocalHit h4(m_hits.at(i4));
225  TString patternitem3 = TString(((TObjString*) toa_tokenized_pattern.At(3))->GetString());
226  if((h4.GetPotName().Contains(patternitem3))
227  ||(i4last && patternitem3.Contains("X"))
228  ){
229  if(patternitem0!='X') {alh_tmp.AddHit(h1);}
230  if(patternitem1!='X') {alh_tmp.AddHit(h2);}
231  if(patternitem2!='X') {alh_tmp.AddHit(h3);}
232  if(patternitem3!='X') {alh_tmp.AddHit(h4);}
233  }
234  }
235  }
236  }
237  }
238  }
239  }
240  }
241  alh_tmp.SetPathPattern(m_pathpattern.Data());
242  m_paths.push_back(alh_tmp);
243  update();
244 }
245 
248 }
249 
251  if(ipath >= m_npaths){
252  throw std::runtime_error("Requesting path with overflow index");
253  }
254  return &(m_paths.at(ipath));
255 }
256 
257 
259  if(ihit >= m_nhits){
260  throw std::runtime_error("Requesting hit with overflow index");
261  }
262  return &(m_hits.at(ihit));
263 }
264 
265 
266 
268 //
269 // implementation of AlfaTrack
270 // which stores information about one track
271 //
274  // ... initialize
275  m_arm = -1.;
276  m_x = 1.e10;
277  m_y = 1.e10;
278  m_z = 1.e10;
279  m_xslope = 1.e10;
280  m_yslope = 1.e10;
281  m_nearlocalhit = nullptr;
282  m_farlocalhit = nullptr;
283 
284  // ... asign hits that create the track
286 
287  // ... calculate track kinematics and project track back to "pot planes"
292  cout << "Left and right side ALFA tracks at one time not supported in AlfaTrackCand class" << endl;
293  cout << "Consider using another class for them or change path pattern." << endl;
294  }
295 }
296 
298  if((m_trackcandhits->GetPathPattern().Contains("B7L1U")
299  && m_trackcandhits->GetPathPattern().Contains("A7L1U"))
300  || (m_trackcandhits->GetPathPattern().Contains("B7L1L")
301  && m_trackcandhits->GetPathPattern().Contains("A7L1L"))
302  ){
303  MsgStream LogStream(Athena::getMessageSvc(), "ALFA_TrackCand::IsLeftTrack");
304  LogStream << MSG::DEBUG << "Track candidate is left" << endmsg;
305  return 1;
306  }else{
307  return 0;
308  }
309 }
310 
312  if((m_trackcandhits->GetPathPattern().Contains("B7R1U")
313  && m_trackcandhits->GetPathPattern().Contains("A7R1U"))
314  || (m_trackcandhits->GetPathPattern().Contains("B7R1L")
315  && m_trackcandhits->GetPathPattern().Contains("A7R1L"))
316  ){
317  MsgStream LogStream(Athena::getMessageSvc(), "ALFA_TrackCand::IsRightTrack");
318  LogStream << MSG::DEBUG << "Track candidate is right" << endmsg;
319  return 1;
320  }else{
321  return 0;
322  }
323 }
324 
326  if((m_trackcandhits->GetPathPattern().Contains("B7L1L")
327  && m_trackcandhits->GetPathPattern().Contains("A7L1L"))
328  || (m_trackcandhits->GetPathPattern().Contains("B7R1L")
329  && m_trackcandhits->GetPathPattern().Contains("A7R1L"))
330  ){
331  MsgStream LogStream(Athena::getMessageSvc(), "ALFA_TrackCand::IsLowerArmTrack");
332  LogStream << MSG::DEBUG << "Track candidate is in the lower arm" << endmsg;
333  return 1;
334  }else{
335  return 0;
336  }
337 }
338 
340  if((m_trackcandhits->GetPathPattern().Contains("B7L1U")
341  && m_trackcandhits->GetPathPattern().Contains("A7L1U"))
342  || (m_trackcandhits->GetPathPattern().Contains("B7R1U")
343  && m_trackcandhits->GetPathPattern().Contains("A7R1U"))
344  ){
345  MsgStream LogStream(Athena::getMessageSvc(), "ALFA_TrackCand::IsUpperArmTrack");
346  LogStream << MSG::DEBUG << "Track candidate is in the upper arm" << endmsg;
347  return 1;
348  }else{
349  return 0;
350  }
351 }
352 
353 
356  return 1;
357  }else{
358  return 0;
359  }
360 }
361 
364  return 1;
365  }else{
366  return 0;
367  }
368 }
369 
371  float xM = 1.e10;
372  float xm = 1.e10;
373  float yM = 1.e10;
374  float ym = 1.e10;
375  float zM = 1.e10;
376  float zm = 1.e10;
377  for(int i = 0; i < m_trackcandhits->GetNhits(); i++){
379  if(m_trackcandhits->GetHit(i)->GetPotName().Contains("B7")){
380  xM = m_trackcandhits->GetHit(i)->GetX();
381  yM = m_trackcandhits->GetHit(i)->GetY();
382  zM = m_trackcandhits->GetHit(i)->GetZ();
384  }else if(m_trackcandhits->GetHit(i)->GetPotName().Contains("A7")){
385  xm = m_trackcandhits->GetHit(i)->GetX();
386  ym = m_trackcandhits->GetHit(i)->GetY();
387  zm = m_trackcandhits->GetHit(i)->GetZ();
389  }
391  m_arm = 2;
392  }else if(AlfaTrackCand::IsUpperArmTrack()){
393  m_arm = 1;
394  }else{
395  throw std::runtime_error("AlfaTrackCand::CalcTrack() ... track is in left but unknown upper/lower arm");
396  }
397  }else if(AlfaTrackCand::IsRightTrack()){
398  if(m_trackcandhits->GetHit(i)->GetPotName().Contains("B7")){
399  xm = m_trackcandhits->GetHit(i)->GetX();
400  ym = m_trackcandhits->GetHit(i)->GetY();
401  zm = m_trackcandhits->GetHit(i)->GetZ();
403  }else if(m_trackcandhits->GetHit(i)->GetPotName().Contains("A7")){
404  xM = m_trackcandhits->GetHit(i)->GetX();
405  yM = m_trackcandhits->GetHit(i)->GetY();
406  zM = m_trackcandhits->GetHit(i)->GetZ();
408  }
410  m_arm = 4;
411  }else if(AlfaTrackCand::IsUpperArmTrack()){
412  m_arm = 3;
413  }else{
414  std::runtime_error("AlfaTrackCand::CalcTrack() ... track is in right but unknown upper/lower arm");
415  }
416  }else{
417  std::runtime_error("AlfaTrackCand::CalcTrack() ... track must be left or right");
418  }
419  }
420 
421  m_x = (xM + xm) / 2.;
422  m_y = (yM + ym) / 2.;
423  m_z = (zM + zm) / 2.;
424  m_xslope = (xM - xm) / (zM - zm);
425  m_yslope = (yM - ym) / (zM - zm);
426 
427 }
428 
429 
431  // ... distance from intercept to xy plane at pot z is
432  // half of the distance between the pots
433  // ... the direction vector starting at x,y needs to be
434  // scaled to touch the plane at pot's z
435  double z_nearpot = m_nearlocalhit->GetZ();
436  double scalefactortonearpot = z_nearpot - m_z;
437  double ximpact_nearpot = m_x + m_xslope * scalefactortonearpot;
438  double yimpact_nearpot = m_y + m_yslope * scalefactortonearpot;
439  double zimpact_nearpot = z_nearpot;
440  m_nearimpactpoint.setX(ximpact_nearpot);
441  m_nearimpactpoint.setY(yimpact_nearpot);
442  m_nearimpactpoint.setZ(zimpact_nearpot);
443 
444  double z_farpot = m_farlocalhit->GetZ();
445  double scalefactortofarpot = z_farpot - m_z;
446  double ximpact_farpot = m_x + m_xslope * scalefactortofarpot;
447  double yimpact_farpot = m_y + m_yslope * scalefactortofarpot;
448  double zimpact_farpot = z_farpot;
449  m_farimpactpoint.setX(ximpact_farpot);
450  m_farimpactpoint.setY(yimpact_farpot);
451  m_farimpactpoint.setZ(zimpact_farpot);
452 
453 }
454 
455 
456 void AlfaTrackCand::Dump() const {
457  //cout.precision(8);
458  cout << "Dumping AlfaTrackCand:" << endl;
459  cout << " arm = " << std::setprecision(8) << m_arm
460  << " x = " << std::setprecision(8) << m_x
461  << " y = " << std::setprecision(8) << m_y
462  << " z = " << std::setprecision(8) << m_z
463  << " x'= " << std::setprecision(8) << m_xslope
464  << " y' = " << std::setprecision(8) << m_yslope
465  << endl;
466 }
467 
468 
469 
mergePhysValFiles.pattern
pattern
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:26
AlfaLocalHit::AlfaLocalHit
AlfaLocalHit()
Definition: AlfaLocalHits.cxx:25
AlfaTrackCand::IsLowerArmTrack
int IsLowerArmTrack()
Definition: AlfaLocalHits.cxx:325
AlfaLocalHits::GetPathPattern
TString GetPathPattern()
Definition: AlfaLocalHits.h:89
TRTCalib_Extractor.hits
hits
Definition: TRTCalib_Extractor.py:35
ALFA_LocRecCorrEvent.h
AlfaLocalHit::m_z
Float_t m_z
Definition: AlfaLocalHits.h:37
AlfaLocalHits::DumpPaths
void DumpPaths()
Definition: AlfaLocalHits.cxx:172
AlfaTrackCand::IsLeftAndRightTrack
int IsLeftAndRightTrack()
Definition: AlfaLocalHits.cxx:362
AlfaLocalHit::m_x
Float_t m_x
Definition: AlfaLocalHits.h:37
AlfaTrackCand::m_farimpactpoint
HepGeom::Point3D< double > m_farimpactpoint
Definition: AlfaLocalHits.h:108
AlfaLocalHits::m_pathpattern
TString m_pathpattern
Definition: AlfaLocalHits.h:73
AlfaLocalHits::AlfaLocalHits
AlfaLocalHits()
Definition: AlfaLocalHits.cxx:124
AlfaLocalHits::AddHit
int AddHit(const AlfaLocalHit &h)
Definition: AlfaLocalHits.cxx:135
ALFA_LocRecCorrEvent::getYpositionLHC
float getYpositionLHC() const
Definition: ALFA_LocRecCorrEvent.h:20
AlfaLocalHits::m_paths
std::vector< AlfaLocalHits > m_paths
Definition: AlfaLocalHits.h:71
AlfaLocalHit::m_potname
TString m_potname
Definition: AlfaLocalHits.h:35
AlfaTrackCand::m_farlocalhit
AlfaLocalHit * m_farlocalhit
Definition: AlfaLocalHits.h:106
AlfaLocalHits
Definition: AlfaLocalHits.h:67
ALFA_LocRecEvent.h
read_hist_ntuple.h1
h1
Definition: read_hist_ntuple.py:21
AlfaLocalHits::GetPathHits
AlfaLocalHits * GetPathHits(int ipath)
Definition: AlfaLocalHits.cxx:250
AlfaTrackCand::m_arm
int m_arm
Definition: AlfaLocalHits.h:101
AlfaTrackCand::IsLeftTrack
int IsLeftTrack()
Definition: AlfaLocalHits.cxx:297
Athena::getMessageSvc
IMessageSvc * getMessageSvc(bool quiet=false)
Definition: getMessageSvc.cxx:20
AlfaTrackCand::m_x
float m_x
Definition: AlfaLocalHits.h:102
AlfaLocalHits::Dump
void Dump()
Definition: AlfaLocalHits.cxx:160
AlfaLocalHit::m_ishit
int m_ishit
Definition: AlfaLocalHits.h:36
AlfaTrackCand::m_xslope
float m_xslope
Definition: AlfaLocalHits.h:103
AlfaLocalHits::size
int size()
Definition: AlfaLocalHits.cxx:153
AlfaLocalHits::GetNhits
int GetNhits()
Definition: AlfaLocalHits.h:81
lumiFormat.i
int i
Definition: lumiFormat.py:85
AlfaLocalHit::m_LocRecCorr
const ALFA_LocRecCorrEvent * m_LocRecCorr
Definition: AlfaLocalHits.h:38
beamspotman.n
n
Definition: beamspotman.py:731
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
AlfaLocalHit::GetY
float GetY() const
Definition: AlfaLocalHits.h:47
AlfaLocalHits::SetPathPattern
void SetPathPattern(const char *pattern)
Definition: AlfaLocalHits.cxx:246
AlfaLocalHit::AssignZ
void AssignZ()
Definition: AlfaLocalHits.cxx:65
AlfaLocalHit::GetMDindex
int GetMDindex(const char *name)
Definition: AlfaLocalHits.cxx:91
AlfaTrackCand::m_nearlocalhit
AlfaLocalHit * m_nearlocalhit
Definition: AlfaLocalHits.h:105
ALFA_LocRecCorrEvent
Definition: ALFA_LocRecCorrEvent.h:8
AlfaLocalHit::GetZ
float GetZ() const
Definition: AlfaLocalHits.h:48
AlfaLocalHits::m_npaths
int m_npaths
Definition: AlfaLocalHits.h:72
ALFA_LocRecCorrEvent::getXpositionLHC
float getXpositionLHC() const
Definition: ALFA_LocRecCorrEvent.h:19
AlfaTrackCand::m_trackcandhits
AlfaLocalHits * m_trackcandhits
Definition: AlfaLocalHits.h:104
AlfaLocalHits::m_hits
std::vector< AlfaLocalHit > m_hits
Definition: AlfaLocalHits.h:69
AlfaLocalHits::GetHit
AlfaLocalHit * GetHit(int ihit)
Definition: AlfaLocalHits.cxx:258
AlfaLocalHits::ResetPaths
void ResetPaths()
Definition: AlfaLocalHits.cxx:146
AlfaTrackCand::AlfaTrackCand
AlfaTrackCand(AlfaLocalHits *hits)
Definition: AlfaLocalHits.cxx:273
AlfaTrackCand::m_y
float m_y
Definition: AlfaLocalHits.h:102
AlfaLocalHit::GetMDname
TString GetMDname(int i)
Definition: AlfaLocalHits.cxx:103
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
ALFA_LocRecCorrEvent::getPotNum
int getPotNum() const
Definition: ALFA_LocRecCorrEvent.h:18
AlfaTrackCand::CalcTrack
void CalcTrack()
Definition: AlfaLocalHits.cxx:370
AlfaLocalHits.h
AlfaTrackCand::IsLeftOrRightTrack
int IsLeftOrRightTrack()
Definition: AlfaLocalHits.cxx:354
AlfaTrackCand::m_yslope
float m_yslope
Definition: AlfaLocalHits.h:103
AlfaLocalHit
Definition: AlfaLocalHits.h:32
h
AlfaLocalHit::SetHit
void SetHit(const ALFA_LocRecCorrEvent *LocRecCorrHit)
Definition: AlfaLocalHits.cxx:53
AlfaLocalHits::m_nhits
int m_nhits
Definition: AlfaLocalHits.h:70
AlfaTrackCand::IsUpperArmTrack
int IsUpperArmTrack()
Definition: AlfaLocalHits.cxx:339
DEBUG
#define DEBUG
Definition: page_access.h:11
AlfaLocalHit::m_pot
int m_pot
Definition: AlfaLocalHits.h:34
AlfaLocalHits::Reset
void Reset()
Definition: AlfaLocalHits.cxx:140
AlfaLocalHit::Print
void Print()
Definition: AlfaLocalHits.cxx:83
AlfaLocalHits::ApplyPathPattern
void ApplyPathPattern(const char *pattern)
Definition: AlfaLocalHits.cxx:179
AlfaTrackCand::m_nearimpactpoint
HepGeom::Point3D< double > m_nearimpactpoint
Definition: AlfaLocalHits.h:107
AlfaLocalHit::GetX
float GetX() const
Definition: AlfaLocalHits.h:46
AlfaTrackCand::IsRightTrack
int IsRightTrack()
Definition: AlfaLocalHits.cxx:311
AlfaLocalHit::GetPotName
TString GetPotName() const
Definition: AlfaLocalHits.h:51
AlfaLocalHits::update
void update()
Definition: AlfaLocalHits.cxx:131
AlfaTrackCand::m_z
float m_z
Definition: AlfaLocalHits.h:102
AlfaTrackCand::CalcImpactPoints
void CalcImpactPoints()
Definition: AlfaLocalHits.cxx:430
AlfaLocalHit::m_y
Float_t m_y
Definition: AlfaLocalHits.h:37
AlfaTrackCand::Dump
void Dump() const
Definition: AlfaLocalHits.cxx:456