diff --git a/Event/xAOD/xAODTauAthenaPool/CMakeLists.txt b/Event/xAOD/xAODTauAthenaPool/CMakeLists.txt index 569240cce5aa8836fd892c86f5361fb478082dce..aac85312bba21471f2fc0bc85a91adcf71e1a4d9 100644 --- a/Event/xAOD/xAODTauAthenaPool/CMakeLists.txt +++ b/Event/xAOD/xAODTauAthenaPool/CMakeLists.txt @@ -9,8 +9,10 @@ atlas_subdir( xAODTauAthenaPool ) atlas_depends_on_subdirs( PRIVATE Control/AthContainers Control/AthenaKernel + Control/StoreGate Database/AthenaPOOL/AthenaPoolCnvSvc Database/AthenaPOOL/AthenaPoolUtilities + Event/xAOD/xAODTracking Event/xAOD/xAODTau GaudiKernel ) @@ -20,5 +22,5 @@ atlas_add_poolcnv_library( xAODTauAthenaPoolPoolCnv FILES xAODTau/TauJetContainer.h xAODTau/TauJetAuxContainer.h xAODTau/DiTauJetContainer.h xAODTau/DiTauJetAuxContainer.h xAODTau/TauTrackContainer.h xAODTau/TauTrackAuxContainer.h TYPES_WITH_NAMESPACE xAOD::TauJetContainer xAOD::TauJetAuxContainer xAOD::DiTauJetContainer xAOD::DiTauJetAuxContainer xAOD::TauTrackContainer xAOD::TauTrackAuxContainer CNV_PFX xAOD - LINK_LIBRARIES AthContainers AthenaKernel AthenaPoolCnvSvcLib AthenaPoolUtilities xAODTau GaudiKernel ) + LINK_LIBRARIES AthContainers AthenaKernel StoreGateLib AthenaPoolCnvSvcLib AthenaPoolUtilities xAODTracking xAODTau GaudiKernel ) diff --git a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.cxx b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.cxx index a608f2996e143444d774f4e0b2e4fabdaf0e213b..6b46da9a0d0d3ea1467dde778392d19350cbc50f 100644 --- a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.cxx +++ b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.cxx @@ -2,7 +2,7 @@ Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration */ -// $Id: xAODTauJetAuxContainerCnv.cxx 749546 2016-05-25 01:31:32Z griffith $ +// $Id: xAODTauJetAuxContainerCnv.cxx 800296 2017-03-10 18:16:40Z griffith $ // System include(s): #include <exception> @@ -32,6 +32,17 @@ createPersistent( xAOD::TauJetAuxContainer* trans ) { return SG::copyThinned (*trans, IThinningSvc::instance()); } +StatusCode xAODTauJetAuxContainerCnv:: +createObj( IOpaqueAddress* pAddr, DataObject*& pObj ){ + + // Get the key of the container that we'll be creating: + m_key = *( pAddr->par() + 1 ); + ATH_MSG_VERBOSE( "Key of xAOD::TauJetAuxContainer: " << m_key ); + + // Let the base class do its thing now: + return AthenaPoolConverter::createObj( pAddr, pObj ); +} + xAOD::TauJetAuxContainer* xAODTauJetAuxContainerCnv::createTransient() { // The known ID(s) for this container: @@ -48,7 +59,7 @@ xAOD::TauJetAuxContainer* xAODTauJetAuxContainerCnv::createTransient() { } else if(compareClassGuid( v2_guid )) { // The v2 converter: static xAODTauJetAuxContainerCnv_v2 converter; - + converter.setKey(m_key); // std::cout << "Converting TauJet_v2 --> v3 not fully supported" << std::endl; // Read in the v2 object: diff --git a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.h b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.h index ad27a2d4f1b6d188c08961f44558901cb52f4407..82128790dc799a85b6eed50c98347228d36bf83b 100644 --- a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.h +++ b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.h @@ -4,10 +4,13 @@ Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration */ -// $Id: xAODTauJetAuxContainerCnv.h 581660 2014-02-05 15:52:29Z janus $ +// $Id: xAODTauJetAuxContainerCnv.h 800296 2017-03-10 18:16:40Z griffith $ #ifndef XAODTAUATHENAPOOL_XAODTAUJETAUXCONTAINERCNV_H #define XAODTAUATHENAPOOL_XAODTAUJETAUXCONTAINERCNV_H +// stystem includes +#include <string> + // Gaudi/Athena include(s): #include "AthenaPoolCnvSvc/T_AthenaPoolCustomCnv.h" @@ -31,8 +34,8 @@ typedef T_AthenaPoolCustomCnv< xAOD::TauJetAuxContainer, * @author Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch> * @author Michel Janus <janus@cern.ch> * - * $Revision: 581660 $ - * $Date: 2014-02-05 16:52:29 +0100 (Wed, 05 Feb 2014) $ + * $Revision: 800296 $ + * $Date: 2017-03-10 19:16:40 +0100 (Fri, 10 Mar 2017) $ */ class xAODTauJetAuxContainerCnv : public xAODTauJetAuxContainerCnvBase { @@ -50,6 +53,13 @@ protected: /// Function reading in the object from the input file virtual xAOD::TauJetAuxContainer* createTransient(); + /// Re-implemented function in order to get access to the SG key + virtual StatusCode createObj( IOpaqueAddress* pAddr, DataObject*& pObj ); + +private: + std::string m_key; + + }; // class xAODTauJetAuxContainerCnv #endif // XAODTAUATHENAPOOL_XAODTAUJETAUXCONTAINERCNV_H diff --git a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.cxx b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.cxx index 1fad3277b516457febc4bb899a7a4651aff064dc..0bfe5f87bbe1171bc24711bc2f531fa20d9a247d 100644 --- a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.cxx +++ b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.cxx @@ -14,10 +14,16 @@ #include "xAODTau/versions/TauJetContainer_v2.h" #include "xAODTau/TauJetContainer.h" #include "xAODTau/TauTrackContainer.h" +#include "xAODTau/TauTrackAuxContainer.h" +#include "xAODTracking/TrackParticleContainer.h" // Local include(s): #include "xAODTauJetAuxContainerCnv_v2.h" +// StoreGateSvc +#include "StoreGate/StoreGateSvc.h" +#include "GaudiKernel/ServiceHandle.h" + /// Convenience macro for setting the level of output messages #define MSGLVL MSG::DEBUG @@ -35,14 +41,35 @@ xAODTauJetAuxContainerCnv_v2::xAODTauJetAuxContainerCnv_v2() } + +ServiceHandle<StoreGateSvc> evtStore ("StoreGateSvc", "tauJetCnv_v2"); + + void xAODTauJetAuxContainerCnv_v2:: persToTrans( const xAOD::TauJetAuxContainer_v2* oldObj, xAOD::TauJetAuxContainer* newObj, MsgStream& log ) { + if (evtStore.retrieve().isFailure()) { + ATH_MSG("Cannot get StoreGateHandle"); + return; + } + + // Greet the user: ATH_MSG( "Converting xAOD::TauJetAuxContainer_v2 to current version..." ); + xAOD::TauTrackContainer* pTracks = nullptr; + xAOD::TauTrackAuxContainer* pAuxTracks = nullptr; + if(m_key.length()){ + //m_key is set in xAODTauJetAuxContainerCnv.cxx + //if reading data, then trigger calls T/P converter directly + //and the key is not set. In this case, forget about TauTracks + pTracks = new xAOD::TauTrackContainer(); + pAuxTracks = new xAOD::TauTrackAuxContainer(); + pTracks->setStore(pAuxTracks); + } + // Clear the transient object: newObj->resize( 0 ); @@ -55,12 +82,7 @@ persToTrans( const xAOD::TauJetAuxContainer_v2* oldObj, xAOD::TauJetContainer newInt; newInt.setStore( newObj ); - // xAOD::TauTrackContainer* pTracks = new xAOD::TauTrackContainer(); - // ATH_CHECK( evtStore()->record( pTracks, "TauTracks") ); - // xAOD::TauTrackAuxContainer* pAuxTracks = new xAOD::TauTrackAuxContainer(); - // ATH_CHECK( evtStore()->record( pAuxTracks, "TauTracksAux." )); - // pTracks->setStore( pAuxTracks ); - + // Loop over the interface objects, and do the conversion with their help: for( const xAOD::TauJet_v2* oldTau : oldInt ) { @@ -243,33 +265,96 @@ persToTrans( const xAOD::TauJetAuxContainer_v2* oldObj, newTau->setProtoNeutralPFOLinks( oldTau->protoNeutralPFOLinks() ); newTau->setProtoChargedPFOLinks( oldTau->protoChargedPFOLinks() ); newTau->setProtoPi0PFOLinks( oldTau->protoPi0PFOLinks() ); - - - // // - // //set per track track variables - // // - // for (unsigned int i = 0; i < oldTau->nTracks(); ++i) - // { - // //set track filter info - // newTau->setTrackFlag(oldTau->track(i), xAOD::TauJetParameters::failTrackFilter, oldTau->trackFilterPass(i) ); - // //set extrapolated track position - // newTau->setTrackEtaStrip( i , oldTau->trackEtaStrip(i) ); - // newTau->setTrackPhiStrip( i , oldTau->trackPhiStrip(i) ); - // } - - // for (unsigned int i = 0; i < oldTau->nConversionTracks(); ++i) - // { - // //set conversion track flags - // newTau->setTrackFlag(oldTau->conversionTrack(i), xAOD::TauJetParameters::isConversion, true ); - // } + if(m_key.length()==0) continue; + + for(unsigned int i = 0; i < oldTau->nTracks(); ++i){ + ElementLink< xAOD::TrackParticleContainer > linkToTrackParticle = oldTau->trackLinks()[i]; + if(!linkToTrackParticle.isValid()) continue; + xAOD::TauTrack* track = new xAOD::TauTrack(); + pTracks->push_back(track); + const xAOD::TrackParticle* trackParticle=oldTau->track(i); + track->addTrackLink(linkToTrackParticle); + track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m()); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::coreTrack, true); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::passTrkSelector, true); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::classifiedCharged, true); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true); + ElementLink<xAOD::TauTrackContainer> linkToTauTrack; + linkToTauTrack.toContainedElement(*pTracks, track); + newTau->addTauTrackLink(linkToTauTrack); + } + + for(unsigned int i = 0; i < oldTau->nWideTracks(); ++i){ + ElementLink< xAOD::TrackParticleContainer > linkToTrackParticle = oldTau->wideTrackLinks()[i]; + if(!linkToTrackParticle.isValid()) continue; + xAOD::TauTrack* track = new xAOD::TauTrack(); + pTracks->push_back(track); + const xAOD::TrackParticle* trackParticle=oldTau->wideTrack(i); + track->addTrackLink(linkToTrackParticle); + track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m()); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::wideTrack, true); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::passTrkSelector, true); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::classifiedIsolation, true); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::modifiedIsolationTrack, true); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true); + ElementLink<xAOD::TauTrackContainer> linkToTauTrack; + linkToTauTrack.toContainedElement(*pTracks, track); + newTau->addTauTrackLink(linkToTauTrack); + } + + for(unsigned int i = 0; i < oldTau->nOtherTracks(); ++i){ + ElementLink< xAOD::TrackParticleContainer > linkToTrackParticle = oldTau->otherTrackLinks()[i]; + if(!linkToTrackParticle.isValid()) continue; + xAOD::TauTrack* track = new xAOD::TauTrack(); + pTracks->push_back(track); + const xAOD::TrackParticle* trackParticle=oldTau->otherTrack(i); + track->addTrackLink(linkToTrackParticle); + track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m()); + float dR=oldTau->p4(xAOD::TauJetParameters::IntermediateAxis).DeltaR(trackParticle->p4()); + if(dR<=0.2) track->setFlag(xAOD::TauJetParameters::TauTrackFlag::coreTrack, true); + else track->setFlag(xAOD::TauJetParameters::TauTrackFlag::wideTrack, true); + track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true); + ElementLink<xAOD::TauTrackContainer> linkToTauTrack; + linkToTauTrack.toContainedElement(*pTracks, track); + newTau->addTauTrackLink(linkToTauTrack); + } + + + newTau->setDetail(xAOD::TauJetParameters::nChargedTracks, (int) oldTau->nTracks()); + newTau->setDetail(xAOD::TauJetParameters::nIsolatedTracks, (int) oldTau->nWideTracks()); } + + if(m_key.length()){ + std::string tauTrackContName=m_key; + tauTrackContName.replace(tauTrackContName.find("Aux."),4,""); + //example names: + //TauJets : Jets --> Tracks + //HLT_xAOD__TauJetContainer_TrigTauRecMerged Jet --> Track; +=Tracks + //HLT_xAOD__TauJetContainer_TrigTauRecPreselection "" + if(tauTrackContName.find("Jet") != std::string::npos){ + tauTrackContName.replace( tauTrackContName.find("Jet"), 3, "Track" ); + if(tauTrackContName.find("HLT") != std::string::npos) tauTrackContName+="Tracks"; + } + else { + ATH_MSG("Cannot decipher name TauTrackConatiner should have"); + return; + } + + std::string tauTrackAuxContName=tauTrackContName+"Aux."; + + if(evtStore->record(pTracks, tauTrackContName).isFailure() || + evtStore->record(pAuxTracks, tauTrackAuxContName)){ + ATH_MSG("Couldn't Record TauTracks"); + return; + } + } // Print what happened: ATH_MSG( "Converting xAOD::TauJetAuxContainer_v2 to current version " "[OK]" ); - + return; } diff --git a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.h b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.h index b44ffe97d81cac49a77df618a07c8f4572a22765..d14faa65a9aae13112c2a129a66ba08aafdca13a 100644 --- a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.h +++ b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.h @@ -44,6 +44,10 @@ public: xAOD::TauJetAuxContainer_v2*, MsgStream& log ); + inline void setKey(const std::string& k){ m_key=k;} + +private: + std::string m_key; }; // class xAODTauJetAuxContainer_v2 #endif // XAODTAUATHENAPOOL_XAODTAUJETAUXCONTAINERCNV_V2_H