diff --git a/Tracker/TrackerEventCnv/TrackerEventAthenaPool/CMakeLists.txt b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/CMakeLists.txt index 4f948521da35acaa0936d8b27c5cb6252693e9eb..a6ff20cdab5cb61d20b97b17290b0224ee6192fc 100644 --- a/Tracker/TrackerEventCnv/TrackerEventAthenaPool/CMakeLists.txt +++ b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/CMakeLists.txt @@ -7,29 +7,62 @@ atlas_subdir( TrackerEventAthenaPool ) # Component(s) in the package: -atlas_add_poolcnv_library( TrackerEventAthenaPoolPoolCnv + +# Component(s) in the package: +atlas_add_library( TrackerEventAthenaPool TrackerEventAthenaPool/*.h src/*.h src/*.cxx + PUBLIC_HEADERS TrackerEventAthenaPool + LINK_LIBRARIES Identifier GeneratorObjectsTPCnv AthAllocators AthContainers + AthenaBaseComps AthenaKernel SGTools StoreGateLib AthenaPoolCnvSvcLib + AthenaPoolUtilities AtlasSealCLHEP GaudiKernel TrackerIdentifier + TrackerReadoutGeometry TrackerEventTPCnv TrackerRawData TrackerSimData + TrackerPrepRawData TrkTrack ) + + atlas_add_poolcnv_library( TrackerEventAthenaPoolPoolCnv FILES TrackerRawData/FaserSCT_RDO_Container.h TrackerPrepRawData/FaserSCT_ClusterContainer.h + src/TrackerTrack.h TrackerSimData/TrackerSimDataCollection.h - TrkSpacePoint/SpacePointContainer.h -# FaserSCT_ConditionsData/FaserSCT_FlaggedCondData.h LINK_LIBRARIES Identifier GeneratorObjectsTPCnv AthAllocators AthContainers AthenaBaseComps AthenaKernel SGTools StoreGateLib AthenaPoolCnvSvcLib AthenaPoolUtilities AtlasSealCLHEP GaudiKernel TrackerIdentifier - TrackerReadoutGeometry TrackerEventTPCnv - TrackerRawData TrackerSimData - TrackerPrepRawData TrkTrack - TrkSpacePoint - TrackerSpacePoint -# FaserSCT_ConditionsData - ) + TrackerReadoutGeometry TrackerEventTPCnv TrackerRawData TrackerSimData + TrackerPrepRawData TrkTrack TrackerEventAthenaPool ) atlas_add_dictionary( TrackerEventAthenaPoolCnvDict TrackerEventAthenaPool/TrackerEventAthenaPoolCnvDict.h TrackerEventAthenaPool/selection.xml LINK_LIBRARIES Identifier GeneratorObjectsTPCnv ) + + + + + + +# atlas_add_poolcnv_library( TrackerEventAthenaPoolPoolCnv +# TrackerEventAthenaPool/*.h src/*.h src/*.cxx +# FILES TrackerRawData/FaserSCT_RDO_Container.h +# TrackerPrepRawData/FaserSCT_ClusterContainer.h +# TrackerSimData/TrackerSimDataCollection.h +# TrkSpacePoint/SpacePointContainer.h +# # FaserSCT_ConditionsData/FaserSCT_FlaggedCondData.h +# LINK_LIBRARIES Identifier GeneratorObjectsTPCnv AthAllocators AthContainers +# AthenaBaseComps AthenaKernel SGTools StoreGateLib AthenaPoolCnvSvcLib +# AthenaPoolUtilities AtlasSealCLHEP GaudiKernel TrackerIdentifier +# TrackerReadoutGeometry TrackerEventTPCnv +# TrackerRawData TrackerSimData +# TrackerPrepRawData TrkTrack TrackerRIO_OnTrack +# TrkSpacePoint +# TrackerSpacePoint +# # FaserSCT_ConditionsData +# ) + +# atlas_add_dictionary( TrackerEventAthenaPoolCnvDict +# TrackerEventAthenaPool/TrackerEventAthenaPoolCnvDict.h +# TrackerEventAthenaPool/selection.xml +# LINK_LIBRARIES Identifier GeneratorObjectsTPCnv ) + # Install files from the package: atlas_install_headers( TrackerEventAthenaPool ) #atlas_install_joboptions( share/*.py ) diff --git a/Tracker/TrackerEventCnv/TrackerEventAthenaPool/src/TrackerTrack.h b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/src/TrackerTrack.h new file mode 100644 index 0000000000000000000000000000000000000000..4d08e9a7c1ef70fdbb12dc8c75afa9740dfc010f --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/src/TrackerTrack.h @@ -0,0 +1,19 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACKER_TRACK_H +#define TRACKER_TRACK_H + + +#include "AthenaKernel/CLASS_DEF.h" + + +class TrackerTrack +{ +}; + + +CLASS_DEF(TrackerTrack, 48647229, 1 ) + +#endif diff --git a/Tracker/TrackerEventCnv/TrackerEventAthenaPool/src/TrackerTrackCnv.cxx b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/src/TrackerTrackCnv.cxx new file mode 100644 index 0000000000000000000000000000000000000000..9f6193b0e9d6f7aa60fe61269643e5b9d82fe61b --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/src/TrackerTrackCnv.cxx @@ -0,0 +1,53 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GaudiKernel/MsgStream.h" + +#include "TrackerTrackCnv.h" +#include "TrkTrack/TrackCollection.h" + +#include <iostream> +#include <stdexcept> + +TrackerTrackCnv::TrackerTrackCnv(ISvcLocator* svcloc): + TrackerTrackCnvBase(svcloc) +{ +} + + +StatusCode TrackerTrackCnv::initialize() +{ + if( !TrackerTrackCnvBase::initialize().isSuccess() ) + return StatusCode::FAILURE; + + + // std::cout << " ------->>---- In TrackerTrackCnv::initialize()" << std::endl; + + return StatusCode::SUCCESS; +} + + +// this method just reads the persistent object - no TP conversion here +void +TrackerTrackCnv::readObjectFromPool( const std::string& token ) +{ + static const pool::Guid p2_guid( "27491695-F64A-43EE-859D-73F33AF3317D" ); + // static const pool::Guid p2_guid( "4E3778E2-1497-4F10-8746-AA02319FAC83" ); + // static const pool::Guid p1_guid( "8380F7AC-4A8F-4382-95A5-1234E43D3B08" ); + + // set the POOL token which will be used for reading from POOL + setToken( token ); + + // select the object type based on its GUID + if( compareClassGuid( p2_guid ) ) { + // read the object using the main TP converter + poolReadObject< TrackerTrack_PERS >( m_TPConverter2 ); +// }else if( compareClassGuid( p1_guid ) ) { +// poolReadObject< InDet::Track_tlp1 >( m_TPConverter1 ); + } + else + throw std::runtime_error( "Unsupported version of TrackerTrack_PERS (unknown GUID)" ); +} + + diff --git a/Tracker/TrackerEventCnv/TrackerEventAthenaPool/src/TrackerTrackCnv.h b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/src/TrackerTrackCnv.h new file mode 100644 index 0000000000000000000000000000000000000000..05aff9565ca00594c28ca45409cdc7a936b3594f --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/src/TrackerTrackCnv.h @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACKER_TRACKCNV_H +#define TRACKER_TRACKCNV_H + +#include "AthenaPoolCnvSvc/T_AthenaPoolExtendingCnv.h" + +// #include "TrackerEventTPCnv/TrackerTrackCnv_tlp1.h" +#include "TrackerEventTPCnv/TrackerTrackCnv_tlp2.h" + +#include "TrackerTrack.h" + + +//----------------------------------------------------------------------------- +// Base class definition +//----------------------------------------------------------------------------- +typedef Tracker::Track_tlp2 TrackerTrack_PERS; +typedef T_AthenaPoolExtendingCnv<TrackerTrack, TrackerTrack_PERS> TrackerTrackCnvBase; + +//----------------------------------------------------------------------------- +// Converter for TrackCollection object +//----------------------------------------------------------------------------- +class TrackerTrackCnv : public TrackerTrackCnvBase +{ +friend class CnvFactory<TrackerTrackCnv>; + +protected: +public: + TrackerTrackCnv( ISvcLocator *svcloc ); +protected: + + virtual StatusCode initialize(); + + + virtual AthenaPoolTopLevelTPCnvBase* getTopLevelTPCnv() { return &m_TPConverter2; } + + virtual AthenaPoolCnvTPExtension* clone() { return new TrackerTrackCnv(0); } + + virtual void readObjectFromPool( const std::string& ); + + +private: +// InDetTrackCnv_tlp1 m_TPConverter1; + TrackerTrackCnv_tlp2 m_TPConverter2; +}; + +#endif + diff --git a/Tracker/TrackerEventCnv/TrackerEventCnvTools/CMakeLists.txt b/Tracker/TrackerEventCnv/TrackerEventCnvTools/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..6053d2790392ae986af95db90127dedf1fc5c0b1 --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventCnvTools/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + +# Declare the package name: +atlas_subdir( TrackerEventCnvTools ) + +# Component(s) in the package: +atlas_add_component( TrackerEventCnvTools + src/*.cxx + src/components/*.cxx + LINK_LIBRARIES AthenaBaseComps FaserDetDescr IdDictDetDescr Identifier TrackerIdentifier TrackerReadoutGeometry TrackerPrepRawData TrackerRIO_OnTrack StoreGateLib TrkPrepRawData TrkRIO_OnTrack TrkEventCnvToolsLib ) diff --git a/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/ATLAS_CHECK_THREAD_SAFETY b/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/ATLAS_CHECK_THREAD_SAFETY new file mode 100644 index 0000000000000000000000000000000000000000..0d4c3a9d8b7fbde5eb560fe15628b349ff34a863 --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/ATLAS_CHECK_THREAD_SAFETY @@ -0,0 +1 @@ +Tracker/TrackerEventCnv/TrackerEventCnvTools \ No newline at end of file diff --git a/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/TrackerEventCnvTool.h b/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/TrackerEventCnvTool.h new file mode 100644 index 0000000000000000000000000000000000000000..29ef80259242bde365ddf83b6ec8bcff3ada41ac --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/TrackerEventCnvTool.h @@ -0,0 +1,98 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACKEREVENTCNVTOOL_H +#define TRACKEREVENTCNVTOOL_H + +#include "TrkEventCnvTools/ITrkEventCnvTool.h" +#include "AthenaBaseComps/AthAlgTool.h" + +#include "TrackerPrepRawData/FaserSCT_ClusterContainer.h" +#include "TrackerReadoutGeometry/SiDetectorElementCollection.h" +#include "StoreGate/ReadCondHandleKey.h" +#include "StoreGate/ReadHandleKey.h" + +#include <utility> + +class FaserDetectorID; +class Identifier; +class IdentifierHash; +class IdDictManager; +class FaserSCT_ID; + +namespace Trk { + class TrkDetElementBase; + class PrepRawData; +} + + +namespace Tracker { + /**Helper tool uses to convert Tracker objects in generic tracking custom convertor TrkEventAthenaPool. + + See "mainpage" for discussion of jobOpts. + */ +class TrackerEventCnvTool : public extends<AthAlgTool, Trk::ITrkEventCnvTool> +{ + public: + + enum TrackerConcreteType { SCT, Unknown }; + + TrackerEventCnvTool(const std::string&,const std::string&,const IInterface*); + + virtual ~TrackerEventCnvTool() = default; + + virtual StatusCode initialize() override; + + virtual void checkRoT( const Trk::RIO_OnTrack& rioOnTrack ) const override; + + /** use the passed identifier to recreate the detector element and PRD links on the passed RIO_OnTrack + @param[in] rioOnTrack The RIO_OnTrack we're interested in + @return std::pair of the pointers to the two corresponding objects*/ + virtual std::pair<const Trk::TrkDetElementBase*, const Trk::PrepRawData*> + getLinks( Trk::RIO_OnTrack& rioOnTrack ) const override; + + /** @copydoc Trk::ITrkEventCnvTool::prepareRIO_OnTrack( Trk::RIO_OnTrack* rot)*/ + virtual void prepareRIO_OnTrack( Trk::RIO_OnTrack* rot) const override; + + /** Similar, but just return the EL components rather then + changing ROT. */ + virtual void prepareRIO_OnTrackLink( const Trk::RIO_OnTrack* rot, + ELKey_t& key, + ELIndex_t& index ) const override; + + /** @copydoc Trk::ITrkEventCnvTool::recreateRIO_OnTrack( Trk::RIO_OnTrack* rot)*/ + virtual void recreateRIO_OnTrack( Trk::RIO_OnTrack *RoT ) const override; + + /** Return the detectorElement associated with this Identifier*/ + virtual const Trk::TrkDetElementBase* getDetectorElement(const Identifier& id, const IdentifierHash& idHash) const override; + + /** Return the detectorElement associated with this Identifier*/ + virtual const Trk::TrkDetElementBase* getDetectorElement(const Identifier& id) const override; + + + private: + + /** use the passed identifier to recreate the SCT cluster link on the passed RIO_OnTrack*/ + virtual const Trk::PrepRawData* sctClusterLink( const Identifier& id, const IdentifierHash& idHash ) const; + + /** use the passed IdentifierHash to get SiDetectorElement for SCT*/ + const TrackerDD::SiDetectorElement* getSCTDetectorElement(const IdentifierHash& waferHash) const; + + bool m_setPrepRawDataLink; //!< if true, attempt to recreate link to PRD + + + //various id helpers + const FaserDetectorID* m_IDHelper; + const FaserSCT_ID* m_SCTHelper; + + // added to check TRT existence (SLHC geo check) + const IdDictManager* m_idDictMgr; + + SG::ReadHandleKey<FaserSCT_ClusterContainer> m_sctClusContName {this, "SCT_ClusterContainer", "SCT_Clusters", "SCT Cluster container name"}; //!< location of container of sct clusters + + SG::ReadCondHandleKey<TrackerDD::SiDetectorElementCollection> m_SCTDetEleCollKey{this, "SCTDetEleCollKey", "SCT_DetectorElementCollection", "Key of SiDetectorElementCollection for SCT"}; + }; + +} +#endif // MOORETOTRACKTOOL_H diff --git a/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/TrackerEventCnvTool.cxx b/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/TrackerEventCnvTool.cxx new file mode 100644 index 0000000000000000000000000000000000000000..92d62c99790494ae1c0a2b0cb3b62753fe0386fe --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/TrackerEventCnvTool.cxx @@ -0,0 +1,208 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrackerEventCnvTools/TrackerEventCnvTool.h" + +#include "Identifier/Identifier.h" +#include "Identifier/IdentifierHash.h" +#include "FaserDetDescr/FaserDetectorID.h" +#include "TrackerIdentifier/FaserSCT_ID.h" + +#include "TrkRIO_OnTrack/RIO_OnTrack.h" +#include "TrkPrepRawData/PrepRawData.h" + +#include "TrackerReadoutGeometry/SiDetectorElement.h" +#include "IdDictDetDescr/IdDictManager.h" + +#include "TrackerPrepRawData/FaserSCT_ClusterCollection.h" +#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h" + +#include <vector> +#include <cassert> +#include <iostream> + +Tracker::TrackerEventCnvTool::TrackerEventCnvTool(const std::string& t, + const std::string& n, + const IInterface* p ) + : + base_class(t,n,p), + m_setPrepRawDataLink(false), + m_IDHelper(nullptr), + m_SCTHelper(nullptr), + m_idDictMgr(nullptr) +{ + declareProperty("RecreatePRDLinks", m_setPrepRawDataLink); + +} + +StatusCode Tracker::TrackerEventCnvTool::initialize() { + + StatusCode sc = AthAlgTool::initialize(); + if (sc.isFailure()) return sc; + + // check if SLHC geo is used (TRT not implemented) + // if not SLHC, get the TRT Det Descr manager + sc = detStore()->retrieve(m_idDictMgr, "IdDict"); + if (sc.isFailure()) { + std::cout << "Could not get IdDictManager !" << std::endl; + return StatusCode::FAILURE; + } + const IdDictDictionary* dict = m_idDictMgr->manager()->find_dictionary("Tracker"); + if (!dict) { + std::cout << " Cannot access Tracker dictionary "<< std::endl; + return StatusCode::FAILURE; + } + + //retrieving the various ID helpers + + if (detStore()->retrieve(m_IDHelper, "FaserID").isFailure()) { + ATH_MSG_FATAL( "Could not get FASER ID helper"); + return StatusCode::FAILURE; + } + + ATH_CHECK( detStore()->retrieve(m_SCTHelper, "FaserSCT_ID") ); + + ATH_CHECK( m_sctClusContName.initialize() ); + + ATH_CHECK( m_SCTDetEleCollKey.initialize() ); + + return sc; + +} + +void +Tracker::TrackerEventCnvTool::checkRoT( const Trk::RIO_OnTrack& rioOnTrack ) const { + TrackerConcreteType type=Unknown; + if (0!=dynamic_cast<const FaserSCT_ClusterOnTrack*>(&rioOnTrack) ) type = SCT; + if (type==Unknown) { + ATH_MSG_ERROR("Type does not match known concrete type of Tracker! Dumping RoT:"<<rioOnTrack); + } else { + ATH_MSG_VERBOSE("Type = "<<type); + } + + return; +} + +std::pair<const Trk::TrkDetElementBase*, const Trk::PrepRawData*> +Tracker::TrackerEventCnvTool::getLinks( Trk::RIO_OnTrack& rioOnTrack ) const +{ + using namespace Trk; + const TrkDetElementBase* detEl = 0; + const PrepRawData* prd = 0; + const Identifier& id = rioOnTrack.identify(); + + if (m_IDHelper->is_sct(id)) { + ATH_MSG_DEBUG("Set SCT detector element" ); + // use IdentifierHash for speed + detEl = getSCTDetectorElement( rioOnTrack.idDE() ) ; + if (m_setPrepRawDataLink) prd = sctClusterLink( id, rioOnTrack.idDE() ); + } else { + ATH_MSG_WARNING("Unknown type of Tracker detector from identifier :" + << id<<", in string form:" + << m_IDHelper->show_to_string(id) + ); + } + return std::pair<const Trk::TrkDetElementBase*, const Trk::PrepRawData*>(detEl,prd); +} + +void Tracker::TrackerEventCnvTool::prepareRIO_OnTrack( Trk::RIO_OnTrack *RoT ) const { + + Tracker::FaserSCT_ClusterOnTrack* sct = dynamic_cast<Tracker::FaserSCT_ClusterOnTrack*>(RoT); + if (sct!=0) { + prepareRIO_OnTrackElementLink<const Tracker::FaserSCT_ClusterContainer, Tracker::FaserSCT_ClusterOnTrack>(sct); + return; + } + return; +} + +void +Tracker::TrackerEventCnvTool::prepareRIO_OnTrackLink( const Trk::RIO_OnTrack *RoT, + ELKey_t& key, + ELIndex_t& index) const +{ + const Tracker::FaserSCT_ClusterOnTrack* sct = dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(RoT); + if (sct!=0) { + prepareRIO_OnTrackElementLink<const Tracker::FaserSCT_ClusterContainer, Tracker::FaserSCT_ClusterOnTrack>(sct, key, index); + return; + } + return; +} + +void Tracker::TrackerEventCnvTool::recreateRIO_OnTrack( Trk::RIO_OnTrack *RoT ) const { + std::pair<const Trk::TrkDetElementBase *, const Trk::PrepRawData *> pair = getLinks( *RoT ); + Trk::ITrkEventCnvTool::setRoT_Values( pair, RoT ); + return; +} + +const Trk::TrkDetElementBase* +Tracker::TrackerEventCnvTool::getDetectorElement(const Identifier& id, const IdentifierHash& idHash) const { + + const Trk::TrkDetElementBase* detEl=0; + + if (m_IDHelper->is_sct(id)) { + + ATH_MSG_DEBUG("Set SCT detector element" ); + // use IdentifierHash for speed + detEl = getSCTDetectorElement( idHash ) ; + } else { + ATH_MSG_WARNING("Unknown type of Tracker detector from identifier :" + << id<<", in string form:" + << m_IDHelper->show_to_string(id) + ); + } + return detEl; +} + +const Trk::TrkDetElementBase* +Tracker::TrackerEventCnvTool::getDetectorElement(const Identifier& id) const { + + const Trk::TrkDetElementBase* detEl=0; + + if (m_IDHelper->is_sct(id)) { + ATH_MSG_DEBUG("Set SCT detector element" ); + const Identifier wafer_id = m_SCTHelper->wafer_id(id); + const IdentifierHash wafer_hash = m_SCTHelper->wafer_hash(wafer_id); + detEl = getSCTDetectorElement( wafer_hash ) ; + } else { + ATH_MSG_WARNING("Unknown type of Tracker detector from identifier :"<< id<<", in string form:" + << m_IDHelper->show_to_string(id) ); + } + return detEl; +} + +const Trk::PrepRawData* +Tracker::TrackerEventCnvTool::sctClusterLink( const Identifier& id, const IdentifierHash& idHash ) const { + using namespace Trk; + // need to retrieve pointers to collections + // retrieve Pixel cluster container + + // obviously this can be optimised! EJWM + SG::ReadHandle<FaserSCT_ClusterContainer> h_sctClusCont(m_sctClusContName); + if (!h_sctClusCont.isValid()) { + ATH_MSG_ERROR("FaserSCT Cluster container not found at "<<m_sctClusContName); + return 0; + } else { + ATH_MSG_DEBUG("FaserSCT Cluster Container found" ); + } + const FaserSCT_ClusterCollection *ptr = h_sctClusCont->indexFindPtr(idHash); + // if we find PRD, then recreate link + if (ptr!=nullptr) { + //loop though collection to find matching PRD. + FaserSCT_ClusterCollection::const_iterator collIt = ptr->begin(); + FaserSCT_ClusterCollection::const_iterator collItEnd = ptr->end(); + // there MUST be a faster way to do this!! + for ( ; collIt!=collItEnd; collIt++) { + if ( (*collIt)->identify()==id ) return *collIt; + } + } + ATH_MSG_DEBUG("No matching PRD found" ); + return 0; +} + +const TrackerDD::SiDetectorElement* Tracker::TrackerEventCnvTool::getSCTDetectorElement(const IdentifierHash& waferHash) const { + SG::ReadCondHandle<TrackerDD::SiDetectorElementCollection> sctDetEle{m_SCTDetEleCollKey}; + if (not sctDetEle.isValid()) return nullptr; + return sctDetEle->getDetectorElement(waferHash); +} + diff --git a/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/components/TrackerEventCnvTool_entries.cxx b/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/components/TrackerEventCnvTool_entries.cxx new file mode 100644 index 0000000000000000000000000000000000000000..3d7144a021d532b496ba19bcba2422c01936ba11 --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/components/TrackerEventCnvTool_entries.cxx @@ -0,0 +1,6 @@ +#include "TrackerEventCnvTools/TrackerEventCnvTool.h" + +using namespace Tracker; + +DECLARE_COMPONENT( TrackerEventCnvTool ) + diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/CMakeLists.txt b/Tracker/TrackerEventCnv/TrackerEventTPCnv/CMakeLists.txt index 1a1a269b2e00ce4f4994965408f55141d9186c14..259453c94f261532d0e1054ace7259760fada14f 100644 --- a/Tracker/TrackerEventCnv/TrackerEventTPCnv/CMakeLists.txt +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/CMakeLists.txt @@ -10,11 +10,13 @@ atlas_subdir( TrackerEventTPCnv ) atlas_add_tpcnv_library( TrackerEventTPCnv TrackerEventTPCnv/*.h src/*.cxx TrackerEventTPCnv/TrackerPrepRawData/*.h src/TrackerPrepRawData/*.cxx + TrackerEventTPCnv/TrackerRIO_OnTrack/*.h src/TrackerRIO_OnTrack/*.cxx PUBLIC_HEADERS TrackerEventTPCnv LINK_LIBRARIES AthAllocators AthLinks DataModelAthenaPoolLib StoreGateLib AthenaPoolCnvSvcLib AthenaPoolUtilities Identifier GaudiKernel TrackerIdentifier TrackerPrepRawData + TrackerRIO_OnTrack TrkEventTPCnv TrkPrepRawData TrkSpacePoint diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerEventTPCnvDict.h b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerEventTPCnvDict.h index 11d25251977fdc838dc3bc87499772ed5c98a3b7..1407bd063facddcf4166d72b55c2ce5389adb072 100644 --- a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerEventTPCnvDict.h +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerEventTPCnvDict.h @@ -12,7 +12,7 @@ //----------------------------------------------------------------------------- // #include "InDetEventTPCnv/InDetTrack_tlp1.h" -// #include "InDetEventTPCnv/InDetTrack_tlp2.h" +#include "TrackerEventTPCnv/TrackerTrack_tlp2.h" // #include "InDetEventTPCnv/PixelClusterContainer_tlp1.h" #include "TrackerEventTPCnv/TrackerPrepRawData/TrackerCluster_p1.h" #include "TrackerEventTPCnv/TrackerPrepRawData/TrackerPRD_Collection_p1.h" @@ -33,6 +33,8 @@ // #include "InDetEventTPCnv/TRT_DriftCircleContainer_tlp1.h" // #include "InDetEventTPCnv/InDetPrepRawData/PixelGangedClusterAmbiguities_p1.h" // #include "InDetEventTPCnv/TRT_DriftCircleContainer_tlp1.h" +#include "TrackerEventTPCnv/TrackerRIO_OnTrack/SiClusterOnTrack_p1.h" +#include "TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack_p2.h" // #include "InDetEventTPCnv/InDetCompetingRIOsOnTrack/CompetingPixelClustersOnTrack_p1.h" // #include "InDetEventTPCnv/InDetCompetingRIOsOnTrack/CompetingSCT_ClustersOnTrack_p1.h" // #include "InDetEventTPCnv/InDetCompetingRIOsOnTrack/CompetingTRT_DriftCirclesOnTrack_p1.h" @@ -55,6 +57,8 @@ namespace TrackerEventTPCnvDict { // std::vector< InDet::TRT_DriftCircle_p2 > m_v6a; std::vector< Tracker::TrackerPRD_Collection_p1 > m_v7; std::vector< Tracker::TrackerPRD_Container_p1 > m_v8; + std::vector< Tracker::SiClusterOnTrack_p1 > m_v9; + std::vector< Tracker::FaserSCT_ClusterOnTrack_p2 > m_10; // std::vector< InDet::CompetingPixelClustersOnTrack_p1> m_v9; // std::vector< InDet::CompetingSCT_ClustersOnTrack_p1> m_v10; // std::vector< InDet::CompetingTRT_DriftCirclesOnTrack_p1> m_v11; diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrackCnv_p2.h b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrackCnv_p2.h new file mode 100644 index 0000000000000000000000000000000000000000..7b6b1b19d81a9bbdffa7fc728352e65d6b00beee --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrackCnv_p2.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_CLUSTER_ON_TRACK_CNV_p2_H +#define FASERSCT_CLUSTER_ON_TRACK_CNV_p2_H + +#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h" +#include "TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack_p2.h" + +#include "DataModelAthenaPool/ElementLinkCnv_p1.h" +#include "AthLinks/ElementLink.h" +#include "TrackerPrepRawData/FaserSCT_ClusterContainer.h" + +#include "TrkEventTPCnv/TrkEventPrimitives/ErrorMatrixCnv_p1.h" +#include "TrkEventTPCnv/TrkEventPrimitives/LocalParametersCnv_p1.h" + +#include "GaudiKernel/ToolHandle.h" +#include "TrkEventCnvTools/IEventCnvSuperTool.h" + +class MsgStream; + +class FaserSCT_ClusterOnTrackCnv_p2 : public T_AthenaPoolTPPolyCnvBase< Trk::MeasurementBase, Tracker::FaserSCT_ClusterOnTrack, Tracker::FaserSCT_ClusterOnTrack_p2 >{ +public: + FaserSCT_ClusterOnTrackCnv_p2(): m_eventCnvTool("Trk::EventCnvSuperTool/EventCnvSuperTool"), + m_localParCnv(0), m_errorMxCnv(0) {} + + void persToTrans( const Tracker::FaserSCT_ClusterOnTrack_p2 *persObj, Tracker::FaserSCT_ClusterOnTrack *transObj, MsgStream &log ); + void transToPers( const Tracker::FaserSCT_ClusterOnTrack *transObj, Tracker::FaserSCT_ClusterOnTrack_p2 *persObj, MsgStream &log ); + +protected: + ToolHandle<Trk::IEventCnvSuperTool> m_eventCnvTool; + ElementLinkCnv_p1< ElementLinkToTrackerCFaserSCT_ClusterContainer > m_elCnv; + LocalParametersCnv_p1* m_localParCnv; + ErrorMatrixCnv_p1* m_errorMxCnv; +}; + +#endif diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack_p2.h b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack_p2.h new file mode 100644 index 0000000000000000000000000000000000000000..b706a61226c6a75d07d9947135e5d087f9291b62 --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack_p2.h @@ -0,0 +1,34 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_CLUSTER_ON_TRACK_p2_TRK_H +#define FASERSCT_CLUSTER_ON_TRACK_p2_TRK_H + +#include "AthenaPoolUtilities/TPObjRef.h" +#include "Identifier/IdentifierHash.h" +#include "DataModelAthenaPool/ElementLink_p1.h" + +namespace Tracker +{ + class FaserSCT_ClusterOnTrack_p2 + { + public: + FaserSCT_ClusterOnTrack_p2():m_id{0}, m_idDE{0}, m_isbroad(false), m_positionAlongStrip{0.} {} + + + unsigned long long m_id; + TPObjRef m_localParams; + TPObjRef m_localErrMat; + + IdentifierHash::value_type m_idDE; + bool m_isbroad; + + ElementLinkInt_p1 m_prdLink; + +//element allowing for a calculation of global position + float m_positionAlongStrip; + }; +} + +#endif diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/SiClusterOnTrackCnv_p1.h b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/SiClusterOnTrackCnv_p1.h new file mode 100644 index 0000000000000000000000000000000000000000..1854137194419e54e9b78784d8f05656ed651eb0 --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/SiClusterOnTrackCnv_p1.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef SI_CLUSTER_ON_TRACK_CNV_P1_H +#define SI_CLUSTER_ON_TRACK_CNV_P1_H + +//----------------------------------------------------------------------------- +// +// file: SiClusterOnTrackCnv_p1.h +// +//----------------------------------------------------------------------------- + +#include "TrackerRIO_OnTrack/SiClusterOnTrack.h" +#include "TrackerEventTPCnv/TrackerRIO_OnTrack/SiClusterOnTrack_p1.h" + +#include "TrkEventTPCnv/TrkRIO_OnTrack/RIO_OnTrackCnv_p1.h" + +class MsgStream; + +class SiClusterOnTrackCnv_p1 + : public T_AthenaPoolTPAbstractPolyCnvBase< Trk::MeasurementBase, + Tracker::SiClusterOnTrack, + Tracker::SiClusterOnTrack_p1 > +{ +public: + SiClusterOnTrackCnv_p1() : m_RIOCnv(0) {} + + void persToTrans( const Tracker::SiClusterOnTrack_p1 *persObj, + Tracker::SiClusterOnTrack *transObj, + MsgStream &log ); + void transToPers( const Tracker::SiClusterOnTrack *transObj, + Tracker::SiClusterOnTrack_p1 *persObj, + MsgStream &log ); + + +protected: + RIO_OnTrackCnv_p1 *m_RIOCnv; +}; + +#endif // SI_CLUSTER_ON_TRACK_CNV_P1_H diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/SiClusterOnTrack_p1.h b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/SiClusterOnTrack_p1.h new file mode 100644 index 0000000000000000000000000000000000000000..4a149d94bd24f7ce0986812fd817deedba9eb6f1 --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerRIO_OnTrack/SiClusterOnTrack_p1.h @@ -0,0 +1,31 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef SI_CLUSTER_ON_TRACK_P1_TRK_H +#define SI_CLUSTER_ON_TRACK_P1_TRK_H + +//----------------------------------------------------------------------------- +// +// file: SiClusterOnTrack_p1.h +// +//----------------------------------------------------------------------------- + +#include "AthenaPoolUtilities/TPObjRef.h" + +#include "Identifier/IdentifierHash.h" + +namespace Tracker +{ + class SiClusterOnTrack_p1 { + public: + SiClusterOnTrack_p1():m_idDE{},m_isbroad(false) {} + + // base RIO_OnTrack_p1 + TPObjRef m_RIO; + IdentifierHash::value_type m_idDE; + bool m_isbroad; + }; +} + +#endif // SI_CLUSTER_ON_TRACK_P1_TRK_H diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerTrackCnv_tlp2.h b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerTrackCnv_tlp2.h new file mode 100644 index 0000000000000000000000000000000000000000..b8ba7264574a798f77eeff99760b05ccbad7c03c --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerTrackCnv_tlp2.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACKER_TRACKCNV_tlp2_H +#define TRACKER_TRACKCNV_tlp2_H + + +#include "AthenaPoolCnvSvc/AthenaPoolTopLevelExtTPConverter.h" + +#include "TrackerTrack_tlp2.h" + +// #include "TrackerEventTPCnv/InDetRIO_OnTrack/PixelClusterOnTrackCnv_p2.h" +#include "TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrackCnv_p2.h" +// #include "InDetEventTPCnv/InDetRIO_OnTrack/SiClusterOnTrackCnv_p2.h" +// #include "InDetEventTPCnv/InDetRIO_OnTrack/TRT_DriftCircleOnTrackCnv_p2.h" + +// #include "InDetEventTPCnv/InDetCompetingRIOsOnTrack/CompetingPixelClustersOnTrackCnv_p1.h" +// #include "InDetEventTPCnv/InDetCompetingRIOsOnTrack/CompetingSCT_ClustersOnTrackCnv_p1.h" +// #include "InDetEventTPCnv/InDetCompetingRIOsOnTrack/CompetingTRT_DriftCirclesOnTrackCnv_p1.h" + +#include <iostream> + +class TrackerTrackCnv_tlp2 + : public AthenaPoolTopLevelExtTPConverter< Tracker::Track_tlp2 > +{ +public: + + TrackerTrackCnv_tlp2(); + virtual ~TrackerTrackCnv_tlp2() {} + + virtual unsigned short getConverterID() { return 1; } + + virtual void setPStorage( Tracker::Track_tlp2 *storage ); + +protected: + // PixelClusterOnTrackCnv_p2 m_pixelClustersOTCnv; + FaserSCT_ClusterOnTrackCnv_p2 m_sctClustersOTCnv; + // TRT_DriftCircleOnTrackCnv_p2 m_trtDriftCirclesOTCnv; + // SiClusterOnTrackCnv_p2 m_siClustersOTCnv; + + // CompetingPixelClustersOnTrackCnv_p1 m_pixelCrotCnv; + // CompetingSCT_ClustersOnTrackCnv_p1 m_sctCrotCnv; + // CompetingTRT_DriftCirclesOnTrackCnv_p1 m_trtCrotCnv; + + +}; + + +#endif + + diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerTrack_tlp2.h b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerTrack_tlp2.h new file mode 100644 index 0000000000000000000000000000000000000000..242e2ab4ceeb6d2b00b9560a504a22f87d3b8363 --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/TrackerTrack_tlp2.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACKER_TRACK_tlp2_H +#define TRACKER_TRACK_tlp2_H + + + +//----------------------------------------------------------------------------- +// TrackerRIO_OnTrack +//----------------------------------------------------------------------------- +// #include "TrackerEventTPCnv/InDetRIO_OnTrack/TRT_DriftCircleOnTrack_p2.h" +// #include "TrackerEventTPCnv/InDetRIO_OnTrack/PixelClusterOnTrack_p2.h" +#include "TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack_p2.h" + + +// Tracker cROTS + +// #include "InDetEventTPCnv/InDetCompetingRIOsOnTrack/CompetingPixelClustersOnTrack_p1.h" +// #include "InDetEventTPCnv/InDetCompetingRIOsOnTrack/CompetingSCT_ClustersOnTrack_p1.h" +// #include "InDetEventTPCnv/InDetCompetingRIOsOnTrack/CompetingTRT_DriftCirclesOnTrack_p1.h" + +namespace Tracker +{ + class Track_tlp2 + { + public: + Track_tlp2() {} + + // std::vector< InDet::PixelClusterOnTrack_p2 > m_pixelClustersOT; + std::vector< Tracker::FaserSCT_ClusterOnTrack_p2 > m_sctClustersOT; + // std::vector< InDet::TRT_DriftCircleOnTrack_p2 > m_trtDriftCirclesOT; + // std::vector< InDet::CompetingPixelClustersOnTrack_p1> m_pixelCROTs; + // std::vector< InDet::CompetingSCT_ClustersOnTrack_p1> m_sctCROTs; + // std::vector< InDet::CompetingTRT_DriftCirclesOnTrack_p1> m_trtCROTs; + }; +} + +#endif \ No newline at end of file diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/selection.xml b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/selection.xml index d74ef582b72ea1988e8d188b92ada957340df1d5..efe77176618dbe588024e7bd8df2dcde8867e08d 100644 --- a/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/selection.xml +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/TrackerEventTPCnv/selection.xml @@ -1,11 +1,12 @@ <lcgdict> - <!-- <class name="InDet::Track_tlp1" id="8380F7AC-4A8F-4382-95A5-1234E43D3B08" /> - <class name="InDet::Track_tlp2" id="4E3778E2-1497-4F10-8746-AA02319FAC83" /> - --> + <!-- <class name="InDet::Track_tlp1" id="8380F7AC-4A8F-4382-95A5-1234E43D3B08" /> --> + <!-- <class name="Tracker::Track_tlp2" id="4E3778E2-1497-4F10-8746-AA02319FAC83" /> --> + <class name="Tracker::Track_tlp2" id="27491695-F64A-43EE-859D-73F33AF3317D" /> + <!-- InDetRIO_OnTrack --> - <!-- <class name="InDet::SiClusterOnTrack_p1" /> - <class name="std::vector<InDet::SiClusterOnTrack_p1>" /> --> + <class name="Tracker::SiClusterOnTrack_p1" /> + <class name="std::vector<Tracker::SiClusterOnTrack_p1>" /> <!-- <class name="InDet::SiClusterOnTrack_p2" /> --> <!-- <class name="std::vector<InDet::SiClusterOnTrack_p2>" /> --> <!-- <class name="InDet::PixelClusterOnTrack_p1" /> @@ -13,9 +14,10 @@ <class name="InDet::PixelClusterOnTrack_p2" /> <class name="std::vector<InDet::PixelClusterOnTrack_p2>" /> <class name="InDet::SCT_ClusterOnTrack_p1" /> - <class name="std::vector<InDet::SCT_ClusterOnTrack_p1>" /> - <class name="InDet::SCT_ClusterOnTrack_p2" /> - <class name="std::vector<InDet::SCT_ClusterOnTrack_p2>" /> + <class name="std::vector<InDet::SCT_ClusterOnTrack_p1>" /> --> + <class name="Tracker::FaserSCT_ClusterOnTrack_p2" /> + <class name="std::vector<Tracker::FaserSCT_ClusterOnTrack_p2>" /> + <!-- <class name="InDet::TRT_DriftCircleOnTrack_p1" /> <class name="std::vector<InDet::TRT_DriftCircleOnTrack_p1>" /> <class name="InDet::TRT_DriftCircleOnTrack_p2" /> diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrackCnv_p2.cxx b/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrackCnv_p2.cxx new file mode 100644 index 0000000000000000000000000000000000000000..2a0c03a03cceea1a63edd0e0d66957362f312891 --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrackCnv_p2.cxx @@ -0,0 +1,73 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrackerEventTPCnv/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrackCnv_p2.h" + +#include "AthLinks/ElementLink.h" +#include "Identifier/Identifier.h" +#include "TrackerPrepRawData/FaserSCT_ClusterContainer.h" +#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h" +#include "TrkEventTPCnv/helpers/EigenHelpers.h" + +void FaserSCT_ClusterOnTrackCnv_p2::persToTrans( const Tracker::FaserSCT_ClusterOnTrack_p2 *persObj, Tracker::FaserSCT_ClusterOnTrack *transObj, MsgStream &log ) { + + ElementLinkToTrackerCFaserSCT_ClusterContainer rio; + m_elCnv.persToTrans(&persObj->m_prdLink,&rio,log); + + Trk::LocalParameters localParams; + fillTransFromPStore( &m_localParCnv, persObj->m_localParams, &localParams, log ); + + Trk::ErrorMatrix dummy; + Amg::MatrixX localCovariance; + fillTransFromPStore( &m_errorMxCnv, persObj->m_localErrMat, &dummy, log ); + EigenHelpers::vectorToEigenMatrix(dummy.values, localCovariance, "FaserSCT_ClusterOnTrackCnv_p2"); + + // When reading in 32-bit id, must cast to unsigned int + const Identifier::value_type upper = 0XFFFFFFFF00000000LL; + const Identifier::value_type lower = 0X00000000FFFFFFFFLL; + const Identifier::value_type testUpper = persObj->m_id & upper; + const Identifier::value_type testLower = persObj->m_id & lower; + Identifier id; + if ( testUpper == 0 && testLower > 0) { + Identifier32::value_type id1 = persObj->m_id; + id = id1; + } else { + id = persObj->m_id; + } + + *transObj = Tracker::FaserSCT_ClusterOnTrack (rio, + localParams, + localCovariance, + persObj->m_idDE, + id, + persObj->m_isbroad, + persObj->m_positionAlongStrip); + + // Attempt to call supertool to fill in detElements + m_eventCnvTool->recreateRIO_OnTrack(transObj); + if (transObj->detectorElement()==0) { + log << MSG::WARNING<<"Unable to reset DetEl for this RIO_OnTrack, " + << "probably because of a problem with the Identifier/IdentifierHash : (" + << transObj->identify()<<"/"<<transObj->idDE()<<endmsg; + } +} + +void FaserSCT_ClusterOnTrackCnv_p2::transToPers(const Tracker::FaserSCT_ClusterOnTrack* transObj, Tracker::FaserSCT_ClusterOnTrack_p2* persObj, MsgStream& log) { + if (transObj==nullptr or persObj==nullptr) return; + + persObj->m_id = transObj->identify().get_compact(); + persObj->m_localParams = toPersistent( &m_localParCnv, &transObj->localParameters(), log ); + Trk::ErrorMatrix pMat; + EigenHelpers::eigenMatrixToVector(pMat.values, transObj->localCovariance(), "FaserSCT_ClusterOnTrackCnv_p2"); + persObj->m_localErrMat = toPersistent( &m_errorMxCnv, &pMat, log ); + persObj->m_idDE = transObj->idDE(); + persObj->m_isbroad = transObj->isBroadCluster(); + persObj->m_positionAlongStrip = static_cast<float>(transObj->positionAlongStrip()); + + static const SG::InitializedReadHandleKey<Tracker::FaserSCT_ClusterContainer> sctClusContName ("FaserSCT_Clusters"); + ElementLink<Tracker::FaserSCT_ClusterContainer>::index_type hashAndIndex{0}; + bool isFound{m_eventCnvTool->getHashAndIndex<Tracker::FaserSCT_ClusterContainer, Tracker::FaserSCT_ClusterOnTrack>(transObj, sctClusContName, hashAndIndex)}; + persObj->m_prdLink.m_contName = (isFound ? sctClusContName.key() : ""); + persObj->m_prdLink.m_elementIndex = hashAndIndex; +} diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerRIO_OnTrack/SiClusterOnTrackCnv_p1.cxx b/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerRIO_OnTrack/SiClusterOnTrackCnv_p1.cxx new file mode 100644 index 0000000000000000000000000000000000000000..8193f73a0ba11abdc9b1613171f60c00bab15db8 --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerRIO_OnTrack/SiClusterOnTrackCnv_p1.cxx @@ -0,0 +1,38 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +//----------------------------------------------------------------------------- +// +// file: SiClusterOnTrackCnv_p1.cxx +// +//----------------------------------------------------------------------------- + +#include "TrackerRIO_OnTrack/SiClusterOnTrack.h" +#include "TrackerEventTPCnv/TrackerRIO_OnTrack/SiClusterOnTrackCnv_p1.h" +//#include "TrkEventTPCnv/helpers/CLHEPHelpers.h" +//#include "CLHEP/Geometry/Point3D.h" + + +void SiClusterOnTrackCnv_p1:: +persToTrans( const Tracker::SiClusterOnTrack_p1 *persObj, + Tracker::SiClusterOnTrack *transObj, + MsgStream &log ) +{ + transObj->m_idDE = persObj->m_idDE; + transObj->m_isbroad = persObj->m_isbroad; + fillTransFromPStore( &m_RIOCnv, persObj->m_RIO, transObj, log ); + // m_globalPosition - transient? +} + + +void SiClusterOnTrackCnv_p1:: +transToPers( const Tracker::SiClusterOnTrack *transObj, + Tracker::SiClusterOnTrack_p1 *persObj, + MsgStream &log) +{ + persObj->m_RIO = baseToPersistent( &m_RIOCnv, transObj, log ); + persObj->m_idDE = transObj->m_idDE; + persObj->m_isbroad = transObj->m_isbroad; + // m_globalPosition - transient? +} diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerTrkCnv_tlp2.cxx b/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerTrkCnv_tlp2.cxx new file mode 100644 index 0000000000000000000000000000000000000000..f9c2e3e11ab2bb9eda7b37cb182473613e515dcd --- /dev/null +++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerTrkCnv_tlp2.cxx @@ -0,0 +1,35 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrackerEventTPCnv/TrackerTrackCnv_tlp2.h" + + +TrackerTrackCnv_tlp2::TrackerTrackCnv_tlp2() +{ + // Add all converters defined in this top level converter: + // never change the order of adding converters! +// addTPConverter( &m_pixelClustersOTCnv ); + addTPConverter( &m_sctClustersOTCnv ); +// addTPConverter( &m_trtDriftCirclesOTCnv ); + +// addTPConverter( &m_pixelCrotCnv ); +// addTPConverter( &m_sctCrotCnv ); +// addTPConverter( &m_trtCrotCnv ); + +} + + + +void TrackerTrackCnv_tlp2::setPStorage( Tracker::Track_tlp2 *storage ) +{ +// m_pixelClustersOTCnv. setPStorage( &storage->m_pixelClustersOT ); + m_sctClustersOTCnv. setPStorage( &storage->m_sctClustersOT ); +// m_trtDriftCirclesOTCnv. setPStorage( &storage->m_trtDriftCirclesOT ); + +// m_pixelCrotCnv. setPStorage( &storage->m_pixelCROTs ); +// m_sctCrotCnv. setPStorage( &storage->m_sctCROTs ); +// m_trtCrotCnv. setPStorage( &storage->m_trtCROTs ); + +} + diff --git a/Tracker/TrackerRecAlgs/TrackerClusterFit/CMakeLists.txt b/Tracker/TrackerRecAlgs/TrackerClusterFit/CMakeLists.txt index 254b5a4054a316406c3d065f4546d80e0b4a8bbd..6275abd108cb7cf1fc17993aea1575c511e97edc 100644 --- a/Tracker/TrackerRecAlgs/TrackerClusterFit/CMakeLists.txt +++ b/Tracker/TrackerRecAlgs/TrackerClusterFit/CMakeLists.txt @@ -14,7 +14,7 @@ atlas_add_component( TrackerClusterFit src/components/*.cxx INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS} LINK_LIBRARIES ${EIGEN_LIBRARIES} AthenaBaseComps AthViews StoreGateLib SGtests Identifier GaudiKernel TrackerRawData TrackerPrepRawData FaserDetDescr TrackerIdentifier TrackerReadoutGeometry xAODFaserTrigger - TrkTrack TrkEventPrimitives TrkRIO_OnTrack ) + TrkTrack TrkEventPrimitives TrackerRIO_OnTrack TrkRIO_OnTrack TrackerEventTPCnv ) # Install files from the package: #atlas_install_headers( TrackerPrepRawDataFormation ) diff --git a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx index 8fe463790db2b8e474b911f3fa520f2e257234d0..ab88bf504ec140e847eaed5e39eee664943ad164 100644 --- a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx +++ b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx @@ -11,6 +11,7 @@ #include "ClusterFitAlg.h" #include "TrackerPrepRawData/FaserSCT_Cluster.h" +#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h" #include "FaserDetDescr/FaserDetectorID.h" #include "TrackerIdentifier/FaserSCT_ID.h" #include "TrkEventPrimitives/FitQuality.h" @@ -412,15 +413,17 @@ ClusterFitAlg::GetState( const Eigen::Matrix< double, 4, 1 >& fitResult, covPar5->block<4,4>(0,0) = covPar; covPar5->block<1,1>(4,4) = Eigen::Matrix< double, 1, 1 > { (50000.0)*qoverp*qoverp }; - // Trk::RIO_OnTrack* rot = nullptr; - // if (fitCluster != nullptr) - // { - // rot = new Trk::RIO_OnTrack{ Trk::LocalParameters { Trk::DefinedParameter { fitCluster->localPosition()[0], Trk::loc1 }, - // Trk::DefinedParameter { fitCluster->localPosition()[1], Trk::loc2 } }, - // fitCluster->localCovariance(), fitCluster->identify()}; - // } + FaserSCT_ClusterOnTrack* rot = nullptr; + if (fitCluster != nullptr) + { + rot = new FaserSCT_ClusterOnTrack{ fitCluster, + Trk::LocalParameters { Trk::DefinedParameter { fitCluster->localPosition()[0], Trk::loc1 }, + Trk::DefinedParameter { fitCluster->localPosition()[1], Trk::loc2 } }, + fitCluster->localCovariance(), + m_idHelper->wafer_hash(fitCluster->detectorElement()->identify())}; + } std::unique_ptr<Trk::TrackParameters> p { new Trk::CurvilinearParameters { pos, phi, theta, qoverp, covPar5.release() } }; - return new Trk::TrackStateOnSurface { nullptr, p.release() }; + return new Trk::TrackStateOnSurface { rot, p.release() }; } std::tuple<Eigen::Matrix<double, 4, 1>, diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/CMakeLists.txt b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..8a50a1048037209c13b4f884aef878c587ea46f6 --- /dev/null +++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS and FASER collaborations + +# Declare the package name: +atlas_subdir( TrackerRIO_OnTrack ) + +# Component(s) in the package: +atlas_add_library( TrackerRIO_OnTrack + src/*.cxx + PUBLIC_HEADERS TrackerRIO_OnTrack + LINK_LIBRARIES AthLinks AthenaKernel CxxUtils Identifier GaudiKernel TrackerPrepRawData TrkEventPrimitives TrkRIO_OnTrack + PRIVATE_LINK_LIBRARIES TrackerIdentifier TrackerReadoutGeometry TrkSurfaces ) + +atlas_add_dictionary( TrackerRIO_OnTrackDict + TrackerRIO_OnTrack/TrackerRIO_OnTrackDict.h + TrackerRIO_OnTrack/selection.xml + LINK_LIBRARIES TrackerRIO_OnTrack ) diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/ATLAS_CHECK_THREAD_SAFETY b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/ATLAS_CHECK_THREAD_SAFETY new file mode 100644 index 0000000000000000000000000000000000000000..e58e92a4b5b3104324727d70f9343be25b4491d0 --- /dev/null +++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/ATLAS_CHECK_THREAD_SAFETY @@ -0,0 +1 @@ +Tracker/TrackerRecEvent/TrackerRIO_OnTrack \ No newline at end of file diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h new file mode 100644 index 0000000000000000000000000000000000000000..b338eb95d263f51afa2b01fcd2ee4829bd775080 --- /dev/null +++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h @@ -0,0 +1,199 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// FaserSCT_ClusterOnTrack.h, (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERRIO_ONTRACK_FASERSCTCLUSTERONTRACK_H +#define TRACKERRIO_ONTRACK_FASERSCTCLUSTERONTRACK_H + +// Base classes +#include "TrackerRIO_OnTrack/SiClusterOnTrack.h" + +// for ElementLink to IdentifiableContainer SCT_ClusterContainer +#include "TrackerPrepRawData/FaserSCT_ClusterContainer.h" +#include "AthLinks/ElementLink.h" + + +class FaserSCT_Cluster; + +namespace Trk { + class Surface; + class LocalParameters; + class TrkDetElementBase; + class ITrkEventCnvTool; +} + +namespace TrackerDD { + class SiDetectorElement; +} + +typedef ElementLink<Tracker::FaserSCT_ClusterContainer> ElementLinkToTrackerCFaserSCT_ClusterContainer; + +namespace Tracker{ + + /**@class FaserSCT_ClusterOnTrack + Specific class to represent the SCT measurements. + It does not currently extend the interface of Tracker::SiClusterOnTrack. + + @author Veronique.Boisvert@cern.ch, Edward.Moyse@cern.ch, Andreas.Salzburger@cern.ch, dcasper@uci.edu + */ + class FaserSCT_ClusterOnTrack final : public SiClusterOnTrack { + + public: + friend class Trk::ITrkEventCnvTool; + /**For POOL only. Do not use*/ + FaserSCT_ClusterOnTrack(); + /**Copy constructor*/ + FaserSCT_ClusterOnTrack(const FaserSCT_ClusterOnTrack &) = default; + + /** Constructor with parameters : + RIO/PrepRawData pointer, LocalPosition*, LocalErrorMatrix*, idDE& + The base class owns local position, error matrix, this class owns global pos. + Everything else is owned elsewhere. */ + FaserSCT_ClusterOnTrack( const Tracker::FaserSCT_Cluster* RIO, + const Trk::LocalParameters* locpars, + const Amg::MatrixX* locerr, + const IdentifierHash& idDE, + bool isbroad=false); + + /** Constructor with parameters : + RIO/PrepRawData pointer, LocalPosition*, LocalErrorMatrix*, idDE&, + Global Position + The base class owns local position, error matrix, this class owns global pos. + Everything else is owned elsewhere. */ + FaserSCT_ClusterOnTrack( const Tracker::FaserSCT_Cluster* RIO, + const Trk::LocalParameters* locpars, + const Amg::MatrixX* locerr, + const IdentifierHash& idDE, + const Amg::Vector3D& globalPosition, + bool isbroad=false); + + /** Constructor with parameters : + RIO/PrepRawData pointer, LocalPosition*, LocalErrorMatrix*, idDE& + The base class owns local position, error matrix, this class owns global pos. + Everything else is owned elsewhere. */ + FaserSCT_ClusterOnTrack( const Tracker::FaserSCT_Cluster* RIO, + const Trk::LocalParameters& locpars, + const Amg::MatrixX& locerr, + const IdentifierHash& idDE, + bool isbroad=false); + + /** Constructor with parameters : + RIO/PrepRawData pointer, LocalPosition*, LocalErrorMatrix*, idDE&, + Global Position + The base class owns local position, error matrix, this class owns global pos. + Everything else is owned elsewhere. */ + FaserSCT_ClusterOnTrack( const Tracker::FaserSCT_Cluster* RIO, + const Trk::LocalParameters& locpars, + const Amg::MatrixX& locerr, + const IdentifierHash& idDE, + const Amg::Vector3D& globalPosition, + bool isbroad=false); + + /* + * Constuctor used by P->T converter. + * The P->T converter calls the + * setValues method to complete the object + * e.g set/reset the DetectorElement + */ + FaserSCT_ClusterOnTrack( const ElementLinkToTrackerCFaserSCT_ClusterContainer& RIO, + const Trk::LocalParameters& locpars, + const Amg::MatrixX& locerr, + IdentifierHash idDE, + const Identifier& id, + bool isbroad, + double positionAlongStrip); + + /**Assignment operator*/ + FaserSCT_ClusterOnTrack &operator=(const FaserSCT_ClusterOnTrack &) = default; + /**Default move assigment operator*/ + FaserSCT_ClusterOnTrack &operator=(FaserSCT_ClusterOnTrack &&) = default; + + /** Destructor */ + virtual ~FaserSCT_ClusterOnTrack() = default; + + /** Pseudo-constructor */ + virtual FaserSCT_ClusterOnTrack* clone() const override final; + + /** returns the surface for the local to global transformation + - fullfills the Trk::MeasurementBase interface + */ + virtual const Trk::Surface& associatedSurface() const override final; + + virtual bool rioType(Trk::RIO_OnTrackType::Type type) const override final + { + return (type == Trk::RIO_OnTrackType::SCTCluster); + } + + + /** returns the PrepRawData - is a SCT_Cluster in this scope + - fullfills the Trk::RIO_OnTrack interface + */ + virtual const Tracker::FaserSCT_Cluster* prepRawData() const override final; + + const ElementLinkToTrackerCFaserSCT_ClusterContainer& prepRawDataLink() const; + + + /** returns the detector element, assoicated with the PRD of this class + - fullfills the Trk::RIO_OnTrack interface + */ + virtual const TrackerDD::SiDetectorElement* detectorElement() const override final; + + /**returns some information about this RIO_OnTrack.*/ + virtual MsgStream& dump( MsgStream& out ) const override final; + + /**returns some information about this RIO_OnTrack.*/ + virtual std::ostream& dump( std::ostream& out ) const override final; + + double positionAlongStrip() const; + + private: + /** ONLY for use in custom convertor + Allows the custom convertor to reset values when persistying/reading + back RoTs*/ + virtual void setValues(const Trk::TrkDetElementBase* detEl, + const Trk::PrepRawData* prd) override final; + + /** SCT_Cluster - the RIO (PRD, PrepRawData)*/ + ElementLinkToTrackerCFaserSCT_ClusterContainer m_rio; + /** corresponding detector element*/ + const TrackerDD::SiDetectorElement* m_detEl; + + double m_positionAlongStrip; + }; + + inline FaserSCT_ClusterOnTrack* FaserSCT_ClusterOnTrack::clone() const + { + return new FaserSCT_ClusterOnTrack(*this); + } + + inline const FaserSCT_Cluster* FaserSCT_ClusterOnTrack::prepRawData() const + { + // somehow one has to ask first if it is valid ... otherwise it always returns 0 ... + if (m_rio.isValid()) return m_rio.cachedElement(); + else return 0; + } + + inline const ElementLinkToTrackerCFaserSCT_ClusterContainer& + FaserSCT_ClusterOnTrack::prepRawDataLink() const + { + return m_rio; + } + + inline const TrackerDD::SiDetectorElement* FaserSCT_ClusterOnTrack::detectorElement() const + { + return m_detEl; + } + + inline double FaserSCT_ClusterOnTrack::positionAlongStrip() const + { + return m_positionAlongStrip; + } + + +}//end of namespace definitions + +#endif // TRACKERRIO_ONTRACK_FASERSCTCLUSTERONTRACK_H diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/SiClusterOnTrack.h b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/SiClusterOnTrack.h new file mode 100644 index 0000000000000000000000000000000000000000..33f5a155d48ec786c60cc75978cdfc6d29221c96 --- /dev/null +++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/SiClusterOnTrack.h @@ -0,0 +1,120 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS and FASER collaborations +*/ + +/////////////////////////////////////////////////////////////////// +// SiClusterOnTrack.h, (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERRIO_ONTRACK_SICLUSTERONTRACK_H +#define TRACKERRIO_ONTRACK_SICLUSTERONTRACK_H + +#include "TrkRIO_OnTrack/RIO_OnTrack.h" +#include "Identifier/IdentifierHash.h" + +class SiClusterOnTrackCnv_p1; + +namespace Trk +{ + class LocalParameters; +} + +namespace TrackerDD +{ + class SiDetectorElement; +} + +namespace Tracker { + + class SiCluster; + + /**@class SiClusterOnTrack + RIO_OnTrack base class for Silicon detector. + + @author Veronique.Boisvert@cern.ch, Edward.Moyse@cern.ch, Andreas.Salzburger@cern.ch, dcasper@uci.edu + */ + class SiClusterOnTrack : public Trk::RIO_OnTrack{ + + + public: + /** Default Constructor - needed for POOL */ + SiClusterOnTrack(); + /** Copy constructor */ + SiClusterOnTrack(const SiClusterOnTrack &); + /** Assignment operator */ + SiClusterOnTrack &operator=(const SiClusterOnTrack &); + + + /** Constructor with parameters : + LocalParameters&, + ErrorMatrix&, + idDE& */ + SiClusterOnTrack(const Trk::LocalParameters& locpos, + const Amg::MatrixX& locerr, + const IdentifierHash& idDE, + const Identifier& id, + bool isbroad=false); + + /** Constructor with parameters : + LocalParameters&, + ErrorMatrix&, + idDE&, + GlobalPosition&, + */ + SiClusterOnTrack( const Trk::LocalParameters& locpos, + const Amg::MatrixX& locerr, + const IdentifierHash& idDE, + const Identifier& id, + const Amg::Vector3D& globalPosition, + bool isbroad=false); + + /** Destructor:*/ + virtual ~SiClusterOnTrack(); + + /** returns global position (gathered through Surface constraint) + - fullfills Trk::MeasurementBase interface */ + virtual const Amg::Vector3D& globalPosition() const override; + + virtual bool rioType(Trk::RIO_OnTrackType::Type type) const override = 0; + + /** returns the DE hashID* + - fullfills Trk::RIO_OnTrack interface*/ + virtual IdentifierHash idDE() const override; + + bool isBroadCluster() const; + + /**returns some information about this RIO_OnTrack. + - fullfills Trk::RIO_OnTrack interface*/ + virtual MsgStream& dump( MsgStream& out ) const override; + + /**returns some information about this RIO_OnTrack. + - fullfills Trk::RIO_OnTrack interface*/ + virtual std::ostream& dump( std::ostream& out ) const override; + + protected: + friend class ::SiClusterOnTrackCnv_p1; + + /** ONLY for use in custom convertor + Allows the custom convertor to reset values when persistying/reading back RoTs*/ + virtual void setValues(const Trk::TrkDetElementBase* detEl, + const Trk::PrepRawData* prd) override = 0; + + /** The IdentifierHash - probably not used*/ + IdentifierHash m_idDE; + /** The global position */ + Amg::Vector3D m_globalPosition; + bool m_isbroad; + }; + + inline IdentifierHash SiClusterOnTrack::idDE() const + { + return m_idDE; + } + + inline bool SiClusterOnTrack::isBroadCluster() const + { + return m_isbroad; + } +} + +#endif // TRACKERRIO_ONTRACK_SICLUSTERONTRACK_H diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/TrackerRIO_OnTrackDict.h b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/TrackerRIO_OnTrackDict.h new file mode 100644 index 0000000000000000000000000000000000000000..4b7df2fb3f2296cf276a7722db113845ce4f0ad0 --- /dev/null +++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/TrackerRIO_OnTrackDict.h @@ -0,0 +1,10 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS and FASER collaborations +*/ + +#ifndef TRACKERRIOONTRACKDICT_H +#define TRACKERRIOONTRACKDICT_H + +#include "TrackerRIO_OnTrack/SiClusterOnTrack.h" +#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h" +#endif diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/selection.xml b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/selection.xml new file mode 100644 index 0000000000000000000000000000000000000000..71aa358ae226df01f3ca69bb48f74a29b45caa81 --- /dev/null +++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/TrackerRIO_OnTrack/selection.xml @@ -0,0 +1,10 @@ +<lcgdict> + <class name="Tracker::SiClusterOnTrack" > + <field name="m_globalPosition" transient="true" /> + </class> + <class name="Tracker::FaserSCT_ClusterOnTrack" > + <field name="m_detEl" transient="true" /> + <field name="m_rio" transient="true" /> + </class> + <class name="TrackerDD::SiDetectorElement" /> + </lcgdict> diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx new file mode 100644 index 0000000000000000000000000000000000000000..7964343741c0dadc9818b4792a8d17e56fe04d33 --- /dev/null +++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx @@ -0,0 +1,111 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS and FASER collaborations +*/ + +/////////////////////////////////////////////////////////////////// +// FaserSCT_ClusterOnTrack.cxx, (c) ATLAS Detector Software +/////////////////////////////////////////////////////////////////// + +#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h" +#include "TrackerReadoutGeometry/SiDetectorElement.h" +#include "TrackerPrepRawData/FaserSCT_Cluster.h" + +#include "GaudiKernel/MsgStream.h" +#include <ostream> +#include <limits> + + +// Constructor with parameters - no global position assigned +Tracker::FaserSCT_ClusterOnTrack::FaserSCT_ClusterOnTrack(const Tracker::FaserSCT_Cluster* RIO, + const Trk::LocalParameters& locpars, + const Amg::MatrixX& locerr, + const IdentifierHash& idDE, + bool isbroad) : + SiClusterOnTrack(locpars, locerr, idDE, RIO->identify(),isbroad) //call base class constructor +{ + m_detEl=RIO->detectorElement(); + m_positionAlongStrip=std::numeric_limits<double>::quiet_NaN(); + m_rio.setElement(RIO); + + // Set global position + Amg::Vector2D lpos(localParameters().get(Trk::locX), m_positionAlongStrip); + m_globalPosition = detectorElement()->surface(identify()).localToGlobalPos(lpos); +} + +// Constructor with parameters +Tracker::FaserSCT_ClusterOnTrack::FaserSCT_ClusterOnTrack(const Tracker::FaserSCT_Cluster* RIO, + const Trk::LocalParameters& locpars, + const Amg::MatrixX& locerr, + const IdentifierHash& idDE, + const Amg::Vector3D& globalPosition, + bool isbroad) : + SiClusterOnTrack(locpars, locerr, idDE, RIO->identify(), globalPosition, isbroad), //call base class constructor + m_detEl( RIO->detectorElement() ) +{ + m_rio.setElement(RIO); + + //constructing local position provided a global one + std::unique_ptr<const Amg::Vector2D> + lpos{detectorElement()->surface( identify() ).positionOnSurface(globalPosition)}; + + //storing the position along the strip if available + m_positionAlongStrip = (lpos) ? (*lpos)[Trk::locY]:0.; + +} + +Tracker::FaserSCT_ClusterOnTrack::FaserSCT_ClusterOnTrack( const ElementLinkToTrackerCFaserSCT_ClusterContainer& RIO, + const Trk::LocalParameters& locpars, + const Amg::MatrixX& locerr, + IdentifierHash idDE, + const Identifier& id, + bool isbroad, + double positionAlongStrip) + : SiClusterOnTrack(locpars, + locerr, + idDE, + id, + isbroad), + m_rio(RIO), + m_detEl(nullptr), + m_positionAlongStrip (positionAlongStrip) +{ +} + + +// Default constructor: +Tracker::FaserSCT_ClusterOnTrack::FaserSCT_ClusterOnTrack(): + SiClusterOnTrack(), + m_rio(), + m_detEl(nullptr), + m_positionAlongStrip(std::numeric_limits<double>::quiet_NaN()) +{} + + +const Trk::Surface& Tracker::FaserSCT_ClusterOnTrack::associatedSurface() const +{ + return ( detectorElement()->surface()); +} + +void Tracker::FaserSCT_ClusterOnTrack::setValues(const Trk::TrkDetElementBase* detEl, const Trk::PrepRawData* ) +{ + m_detEl = dynamic_cast< const TrackerDD::SiDetectorElement* >(detEl); + if (m_detEl) { + // Set global position after setting the detector element + Amg::Vector2D lpos(localParameters().get(Trk::locX), + m_positionAlongStrip); + m_globalPosition = + detectorElement()->surface(identify()).localToGlobalPos(lpos); + } +} + +MsgStream& Tracker::FaserSCT_ClusterOnTrack::dump( MsgStream& sl ) const +{ + SiClusterOnTrack::dump(sl);// use dump(...) from SiClusterOnTrack + return sl; +} + +std::ostream& Tracker::FaserSCT_ClusterOnTrack::dump( std::ostream& sl ) const +{ + SiClusterOnTrack::dump(sl);// use dump(...) from SiClusterOnTrack + return sl; +} diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/SiClusterOnTrack.cxx b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/SiClusterOnTrack.cxx new file mode 100644 index 0000000000000000000000000000000000000000..f11a1f8efc91dda6698b121b98211276bb1ea8c1 --- /dev/null +++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/SiClusterOnTrack.cxx @@ -0,0 +1,121 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS and FASER collaborations +*/ + +/////////////////////////////////////////////////////////////////// +// SiClusterOnTrack.cxx, (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#include "TrackerRIO_OnTrack/SiClusterOnTrack.h" +#include "TrkRIO_OnTrack/RIO_OnTrack.h" +#include "TrkEventPrimitives/LocalParameters.h" +#include "TrkSurfaces/Surface.h" +#include "TrackerPrepRawData/TrackerCluster.h" +#include "GaudiKernel/MsgStream.h" +#include <memory> +#include <new> +#include <ostream> +#include <typeinfo> + + +// Constructor with parameters - global position not specified here +Tracker::SiClusterOnTrack::SiClusterOnTrack( const Trk::LocalParameters& locpars, + const Amg::MatrixX& locerr, + const IdentifierHash& idDE, + const Identifier& id, + bool isbroad) : + RIO_OnTrack(locpars, locerr, id), //call base class constructor + m_idDE(idDE), + m_globalPosition(), // should be set in constructor of derived class + m_isbroad(isbroad) +{} + +// Constructor with parameters - global position specified +Tracker::SiClusterOnTrack::SiClusterOnTrack( const Trk::LocalParameters& locpars, + const Amg::MatrixX& locerr, + const IdentifierHash& idDE, + const Identifier& id, + const Amg::Vector3D& globalPosition, + bool isbroad) + : + RIO_OnTrack(locpars, locerr, id), //call base class constructor + m_idDE(idDE), + m_globalPosition(globalPosition), + m_isbroad(isbroad) +{} + + +// Destructor: +Tracker::SiClusterOnTrack::~SiClusterOnTrack() +{ +} + +// Default constructor: +Tracker::SiClusterOnTrack::SiClusterOnTrack(): + Trk::RIO_OnTrack(), + m_idDE(), + m_globalPosition(), // should be set in constructor of derived class + m_isbroad(false) +{} + +// copy constructor: +Tracker::SiClusterOnTrack::SiClusterOnTrack( const SiClusterOnTrack& rot) + : + RIO_OnTrack(rot), + m_idDE(rot.m_idDE), + m_globalPosition(rot.m_globalPosition), + m_isbroad(rot.m_isbroad) +{} + +// assignment operator: +Tracker::SiClusterOnTrack& Tracker::SiClusterOnTrack::operator=( const SiClusterOnTrack& rot){ + if ( &rot != this) { + Trk::RIO_OnTrack::operator=(rot); + m_idDE = rot.m_idDE; + m_globalPosition = rot.m_globalPosition; + m_isbroad = rot.m_isbroad; + } + return *this; +} + + + + +const Amg::Vector3D& Tracker::SiClusterOnTrack::globalPosition() const +{ + return m_globalPosition; +} + +MsgStream& Tracker::SiClusterOnTrack::dump( MsgStream& sl ) const +{ + + sl << "SiClusterOnTrack {" << endmsg; + Trk::RIO_OnTrack::dump(sl); + + sl << "Global position (x,y,z) = ("; + sl <<this->globalPosition().x()<<", " + <<this->globalPosition().y()<<", " + <<this->globalPosition().z()<<")"<<endmsg; + sl<<"}"<<endmsg; + return sl; +} + +std::ostream& Tracker::SiClusterOnTrack::dump( std::ostream& sl ) const +{ + sl << "SiClusterOnTrack {"<<std::endl; + + Trk::RIO_OnTrack::dump(sl); + + sl << "Global position (x,y,z) = ("; + sl <<this->globalPosition().x()<<", " + <<this->globalPosition().y()<<", " + <<this->globalPosition().z()<<")"<<std::endl; + sl<<"}"<<std::endl; + return sl; +} + + + + + + diff --git a/Tracking/TrkEventCnv/TrkEventAthenaPool/CMakeLists.txt b/Tracking/TrkEventCnv/TrkEventAthenaPool/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..862d3d9b4320d7803028ba06c248c437c22c1a19 --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventAthenaPool/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + +# Declare the package name: +atlas_subdir( TrkEventAthenaPool ) + +# Component(s) in the package: +atlas_add_poolcnv_library( TrkEventAthenaPoolPoolCnv + src/*.h src/*.cxx + FILES TrkSpacePoint/SpacePointCollection.h + TrkSpacePoint/SpacePointContainer.h TrkTrack/TrackCollection.h + LINK_LIBRARIES TrkSpacePoint TrkEventTopLevelCnv TrkEventTPCnv ) + +# Install files from the package: +# atlas_install_joboptions( share/*.py ) diff --git a/Tracking/TrkEventCnv/TrkEventAthenaPool/src/TrackCollectionCnv.cxx b/Tracking/TrkEventCnv/TrkEventAthenaPool/src/TrackCollectionCnv.cxx new file mode 100644 index 0000000000000000000000000000000000000000..828854f3bf42fe6661fc1e2a047cbe579b9c86c6 --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventAthenaPool/src/TrackCollectionCnv.cxx @@ -0,0 +1,141 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +//----------------------------------------------------------------------------- +// +// file: TrackCollectionCnv.cxx +// author: Lukasz Janyst <ljanyst@cern.ch> +// +// Ed's converter rewritten and T/P split stuff added +// +// TODO: MultiComponentTSoS, integrity checking +// +//----------------------------------------------------------------------------- +#include "TrackCollectionCnv.h" + +#include "GaudiKernel/IToolSvc.h" +#include "StoreGate/StoreGateSvc.h" +// #include "AtlasDetDescr/AtlasDetectorID.h" + + +//----------------------------------------------------------------------------- +// Constructor +//----------------------------------------------------------------------------- +TrackCollectionCnv::TrackCollectionCnv(ISvcLocator* svcloc): + TrackCollectionCnvBase(svcloc), + m_msgSvc( msgSvc() ), + m_log( m_msgSvc, "TrackCollectionCnv" ) +{ +} + +//----------------------------------------------------------------------------- +// Initializer +//----------------------------------------------------------------------------- +StatusCode TrackCollectionCnv::initialize() +{ + // leaving empty method for future use + return TrackCollectionCnvBase::initialize(); +} + + +// void TrackCollectionCnv::initializeOldExtConverters() +// { +// if( m_oldExtCnvInitialized ) return; + +// // m_log.setLevel( m_msgSvc->outputLevel() ); +// m_log << MSG::INFO << "TrackCollectionCnv::initializeOldExtConverters()" << endmsg; + +// bool doInDet(true); +// bool doMuon(true); +// bool doCalo(true); + +// IConverter *converter = m_athenaPoolCnvSvc->converter( CLID(17001567) ); +// if(converter != 0) registerExtendingCnv( converter ); +// else doInDet=false; + +// converter = m_athenaPoolCnvSvc->converter( CLID(239128586) ); +// if(converter !=0 ) registerExtendingCnv( converter ); +// else doMuon=false; + +// converter = m_athenaPoolCnvSvc->converter( CLID(1213853277) ); +// if(converter !=0 ) registerExtendingCnv( converter ); +// else doCalo=false; + +// //------------------------------------------------------------------------- +// // We cannot proceed if none of the tools is present +// //------------------------------------------------------------------------- +// if( !doInDet && !doMuon && !doCalo) { +// m_log << MSG::WARNING << "Could not get any of the extending convertors, and so might have problems later on."; +// m_log << endmsg; +// } +// m_oldExtCnvInitialized = true; +// } + + + +TrackCollection_PERS * TrackCollectionCnv::createPersistentWithKey( TrackCollection *transCont, + const std::string& key) +{ + std::string logname = "TrackCollectionCnv"; + if (const DataObject* dObj = getDataObject()) { + logname += dObj->name(); + } + + MsgStream log (m_msgSvc, logname ); + + return m_TPConverter.createPersistentWithKey ( transCont, key, log ); +} + +//----------------------------------------------------------------------------- +// Create transient collection +//----------------------------------------------------------------------------- +TrackCollection *TrackCollectionCnv::createTransientWithKey(const std::string& key) +{ + m_log.setLevel( m_msgSvc->outputLevel() ); + static const pool::Guid p6_guid( "3228B252-2C5D-11E8-B170-0800271C02BC" ); + // static const pool::Guid p5_guid( "436E4996-9D6E-11E3-AD2A-6C3BE51AB9F1" ); + // static const pool::Guid p4_guid( "3BEB819F-6ED2-48F6-9F95-E65E1759E781" ); + // static const pool::Guid p3_guid( "A1E9FDCB-2F4A-4AC8-BF4E-2D70B9C70F8A" ); + // static const pool::Guid p2_guid( "2D8B19DC-DB2E-4F56-BB94-D7C4544D501A" ); + // static const pool::Guid p1_guid( "ECB12567-B999-4908-B0C6-C43CF9F9A987" ); + // static const pool::Guid p0_guid( "70ECEBFC-BE00-46C2-8B35-4CC12D18DE39" ); + + TrackCollection *p_collection = 0; + if( compareClassGuid( p6_guid )){ + poolReadObject< TrackCollection_PERS >( m_TPConverter ); + p_collection = m_TPConverter.createTransientWithKey( key, m_log ); + } + // else if( compareClassGuid( p5_guid )){ + // initializeOldExtConverters(); + // poolReadObject< Trk::TrackCollection_tlp5 >( m_TPConverter_tlp5); + // p_collection = m_TPConverter_tlp5.createTransientWithKey( key, m_log ); + // } + // else if( compareClassGuid( p4_guid )){ + // initializeOldExtConverters(); + // poolReadObject< Trk::TrackCollection_tlp4 >( m_TPConverter_tlp4); + // p_collection = m_TPConverter_tlp4.createTransientWithKey( key, m_log ); + // } + // else if( compareClassGuid( p3_guid )){ + // initializeOldExtConverters(); + // poolReadObject< Trk::TrackCollection_tlp3 >( m_TPConverter_tlp3); + // p_collection = m_TPConverter_tlp3.createTransientWithKey( key, m_log ); + // } + // else if( compareClassGuid( p2_guid ) ) { + // initializeOldExtConverters(); + // poolReadObject< Trk::TrackCollection_tlp2 >( m_TPConverter_tlp2 ); + // p_collection = m_TPConverter_tlp2.createTransientWithKey( key, m_log ); + // } + // else if( compareClassGuid( p1_guid ) ) { + // initializeOldExtConverters(); + // poolReadObject< Trk::TrackCollection_tlp1 >( m_TPConverter_tlp1 ); + // p_collection = m_TPConverter_tlp1.createTransientWithKey( key, m_log ); + // } + // else if( compareClassGuid( p0_guid ) ) { + // p_collection = poolReadObject< TrackCollection >(); + // } + else + throw std::runtime_error( "Unsupported persistent version of Data Collection" ); + return p_collection; +} + diff --git a/Tracking/TrkEventCnv/TrkEventAthenaPool/src/TrackCollectionCnv.h b/Tracking/TrkEventCnv/TrkEventAthenaPool/src/TrackCollectionCnv.h new file mode 100644 index 0000000000000000000000000000000000000000..b6ca22eaddb40d2bc9d01caf71b8f1908cb54648 --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventAthenaPool/src/TrackCollectionCnv.h @@ -0,0 +1,77 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +//----------------------------------------------------------------------------- +// +// file: TrackCollectionCnv.h +// author: Lukasz Janyst <ljanyst@cern.ch> +// +//----------------------------------------------------------------------------- + +#ifndef TRKEVENTATHENAPOOL_TRACKCOLLECTIONCNV_H +#define TRKEVENTATHENAPOOL_TRACKCOLLECTIONCNV_H + +#include "GaudiKernel/MsgStream.h" + +#include "TrkEventCnvTools/ITrkEventCnvTool.h" +#include "FaserDetDescr/FaserDetectorID.h" + +#include "AthenaPoolCnvSvc/T_AthenaPoolCustomCnv.h" +#include "AthenaPoolCnvSvc/AthenaPoolCnvTPExtension.h" + +#include "TrkTrack/TrackCollection.h" + +// #include "TrkEventTPCnv/TrackCollectionCnv_tlp1.h" +// #include "TrkEventTPCnv/TrackCollectionCnv_tlp2.h" +// #include "TrkEventTPCnv/TrackCollectionCnv_tlp3.h" +// #include "TrkEventTPCnv/TrackCollectionCnv_tlp4.h" +// #include "TrkEventTPCnv/TrackCollectionCnv_tlp5.h" +#include "TrkEventTopLevelCnv/TrackCollectionCnv_tlp6.h" + +//----------------------------------------------------------------------------- +// Base class definition - defined which is the to-be-used persistent version +//----------------------------------------------------------------------------- + +typedef Trk::TrackCollection_tlp6 TrackCollection_PERS; + +typedef T_AthenaPoolCustomCnvWithKey<TrackCollection, TrackCollection_PERS> TrackCollectionCnvBase; + +//----------------------------------------------------------------------------- +// Converter for TrackCollection object +//----------------------------------------------------------------------------- +class TrackCollectionCnv + : public TrackCollectionCnvBase, + public AthenaPoolCnvTPExtension +{ +friend class CnvFactory<TrackCollectionCnv>; + +public: + TrackCollectionCnv( ISvcLocator *svcloc ); + +protected: + virtual StatusCode initialize() override; + + virtual TrackCollection_PERS *createPersistentWithKey( TrackCollection *transCont, + const std::string& key) override; + virtual TrackCollection *createTransientWithKey (const std::string& key) override; + + virtual AthenaPoolTopLevelTPCnvBase* getTopLevelTPCnv() override { return & m_TPConverter; } + + +private: +// void initializeOldExtConverters(); //!< setup old extended converters when reading old data + + IMessageSvc* m_msgSvc; + MsgStream m_log; +// bool m_oldExtCnvInitialized = false; + +// TrackCollectionCnv_tlp1 m_TPConverter_tlp1; +// TrackCollectionCnv_tlp2 m_TPConverter_tlp2; +// TrackCollectionCnv_tlp3 m_TPConverter_tlp3; +// TrackCollectionCnv_tlp4 m_TPConverter_tlp4; +// TrackCollectionCnv_tlp5 m_TPConverter_tlp5; + TrackCollectionCnv_tlp6 m_TPConverter; // <- the current one +}; + +#endif // TRKEVENTATHENAPOOL_TRACKCOLLECTIONCNV_H diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/CMakeLists.txt b/Tracking/TrkEventCnv/TrkEventCnvTools/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..56f1041de0f224b514c48eb46341a85b773c81fc --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + +# Declare the package name: +atlas_subdir( TrkEventCnvTools ) + +atlas_add_library( TrkEventCnvToolsLib + TrkEventCnvTools/*.h + INTERFACE + PUBLIC_HEADERS TrkEventCnvTools + LINK_LIBRARIES TrkSurfaces TrkDetDescrUtils TrkParametersBase GeoPrimitives GaudiKernel AthenaBaseComps AthenaPoolUtilities AthLinks StoreGateLib Identifier TrkPrepRawData TrkRIO_OnTrack ) + +# Component(s) in the package: +atlas_add_component( TrkEventCnvTools + src/*.cxx + src/components/*.cxx + LINK_LIBRARIES AthenaBaseComps AthenaPoolUtilities FaserDetDescr GaudiKernel TrkEventCnvToolsLib TrkMeasurementBase TrkRIO_OnTrack TrkSurfaces ) + +# Install files from the package: +atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} ) diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/ATLAS_CHECK_THREAD_SAFETY b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/ATLAS_CHECK_THREAD_SAFETY new file mode 100644 index 0000000000000000000000000000000000000000..c57ea6eb810387a34ccabde5cdf48e8fa532f5ce --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/ATLAS_CHECK_THREAD_SAFETY @@ -0,0 +1,3 @@ + +Tracking/TrkEventCnv/TrkEventCnvTools + diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/DetElementSurface.h b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/DetElementSurface.h new file mode 100644 index 0000000000000000000000000000000000000000..3f734e18539c905ba35dd824b3f61c18dfb0b42d --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/DetElementSurface.h @@ -0,0 +1,111 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRKEVENTCNVTOOLS_DETELEMENTSURFACE_H +#define TRKEVENTCNVTOOLS_DETELEMENTSURFACE_H +#include "TrkSurfaces/Surface.h" +#include "TrkDetDescrUtils/Intersection.h" +#include "TrkSurfaces/RectangleBounds.h" +#include "TrkSurfaces/DistanceSolution.h" +#include "TrkParametersBase/ParametersBase.h" +#include "GeoPrimitives/GeoPrimitives.h" +#include <cstdlib>//for "abort" + +namespace Trk +{ + +/** Dummy class used to allow special convertors to be called for surfaces owned by a detector element. +Only intended for use within the persistency framework.*/ +// template <class SURFACE> +// class DetElementSurface : public SURFACE +// { +// public: +// DetElementSurface( const DetElementSurface& rhs) : SURFACE(rhs) {} +// }; + + +template<int DIM, class T, class S> class ParametersT; + +class DetElementSurface : public Surface +{ + public: + DetElementSurface() : Surface() {} + DetElementSurface(Identifier id) : Surface(), m_id(id) {} + DetElementSurface( const Surface& rhs) : Surface(rhs), m_id(rhs.associatedDetectorElementIdentifier()) {} +// Normally the Surface copy ctor sets the Identifier to be invalid. Store it, to get around this. + bool operator==(const Trk::Surface&) const { return false;} + Surface * clone () const { return nullptr; } + bool insideBounds(const Amg::Vector2D &, double, double) const {return false;} + bool insideBoundsCheck(const Amg::Vector2D& /*locpos*/, const BoundaryCheck& /*bchk*/) const { return false;} + const Amg::Vector3D * localToGlobal (const Amg::Vector2D &) const { return nullptr; } + const Amg::Vector3D * localToGlobal (const LocalParameters &) const { return nullptr; } + const Amg::Vector2D * globalToLocal (const Amg::Vector3D &, const double) const { return nullptr; } + virtual DistanceSolution straightLineDistanceEstimate (const Amg::Vector3D &, const Amg::Vector3D &) const { return DistanceSolution(); } + const SurfaceBounds & bounds () const { std::abort();/*should never be called*/ } + MsgStream & dump (MsgStream &sl) const { return sl;} + std::ostream & dump (std::ostream &sl) const { return sl;}; + const Identifier associatedDetectorElementIdentifier() const {return m_id;} + bool isFree() {return true;}// To avoid memory leaks + Surface::SurfaceType type() const {return Surface::Other;} + void localToGlobal(const Amg::Vector2D&, const Amg::Vector3D&, Amg::Vector3D&) const {} + bool globalToLocal(const Amg::Vector3D&, const Amg::Vector3D&, Amg::Vector2D&) const {return false;} + std::string name() const { return "Trk::DetElementSurface";} + // A dummy method required for consistency of the package and + virtual std::unique_ptr<ParametersBase<5, Trk::Charged>> + createUniqueTrackParameters(double, + double, + double, + double, + double, + AmgSymMatrix(5) *) const + { + return nullptr; + } + virtual std::unique_ptr<ParametersBase<5, Trk::Charged>> + createUniqueTrackParameters(const Amg::Vector3D&, + const Amg::Vector3D&, + double, + AmgSymMatrix(5) *) const + { + return nullptr; + } + + virtual std::unique_ptr<ParametersBase<5, Trk::Neutral>> + createUniqueNeutralParameters(double, + double, + double, + double, + double, + AmgSymMatrix(5) *) const + { + return nullptr; + } + virtual std::unique_ptr<ParametersBase<5, Trk::Neutral>> + createUniqueNeutralParameters(const Amg::Vector3D&, + const Amg::Vector3D&, + double, + AmgSymMatrix(5) *) const + { + return nullptr; + } + + virtual Intersection straightLineIntersection(const Amg::Vector3D&, + const Amg::Vector3D&, + bool, Trk::BoundaryCheck) const { return Trk::Intersection(Amg::Vector3D(0.,0.,0.),0.,false); } + + +// persistency libraries.. + virtual Trk::DistanceSolution straightLineDistanceEstimate(const Amg::Vector3D&, + const Amg::Vector3D&, bool) const {return 0;} + + virtual bool isOnSurface(const Amg::Vector3D&, Trk::BoundaryCheck, double, double) const {return false;} + +private: + Identifier m_id; +}; + + +} + +#endif diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/EventCnvSuperTool.h b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/EventCnvSuperTool.h new file mode 100644 index 0000000000000000000000000000000000000000..3c3255427e19b3b0afca17cecc26a573cdbe83b7 --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/EventCnvSuperTool.h @@ -0,0 +1,80 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRKEVENTCNVTOOLS_EVENTCNVSUPERTOOL +#define TRKEVENTCNVTOOLS_EVENTCNVSUPERTOOL + +#include "TrkEventCnvTools/IEventCnvSuperTool.h" +#include "GaudiKernel/ToolHandle.h" +#include "AthenaBaseComps/AthAlgTool.h" +#include "AthenaPoolUtilities/TPObjRef.h" + +#include <atomic> + +class Identifier; +class FaserDetectorID; + +namespace Trk +{ + class ITrkEventCnvTool; + class Surface; + class RIO_OnTrack; + + /** Tool to handle TP conversions for Tracking EDM. + This tool has sub tools that do the detector-specific conversions*/ +class EventCnvSuperTool : public extends<AthAlgTool, IEventCnvSuperTool> + { + public: + + EventCnvSuperTool(const std::string& t, + const std::string& n, + const IInterface* p); + + virtual ~EventCnvSuperTool (); + + virtual StatusCode initialize() override; + + virtual StatusCode finalize() override; + + virtual const Trk::ITrkEventCnvTool* getCnvTool(const Identifier& id) const override; + + /** From passed Identifier*/ + virtual const Trk::Surface* getSurface(const Identifier& id) const override; + + /** Take the passed RoT and recreate it (i.e. fill missing pointers etc)*/ + virtual void recreateRIO_OnTrack( RIO_OnTrack *RoT ) const override; + + /** Take the passed RoT and prepare the PRD ElementLink for writing to disc*/ + virtual void prepareRIO_OnTrack( RIO_OnTrack* Rot) const override; + + /** Take the passed RoT and return the EL components to write to disc */ + virtual void prepareRIO_OnTrackLink( const RIO_OnTrack* Rot, + ELKey_t& key, + ELIndex_t& index ) const override; + + // virtual bool canHandleInDet() const override { return m_haveIdCnvTool;} + // virtual bool canHandleMuonSpectrometer() const override { return m_haveMuonCnvTool;} + virtual int maxNumberOfErrors() const override { return m_maxErrCount;} + + virtual bool noGeometry() const override {return !(m_haveTrackerCnvTool);} + + private: + ToolHandle<Trk::ITrkEventCnvTool> m_trackerCnvTool {this, "TrackerCnvTool", "Tracker::TrackerEventCnvTool/TrackerEventCnvTool", "Tool used to handle Tracker RoTs etc"}; //!< Tool used to handle Tracker RoTs etc + // ToolHandle<Trk::ITrkEventCnvTool> m_idCnvTool {this, "IdCnvTool", "InDet::InDetEventCnvTool/InDetEventCnvTool", "Tool used to handle ID RoTs etc"}; //!< Tool used to handle ID RoTs etc + // ToolHandle<Trk::ITrkEventCnvTool> m_muonCnvTool {this, "MuonCnvTool", "Muon::MuonEventCnvTool/MuonEventCnvTool", "Tool used to handle Muon RoTs etc"}; //!< Tool used to handle Muon RoTs etc + const FaserDetectorID* m_detID; // atlas id helper + + bool m_haveTrackerCnvTool; + // bool m_haveIdCnvTool; //!< Flag set in intialise, letting us know whether the tool has been found. + // bool m_haveMuonCnvTool; //!< Flag set in intialise, letting us know whether the tool has been found. + + // bool m_doMuons; //!< Property deciding whether to attempt Muon conversions + // bool m_doID; //!< Property deciding whether to attempt ID conversions + + mutable std::atomic_int m_errCount; //!< Current number of ERROR/WARNING messages sent to output + int m_maxErrCount; //!< Maximum number of permissable ERROR/WARNING messages sent to output. + }; + } +#endif + diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/IEventCnvSuperTool.h b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/IEventCnvSuperTool.h new file mode 100644 index 0000000000000000000000000000000000000000..263186464f37b07ecffae111db6c077bfd386e0a --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/IEventCnvSuperTool.h @@ -0,0 +1,74 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRKEVENTCNVTOOLS_IEVENTCNVSUPERTOOL +#define TRKEVENTCNVTOOLS_IEVENTCNVSUPERTOOL + +#include "GaudiKernel/IAlgTool.h" + +#include "AthLinks/ElementLink.h" +#include "StoreGate/ReadHandleKey.h" + +class Identifier; +class AtlasDetectorID; +class TPObjRef; + +namespace Trk +{ + class ITrkEventCnvTool; + class Surface; + class RIO_OnTrack; + + static const InterfaceID IID_IIEventCnvSuperTool("Trk::IEventCnvSuperTool", 1, 0); + + class IEventCnvSuperTool : virtual public IAlgTool + { + public: + /// Key and index types used for an EL to IdentifiableContainer. + typedef std::string ELKey_t; + typedef unsigned int ELIndex_t; + + DeclareInterfaceID( IEventCnvSuperTool, 1, 0 ); + + IEventCnvSuperTool() {}; + + virtual const Trk::ITrkEventCnvTool* getCnvTool(const Identifier& id) const =0; + + /** From passed Identifier*/ + virtual const Trk::Surface* getSurface(const Identifier& id) const =0; + + /** Take the passed RoT and recreate it (i.e. fill missing pointers etc)*/ + virtual void recreateRIO_OnTrack( RIO_OnTrack *RoT ) const =0; + + /** Take the passed RoT and prepare the PRD ElementLink for writing to disc*/ + virtual void prepareRIO_OnTrack( RIO_OnTrack* Rot) const = 0; + + /** Take the passed RoT and return the EL components to write to disc */ + virtual void prepareRIO_OnTrackLink( const RIO_OnTrack* Rot, + ELKey_t& key, + ELIndex_t& index ) const = 0; + + /**This templated method will return the hashAndIndex of the passed RIO_OnTrack.*/ + template <class CONT, class ROT> bool getHashAndIndex(const ROT* rot, + const SG::ReadHandleKey<CONT>& contName, + typename ElementLink<CONT>::index_type& hashAndIndex) const; + + /** returns false if e.g. no ID geometry available*/ + // virtual bool canHandleInDet() const =0; + + /** returns false if e.g. no Muon geometry available*/ + // virtual bool canHandleMuonSpectrometer() const =0; + + /** returns true if e.g. no Muon+ID geometry available*/ + virtual bool noGeometry() const =0; + + /** Maximum number of permitted errors. */ + virtual int maxNumberOfErrors() const =0; + + }; +} + +#include "TrkEventCnvTools/IEventCnvSuperTool.icc" + +#endif diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/IEventCnvSuperTool.icc b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/IEventCnvSuperTool.icc new file mode 100644 index 0000000000000000000000000000000000000000..76f9b3c261b6d35f55ac63640feb507ffb3724de --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/IEventCnvSuperTool.icc @@ -0,0 +1,14 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrkEventCnvTools/ITrkEventCnvTool.h" + +template <class CONT, class ROT> +bool Trk::IEventCnvSuperTool::getHashAndIndex(const ROT* rot, + const SG::ReadHandleKey<CONT>& contName, + typename ElementLink<CONT>::index_type& hashAndIndex) const { + const Trk::ITrkEventCnvTool* cnvTool{getCnvTool(rot->identify())}; + if (cnvTool!=nullptr) return cnvTool->getHashAndIndex<CONT, ROT>(rot, contName, hashAndIndex); + return false; +} diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/ITrkEventCnvTool.h b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/ITrkEventCnvTool.h new file mode 100644 index 0000000000000000000000000000000000000000..981d2e743539604815e1e2d72276ff27a0de065f --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/ITrkEventCnvTool.h @@ -0,0 +1,106 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRKEVENTCNVTOOLS_ITRKEVENTCNVTOOL +#define TRKEVENTCNVTOOLS_ITRKEVENTCNVTOOL + + +#include "GaudiKernel/IAlgTool.h" + +#include "AthLinks/ElementLink.h" +#include "StoreGate/StoreGateSvc.h" +#include "StoreGate/ReadHandleKey.h" + +#include "GaudiKernel/ServiceHandle.h" +#include "GaudiKernel/IMessageSvc.h" +#include "GaudiKernel/MsgStream.h" + +class Identifier; +class IdentifierHash; + +namespace Trk +{ + +class TrkDetElementBase; +class PrepRawData; +class RIO_OnTrack; + + +class ITrkEventCnvTool : virtual public IAlgTool + { + public: + /// Key and index types used for an EL to IdentifiableContainer. + typedef std::string ELKey_t; + typedef unsigned int ELIndex_t; + + DeclareInterfaceID( ITrkEventCnvTool, 1, 0 ); + + + ITrkEventCnvTool(): + m_storeGate ( "StoreGateSvc", "ITrkEventCnvTool" ), + m_msgSvc ( "MessageSvc", "ITrkEventCnvTool" ) + { +// m_log(&(*m_msgSvc), name() ); + } + + /** check the passed RIO_OnTrack to make sure it is correctly filled*/ + virtual void checkRoT( const Trk::RIO_OnTrack& rioOnTrack ) const =0; + + /**This method must use the passed RIO_OnTrack to recover pointers + The PrepRawData pointer will only be filled if the concrete tools are so set + @return this is a pair, where the (possibly null) pointers contained represent the missing links from rioOnTrack* + @param[in] rioOnTrack the RIO_OnTrack which needs recreating. MUST point to a valid object.*/ + virtual std::pair<const Trk::TrkDetElementBase*, const Trk::PrepRawData*> + getLinks( Trk::RIO_OnTrack& rioOnTrack ) const = 0; + + /**This templated method will set the EL for the passed RIO_OnTrack.*/ + template <class CONT, class ROT> void prepareRIO_OnTrackElementLink(ROT* rot) const; + + /**This templated method will find EL components for the passed RIO_OnTrack.*/ + template <class CONT, class ROT> + void prepareRIO_OnTrackElementLink(const ROT* rot, + ELKey_t& key, + ELIndex_t& index) const; + + /**This templated method will return the hashAndIndex of the passed RIO_OnTrack.*/ + template <class CONT, class ROT> bool getHashAndIndex(const ROT* rot, + const SG::ReadHandleKey<CONT>& contName, + typename ElementLink<CONT>::index_type& hashAndIndex) const; + + /** Take the passed RoT and prepare the PRD ElementLink for writing to disk. + The procedure should be: + - Get DataHandles to all IDC containers in the event + - See if collection storing the linked PRD is part of the container + - If so, check that the pointer of the PRD matches that in the container + - Then set strings and index. + - If any of the above failed, try the next container.*/ + virtual void prepareRIO_OnTrack( Trk::RIO_OnTrack* rot) const =0; + + /** Similar, but just return the EL components rather then + changing ROT. */ + virtual void prepareRIO_OnTrackLink( const Trk::RIO_OnTrack* rot, + ELKey_t& key, + ELIndex_t& index ) const =0; + + /** Take the passed RoT and recreate it (i.e. fill missing pointers etc)*/ + virtual void recreateRIO_OnTrack( Trk::RIO_OnTrack *RoT ) const =0; + + /** Returns the detectorElement associated with this Identifier & Hash*/ + virtual const Trk::TrkDetElementBase* getDetectorElement(const Identifier& id, const IdentifierHash& idHash) const =0; + + /** Returns the detectorElement associated with this Identifier*/ + virtual const Trk::TrkDetElementBase* getDetectorElement(const Identifier& id) const =0; + + virtual void setRoT_Values(std::pair<const Trk::TrkDetElementBase *, const Trk::PrepRawData *>& pair, Trk::RIO_OnTrack *RoT ) const; + + private: + ServiceHandle<StoreGateSvc> m_storeGate; + ServiceHandle<IMessageSvc> m_msgSvc; +}; +} + +#include "TrkEventCnvTools/ITrkEventCnvTool.icc" + +#endif + diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/ITrkEventCnvTool.icc b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/ITrkEventCnvTool.icc new file mode 100644 index 0000000000000000000000000000000000000000..face9619dad8bd49d90d4f313caa90dca21bc48b --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/ITrkEventCnvTool.icc @@ -0,0 +1,113 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#include "Identifier/IdentifierHash.h" +#include "TrkPrepRawData/PrepRawData.h" +#include "TrkRIO_OnTrack/RIO_OnTrack.h" +#include "StoreGate/ReadHandle.h" + +#include <typeinfo> + + +template <class CONT, class ROT> +void Trk::ITrkEventCnvTool::prepareRIO_OnTrackElementLink(const ROT* rot, + ELKey_t& key, + ELIndex_t& index) const +{ + // verify pointer is ok + // assume EL is correct + // get data handles to convertors + + key = rot->m_rio.dataID(); + index = rot->m_rio.index(); + + bool isPersistifiable = (rot->m_rio.key() != 0 + and IdentContIndex(index).isValid()); + + if (isPersistifiable) { + return; // Already set - bail out. + } + + // When doing AOD to AOD copy we expect the PRD links to be zero. + if (rot->prepRawData()==nullptr) { + MsgStream log(&(*m_msgSvc), name()); + log<<MSG::DEBUG<<"No PRD for this ROT: "<<(*rot)<<endmsg; + return; + } + + SG::ConstIterator<CONT> dh, dhEnd; + StatusCode sc = m_storeGate->retrieve(dh, dhEnd); + if (sc.isFailure()) { + MsgStream log(&(*m_msgSvc), name()); + log << MSG::WARNING <<"No containers found!"<< endmsg; + return; + } + + // loop over dhs + for ( ; dh!=dhEnd; dh++) { + const Trk::PrepRawData* prd = rot->prepRawData(); + unsigned int oindex = prd->getHashAndIndex().objIndex(); // prd index within collection + IdentifierHash idHash = prd->getHashAndIndex().collHash(); // idHash of collection + + const CONT& cont = *dh; // container + auto coll = cont.indexFindPtr(idHash); //matching collection + + // does coll exist? + // check prd exists in collection + // check pointer value the same. + if ( (coll!=nullptr)&& (coll->size()>oindex) && (prd==(*coll)[oindex]) ) { + // okay, so we found the correct PRD in the container. + // Return EL components. + // dh.key() is the name of the container. oindex is the index within the collection. IdHash???? + key = dh.key(); + index = prd->getHashAndIndex().hashAndIndex(); + return; //exit loop and function. We're done. + } + } + // so, we obviously didn't have the correct container (or something else went wrong) + MsgStream log(&(*m_msgSvc), name()); + log << MSG::ERROR<<"Could not find matching PRD container for this ROT. ROT will be written out in incomplete state. " + << "Dumping ROT: "<<*rot<<endmsg; + + return; +} + +template <class CONT, class ROT> +void Trk::ITrkEventCnvTool::prepareRIO_OnTrackElementLink(ROT* rot) const +{ + ELKey_t key; + ELIndex_t index; + prepareRIO_OnTrackElementLink<CONT> (rot, key, index); + rot->m_rio.resetWithKeyAndIndex (key, index); +} + +inline void Trk::ITrkEventCnvTool::setRoT_Values(std::pair<const Trk::TrkDetElementBase *, const Trk::PrepRawData *>& pair, Trk::RIO_OnTrack *RoT) const { + RoT->setValues(pair.first, pair.second); +} + +template <class CONT, class ROT> +bool Trk::ITrkEventCnvTool::getHashAndIndex(const ROT* rot, + const SG::ReadHandleKey<CONT>& contName, + typename ElementLink<CONT>::index_type& hashAndIndex) const { + if (rot==nullptr) return false; + + const Trk::PrepRawData* prd{rot->prepRawData()}; + if (prd==nullptr) return false; + + SG::ReadHandle<CONT> cont (contName); + if (not cont.isValid()) return false; + + const IdentContIndex& idContIndex{prd->getHashAndIndex()}; + const IdentifierHash& idHash{idContIndex.collHash()}; // idHash of collection + auto contItr = cont->indexFindPtr(idHash); //matching collection + if (contItr==nullptr) return false; + + unsigned int index{idContIndex.objIndex()}; // prd index within collection + if ((contItr->size()>index) and (prd==(*contItr)[index])) { + hashAndIndex = idContIndex.hashAndIndex(); + return true; + } + + return false; +} diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/python/TrkEventCnvToolsConfig.py b/Tracking/TrkEventCnv/TrkEventCnvTools/python/TrkEventCnvToolsConfig.py new file mode 100644 index 0000000000000000000000000000000000000000..272de9158e9e65da5bbbfe6aa911abaa6c424ed3 --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/python/TrkEventCnvToolsConfig.py @@ -0,0 +1,14 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + +# default configuration of TrkEventCnvTools +# example of a configuration in class deriving from a Configurable + +from AthenaCommon.DetFlags import DetFlags +from AthenaCommon.AppMgr import ToolSvc +# from RecExConfig import RecFlags as rec + +from TrkEventCnvTools.TrkEventCnvToolsConf import Trk__EventCnvSuperTool +TrkEventCnvSuperTool = Trk__EventCnvSuperTool(name="EventCnvSuperTool") +ToolSvc+=TrkEventCnvSuperTool +# TrkEventCnvSuperTool.DoMuons = rec.doMuon() and DetFlags.detdescr.Muon_on() +# TrkEventCnvSuperTool.DoID = rec.doInDet() and DetFlags.detdescr.ID_on() diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/src/EventCnvSuperTool.cxx b/Tracking/TrkEventCnv/TrkEventCnvTools/src/EventCnvSuperTool.cxx new file mode 100644 index 0000000000000000000000000000000000000000..649b03b828099461237a92523cb88c217af26f54 --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/src/EventCnvSuperTool.cxx @@ -0,0 +1,180 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrkEventCnvTools/EventCnvSuperTool.h" +#include "FaserDetDescr/FaserDetectorID.h" +#include "TrkRIO_OnTrack/RIO_OnTrack.h" +#include "TrkMeasurementBase/MeasurementBase.h" +#include "TrkEventCnvTools/ITrkEventCnvTool.h" +#include "TrkSurfaces/Surface.h" +#include "TrkEventCnvTools/DetElementSurface.h" +#include <typeinfo> + +Trk::EventCnvSuperTool::EventCnvSuperTool( + const std::string& t, + const std::string& n, + const IInterface* p ) + : + base_class(t,n,p), + m_detID(0), + m_haveTrackerCnvTool(false), // Will be set to true on retrieval + m_errCount(0), + m_maxErrCount(10) +{ + declareProperty("MaxErrorCount", m_maxErrCount, "Maximum number of errors that will be reported"); +} + +Trk::EventCnvSuperTool::~EventCnvSuperTool(){ + if (m_errCount>m_maxErrCount) ATH_MSG_WARNING("Suppressed "<<(m_errCount-m_maxErrCount)<<" WARNING or ERROR messages"); +} + +StatusCode +Trk::EventCnvSuperTool::initialize(){ + // Try to get FaserID + StatusCode sc = detStore()->retrieve( m_detID, "FaserID" ); + if( sc.isFailure() ) { + msg(MSG::WARNING) << "Could not get FaserDetectorID " << endmsg; + } + + //Now try to get the tools + if ( !m_trackerCnvTool.empty() ) { + if (m_trackerCnvTool.retrieve().isFailure() ) + { + msg(MSG::DEBUG) << "Failed to retrieve Tracker helper tool "<< m_trackerCnvTool + <<". Will not be able to recreate Tracker Surfaces / Det Elements."<<endmsg; + } else { + msg(MSG::VERBOSE) << "Retrieved tool " << m_trackerCnvTool << endmsg; + m_haveTrackerCnvTool=true; + } + } else { + m_trackerCnvTool.setTypeAndName(""); + } + + if (!m_haveTrackerCnvTool){ + msg(MSG::WARNING) << "Failed to retrieve Tracker tool. Will not be able to recreate surfaces / detector elements."<< endmsg; + m_maxErrCount=0; // No point in further WARNINGs + } + + return StatusCode::SUCCESS; +} + +StatusCode +Trk::EventCnvSuperTool::finalize(){ + msg()<< "Finalize()."; + if (m_errCount>0) msg()<<" Tried to print "<<m_errCount<<" ERROR/WARNING messages (with maximum permissable = "<<m_maxErrCount<<")"; + msg()<<endmsg; + return StatusCode::SUCCESS; +} + +const Trk::ITrkEventCnvTool* +Trk::EventCnvSuperTool::getCnvTool(const Identifier& id) const { + if (m_detID==0) return 0; + + if (m_haveTrackerCnvTool) + { + return &(*m_trackerCnvTool); + } + else + { + if ( (m_errCount++)<m_maxErrCount) msg(MSG::WARNING) + << "Tracker RIO_OnTrack, but have no Tracker cnv tool!" + << endmsg; + return 0; + } + + + // if(m_detID->is_indet(id)) + // { + // //std::cout<<"Trk::EventCnvSuperTool::getCnvTool = ID"<<std::endl; + // if (m_haveIdCnvTool ) + // { + // return &(*m_idCnvTool); + // }else{ + // if ( (m_errCount++)<m_maxErrCount) msg(MSG::WARNING) + // << "ID RIO_OnTrack, but have no ID cnv tool!" + // << endmsg; + // return 0; + // } + // }else{ + // if(m_detID->is_muon(id) ) + // { + // //std::cout<<"Trk::EventCnvSuperTool::getCnvTool = Muon"<<std::endl; + // if (m_haveMuonCnvTool) + // { + // return &(*m_muonCnvTool); + // }else{ + // if ( (m_errCount++)<m_maxErrCount) msg(MSG::WARNING) + // << "Muon RIO_OnTrack, but have no muon cnv tool. Cannot set check RoT." + // << endmsg; + // return 0; + // } + // } + // } + + if ( (m_errCount++)<m_maxErrCount){ + std::string ident = m_detID->show_to_string(id); + msg(MSG::WARNING) + << "Unknown Identifier: ("<< ident<<"), that is ("<<id<<")" + << endmsg; + } + return 0; + +} + +const Trk::Surface* +Trk::EventCnvSuperTool::getSurface(const Identifier& id) const { + const Surface* surface = 0; + const Trk::ITrkEventCnvTool* cnvTool = getCnvTool(id); + if (cnvTool!=0) { + const TrkDetElementBase* detEl = cnvTool->getDetectorElement( id ); + if (detEl!=0) + surface = &(detEl->surface(id)); + else + if ( (m_errCount++)<m_maxErrCount) msg(MSG::WARNING)<< "getSurface: could not get detector element from id:"<<id<<" Returning 0." << endmsg; + } else { + if ( (m_errCount++)<m_maxErrCount) msg(MSG::WARNING)<< "getSurface: could not get cnv tool for Identifier:"<<id<< endmsg; + } + return surface; +} + +void +Trk::EventCnvSuperTool::recreateRIO_OnTrack( Trk::RIO_OnTrack *RoT ) const +{ + using namespace std; + const Trk::ITrkEventCnvTool* cnvTool = getCnvTool(RoT->identify()); + if (cnvTool!=0) { + cnvTool->recreateRIO_OnTrack( RoT ); + } else { + const type_info& info = typeid(*RoT); + if ( (m_errCount++)<m_maxErrCount) + msg(MSG::WARNING)<< "recreateRIO_OnTrack: could not get cnv tool. Returning without correctly filling ROT of type: "<< info.name()<< endmsg; + } + return; +} + +void +Trk::EventCnvSuperTool::prepareRIO_OnTrack( Trk::RIO_OnTrack *RoT ) const +{ + const Trk::ITrkEventCnvTool* cnvTool = getCnvTool(RoT->identify()); + if (cnvTool!=0) { + cnvTool->prepareRIO_OnTrack( RoT ); + } else { + if ( (m_errCount++)<m_maxErrCount) msg()<< "prepareRIO_OnTrack could not find appropriate tool to prepare: "<<*RoT<<std::endl; + } + return; +} + +void +Trk::EventCnvSuperTool::prepareRIO_OnTrackLink ( const Trk::RIO_OnTrack *RoT, + ELKey_t& key, + ELIndex_t& index ) const +{ + const Trk::ITrkEventCnvTool* cnvTool = getCnvTool(RoT->identify()); + if (cnvTool!=0) { + cnvTool->prepareRIO_OnTrackLink ( RoT, key, index ); + } else { + if ( (m_errCount++)<m_maxErrCount) msg()<< "prepareRIO_OnTrack could not find appropriate tool to prepare: "<<*RoT<<std::endl; + } + return; +} diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/src/components/TrkEventCnvTools_entries.cxx b/Tracking/TrkEventCnv/TrkEventCnvTools/src/components/TrkEventCnvTools_entries.cxx new file mode 100644 index 0000000000000000000000000000000000000000..85c690d36c1a0db0dc6a75d7d80d3561e2d49adf --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventCnvTools/src/components/TrkEventCnvTools_entries.cxx @@ -0,0 +1,5 @@ +#include "TrkEventCnvTools/EventCnvSuperTool.h" + + +DECLARE_COMPONENT( Trk::EventCnvSuperTool ) + diff --git a/Tracking/TrkEventCnv/TrkEventTopLevelCnv/CMakeLists.txt b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..d93168761cab1bb13644e4ad7950ba4285f56711 --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + +# Declare the package name: +atlas_subdir( TrkEventTopLevelCnv ) + +# Component(s) in the package: +atlas_add_tpcnv_library( TrkEventTopLevelCnv + TrkEventTopLevelCnv/*.h src/*.cxx + PUBLIC_HEADERS TrkEventTopLevelCnv + LINK_LIBRARIES + TrackerEventTPCnv TrkEventTPCnv RecTPCnv TPTools + ) + +atlas_add_dictionary( TrkEventTopLevelCnvDict + TrkEventTopLevelCnv/TrkEventTopLevelCnvDict.h + TrkEventTopLevelCnv/selection.xml + LINK_LIBRARIES TrkEventTopLevelCnv + ) + diff --git a/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/TrackCollectionCnv_tlp6.h b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/TrackCollectionCnv_tlp6.h new file mode 100644 index 0000000000000000000000000000000000000000..637c9b9a468b316fc3a62acc5dc8f82c8e1838fd --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/TrackCollectionCnv_tlp6.h @@ -0,0 +1,89 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACK_COLLECTION_CNV_TLP6_TRK_H +#define TRACK_COLLECTION_CNV_TLP6_TRK_H + + +#include "TPTools/TopLevelTPConverter.h" + +#include "TrackCollection_tlp6.h" + +#include "TrkEventTPCnv/TrkTrack/TrackCollectionCnv_p4.h" +#include "TrkEventTPCnv/TrkTrack/TrackCnv_p4.h" +#include "TrkEventTPCnv/TrkTrack/TrackStateOnSurfaceCnv_p3.h" + +#include "TrkEventTPCnv/TrkPseudoMeasurementOnTrack/PseudoMeasurementOnTrackCnv_p2.h" +// #include "TrkEventTPCnv/TrkVertexOnTrack/VertexOnTrackCnv_p1.h" + +// #include "TrkEventTPCnv/TrkCompetingRIOsOnTrack/CompetingRIOsOnTrackCnv_p1.h" +#include "TrkEventTPCnv/TrkParameters/TrackParametersCnv_p2.h" // Also takes care of surfaces now, for these objects + +#include "TrkEventTPCnv/TrkSurfaces/SurfaceCnv_p2.h" +#include "TrkEventTPCnv/TrkDetElementSurface/DetElementSurfaceCnv_p1.h" + +#include "TrkEventTPCnv/TrkEventPrimitives/ErrorMatrixCnv_p1.h" +#include "TrkEventTPCnv/TrkMaterialOnTrack/MaterialEffectsBaseCnv_p2.h" +#include "TrkEventTPCnv/TrkMaterialOnTrack/EnergyLossCnv_p1.h" +#include "TrkEventTPCnv/TrkMaterialOnTrack/MaterialEffectsOnTrackCnv_p2.h" +#include "TrkEventTPCnv/TrkMaterialOnTrack/EstimatedBremOnTrackCnv_p1.h" +#include "TrkEventTPCnv/TrkEventPrimitives/LocalDirectionCnv_p1.h" +#include "TrkEventTPCnv/TrkEventPrimitives/LocalPositionCnv_p1.h" +#include "TrkEventTPCnv/TrkEventPrimitives/LocalParametersCnv_p1.h" + +// #include "MuonEventTPCnv/MuonMeasurementsCnv_tlp2.h" +#include "TrackerEventTPCnv/TrackerTrackCnv_tlp2.h" +// #include "RecTPCnv/MuonCaloEnergyContainerCnv_tlp1.h" + + +typedef TopLevelTPConverter< TrackCollectionCnv_p4, Trk::TrackCollection_tlp6 > BaseTrackCollectionCnv; + +class TrackCollectionCnv_tlp6 : public BaseTrackCollectionCnv +{ + public: + + TrackCollectionCnv_tlp6(); + + virtual void setPStorage( PERS *storage ) override; + virtual PERS* createPersistentWithKey(const TRANS* transObj, + const std::string& key, + MsgStream &log) override; + +// all TP converters for types used in the Track package +protected: + TrackCnv_p4 m_tracksCnv; + TrackStateOnSurfaceCnv_p3 m_trackStatesCnv; + + ErrorMatrixCnv_p1 m_errorMatricesCnv; + + PseudoMeasurementOnTrackCnv_p2 m_pseudoMeasurementOnTrackCnv; +// VertexOnTrackCnv_p1 m_vertexOnTrackCnv; +// CompetingRIOsOnTrackCnv_p1 m_crotCnv; + + TrackParametersCnv_p2 m_parametersCnv; + + ConeSurfaceCnv_p2 m_coneSurfacesCnv ; + CylinderSurfaceCnv_p2 m_cylSurfacesCnv ; + DiscSurfaceCnv_p2 m_discSurfacesCnv ; + PerigeeSurfaceCnv_p2 m_perigeeSurfacesCnv ; + PlaneSurfaceCnv_p2 m_planeSurfacesCnv ; + StraightLineSurfaceCnv_p2 m_lineSurfacesCnv ; + SaggedLineSurfaceCnv_p2 m_saggedLineSurfacesCnv ; + + FitQualityCnv_p1 m_fitQualitiesCnv; + MaterialEffectsBaseCnv_p2 m_matEffectsBaseCnv; + EnergyLossCnv_p1 m_energyLossCnv; + MaterialEffectsOnTrackCnv_p2 m_materialEffectsCnv; + EstimatedBremOnTrackCnv_p1 m_estimatedBremCnv; + + LocalDirectionCnv_p1 m_localDirectionsCnv; + LocalPositionCnv_p1 m_localPositionsCnv; + LocalParametersCnv_p1 m_localParametersCnv; + + // TLP converters for extending TLP objects +// MuonMeasurementsCnv_tlp2 m_muonMeasurementsCnv; + TrackerTrackCnv_tlp2 m_trackerTrackCnv; +// MuonCaloEnergyContainerCnv_tlp1 m_muonCaloEnergiesCnv; +}; +#endif diff --git a/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/TrackCollection_tlp6.h b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/TrackCollection_tlp6.h new file mode 100644 index 0000000000000000000000000000000000000000..25a035e5ab8c739faa7007f7308ca43b30709b1d --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/TrackCollection_tlp6.h @@ -0,0 +1,104 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACK_COLLECTION_TLP6_TRK_H +#define TRACK_COLLECTION_TLP6_TRK_H + + +//----------------------------------------------------------------------------- +// TrkTrack +//----------------------------------------------------------------------------- +#include "TrkEventTPCnv/TrkTrack/TrackCollection_p1.h" +#include "TrkEventTPCnv/TrkTrack/Track_p4.h" +#include "TrkEventTPCnv/TrkTrack/TrackStateOnSurface_p3.h" + +//----------------------------------------------------------------------------- +// TrkEventPrimitives +//----------------------------------------------------------------------------- +#include "TrkEventTPCnv/TrkEventPrimitives/FitQuality_p1.h" +#include "TrkEventTPCnv/TrkEventPrimitives/LocalPosition_p1.h" +#include "TrkEventTPCnv/TrkEventPrimitives/LocalDirection_p1.h" +#include "TrkEventTPCnv/TrkEventPrimitives/LocalParameters_p1.h" +#include "TrkEventTPCnv/TrkEventPrimitives/HepSymMatrix_p1.h" + +//----------------------------------------------------------------------------- +// TrkMaterialOnTrack +//----------------------------------------------------------------------------- +#include "TrkEventTPCnv/TrkMaterialOnTrack/MaterialEffectsBase_p1.h" +#include "TrkEventTPCnv/TrkMaterialOnTrack/EnergyLoss_p1.h" +#include "TrkEventTPCnv/TrkMaterialOnTrack/MaterialEffectsOnTrack_p2.h" +#include "TrkEventTPCnv/TrkMaterialOnTrack/EstimatedBremOnTrack_p1.h" + +//----------------------------------------------------------------------------- +// TrkSurfaces +//----------------------------------------------------------------------------- +#include "TrkEventTPCnv/TrkSurfaces/Surface_p2.h" + +//----------------------------------------------------------------------------- +// Trk Parameters +//----------------------------------------------------------------------------- +#include "TrkEventTPCnv/TrkParameters/TrackParameters_p2.h" + +//----------------------------------------------------------------------------- +// TrkRIO_OnTrack +//----------------------------------------------------------------------------- +// #include "TrkEventTPCnv/TrkCompetingRIOsOnTrack/CompetingRIOsOnTrack_p1.h" +#include "TrkEventTPCnv/TrkPseudoMeasurementOnTrack/PseudoMeasurementOnTrack_p2.h" +// #include "TrkEventTPCnv/TrkVertexOnTrack/VertexOnTrack_p1.h" + +//----------------------------------------------------------------------------- +// Top Level Pers Objects from InnerDetector and MuonSpectrometer +// Previously stored as separate Extening TP objects, now integrated +// including full declarations for dictionary's sake + +#include "TrackerEventTPCnv/TrackerTrack_tlp2.h" +// #include "MuonEventTPCnv/MuonMeasurements_tlp2.h" +// #include "RecTPCnv/MuonCaloEnergyContainerCnv_tlp1.h" + +namespace Trk +{ + class TrackCollection_tlp6 + { + public: + TrackCollection_tlp6() { } + + ~TrackCollection_tlp6() { + delete m_trackerTrackExt; + } + + TrackCollection_tlp6 (const TrackCollection_tlp6&) = delete; + TrackCollection_tlp6& operator= (const TrackCollection_tlp6&) = delete; + + std::vector< Trk::TrackCollection_p1 > m_trackCollections; + std::vector< Trk::Track_p4 > m_tracks; + std::vector< Trk::TrackStateOnSurface_p3 > m_trackStates; + + // std::vector< Trk::CompetingRIOsOnTrack_p1 > m_competingRotsOnTrack; + std::vector< Trk::PseudoMeasurementOnTrack_p2 > m_pseudoMeasurementOnTrack; + // std::vector< Trk::VertexOnTrack_p1 > m_vertexOnTrack; + + std::vector< Trk::TrackParameters_p2 > m_parameters; + + std::vector< Trk::Surface_p2 > m_surfaces; + + std::vector< Trk::HepSymMatrix_p1 > m_hepSymMatrices; + std::vector< Trk::MaterialEffectsBase_p1 > m_matEffectsBases; + std::vector< Trk::EnergyLoss_p1 > m_energyLosses; + std::vector< Trk::MaterialEffectsOnTrack_p2 > m_materialEffects; + std::vector< Trk::EstimatedBremOnTrack_p1 > m_estimatedBrems; + + std::vector< Trk::FitQuality_p1 > m_fitQualities; + std::vector< Trk::LocalDirection_p1 > m_localDirections; + std::vector< Trk::LocalPosition_p1 > m_localPositions; + std::vector< Trk::LocalParameters_p1 > m_localParameters; + + // TLP converters from other packages + // for subclass types found in Tracking polymorphic collections + Tracker::Track_tlp2 *m_trackerTrackExt = nullptr; + // TPCnv::MuonMeasurements_tlp2 *m_muonMeasurementsExt = nullptr; + // MuonCaloEnergyContainer_tlp1 *m_muonCaloEnergiesExt = nullptr; + }; +} + +#endif // TRACK_COLLECTION_P6_TRK_H diff --git a/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnvDict.h b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnvDict.h new file mode 100644 index 0000000000000000000000000000000000000000..c2feba79d7dc11ac0c8986dd51b70ecf85999166 --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnvDict.h @@ -0,0 +1,10 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRKEVENTTOPLEVELCNV_DICT_H +#define TRKEVENTTOPLEVELCNV_DICT_H + +#include "TrkEventTopLevelCnv/TrackCollection_tlp6.h" + +#endif diff --git a/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/selection.xml b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/selection.xml new file mode 100644 index 0000000000000000000000000000000000000000..c28c7eb4a208f927f3626ad25d45aea695d0892c --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/TrkEventTopLevelCnv/selection.xml @@ -0,0 +1,6 @@ +<lcgdict> + + <class name="Trk::TrackCollection_tlp6" id="3228B252-2C5D-11E8-B170-0800271C02BC" /> + +</lcgdict> + diff --git a/Tracking/TrkEventCnv/TrkEventTopLevelCnv/src/TrackCollectionCnv_tlp6.cxx b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/src/TrackCollectionCnv_tlp6.cxx new file mode 100644 index 0000000000000000000000000000000000000000..0803ec704aa757bf524b32534cc1dd573ec00e7e --- /dev/null +++ b/Tracking/TrkEventCnv/TrkEventTopLevelCnv/src/TrackCollectionCnv_tlp6.cxx @@ -0,0 +1,116 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrkEventTopLevelCnv/TrackCollectionCnv_tlp6.h" + +/* + Converter for TrackCollection v TLP6. + Direct copy of TLP5 but with MuonMeasurements and InDet::Track tlp converters + integrated directly +*/ + +TrackCollectionCnv_tlp6::TrackCollectionCnv_tlp6( ) +{ +// Add all converters defined in this top level converter: +// never change the order of adding converters! + + addMainTPConverter(); + + addTPConverter( &m_tracksCnv ); + addTPConverter( &m_trackStatesCnv ); + + addTPConverter( &m_errorMatricesCnv ); + + // Measurements + addTPConverter( &m_pseudoMeasurementOnTrackCnv ); +// addTPConverter( &m_crotCnv ); +// addTPConverter( &m_vertexOnTrackCnv ); + // Other measurements are stored in the other tlp objects, i.e. the InDetTrack, and MuonMeasurements + + // Parameters + addTPConverter( &m_parametersCnv ); + + // Surfaces + addTPConverter( &m_coneSurfacesCnv ); + addTPConverter( &m_cylSurfacesCnv ); + addTPConverter( &m_discSurfacesCnv ); + addTPConverter( &m_perigeeSurfacesCnv ); + addTPConverter( &m_planeSurfacesCnv ); + addTPConverter( &m_lineSurfacesCnv ); + addTPConverter( &m_saggedLineSurfacesCnv ); + + addTPConverter( &m_matEffectsBaseCnv ); + addTPConverter( &m_energyLossCnv ); + addTPConverter( &m_materialEffectsCnv ); + addTPConverter( &m_estimatedBremCnv ); + + addTPConverter( &m_fitQualitiesCnv ); + addTPConverter( &m_localDirectionsCnv ); + addTPConverter( &m_localPositionsCnv ); + addTPConverter( &m_localParametersCnv ); + + // adding extending TLP converters, + // they don't interfere with the order of adding regular converters (above) +// m_muonMeasurementsCnv.addTPConvertersTo( this ); + m_trackerTrackCnv.addTPConvertersTo( this ); +// m_muonCaloEnergiesCnv.addTPConvertersTo( this ); +} + + +void TrackCollectionCnv_tlp6::setPStorage( PERS *storage ) +{ + setMainCnvPStorage( &storage->m_trackCollections ); + +// for all converters defined in this top level converter + m_tracksCnv. setPStorage( &storage->m_tracks ); + m_trackStatesCnv. setPStorage( &storage->m_trackStates ); + + m_errorMatricesCnv. setPStorage( &storage->m_hepSymMatrices ); + + m_pseudoMeasurementOnTrackCnv.setPStorage( &storage->m_pseudoMeasurementOnTrack ); +// m_crotCnv. setPStorage( &storage->m_competingRotsOnTrack ); +// m_vertexOnTrackCnv. setPStorage( &storage->m_vertexOnTrack ); + + m_parametersCnv. setPStorage( &storage->m_parameters ); + + m_coneSurfacesCnv .setPStorage( &storage->m_surfaces ); + m_cylSurfacesCnv .setPStorage( &storage->m_surfaces ); + m_discSurfacesCnv .setPStorage( &storage->m_surfaces ); + m_perigeeSurfacesCnv .setPStorage( &storage->m_surfaces ); + m_planeSurfacesCnv .setPStorage( &storage->m_surfaces ); + m_lineSurfacesCnv .setPStorage( &storage->m_surfaces ); + m_saggedLineSurfacesCnv .setPStorage( &storage->m_surfaces ); + + m_matEffectsBaseCnv. setPStorage( &storage->m_matEffectsBases ); + m_energyLossCnv. setPStorage( &storage->m_energyLosses ); + m_materialEffectsCnv. setPStorage( &storage->m_materialEffects ); + m_estimatedBremCnv. setPStorage( &storage->m_estimatedBrems ); + + m_fitQualitiesCnv. setPStorage( &storage->m_fitQualities ); + m_localDirectionsCnv. setPStorage( &storage->m_localDirections ); + m_localPositionsCnv. setPStorage( &storage->m_localPositions ); + m_localParametersCnv. setPStorage( &storage->m_localParameters ); + + // when reading (createTrans) these will be non-null if extension is present + // when writing, they will be null at first end set afterwards in createPersistentWithKey() + if( storage->m_trackerTrackExt ) m_trackerTrackCnv .setPStorage( storage->m_trackerTrackExt ); +// if( storage->m_muonMeasurementsExt ) m_muonMeasurementsCnv.setPStorage( storage->m_muonMeasurementsExt ); +// if( storage->m_muonCaloEnergiesExt ) m_muonCaloEnergiesCnv.setPStorage( storage->m_muonCaloEnergiesExt ); +} + + +BaseTrackCollectionCnv::PERS* +TrackCollectionCnv_tlp6::createPersistentWithKey(const TRANS* transObj, + const std::string& key, + MsgStream &log) +{ + PERS *pers = BaseTrackCollectionCnv::createPersistentWithKey(transObj, key, log); + + // get extending objects (nullptr if there was no extending data types) +// pers->m_muonMeasurementsExt = m_muonMeasurementsCnv.releaseTLPersObject(); + pers->m_trackerTrackExt = m_trackerTrackCnv.releaseTLPersObject(); +// pers->m_muonCaloEnergiesExt = m_muonCaloEnergiesCnv.releaseTLPersObject(); + + return pers; +}