ATLAS Offline Software
TrackParametersCnv_p2.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 //-----------------------------------------------------------------------------
6 //
7 // file: TrackParametersCnv_p2.h
8 // author: edward.moyse@cern.ch
9 //
10 //-----------------------------------------------------------------------------
11 
15 #include "TrkSurfaces/Surface.h"
22 
27 
28 #include <cassert>
29 #include <iostream>
30 
32  const Trk ::TrackParameters_p2* ,
33  Trk ::TrackParameters* , MsgStream& ) {
34  throw std::runtime_error(
35  "TrackParametersCnv_p2::persToTrans shouldn't be called any more!");
36 }
37 
39  const Trk::TrackParameters_p2* persObj, MsgStream& log) {
40  // ---- Covariance matrix
41  std::optional<AmgSymMatrix(5)> cov = std::nullopt;
42  auto transcov =
43  std::unique_ptr<AmgSymMatrix(5)>(transErrorMatrix(persObj, log));
44  if (transcov) {
45  cov = (*transcov);
46  }
47  // ---- Parameters
48  Trk::TrackParameters *transObj=nullptr;
49  unsigned int size=persObj->m_parameters.size();
50  if (size==7){ // size 7 means we chose to write
51  // as a Curvillinear representation
52  // In principle we could check
53  // the persObject for Trk::SurfaceType::Curvilinear
55  for (unsigned int i=0; i<size; ++i) parameters[i]=persObj->m_parameters[i];
57  return transObj;
58  } else {
59  // Not a curvilinear representation.
60  // We need to have a surface to handle local->global transformations etc/
61  // Get surface type
62  Trk::SurfaceType type = static_cast<Trk::SurfaceType>(persObj->m_surfaceType);
63  // Get surface & fill parameter vector
64  const Trk::Surface* surface = transSurface(persObj, type, log);
66  for (unsigned int i = 0; i < size; ++i){
67  parameters[i] = persObj->m_parameters[i];
68  }
69  // Now create concrete parameters ...
70  if (surface){
72  transObj = new Trk::Perigee(
73  parameters, static_cast<const Trk::PerigeeSurface*>(surface), cov);
74  return transObj;
75  } else if (type == Trk::SurfaceType::Plane) {
76  transObj = new Trk::AtaPlane(
77  parameters, static_cast<const Trk::PlaneSurface*>(surface), cov);
78  return transObj;
79  } else if (type == Trk::SurfaceType::Line) {
80  transObj = new Trk::AtaStraightLine(
81  parameters,
82  static_cast<const Trk::StraightLineSurface*>(surface),
83  cov);
84  return transObj;
85  }
86  } else if (!m_nosurf) {
87  // FIXME: next line changed to DEBUG to avoid filling the derivation job
88  // options with garbage. Underlying issue should be fixed.
89  log << MSG::DEBUG << "No surface of type=" << static_cast<int>(type)
90  << " created - so these parameters cannot be made!" << endmsg;
91  return nullptr;
92  }
93  }
94  return nullptr;
95 }
96 
97 AmgSymMatrix(5)* TrackParametersCnv_p2::transErrorMatrix(const Trk :: TrackParameters_p2 *persObj,MsgStream& log){
98  AmgSymMatrix(5)* cov=nullptr;
99  if (!persObj->m_errorMatrix.isNull()){
100  // fill errormatrix
101  cov = new AmgSymMatrix(5);
103  fillTransFromPStore( &m_emConverter, persObj->m_errorMatrix, &dummy, log );
104  Amg::expand(dummy.values.begin(), dummy.values.end(), *cov);
105  }
106  return cov;
107 }
108 
109 const Trk::Surface*
110 TrackParametersCnv_p2::transSurface(const Trk ::TrackParameters_p2* persObj,
112  MsgStream& log)
113 {
114  const Trk::Surface* surface = nullptr;
115  // check if surface had transform.
116  if (!persObj->m_transform.empty()){
117  auto transform = std::make_unique<Amg::Transform3D>();
118  EigenHelpers::vectorToEigenTransform3D( persObj->m_transform, *transform.get());
119  // recreate free surface
121  surface = new Trk::PerigeeSurface(*transform);
122  } else if (type==Trk::SurfaceType::Plane){
123  surface = new Trk::PlaneSurface(*transform);
124  } else if (type==Trk::SurfaceType::Line){
125  surface = new Trk::StraightLineSurface(*transform);
126  }
127  if (!surface){
128  log << MSG::WARNING << "Free surface of type=" << static_cast<int>(type)
129  << " isn't currently supported in TrackParametersCnv_p2" << endmsg;
130  return nullptr;
131  }
132  } else {
133  // Surface must have belonged to a ReadoutElement, or some part of the geometry or have a nominal/default perigee surface.
135  Identifier id=Identifier32(persObj->m_associatedDetElementId);
136  if (!id.get_compact() && persObj->m_associatedDetElementId != 0)
137  id = Identifier(persObj->m_associatedDetElementId);
138  if (m_nosurf)surface = nullptr;
139  else {
140  const Trk::Surface* detSurf = m_eventCnvTool->getSurface(id);
141  if (!detSurf){
142  log << MSG::WARNING << "Surface of type=" << static_cast<int>(type)
143  << " was not found by the eventCnvTool." << endmsg;
144  }
145  surface = detSurf;
146  }
147  } else {
148  surface = new Trk::PerigeeSurface(); // FIXME! How do we support nominal Perigee Surfaces now?
149  }
150  }
151  return surface;
152 }
153 
155  Trk ::TrackParameters_p2* persObj,
156  MsgStream& log) {
157 
158  bool isCurvilinear = (transObj->type() == Trk::Curvilinear);
159  bool deleteAtEnd = false;
160  if (isCurvilinear){
161  convertTransCurvilinearToPers(transObj,persObj);
162  // Not bothering with Surface here - not relevant for curvilinear
163  } else {
164  // normal track parameters - check if the type is 'permitted' to be written.
165  if (isPersistifiableType(transObj)) {
166  unsigned int nRows = transObj->parameters().rows();
167  persObj->m_parameters.resize( nRows);
168  for( unsigned int i = 0; i < nRows; i++ ){
169  persObj->m_parameters[i] = transObj->parameters()[i];
170  }
171  fillPersSurface(transObj, persObj, log);
172  } else { // if not, convert to curvilinear
173  std::optional<AmgSymMatrix(5)> newcov = std::nullopt;
174  if (transObj->covariance()) {
175  newcov = *(transObj->covariance());
176  }
177  const Trk::CurvilinearParameters* curvilinear =
178  new Trk::CurvilinearParameters(transObj->position(),
179  transObj->momentum(),
180  transObj->charge(), newcov);
181  transObj = curvilinear;
182  deleteAtEnd = true; // Because the curvilinear will leak otherwise
183  convertTransCurvilinearToPers(transObj, persObj);
184  }
185  }
186 
187  // Errormatrix
188  if (transObj->covariance()){
189  Trk::ErrorMatrix pMat;
190  EigenHelpers::eigenMatrixToVector(pMat.values, *transObj->covariance(), "TrackParametersCnv_p2");
191  persObj->m_errorMatrix = toPersistent( &m_emConverter, &pMat, log );
192  }
193 
194  if (deleteAtEnd) {
195  delete transObj;
196  }
197 }
198 
200  const Trk ::TrackParameters* transObj, Trk ::TrackParameters_p2* persObj) {
201  // Curvilinear: here we store the 3 position + 3 momentum, rather than the 5
202  // parameters.
203  // This avoids writing the surface
204  persObj->m_parameters.resize(7);
205  for (unsigned int i = 0; i < 3; ++i) {
206  persObj->m_parameters[i] = transObj->position()[i];
207  persObj->m_parameters[i + 3] = transObj->momentum()[i];
208  }
209  persObj->m_parameters[6] = transObj->charge();
210  // And lets remember to always set the type of the surface
211  persObj->m_surfaceType = static_cast<uint8_t>(Trk::SurfaceType::Curvilinear);
212 }
213 
215  const Trk::Surface* surf = transObj->associatedSurface ().baseSurface();
216  assert (surf);
217  Trk::SurfaceType type = surf->type();
219 }
220 
221 void TrackParametersCnv_p2::fillPersSurface(const Trk :: TrackParameters *transObj, Trk :: TrackParameters_p2 *persObj, MsgStream& /*log*/){
222  //----- Surface
223  const Trk::Surface* surf = transObj->associatedSurface ().baseSurface();
224  assert (surf);
225  persObj->m_surfaceType = static_cast<uint8_t>(surf->type()); // Store type
226 
227  persObj->m_associatedDetElementId = surf->associatedDetectorElementIdentifier().get_identifier32().get_compact();
228  static const Trk::PerigeeSurface s_nominalPerigeeSurface; // FIXME - should there be a common 'nominal' surface ie on Perigee, as before?
229  // Need to write out transforms for TG owned surfaces, and 'free' (noOwn) surfaces - i.e. anything which isn't on det element
230  if( surf->cachedTransform()!=nullptr ) {
231  // FIXME - I think maybe we can just remove all of the code below and ALWAYS write out the transform if it exists - i.e. it won't exist if the surface is 'nominal'
232  if (surf->type() != Trk::SurfaceType::Perigee ||
233  (surf->type() == Trk::SurfaceType::Perigee &&
234  *surf != s_nominalPerigeeSurface)) {
236  persObj->m_transform);
237  }
238  }
239 }
240 
241 
Identifier32
Definition: Identifier32.h:25
CLHEPHelpers.h
StraightLineSurface.h
TrackParameters.h
PerigeeSurface.h
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:558
Surface.h
TrackParametersCnv_p2.h
Trk::PerigeeSurface
Definition: PerigeeSurface.h:43
Trk::TrackParameters_p2
Definition: TrackParameters_p2.h:20
Trk::CurvilinearParameters
CurvilinearParametersT< TrackParametersDim, Charged, PlaneSurface > CurvilinearParameters
Definition: Tracking/TrkEvent/TrkParameters/TrkParameters/TrackParameters.h:29
EventPrimitivesHelpers.h
Trk::Surface::associatedDetectorElementIdentifier
Identifier associatedDetectorElementIdentifier() const
return Identifier of the associated Detector Element
plotBeamSpotVxVal.cov
cov
Definition: plotBeamSpotVxVal.py:200
Identifier::get_identifier32
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
TrackParametersCnv_p2::m_emConverter
ErrorMatrixCnv_p1 * m_emConverter
Definition: TrackParametersCnv_p2.h:64
Trk::SurfaceType
SurfaceType
Definition: SurfaceTypes.h:17
TrackParametersCnv_p2::fillPersSurface
static void fillPersSurface(const Trk ::TrackParameters *transObj, Trk ::TrackParameters_p2 *persObj, MsgStream &log)
Definition: TrackParametersCnv_p2.cxx:221
Trk::Curvilinear
@ Curvilinear
Definition: ParametersCommon.h:29
EigenHelpers::eigenTransform3DToVector
static void eigenTransform3DToVector(const Amg::Transform3D &trans, T &vec)
Convert HepGeom::Transform3D to std :: vector<double>
Definition: EigenHelpers.h:55
Trk::TrackParameters_p2::m_parameters
std::vector< float > m_parameters
Definition: TrackParameters_p2.h:27
TrackParametersCnv_p2::transToPers
void transToPers(const Trk::TrackParameters *transObj, Trk::TrackParameters_p2 *persObj, MsgStream &log)
Definition: TrackParametersCnv_p2.cxx:154
Trk::Perigee
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
Definition: Tracking/TrkEvent/TrkParameters/TrkParameters/TrackParameters.h:33
Identifier32::get_compact
value_type get_compact() const
Get the compact id.
Definition: Identifier32.h:44
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
ITPConverterFor< TRANS_BASE >::fillTransFromPStore
void fillTransFromPStore(CNV **cnv, const TPObjRef &ref, TRANS_T *trans, MsgStream &log) const
Convert persistent object, stored in the the top-level persistent object and referenced by the TP Ref...
Definition: TPConverter.h:145
Amg::expand
void expand(std::vector< float >::const_iterator it, std::vector< float >::const_iterator, AmgSymMatrix(N) &covMatrix)
Definition: EventPrimitivesHelpers.h:75
xAOD::TrackParameters
TrackParameters_v1 TrackParameters
Definition: Event/xAOD/xAODTracking/xAODTracking/TrackParameters.h:11
Trk::Surface::baseSurface
virtual const Trk::Surface * baseSurface() const
return the base surface (simplified for persistification)
Trk::ErrorMatrix
Definition: ErrorMatrixCnv_p1.h:25
Trk::AtaStraightLine
ParametersT< TrackParametersDim, Charged, StraightLineSurface > AtaStraightLine
Definition: Tracking/TrkEvent/TrkParameters/TrkParameters/TrackParameters.h:35
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
ConeSurface.h
CurvilinearParametersT.h
TrackParametersCnv_p2::m_eventCnvTool
ToolHandle< Trk::IEventCnvSuperTool > m_eventCnvTool
Definition: TrackParametersCnv_p2.h:65
Trk::Surface::cachedTransform
const Amg::Transform3D * cachedTransform() const
Return the cached transformation directly.
lumiFormat.i
int i
Definition: lumiFormat.py:85
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
AmgVector
AmgVector(4) T2BSTrackFilterTool
Definition: T2BSTrackFilterTool.cxx:114
ParametersT.h
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
CylinderSurface.h
CalibDbCompareRT.dummy
dummy
Definition: CalibDbCompareRT.py:59
EigenHelpers.h
Trk::ParametersBase
Definition: ParametersBase.h:55
Trk::CurvilinearParametersT
Definition: CurvilinearParametersT.h:48
Trk::TrackParameters_p2::m_surfaceType
uint8_t m_surfaceType
Used to recreate the correct TrackParameters.
Definition: TrackParameters_p2.h:29
EigenHelpers::eigenMatrixToVector
static void eigenMatrixToVector(VECTOR &vec, COVARIANCE &cov, const char *)
Helper fn to get raw data (vec<float>) from the covariance.
Definition: EigenHelpers.h:30
EigenHelpers::vectorToEigenTransform3D
static void vectorToEigenTransform3D(const T &vec, Amg::Transform3D &trans)
Convert std :: vector<double> to Amg::Transform3D.
Definition: EigenHelpers.h:36
TrackParametersCnv_p2::m_nosurf
bool m_nosurf
Definition: TrackParametersCnv_p2.h:66
ITPConverterFor< TRANS_BASE >::toPersistent
TPObjRef toPersistent(CNV **cnv, const typename CNV::TransBase_t *transObj, MsgStream &log) const
Persistify an object and store the persistent represenation in the storage vector of the top-level pe...
Definition: TPConverter.h:119
TrackParametersCnv_p2::isPersistifiableType
static bool isPersistifiableType(const Trk ::TrackParameters *transObj)
Definition: TrackParametersCnv_p2.cxx:214
Trk::SurfaceType::Perigee
@ Perigee
TrackParametersCnv_p2::persToTrans
void persToTrans(const Trk ::TrackParameters_p2 *persObj, Trk ::TrackParameters *transObj, MsgStream &log)
Definition: TrackParametersCnv_p2.cxx:31
xAOD::Curvilinear
@ Curvilinear
Definition: TrackingPrimitives.h:559
TrackParametersCnv_p2::convertTransCurvilinearToPers
static void convertTransCurvilinearToPers(const Trk ::TrackParameters *transObj, Trk ::TrackParameters_p2 *persObj)
Definition: TrackParametersCnv_p2.cxx:199
Trk::ErrorMatrix::values
std::vector< float > values
Definition: ErrorMatrixCnv_p1.h:27
Trk::PlaneSurface
Definition: PlaneSurface.h:64
PlaneSurface.h
AmgSymMatrix
AmgSymMatrix(5) *TrackParametersCnv_p2
Definition: TrackParametersCnv_p2.cxx:97
DEBUG
#define DEBUG
Definition: page_access.h:11
Trk::AtaPlane
ParametersT< TrackParametersDim, Charged, PlaneSurface > AtaPlane
Definition: Tracking/TrkEvent/TrkParameters/TrkParameters/TrackParameters.h:34
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
DiscSurface.h
physics_parameters.parameters
parameters
Definition: physics_parameters.py:144
Trk::SurfaceType::Plane
@ Plane
RPDUtils::nRows
unsigned constexpr int nRows
Definition: RPDUtils.h:24
Trk::SurfaceType::Line
@ Line
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:79
TrackParametersCnv_p2::createTransient
Trk::TrackParameters * createTransient(const Trk::TrackParameters_p2 *persObj, MsgStream &log)
Definition: TrackParametersCnv_p2.cxx:38
Trk::Surface::type
constexpr virtual SurfaceType type() const =0
Returns the Surface type to avoid dynamic casts.
Trk::StraightLineSurface
Definition: StraightLineSurface.h:51
Identifier
Definition: IdentifierFieldParser.cxx:14