Skip to content
Snippets Groups Projects
TileDigitsContainerCnv.cxx 3.17 KiB
Newer Older
/*
  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
*/

#include "TileTPCnv/TileDigitsContainerCnv_p1.h"
#include "TileTPCnv/TileDigitsContainerCnv_p2.h"
#include "TileTPCnv/TileDigitsContainerCnv_p3.h"
#include "TileDigitsContainerCnv.h"
// Gaudi
#include "GaudiKernel/MsgStream.h"

TileDigitsContainer_PERS* TileDigitsContainerCnv::createPersistent(TileDigitsContainer* transCont) {
    MsgStream mlog(msgSvc(), "TileDigitsContainerConverter" );
    TileDigitsContainerCnv_p1   converter;
    TileDigitsContainer_PERS *persObj = converter.createPersistent( transCont, mlog );
    return persObj;
}

TileDigitsContainer* TileDigitsContainerCnv::createTransient() {
    MsgStream mlog(msgSvc(), "TileDigitsContainerConverter" );
    TileDigitsContainerCnv_p1   converter_p1;
    TileDigitsContainerCnv_p2   converter_p2;
    TileDigitsContainerCnv_p3   converter_p3;

    TileDigitsContainer       *trans_cont(0);

    static const pool::Guid   p3_guid("8CC01C7A-B330-413E-BEF9-DFA18F15B1FA");
    static const pool::Guid   p2_guid("2F82DE4C-65FA-4F01-BCB5-15330224E357");
    static const pool::Guid   p1_guid("F9386A42-43A7-4482-8A5B-F33EDE586FB2");
    static const pool::Guid   p0_guid("EB51ED70-5EC0-4F31-97D3-14453F77C88B");

    if( this->compareClassGuid(p3_guid)) {
        std::auto_ptr< TileDigitsContainer_p3 >   cont( this->poolReadObject< TileDigitsContainer_p3 >() );
        trans_cont = converter_p3.createTransient( cont.get(), mlog );
    }
    else if( this->compareClassGuid(p2_guid)) {
        std::auto_ptr< TileDigitsContainer_p2 >   cont( this->poolReadObject< TileDigitsContainer_p2 >() );
        trans_cont = converter_p2.createTransient( cont.get(), mlog );
    }
    else if( this->compareClassGuid(p1_guid)) {
        std::auto_ptr< TileDigitsContainer_p1 >   cont( this->poolReadObject< TileDigitsContainer_p1 >() );
        trans_cont = converter_p1.createTransient( cont.get(), mlog );
    }
    else if( this->compareClassGuid(p0_guid)) {
        // old version from before TP separation
        TileDigitsCollectionVec* rdoV = this->poolReadObject<TileDigitsCollectionVec>();

        if (mlog.level()<=MSG::DEBUG)
          mlog << MSG::DEBUG << "Read IDC, size " << rdoV->size() << endmsg;

        // TileFragHash::TYPE type = rdoV->m_type; 
        
        // create the Tile IdentifiableContainer to contain the rdo collections
        trans_cont = new TileDigitsContainer(false,SG::OWN_ELEMENTS);

        TileDigitsCollectionVec::iterator it   = rdoV->begin();
        TileDigitsCollectionVec::iterator last = rdoV->end();

        for (; it != last; ++it) {

          TileDigitsCollection* rdoColl = *it;
          rdoColl->setOwnership(SG::OWN_ELEMENTS);

          // register the rdo collection in StoreGate
          TileDigitsCollection::ID id_coll = rdoColl->identify();
          StatusCode sc = trans_cont->addCollection(rdoColl,trans_cont->hashFunc()(id_coll));
          if(sc.isFailure()) {
            mlog << MSG::ERROR << "Can't add collection " << id_coll << " to container " << endmsg;
          }
        }
        delete rdoV;
    }  else {
        throw std::runtime_error("Unsupported persistent version of Data container");
    }
    return trans_cont;
}