ATLAS Offline Software
JepReadByteStreamV1Cnv.icc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
6 #include <vector>
7 #include <stdint.h>
8 #include <typeinfo>
9 
10 #include "ByteStreamCnvSvcBase/ByteStreamAddress.h"
11 #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h"
12 
13 #include "ByteStreamData/RawEvent.h"
14 #include "ByteStreamData/ROBData.h"
15 
16 #include "GaudiKernel/DataObject.h"
17 #include "GaudiKernel/IOpaqueAddress.h"
18 #include "GaudiKernel/ISvcLocator.h"
19 #include "GaudiKernel/StatusCode.h"
20 
21 #include "AthenaKernel/ClassID_traits.h"
22 #include "AthenaKernel/StorableConversions.h"
23 #include "AthenaKernel/errorcheck.h"
24 
25 #include "JepByteStreamV1Tool.h"
26 
27 namespace LVL1BS {
28 
29 template <typename Container>
30 JepReadByteStreamV1Cnv<Container>::JepReadByteStreamV1Cnv( ISvcLocator* svcloc )
31  : AthConstConverter( storageType(), classID(), svcloc, "JepReadByteStreamV1Cnv" ),
32  m_tool("LVL1BS::JepByteStreamV1Tool/JepByteStreamV1Tool"),
33  m_robDataProvider("ROBDataProviderSvc", name())
34 {
35 }
36 
37 template <typename Container>
38 JepReadByteStreamV1Cnv<Container>::~JepReadByteStreamV1Cnv()
39 {
40 }
41 
42 // CLID
43 
44 template <typename Container>
45 const CLID& JepReadByteStreamV1Cnv<Container>::classID()
46 {
47  return ClassID_traits<Container>::ID();
48 }
49 
50 template <typename Container>
51 long JepReadByteStreamV1Cnv<Container>::storageType()
52 {
53  return ByteStreamAddress::storageType();
54 }
55 
56 // Init method gets all necessary services etc.
57 
58 
59 template <typename Container>
60 StatusCode JepReadByteStreamV1Cnv<Container>::initialize()
61 {
62  ATH_CHECK( Converter::initialize() );
63  ATH_CHECK( m_tool.retrieve() );
64  ATH_CHECK( m_robDataProvider.retrieve() );
65 
66  return StatusCode::SUCCESS;
67 }
68 
69 // createObj should create the RDO from bytestream.
70 
71 template <typename Container>
72 StatusCode JepReadByteStreamV1Cnv<Container>::createObjConst( IOpaqueAddress* pAddr,
73  DataObject*& pObj ) const
74 {
75  ByteStreamAddress *pBS_Addr;
76  pBS_Addr = dynamic_cast<ByteStreamAddress *>( pAddr );
77  if ( !pBS_Addr ) {
78  ATH_MSG_ERROR( " Can not cast to ByteStreamAddress " );
79  return StatusCode::FAILURE;
80  }
81 
82  const std::string nm = *( pBS_Addr->par() );
83 
84  ATH_MSG_DEBUG( " Creating Objects " << nm );
85 
86  // get SourceIDs
87  const std::vector<uint32_t>& vID(m_tool->sourceIDs());
88 
89  // get ROB fragments
90  IROBDataProviderSvc::VROBFRAG robFrags;
91  m_robDataProvider->getROBData(Gaudi::Hive::currentContext(), vID, robFrags );
92 
93  // size check
94  auto collection = std::make_unique<Container>();
95  ATH_MSG_DEBUG( " Number of ROB fragments is " << robFrags.size() );
96 
97  if (robFrags.size() == 0) {
98  pObj = SG::asStorable(std::move(collection)) ;
99  return StatusCode::SUCCESS;
100  }
101 
102  ATH_CHECK( m_tool->convert(nm, robFrags, collection.get()) );
103 
104  pObj = SG::asStorable(std::move(collection));
105 
106  return StatusCode::SUCCESS;
107 }
108 
109 } // end namespace