ATLAS Offline Software
Loading...
Searching...
No Matches
TRT_RodEncoder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Implementation of TRT_RodEncoder class
6
7#include <deque>
8
9#include "TRT_RodEncoder.h"
10
15
16#include "GaudiKernel/ISvcLocator.h"
17#include "GaudiKernel/Bootstrap.h"
18#include "GaudiKernel/MsgStream.h"
19#include "GaudiKernel/IMessageSvc.h"
20
24 :m_trt_id ( nullptr ),
25 m_CablingSvc ( "TRT_CablingSvc", "TRT_RodEncoder" ),
27{}
28
32
35StatusCode
36TRT_RodEncoder::fillROD( std::vector<uint32_t>& v32rod )
37{
38 if ( ! m_CablingSvc )
39 return StatusCode::FAILURE;
40
41 int TRT_MaxBufferSize = 120*16;
42 // Make sure vector is big enough, fill it with 0
43 v32rod.resize(TRT_MaxBufferSize,0 );
44
45 VRDO::iterator rdo_it = m_RDOs.begin();
46 const VRDO::iterator rdo_it_end = m_RDOs.end();
47
48 const RDO* rawdata;
49 uint32_t StrawWord;
50 Identifier StrawID;
51 uint32_t BufferOffset;
52
53 while ( rdo_it != rdo_it_end )
54 {
55 rawdata = *rdo_it;
56
57 StrawWord = rawdata->getWord();
58 StrawID = rawdata->identify();
59
60 BufferOffset = m_CablingSvc->getBufferOffset( StrawID );
61
62 // if ( 0 == BufferOffset )
63 // cout << m_trt_id->print_to_string( StrawID ) << " ->"
64 // << BufferOffset << "<- " << endl;
65
66 v32rod[BufferOffset] = StrawWord;
67
68 ++rdo_it;
69 }
70
71 return StatusCode::SUCCESS;
72} // end of fillROD(...)
73
76StatusCode
77TRT_RodEncoder::fillROD3( std::vector<uint32_t>& v32rod )
78{
79 if ( ! m_CablingSvc )
80 return StatusCode::FAILURE;
81
82 const int TRT_MaxBufferSize = 120*16;
83 int tmp_data[TRT_MaxBufferSize] = {0}; // does init to 0 for all !
84
85 std::deque<bool> bitstowrite;
86
87 VRDO::iterator rdo_it = m_RDOs.begin();
88 const VRDO::iterator rdo_it_end = m_RDOs.end();
89
90 const RDO* rawdata;
91 uint32_t StrawWord;
92 Identifier StrawID;
93 uint32_t BufferOffset;
94
95 while ( rdo_it != rdo_it_end )
96 {
97 rawdata = *rdo_it;
98
99 StrawWord = rawdata->getWord();
100 StrawID = rawdata->identify();
101
102 BufferOffset = m_CablingSvc->getBufferOffset( StrawID );
103
104 // if ( 0 == BufferOffset )
105 // cout << m_trt_id->print_to_string( StrawID ) << " ->"
106 // << BufferOffset << "<- " << endl;
107
108 tmp_data[BufferOffset] = StrawWord;
109
110 ++rdo_it;
111 }
112
113 for ( int i=0; i<TRT_MaxBufferSize; i++ )
114 {
115 if ( tmp_data[i] )
116 {
117 /*
118 * Push escape code
119 */
120 bitstowrite.push_back( 0 );
121 bitstowrite.push_back( 0 );
122 bitstowrite.push_back( 0 );
123 bitstowrite.push_back( 0 );
124 bitstowrite.push_back( 0 );
125
126 /*
127 * Push Straw Word
128 */
129
130 //for ( int j=27-1; j>=0; j-- )
131 for ( int j=0; j<27; j++ )
132 bitstowrite.push_back( (tmp_data[i] >> j) & 1 );
133 }
134 else
135 bitstowrite.push_back( 1 );
136 }
137
138
139
140 int bit_in_word = 0;
141 int out_word = 0;
142 while ( ! bitstowrite.empty() )
143 {
144 out_word = out_word | ( (bitstowrite.front()?1:0) << bit_in_word );
145 bitstowrite.pop_front();
146 bit_in_word++;
147
148 if ( bit_in_word > 31 )
149 {
150 v32rod.push_back( out_word );
151 out_word = 0;
152 bit_in_word = 0;
153 }
154 }
155
156 if ( 0 != bit_in_word )
157 v32rod.push_back( out_word );
158
159 return StatusCode::SUCCESS;
160} // end of fillROD(...)
161
162
This is an Identifier helper class for the TRT subdetector.
virtual Identifier identify() const override final
unsigned int getWord() const
unsigned short m_RodBlockVersion
~TRT_RodEncoder()
destructor
const TRT_ID * m_trt_id
TRT_RDORawData RDO
StatusCode fillROD3(std::vector< uint32_t > &v)
conversion of ROD into compressed ROD fragment
StatusCode fillROD(std::vector< uint32_t > &v)
conversion of ROD into ROD fragment
ServiceHandle< ITRT_CablingSvc > m_CablingSvc
TRT_RodEncoder()
constructor