ATLAS Offline Software
Loading...
Searching...
No Matches
RoiSerialise.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4//
5// @file RoiSerialise.cxx
6//
7// utilities to serialise and deserialise to and from
8// std::vector<IRoiDescriptor*>, TrigRoiDescriptorCollection etc
9//
10// @author M.Sutton
11//
12//
13// $Id: serialise.cxx, v0.0 Sat 31 Oct 2015 08:20:38 CET sutt $
14
15
16
17
21#include <iostream>
22
23
24inline const uint32_t& uconv( const float& x) { return reinterpret_cast<const uint32_t&>(x); }
25inline const float& fconv( const uint32_t& x) { return reinterpret_cast<const float&>(x); }
26
27
28namespace RoiUtil {
29
36
37 enum MASK {
38 FULLSCAN = 0x1,
39 COMPOSITE = 0x2,
40 ROITYPE = 0x4
41 };
42
43}
44
45
47void RoiUtil::serialise( const std::vector<const IRoiDescriptor*>& rois, RoiUtil::roiserial_type& s ) {
48 s.clear();
49 s.resize(rois.size());
50 for ( size_t i=0 ; i<rois.size() ; i++ ) RoiUtil::serialise( rois[i], s[i] );
51}
52
53
56 s.clear();
57 s.resize(rois.size());
58 for ( size_t i=0 ; i<rois.size() ; i++ ) RoiUtil::serialise( rois[i], s[i] );
59}
60
61
62
64void RoiUtil::deserialise( const RoiUtil::roiserial_type& s, std::vector<const IRoiDescriptor*>& rois ) {
65 if ( s.empty() ) return;
66 rois.resize(s.size());
67 for ( size_t i=0 ; i<s.size() ; i++ ) {
68 if ( s[i].empty() ) continue;
69 const roitype_t* s_end = &s[i][0];
70 const roitype_t* s_last = &s[i].back();
71 rois[i] = RoiUtil::deserialise( s_end, s_last );
72 }
73 // const roitype_t* s_end = &s[0];
74 // const roitype_t* s_last = &s.back();
75 // while ( s_end<s_last ) rois.push_back( RoiUtil::deserialise( s_end, s_last ) );
76}
77
78
81 if ( s.empty() ) return;
82 for ( size_t i=0 ; i<s.size() ; i++ ) {
83 if ( s[i].empty() ) continue;
84 const roitype_t* s_end = &s[i][0];
85 const roitype_t* s_last = &s[i].back();
88 rois.push_back( dynamic_cast<TrigRoiDescriptor*>(RoiUtil::deserialise( s_end, s_last )) );
89
90 }
92 // const roitype_t* s_end = &s[0];
93 // const roitype_t* s_last = &s.back();
94 // while ( s_end<s_last ) rois.push_back( dynamic_cast<TrigRoiDescriptor*>(RoiUtil::deserialise( s_end, s_last )) );
95}
96
97
99void RoiUtil::serialise( const IRoiDescriptor* roi, std::vector<RoiUtil::roitype_t>& s ) {
100
102 uint32_t param = ( (roi->version()&0xff) << 8);
103
105 // if ( roi->isFullscan() ) param |= 1;
106 if ( roi->isFullscan() ) param |= RoiUtil::FULLSCAN;
107
109 // if ( roi->composite() ) param |= 0x2;
110 if ( roi->composite() ) param |= RoiUtil::COMPOSITE;
111
113 uint32_t extra[3] = { roi->roiWord(), roi->l1Id(), roi->roiId() };
114
115 // bool plusextra = false;
116 // for ( int i=0 ; i<3 ; i++ ) plusextra |= ( extra[i]!=0 );
117 bool plusextra = ( extra[0]!=0 ) || ( extra[1]!=0 ) || ( extra[2]!=0 );
118
119 // if ( plusextra ) param |= 0x4;
120 if ( plusextra ) param |= RoiUtil::ROITYPE;
121
122 // s.push_back( roi->isFullscan() ? 1 : 0 );
123 s.push_back( * static_cast<roitype_t*>(&param) );
124
125 int Nextra = 0;
126 if ( plusextra ) Nextra = 3;
127
128 if ( !roi->isFullscan() ) {
130 s.push_back( uconv(roi->eta()) );
131 s.push_back( uconv(roi->etaMinus()) );
132 s.push_back( uconv(roi->etaPlus()) );
133
134 s.push_back( uconv(roi->phi()) );
135 s.push_back( uconv(roi->phiMinus()) );
136 s.push_back( uconv(roi->phiPlus()) );
137
138 s.push_back( uconv(roi->zed()) );
139 s.push_back( uconv(roi->zedMinus()) );
140 s.push_back( uconv(roi->zedPlus()) );
141 }
142
143 for ( int i=0 ; i<Nextra ; i++ ) s.push_back( extra[i] ); // push back the size of extra information if required
144
146 if ( roi->composite() ) {
147 s.push_back( roi->size() );
148
150 // if ( roi->composite() && roi->size()>0 ) {
151 if ( roi->size()>0 ) {
153 IRoiDescriptor::roi_iterator iend = roi->end();
154 while ( itr!=iend ) RoiUtil::serialise( *itr++, s );
155 }
156 }
157
158}
159
160
161
162
165
166 TrigRoiDescriptor* roi = 0;
167
168 const roitype_t* s = s_end;
169
171 uint32_t param = *(reinterpret_cast<const uint32_t*>(&s[RoiUtil::PARAM]));
172
174 int version = (param>>8);
175
178
180 bool fullscan = false;
181 if (param&1) fullscan = true;
182
184 bool composite = false;
185 if (param&2) composite = true;
186
187 bool roiwords = false;
188 if (param&4) roiwords = true;
189
191 if ( fullscan ) s_end += RoiUtil::PARAM;
192 else s_end += RoiUtil::ZEDPLUS;
193
195 unsigned Nextra = ( roiwords ? 3 : 0 );
196 s_end += Nextra;
197
201 if ( s_end>s_last ) return 0;
202
204 s_end++;
205
207 unsigned extra[3] = { 0, 0, 0 };
208 unsigned extra_start = ( fullscan ? RoiUtil::PARAM+1 : RoiUtil::ZEDPLUS+1 );
209
210 for ( unsigned i=0 ; i<Nextra ; i++ ) extra[i] = unsigned( s[extra_start+i] );
211
212 unsigned roiWord = extra[0];
213 unsigned l1Id = extra[1];
214 unsigned roiId = extra[2];
215
217 if ( fullscan ) roi = new TrigRoiDescriptor( true );
218 else {
220
223 roi = new TrigRoiDescriptor( roiWord, l1Id, roiId,
227
228 }
229
230 if ( roi && version>roi->version() ) roi->version( version );
231
232
236 if ( roi && composite ) {
237
238 roi->setComposite(true);
239
241
242 unsigned size = *s_end;
243
244 s_end++;
245
246 std::cout << "size " << size << std::endl;
247
248 if ( size>0 ) {
249 for ( unsigned i=0 ; i<size ; i++ ) {
250 roi->push_back( RoiUtil::deserialise( s_end, s_last ) );
251 }
252 }
253 }
254
255 return roi;
256
257}
258
259
const float & fconv(const uint32_t &x)
const uint32_t & uconv(const float &x)
size_t size() const
Number of registered mappings.
Athena::TPCnvVers::Current TrigRoiDescriptor
#define x
static const Attributes_t empty
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
Describes the API of the Region of Ineterest geometry.
virtual bool isFullscan() const =0
is this a full detector RoI?
virtual double eta() const =0
virtual int version() const =0
which roi version?
virtual roi_iterator end() const =0
virtual double phiPlus() const =0
extreme phi values
virtual double zedPlus() const =0
the zed and eta values at the most forward and most rear ends of the RoI
virtual double phiMinus() const =0
virtual double phi() const =0
Methods to retrieve data members.
virtual double zedMinus() const =0
virtual double zed() const =0
std::vector< constIRoiDescriptor * >::const_iterator roi_iterator
virtual unsigned size() const =0
number of constituents
virtual double etaMinus() const =0
virtual double etaPlus() const =0
virtual roi_iterator begin() const =0
const limit iterators
virtual unsigned int roiWord() const =0
virtual unsigned int roiId() const =0
identifiers
virtual bool composite() const =0
Super RoI access methods.
virtual unsigned int l1Id() const =0
void push_back(const IRoiDescriptor *roi)
add a RoiDescriptor
void setComposite(bool b=true)
virtual int version() const override final
versioning
nope - should be used for standalone also, perhaps need to protect the class def bits ifndef XAOD_ANA...
void deserialise(const roiserial_type &s, std::vector< const IRoiDescriptor * > &rois)
deserialise uint32_t vector into a full vector of IRoiDescriptors
std::vector< std::vector< roitype_t > > roiserial_type
void serialise(const std::vector< const IRoiDescriptor * > &rois, roiserial_type &s)
serialise an entire vector of IRoiDescriptors
std::uint32_t roitype_t