ATLAS Offline Software
Loading...
Searching...
No Matches
TileRawChannelContByteStreamCnv.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Gaudi includes
6#include "GaudiKernel/MsgStream.h"
7#include "GaudiKernel/StatusCode.h"
8#include "GaudiKernel/DataObject.h"
9#include "GaudiKernel/IRegistry.h"
10#include "GaudiKernel/IToolSvc.h"
11#include "GaudiKernel/ServiceHandle.h"
12
13// Athena includes
16
21
24
25// Tile includes
31
32
33#include <string>
34#include <stdint.h>
35
37 : AthConstConverter(storageType(), classID(), svcloc, "TileRawChannelContByteStreamCnv")
38 , m_tool("TileRawChannelContByteStreamTool")
39 , m_byteStreamCnvSvc("ByteStreamCnvSvc", name())
40 , m_robSvc("ROBDataProviderSvc", name())
41 , m_decoder("TileROD_Decoder")
42 , m_hid2re(0)
43{
44}
45
47
49
51
52 ATH_MSG_DEBUG(" initialize ");
53
54 ATH_CHECK(Converter::initialize());
55
56 // Get ByteStreamCnvSvc
57 ATH_CHECK( m_byteStreamCnvSvc.retrieve() );
58
59 // retrieve Tool
60 ATH_CHECK( m_decoder.retrieve() );
61 m_hid2re = m_decoder->getHid2re();
62
63 ATH_CHECK( m_tool.retrieve() );
64
65 ATH_CHECK( m_robSvc.retrieve() );
66
67 return StatusCode::SUCCESS;
68}
69
70StatusCode TileRawChannelContByteStreamCnv::createObjConst(IOpaqueAddress* pAddr, DataObject*& pObj) const
71{
72 ATH_MSG_DEBUG(" Executing createObj method ");
73
74 ByteStreamAddress *pRE_Addr;
75 pRE_Addr = dynamic_cast<ByteStreamAddress*>(pAddr);
76
77 if(!pRE_Addr) {
78 ATH_MSG_ERROR(" Can not cast to ByteStreamAddress ");
79 return StatusCode::FAILURE;
80 }
81
82 const std::string containerName(*(pRE_Addr->par()));
83 bool isTMDB(containerName == std::string("MuRcvRawChCnt"));
84
85 uint32_t newrob = 0x0;
86
87
88 std::vector<uint32_t> robid(1);
89 robid[0] = 0;
90 std::vector<const ROBDataProviderSvc::ROBF*> robf;
91
92 TileMutableRawChannelContainer* cont = m_queue.get (true);
93 ATH_CHECK( cont->status() );
94
95 if (isTMDB) {
97 } else {
99 }
100
101 std::unordered_map<uint32_t,int> bsflags;
102 uint32_t flag;
103
104 // iterate over all collections in a container and fill them
105 for (IdentifierHash hash : cont->GetAllCurrentHashes()) {
106 TileRawChannelCollection* rawChannelCollection = cont->indexFindPtr (hash);
107 rawChannelCollection->clear();
108 TileRawChannelCollection::ID collID = rawChannelCollection->identify();
109
110 // find ROB
111 if (isTMDB) {
112 newrob = m_hid2re->getRobFromTileMuRcvFragID(collID);
113 } else {
114 newrob = m_hid2re->getRobFromFragID(collID);
115 }
116
117 if (newrob != robid[0]) {
118 robid[0] = newrob;
119 robf.clear();
120 m_robSvc->getROBData(Gaudi::Hive::currentContext(), robid, robf);
121 }
122
123 // unpack ROB data
124 if (robf.size() > 0 ) {
125 if (isTMDB) {// reid for TMDB 0x5x010x
126 m_decoder->fillCollection_TileMuRcv_RawChannel(robf[0], *rawChannelCollection);
127 } else {
128 m_decoder->fillCollection(robf[0], *rawChannelCollection, cont);
129 }
130 flag = cont->get_bsflags();
131 auto result = bsflags.insert(std::pair<uint32_t, int>(flag, 1));
132 if (result.second == false) result.first->second++;
133 } else {
134 ATH_MSG_DEBUG( "ROB for " << ((isTMDB)?"TMDB ":"") << "drawer 0x" << MSG::hex << collID << MSG::dec << " not found in BS" );
136 rawChannelCollection->setFragGlobalCRC(status);
137 ATH_MSG_DEBUG( "Status for " << ((isTMDB)?"TMDB ":"") << "drawer 0x" << MSG::hex << collID << " is 0x" << status << MSG::dec);
138 }
139 }
140
141 if (bsflags.size() > 1) {
142 int n=0;
143 for (const auto & elem : bsflags) {
144 if (elem.second > n) {
145 n = elem.second;
146 flag = elem.first;
147 }
148 }
149
150 if (flag != cont->get_bsflags()) {
151
152 uint32_t unit = ((flag & 0xC0000000) >> 30);
153 if ((flag & 0x30000000) < 0x30000000) unit += TileRawChannelUnit::OnlineOffset; // Online units in real data
154
155 ATH_MSG_DEBUG( "Changing units for " << ((isTMDB)?"TMDB ":"") << "RawChannelContainer from "
156 << cont->get_unit() << " to " << unit << MSG::hex
157 << " and BS flags from 0x" << cont->get_bsflags() << " to 0x" << flag << MSG::dec);
158
160 cont->set_bsflags(flag);
161 }
162 }
163
164 ATH_MSG_DEBUG( "Creating raw channel container: " << containerName );
165
166 TileRawChannelContainer* basecont = cont;
167 pObj = SG::asStorable( basecont );
168
169
170 return StatusCode::SUCCESS;
171}
172
173StatusCode TileRawChannelContByteStreamCnv::createRepConst(DataObject* pObj, IOpaqueAddress*& pAddr) const
174{
175 // convert TileRawChannels in the container into ByteStream
176
177 ATH_MSG_DEBUG(" Executing createRep method ");
178
179 // uint32_t runnum = re->header()->specific_part()->run_no();
180
181 std::string key("Tile");
182
183 // get Full Event Assembler
185 ATH_CHECK( m_byteStreamCnvSvc->getFullEventAssembler(fea, key) );
186
187 // create TileRawChannelContainer
188 TileRawChannelContainer* rccont(0) ;
189 SG::fromStorable(pObj, rccont );
190 if(!rccont){
191 ATH_MSG_ERROR(" Can not cast to TileRawChannelContainer ");
192 return StatusCode::FAILURE;
193 }
194
195 std::string name = pObj->registry()->name();
196
197 if ( pAddr != nullptr ) pAddr->release();
198 ByteStreamAddress* addr = new ByteStreamAddress(classID(), name, "");
199 pAddr = addr;
200 pAddr->addRef();
201
202 ATH_CHECK( m_tool->convert(rccont, fea) );
203
204 return StatusCode::SUCCESS;
205}
206
208{
209 return Converter::finalize();
210}
211
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
macros to associate a CLID to a type
Helpers for checking error return status codes and reporting errors.
uint32_t CLID
The Class ID type.
convert to and from a SG storable
Incident sent after a store is cleared.
TileMutableDataContainer< TileRawChannelContainer > TileMutableRawChannelContainer
AthConstConverter(long storage_type, const CLID &class_type, ISvcLocator *svc, const std::string &name)
const std::string & name() const
IOpaqueAddress for ByteStreamCnvSvc, with ROB ids.
static constexpr long storageType()
Template class for assembling a full atlas raw event from subfragments.
virtual std::vector< IdentifierHash > GetAllCurrentHashes() const override final
Returns a collection of all hashes availiable in this IDC.
This is a "hash" representation of an Identifier.
StatusCode status() const
Return the error status from the constructors.
Collection * indexFindPtr(IdentifierHash hash)
Look up a (non-const) collection via hash.
void setFragGlobalCRC(uint32_t globalcrc)
Various set methods.
void clear()
Clear everything for next event.
ToolHandle< TileROD_Decoder > m_decoder
Pointer to TileROD_Decoder.
ServiceHandle< IROBDataProviderSvc > m_robSvc
Pointer to IROBDataProviderSvc.
virtual StatusCode createObjConst(IOpaqueAddress *pAddr, DataObject *&pObj) const override
Create the transient representation of an object.
virtual StatusCode createRepConst(DataObject *pObj, IOpaqueAddress *&pAddr) const override
Convert the transient object to the requested representation.
ServiceHandle< IByteStreamCnvSvc > m_byteStreamCnvSvc
ToolHandle< TileRawChannelContByteStreamTool > m_tool
const TileHid2RESrcID * m_hid2re
Pointer to TileHid2RESrcID.
void set_bsflags(uint32_t bsflags)
uint32_t get_bsflags() const
bool fromStorable(DataObject *pDObj, T *&pTrans, bool quiet=false, IRegisterTransient *irt=0, bool isConst=true)
DataObject * asStorable(SG::DataObjectSharedPtr< T > pObject)