ATLAS Offline Software
Loading...
Searching...
No Matches
AlignAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 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(const EventContext& ctx)
182{
183 ATH_MSG_DEBUG("AlignAlg::execute()");
184
185
186 // increment number of events
187 m_nevents++;
188
189 if(m_solveOnly) {
190 if (m_nevents<=1)
191 return StatusCode::SUCCESS;
192 else {
193 // return FAILURE to make sure that the job ends after 1st event
194 msg(MSG::INFO)<<"Only doing the solving. Aborting event processing after first event."<<endmsg;
195 msg(MSG::INFO)<<"Following ERROR message is not a problem..."<<endmsg;
196 return StatusCode::FAILURE;
197 }
198 }
199
200
202 // 1. apply event selection, select hits, refit tracks
204 // m_trackSelector->cleanTracks();
205
206 // loop over tracks
207 TrackCollection * alignTracks;
208 const TrackCollection* originalTracks;
209
210 StatusCode sc = m_trackCollectionProvider->trackCollection(originalTracks);
211 if (!originalTracks || sc.isFailure()) return sc;
212
213 if(originalTracks->empty()) {
214 ATH_MSG_DEBUG("found no tracks");
215 return StatusCode::SUCCESS;
216 }
217
218 // increment number of processed tracks
219 m_ntracks += originalTracks->size();
220 ATH_MSG_DEBUG("nTracks: "<<m_ntracks);
221
222 // process track collection and create collection of AlignTracks
223 alignTracks = m_alignTrackPreProcessor->processTrackCollection(originalTracks);
224
225 // method returns zero or empty collection
226 if (!alignTracks || alignTracks->empty()) {
227 ATH_MSG_DEBUG("processTrackCollection() returned empty Track collection.");
228 return StatusCode::SUCCESS;
229 }
230
231 // increment number of selected tracks
232 m_ntracksSel += alignTracks->size();
233
234 // loop over AlignTracks and pass to AlignTrackCreator and Dresser for more processing
235 int itrk = 0;
236 for (Track* trk : *alignTracks) { // first loop over AlignTracks
237
238 ATH_MSG_DEBUG("1st loop: Processing track "<<itrk);
239
240 // each track in the collection HAS to be an AlignTrack
241 AlignTrack * alignTrack = dynamic_cast<AlignTrack*>(trk);
242 if(!alignTrack) {
243 msg(MSG::FATAL)<<"Track is not an AlignTrack. PreProcessor returns TrackCollection but"
244 <<"it has to be filled with AlignTracks. Otherwise the code doesn't work."<<endmsg;
245 return StatusCode::FAILURE;
246 }
247
248 // process AlignTrack
249 bool success = m_alignTrackCreator->processAlignTrack(alignTrack);
250 if (!success) {
251 ATH_MSG_DEBUG("processAlignTrack() returned FALSE, Skipping the track.");
252 continue;
253 }
254
256
257 // dress AlignTrack with extra info
258 success = m_alignTrackDresser->dressAlignTrack(alignTrack);
259 ATH_MSG_DEBUG("back from dressing AlignTrack");
260
261 if (!success) {
262 ATH_MSG_DEBUG("dressAlignTrack() returned FALSE, Skipping the track.");
263 continue;
264 }
265
267
268 // accumulate vertex fit information:
269 m_alignTrackPreProcessor->accumulateVTX(alignTrack);
270
271 ATH_MSG_DEBUG("back from accumulateVTX");
272
273 } // end of the first loop over AlignTracks
274
275
276 // solve existing vertices:
277 m_alignTrackPreProcessor->solveVTX();
278
279
280 for (Track* trk : *alignTracks) { // second loop over AlignTracks
281
282 ATH_MSG_DEBUG("2nd loop: Processing tracks");
283
284 // each track in the collection HAS to be an AlignTrack
285 AlignTrack * alignTrack = dynamic_cast<AlignTrack*>(trk);
286 if(!alignTrack) {
287 msg(MSG::FATAL)<<"Track is not an AlignTrack. PreProcessor returns TrackCollection but"
288 <<"it has to be filled with AlignTracks. Otherwise the code doesn't work."<<endmsg;
289 return StatusCode::FAILURE;
290 }
291
292
293 // check if the dressing was successful:
294 const Amg::SymMatrixX * ptrWeights = alignTrack->weightMatrix(); //Symmetric Matrix
295 if ( !ptrWeights ) {
296 ATH_MSG_DEBUG("dressAlignTrack failed, Skipping the track.");
297 continue;
298 }
299
300 // check if the eventual VTX solving was successful:
301 const AlignVertex * ptrVertex = alignTrack->getVtx();
302 if ( ptrVertex && (ptrVertex->type() < AlignVertex::Refitted) ) {
303 ATH_MSG_DEBUG("Vertex fit failed for this track. Skipping the track.");
304 continue;
305 }
306
307
308 // pass to AlignTool for processing of track information
309 bool success = m_alignTool->accumulate(alignTrack);
310 ATH_MSG_DEBUG("back from accumulate");
311
312 if (!success) {
313 ATH_MSG_DEBUG("accumulate() returned FALSE, Skipping the track.");
314 continue;
315 }
316
317 ATH_MSG_DEBUG("calling fillntuple::dumptrack");
318
320
321 if (m_writeNtuple)
322 m_fillNtupleTool->dumpTrack(ctx, itrk,alignTrack);
323 ATH_MSG_DEBUG("done with track "<<itrk);
324
325 } // end of the second loop over AlignTracks
326
327
328
329
330 // record the collection in the StoreGate
331 // the ownership is transferred to StoreGate so we don't delete the collection here
332 if(evtStore()->record(alignTracks,m_alignTracksName,false).isFailure()) {
333 ATH_MSG_ERROR("Unable to record "<<m_alignTracksName<<" in the StoreGate");
334 delete alignTracks;
335 alignTracks = nullptr;
336 }
337 if (alignTracks) ATH_MSG_DEBUG("Recorded \'"<<m_alignTracksName<<"\' with size "<<alignTracks->size()<<" to StoreGate");
338
339 ATH_MSG_DEBUG("returning SUCCESS");
340 return StatusCode::SUCCESS;
341}
342
343//___________________________________________________________________________
344StatusCode AlignAlg::stop()
345{
346 ATH_MSG_INFO("AlignAlg::stop()");
347
348 if(m_logStream && !m_solveOnly) {
349 *m_logStream<<"*************************************************************"<<std::endl;
350 *m_logStream<<"****** Alignment Job summary ******"<<std::endl;
351 *m_logStream<<"*************************************************************"<<std::endl;
352 *m_logStream<<"*"<<std::endl;
353 *m_logStream<<"* number of processed events: "<<m_nevents<<std::endl;
354 *m_logStream<<"* number of processed tracks: "<<m_ntracks<<std::endl;
355 *m_logStream<<"* number of selected tracks: "<<m_ntracksSel<<std::endl;
356 *m_logStream<<"* number of tracks processed: "<<m_ntracksProc<<std::endl;
357 *m_logStream<<"* number of tracks dressed: "<<m_ntracksDress<<std::endl;
358 *m_logStream<<"* number of tracks accumulated: "<<m_ntracksAccum<<std::endl;
359
360 *m_logStream<<"*"<<std::endl;
361
362 m_alignTrackPreProcessor->printSummary();
363 m_trackCollectionProvider->printSummary();
364 }
365
366 // fill ntuple for all tools
367 if (m_writeNtuple) {
368 ATH_MSG_INFO("calling alignTool->fillNtuple()");
369 if(m_alignTool->fillNtuple().isFailure()) {
370 msg(MSG::ERROR)<<"problem with alignTool fillNtuple()!"<<endmsg;
371 return StatusCode::FAILURE;
372 }
373 ATH_MSG_INFO("calling fillNtupleTool->fillNtuple()");
374 if(m_fillNtupleTool->fillNtuple().isFailure()) {
375 msg(MSG::ERROR)<<"problem with fillNtupleTool fillNtuple()!"<<endmsg;
376 return StatusCode::FAILURE;
377 }
378
379 ATH_MSG_INFO("calling alignTrackPreProcessor->fillNtuple()");
380 if(m_alignTrackPreProcessor->fillNtuple().isFailure()) {
381 msg(MSG::ERROR)<<"problem with alignTrackPreProcessor fillNtuple()!"<<endmsg;
382 return StatusCode::FAILURE;
383 }
384
385 ATH_MSG_INFO("calling trackCollectionProvider->fillNtuple()");
386 if(m_trackCollectionProvider->fillNtuple().isFailure()) {
387 msg(MSG::ERROR)<<"problem with trackCollectionProvider fillNtuple()!"<<endmsg;
388 return StatusCode::FAILURE;
389 }
390 }
391
392 if(!m_solveOnly && m_ntracksSel==0) {
393 msg(MSG::WARNING)<<"No tracks passed track selection. No solving."<<endmsg;
394 return StatusCode::SUCCESS;
395 }
396
397 ATH_MSG_INFO("calling trkAlignDBTool->preSolve()");
398 if (m_trkAlignDBTool->preSolve().isFailure()) {
399 msg(MSG::FATAL)<<"failure in ITrkAlignDBTool->preSolve()"<<endmsg;
400 return StatusCode::FAILURE;
401 }
402
403 ATH_MSG_INFO("calling alignTool->solve()");
404 if (m_alignTool->solve().isFailure()) {
405 msg(MSG::FATAL)<<"failure in IAlignTool->solve()"<<endmsg;
406 return StatusCode::FAILURE;
407 }
408
409 ATH_MSG_INFO("calling trkAlignDBTool->writeAlignPar()");
410 m_trkAlignDBTool->writeAlignPar();
411
412 return StatusCode::SUCCESS;
413}
414
415//___________________________________________________________________________
417{
418 ATH_MSG_INFO("AlignAlg::finalize()");
419
420 // close the logfile
421 if(m_writeLogfile) {
422 if(std::ofstream * ofs = dynamic_cast<std::ofstream *>(m_logStream)) {
423 if(ofs->is_open()) {
424 *ofs<<std::flush;
425 ofs->close();
426 }
427 delete m_logStream;
428 }
429 }
430
431 if (m_writeNtuple) {
432 ATH_MSG_INFO("closing "<<m_ntuple->GetName());
433 m_ntuple->Close();
434 }
435
436 return StatusCode::SUCCESS;
437}
438
439
440}
#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.
ServiceHandle< StoreGateSvc > & evtStore()
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:416
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:344
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
virtual StatusCode execute(const EventContext &ctx)
loops over tracks in event, and accumulates information necessary for alignmnet
Definition AlignAlg.cxx:181
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
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.