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