diff --git a/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx b/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx new file mode 100644 index 0000000000000000000000000000000000000000..d6fdf943c3c83cf817a3029d6c74f86162652e55 --- /dev/null +++ b/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx @@ -0,0 +1,23 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id: TrigCompositeAuxContainer_v2.cxx $ + +// Local include(s): +#include "xAODTrigger/versions/TrigCompositeAuxContainer_v2.h" + +namespace xAOD { + + TrigCompositeAuxContainer_v2::TrigCompositeAuxContainer_v2() + : AuxContainerBase(){ + + AUX_VARIABLE( name ); + + AUX_VARIABLE( linkColNames ); + AUX_VARIABLE( linkColKeys ); + AUX_VARIABLE( linkColIndices ); + AUX_VARIABLE( linkColClids ); + } + +} // namespace xAOD diff --git a/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx b/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx index 77f4b31c3d9aa04ef16ac6711a162078d2457caf..6c741ccc3ea51e3e72217ec069def2a765a0a7ea 100644 --- a/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx +++ b/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.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 */ // $Id: TrigComposite_v1.cxx 784384 2016-11-15 16:37:49Z tamartin $ @@ -39,279 +39,13 @@ namespace xAOD { return *this; } - AUXSTORE_OBJECT_SETTER_AND_GETTER( TrigComposite_v1, std::string, - name, setName ) - - template<> - bool TrigComposite_v1::hasDetail<uint32_t>( const std::string& name ) const { - return hasDetail<int32_t>(name); - } - - template<> - bool TrigComposite_v1::hasDetail<std::vector<uint32_t>>( const std::string& name ) const { - return hasDetail<std::vector<int32_t>>(name); - } - - template<> - bool TrigComposite_v1::hasDetail<std::vector<uint16_t>>( const std::string& name ) const { - return hasDetail<std::vector<int32_t>>(name); - } - - template<> - bool TrigComposite_v1::hasDetail<std::string>( const std::string& name ) const { - return hasDetail<std::vector<int32_t>>(name); - } - - template<> - bool TrigComposite_v1::hasDetail<std::vector<std::string>>( const std::string& name ) const { - return hasDetail<std::vector<int32_t>>(name); - } - ///////////////////////////////////////////////////////////////////////////// // - // Simple detail accessor functions + // Built in accessor functions // - bool TrigComposite_v1::setDetail( const std::string& name, int32_t value ) { - - // It should be pretty strange if this should fail: - try { - auxdata< int32_t >( name ) = value; - } catch(const std::exception& exc) { - std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in int32_t: [" << exc.what() << "]" << std::endl; - return false; - } - - // Return gracefully: - return true; - } - - bool TrigComposite_v1::setDetail( const std::string& name, uint32_t value ) { - return setDetail(name, (int32_t)value); // place for conversion if needed - } - - bool TrigComposite_v1::setDetail( const std::string& name, float value ) { - - // It should be pretty strange if this should fail: - try { - auxdata< float >( name ) = value; - } catch(const std::exception& exc) { - std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in float: [" << exc.what() << "]" << std::endl; - return false; - } - - // Return gracefully: - return true; - } - - bool TrigComposite_v1::setDetail( const std::string& name, - const std::vector< int32_t >& value ) { - - // It should be pretty strange if this should fail: - try { - auxdata< std::vector< int32_t > >( name ) = value; - } catch(const std::exception& exc) { - std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in vector<int32_t>: [" << exc.what() << "]" << std::endl; - return false; - } - - // Return gracefully: - return true; - } - - - bool TrigComposite_v1::setDetail( const std::string& name, - const std::vector< uint32_t >& value ) { - - // It should be pretty strange if this should fail: - std::vector<int32_t> temp(value.begin(), value.end()); // - try { - auxdata< std::vector< int32_t > >( name ) = temp; - } catch(const std::exception& exc) { - std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in vector<uint32_t>: [" << exc.what() << "]" << std::endl; - return false; - } - - // Return gracefully: - return true; - } - - bool TrigComposite_v1::setDetail( const std::string& name, - const std::vector< uint16_t >& value ) { - - std::vector<uint32_t> temp; - temp.reserve( value.size() / 2 ); - - // Pack shorts for space efficiency - for (size_t i = 0; i < value.size(); i += 2) { - const uint16_t a = value.at(i); - const uint16_t b = (i + 1 < value.size() ? value.at(i + 1) : std::numeric_limits<uint16_t>::max() ); - const uint32_t combine = ( (b << 16) | (a & 0xffff) ); - temp.push_back( combine ); - } - - return setDetail(name, temp); - } - - bool TrigComposite_v1::setDetail( const std::string& name, - const std::vector< float >& value ) { - - // It should be pretty strange if this should fail: - try { - auxdata< std::vector< float > >( name ) = value; - } catch(const std::exception& exc) { - std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in vector<float>: [" << exc.what() << "]" << std::endl; - return false; - } - - // Return gracefully: - return true; - } - - bool TrigComposite_v1::setDetail( const std::string& name, const std::string& value ) { - - std::vector<uint32_t> serialForm; - HLT::StringSerializer::serialize(value, serialForm); - return setDetail(name, serialForm); - } - - bool TrigComposite_v1::setDetail( const std::string& name, const std::vector< std::string >& value ) { - - std::vector<uint32_t> serialForm; - HLT::StringSerializer::serialize(value, serialForm); - return setDetail(name, serialForm); - } - - bool TrigComposite_v1::getDetail( const std::string& name, - int32_t& value ) const { - - // Object used to access the auxiliary data: - Accessor< int32_t > acc( name ); - - // Enable the check once it will work correctly: - if( ! acc.isAvailable( *this ) ) { - return false; - } - - // Retrieve this detail: - value = acc( *this ); - return true; - } - - - bool TrigComposite_v1::getDetail( const std::string& name, - uint32_t& value ) const { - int32_t v = 0; - const bool status = getDetail(name, v); - value = v; // place for cast - return status; - - } - - bool TrigComposite_v1::getDetail( const std::string& name, - float& value ) const { - - // Object used to access the auxiliary data: - Accessor< float > acc( name ); - - // Enable the check once it will work correctly: - if( ! acc.isAvailable( *this ) ) { - return false; - } - - // Retrieve this detail: - value = acc( *this ); - return true; - } - - - bool TrigComposite_v1::getDetail( const std::string& name, - std::vector< int32_t >& value ) const { - - // Object used to access the auxiliary data: - Accessor< std::vector< int32_t > > acc( name ); - - // Enable the check once it will work correctly: - if( ! acc.isAvailable( *this ) ) { - return false; - } - - // Retrieve this detail: - value = acc( *this ); - return true; - } - - bool TrigComposite_v1::getDetail( const std::string& name, - std::vector< uint32_t >& value ) const { - - std::vector<int32_t> temp; - const bool status = getDetail(name, temp); - - value.reserve(temp.size()); - for ( int32_t i: temp ) - value.push_back(i); - return status; - } - - bool TrigComposite_v1::getDetail( const std::string& name, - std::vector< uint16_t >& value ) const { - - std::vector<uint32_t> temp; - const bool status = getDetail(name, temp); - value.reserve(temp.size() * 2); - - // Unpack shorts - static const uint32_t mask = std::numeric_limits<uint16_t>::max(); - for (size_t i = 0; i < temp.size(); ++i) { - const uint32_t packed = temp.at(i); - const uint16_t a = packed & mask; - const uint16_t b = packed >> 16; - value.push_back(a); - // Use this to tell if the second half of the int was used or not - if (b != std::numeric_limits<uint16_t>::max()) { - value.push_back(b); - } - } - - return status; - } - - - bool TrigComposite_v1::getDetail( const std::string& name, - std::vector< float >& value ) const { - - // Object used to access the auxiliary data: - Accessor< std::vector< float > > acc( name ); - - // Enable the check once it will work correctly: - if( ! acc.isAvailable( *this ) ) { - return false; - } - - // Retrieve this detail: - value = acc( *this ); - return true; - } - - bool TrigComposite_v1::getDetail( const std::string& name, - std::string& value ) const { - - std::vector<uint32_t> temp; - const bool status = getDetail(name, temp); - - HLT::StringSerializer::deserialize(temp.begin(), temp.end(), value); - return status; - } - - bool TrigComposite_v1::getDetail( const std::string& name, - std::vector< std::string >& value ) const { - - std::vector<uint32_t> temp; - const bool status = getDetail(name, temp); - - HLT::StringSerializer::deserialize(temp.begin(), temp.end(), value); - return status; - } + AUXSTORE_OBJECT_SETTER_AND_GETTER( TrigComposite_v1, std::string, + name, setName ) // ///////////////////////////////////////////////////////////////////////////// diff --git a/Event/xAOD/xAODTrigger/share/ut_xaodtrigger_trigcomposite_test.ref b/Event/xAOD/xAODTrigger/share/ut_xaodtrigger_trigcomposite_test.ref index 332fac4a699a78f39db54123f5b784acf545ed45..d46641d05b5a2a7a897185148194766da87fd07c 100644 --- a/Event/xAOD/xAODTrigger/share/ut_xaodtrigger_trigcomposite_test.ref +++ b/Event/xAOD/xAODTrigger/share/ut_xaodtrigger_trigcomposite_test.ref @@ -1,9 +1,8 @@ Populating initial TC object Set detail ok. +Set detail ok. Testing initial TC object Has detail ok. -UnsignedShortVecValueEven = 5 10 50 100 -UnsignedShortVecValueOdd = 1 1 3 4 7 FloatVecValue = [1.23, 2.34] Simple getDetail API ok. Missing details handled ok. @@ -11,8 +10,6 @@ Basic link functionality OK Link recovery OK Testing copy constructor Has detail ok. -UnsignedShortVecValueEven = 5 10 50 100 -UnsignedShortVecValueOdd = 1 1 3 4 7 FloatVecValue = [1.23, 2.34] Simple getDetail API ok. Missing details handled ok. @@ -20,8 +17,6 @@ Basic link functionality OK Link recovery OK Testing assignment operator (standalone object) Has detail ok. -UnsignedShortVecValueEven = 5 10 50 100 -UnsignedShortVecValueOdd = 1 1 3 4 7 FloatVecValue = [1.23, 2.34] Simple getDetail API ok. Missing details handled ok. @@ -29,8 +24,13 @@ Basic link functionality OK Link recovery OK Testing assignment operator (object with store) Has detail ok. -UnsignedShortVecValueEven = 5 10 50 100 -UnsignedShortVecValueOdd = 1 1 3 4 7 +FloatVecValue = [1.23, 2.34] +Simple getDetail API ok. +Missing details handled ok. +Basic link functionality OK +Link recovery OK +Testing assignment operator (EDM migration - new aux) +Has detail ok. FloatVecValue = [1.23, 2.34] Simple getDetail API ok. Missing details handled ok. diff --git a/Event/xAOD/xAODTrigger/test/ut_xaodtrigger_trigcomposite_test.cxx b/Event/xAOD/xAODTrigger/test/ut_xaodtrigger_trigcomposite_test.cxx index 3f02ee018d778445137a9279ee6de534dc078c9a..7a5c5446a7bc724812fbe762a9a1bfc480f12bd3 100644 --- a/Event/xAOD/xAODTrigger/test/ut_xaodtrigger_trigcomposite_test.cxx +++ b/Event/xAOD/xAODTrigger/test/ut_xaodtrigger_trigcomposite_test.cxx @@ -11,10 +11,12 @@ // EDM include(s): #include "AthLinks/ElementLink.h" #include "AthLinks/ElementLinkVector.h" +#include "AthContainers/tools/copyAuxStoreThinned.h" // Local include(s): #include "xAODTrigger/TrigCompositeContainer.h" #include "xAODTrigger/TrigCompositeAuxContainer.h" +#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h" #include "xAODTrigger/MuonRoIContainer.h" /// Helper macro for testing the code @@ -43,21 +45,12 @@ std::ostream& operator<< ( std::ostream& out, const std::vector< T >& vec ) { return out; } -const unsigned uintTestConst = (1<<(sizeof(unsigned)*4-1)) + 41; - int populateObject(xAOD::TrigComposite* obj) { - // Set some simple properties on it: obj->setName( "TestObj" ); obj->setDetail( "IntValue", 12 ); - obj->setDetail( "UnsignedIntValue", uintTestConst ); obj->setDetail( "FloatValue", 3.14f ); obj->setDetail( "IntVecValue", std::vector< int >( { 1, 2, 3 } ) ); - obj->setDetail( "UnsignedIntVecValue", std::vector< unsigned int >( { uintTestConst, 2, 3 } ) ); - obj->setDetail( "UnsignedShortVecValueEven", std::vector< uint16_t >( { 5, 10, 50, 100 } ) ); // Packs into two ints - obj->setDetail( "UnsignedShortVecValueOdd", std::vector< uint16_t >( { 1, 1, 3, 4, 7 } ) ); // Packs into three ints obj->setDetail( "FloatVecValue", std::vector< float >( { 1.23, 2.34 } ) ); - obj->setDetail( "StringValue", std::string("I am a string")); - obj->setDetail( "StringVecValue", std::vector< std::string >( {"Hello", "I", "am", "a", "string", "vector"} ) ); std::cout << "Set detail ok." << std::endl; @@ -83,16 +76,9 @@ int populateObject(xAOD::TrigComposite* obj) { int testDetails(const xAOD::TrigComposite* obj) { SIMPLE_ASSERT( obj->hasDetail<int>("IntValue") ); - SIMPLE_ASSERT( obj->hasDetail<unsigned int>("UnsignedIntValue") ); SIMPLE_ASSERT( obj->hasDetail<float>("FloatValue") ); SIMPLE_ASSERT( obj->hasDetail<std::vector<int> >("IntVecValue") ); - SIMPLE_ASSERT( obj->hasDetail<std::vector<unsigned int> >("UnsignedIntVecValue") ); - // These should work.... but they do not.... still being investigated - // SIMPLE_ASSERT( obj->hasDetail<std::vector<uint16_t> >("UnsignedShortVecValueEven") ); - // SIMPLE_ASSERT( obj->hasDetail<std::vector<uint16_t> >("UnsignedShortVecValueOdd") ); SIMPLE_ASSERT( obj->hasDetail<std::vector<float> >("FloatVecValue") ); - // SIMPLE_ASSERT( obj->hasDetail<std::string>("StringValue") ); - // SIMPLE_ASSERT( obj->hasDetail<std::vector<std::string> >("StringVecValue") ); std::cout << "Has detail ok." << std::endl; @@ -103,10 +89,6 @@ int testDetails(const xAOD::TrigComposite* obj) { SIMPLE_ASSERT( obj->getDetail( "IntValue", intValue ) ); SIMPLE_ASSERT( intValue == 12 ); - unsigned int unsignedIntValue = 0; // we want to use also the sin bit - SIMPLE_ASSERT( obj->getDetail( "UnsignedIntValue", unsignedIntValue ) ); - SIMPLE_ASSERT( unsignedIntValue == uintTestConst ); - float floatValue = 0; SIMPLE_ASSERT( obj->getDetail( "FloatValue", floatValue ) ); SIMPLE_ASSERT( std::abs( floatValue - 3.14 ) < 0.001 ); @@ -115,41 +97,13 @@ int testDetails(const xAOD::TrigComposite* obj) { SIMPLE_ASSERT( obj->getDetail( "IntVecValue", intVector ) ); SIMPLE_ASSERT( intVector == std::vector< int >( { 1, 2, 3 } ) ); - std::vector<unsigned int> unsignedIntVector; - SIMPLE_ASSERT( obj->getDetail("UnsignedIntVecValue", unsignedIntVector) ); - SIMPLE_ASSERT( unsignedIntVector == std::vector<unsigned int>( { uintTestConst, 2, 3 } ) ); - - std::vector<uint16_t> unsignedShortVectorEven; - SIMPLE_ASSERT( obj->getDetail("UnsignedShortVecValueEven", unsignedShortVectorEven) ); - std::cout << "UnsignedShortVecValueEven = "; - for (auto v : unsignedShortVectorEven) std::cout << v << " "; - std::cout << std::endl; - SIMPLE_ASSERT( unsignedShortVectorEven == std::vector<uint16_t>( { 5, 10, 50, 100 } ) ); - - std::vector<uint16_t> unsignedShortVectorOdd; - SIMPLE_ASSERT( obj->getDetail("UnsignedShortVecValueOdd", unsignedShortVectorOdd) ); - std::cout << "UnsignedShortVecValueOdd = "; - for (auto v : unsignedShortVectorOdd) std::cout << v << " "; - std::cout << std::endl; - SIMPLE_ASSERT( unsignedShortVectorOdd == std::vector<uint16_t>( { 1, 1, 3, 4, 7 } ) ); - std::vector< float > floatVector; SIMPLE_ASSERT( obj->getDetail( "FloatVecValue", floatVector ) ); // Simply just print the last one: std::cout << "FloatVecValue = " << floatVector << std::endl; - std::string stringValue; - SIMPLE_ASSERT( obj->getDetail("StringValue", stringValue) ); - SIMPLE_ASSERT( stringValue == std::string("I am a string") ); - - std::vector<std::string> stringVecValue; - SIMPLE_ASSERT( obj->getDetail("StringVecValue", stringVecValue) ); - SIMPLE_ASSERT( stringVecValue == std::vector< std::string >( {"Hello", "I", "am", "a", "string", "vector"} ) ); - int intValue2 = obj->getDetail<int>("IntValue"); SIMPLE_ASSERT( intValue2 == 12 ); - unsigned int unsignedIntValue2 = obj->getDetail<unsigned int>("UnsignedIntValue"); - SIMPLE_ASSERT( unsignedIntValue2 == uintTestConst); float floatValue2 = obj->getDetail<float>("FloatValue"); SIMPLE_ASSERT( std::abs( floatValue2 - 3.14 ) < 0.001 ); std::vector<int> intVector2 = obj->getDetail<std::vector<int>>( "IntVecValue"); @@ -157,9 +111,6 @@ int testDetails(const xAOD::TrigComposite* obj) { std::vector< float > floatVector2 = obj->getDetail<std::vector<float>>( "FloatVecValue"); std::cout << "Simple getDetail API ok." << std::endl; - std::vector<unsigned int> unsignedIntVector2 = obj->getDetail<std::vector<unsigned int>>("UnsignedIntVecValue"); - SIMPLE_ASSERT( unsignedIntVector2 == std::vector<unsigned int>( { uintTestConst, 2, 3 } ) ); - try { obj->getDetail<int>("NonExistent"); SIMPLE_ASSERT(false); @@ -242,6 +193,22 @@ int main() { c2.push_back( obj2 ); *obj2 = *obj; + // Testing the v1 -> v2 EDM migration, change in Aux base class + xAOD::TrigCompositeAuxContainer_v1 aux_v1; + xAOD::TrigCompositeContainer c_edm_a; + c_edm_a.setStore( &aux_v1 ); + xAOD::TrigComposite* obj_edm_a = new xAOD::TrigComposite(); + c_edm_a.push_back(obj_edm_a); // Now has an old-style store + populateObject(obj_edm_a); + // Creating a new object in a new store + xAOD::TrigCompositeAuxContainer aux_vlatest; + xAOD::TrigCompositeContainer c_edm_b; + c_edm_b.setStore( &aux_vlatest ); + xAOD::TrigComposite* obj_edm_b = new xAOD::TrigComposite(); + c_edm_b.push_back(obj_edm_b); + // Copy + SG::copyAuxStoreThinned( aux_v1, aux_vlatest, 0 ); + std::cout << "Testing initial TC object" << std::endl; SIMPLE_ASSERT( testObject(obj) == 0 ); @@ -254,6 +221,9 @@ int main() { std::cout << "Testing assignment operator (object with store)" << std::endl; SIMPLE_ASSERT( testObject(obj2) == 0 ); + std::cout << "Testing assignment operator (EDM migration - new aux)" << std::endl; + SIMPLE_ASSERT( testObject(obj_edm_b) == 0 ); + // Make new objects to test the link copy xAOD::TrigComposite* fullCopy = new xAOD::TrigComposite(); c.push_back( fullCopy ); diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml b/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml index 279b13a8d10c048ac251ea8c0fc420d430eddc83..a336d26549c40ab88c901f80d273464d24d46d90 100644 --- a/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml +++ b/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml @@ -110,6 +110,10 @@ <class name="xAOD::TrigCompositeAuxContainer_v1" id="171EB8B8-A777-47D9-94A9-33B2482E2AAF" /> + <!-- TrigComposite_v2 dictionaries: --> + <class name="xAOD::TrigCompositeAuxContainer_v2" + id="3174A8A0-7EA2-436D-93FC-0D058BE99B09" /> + <!-- RoiDescriptorStore_v1 dictionaries: --> <class name="xAOD::RoiDescriptorStore_v1" id="882822c8-906a-11e5-87f4-02163e010d8c" /> diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h new file mode 100644 index 0000000000000000000000000000000000000000..a930c557c246d21a8ce1ae5b7aa37d3da8c18465 --- /dev/null +++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h @@ -0,0 +1,52 @@ +// Dear emacs, this is -*- c++ -*- + +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// $Id: TrigCompositeAuxContainer_v2.h $ +#ifndef XAODTRIGGER_VERSIONS_TRIGCOMPOSITEAUXCONTAINER_V2_H +#define XAODTRIGGER_VERSIONS_TRIGCOMPOSITEAUXCONTAINER_V2_H + +// System include(s): +extern "C" { +# include <stdint.h> +} +#include <vector> +#include <string> + +// xAOD include(s): +#include "xAODCore/AuxContainerBase.h" + +namespace xAOD { + + /// Auxiliary store for TrigComposite containers + /// + /// This v2 changes the base class from ByteStreamAuxContainer_v1 to AuxContainerBase + /// for Run 3. Otherwise, it is the same. + /// + /// $Date: 2019-01-23 $ + /// + class TrigCompositeAuxContainer_v2 : public AuxContainerBase { + + public: + /// Default constuctor + TrigCompositeAuxContainer_v2(); + + private: + std::vector< std::string > name; + + std::vector< std::vector< std::string > > linkColNames; + std::vector< std::vector< uint32_t > > linkColKeys; + std::vector< std::vector< uint16_t > > linkColIndices; + std::vector< std::vector< uint32_t > > linkColClids; + + }; // class TrigCompositeAuxContainer_v2 + +} // namespace xAOD + +// Declare the inheritance of the class: +#include "xAODCore/BaseInfo.h" +SG_BASE( xAOD::TrigCompositeAuxContainer_v2, xAOD::AuxContainerBase ); + +#endif // XAODTRIGGER_VERSIONS_TRIGCOMPOSITEAUXCONTAINER_V2_H diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h index 0f55daf1f17205fecdcfb3572e80c55a9068b5e7..69027545a609b4ff24d31955a2edc4eac9ed0f6c 100644 --- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h +++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h @@ -63,70 +63,17 @@ namespace xAOD { template< typename TYPE > bool hasDetail( const std::string& name ) const; - /// Set an integer detail on the object - bool setDetail( const std::string& name, int32_t value ); - /// Set an unsigned detail on the object - bool setDetail( const std::string& name, uint32_t value ); - /// Set a floating point detail on the object - bool setDetail( const std::string& name, float value ); - /// Set a string detail on the object - bool setDetail( const std::string& name, - const std::string& value ); - /// Set a vector<int> detail on the object - bool setDetail( const std::string& name, - const std::vector< int32_t >& value ); - /// Set a vector<unsigned int> detail on the object - bool setDetail( const std::string& name, - const std::vector< uint32_t >& value ); - /// Set a vector<unsigned short> detail on the object. Note: For an even vector, the final entry cannot be (2^16)-1=65535 - bool setDetail( const std::string& name, - const std::vector< uint16_t >& value ); - /// Set a vector<float> detail on the object - bool setDetail( const std::string& name, - const std::vector< float >& value ); - /// Set a vector<string> detail on the object - bool setDetail( const std::string& name, - const std::vector< std::string >& value ); - - /// Get an integer detail from the object - bool getDetail( const std::string& name, int32_t& value ) const; - - /// Get an unsigned integer detail from the object - bool getDetail( const std::string& name, uint32_t& value ) const; - - /// Get a floating point detail from the object - bool getDetail( const std::string& name, float& value ) const; - - /// Get a string detail from the object - bool getDetail( const std::string& name, std::string& value ) const; - - /// Get a vector<int> detail from the object - bool getDetail( const std::string& name, - std::vector< int32_t >& value ) const; - - /// Get a vector<insigned int> detail from the object - bool getDetail( const std::string& name, - std::vector< uint32_t >& value ) const; - - /// Get a vector<unsigned short> detail from the object - bool getDetail( const std::string& name, - std::vector< uint16_t >& value ) const; - - /// Get a vector<float> detail from the object - bool getDetail( const std::string& name, - std::vector< float >& value ) const; - - /// Get a vector<string> detail from the object - bool getDetail( const std::string& name, - std::vector< std::string >& value ) const; + /// Set an TYPE detail on the object + template< typename TYPE > + bool setDetail( const std::string& name, const TYPE& value ); - /// Get a detail by name, missing detail will result on std::runtime_error exception - template<typename T> - T getDetail( const std::string& name ) const; + /// Get an TYPE detail from the object + template< typename TYPE > + bool getDetail( const std::string& name, TYPE& value ) const; - /// Get a detail by name, will not throw. Name change to solve disambiguation - template<typename T> - std::pair<bool, T> returnDetail( const std::string& name ) const; + /// Get a detail by name, missing detail will result on std::runtime_error exception + template<typename TYPE> + TYPE getDetail( const std::string& name ) const; /// @} @@ -162,9 +109,16 @@ namespace xAOD { ElementLinkVector< CONTAINER > objectCollectionLinks( const std::string& collectionName ) const; + /// Add a link without type + void typelessSetObjectLink( const std::string& name, + const uint32_t key, + const uint32_t clid, + const uint16_t beginIndex, + const uint16_t endIndex = 0 ); + /// @} - /// @name Functions for accessing links to component objects and object collections + /// @name Functions for copying links between objects /// @{ /// Copy one named link from another object. @@ -206,8 +160,6 @@ namespace xAOD { /// Raw access to the persistent link CLIDs const std::vector< uint32_t >& linkColClids() const; - /// Add a link without type - void typelessSetObjectLink( const std::string& name, const uint32_t key, const uint32_t clid, const uint16_t beginIndex, const uint16_t endIndex = 0 ); /// @} diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc index f3ba33b46801c5ebad0cb304ad038333e23c4310..360664965ada39b4a054b1a6beaf1e6d3a60151e 100644 --- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc +++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc @@ -1,7 +1,7 @@ // Dear emacs, this is -*- 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 */ // $Id: TrigComposite_v1.icc 784388 2016-11-15 17:08:58Z tamartin $ @@ -19,36 +19,46 @@ namespace xAOD { - template< typename TYPE > - bool TrigComposite_v1::hasDetail( const std::string& name ) const { - - // Object used to check for the existence of an object: - Accessor< TYPE > acc( name ); - - // Use the Accessor object for the check: - return acc.isAvailable( *this ); - } + template< typename TYPE > + bool TrigComposite_v1::hasDetail( const std::string& name ) const { - template<> - bool TrigComposite_v1::hasDetail<unsigned int>( const std::string& name ) const; + // Object used to check for the existence of an object: + ConstAccessor< TYPE > acc( name ); - template<> - bool TrigComposite_v1::hasDetail<std::vector<unsigned int>>( const std::string& name ) const; + // Use the Accessor object for the check: + return acc.isAvailable( *this ); + } + template< typename TYPE > + bool TrigComposite_v1::setDetail( const std::string& name, const TYPE& value ) { + // It should be pretty strange if this should fail: + try { + auxdata< TYPE >( name ) = value; + } catch(const std::exception& exc) { + std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found: [" << exc.what() << "]" << std::endl; + return false; + } + // Return gracefully: + return true; + } template< typename TYPE > - TYPE TrigComposite_v1::getDetail( const std::string& name ) const { - TYPE temp; - if ( getDetail(name, temp) == false ) - throw std::runtime_error( "xAOD::TrigComposite::getDetail<TYPE>("+name+") encountered missing detail"); - return temp; // RVO + bool TrigComposite_v1::getDetail( const std::string& name, TYPE& value) const { + if( ! hasDetail<TYPE>(name) ) { + return false; + } + // Object used to access the auxiliary data: + ConstAccessor< TYPE > acc( name ); + value = acc( *this ); + return true; } - template<typename TYPE> - std::pair<bool, TYPE> TrigComposite_v1::returnDetail( const std::string& name ) const { + template< typename TYPE > + TYPE TrigComposite_v1::getDetail( const std::string& name ) const { TYPE temp; - bool result = getDetail(name, temp); - return std::make_pair(result, temp); + if ( getDetail(name, temp) == false ) + throw std::runtime_error( "xAOD::TrigComposite::getDetail<TYPE>("+name+") encountered missing detail"); + return temp; // RVO } template< class CONTAINER > diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h b/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h index 4945e0a29e7e4e0c41a7b1abe560ec70f5c2630e..6ce42c1839a9c1a88cfda109e3c8e1260f130a4d 100644 --- a/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h +++ b/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h @@ -66,6 +66,7 @@ #include "xAODTrigger/versions/TrigComposite_v1.h" #include "xAODTrigger/versions/TrigCompositeContainer_v1.h" #include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h" +#include "xAODTrigger/versions/TrigCompositeAuxContainer_v2.h" #include "xAODTrigger/versions/BunchConfKey_v1.h" #include "xAODTrigger/versions/BunchConfContainer_v1.h" diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.cxx b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.cxx index a8ab7fcb3cd958f887814dbf278ee9f647082786..02f0be4aa2641882b6a8272b24adedb65e5d3b86 100644 --- a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.cxx +++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.cxx @@ -1,9 +1,73 @@ /* - * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration. - */ -/** - * @file xAODTriggerAthenaPool/xAODTrigCompositeAuxContainer.h - * @author scott snyder <snyder@bnl.gov> - * @date Dec, 2018 - * @brief Dummy source file so that cmake will know this is a custom converter. - */ + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// System include(s): +#include <exception> +#include <memory> +#include <iostream> + +// EDM include(s): +#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h" + +// Local include(s): +#include "xAODTrigCompositeAuxContainerCnv.h" +#include "xAODTrigCompositeAuxContainerCnv_v1.h" +#include "AthContainers/tools/copyThinned.h" +#include "AthenaKernel/IThinningSvc.h" + +xAODTrigCompositeAuxContainerCnv::xAODTrigCompositeAuxContainerCnv( ISvcLocator* svcLoc ) + : xAODTrigCompositeAuxContainerCnvBase( svcLoc ) { + +} + +xAOD::TrigCompositeAuxContainer* +xAODTrigCompositeAuxContainerCnv:: +createPersistent( xAOD::TrigCompositeAuxContainer* trans ) { + + // Create a copy of the container: + return SG::copyThinned (*trans, IThinningSvc::instance()); +} + +StatusCode xAODTrigCompositeAuxContainerCnv:: +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::TrigCompositeAuxContainer: " << m_key ); + + // Let the base class do its thing now: + return AthenaPoolConverter::createObj( pAddr, pObj ); +} + +xAOD::TrigCompositeAuxContainer* xAODTrigCompositeAuxContainerCnv::createTransient() { + + // The known ID(s) for this container: + static const pool::Guid v1_guid( "171EB8B8-A777-47D9-94A9-33B2482E2AAF" ); + static const pool::Guid v2_guid( "3174A8A0-7EA2-436D-93FC-0D058BE99B09" ); + + // Check which version of the container we're reading: + if( compareClassGuid( v2_guid ) ) { + + // It's the latest version, read it directly: + return poolReadObject< xAOD::TrigCompositeAuxContainer >(); + + } + else if( compareClassGuid( v1_guid ) ) { + + // The v1 converter: + static xAODTrigCompositeAuxContainerCnv_v1 converter; + + // Read in the v1 object: + std::unique_ptr< xAOD::TrigCompositeAuxContainer_v1 > + old( poolReadObject< xAOD::TrigCompositeAuxContainer_v1 >() ); + + // Return the converted object: + return converter.createTransient( old.get(), msg() ); + } + + // If we didn't recognise the ID: + throw std::runtime_error( "Unsupported version of " + "xAOD::TrigCompositeAuxContainer found" ); + return 0; +} diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.h b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.h index 2cc3737c885bc781f6982f72fc0da3ba0d870849..b189b579ec6928895120ddd0034bf5e144253dfb 100644 --- a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.h +++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.h @@ -1,6 +1,6 @@ // This file's extension implies that it's C, but it's really -*- C++ -*-. /* - * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration. + * Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration. */ /** * @file xAODTriggerAthenaPool/xAODTrigCompositeAuxContainer.h @@ -13,10 +13,53 @@ #ifndef XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_H #define XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_H +// stystem includes +#include <string> + +// Gaudi/Athena include(s): +#include "AthenaPoolCnvSvc/T_AthenaPoolCustomCnv.h" + +// EDM include(s): #include "xAODTrigger/TrigCompositeAuxContainer.h" -#include "AthenaPoolCnvSvc/T_AthenaPoolAuxContainerCnv.h" -typedef T_AthenaPoolAuxContainerCnv<xAOD::TrigCompositeAuxContainer> - xAODTrigCompositeAuxContainerCnv; + +/// Base class for the converter +typedef T_AthenaPoolCustomCnv< xAOD::TrigCompositeAuxContainer, + xAOD::TrigCompositeAuxContainer > + xAODTrigCompositeAuxContainerCnvBase; + +/** + * @short POOL converter for the xAOD::TrigCompositeAuxContainer class + * + * This is the converter doing the actual schema evolution + * of the package via the Aux container + * + */ +class xAODTrigCompositeAuxContainerCnv : + public xAODTrigCompositeAuxContainerCnvBase { + + // Declare the factory as our friend: + friend class CnvFactory< xAODTrigCompositeAuxContainerCnv >; + +protected: + /// Converter constructor +public: + xAODTrigCompositeAuxContainerCnv( ISvcLocator* svcLoc ); +protected: + + /// Function preparing the container to be written out + virtual xAOD::TrigCompositeAuxContainer* + createPersistent( xAOD::TrigCompositeAuxContainer* trans ); + /// Function reading in the object from the input file + virtual xAOD::TrigCompositeAuxContainer* 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 xAODTrigCompositeAuxContainerCnv #endif // not XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_H diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.cxx b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.cxx new file mode 100644 index 0000000000000000000000000000000000000000..614b518ec5e0d911535db6985724fbda94692078 --- /dev/null +++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.cxx @@ -0,0 +1,85 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// System include(s): +#include <stdexcept> + +// Gaudi/Athena include(s): +#include "GaudiKernel/MsgStream.h" + +// EDM include(s): +#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h" +#include "xAODTrigger/TrigCompositeAuxContainer.h" +#include "xAODTrigger/versions/TrigCompositeContainer_v1.h" +#include "xAODTrigger/TrigCompositeContainer.h" + +// Core EDM include(s): +#include "AthContainers/tools/copyAuxStoreThinned.h" + +// Local include(s): +#include "xAODTrigCompositeAuxContainerCnv_v1.h" + +/// Convenience macro for setting the level of output messages +#define MSGLVL MSG::DEBUG + +/// Another convenience macro for printing messages in the converter +#define ATH_MSG( MSG ) \ + do { \ + if( log.level() <= MSGLVL ) { \ + log << MSGLVL << MSG << endmsg; \ + } \ + } while( 0 ) + +xAODTrigCompositeAuxContainerCnv_v1::xAODTrigCompositeAuxContainerCnv_v1() + : T_AthenaPoolTPCnvBase< xAOD::TrigCompositeAuxContainer, + xAOD::TrigCompositeAuxContainer_v1 >() { + +} + +void xAODTrigCompositeAuxContainerCnv_v1:: +persToTrans( const xAOD::TrigCompositeAuxContainer_v1* oldObj, + xAOD::TrigCompositeAuxContainer* newObj, + MsgStream& log ) { + + // Greet the user: + ATH_MSG( "Converting xAOD::TrigCompositeAuxContainer_v1 to current version..." ); + + // ROOT work-around https://sft.its.cern.ch/jira/browse/ROOT-9762 + // This resets the newly made underlying ByteStreamAuxContainer_1 such that it knows about its dynamic content + // This can be removed once xAODTrigger's selection.xml is correctly calling this. + xAOD::TrigCompositeAuxContainer_v1* mutableOld = const_cast<xAOD::TrigCompositeAuxContainer_v1*>(oldObj); + if (mutableOld) { + mutableOld->reset(); + } else { + throw std::runtime_error("Unable to const_cast xAOD::TrigCompositeAuxContainer_v1. Needed due to ROOT-9762."); + } + + // Clear the transient object: + newObj->resize( 0 ); + + // This line does the conversion. + SG::copyAuxStoreThinned( *oldObj, *newObj, 0 ); + + // Print what happened: + ATH_MSG( "Converting xAOD::TrigCompositeAuxContainer_v1 to current version " + "[OK]" ); + + return; +} + +/// This function should never be called, as we are not supposed to convert +/// object before writing. +/// +void xAODTrigCompositeAuxContainerCnv_v1::transToPers( const xAOD::TrigCompositeAuxContainer*, + xAOD::TrigCompositeAuxContainer_v1*, + MsgStream& log ) { + + log << MSG::ERROR + << "Somebody called xAODTrigCompositeAuxContainerCnv_v1::transToPers" + << endmsg; + throw std::runtime_error( "Somebody called xAODTrigCompositeAuxContainerCnv_v1::" + "transToPers" ); + + return; +} diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.h b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.h new file mode 100644 index 0000000000000000000000000000000000000000..a3a33c5ddcb02b69d92289e690946e1714871de8 --- /dev/null +++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_V1_H +#define XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_V1_H + +// Gaudi/Athena include(s): +#include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h" + +// EDM include(s): +#include "xAODTrigger/TrigCompositeAuxContainer.h" +#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h" + +/// Converter class used for reading TrigCompositeAuxContainer_v1 +/// +/// This class implements the meat of the v1->vX conversion for xAOD::TrigCompositeAuxContainer. +/// It translates the payload from the v1 object to the latest type. +/// The converter is implemented in a separate class in order to make it +/// visible to the BS reading code as well. +/// +/// v1 used ByteStreamAuxContainer_v1 base, v2 uses the standard AuxContainerBase +/// +class xAODTrigCompositeAuxContainerCnv_v1 : + public T_AthenaPoolTPCnvBase< xAOD::TrigCompositeAuxContainer, + xAOD::TrigCompositeAuxContainer_v1 > { + +public: + /// Default constructor + xAODTrigCompositeAuxContainerCnv_v1(); + + /// Function converting from the old type to the current one + virtual void persToTrans( const xAOD::TrigCompositeAuxContainer_v1* oldObj, + xAOD::TrigCompositeAuxContainer* newObj, + MsgStream& log ); + /// Dummy function inherited from the base class + virtual void transToPers( const xAOD::TrigCompositeAuxContainer*, + xAOD::TrigCompositeAuxContainer_v1*, + MsgStream& log ); + +}; // class TrigCompositeAuxContainer_v1 + +#endif // XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_V1_H diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerAthenaPoolTPCnv.cxx b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerAthenaPoolTPCnv.cxx index 4f73a2d50139f001e9e5b28eabae7355324b0df7..772e76a5f2c0704f41955c83e3db2a9966eb4f1b 100644 --- a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerAthenaPoolTPCnv.cxx +++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerAthenaPoolTPCnv.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 */ // $Id$ @@ -16,6 +16,8 @@ #include "xAODTrigger/versions/EmTauRoIAuxContainer_v1.h" #include "xAODTrigger/JetRoIAuxContainer.h" #include "xAODTrigger/versions/JetRoIAuxContainer_v1.h" +#include "xAODTrigger/TrigCompositeAuxContainer.h" +#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h" // Local include(s): #include "xAODEmTauRoIContainerCnv_v1.h" @@ -24,6 +26,7 @@ #include "xAODJetRoIAuxContainerCnv_v1.h" #include "xAODEnergySumRoIAuxInfoCnv_v1.h" #include "xAODEnergySumRoICnv_v1.h" +#include "xAODTrigCompositeAuxContainerCnv_v1.h" // Declare the T/P converter(s): DECLARE_TPCNV_FACTORY( xAODEmTauRoIContainerCnv_v1, @@ -56,3 +59,7 @@ DECLARE_TPCNV_FACTORY( xAODEnergySumRoICnv_v1, xAOD::EnergySumRoI_v1, Athena::TPCnvVers::Old ) +DECLARE_TPCNV_FACTORY( xAODTrigCompositeAuxContainerCnv_v1, + xAOD::TrigCompositeAuxContainer, + xAOD::TrigCompositeAuxContainer_v1, + Athena::TPCnvVers::Old ) diff --git a/Trigger/TrigDataAccess/TrigSerializeResult/python/dictwrite.py b/Trigger/TrigDataAccess/TrigSerializeResult/python/dictwrite.py index d4542126c129746544dbaf73747d41ef6233221b..34d57c5efcb6cea088d016d3e854840b2b2e865a 100755 --- a/Trigger/TrigDataAccess/TrigSerializeResult/python/dictwrite.py +++ b/Trigger/TrigDataAccess/TrigSerializeResult/python/dictwrite.py @@ -69,6 +69,7 @@ objects = [ 'xAOD::VertexAuxContainer_v1', 'xAOD::TrigCompositeContainer_v1', 'xAOD::TrigCompositeAuxContainer_v1', +'xAOD::TrigCompositeAuxContainer_v2', 'xAOD::MuonRoIContainer_v1', 'xAOD::MuonRoIAuxContainer_v1', 'xAOD::EmTauRoIContainer_v2', diff --git a/Trigger/TrigDataAccess/TrigSerializeResult/share/bs-streamerinfos.root b/Trigger/TrigDataAccess/TrigSerializeResult/share/bs-streamerinfos.root index dbc118fb5bcf4ab7aa6ca8624826b497ced4b4e7..2caeaa071ff687ab999f3afedefccd5e95bbaafa 100644 Binary files a/Trigger/TrigDataAccess/TrigSerializeResult/share/bs-streamerinfos.root and b/Trigger/TrigDataAccess/TrigSerializeResult/share/bs-streamerinfos.root differ