ATLAS Offline Software
Loading...
Searching...
No Matches
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
14namespace 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())
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())
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 ) {
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//___________________________________________________________________________
141StatusCode AlignAlg::start()
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
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//___________________________________________________________________________
181StatusCode AlignAlg::execute()
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
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
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
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//___________________________________________________________________________
343StatusCode AlignAlg::stop()
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}
#define endmsg
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
MsgStream & msg() const
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
virtual StatusCode finalize()
finalize method
Definition AlignAlg.cxx:415
StringProperty m_filename
Definition AlignAlg.h:109
std::ostream * m_logStream
logfile output stream
Definition AlignAlg.h:125
virtual StatusCode initialize()
initialize method
Definition AlignAlg.cxx:28
virtual StatusCode start()
set up geometry and prepare the tools
Definition AlignAlg.cxx:141
virtual StatusCode stop()
processes information accumulated in execute method to determine alignment parameters
Definition AlignAlg.cxx:343
BooleanProperty m_writeLogfile
Definition AlignAlg.h:121
StringProperty m_filepath
Definition AlignAlg.h:110
ToolHandle< ITrackCollectionProvider > m_trackCollectionProvider
Definition AlignAlg.h:70
StringProperty m_alignTracksName
Definition AlignAlg.h:134
int m_ntracksProc
number of tracks successfully processed
Definition AlignAlg.h:130
ToolHandle< IAlignTool > m_alignTool
Pointer to alignTool.
Definition AlignAlg.h:90
virtual ~AlignAlg()
destructor
Definition AlignAlg.cxx:17
int m_ntracksAccum
number of tracks successfully accumulated
Definition AlignAlg.h:132
int m_nevents
number of processed events
Definition AlignAlg.h:127
virtual StatusCode execute()
loops over tracks in event, and accumulates information necessary for alignmnet
Definition AlignAlg.cxx:181
int m_ntracksSel
number of selected tracks
Definition AlignAlg.h:129
BooleanProperty m_writeNtuple
Definition AlignAlg.h:114
int m_ntracks
number of processed tracks
Definition AlignAlg.h:128
StringProperty m_logfileName
Definition AlignAlg.h:123
ToolHandle< IAlignTrackPreProcessor > m_alignTrackPreProcessor
Pointer to AlignTrackPreProcessor, used to select hits on tracks and/or tracks before passing to Alig...
Definition AlignAlg.h:75
BooleanProperty m_solveOnly
Definition AlignAlg.h:112
PublicToolHandle< IGeometryManagerTool > m_geometryManagerTool
Pointer to GeometryManagerTool, used to get lists of chambers for which alignment parameters will be ...
Definition AlignAlg.h:95
ToolHandle< IAlignTrackDresser > m_alignTrackDresser
Pointer to alignTrackDresser, used to add residuals, derivatives, etc.
Definition AlignAlg.h:85
ToolHandle< IFillNtupleTool > m_fillNtupleTool
Pointer to FillNtupleTool, used to write track information to ntuple.
Definition AlignAlg.h:104
int m_ntracksDress
number of tracks successfully dressed
Definition AlignAlg.h:131
TFile * m_ntuple
output ntuple
Definition AlignAlg.h:120
ToolHandle< ITrkAlignDBTool > m_trkAlignDBTool
Pointer to TrkAlignDBTool, used for reading/writing alignment parameters from/to the database.
Definition AlignAlg.h:100
ToolHandle< IAlignTrackCreator > m_alignTrackCreator
Pointer to alignTrackCreator, used to convert Trk::Track to vector of AlignTrack.
Definition AlignAlg.h:80
IntegerProperty m_alignSolveLevel
Definition AlignAlg.h:117
const AlignVertex * getVtx() const
set and get pointer to the associated vertex
Definition AlignTrack.h:188
const Amg::SymMatrixX * weightMatrix() const
Weight matrix is W from Si alignment (see Eqn.
Definition AlignTrack.h:156
@ Refitted
normally refitted, without adding any pseudo-measurement
Definition AlignVertex.h:46
AlignVertexType type() const
get and set the refit type
Definition AlignVertex.h:85
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > SymMatrixX
Ensure that the ATLAS eigen extensions are properly loaded.