diff --git a/TileCalorimeter/TileEvent/TileEvent/TileBeamElemCollection.h b/TileCalorimeter/TileEvent/TileEvent/TileBeamElemCollection.h index 353d4998ba78b3875294f88d1949402eecd94bfe..e828ce9b8c473a8e1a7a1abb139c641a44720113 100755 --- a/TileCalorimeter/TileEvent/TileEvent/TileBeamElemCollection.h +++ b/TileCalorimeter/TileEvent/TileEvent/TileBeamElemCollection.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TileBeamElemCollection_H @@ -29,6 +29,14 @@ public: */ TileBeamElemCollection (const TileBeamElemCollection& other); + /** + * @brief Move constructor. + * @param other Collection to move. + * Move the contents from other collection. + */ + TileBeamElemCollection(TileBeamElemCollection&& other) = default; + + ~TileBeamElemCollection() { } }; diff --git a/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h b/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h index 438793223cde1240be35c4bd69fe662228ca8a74..302003f1df835507a72aa1b7dd54342b314389f9 100755 --- a/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h +++ b/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TileDigitsCollection_H @@ -38,6 +38,13 @@ public: */ TileDigitsCollection (const TileDigitsCollection& other); + /** + * @brief Move constructor. + * @param other Collection to move. + * Move the contents from other collection. + */ + TileDigitsCollection(TileDigitsCollection&& other) = default; + ~TileDigitsCollection() { } /** @@ -66,10 +73,12 @@ public: */ void setFragExtraWords(const std::vector<uint32_t> & extra) { m_FragExtraWords = extra; - if (extra.size() < 2) m_FragExtraWords.resize(2); } + if (extra.size() < 2) m_FragExtraWords.resize(2); + } void setFragExtraWords(std::vector<uint32_t> && extra) { m_FragExtraWords = std::move(extra); - if (extra.size() < 2) m_FragExtraWords.resize(2); } + if (m_FragExtraWords.size() < 2) m_FragExtraWords.resize(2); + } /** * Get Frag extra words for this collection * @return vector with all words diff --git a/TileCalorimeter/TileEvent/TileEvent/TileHitCollection.h b/TileCalorimeter/TileEvent/TileEvent/TileHitCollection.h index 9411ad69dc61ad7143acff556ce308a89485f24f..66dd08838a27f876604ba6b48601c3f9b303b17f 100755 --- a/TileCalorimeter/TileEvent/TileEvent/TileHitCollection.h +++ b/TileCalorimeter/TileEvent/TileEvent/TileHitCollection.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TileHitCollection_H @@ -30,6 +30,13 @@ public: */ TileHitCollection (const TileHitCollection& other); + /** + * @brief Move constructor. + * @param other Collection to move. + * Move the contents from other collection. + */ + TileHitCollection(TileHitCollection&& other) = default; + ~TileHitCollection() { } }; diff --git a/TileCalorimeter/TileEvent/TileEvent/TileRawChannelCollection.h b/TileCalorimeter/TileEvent/TileEvent/TileRawChannelCollection.h index 48880bda9653f0398f95113b4ee9d505fe6678bc..f809980e2a2c8dbaf1de1aa11e316ba4b1cd7005 100755 --- a/TileCalorimeter/TileEvent/TileEvent/TileRawChannelCollection.h +++ b/TileCalorimeter/TileEvent/TileEvent/TileRawChannelCollection.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TileRawChannelCollection_H @@ -60,6 +60,14 @@ public: */ TileRawChannelCollection (const TileRawChannelCollection& other); + /** + * @brief Move constructor. + * @param other Collection to move. + * Move the contents from other collection. + */ + TileRawChannelCollection(TileRawChannelCollection&& other) = default; + + ~TileRawChannelCollection() { } /** diff --git a/TileCalorimeter/TileEvent/TileEvent/TileRawDataCollection.h b/TileCalorimeter/TileEvent/TileEvent/TileRawDataCollection.h index 69bcb22ebd44c0d58be3d4473df67bb2f91c1a6d..315c1af28cc68ec86e796a090b8d8e78459c110b 100755 --- a/TileCalorimeter/TileEvent/TileEvent/TileRawDataCollection.h +++ b/TileCalorimeter/TileEvent/TileEvent/TileRawDataCollection.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ //******************************************************************** @@ -53,6 +53,9 @@ template <typename TELEMENT> class TileRawDataCollection : DataVector < TELEMENT > (ownPolicy), m_id(0), m_lvl1Id(0), m_lvl1Type(0), m_detEvType(0), m_rodBCID(0) { this->reserve(48); } + TileRawDataCollection<TELEMENT> (const TileRawDataCollection<TELEMENT>& rhs) = default; + TileRawDataCollection<TELEMENT> (TileRawDataCollection<TELEMENT>&& rhs) = default; + // destructor virtual ~TileRawDataCollection<TELEMENT> () = default; diff --git a/TileCalorimeter/TileEvent/TileEvent/TileRawDataContainer.h b/TileCalorimeter/TileEvent/TileEvent/TileRawDataContainer.h index b24a91400d4344f3652be349ff26841be425f3da..b342641de83602eca9ca7cef8bc86af178fcf628 100755 --- a/TileCalorimeter/TileEvent/TileEvent/TileRawDataContainer.h +++ b/TileCalorimeter/TileEvent/TileEvent/TileRawDataContainer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ //******************************************************************** @@ -59,10 +59,6 @@ public: // clear all collections void clear(); - // insert a TileRawData element into a collection. - // this is only to be used by Algorithm-builder - void add (TElement* rc, bool createColl=false, SG::OwnershipPolicy ownPolicy=SG::OWN_ELEMENTS); - inline void push_back(TElement* rc) { add(rc,true); } inline TYPE get_hashType() const { return this->m_hashFunc.type(); } inline UNIT get_unit() const { return this->m_unit; } inline void set_unit(UNIT unit) { m_unit=unit; } diff --git a/TileCalorimeter/TileEvent/TileEvent/TileRawDataContainer.icc b/TileCalorimeter/TileEvent/TileEvent/TileRawDataContainer.icc index 9bd9a4088287fa687a399354a0598ae71ec31ca6..52d4b4a1c27cb84f94b7d9f406361de1dc6662a0 100755 --- a/TileCalorimeter/TileEvent/TileEvent/TileRawDataContainer.icc +++ b/TileCalorimeter/TileEvent/TileEvent/TileRawDataContainer.icc @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // implementation of TileRawDataContainer @@ -90,82 +90,6 @@ void TileRawDataContainer<TCOLLECTION>::clear() return; } -template <typename TCOLLECTION> -void TileRawDataContainer<TCOLLECTION>::add(TElement* rc, bool createColl, - SG::OwnershipPolicy ownPolicy) -{ - if (this->m_hashFunc.max() == 0 && TileCablingService::getInstance()->getTileHWID() != 0) { - // not initialized yet - initialize hash function - initialize(false,m_type); - } - - //if (isLocked()) { - // std::cout << " Can not change TileRawDataContainer anymore, It is locked"<<std::endl; - // return ; - //} - - TCOLLECTION * coll; - - int frag = rc->frag_ID(); - IdentifierHash fragHash = static_cast<IdentifierHash>(m_hashFunc(frag)); - - TContainer_const_iterator it = MyBase::indexFind(fragHash); - - if( it == MyBase::end() ){ // collection doesn't exist - - // do not create collection, because it'll not work anyhow: - // the fact that collection doesn't exist cashed already - // waitng for update of core package - // createColl = false; - - if (createColl) { - - coll = new TCOLLECTION(frag,ownPolicy); - StatusCode sc = this->addCollection(coll,fragHash); - if (sc.isFailure() ) { - - ISvcLocator* svcLoc = Gaudi::svcLocator( ); - IMessageSvc* msgSvc; - sc = svcLoc->service( "MessageSvc", msgSvc ); - if ( sc.isFailure() ) { - std::cout << "TileRawDataContainer ERROR Can not retrieve MessageSvc" << std::endl; - std::cout << "TileRawDataContainer ERROR Can not create collection for frag 0x" << std::hex << frag - << " in container with CLID " << std::dec << this->clID() << std::endl; - } else { - MsgStream log(msgSvc, "TileRawDataContainer"); - log << MSG::ERROR <<" Can not create collection for frag 0x" << MSG::hex << frag - << " in container with CLID " << MSG::dec << this->clID() << endmsg; - } - return ; - } - - } else { - - ISvcLocator* svcLoc = Gaudi::svcLocator( ); - IMessageSvc* msgSvc; - StatusCode sc = svcLoc->service( "MessageSvc", msgSvc ); - if ( sc.isFailure() ) { - std::cout << "TileRawDataContainer ERROR Can not retrieve MessageSvc" << std::endl; - std::cout << "TileRawDataContainer ERROR Collection for frag 0x" << std::hex << frag - << " in container with CLID " << std::dec << this->clID() - << " does not exist " << std::endl; - } else { - MsgStream log(msgSvc, "TileRawDataContainer"); - log << MSG::ERROR <<" Collection for frag 0x" << MSG::hex << frag - << " in container with CLID " << MSG::dec << this->clID() - << " does not exist " << endmsg; - } - return ; - } - } else { // collection exists - - const TCOLLECTION * const_coll = *it; - coll = const_cast<TCOLLECTION *>(const_coll); - } - - coll->push_back(rc); - return ; -} template <typename TCOLLECTION> void TileRawDataContainer<TCOLLECTION>::print() const diff --git a/TileCalorimeter/TileRecAlgs/share/TileDigitsThresholdFilter_test.ref b/TileCalorimeter/TileRecAlgs/share/TileDigitsThresholdFilter_test.ref index 4b32e718f1b4b83665e87e280427c54316d7304b..06d5f0d24bd635331e46620a9570835dabceea11 100644 --- a/TileCalorimeter/TileRecAlgs/share/TileDigitsThresholdFilter_test.ref +++ b/TileCalorimeter/TileRecAlgs/share/TileDigitsThresholdFilter_test.ref @@ -4,12 +4,12 @@ Initializing Gaudi ApplicationMgr using job opts ./TileDigitsThresholdFilter_tes JobOptionsSvc INFO Job options successfully read in from ./TileDigitsThresholdFilter_test_generated.txt ApplicationMgr SUCCESS ==================================================================================================================================== - Welcome to ApplicationMgr (GaudiCoreSvc v27r1p99) - running on karma on Fri Jul 20 15:32:00 2018 + Welcome to ApplicationMgr (GaudiCoreSvc v31r0) + running on pcatl12 on Mon Mar 18 19:21:10 2019 ==================================================================================================================================== ApplicationMgr INFO Successfully loaded modules : StoreGate ApplicationMgr INFO Application Manager Configured successfully -ClassIDSvc INFO getRegistryEntries: read 8597 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 5499 CLIDRegistry entries for module ALL StoreGateSvc DEBUG Property update for OutputLevel : new value = 2 StoreGateSvc DEBUG Service base class initialized successfully StoreGateSvc DEBUG trying to create store SGImplSvc/StoreGateSvc_Impl @@ -54,7 +54,3 @@ TILE => 5/0/1/2/1/1 TILE => 5/0/1/2/2/1 TILE => 5/0/1/2/3/1 TILE => 5/0/1/2/4/1 -StoreGateSvc DEBUG Recorded object @0x1c23240 with key TileDigitsCnt of type TileDigitsContainer(CLID 2925) - in DataObject @0x16cea90 - object not modifiable when retrieved -StoreGateSvc DEBUG Retrieved const pointer to object TileDigitsFiltered of type TileDigitsContainer(CLID 2925) diff --git a/TileCalorimeter/TileRecAlgs/test/TileDigitsThresholdFilter_test.cxx b/TileCalorimeter/TileRecAlgs/test/TileDigitsThresholdFilter_test.cxx index d8708224432eb88233c53a97ccd657bd6d855525..4ceb5db626fdc60894447c154ad8f025ebf8069f 100644 --- a/TileCalorimeter/TileRecAlgs/test/TileDigitsThresholdFilter_test.cxx +++ b/TileCalorimeter/TileRecAlgs/test/TileDigitsThresholdFilter_test.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #undef NDEBUG @@ -7,6 +7,7 @@ #include "../src/TileDigitsThresholdFilter.h" #include "TileConditions/ITileCondToolDspThreshold.h" #include "TileEvent/TileDigitsContainer.h" +#include "TileEvent/TileMutableDigitsContainer.h" #include "TileIdentifier/TileHWID.h" #include "TileConditions/TileCablingService.h" @@ -19,6 +20,8 @@ #include "AthenaBaseComps/AthAlgTool.h" #include "StoreGate/StoreGateSvc.h" #include "StoreGate/setupStoreGate.h" +#include "StoreGate/WriteHandle.h" +#include "StoreGate/ReadHandle.h" // ATLAS C++ #include "CxxUtils/make_unique.h" @@ -128,46 +131,37 @@ void test1() { assert( (alg->setProperty("TileCondToolDspThreshold", "TileCondToolDspThresholdMock/TileCondToolDspThresholdMock")).isSuccess() ); assert( (alg->initialize()).isSuccess() ); - - TileDigitsContainer* inputContainer = new TileDigitsContainer(true); - - inputContainer->set_unit(TileRawChannelUnit::OnlineADCcounts); - inputContainer->set_type(TileFragHash::Beam); - inputContainer->set_bsflags(3); - - unsigned int ros = 1; - unsigned int drawer = 1; - for (unsigned int adc = 0; adc < 2; ++adc) { - unsigned int channel = 0; - for (const std::vector<float>& digits : TESTDIGITS) { - HWIdentifier id = tileHWID->adc_id(ros, drawer, channel, adc); - inputContainer->push_back(new TileDigits(id, digits)); - ++channel; - std::cout << ((tileHWID->is_tile(id) ? "TILE" : "NOT TILE")) << " => " << tileHWID->to_string(id) << std::endl; + { + auto digitsContainer = std::make_unique<TileMutableDigitsContainer>(true); + + digitsContainer->set_unit(TileRawChannelUnit::OnlineADCcounts); + digitsContainer->set_type(TileFragHash::Beam); + digitsContainer->set_bsflags(3); + + unsigned int ros = 1; + unsigned int drawer = 1; + for (unsigned int adc = 0; adc < 2; ++adc) { + unsigned int channel = 0; + for (const std::vector<float>& digits : TESTDIGITS) { + HWIdentifier id = tileHWID->adc_id(ros, drawer, channel, adc); + digitsContainer->push_back(new TileDigits(id, digits)); + ++channel; + std::cout << ((tileHWID->is_tile(id) ? "TILE" : "NOT TILE")) << " => " << tileHWID->to_string(id) << std::endl; + } + ++drawer; } - ++drawer; - } - /* - for (const TileDigitsCollection* constInputCollection : *inputContainer) { - if (constInputCollection->identify() == 0x101) { - TileDigitsCollection* inputCollection = const_cast<TileDigitsCollection*>(constInputCollection); - inputCollection->setLvl1Id(10100); - inputCollection->setLvl1Type(10101); - inputCollection->setDetEvType(10102); - inputCollection->setRODBCID(10103); - } + SG::WriteHandle<TileDigitsContainer> digitsCnt("TileDigitsCnt"); + assert(digitsCnt.record(std::move(digitsContainer)).isSuccess()); } - */ - - assert( evtStore->record(inputContainer, "TileDigitsCnt", false).isSuccess() ); - assert( (alg->execute()).isSuccess() ); + SG::ReadHandle<TileDigitsContainer> inputContainer("TileDigitsCnt"); + assert( inputContainer.isValid() ); - const TileDigitsContainer* outputContainer; - assert( evtStore->retrieve(outputContainer, "TileDigitsFiltered").isSuccess() ); + SG::ReadHandle<TileDigitsContainer> outputContainer("TileDigitsFiltered"); + assert( outputContainer.isValid() ); assert( inputContainer->get_unit() == outputContainer->get_unit() ); assert( inputContainer->get_type() == outputContainer->get_type() ); @@ -180,25 +174,6 @@ void test1() { unsigned int drawer = (fragId & 0x3F); unsigned int ros = fragId >> 8; - /* - IdentifierHash fragHash = (inputContainer->hashFunc())(fragId); - const TileDigitsCollection* inputCollection = *(inputContainer->indexFind(fragHash)); - - - assert( inputCollection->getLvl1Id() == outputCollection->getLvl1Id() ); - assert( inputCollection->getLvl1Type() == outputCollection->getLvl1Type() ); - assert( inputCollection->getDetEvType() == outputCollection->getDetEvType() ); - assert( inputCollection->getRODBCID() == outputCollection->getRODBCID() ); - - assert( inputCollection->getFragSize() == outputCollection->getFragSize() ); - assert( inputCollection->getFragExtraWords() == outputCollection->getFragExtraWords() ); - assert( inputCollection->getFragBCID() == outputCollection->getFragBCID() ); - assert( inputCollection->getFragChipHeaderWords() == outputCollection->getFragChipHeaderWords() ); - assert( inputCollection->getFragChipHeaderWordsHigh() == outputCollection->getFragChipHeaderWordsHigh() ); - assert( inputCollection->getFragChipCRCWords() == outputCollection->getFragChipCRCWords() ); - assert( inputCollection->getFragChipCRCWordsHigh() == outputCollection->getFragChipCRCWordsHigh() ); - */ - for (const TileDigits* digits : *outputCollection) { ++nTileDigitsPassedFitler; HWIdentifier adc_id = digits->adc_HWID(); diff --git a/TileCalorimeter/TileSvc/TileTPCnv/TileTPCnv/T_TilePoolContainerCnv.h b/TileCalorimeter/TileSvc/TileTPCnv/TileTPCnv/T_TilePoolContainerCnv.h index 98332371654122c9cf3693c441f4379711c71c43..5a4e3c764fb414e524b585c911adf08981960819 100644 --- a/TileCalorimeter/TileSvc/TileTPCnv/TileTPCnv/T_TilePoolContainerCnv.h +++ b/TileCalorimeter/TileSvc/TileTPCnv/TileTPCnv/T_TilePoolContainerCnv.h @@ -1,7 +1,7 @@ ///////////////////////// -*- C++ -*- ///////////////////////////// /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // T_TilePoolContainerCnv.h @@ -15,6 +15,7 @@ #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h" #include "EventContainers/SelectAllObject.h" #include "TileEvent/TileRawDataContainer.h" +#include "TileEvent/TileMutableDataContainer.h" #include <vector> #include <inttypes.h> @@ -26,6 +27,7 @@ public: typedef typename PERS::ElemVector pers_ElemVector; typedef typename PERS::const_iterator pers_const_iterator; typedef typename SelectAllObject<TRANS>::const_iterator trans_const_iterator; + using Collection = typename TRANS::IDENTIFIABLE; T_TilePoolContainerCnv() : m_elementCnv() {} @@ -52,7 +54,6 @@ public: << " - " << bsflags << " " << unit << " " << type << " " << hashType << MSG::dec << " Nelements= " << vec.size() << endmsg; - //trans->clear(); // only remove elements trans->cleanup(); // remove all collections if ( abs(trans->get_hashType()-hashType) > 0xF) { @@ -67,11 +68,27 @@ public: trans->set_type((TileFragHash::TYPE)type); trans->set_bsflags(bsflags); - for( pers_const_iterator it = vec.begin(), - iEnd = vec.end(); - it != iEnd; ++it) { - trans->push_back( m_elementCnv.createTransient(&(*it), log) ); + + auto mutableContainer = std::make_unique<TileMutableDataContainer<TRANS>>(); + if (mutableContainer->status().isFailure()) { + throw std::runtime_error("Failed to initialize Tile mutable Container"); + } + + for( pers_const_iterator it = vec.begin(), iEnd = vec.end(); it != iEnd; ++it) { + if (mutableContainer->push_back(m_elementCnv.createTransient(&(*it), log)).isFailure()) { + throw std::runtime_error("Failed to add Tile element to Collection"); + } } + + std::vector<IdentifierHash> hashes = mutableContainer->GetAllCurrentHashes(); + for (const IdentifierHash hash : hashes) { + Collection* coll = mutableContainer->indexFindPtr(hash); + auto newColl = std::make_unique<Collection>(std::move(*coll)); + if (trans->addOrDelete(std::move(newColl), hash).isFailure()) { + throw std::runtime_error("Failed to add Tile collection to Identifiable Container"); + } + } + } /** Converts vector of TRANS::value_type objects to vector of PERS::value_type objects,