ATLAS Offline Software
AlignAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
8 
11 
12 #include "TFile.h"
13 
14 namespace Trk {
15 
16 //___________________________________________________________________________
18 {
19 
20  if (m_ntuple && m_solveOnly) {
21  ATH_MSG_DEBUG("closing file");
22  m_ntuple->Close();
23  ATH_MSG_DEBUG("file closed");
24  }
25 }
26 
27 //___________________________________________________________________________
29 {
30  ATH_MSG_INFO("AlignAlg::initialize()");
31 
32  // Get GeometryManagerTool
33  if ( m_geometryManagerTool.retrieve().isFailure() ) {
34  msg(MSG::FATAL)<<"Failed to retrieve tool " << m_geometryManagerTool
35  << endmsg;
36  return StatusCode::FAILURE;
37  }
38  else
39  ATH_MSG_INFO("Retrieved tool " << m_geometryManagerTool);
40 
41  // some tools are not needed if only solving is done
42  if ( !m_solveOnly ) {
43 
44  // get TrackCollectionProvider
45  if (m_trackCollectionProvider.retrieve().isSuccess())
46  ATH_MSG_INFO("Retrieved " << m_trackCollectionProvider);
47  else{
48  msg(MSG::FATAL) << "Could not get " << m_trackCollectionProvider << endmsg;
49  return StatusCode::FAILURE;
50  }
51 
52  // get AlignTrackPreProcessor
53  if (m_alignTrackPreProcessor.retrieve().isSuccess())
54  ATH_MSG_INFO("Retrieved " << m_alignTrackPreProcessor);
55  else{
56  msg(MSG::FATAL) << "Could not get " << m_alignTrackPreProcessor << endmsg;
57  return StatusCode::FAILURE;
58  }
59 
60  // Get AlignTrackCreator tool
61  if ( m_alignTrackCreator.retrieve().isFailure() ) {
62  msg(MSG::FATAL)<<"Failed to retrieve tool "<<m_alignTrackCreator<<endmsg;
63  return StatusCode::FAILURE;
64  }
65  else
66  ATH_MSG_INFO("Retrieved tool "<<m_alignTrackCreator);
67 
68  // Get AlignTrackDresser tool
69  if ( m_alignTrackDresser.retrieve().isFailure() ) {
70  msg(MSG::FATAL)<<"Failed to retrieve tool "<<m_alignTrackDresser<<endmsg;
71  return StatusCode::FAILURE;
72  }
73  else
74  ATH_MSG_INFO("Retrieved tool "<<m_alignTrackDresser);
75 
76  // Get TrkAlign::FillTrack
77  if (m_writeNtuple) {
78  if ( m_fillNtupleTool.retrieve().isFailure() ) {
79  msg(MSG::FATAL)<<"Failed to retrieve tool "<<m_fillNtupleTool<<endmsg;
80  return StatusCode::FAILURE;
81  }
82  else
83  ATH_MSG_INFO("Retrieved tool "<<m_fillNtupleTool);
84  }
85  }
86 
87  // Get AlignTool tool
88  if ( m_alignTool.retrieve().isFailure() ) {
89  msg(MSG::FATAL)<<"Failed to retrieve tool "<<m_alignTool<<endmsg;
90  return StatusCode::FAILURE;
91  }
92  else
93  ATH_MSG_INFO("Retrieved tool "<<m_alignTool);
94 
95  // Get TrkAlignDataBaseTool
96  if ( m_trkAlignDBTool.retrieve().isFailure() ) {
97  msg(MSG::FATAL)<<"Failed to retrieve tool "<<m_trkAlignDBTool<<endmsg;
98  return StatusCode::FAILURE;
99  }
100  else
101  ATH_MSG_INFO("Retrieved tool "<<m_trkAlignDBTool);
102 
103  // Alignment Level
104  // Number of layers in the superstructures
106  msg(MSG::FATAL)<<"AlignSolveLevel could be 1, 2 or 3"<<endmsg;
107  return StatusCode::FAILURE;
108  }
109 
110  // open logfile
111  if(m_writeLogfile) {
112  std::ostream * out = &std::cout;
113  std::ofstream * ofile = new std::ofstream(m_logfileName.value().c_str());
114  if(!ofile->is_open()) {
115  msg(MSG::ERROR)<<"Couldn't open logfile. Writing to standard output."<<endmsg;
116  delete ofile;
117  }
118  else
119  out = ofile;
120 
121  m_logStream = out;
122 
123  // set logStream in the tools
124  m_geometryManagerTool->setLogStream(m_logStream);
125  m_alignTool->setLogStream(m_logStream);
126  m_trkAlignDBTool->setLogStream(m_logStream);
127  if( !m_solveOnly ) {
128  m_trackCollectionProvider->setLogStream(m_logStream);
129  m_alignTrackPreProcessor->setLogStream(m_logStream);
130  m_alignTrackCreator->setLogStream(m_logStream);
131  m_alignTrackDresser->setLogStream(m_logStream);
132  if (m_writeNtuple)
133  m_fillNtupleTool->setLogStream(m_logStream);
134  }
135  }
136 
137  return StatusCode::SUCCESS;
138 }
139 
140 //___________________________________________________________________________
142 {
143  ATH_MSG_DEBUG("AlignAlg::start()");
144 
145  if (m_writeNtuple) {
146  m_ntuple = new TFile((m_filepath.value()+m_filename.value()).c_str(),"RECREATE");
147  // set the ntuple points of the tools
148  m_geometryManagerTool->setNtuple(m_ntuple);
151  m_alignTool->setNtuple(m_ntuple);
152  m_trkAlignDBTool->setNtuple(m_ntuple);
153  m_fillNtupleTool->setNtuple(m_ntuple);
154  }
155 
156  ATH_MSG_DEBUG("reading geometry");
157  int NDoF = m_geometryManagerTool->ReadGeometry(m_alignSolveLevel);
158  ATH_MSG_DEBUG("read geometry, "<<NDoF<<" alignment parameters");
159 
160  m_geometryManagerTool->PrintModPositions();
161 
162  // fix pathname (used to be m_pathbin+m+prefixName)
163  // m_geometryManagerTool->StoreModPositions(pathname);
164 
165  StatusCode sc = m_alignTool->firstEventInitialize();
166 
167  if (sc != StatusCode::SUCCESS) {
168  msg(MSG::FATAL)<<"problem with alignTool->firstEventInitialize()"<<endmsg;
169  return StatusCode::FAILURE;
170  }
171 
172  if(m_solveOnly) {
173  ATH_MSG_DEBUG("getting data from files");
174  m_alignTool->accumulateFromFiles();
175  }
176 
177  return StatusCode::SUCCESS;
178 }
179 
180 //___________________________________________________________________________
182 {
183  ATH_MSG_DEBUG("AlignAlg::execute()");
184 
185  // increment number of events
186  m_nevents++;
187 
188  if(m_solveOnly) {
189  if (m_nevents<=1)
190  return StatusCode::SUCCESS;
191  else {
192  // return FAILURE to make sure that the job ends after 1st event
193  msg(MSG::INFO)<<"Only doing the solving. Aborting event processing after first event."<<endmsg;
194  msg(MSG::INFO)<<"Following ERROR message is not a problem..."<<endmsg;
195  return StatusCode::FAILURE;
196  }
197  }
198 
199 
201  // 1. apply event selection, select hits, refit tracks
203  // m_trackSelector->cleanTracks();
204 
205  // loop over tracks
206  TrackCollection * alignTracks;
207  const TrackCollection* originalTracks;
208 
209  StatusCode sc = m_trackCollectionProvider->trackCollection(originalTracks);
210  if (!originalTracks || sc.isFailure()) return sc;
211 
212  if(originalTracks->empty()) {
213  ATH_MSG_DEBUG("found no tracks");
214  return StatusCode::SUCCESS;
215  }
216 
217  // increment number of processed tracks
218  m_ntracks += originalTracks->size();
219  ATH_MSG_DEBUG("nTracks: "<<m_ntracks);
220 
221  // process track collection and create collection of AlignTracks
222  alignTracks = m_alignTrackPreProcessor->processTrackCollection(originalTracks);
223 
224  // method returns zero or empty collection
225  if (!alignTracks || alignTracks->empty()) {
226  ATH_MSG_DEBUG("processTrackCollection() returned empty Track collection.");
227  return StatusCode::SUCCESS;
228  }
229 
230  // increment number of selected tracks
231  m_ntracksSel += alignTracks->size();
232 
233  // loop over AlignTracks and pass to AlignTrackCreator and Dresser for more processing
234  int itrk = 0;
235  for (Track* trk : *alignTracks) { // first loop over AlignTracks
236 
237  ATH_MSG_DEBUG("1st loop: Processing track "<<itrk);
238 
239  // each track in the collection HAS to be an AlignTrack
240  AlignTrack * alignTrack = dynamic_cast<AlignTrack*>(trk);
241  if(!alignTrack) {
242  msg(MSG::FATAL)<<"Track is not an AlignTrack. PreProcessor returns TrackCollection but"
243  <<"it has to be filled with AlignTracks. Otherwise the code doesn't work."<<endmsg;
244  return StatusCode::FAILURE;
245  }
246 
247  // process AlignTrack
248  bool success = m_alignTrackCreator->processAlignTrack(alignTrack);
249  if (!success) {
250  ATH_MSG_DEBUG("processAlignTrack() returned FALSE, Skipping the track.");
251  continue;
252  }
253 
254  m_ntracksProc++;
255 
256  // dress AlignTrack with extra info
257  success = m_alignTrackDresser->dressAlignTrack(alignTrack);
258  ATH_MSG_DEBUG("back from dressing AlignTrack");
259 
260  if (!success) {
261  ATH_MSG_DEBUG("dressAlignTrack() returned FALSE, Skipping the track.");
262  continue;
263  }
264 
265  m_ntracksDress++;
266 
267  // accumulate vertex fit information:
268  m_alignTrackPreProcessor->accumulateVTX(alignTrack);
269 
270  ATH_MSG_DEBUG("back from accumulateVTX");
271 
272  } // end of the first loop over AlignTracks
273 
274 
275  // solve existing vertices:
276  m_alignTrackPreProcessor->solveVTX();
277 
278 
279  for (Track* trk : *alignTracks) { // second loop over AlignTracks
280 
281  ATH_MSG_DEBUG("2nd loop: Processing tracks");
282 
283  // each track in the collection HAS to be an AlignTrack
284  AlignTrack * alignTrack = dynamic_cast<AlignTrack*>(trk);
285  if(!alignTrack) {
286  msg(MSG::FATAL)<<"Track is not an AlignTrack. PreProcessor returns TrackCollection but"
287  <<"it has to be filled with AlignTracks. Otherwise the code doesn't work."<<endmsg;
288  return StatusCode::FAILURE;
289  }
290 
291 
292  // check if the dressing was successful:
293  const Amg::SymMatrixX * ptrWeights = alignTrack->weightMatrix(); //Symmetric Matrix
294  if ( !ptrWeights ) {
295  ATH_MSG_DEBUG("dressAlignTrack failed, Skipping the track.");
296  continue;
297  }
298 
299  // check if the eventual VTX solving was successful:
300  const AlignVertex * ptrVertex = alignTrack->getVtx();
301  if ( ptrVertex && (ptrVertex->type() < AlignVertex::Refitted) ) {
302  ATH_MSG_DEBUG("Vertex fit failed for this track. Skipping the track.");
303  continue;
304  }
305 
306 
307  // pass to AlignTool for processing of track information
308  bool success = m_alignTool->accumulate(alignTrack);
309  ATH_MSG_DEBUG("back from accumulate");
310 
311  if (!success) {
312  ATH_MSG_DEBUG("accumulate() returned FALSE, Skipping the track.");
313  continue;
314  }
315 
316  ATH_MSG_DEBUG("calling fillntuple::dumptrack");
317 
318  m_ntracksAccum++;
319 
320  if (m_writeNtuple)
321  m_fillNtupleTool->dumpTrack(itrk,alignTrack);
322  ATH_MSG_DEBUG("done with track "<<itrk);
323 
324  } // end of the second loop over AlignTracks
325 
326 
327 
328 
329  // record the collection in the StoreGate
330  // the ownership is transferred to StoreGate so we don't delete the collection here
331  if(evtStore()->record(alignTracks,m_alignTracksName,false).isFailure()) {
332  ATH_MSG_ERROR("Unable to record "<<m_alignTracksName<<" in the StoreGate");
333  delete alignTracks;
334  alignTracks = nullptr;
335  }
336  if (alignTracks) ATH_MSG_DEBUG("Recorded \'"<<m_alignTracksName<<"\' with size "<<alignTracks->size()<<" to StoreGate");
337 
338  ATH_MSG_DEBUG("returning SUCCESS");
339  return StatusCode::SUCCESS;
340 }
341 
342 //___________________________________________________________________________
344 {
345  ATH_MSG_INFO("AlignAlg::stop()");
346 
347  if(m_logStream && !m_solveOnly) {
348  *m_logStream<<"*************************************************************"<<std::endl;
349  *m_logStream<<"****** Alignment Job summary ******"<<std::endl;
350  *m_logStream<<"*************************************************************"<<std::endl;
351  *m_logStream<<"*"<<std::endl;
352  *m_logStream<<"* number of processed events: "<<m_nevents<<std::endl;
353  *m_logStream<<"* number of processed tracks: "<<m_ntracks<<std::endl;
354  *m_logStream<<"* number of selected tracks: "<<m_ntracksSel<<std::endl;
355  *m_logStream<<"* number of tracks processed: "<<m_ntracksProc<<std::endl;
356  *m_logStream<<"* number of tracks dressed: "<<m_ntracksDress<<std::endl;
357  *m_logStream<<"* number of tracks accumulated: "<<m_ntracksAccum<<std::endl;
358 
359  *m_logStream<<"*"<<std::endl;
360 
361  m_alignTrackPreProcessor->printSummary();
362  m_trackCollectionProvider->printSummary();
363  }
364 
365  // fill ntuple for all tools
366  if (m_writeNtuple) {
367  ATH_MSG_INFO("calling alignTool->fillNtuple()");
368  if(m_alignTool->fillNtuple().isFailure()) {
369  msg(MSG::ERROR)<<"problem with alignTool fillNtuple()!"<<endmsg;
370  return StatusCode::FAILURE;
371  }
372  ATH_MSG_INFO("calling fillNtupleTool->fillNtuple()");
373  if(m_fillNtupleTool->fillNtuple().isFailure()) {
374  msg(MSG::ERROR)<<"problem with fillNtupleTool fillNtuple()!"<<endmsg;
375  return StatusCode::FAILURE;
376  }
377 
378  ATH_MSG_INFO("calling alignTrackPreProcessor->fillNtuple()");
379  if(m_alignTrackPreProcessor->fillNtuple().isFailure()) {
380  msg(MSG::ERROR)<<"problem with alignTrackPreProcessor fillNtuple()!"<<endmsg;
381  return StatusCode::FAILURE;
382  }
383 
384  ATH_MSG_INFO("calling trackCollectionProvider->fillNtuple()");
385  if(m_trackCollectionProvider->fillNtuple().isFailure()) {
386  msg(MSG::ERROR)<<"problem with trackCollectionProvider fillNtuple()!"<<endmsg;
387  return StatusCode::FAILURE;
388  }
389  }
390 
391  if(!m_solveOnly && m_ntracksSel==0) {
392  msg(MSG::WARNING)<<"No tracks passed track selection. No solving."<<endmsg;
393  return StatusCode::SUCCESS;
394  }
395 
396  ATH_MSG_INFO("calling trkAlignDBTool->preSolve()");
397  if (m_trkAlignDBTool->preSolve().isFailure()) {
398  msg(MSG::FATAL)<<"failure in ITrkAlignDBTool->preSolve()"<<endmsg;
399  return StatusCode::FAILURE;
400  }
401 
402  ATH_MSG_INFO("calling alignTool->solve()");
403  if (m_alignTool->solve().isFailure()) {
404  msg(MSG::FATAL)<<"failure in IAlignTool->solve()"<<endmsg;
405  return StatusCode::FAILURE;
406  }
407 
408  ATH_MSG_INFO("calling trkAlignDBTool->writeAlignPar()");
409  m_trkAlignDBTool->writeAlignPar();
410 
411  return StatusCode::SUCCESS;
412 }
413 
414 //___________________________________________________________________________
416 {
417  ATH_MSG_INFO("AlignAlg::finalize()");
418 
419  // close the logfile
420  if(m_writeLogfile) {
421  if(std::ofstream * ofs = dynamic_cast<std::ofstream *>(m_logStream)) {
422  if(ofs->is_open()) {
423  *ofs<<std::flush;
424  ofs->close();
425  }
426  delete m_logStream;
427  }
428  }
429 
430  if (m_writeNtuple) {
431  ATH_MSG_INFO("closing "<<m_ntuple->GetName());
432  m_ntuple->Close();
433  }
434 
435  return StatusCode::SUCCESS;
436 }
437 
438 
439 }
Trk::AlignVertex
Definition: AlignVertex.h:39
Trk::AlignAlg::m_ntracksSel
int m_ntracksSel
number of selected tracks
Definition: AlignAlg.h:129
Trk::AlignAlg::m_geometryManagerTool
PublicToolHandle< IGeometryManagerTool > m_geometryManagerTool
Pointer to GeometryManagerTool, used to get lists of chambers for which alignment parameters will be ...
Definition: AlignAlg.h:95
Trk::AlignAlg::m_ntracksProc
int m_ntracksProc
number of tracks successfully processed
Definition: AlignAlg.h:130
Trk::AlignAlg::m_writeNtuple
BooleanProperty m_writeNtuple
Definition: AlignAlg.h:114
Trk::AlignAlg::m_fillNtupleTool
ToolHandle< IFillNtupleTool > m_fillNtupleTool
Pointer to FillNtupleTool, used to write track information to ntuple.
Definition: AlignAlg.h:104
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:18
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
FullCPAlgorithmsTest_eljob.flush
flush
Definition: FullCPAlgorithmsTest_eljob.py:194
Trk::AlignAlg::m_filepath
StringProperty m_filepath
Definition: AlignAlg.h:110
Trk::AlignAlg::finalize
virtual StatusCode finalize()
finalize method
Definition: AlignAlg.cxx:415
Trk::AlignAlg::m_ntracksDress
int m_ntracksDress
number of tracks successfully dressed
Definition: AlignAlg.h:131
Trk::AlignAlg::start
virtual StatusCode start()
set up geometry and prepare the tools
Definition: AlignAlg.cxx:141
validation.ofile
ofile
Definition: validation.py:96
Trk::AlignAlg::initialize
virtual StatusCode initialize()
initialize method
Definition: AlignAlg.cxx:28
Trk::AlignAlg::stop
virtual StatusCode stop()
processes information accumulated in execute method to determine alignment parameters
Definition: AlignAlg.cxx:343
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:70
Trk::AlignAlg::m_alignTrackCreator
ToolHandle< IAlignTrackCreator > m_alignTrackCreator
Pointer to alignTrackCreator, used to convert Trk::Track to vector of AlignTrack.
Definition: AlignAlg.h:80
Trk::AlignAlg::m_ntracksAccum
int m_ntracksAccum
number of tracks successfully accumulated
Definition: AlignAlg.h:132
Trk::AlignAlg::m_ntuple
TFile * m_ntuple
output ntuple
Definition: AlignAlg.h:120
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
AlignAlg.h
Trk::AlignAlg::m_trackCollectionProvider
ToolHandle< ITrackCollectionProvider > m_trackCollectionProvider
Definition: AlignAlg.h:70
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
AlignVertex.h
AlignTrack.h
Trk::AlignAlg::m_solveOnly
BooleanProperty m_solveOnly
Definition: AlignAlg.h:112
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
Trk::AlignAlg::m_trkAlignDBTool
ToolHandle< ITrkAlignDBTool > m_trkAlignDBTool
Pointer to TrkAlignDBTool, used for reading/writing alignment parameters from/to the database.
Definition: AlignAlg.h:100
Trk::AlignAlg::m_logStream
std::ostream * m_logStream
logfile output stream
Definition: AlignAlg.h:125
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
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
TrackCollection.h
Trk::AlignTrack::getVtx
const AlignVertex * getVtx() const
set and get pointer to the associated vertex
Definition: AlignTrack.h:188
Trk::AlignAlg::m_alignTrackDresser
ToolHandle< IAlignTrackDresser > m_alignTrackDresser
Pointer to alignTrackDresser, used to add residuals, derivatives, etc.
Definition: AlignAlg.h:85
DataVector< Trk::Track >
Trk::AlignAlg::m_ntracks
int m_ntracks
number of processed tracks
Definition: AlignAlg.h:128
Trk::AlignTrack::weightMatrix
const Amg::SymMatrixX * weightMatrix() const
Weight matrix is W from Si alignment (see Eqn.
Definition: AlignTrack.h:156
Trk::AlignAlg::m_writeLogfile
BooleanProperty m_writeLogfile
Definition: AlignAlg.h:121
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
Trk::AlignAlg::~AlignAlg
virtual ~AlignAlg()
destructor
Definition: AlignAlg.cxx:17
Trk::AlignAlg::execute
virtual StatusCode execute()
loops over tracks in event, and accumulates information necessary for alignmnet
Definition: AlignAlg.cxx:181
Trk::AlignAlg::m_alignSolveLevel
IntegerProperty m_alignSolveLevel
Definition: AlignAlg.h:117
Trk::AlignAlg::m_alignTool
ToolHandle< IAlignTool > m_alignTool
Pointer to alignTool.
Definition: AlignAlg.h:90
Trk::AlignTrack
Definition: AlignTrack.h:41
Trk::AlignAlg::m_alignTrackPreProcessor
ToolHandle< IAlignTrackPreProcessor > m_alignTrackPreProcessor
Pointer to AlignTrackPreProcessor, used to select hits on tracks and/or tracks before passing to Alig...
Definition: AlignAlg.h:75
Trk::AlignAlg::m_alignTracksName
StringProperty m_alignTracksName
Definition: AlignAlg.h:134
python.Constants.INFO
int INFO
Definition: Control/AthenaCommon/python/Constants.py:15
Trk::AlignAlg::m_logfileName
StringProperty m_logfileName
Definition: AlignAlg.h:123
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
Track
Definition: TriggerChamberClusterOnTrackCreator.h:21
Trk::AlignVertex::Refitted
@ Refitted
normally refitted, without adding any pseudo-measurement
Definition: AlignVertex.h:46
Trk::AlignAlg::m_nevents
int m_nevents
number of processed events
Definition: AlignAlg.h:127
Trk::AlignVertex::type
AlignVertexType type() const
get and set the refit type
Definition: AlignVertex.h:85
Trk::AlignAlg::m_filename
StringProperty m_filename
Definition: AlignAlg.h:109
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
Amg::SymMatrixX
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > SymMatrixX
Definition: EventPrimitives.h:28