diff --git a/Control/DataModelTest/DataModelTestDataRead/CMakeLists.txt b/Control/DataModelTest/DataModelTestDataRead/CMakeLists.txt index c09290d18b6e6bb6c7d635e5d00651b31de7de13..b962d213858fdcfab7443c7f1872d91a2eb92a4b 100644 --- a/Control/DataModelTest/DataModelTestDataRead/CMakeLists.txt +++ b/Control/DataModelTest/DataModelTestDataRead/CMakeLists.txt @@ -49,3 +49,9 @@ atlas_add_dictionary( DataModelTestDataReadDict EXTRA_FILES src/dict/*.cxx ELEMENT_LINKS DataVector<DMTest::B> ) + +atlas_add_sercnv_library ( DataModelTestDataReadSerCnv + FILES DataModelTestDataRead/HVec.h DataModelTestDataRead/HView.h DataModelTestDataRead/HAuxContainer.h + TYPES_WITH_NAMESPACE DMTest::HVec DMTest::HView DMTest::HAuxContainer + INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers SGTools xAODCore xAODTrigger GaudiKernel AthLinks TrigSerializeCnvSvcLib DataModelTestDataCommon DataModelTestDataReadLib ) diff --git a/Control/DataModelTest/DataModelTestDataRead/cmt/requirements b/Control/DataModelTest/DataModelTestDataRead/cmt/requirements index f28b7d753f57e267f3c1f67e6cc5a1beff65a85e..9b4830e6f823a93f1776127c520e06707b1a2295 100644 --- a/Control/DataModelTest/DataModelTestDataRead/cmt/requirements +++ b/Control/DataModelTest/DataModelTestDataRead/cmt/requirements @@ -51,3 +51,15 @@ apply_pattern lcgdict dict=DataModelTestDataRead selectionfile=selection.xml\ elementLinks="$(elemLinks_DataModelTestDataRead)" \ extralibfiles=../src/dict/*.cxx + + +private +use TrigSerializeUtils TrigSerializeUtils-* Trigger/TrigDataAccess + + +apply_tag no_merge_componentslist + +apply_pattern sercnv \ + typesWithNamespace="DMTest::HVec DMTest::HView DMTest::HAuxContainer" \ + files=" -s=${DataModelTestDataRead_root}/DataModelTestDataRead \ + HVec.h HView.h HAuxContainer.h " diff --git a/Control/DataModelTest/DataModelTestDataRead/src/AuxDataTestRead.cxx b/Control/DataModelTest/DataModelTestDataRead/src/AuxDataTestRead.cxx index 6118a7d980831cf68be4945c6d2a6f0f58ec6be5..536384473cd44278d90525a0fca68acb3689976f 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/AuxDataTestRead.cxx +++ b/Control/DataModelTest/DataModelTestDataRead/src/AuxDataTestRead.cxx @@ -81,52 +81,58 @@ StatusCode AuxDataTestRead::execute() const BAuxVec* vec = 0; CHECK( evtStore()->retrieve (vec, m_readPrefix + "bauxvec") ); + // Use a temp sstream to prevent output being disrupted by logging + // messages generated by EL dereferences. + std::ostringstream ost; + // Ordering of auxid is not reliable. Sort by name. std::vector<std::string> names; for (SG::auxid_t auxid : vec->getAuxIDs()) names.push_back (r.getName(auxid)); std::sort (names.begin(), names.end()); for (const std::string& n : names) - std::cout << n << " "; - std::cout << "\n"; + ost << n << " "; + ost << "\n"; for (const BAux* belt : *vec) { - std::cout << " anInt1: " << anInt1(*belt) + ost << " anInt1: " << anInt1(*belt) << " aFloat1: " << aFloat1(*belt) << " pInt: " << pInt(*belt) << " pFloat: " << CxxUtils::strformat ("%.2f", pFloat(*belt)) << " aB: " << aB(*belt).m_x << " dFloat1: " << dFloat1(*belt); if (dInt1.isAvailable(*belt)) - std::cout << " dInt1: " << dInt1(*belt); + ost << " dInt1: " << dInt1(*belt); if (dInt2.isAvailable(*belt)) - std::cout << " dInt2: " << dInt2(*belt); - std::cout << "\n"; + ost << " dInt2: " << dInt2(*belt); + ost << "\n"; const std::vector<int>& pvi = pvint(*belt); - std::cout << " pvInt: ["; + ost << " pvInt: ["; for (auto ii : pvi) - std::cout << ii << " "; - std::cout << "]\n"; + ost << ii << " "; + ost << "]\n"; const std::vector<float>& pvf = pvfloat(*belt); - std::cout << " pvFloat: ["; + ost << " pvFloat: ["; for (auto ii : pvf) - std::cout << CxxUtils::strformat ("%.3f", ii) << " "; - std::cout << "]\n"; + ost << CxxUtils::strformat ("%.3f", ii) << " "; + ost << "]\n"; } const BAux* b = 0; CHECK( evtStore()->retrieve (b, m_readPrefix + "b") ); - std::cout << "b anInt1: " << anInt1(*b) + ost << "b anInt1: " << anInt1(*b) << " aFloat1: " << CxxUtils::strformat ("%.1f", aFloat1(*b)) << " anEL: " << anEL(*b).dataID() << "[" << anEL(*b).index() << "]" << " aB: " << aB(*b).m_x << " dFloat1: " << dFloat1(*b); if (dInt1.isAvailable(*b)) - std::cout << " dInt1: " << dInt1(*b); + ost << " dInt1: " << dInt1(*b); if (dInt2.isAvailable(*b)) - std::cout << " dInt2: " << dInt2(*b); - std::cout << "\n"; + ost << " dInt2: " << dInt2(*b); + ost << "\n"; + + std::cout << ost.str(); if (!m_writePrefix.empty()) { // Passing this as the third arg of record will make the object const. diff --git a/Control/DataModelTest/DataModelTestDataRead/src/AuxDataTestTypelessRead.cxx b/Control/DataModelTest/DataModelTestDataRead/src/AuxDataTestTypelessRead.cxx index 37f73730b79282d159afdd38ece35252bb0a17eb..93dc4da8c3cfc0c988253206f3a5d5d85e902697 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/AuxDataTestTypelessRead.cxx +++ b/Control/DataModelTest/DataModelTestDataRead/src/AuxDataTestTypelessRead.cxx @@ -26,6 +26,7 @@ #include "GaudiKernel/System.h" #include <map> #include <memory> +#include <sstream> namespace DMTest { @@ -57,67 +58,67 @@ StatusCode AuxDataTestTypelessRead::initialize() namespace { -void dumpAuxItem (SG::auxid_t auxid, const SG::AuxVectorData& c, size_t i) +void dumpAuxItem (std::ostream& ost, SG::auxid_t auxid, const SG::AuxVectorData& c, size_t i) { const SG::AuxTypeRegistry& r = SG::AuxTypeRegistry::instance(); const std::type_info* ti = r.getType(auxid); std::string head = r.getName(auxid) + ": "; if (ti == &typeid(int)) - std::cout << head << c.getData<int> (auxid, i) << "; "; + ost << head << c.getData<int> (auxid, i) << "; "; else if (ti == &typeid(float)) - std::cout << head << CxxUtils::strformat ("%.3f", c.getData<float> (auxid, i)) << "; "; + ost << head << CxxUtils::strformat ("%.3f", c.getData<float> (auxid, i)) << "; "; else if (ti == &typeid(ElementLink<DMTest::BAuxVec>)) { const ElementLink<DMTest::BAuxVec>& el = c.getData<ElementLink<DMTest::BAuxVec> > (auxid, i); - std::cout << head << el.dataID() << "[" << el.index() << "]; "; + ost << head << el.dataID() << "[" << el.index() << "]; "; } else if (ti == &typeid(DMTest::B)) { - std::cout << head << c.getData<B>(auxid, i).m_x << "; "; + ost << head << c.getData<B>(auxid, i).m_x << "; "; } #if 0 else if (ti == &typeid(SG::PackedElement<unsigned int>)) - std::cout << head << c.getData<SG::PackedElement<unsigned int> > (auxid, i) << "; "; + ost << head << c.getData<SG::PackedElement<unsigned int> > (auxid, i) << "; "; #endif else if (ti == &typeid(unsigned int)) - std::cout << head << c.getData<unsigned int> (auxid, i) << "; "; + ost << head << c.getData<unsigned int> (auxid, i) << "; "; #if 0 else if (ti == &typeid(SG::PackedElement<float>)) - std::cout << head << c.getData<SG::PackedElement<float> > (auxid, i) << "; "; + ost << head << c.getData<SG::PackedElement<float> > (auxid, i) << "; "; else if (ti == &typeid(SG::PackedElement<std::vector<unsigned int> >)) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<SG::PackedElement<std::vector<unsigned int> > > (auxid, i)) - std::cout << ii << " "; - std::cout << "]; "; + ost << ii << " "; + ost << "]; "; } else if (ti == &typeid(SG::PackedElement<std::vector<int> >)) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<SG::PackedElement<std::vector<int> > > (auxid, i)) - std::cout << ii << " "; - std::cout << "]; "; + ost << ii << " "; + ost << "]; "; } else if (ti == &typeid(SG::PackedElement<std::vector<float> >)) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<SG::PackedElement<std::vector<float> > > (auxid, i)) - std::cout << CxxUtils::strformat ("%.3f", ii) << " "; - std::cout << "]; "; + ost << CxxUtils::strformat ("%.3f", ii) << " "; + ost << "]; "; } #endif else if (ti == &typeid(std::vector<int>)) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<std::vector<int> > (auxid, i)) - std::cout << ii << " "; - std::cout << "]; "; + ost << ii << " "; + ost << "]; "; } else if (ti == &typeid(std::vector<float>) || strcmp (ti->name(), typeid(std::vector<float>).name()) == 0) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<std::vector<float> > (auxid, i)) - std::cout << CxxUtils::strformat ("%.3f", ii) << " "; - std::cout << "]; "; + ost << CxxUtils::strformat ("%.3f", ii) << " "; + ost << "]; "; } else - std::cout << head << "xxx " << ti->name() << "; "; + ost << head << "xxx " << ti->name() << "; "; } @@ -148,10 +149,11 @@ StatusCode AuxDataTestTypelessRead::execute() << System::typeinfoName (*r.getType(m.second)) << " "; std::cout << "\n"; for (size_t i = 0; i < vec->size(); i++) { - std::cout << " "; + std::ostringstream ss; + ss << " "; for (const auto& m : auxid_map) - dumpAuxItem (m.second, *vec, i); - std::cout << "\n"; + dumpAuxItem (ss, m.second, *vec, i); + std::cout << ss.str() << "\n"; } const BAux* b = 0; @@ -167,9 +169,10 @@ StatusCode AuxDataTestTypelessRead::execute() std::cout << r.getName(m.second) << "/" << System::typeinfoName (*r.getType(m.second)) << " "; std::cout << "\n"; + std::ostringstream ss; for (const auto& m : bauxid_map) - dumpAuxItem (m.second, *cont, 0); - std::cout << "\n"; + dumpAuxItem (ss, m.second, *cont, 0); + std::cout << ss.str() << "\n"; if (!m_writePrefix.empty()) { // Passing this as the third arg of record will make the object const. diff --git a/Control/DataModelTest/DataModelTestDataRead/src/HLTResultReader.cxx b/Control/DataModelTest/DataModelTestDataRead/src/HLTResultReader.cxx index aaa3750ee999dd073d8786341eed041ad7dc20ae..0c53b6c072531a6c41b51925822e06934f3d1729 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/HLTResultReader.cxx +++ b/Control/DataModelTest/DataModelTestDataRead/src/HLTResultReader.cxx @@ -13,8 +13,13 @@ #include "HLTResultReader.h" #include "DataModelTestDataCommon/CVec.h" +#include "DataModelTestDataCommon/CView.h" #include "DataModelTestDataCommon/C.h" #include "DataModelTestDataCommon/CAuxContainer.h" +#include "DataModelTestDataRead/HVec.h" +#include "DataModelTestDataRead/HView.h" +#include "DataModelTestDataRead/H.h" +#include "DataModelTestDataRead/HAuxContainer.h" #include "TrigNavigation/Navigation.h" #include "TrigNavigation/Holder.icc" #include "TrigSteeringEvent/HLTResult.h" @@ -22,6 +27,9 @@ HLT_BEGIN_TYPE_REGISTRATION HLT_REGISTER_TYPE(DMTest::C, DMTest::CVec, DMTest::CVec, DMTest::CAuxContainer) + HLT_REGISTER_TYPE(DMTest::C, DMTest::CView, DMTest::CView, DMTest::CAuxContainer) + HLT_REGISTER_TYPE(DMTest::H, DMTest::HVec, DMTest::HVec, DMTest::HAuxContainer) + HLT_REGISTER_TYPE(DMTest::H, DMTest::HView, DMTest::HView, DMTest::HAuxContainer) HLT_END_TYPE_REGISTRATION(DataModelTest) @@ -51,7 +59,7 @@ namespace DMTest { */ HLTResultReader::HLTResultReader (const std::string &name, ISvcLocator *pSvcLocator) - : AthReentrantAlgorithm (name, pSvcLocator), + : AthAlgorithm (name, pSvcLocator), m_nav ("TestNav", this) { declareProperty ("ResultKey", m_resultKey = "HLTResult_HLT"); @@ -67,7 +75,11 @@ StatusCode HLTResultReader::initialize() ATH_CHECK( m_resultKey.initialize() ); ATH_CHECK( m_nav.retrieve() ); HLT::TypeMaps::registerFeatureContainer<DMTest::CVec,DMTest::CVec>(); + HLT::TypeMaps::registerFeatureContainer<DMTest::CView,DMTest::CView>(); HLT::TypeMaps::registerType<DMTest::CAuxContainer>(); + HLT::TypeMaps::registerFeatureContainer<DMTest::HVec,DMTest::HVec>(); + HLT::TypeMaps::registerFeatureContainer<DMTest::HView,DMTest::HView>(); + HLT::TypeMaps::registerType<DMTest::HAuxContainer>(); return StatusCode::SUCCESS; } @@ -75,9 +87,9 @@ StatusCode HLTResultReader::initialize() /** * @brief Algorithm event processing. */ -StatusCode HLTResultReader::execute_r (const EventContext& ctx) const +StatusCode HLTResultReader::execute() { - SG::ReadHandle<HLT::HLTResult> result (m_resultKey, ctx); + SG::ReadHandle<HLT::HLTResult> result (m_resultKey); m_nav->prepare(); if (!m_nav->deserialize (result->getNavigationResult())) return StatusCode::FAILURE; diff --git a/Control/DataModelTest/DataModelTestDataRead/src/HLTResultReader.h b/Control/DataModelTest/DataModelTestDataRead/src/HLTResultReader.h index 34b1afc15012bfc58331ffcfe747b864faed1c1d..3a618a96548eb694ceac24713874a844ee4cacea 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/HLTResultReader.h +++ b/Control/DataModelTest/DataModelTestDataRead/src/HLTResultReader.h @@ -17,7 +17,7 @@ #define DATAMODELTESTDATAREAD_HLTRESULTREADER_H -#include "AthenaBaseComps/AthReentrantAlgorithm.h" +#include "AthenaBaseComps/AthAlgorithm.h" #include "StoreGate/ReadHandleKey.h" #include "GaudiKernel/ToolHandle.h" @@ -35,7 +35,7 @@ namespace DMTest { * @brief Test for serializing an xAOD object from bytestream. */ class HLTResultReader - : public AthReentrantAlgorithm + : public AthAlgorithm { public: /** @@ -55,7 +55,7 @@ public: /** * @brief Algorithm event processing. */ - virtual StatusCode execute_r (const EventContext& ctx) const override; + virtual StatusCode execute() override; /** diff --git a/Control/DataModelTest/DataModelTestDataRead/src/components/DataModelTestDataRead_entries.cxx b/Control/DataModelTest/DataModelTestDataRead/src/components/DataModelTestDataRead_entries.cxx index dcd8ae7d5007c683d96e346c56ec73c266ecc575..ac5158d54b626b8fb690c18ca9290de838e191da 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/components/DataModelTestDataRead_entries.cxx +++ b/Control/DataModelTest/DataModelTestDataRead/src/components/DataModelTestDataRead_entries.cxx @@ -14,6 +14,9 @@ #include "../AuxDataTestTypelessRead.h" #include "../xAODTestRead.h" #include "../xAODTestReadCVec.h" +#include "../xAODTestReadCView.h" +#include "../xAODTestReadHVec.h" +#include "../xAODTestFilterCVec.h" #include "../xAODTestDecor.h" #include "../xAODTestClearDecor.h" #include "../xAODTestTypelessRead.h" @@ -27,6 +30,9 @@ DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, AuxDataTestClearDecor) DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, AuxDataTestTypelessRead) DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, xAODTestRead) DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, xAODTestReadCVec) +DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, xAODTestReadCView) +DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, xAODTestReadHVec) +DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, xAODTestFilterCVec) DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, xAODTestDecor) DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, xAODTestClearDecor) DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, xAODTestTypelessRead) diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestFilterCVec.cxx b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestFilterCVec.cxx new file mode 100644 index 0000000000000000000000000000000000000000..640f302d671f68fd766b4f5c0dec31bd1f1ba211 --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestFilterCVec.cxx @@ -0,0 +1,93 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +/** + * @file DataModelTestDataRead/src/xAODTestFilterCVec.cxx + * @author snyder@bnl.gov + * @date Sep 2016 + * @brief Algorithm to test filtering xAOD data. + */ + + +#include "xAODTestFilterCVec.h" +#include "DataModelTestDataCommon/CVec.h" +#include "DataModelTestDataCommon/C.h" +#include "DataModelTestDataCommon/CAuxContainer.h" +#include "StoreGate/ReadHandle.h" +#include "StoreGate/WriteHandle.h" +#include <memory> + + +namespace DMTest { + + +/** + * @brief Constructor. + * @param name The algorithm name. + * @param svc The service locator. + */ +xAODTestFilterCVec::xAODTestFilterCVec (const std::string &name, + ISvcLocator *pSvcLocator) + : AthReentrantAlgorithm (name, pSvcLocator), + m_cvecKey ("cvec_renamed"), + m_writeKey ("cvec") +{ + declareProperty ("CVecKey", m_cvecKey); + declareProperty ("WriteKey", m_writeKey); +} + + +/** + * @brief Algorithm initialization; called at the beginning of the job. + */ +StatusCode xAODTestFilterCVec::initialize() +{ + ATH_CHECK( m_cvecKey.initialize() ); + if (!m_writeKey.key().empty()) + ATH_CHECK( m_writeKey.initialize() ); + return StatusCode::SUCCESS; +} + + +/** + * @brief Algorithm event processing. + */ +StatusCode xAODTestFilterCVec::execute_r (const EventContext& ctx) const +{ + SG::ReadHandle<DMTest::CVec> cvec (m_cvecKey, ctx); + const static C::Accessor<ElementLink<DMTest::CVec> > cEL ("cEL"); + + + auto vecnew = std::make_unique<CVec>(); + auto store = std::make_unique<CAuxContainer>(); + vecnew->setStore (store.get()); + for (size_t i = 0; i < cvec->size(); i+=2) { + vecnew->push_back (new C); + *vecnew->back() = *(*cvec)[i]; + } + + size_t i = 0; + for (C* c : *vecnew) { + cEL(*c).toIndexedElement (*vecnew, vecnew->size()-1-i); + ++i; + } + SG::WriteHandle<DMTest::CVec> writevec (m_writeKey, ctx); + ATH_CHECK( writevec.record(std::move(vecnew), std::move(store)) ); + + return StatusCode::SUCCESS; +} + + +/** + * @brief Algorithm finalization; called at the end of the job. + */ +StatusCode xAODTestFilterCVec::finalize() +{ + return StatusCode::SUCCESS; +} + + +} // namespace DMTest + diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestFilterCVec.h b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestFilterCVec.h new file mode 100644 index 0000000000000000000000000000000000000000..f6220c7e8af24eb4ec498aad701ecb6302c4539b --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestFilterCVec.h @@ -0,0 +1,71 @@ +// This file's extension implies that it's C, but it's really -*- C++ -*-. + +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +/** + * @file DataModelTestDataRead/src/xAODTestFilterCVec.h + * @author scott snyder <snyder@bnl.gov> + * @date Sep 2016 + * @brief Algorithm to test filtering xAOD data. + */ + + +#ifndef DATAMODELTESTDATAREAD_XAODTESTFILTERCVEC_H +#define DATAMODELTESTDATAREAD_XAODTESTFILTERCVEC_H + + +#include "DataModelTestDataCommon/CVec.h" +#include "AthenaBaseComps/AthReentrantAlgorithm.h" +#include "StoreGate/ReadHandleKey.h" +#include "StoreGate/WriteHandleKey.h" + + +namespace DMTest { + + +/** + * @brief Algorithm to test filtering xAOD data. + */ +class xAODTestFilterCVec + : public AthReentrantAlgorithm +{ +public: + /** + * @brief Constructor. + * @param name The algorithm name. + * @param svc The service locator. + */ + xAODTestFilterCVec (const std::string &name, ISvcLocator *pSvcLocator); + + + /** + * @brief Algorithm initialization; called at the beginning of the job. + */ + virtual StatusCode initialize() override; + + + /** + * @brief Algorithm event processing. + */ + virtual StatusCode execute_r (const EventContext& ctx) const override; + + + /** + * @brief Algorithm finalization; called at the end of the job. + */ + virtual StatusCode finalize() override; + + +private: + SG::ReadHandleKey<DMTest::CVec> m_cvecKey; + SG::WriteHandleKey<DMTest::CVec> m_writeKey; +}; + + +} // namespace DMTest + + +#endif // not DATAMODELTESTDATAREAD_XAODTESTFILTERCVEC_H diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestRead.cxx b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestRead.cxx index 4a7635c37e1287b0fad0b1888ce557283e1ad622..235cc0caaf98009ae479efc3b47a9698d2d3a7d4 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestRead.cxx +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestRead.cxx @@ -13,16 +13,16 @@ #include "xAODTestRead.h" #include "DataModelTestDataCommon/CVec.h" -#include "DataModelTestDataCommon/CView.h" +//#include "DataModelTestDataCommon/CView.h" #include "DataModelTestDataCommon/CVecWithData.h" #include "DataModelTestDataCommon/C.h" #include "DataModelTestDataCommon/CAuxContainer.h" #include "DataModelTestDataCommon/CTrigAuxContainer.h" #include "DataModelTestDataCommon/CInfoAuxContainer.h" -#include "DataModelTestDataRead/HVec.h" -#include "DataModelTestDataRead/H.h" -#include "DataModelTestDataRead/HAuxContainer.h" -#include "DataModelTestDataRead/HView.h" +//#include "DataModelTestDataRead/HVec.h" +//#include "DataModelTestDataRead/H.h" +//#include "DataModelTestDataRead/HAuxContainer.h" +//#include "DataModelTestDataRead/HView.h" #include "DataModelTestDataRead/GVec.h" #include "DataModelTestDataRead/G.h" #include "DataModelTestDataRead/GAuxContainer.h" @@ -196,8 +196,7 @@ StatusCode xAODTestRead::execute() } CHECK( read_cvec_with_data() ); - CHECK( read_cview() ); - CHECK( read_htest() ); + //CHECK( read_cview() ); return StatusCode::SUCCESS; } @@ -239,6 +238,7 @@ StatusCode xAODTestRead::read_cvec_with_data() const } +#if 0 /** * @brief Test reading view container. */ @@ -268,53 +268,7 @@ StatusCode xAODTestRead::read_cview() const return StatusCode::SUCCESS; } - - -/** - * @brief Test schema evolution involving view container. - */ -StatusCode xAODTestRead::read_htest() const -{ - const HVec* vec = nullptr; - CHECK( evtStore()->retrieve (vec, m_readPrefix + "hvec") ); - std::cout << m_readPrefix << "hvec:"; - for (const H* h : *vec) - std::cout << " " << h->aFloat(); - std::cout << "\n"; - - if (!evtStore()->contains<HView> (m_readPrefix + "hview")) { - std::cout << "(No " << m_readPrefix << "hview.)\n"; - } - else { - CHECK( evtStore()->retrieve (vec, m_readPrefix + "hview") ); - std::cout << m_readPrefix << "hview:"; - for (const H* h : *vec) - std::cout << " " << h->aFloat(); - std::cout << "\n"; - } - - if (!m_writePrefix.empty()) { - // Passing this as the third arg of record will make the object const. - bool LOCKED = false; - auto vecnew = CxxUtils::make_unique<HVec>(); - auto store = CxxUtils::make_unique<HAuxContainer>(); - vecnew->setStore (store.get()); - for (size_t i = 0; i < vec->size(); i++) { - vecnew->push_back (new H); - *vecnew->back() = *(*vec)[i]; - } - - auto viewnew = CxxUtils::make_unique<HView>(); - for (size_t i = 0; i < vec->size(); i++) - viewnew->push_back (vecnew->at(vec->size()-1-i)); - - CHECK (evtStore()->record (std::move(vecnew), m_writePrefix + "hvec", LOCKED)); - CHECK (evtStore()->record (std::move(store), m_writePrefix + "hvecAux.", LOCKED)); - CHECK (evtStore()->record (std::move(viewnew), m_writePrefix + "hview", LOCKED)); - } - - return StatusCode::SUCCESS; -} +#endif /** diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestRead.h b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestRead.h index 0eedf823cbba0aeaa6d58722567230e58d9b8347..fa725403f0bca4b7a212df4fcc4fcd059c517eaa 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestRead.h +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestRead.h @@ -61,10 +61,7 @@ private: StatusCode read_cvec_with_data() const; /// Test reading view container. - StatusCode read_cview() const; - - /// Test schema evolution involving view container. - StatusCode read_htest() const; + //StatusCode read_cview() const; /// Parameter: Prefix for names read from SG. std::string m_readPrefix; diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCVec.cxx b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCVec.cxx index eb4430ff6bc18325e71e7cb4061dd0cdfdfb8bdb..b734f0cb500642d496dbe6c197f979011a0c2087 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCVec.cxx +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCVec.cxx @@ -6,7 +6,7 @@ /** * @file DataModelTestDataRead/src/xAODTestReadCVec.cxx * @author snyder@bnl.gov - * @date May 2014 + * @date Apr, 2016 * @brief Algorithm to test reading xAOD data (CVec). */ @@ -24,6 +24,7 @@ #include "CxxUtils/make_unique.h" #include "GaudiKernel/System.h" #include <memory> +#include <sstream> namespace DMTest { @@ -50,6 +51,10 @@ xAODTestReadCVec::xAODTestReadCVec (const std::string &name, */ StatusCode xAODTestReadCVec::initialize() { + errorcheck::ReportMessage::hideErrorLocus(); + + C::Accessor<float> dVar1 ("dVar1"); + ATH_CHECK( m_cvecKey.initialize() ); if (!m_writeKey.key().empty()) ATH_CHECK( m_writeKey.initialize() ); @@ -67,6 +72,7 @@ StatusCode xAODTestReadCVec::execute_r (const EventContext& ctx) const const static C::Accessor<int> anInt2 ("anInt2"); const static C::Accessor<int> anInt10 ("anInt10"); const static C::Accessor<int> dInt1 ("dInt1"); + const static C::Accessor<float> dVar1 ("dVar1"); // testing schema evolution const static C::Accessor<unsigned int> dpInt1 ("dpInt1"); const static C::Accessor<std::vector<float> > dpvFloat ("dpvFloat"); const static C::Accessor<int> dInt100 ("dInt100"); @@ -81,63 +87,71 @@ StatusCode xAODTestReadCVec::execute_r (const EventContext& ctx) const for (SG::auxid_t auxid : cvec->getAuxIDs()) names.push_back (r.getName(auxid)); std::sort (names.begin(), names.end()); - std::cout << "cvec aux items: "; + std::cout << m_cvecKey.key() << " aux items: "; for (const std::string& n : names) std::cout << n << " "; std::cout << "\n"; - std::cout << "Type of aux store: " - << System::typeinfoName (typeid (*cvec->getConstStore())) << "\n"; + { + const SG::IConstAuxStore* auxstore = cvec->getConstStore(); + std::cout << "Type of aux store: " + << System::typeinfoName (typeid (*auxstore)) << "\n"; + } for (const C* c : *cvec) { - std::cout << " anInt1 " << c->anInt() + std::ostringstream ost; + ost << " anInt1 " << c->anInt() << " aFloat: " << c->aFloat() << " pInt: " << c->pInt() << " pFloat: " << CxxUtils::strformat ("%.2f", c->pFloat()); if (anInt2.isAvailable(*c)) - std::cout << " anInt2: " << anInt2(*c); + ost << " anInt2: " << anInt2(*c); if (dInt1.isAvailable(*c)) - std::cout << " dInt1: " << dInt1(*c); + ost << " dInt1: " << dInt1(*c); + if (dVar1.isAvailable(*c)) + ost << " dVar1: " << dVar1(*c); if (dpInt1.isAvailable(*c)) - std::cout << " dpInt1: " << dpInt1(*c); + ost << " dpInt1: " << dpInt1(*c); if (dInt100.isAvailable(*c)) - std::cout << " dInt100: " << dInt100(*c); + ost << " dInt100: " << dInt100(*c); if (dInt150.isAvailable(*c)) - std::cout << " dInt150: " << dInt150(*c); + ost << " dInt150: " << dInt150(*c); if (dInt200.isAvailable(*c)) - std::cout << " dInt200: " << dInt200(*c); + ost << " dInt200: " << dInt200(*c); if (dInt250.isAvailable(*c)) - std::cout << " dInt250: " << dInt250(*c); + ost << " dInt250: " << dInt250(*c); if (anInt10.isAvailable(*c)) - std::cout << " anInt10: " << anInt10(*c); + ost << " anInt10: " << anInt10(*c); if (cEL.isAvailable(*c)) - std::cout << " cEL: " << cEL(*c).dataID() + ost << " cEL: " << cEL(*c).dataID() << "[" << cEL(*c).index() << "]"; - std::cout << "\n"; + ost << "\n"; { const std::vector<int>& pvi = c->pvInt(); - std::cout << " pvInt: ["; + ost << " pvInt: ["; for (auto ii : pvi) - std::cout << ii << " "; - std::cout << "]\n"; + ost << ii << " "; + ost << "]\n"; } { const std::vector<float>& pvf = c->pvFloat(); - std::cout << " pvFloat: ["; + ost << " pvFloat: ["; for (auto ii : pvf) - std::cout << CxxUtils::strformat ("%.3f", ii) << " "; - std::cout << "]\n"; + ost << CxxUtils::strformat ("%.3f", ii) << " "; + ost << "]\n"; } if (dpvFloat.isAvailable(*c)) { const std::vector<float>& pvf = dpvFloat(*c); - std::cout << " dpvFloat: ["; + ost << " dpvFloat: ["; for (auto ii : pvf) - std::cout << CxxUtils::strformat ("%.3f", ii) << " "; - std::cout << "]\n"; + ost << CxxUtils::strformat ("%.3f", ii) << " "; + ost << "]\n"; } + + std::cout << ost.str(); } if (!m_writeKey.key().empty()) { diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCVec.h b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCVec.h index 1699878c8e705c2c0467f7ff1f22af917c683169..d45f552feebeef3f51063a8f917fa2f59fad4b4f 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCVec.h +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCVec.h @@ -60,12 +60,6 @@ public: private: - /// Parameter: Prefix for names read from SG. - std::string m_readPrefix; - - /// Parameter: Prefix for names written to SG. Null for no write. - std::string m_writePrefix; - SG::ReadHandleKey<DMTest::CVec> m_cvecKey; SG::WriteHandleKey<DMTest::CVec> m_writeKey; }; diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCView.cxx b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCView.cxx new file mode 100644 index 0000000000000000000000000000000000000000..a0a95e62e9f5c5c71d321cdaebd78786828c62e6 --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCView.cxx @@ -0,0 +1,89 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +/** + * @file DataModelTestDataRead/src/xAODTestReadCView.cxx + * @author snyder@bnl.gov + * @date Oct 2016 + * @brief Algorithm to test reading xAOD data (CView). + */ + + +#include "xAODTestReadCView.h" +#include "DataModelTestDataCommon/CView.h" +#include "DataModelTestDataCommon/C.h" +#include "StoreGate/ReadHandle.h" +#include "StoreGate/WriteHandle.h" +#include <memory> +#include <sstream> + + +namespace DMTest { + + +/** + * @brief Constructor. + * @param name The algorithm name. + * @param svc The service locator. + */ +xAODTestReadCView::xAODTestReadCView (const std::string &name, + ISvcLocator *pSvcLocator) + : AthReentrantAlgorithm (name, pSvcLocator), + m_cviewKey ("cview"), + m_writeKey ("") +{ + declareProperty ("CViewKey", m_cviewKey); + declareProperty ("WriteKey", m_writeKey); +} + + +/** + * @brief Algorithm initialization; called at the beginning of the job. + */ +StatusCode xAODTestReadCView::initialize() +{ + ATH_CHECK( m_cviewKey.initialize() ); + if (!m_writeKey.key().empty()) + ATH_CHECK( m_writeKey.initialize() ); + return StatusCode::SUCCESS; +} + + +/** + * @brief Algorithm event processing. + */ +StatusCode xAODTestReadCView::execute_r (const EventContext& ctx) const +{ + SG::ReadHandle<DMTest::CView> cview (m_cviewKey, ctx); + + static C::Accessor<int> anInt10 ("anInt10"); + std::cout << m_cviewKey.key() << ":"; + for (const C* c : *cview) { + std::cout << " " << c->anInt(); + if (anInt10.isAvailable(*c)) + std::cout << "(" << anInt10(*c) << ")"; + } + std::cout << "\n"; + + if (!m_writeKey.key().empty()) { + SG::WriteHandle<DMTest::CView> writeview (m_writeKey, ctx); + ATH_CHECK( writeview.record(std::make_unique<DMTest::CView> (*cview)) ); + } + + return StatusCode::SUCCESS; +} + + +/** + * @brief Algorithm finalization; called at the end of the job. + */ +StatusCode xAODTestReadCView::finalize() +{ + return StatusCode::SUCCESS; +} + + +} // namespace DMTest + diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCView.h b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCView.h new file mode 100644 index 0000000000000000000000000000000000000000..9a722b5977adce46078e03e5918d2af502c6b344 --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadCView.h @@ -0,0 +1,71 @@ +// This file's extension implies that it's C, but it's really -*- C++ -*-. + +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +/** + * @file src/xAODTestReadCView.h + * @author scott snyder <snyder@bnl.gov> + * @date Oct, 2016 + * @brief Algorithm to test reading xAOD data (CView) + */ + + +#ifndef DATAMODELTESTDATAREAD_XAODTESTREADCVIEW_H +#define DATAMODELTESTDATAREAD_XAODTESTREADCVIEW_H + + +#include "DataModelTestDataCommon/CView.h" +#include "AthenaBaseComps/AthReentrantAlgorithm.h" +#include "StoreGate/ReadHandleKey.h" +#include "StoreGate/WriteHandleKey.h" + + +namespace DMTest { + + +/** + * @brief Algorithm to test reading xAOD data (CView). + */ +class xAODTestReadCView + : public AthReentrantAlgorithm +{ +public: + /** + * @brief Constructor. + * @param name The algorithm name. + * @param svc The service locator. + */ + xAODTestReadCView (const std::string &name, ISvcLocator *pSvcLocator); + + + /** + * @brief Algorithm initialization; called at the beginning of the job. + */ + virtual StatusCode initialize() override; + + + /** + * @brief Algorithm event processing. + */ + virtual StatusCode execute_r (const EventContext& ctx) const override; + + + /** + * @brief Algorithm finalization; called at the end of the job. + */ + virtual StatusCode finalize() override; + + +private: + SG::ReadHandleKey<DMTest::CView> m_cviewKey; + SG::WriteHandleKey<DMTest::CView> m_writeKey; +}; + + +} // namespace DMTest + + +#endif // not DATAMODELTESTDATAREAD_XAODTESTREADCVIEW_H diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadHVec.cxx b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadHVec.cxx new file mode 100644 index 0000000000000000000000000000000000000000..1449a57e080a5fe7636145afef10b98042b64d26 --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadHVec.cxx @@ -0,0 +1,117 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +/** + * @file DataModelTestDataRead/src/xAODTestReadHVec.cxx + * @author snyder@bnl.gov + * @date Oct, 2016 + * @brief Algorithm to test reading xAOD data with schema evolution (HVec/HView) + */ + + +#include "xAODTestReadHVec.h" +#include "DataModelTestDataRead/HVec.h" +#include "DataModelTestDataRead/HView.h" +#include "DataModelTestDataRead/H.h" +#include "DataModelTestDataRead/HAuxContainer.h" +#include "StoreGate/ReadHandle.h" +#include "StoreGate/WriteHandle.h" +#include <memory> +#include <sstream> + + +namespace DMTest { + + +/** + * @brief Constructor. + * @param name The algorithm name. + * @param svc The service locator. + */ +xAODTestReadHVec::xAODTestReadHVec (const std::string &name, + ISvcLocator *pSvcLocator) + : AthReentrantAlgorithm (name, pSvcLocator), + m_hvecKey ("hvec"), + m_hviewKey ("hview"), + m_vecWriteKey (""), + m_viewWriteKey ("") +{ + declareProperty ("HVecKey", m_hvecKey); + declareProperty ("HViewKey", m_hviewKey); + declareProperty ("VecWriteKey", m_vecWriteKey); + declareProperty ("ViewWriteKey", m_viewWriteKey); +} + + +/** + * @brief Algorithm initialization; called at the beginning of the job. + */ +StatusCode xAODTestReadHVec::initialize() +{ + ATH_CHECK( m_hvecKey.initialize() ); + if (!m_hviewKey.key().empty()) + ATH_CHECK( m_hviewKey.initialize() ); + if (!m_vecWriteKey.key().empty()) + ATH_CHECK( m_vecWriteKey.initialize() ); + if (!m_viewWriteKey.key().empty()) + ATH_CHECK( m_viewWriteKey.initialize() ); + return StatusCode::SUCCESS; +} + + +/** + * @brief Algorithm event processing. + */ +StatusCode xAODTestReadHVec::execute_r (const EventContext& ctx) const +{ + SG::ReadHandle<DMTest::HVec> hvec (m_hvecKey, ctx); + std::cout << m_hvecKey.key() << ":"; + for (const H* h : *hvec) + std::cout << " " << h->aFloat(); + std::cout << "\n"; + + if (!m_hviewKey.key().empty()) { + SG::ReadHandle<DMTest::HVec> hview (m_hviewKey, ctx); + std::cout << m_hviewKey.key() << ":"; + for (const H* h : *hview) + std::cout << " " << h->aFloat(); + std::cout << "\n"; + + + if (!m_vecWriteKey.key().empty()) { + auto vecnew = std::make_unique<HVec>(); + auto store = std::make_unique<HAuxContainer>(); + vecnew->setStore (store.get()); + for (size_t i = 0; i < hview->size(); i++) { + vecnew->push_back (new H); + *vecnew->back() = *(*hview)[i]; + } + + auto viewnew = std::make_unique<HView>(); + for (size_t i = 0; i < vecnew->size(); i++) + viewnew->push_back (vecnew->at(vecnew->size()-1-i)); + + SG::WriteHandle<DMTest::HVec> writevec (m_vecWriteKey, ctx); + SG::WriteHandle<DMTest::HView> writeview (m_viewWriteKey, ctx); + ATH_CHECK( writevec.record (std::move(vecnew), std::move(store)) ); + ATH_CHECK( writeview.record (std::move(viewnew)) ); + } + } + + return StatusCode::SUCCESS; +} + + +/** + * @brief Algorithm finalization; called at the end of the job. + */ +StatusCode xAODTestReadHVec::finalize() +{ + return StatusCode::SUCCESS; +} + + +} // namespace DMTest + diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadHVec.h b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadHVec.h new file mode 100644 index 0000000000000000000000000000000000000000..c749ab28f13e23a0770b09d5ae4d559533a8e29f --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestReadHVec.h @@ -0,0 +1,74 @@ +// This file's extension implies that it's C, but it's really -*- C++ -*-. + +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id$ +/** + * @file src/xAODTestReadHVec.h + * @author scott snyder <snyder@bnl.gov> + * @date Oct, 2016 + * @brief Algorithm to test reading xAOD data with schema evolution (HVec/HView) + */ + + +#ifndef DATAMODELTESTDATAREAD_XAODTESTREADHVEC_H +#define DATAMODELTESTDATAREAD_XAODTESTREADHVEC_H + + +#include "DataModelTestDataRead/HVec.h" +#include "DataModelTestDataRead/HView.h" +#include "AthenaBaseComps/AthReentrantAlgorithm.h" +#include "StoreGate/ReadHandleKey.h" +#include "StoreGate/WriteHandleKey.h" + + +namespace DMTest { + + +/** + * @brief Algorithm to test reading xAOD data with schema evolution (HVec/HView) + */ +class xAODTestReadHVec + : public AthReentrantAlgorithm +{ +public: + /** + * @brief Constructor. + * @param name The algorithm name. + * @param svc The service locator. + */ + xAODTestReadHVec (const std::string &name, ISvcLocator *pSvcLocator); + + + /** + * @brief Algorithm initialization; called at the beginning of the job. + */ + virtual StatusCode initialize() override; + + + /** + * @brief Algorithm event processing. + */ + virtual StatusCode execute_r (const EventContext& ctx) const override; + + + /** + * @brief Algorithm finalization; called at the end of the job. + */ + virtual StatusCode finalize() override; + + +private: + SG::ReadHandleKey<DMTest::HVec> m_hvecKey; + SG::ReadHandleKey<DMTest::HVec> m_hviewKey; + SG::WriteHandleKey<DMTest::HVec> m_vecWriteKey; + SG::WriteHandleKey<DMTest::HView> m_viewWriteKey; +}; + + +} // namespace DMTest + + +#endif // not DATAMODELTESTDATAREAD_XAODTESTREADHVEC_H diff --git a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestTypelessRead.cxx b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestTypelessRead.cxx index 0b13f83f35946db4a0076d53178c859c9981687b..b6080d62fdd618e1cbfa833d2510464b114cb867 100644 --- a/Control/DataModelTest/DataModelTestDataRead/src/xAODTestTypelessRead.cxx +++ b/Control/DataModelTest/DataModelTestDataRead/src/xAODTestTypelessRead.cxx @@ -32,6 +32,7 @@ #include "CxxUtils/make_unique.h" #include "GaudiKernel/System.h" #include <memory> +#include <sstream> namespace DMTest { @@ -63,70 +64,72 @@ StatusCode xAODTestTypelessRead::initialize() namespace { -void dumpAuxItem (SG::auxid_t auxid, const SG::AuxVectorData& c, size_t i) +void dumpAuxItem (std::ostream& ost, + SG::auxid_t auxid, + const SG::AuxVectorData& c, size_t i) { const SG::AuxTypeRegistry& r = SG::AuxTypeRegistry::instance(); const std::type_info* ti = r.getType(auxid); std::string head = r.getName(auxid) + ": "; if (ti == &typeid(int)) - std::cout << head << c.getData<int> (auxid, i) << "; "; + ost << head << c.getData<int> (auxid, i) << "; "; else if (ti == &typeid(unsigned int)) - std::cout << head << c.getData<unsigned int> (auxid, i) << "; "; + ost << head << c.getData<unsigned int> (auxid, i) << "; "; else if (ti == &typeid(float)) - std::cout << head << CxxUtils::strformat ("%.3f", c.getData<float> (auxid, i)) << "; "; + ost << head << CxxUtils::strformat ("%.3f", c.getData<float> (auxid, i)) << "; "; else if (ti == &typeid(ElementLink<DMTest::CVec>)) { const ElementLink<DMTest::CVec>& el = c.getData<ElementLink<DMTest::CVec> > (auxid, i); - std::cout << head << el.dataID() << "[" << el.index() << "]; "; + ost << head << el.dataID() << "[" << el.index() << "]; "; } #if 0 else if (ti == &typeid(SG::PackedElement<unsigned int>)) - std::cout << head << c.getData<SG::PackedElement<unsigned int> > (auxid, i) << "; "; + ost << head << c.getData<SG::PackedElement<unsigned int> > (auxid, i) << "; "; else if (ti == &typeid(SG::PackedElement<float>)) - std::cout << head << c.getData<SG::PackedElement<float> > (auxid, i) << "; "; + ost << head << c.getData<SG::PackedElement<float> > (auxid, i) << "; "; #endif else if (ti == &typeid(std::vector<unsigned int>)) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<std::vector<unsigned int> > (auxid, i)) - std::cout << ii << " "; - std::cout << "]; "; + ost << ii << " "; + ost << "]; "; } else if (ti == &typeid(std::vector<int>)) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<std::vector<int> > (auxid, i)) - std::cout << ii << " "; - std::cout << "]; "; + ost << ii << " "; + ost << "]; "; } else if (ti == &typeid(std::vector<float>) || strcmp (ti->name(), typeid(std::vector<float>).name()) == 0) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<std::vector<float> > (auxid, i)) - std::cout << CxxUtils::strformat ("%.3f", ii) << " "; - std::cout << "]; "; + ost << CxxUtils::strformat ("%.3f", ii) << " "; + ost << "]; "; } #if 0 else if (ti == &typeid(SG::PackedElement<std::vector<unsigned int> >)) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<SG::PackedElement<std::vector<unsigned int> > > (auxid, i)) - std::cout << ii << " "; - std::cout << "]; "; + ost << ii << " "; + ost << "]; "; } else if (ti == &typeid(SG::PackedElement<std::vector<int> >)) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<SG::PackedElement<std::vector<int> > > (auxid, i)) - std::cout << ii << " "; - std::cout << "]; "; + ost << ii << " "; + ost << "]; "; } else if (ti == &typeid(SG::PackedElement<std::vector<float> >)) { - std::cout << "\n " << head << "["; + ost << "\n " << head << "["; for (auto ii : c.getData<SG::PackedElement<std::vector<float> > > (auxid, i)) - std::cout << CxxUtils::strformat ("%.3f", ii) << " "; - std::cout << "]; "; + ost << CxxUtils::strformat ("%.3f", ii) << " "; + ost << "]; "; } #endif else - std::cout << head << "xxx " << ti->name() << "; "; + ost << head << "xxx " << ti->name() << "; "; } @@ -149,38 +152,41 @@ std::map<std::string, SG::auxid_t> get_map (const SG::AuxElement* elt) } -void dumpelt (const SG::AuxVectorData* cont, +void dumpelt (std::ostream& ost, + const SG::AuxVectorData* cont, size_t index, const std::map<std::string, SG::auxid_t>& auxid_map) { for (const auto& m : auxid_map) - dumpAuxItem (m.second, *cont, index); - std::cout << "\n"; + dumpAuxItem (ost, m.second, *cont, index); + ost << "\n"; } template <class OBJ> -void dumpobj (const OBJ* obj, +void dumpobj (std::ostream& ost, + const OBJ* obj, const std::map<std::string, SG::auxid_t>& auxid_map) { for (size_t i = 0; i < obj->size(); i++) { - std::cout << " "; + ost << " "; if (!obj->hasStore()) { // Handle view container. const auto* elt = obj->at(i); - dumpelt (elt->container(), elt->index(), auxid_map); + dumpelt (ost, elt->container(), elt->index(), auxid_map); } else - dumpelt (obj, i, auxid_map); + dumpelt (ost, obj, i, auxid_map); } } -void dumpobj (const DMTest::C* obj, +void dumpobj (std::ostream& ost, + const DMTest::C* obj, const std::map<std::string, SG::auxid_t>& auxid_map) { const SG::AuxVectorData* cont = obj->container(); - dumpelt (cont, 0, auxid_map); + dumpelt (ost, cont, 0, auxid_map); } @@ -235,7 +241,9 @@ xAODTestTypelessRead::testit (const char* key) << System::typeinfoName (*r.getType(m.second)) << " "; std::cout << "\n"; - dumpobj (obj, auxid_map); + std::ostringstream ost; + dumpobj (ost, obj, auxid_map); + std::cout << ost.str(); if (!m_writePrefix.empty()) { // Passing this as the third arg of record will make the object const. @@ -263,7 +271,9 @@ xAODTestTypelessRead::testit_view (const char* key) return StatusCode::SUCCESS; std::map<std::string, SG::auxid_t> auxid_map = get_map (obj->front()); std::cout << key << "\n"; - dumpobj (obj, auxid_map); + std::ostringstream ost; + dumpobj (ost, obj, auxid_map); + std::cout << ost.str(); if (!m_writePrefix.empty()) { CHECK (evtStore()->record (CxxUtils::make_unique<OBJ>(*obj),