ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
AlignTrackCreator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
6 #include "GaudiKernel/MsgStream.h"
7 
10 
12 
14 #include "TrkTrack/Track.h"
19 
24 
28 
29 #include <fstream>
30 
31 namespace Trk {
32 
33  //________________________________________________________________________
34  AlignTrackCreator::AlignTrackCreator(const std::string& type, const std::string& name,
35  const IInterface* parent)
38  , m_residualCalculator("Trk::AlignResidualCalculator/ResidualCalculator")
39  , m_idHelper{}
40  , m_measTypeIdHelper{}
41  {
42  declareInterface<IAlignTrackCreator>(this);
43 
44  declareProperty("ResidualCalculator", m_residualCalculator);
45  declareProperty("AlignModuleTool", m_alignModuleTool);
46 
47  declareProperty("EventList", m_eventListName = "goodEvents.txt");
48  declareProperty("WriteEventList", m_writeEventList = false );
49  declareProperty("RequireOverlap", m_requireOverlap = false);
50  declareProperty("RemoveATSOSNotInAlignModule", m_removeATSOSNotInAlignModule=true);
51  declareProperty("IncludeScatterers", m_includeScatterers = true );
52 
53  m_logStream = nullptr;
54  }
55 
56  //________________________________________________________________________
58  {
59  ATH_MSG_DEBUG("in AlignTrackCreator d'tor");
60  }
61 
62  //________________________________________________________________________
64  {
65  // Set up ATLAS ID helper
66  if (detStore()->retrieve(m_idHelper, "AtlasID").isFailure()) {
67  ATH_MSG_ERROR ("Could not get AtlasDetectorID helper" );
68  return StatusCode::FAILURE;
69  }
71 
72  if (m_residualCalculator.retrieve().isFailure()) {
73  msg(MSG::FATAL) << "Could not get " << m_residualCalculator << endmsg;
74  return StatusCode::FAILURE;
75  }
76  ATH_MSG_INFO("Retrieved " << m_residualCalculator);
77 
78  // get AlignModuleTool
79  if (m_alignModuleTool.retrieve().isFailure()) {
80  msg(MSG::FATAL) << "Could not get " << m_alignModuleTool << endmsg;
81  return StatusCode::FAILURE;
82  }
83  ATH_MSG_INFO("Retrieved " << m_alignModuleTool);
84 
85  ATH_MSG_INFO("initialize() successful in " << name());
86 
87  return StatusCode::SUCCESS;
88  }
89 
90  //________________________________________________________________________
92  {
93  ATH_MSG_DEBUG("finalize() in AlignTrackCreator");
94 
95  // write run/evt to ASCII file
96  if (m_writeEventList) {
97  std::ofstream output(m_eventListName.c_str());
98  for (std::vector<std::pair<int,int> >::iterator it=
99  m_goodEventList.begin(); it!=m_goodEventList.end(); ++it) {
100  int run=(*it).first;
101  int evt=(*it).second;
102  output << run << " " << evt << std::endl;
103  }
104 
105  // if no events, output dummy run and event number so file isn't empty
106  if (m_goodEventList.empty()) output<<"0 0"<<std::endl;
107  output.close();
108  }
109 
110  delete m_measTypeIdHelper;
111 
112  return StatusCode::SUCCESS;
113  }
114 
115  //________________________________________________________________________
117  {
118  DataVector<AlignTSOS>* alignTSOSCollection=new DataVector<AlignTSOS>;
119 
120  bool goodtrack = false;
121  int ntsos(0);
122  double chi2(0.);
123 
124  AlignModule * lastModule(nullptr);
125  bool overlapTrack(false);
126 
127  ATH_MSG_DEBUG("nDoF: "<<at->fitQuality()->numberDoF()<<", tsos size: "<<at->trackStateOnSurfaces()->size());
128 
129  for (const TrackStateOnSurface* tsos : *at->trackStateOnSurfaces()) {
130 
131  AlignTSOS * atsos(nullptr);
132  AlignModule * module(nullptr);
133 
134  if (tsos->type(TrackStateOnSurface::Outlier) ||
135  tsos->type(TrackStateOnSurface::Perigee) ||
136  tsos->type(TrackStateOnSurface::Hole))
137  continue;
138  else if (tsos->type(TrackStateOnSurface::Measurement)) {
139 
140  ATH_MSG_DEBUG("checking ntsos: "<<ntsos);
141 
142  const MeasurementBase * mesb = tsos->measurementOnTrack();
143  const TrackParameters * tparp = tsos->trackParameters();
144  const RIO_OnTrack * rio = dynamic_cast<const RIO_OnTrack *>(mesb);
145  const CompetingRIOsOnTrack * crio = dynamic_cast<const CompetingRIOsOnTrack *>(mesb);
146 
147  if (!rio && crio) rio=&crio->rioOnTrack(0);
148 
149  if (rio && tparp) {
150 
151  //AlignModule::DetectorType detType=AlignModule::NDetectorTypes;
152  //if (measType!=TrackState::unidentified && measType<=TrackState::TGC)
153  //detType=(AlignModule::DetectorType)(measType-1);
154 
155  //get detector type
156  AlignModule::DetectorType detType = m_alignModuleTool->getDetectorType(rio->detectorElement());
157  ATH_MSG_DEBUG("detType: "<<detType);
158 
159  // see if track is good track
160  if (detType!=AlignModule::NDetectorTypes) {
161  ATH_MSG_DEBUG("calling findAlignModule");
162  module=m_alignModuleTool->findAlignModule(rio,detType);
163  }
164  if (module) {
165  ATH_MSG_DEBUG("found module");
166  goodtrack=true;
167  if (lastModule && module!=lastModule) {
168  overlapTrack=true;
169  ATH_MSG_DEBUG("have overlap track");
170  }
171  else
172  lastModule=module;
173  }
174  ATH_MSG_DEBUG("module not found");
175 
176  // see what kind of TSOS
178 
179  // create AlignTSOS using CompetingRIOsOnTrack or RIO_OnTrack
180  if (crio)
181  atsos = new AlignTSOS(*tsos,module,crio,measType);
182  else
183  atsos = new AlignTSOS(*tsos,module,rio,measType);
184 
185  if (module)
186  ATH_MSG_DEBUG("module id "<<module->identify());
187  else
188  ATH_MSG_VERBOSE("no module");
189 
190  atsos->setValid(true);
191  }
192  }
193 
194  // scatterer with no associated measurement
195  else if (tsos->type(TrackStateOnSurface::Scatterer) && m_includeScatterers) {
196  atsos=new AlignTSOS(*tsos,TrackState::unidentified);
197  atsos->setValid(true);
198  }
199 
200  if (!atsos) {
201  continue;
202  }
203 
205  delete atsos;
206  continue;
207  }
208 
209  // set detector specific properties (if needed)
210  m_alignModuleTool->setMeasurementProperties(atsos);
211 
212  alignTSOSCollection->push_back(atsos);
213  }
214 
215  ATH_MSG_DEBUG("goodtrack="<<goodtrack<<", alignTSOSCollection size: "<<alignTSOSCollection->size());
216 
217  if (goodtrack && (!m_requireOverlap||overlapTrack)) {
218 
219  // store run/evt number in vector
220  if (m_writeEventList) {
221  const xAOD::EventInfo * eventInfo;
222  StatusCode sc=evtStore()->retrieve(eventInfo);
223  if (sc.isFailure())
224  ATH_MSG_ERROR("Couldn't retrieve event info");
225 
226  int run=eventInfo->runNumber();
227  int evt=eventInfo->eventNumber();
228  m_goodEventList.emplace_back(run,evt);
229  }
230 
231  // set residuals on ATSOS and get local chi2
232  ATH_MSG_DEBUG("calling setResiduals");
233  chi2=m_residualCalculator->setResiduals(alignTSOSCollection);
234  ATH_MSG_DEBUG("done with setResiduals");
235 
236  // check that chi2 from fitter matches local chi2
237  if (std::fabs(chi2-at->fitQuality()->chiSquared())>.01) {
238  ATH_MSG_DEBUG("local chi2: "<<chi2<<", from fit: "<<at->fitQuality()->chiSquared());
239  }
240 
241  ATH_MSG_DEBUG("setting alignTrack");
242  at->setAlignTSOSCollection(alignTSOSCollection);
243  at->setChi2(chi2);
244 
245  if (msgLvl(MSG::DEBUG)) at->dump(msg());
246 
247  return true;
248  }
249 
250  ATH_MSG_DEBUG("failed to make AlignTrack");
251  delete alignTSOSCollection;
252  return false;
253  }
254 
255 } // end namespace
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
Trk::AlignTrack::setAlignTSOSCollection
void setAlignTSOSCollection(AlignTSOSCollection *atsosColl)
sets collection of AlignTSOS
Definition: AlignTrack.cxx:341
Trk::AlignTrackCreator::finalize
StatusCode finalize()
Definition: AlignTrackCreator.cxx:91
Trk::TrackStateOnSurface::Perigee
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
Definition: TrackStateOnSurface.h:117
Trk::Track::fitQuality
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload
Trk::AlignTrackCreator::initialize
StatusCode initialize()
Definition: AlignTrackCreator.cxx:63
Trk::AlignTrackCreator::AlignTrackCreator
AlignTrackCreator(const std::string &type, const std::string &name, const IInterface *parent)
Definition: AlignTrackCreator.cxx:34
MeasurementBase.h
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:18
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CompetingRIOsOnTrack.h
Trk::Track::trackStateOnSurfaces
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
Trk::AlignTrackCreator::m_eventListName
std::string m_eventListName
good events read in from ASCII file
Definition: AlignTrackCreator.h:59
Trk::AlignTrackCreator::m_requireOverlap
bool m_requireOverlap
write selected events to event list ASCII file
Definition: AlignTrackCreator.h:61
IAlignResidualCalculator.h
Trk::AlignTSOS
Definition: AlignTSOS.h:37
skel.it
it
Definition: skel.GENtoEVGEN.py:407
Trk::AlignModule
Definition: AlignModule.h:45
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
Trk::AlignTrackCreator::m_alignModuleTool
ToolHandle< IAlignModuleTool > m_alignModuleTool
Definition: AlignTrackCreator.h:51
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
Trk::AlignModule::NDetectorTypes
@ NDetectorTypes
Definition: AlignModule.h:57
Trk::TrackState::unidentified
@ unidentified
Definition: TrackStateDefs.h:27
AlignTrackCreator.h
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
Trk::AlignTrackCreator::m_idHelper
const AtlasDetectorID * m_idHelper
Definition: AlignTrackCreator.h:54
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
AlignTSOS.h
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
Trk::TrackStateOnSurface::Outlier
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
Definition: TrackStateOnSurface.h:122
Track.h
MaterialEffectsOnTrack.h
python.PyAthena.module
module
Definition: PyAthena.py:131
Trk::AlignTrackCreator::processAlignTrack
bool processAlignTrack(AlignTrack *track)
creates AlignTrack containing all TSOS on track
Definition: AlignTrackCreator.cxx:116
Trk::AlignTrackCreator::m_includeScatterers
bool m_includeScatterers
remove AlignTSOS not in AlignModules
Definition: AlignTrackCreator.h:63
AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
AtlasDetectorID.h
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
Trk::CompetingRIOsOnTrack::rioOnTrack
virtual const RIO_OnTrack & rioOnTrack(unsigned int) const =0
returns the RIO_OnTrack (also known as ROT) objects depending on the integer.
AlignTrack.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
Trk::TrackStateOnSurface::Hole
@ Hole
A hole on the track - this is defined in the following way.
Definition: TrackStateOnSurface.h:128
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
Trk::CompetingRIOsOnTrack
Base class for all CompetingRIOsOnTack implementations, extends the common MeasurementBase.
Definition: CompetingRIOsOnTrack.h:64
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:525
Trk::TrackState::MeasurementType
MeasurementType
enum describing the flavour of MeasurementBase
Definition: TrackStateDefs.h:26
AlignModuleTool.h
test_pyathena.parent
parent
Definition: test_pyathena.py:15
Trk::AlignTrack::dump
void dump(MsgStream &msg)
dump align track information
Definition: AlignTrack.cxx:316
run
Definition: run.py:1
Trk::ParametersBase
Definition: ParametersBase.h:55
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
AlignModuleList.h
Trk::MeasurementBase
Definition: MeasurementBase.h:58
Trk::AlignTrackCreator::m_goodEventList
std::vector< std::pair< int, int > > m_goodEventList
Definition: AlignTrackCreator.h:57
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
Trk::AlignTrackCreator::m_residualCalculator
ToolHandle< IAlignResidualCalculator > m_residualCalculator
Definition: AlignTrackCreator.h:52
Trk::AlignTrackCreator::~AlignTrackCreator
virtual ~AlignTrackCreator()
Definition: AlignTrackCreator.cxx:57
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
RIO_OnTrack.h
Trk::AlignModule::DetectorType
DetectorType
Definition: AlignModule.h:57
Trk::MeasurementTypeID
classifies a MeasurementBase into one of the known inherited flavours or one of the detector types fo...
Definition: MeasurementTypeID.h:26
AlignModule.h
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
Trk::AlignTrackCreator::m_measTypeIdHelper
MeasurementTypeID * m_measTypeIdHelper
Definition: AlignTrackCreator.h:55
Trk::AlignTrack
Definition: AlignTrack.h:41
EventInfo.h
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
Trk::AlignTrackCreator::m_writeEventList
bool m_writeEventList
name of event list ASCII file
Definition: AlignTrackCreator.h:60
Trk::IAlignTrackCreator
Definition: IAlignTrackCreator.h:30
MeasurementTypeID.h
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
Trk::AlignTrack::setChi2
void setChi2(double chi2)
Definition: AlignTrack.h:166
Trk::TrackStateOnSurface::Scatterer
@ Scatterer
This represents a scattering point on the track, and so will contain TrackParameters and MaterialEffe...
Definition: TrackStateOnSurface.h:113
Trk::FitQuality::chiSquared
double chiSquared() const
returns the of the overall track fit
Definition: FitQuality.h:56
Trk::AlignTSOS::setValid
void setValid(bool isvalid)
set and retrieve flag to indicate whether hit valid for alignment
Definition: AlignTSOS.h:73
Trk::FitQuality::numberDoF
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition: FitQuality.h:60
Trk::RIO_OnTrack::detectorElement
virtual const TrkDetElementBase * detectorElement() const =0
returns the detector element, assoicated with the PRD of this class
AthAlgTool
Definition: AthAlgTool.h:26
Trk::AlignTrackCreator::m_removeATSOSNotInAlignModule
bool m_removeATSOSNotInAlignModule
keep only tracks that pass through 2 or more AlignModules
Definition: AlignTrackCreator.h:62
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
Trk::TrackStateOnSurface::Measurement
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
Definition: TrackStateOnSurface.h:101
TrackStateOnSurface.h
Trk::MeasurementTypeID::defineType
Trk::TrackState::MeasurementType defineType(const MeasurementBase *) const
createPerigee method - returned by object
Definition: MeasurementTypeID.cxx:20