ATLAS Offline Software
LArTBH6BeamInfo.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "LArTBH6BeamInfo.h"
6 
9 
10 // Gaudi Includes
11 #include "GaudiKernel/SystemOfUnits.h"
12 #include "StoreGate/DataHandle.h"
13 
14 using namespace Gaudi::Units;
15 
16 LArTBH6BeamInfo::LArTBH6BeamInfo(const std::string& name, ISvcLocator* pSvcLocator)
17  :AthAlgorithm(name, pSvcLocator),
18  m_Primary(true),
19  m_pcode(999),
20  m_cryoX(0.),
21  m_numEv(0),
22  m_theEventInfo("TBEventInfo")
23 {
24  declareProperty("HitsContainer",m_HitsCollNames);
25 // m_HitsCollNames.push_back("LArTBFrontHitCollection");
26  declareProperty("PrimaryTrackOnly",m_Primary);
27  declareProperty("PrimaryParticle",m_pcode);
28 
29  for (const auto &it : m_HitsCollNames){
31  }
32 
33 }
34 
36 {}
37 
38 //****************************************************************************
39 //* Initialization
40 //****************************************************************************
41 
43 {
44 
45  if((!m_Primary) && (m_pcode == 999)) {
46  ATH_MSG_ERROR ( "Pcode should be in jO, if not PrimaryTrackOnly !" );
47  return StatusCode::FAILURE;
48  }
49 
50 // End of Initialization
51  ATH_MSG_INFO ( "LArTBH6BeamInfo initialisation completed" );
52  return StatusCode::SUCCESS;
53 }
54 
55 //****************************************************************************
56 //* Execution
57 //****************************************************************************
58 
60 {
61  ATH_MSG_INFO ( "LArTBH6BeamInfo in execute" );
62  CLHEP::Hep3Vector pos;
63 
64  if ( m_numEv == 0 ){
66  }
67 
68  dVect v_x;
69  dVect v_y;
70  dVect v_xz;
71  dVect v_yz;
72  dVect v_ex;
73  dVect v_ey;
74 
75 // loop hit containers
76  for (auto &it : m_hitcoll) {
77 
78  ATH_MSG_INFO (" hit container: "<< it->Name() <<" size: "<<it->size() );
79 
80  for (const LArG4H6FrontHit* hit : *it){
81  // loop over hits, find track==0 and make a fit, store a TBTrack to StoreGate
82  if(hit->GetSC() > 0) continue; // scintilator hit
83  if(m_Primary) {
84  if(hit->GetTrackID() != 1) continue; // not a primary particle
85  } else {
86  if(hit->GetPcode() != m_pcode) continue; // not a beam particle
87  }
88  pos = hit->GetPos();
89  if(hit->GetX() > 0) { // X-coordinate
90  v_x.push_back(pos.x());
91  v_xz.push_back(pos.z()+21600.*mm);
92  v_ex.push_back(0.01); // take the error from somewhere !!!
93  } else {
94  v_y.push_back(pos.y());
95  v_yz.push_back(pos.z()+21600.*mm);
96  v_ey.push_back(0.01); // take the error from somewhere !!!
97  }
98  }
99 
100  }
101 
102  if(v_x.size() < 2 || v_y.size() < 2) { // Could not fit
103  ATH_MSG_DEBUG ( "Could not fit, setting zero. "<<v_x.size()<<"/"<<v_y.size() );
104  m_track = std::make_unique<TBTrack>(0,0);
105  m_track->setUintercept(0.);
106  m_track->setVintercept(0.);
107  m_track->setUslope(0.);
108  m_track->setVslope(0.);
109 // m_track->setResidualu(0, 0);
110 // m_track->setResidualv(0, 0);
111  m_track->setChi2_u(1000.);
112  m_track->setChi2_v(1000.);
113  m_track->setCryoHitu(0.);
114  m_track->setCryoHitv(0.);
115  m_track->setCryoHitw(30000.);
116  return StatusCode::FAILURE;
117  }
118  // Now fit somehow
119  double chi2_x = 0;
120  double chi2_y = 0;
121  std::vector<double> residual_x, residual_y;
122  double a1_x = 0;
123  double a2_x = 0;
124  double a1_y = 0;
125  double a2_y = 0;
126  bool check = true;
127 
128  check = fitVect(v_x, v_xz, v_ex, a1_x, a2_x, chi2_x, residual_x);
129 
130  if(!check){
131  ATH_MSG_ERROR ( "Fit in X-coordinate failure." );
132  return StatusCode::FAILURE;
133  }
134 
135  check = fitVect(v_y, v_yz, v_ey, a1_y, a2_y, chi2_y, residual_y);
136  if(!check){
137  ATH_MSG_ERROR ( "Fit in Y-coordinate failure." );
138  return StatusCode::FAILURE;
139  }
140 
141  // Setting the slopes & intercepts for each track //
142  ATH_MSG_DEBUG ( "Setting fit parameters of track." );
143  ATH_MSG_DEBUG ( "Intercepts: "<<a1_x<<" "<<a1_y );
144  ATH_MSG_DEBUG ( "Slopes: "<<a2_x<<" "<<a2_y );
145 
146  m_track = std::make_unique<TBTrack>(v_x.size(), v_y.size());
147 
148  m_track->setUintercept(a1_x);
149  m_track->setVintercept(a1_y);
150  m_track->setUslope(a2_x);
151  m_track->setVslope(a2_y);
152 
153  // Setting the residual for plane u //
154  for(size_t i = 0; i < v_x.size(); ++i){
155  m_track->setResidualu(i, residual_x[i]);
156  }
157 
158  // Setting the residual for plane v //
159  for(size_t i = 0; i < v_y.size(); ++i){
160  m_track->setResidualv(i, residual_y[i]);
161  }
162 
163  ATH_MSG_DEBUG ( "chi2 in X: " << chi2_x );
164  ATH_MSG_DEBUG ( "chi2 in Y: " << chi2_y );
165  ATH_MSG_DEBUG ( "Setting chi2s of track." );
166 
167  m_track->setChi2_u(chi2_x);
168  m_track->setChi2_v(chi2_y);
169 
170  // Setting the cryo plane (30000 mm in TB coordinate)
171  m_track->setCryoHitu(a2_x*30000.+a1_x+m_cryoX);
172  m_track->setCryoHitv(a2_y*30000.+a1_y);
173  m_track->setCryoHitw(30000.);
174 
175  return StatusCode::SUCCESS;
176 }
177 
178 //****************************************************************************
179 //* Finalize
180 //****************************************************************************
181 
183 {
184  ATH_MSG_INFO ( "LArTBH6BeamInfo::finalize()" );
185  return StatusCode::SUCCESS;
186 }
187 
189 bool LArTBH6BeamInfo::fitVect(const dVect &vec, const dVect &vec_z, const dVect &vec_e,
190  double &a1, double &a2,double &chi2, dVect &residual)
192 {
193  // v_u = vector of u data points
194  // v_w = vector of w data points
195  // v_eu = vector of errors in u data points
196  // v_ew = vector of errors in w data points
197  // a1 and a2 = fit parameters: u = a1 + a2*w
198 
199  // *** note that the fit algorithm used (given in 'Numerical Methods
200  // in C' section 15.2) assumes that the w data points are known exactly
201  // i.e. that v_ew[i]=0 for all i
202 
203  // 'Numerical Methods' notes that the task of fitting a straight
204  // line model with errors in both coordinates is "considerably harder"
205  // (section 15.3) - but clearly it could be done
206 
207  int i;
208  double s = 0;
209  double su = 0;
210  double sww = 0;
211  double sw = 0;
212  double suw = 0;
213 
214  int hitNum = vec.size();
215  for(i = 0; i < hitNum; ++i){
216 
217  ATH_MSG_DEBUG ( "Position in X: " << vec[i] );
218  ATH_MSG_DEBUG ( "Position in Z: " << vec_z[i] );
219  ATH_MSG_DEBUG ( "Error in X: " << vec_e[i] );
220 
221  s += 1 / (vec_e[i]*vec_e[i]);
222  su += vec[i] / (vec_e[i]*vec_e[i]);
223  sww += vec_z[i]*vec_z[i] / (vec_e[i]*vec_e[i]);
224  sw += vec_z[i] / (vec_e[i]*vec_e[i]);
225  suw += vec[i]*vec_z[i] / (vec_e[i]*vec_e[i]);
226  }
227 
228  const double denom = (s*sww-sw*sw);
229  if(denom == 0){
230  ATH_MSG_ERROR ( " Invalid denominator" );
231  return false;
232  }
233 
234  const double inv_denom = 1. / denom;
235  a1 = (su*sww - sw*suw) * inv_denom;
236  a2 = (s*suw - su*sw) * inv_denom;
237  ATH_MSG_DEBUG ( "Fit results:" << " intercept = " << a1 << " and slope = " << a2 );
238 
239  // Fill residual
240  residual.clear();
241  for (i = 0; i < hitNum; ++i) {
242  residual.push_back(vec[i] - a1 - a2*vec_z[i]);
243  }
244  // Fill Chi2
245  chi2 = 0;
246  for(i = 0; i < hitNum; ++i){
247  chi2 += (vec[i] - a1 - a2*vec_z[i])*(vec[i] - a1 - a2*vec_z[i])/(vec_e[i]*vec_e[i]);
248  }
249 
250  return true;
251 }
TBTrack::setChi2_v
void setChi2_v(double chi2v)
Definition: TBTrack.h:74
AthenaHitsVector.h
TBTrack::setVslope
void setVslope(double vslope)
Definition: TBTrack.h:77
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
LArTBH6BeamInfo::m_theEventInfo
SG::ReadHandle< TBEventInfo > m_theEventInfo
Definition: LArG4/LArG4H6SD/src/LArTBH6BeamInfo.h:54
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ClusterSeg::residual
@ residual
Definition: ClusterNtuple.h:20
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
LArTBH6BeamInfo::finalize
StatusCode finalize()
Definition: LArTBH6BeamInfo.cxx:182
LArTBH6BeamInfo::m_Primary
bool m_Primary
Definition: LArG4/LArG4H6SD/src/LArTBH6BeamInfo.h:48
TBTrack::setVintercept
void setVintercept(double vintercept)
Definition: TBTrack.h:79
skel.it
it
Definition: skel.GENtoEVGEN.py:423
LArTBH6BeamInfo::LArTBH6BeamInfo
LArTBH6BeamInfo(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArTBH6BeamInfo.cxx:16
LArTBH6BeamInfo::m_track
SG::WriteHandle< TBTrack > m_track
Definition: LArG4/LArG4H6SD/src/LArTBH6BeamInfo.h:55
TBTrack::setCryoHitv
void setCryoHitv(float cryov)
Definition: TBTrack.h:85
TBTrack::setCryoHitu
void setCryoHitu(float cryou)
Definition: TBTrack.h:84
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:12
TBTrack::setUslope
void setUslope(double uslope)
Definition: TBTrack.h:76
LArTBH6BeamInfo::fitVect
bool fitVect(const dVect &vec_x, const dVect &vec_xz, const dVect &vec_ex, double &a1, double &a2, double &chi2, dVect &residual)
Fit data to the function u = a1 + a2*w.
Definition: LArTBH6BeamInfo.cxx:189
LArTBH6BeamInfo::m_numEv
int m_numEv
Definition: LArG4/LArG4H6SD/src/LArTBH6BeamInfo.h:52
DataHandle.h
LArTBH6BeamInfo::dVect
std::vector< double > dVect
Definition: LArG4/LArG4H6SD/src/LArTBH6BeamInfo.h:38
LArTBH6BeamInfo::m_cryoX
float m_cryoX
Definition: LArG4/LArG4H6SD/src/LArTBH6BeamInfo.h:51
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TBTrack::setUintercept
void setUintercept(double uintercept)
Definition: TBTrack.h:78
lumiFormat.i
int i
Definition: lumiFormat.py:92
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:522
LArTBH6BeamInfo::m_HitsCollNames
std::vector< std::string > m_HitsCollNames
Definition: LArG4/LArG4H6SD/src/LArTBH6BeamInfo.h:47
LArG4H6FrontHitCollection.h
compute_lumi.denom
denom
Definition: compute_lumi.py:76
AthAlgorithm
Definition: AthAlgorithm.h:47
TBTrack::setCryoHitw
void setCryoHitw(float cryow)
Definition: TBTrack.h:86
TBTrack::setResidualv
void setResidualv(int ind, double residualv)
Definition: TBTrack.h:82
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
LArTBH6BeamInfo::m_pcode
int m_pcode
Definition: LArG4/LArG4H6SD/src/LArTBH6BeamInfo.h:49
LArNewCalib_Delay_OFC_Cali.check
check
Definition: LArNewCalib_Delay_OFC_Cali.py:208
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
TBTrack::setChi2_u
void setChi2_u(double chi2u)
Definition: TBTrack.h:73
LArTBH6BeamInfo::execute
StatusCode execute()
Definition: LArTBH6BeamInfo.cxx:59
LArTBH6BeamInfo::initialize
StatusCode initialize()
Definition: LArTBH6BeamInfo.cxx:42
LArG4H6FrontHit
Definition: LArG4H6FrontHit.h:23
TBTrack::setResidualu
void setResidualu(int ind, double residualu)
Definition: TBTrack.h:81
TBEventInfo::getCryoX
float getCryoX() const
Definition: TBEventInfo.h:70
AthenaHitsVector
Definition: AthenaHitsVector.h:39
LArTBH6BeamInfo::m_hitcoll
std::vector< SG::ReadHandle< AthenaHitsVector< LArG4H6FrontHit > > > m_hitcoll
Definition: LArG4/LArG4H6SD/src/LArTBH6BeamInfo.h:56
LArTBH6BeamInfo.h
LArTBH6BeamInfo::~LArTBH6BeamInfo
virtual ~LArTBH6BeamInfo()
Definition: LArTBH6BeamInfo.cxx:35