ATLAS Offline Software
TTOnlineID.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef CALOIDENTIFIER_TTONLINEID_H
6 #define CALOIDENTIFIER_TTONLINEID_H
7 
9 #include "GaudiKernel/MsgStream.h"
13 #include "Identifier/Range.h"
15 #include "IdDict/IdDictDefs.h"
17 #include <vector>
18 #include <iostream>
19 #include <algorithm>
20 #include <map>
21 
22 //using namespace std;
23 
24 class IdentifierHash;
25 class Range;
26 
37 {
38  public:
39 
41 
42  TTOnlineID(void);
43  ~TTOnlineID(void);
44 
45 
46  /* build towerId HWIdentifier */
47  /*=========================== */
49  HWIdentifier crateId( int crate ) const;
50  HWIdentifier crateId( int crate, bool checks ) const;
52  HWIdentifier crateId( IdentifierHash crate_hash ) const;
54  IdentifierHash crateHash( HWIdentifier crate_id ) const;
56  std::vector<HWIdentifier>::const_iterator crate_begin(void) const;
57  std::vector<HWIdentifier>::const_iterator crate_end(void) const;
58 
59  /* build moduleId HWIdentifier */
60  /*=========================== */
62  HWIdentifier moduleId( int crate, int module) const;
63  HWIdentifier moduleId( int crate, int module, bool checks) const;
65  HWIdentifier moduleId( IdentifierHash crate_hash ) const;
67  IdentifierHash moduleHash( HWIdentifier crate_id ) const;
69  std::vector<HWIdentifier>::const_iterator module_begin(void) const;
70  std::vector<HWIdentifier>::const_iterator module_end(void) const;
71 
72  /* build submoduleId HWIdentifier */
73  /*=========================== */
75  HWIdentifier submoduleId( int crate, int module, int submodule) const;
76  HWIdentifier submoduleId( int crate, int module, int submodule, bool checks) const;
78  HWIdentifier submoduleId( IdentifierHash crate_hash ) const;
80  IdentifierHash submoduleHash( HWIdentifier crate_id ) const;
82  std::vector<HWIdentifier>::const_iterator submodule_begin(void) const;
83  std::vector<HWIdentifier>::const_iterator submodule_end(void) const;
84 
85  /* build moduleId HWIdentifier */
86  /*=========================== */
88  HWIdentifier channelId( int crate, int module, int submodule, int channel) const;
89  HWIdentifier channelId( int crate, int module, int submodule, int channel, bool checks) const;
91  HWIdentifier channelId( IdentifierHash crate_hash ) const;
93  IdentifierHash channelHash( HWIdentifier crate_id ) const;
95  std::vector<HWIdentifier>::const_iterator channel_begin(void) const;
96  std::vector<HWIdentifier>::const_iterator channel_end(void) const;
97 
98 
99 
100  /* hash tables max size */
101  /*====================== */
102  size_type crateHashMax (void) const;
103  size_type moduleHashMax (void) const;
104  size_type submoduleHashMax (void) const;
105  size_type channelHashMax (void) const;
106 
107 
109  virtual int initialize_from_dictionary (const IdDictMgr& dict_mgr);
110 
111 
112  // HWIdentifier Fields for TTOnlineID
113  // ========================================
114  int crate( const HWIdentifier id )const;
115  int module( const HWIdentifier id )const;
116  int submodule( const HWIdentifier id )const;
117  int channel( const HWIdentifier id )const;
118 
119 
122  IdContext crateContext(void) const;
123  IdContext moduleContext(void) const;
124  IdContext submoduleContext(void) const;
125  IdContext channelContext(void) const;
126 
127 
128 private:
129 
130  enum {NOT_VALID_HASH = 256000};
131 
133 
134  // Check methods
135  void channel_Id_checks(int crate, int module, int submodule, int channel ) const;
136  void channel_Id_checks(const HWIdentifier crateId, int module, int submodule, int channel ) const;
137  void channel_Id_checks(const HWIdentifier moduleId, int submodule, int channel ) const;
138  void channel_Id_checks(const HWIdentifier submoduleId, int channel ) const;
139 
140  void submodule_Id_checks(int crate, int module, int submodule ) const;
141  void module_Id_checks(int crate, int module ) const;
142  void crate_Id_checks( int crate ) const;
143 
145  int get_expanded_id (const HWIdentifier& id, ExpandedIdentifier& exp_id,
146  const IdContext* context) const;
147 
149  int detzside_field_value() const;
150 
152  int initLevelsFromDict(void) ;
153  int init_hashes(void);
154 
163 
169 
174 
175  std::vector<HWIdentifier> m_crate_vec;
176  std::vector<HWIdentifier> m_module_vec;
177  std::vector<HWIdentifier> m_submodule_vec;
178  std::vector<HWIdentifier> m_channel_vec;
179 
181 
186  class HashCalc
187  {
188  public:
190  m_hash(0),
191  m_channelmin(0) {}
194  };
195  std::vector<HashCalc> m_hash_calcs;
196 
197 
205 };
206 
207 
208 //using the macro below we can assign an identifier (and a version)
209 //This is required and checked at compile time when you try to record/retrieve
210 CLASS_DEF( TTOnlineID , 38321944 , 1 )
211 
212 
213 //=====================
214 // Inline Definitions
215 //=====================
216 
217 /* Crates */
218 
219 //==========================================================================================================
220 inline HWIdentifier TTOnlineID::crateId( int crate, bool checks ) const
221 //==========================================================================================================
222 {
223  HWIdentifier result(0);
224  m_calo_impl.pack (10 , result);
225  m_calo_detzside_impl.pack (0 , result);
226  m_crate_impl.pack (crate , result);
227 
228  /* Do checks */
229  if(checks) {
230  crate_Id_checks( crate );
231  }
232  return result;
233 }
234 inline HWIdentifier TTOnlineID::crateId( int crate ) const
235 {
236  return crateId (crate, do_checks());
237 }
238 
239 //============================================================================== */
241 //===============================================================================*/
242 {
243  return(m_crate_vec[cratehash_id]);
244 }
245 
246 //=============================================================================
248 //=============================================================================
249  std::vector<HWIdentifier>::const_iterator it = std::lower_bound(m_crate_vec.begin(),m_crate_vec.end(),crate_id);
250  if ( it != m_crate_vec.end() ){
251  return (it - m_crate_vec.begin());
252  }
253  return (0);
254 }
255 
256 //=============================================================================
257 inline std::vector<HWIdentifier>::const_iterator TTOnlineID::crate_begin(void) const {
258 //=============================================================================
259  return(m_crate_vec.begin());
260 }
261 
262 //=============================================================================
263 inline std::vector<HWIdentifier>::const_iterator TTOnlineID::crate_end(void) const {
264 //=============================================================================
265  return(m_crate_vec.end());
266 }
267 
268 /* Modules */
269 
270 //==========================================================================================================
271 inline HWIdentifier TTOnlineID::moduleId( int crate, int module, bool checks ) const
272 //==========================================================================================================
273 {
274  HWIdentifier result(0);
275  m_calo_impl.pack (10 , result);
276  m_calo_detzside_impl.pack (0 , result);
277  m_crate_impl.pack (crate , result);
278  m_module_impl.pack (module , result);
279 
280  /* Do checks */
281  if(checks) {
282  module_Id_checks( crate, module );
283  }
284  return result;
285 }
286 
287 inline HWIdentifier TTOnlineID::moduleId( int crate, int module ) const
288 {
289  return moduleId (crate, module, do_checks());
290 }
291 
292 //============================================================================== */
294 //===============================================================================*/
295 {
296  return(m_module_vec[modulehash_id]);
297 }
298 
299 //=============================================================================
301 //=============================================================================
302  std::vector<HWIdentifier>::const_iterator it = std::lower_bound(m_module_vec.begin(),m_module_vec.end(),module_id);
303  if ( it != m_module_vec.end() ){
304  return (it - m_module_vec.begin());
305  }
306  return (0);
307 }
308 
309 //=============================================================================
310 inline std::vector<HWIdentifier>::const_iterator TTOnlineID::module_begin(void) const {
311 //=============================================================================
312  return(m_module_vec.begin());
313 }
314 
315 //=============================================================================
316 inline std::vector<HWIdentifier>::const_iterator TTOnlineID::module_end(void) const {
317 //=============================================================================
318  return(m_module_vec.end());
319 }
320 
321 
322 /* SubModules */
323 
324 //==========================================================================================================
325 inline HWIdentifier TTOnlineID::submoduleId( int crate, int module, int submodule, bool checks ) const
326 //==========================================================================================================
327 {
328  HWIdentifier result(0);
329  m_calo_impl.pack (10 , result);
330  m_calo_detzside_impl.pack (0 , result);
331  m_crate_impl.pack (crate , result);
332  m_module_impl.pack (module , result);
333  m_submodule_impl.pack (submodule , result);
334 
335  /* Do checks */
336  if(checks) {
337  submodule_Id_checks( crate, module, submodule );
338  }
339  return result;
340 }
341 inline HWIdentifier TTOnlineID::submoduleId( int crate, int module, int submodule ) const
342 {
344 }
345 
346 
347 //============================================================================== */
349 //===============================================================================*/
350 {
351  return(m_submodule_vec[submodulehash_id]);
352 }
353 
354 //=============================================================================
356 //=============================================================================
357  std::vector<HWIdentifier>::const_iterator it = std::lower_bound(m_submodule_vec.begin(),m_submodule_vec.end(),submodule_id);
358  if ( it != m_submodule_vec.end() ){
359  return (it - m_submodule_vec.begin());
360  }
361  return (0);
362 }
363 
364 //=============================================================================
365 inline std::vector<HWIdentifier>::const_iterator TTOnlineID::submodule_begin(void) const {
366 //=============================================================================
367  return(m_submodule_vec.begin());
368 }
369 
370 //=============================================================================
371 inline std::vector<HWIdentifier>::const_iterator TTOnlineID::submodule_end(void) const {
372 //=============================================================================
373  return(m_submodule_vec.end());
374 }
375 
376 
377 /* Channels */
378 
379 //==========================================================================================================
380 inline HWIdentifier TTOnlineID::channelId( int crate, int module, int submodule, int channel, bool checks ) const
381 //==========================================================================================================
382 {
383  HWIdentifier result(0);
384  m_calo_impl.pack (10 , result);
385  m_calo_detzside_impl.pack (0 , result);
386  m_crate_impl.pack (crate , result);
387  m_module_impl.pack (module , result);
388  m_submodule_impl.pack (submodule , result);
389  m_channel_impl.pack (channel , result);
390 
391  /* Do checks */
392  if(checks) {
393  channel_Id_checks( crate, module, submodule, channel );
394  }
395  return result;
396 }
397 
398 inline HWIdentifier TTOnlineID::channelId( int crate, int module, int submodule, int channel ) const
399 {
401 }
402 
403 //============================================================================== */
405 //===============================================================================*/
406 {
407  return(m_channel_vec[channelhash_id]);
408 }
409 
410 //=============================================================================
412 //=============================================================================
413  std::vector<HWIdentifier>::const_iterator it = std::lower_bound(m_channel_vec.begin(),m_channel_vec.end(),channel_id);
414  if ( it != m_channel_vec.end() ){
415  return (it - m_channel_vec.begin());
416  }
417  return (0);
418 }
419 
420 //=============================================================================
421 inline std::vector<HWIdentifier>::const_iterator TTOnlineID::channel_begin(void) const {
422 //=============================================================================
423  return(m_channel_vec.begin());
424 }
425 
426 //=============================================================================
427 inline std::vector<HWIdentifier>::const_iterator TTOnlineID::channel_end(void) const {
428 //=============================================================================
429  return(m_channel_vec.end());
430 }
431 
432 
433 /* Hash indices */
434 
436 /*====================================================================*/
437 {
438  return m_crateHashMax;
439 }
440 
442 /*====================================================================*/
443 {
444  return m_moduleHashMax;
445 }
446 
448 /*====================================================================*/
449 {
450  return m_submoduleHashMax;
451 }
452 
454 /*====================================================================*/
455 {
456  return m_channelHashMax;
457 }
458 
459 inline int TTOnlineID::crate(const HWIdentifier id)const
460 /*===========================================================*/
461 {
462  return (m_crate_impl.unpack(id));
463 }
464 
465 inline int TTOnlineID::module(const HWIdentifier id)const
466 /*===========================================================*/
467 {
468  return (m_module_impl.unpack(id));
469 }
470 
471 inline int TTOnlineID::submodule(const HWIdentifier id)const
472 /*===========================================================*/
473 {
474  return (m_submodule_impl.unpack(id));
475 }
476 
477 inline int TTOnlineID::channel(const HWIdentifier id)const
478 /*===========================================================*/
479 {
480  return (m_channel_impl.unpack(id));
481 }
482 
484 {
485  return m_iDetZSideFieldValue;
486 }
487 
488 #endif // TTOnlineID_H
TTOnlineID::m_channel_impl
IdDictFieldImplementation m_channel_impl
Definition: TTOnlineID.h:204
TTOnlineID::channel
int channel(const HWIdentifier id) const
Definition: TTOnlineID.h:477
TTOnlineID::m_calo_detzside_impl
IdDictFieldImplementation m_calo_detzside_impl
Definition: TTOnlineID.h:200
TTOnlineID::crate_begin
std::vector< HWIdentifier >::const_iterator crate_begin(void) const
(4) iterator over towerId
Definition: TTOnlineID.h:257
get_generator_info.result
result
Definition: get_generator_info.py:21
TTOnlineID::m_submodule_vec
std::vector< HWIdentifier > m_submodule_vec
Definition: TTOnlineID.h:177
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:28
TTOnlineID::crate_Id_checks
void crate_Id_checks(int crate) const
Definition: TTOnlineID.cxx:342
TTOnlineID::HashCalc::HashCalc
HashCalc()
Definition: TTOnlineID.h:189
TTOnlineID::moduleHashMax
size_type moduleHashMax(void) const
Definition: TTOnlineID.h:441
TTOnlineID
Helper class for Calo TT online identifiers.
Definition: TTOnlineID.h:37
TTOnlineID::m_submodule_index
size_type m_submodule_index
Definition: TTOnlineID.h:161
Range.h
skel.it
it
Definition: skel.GENtoEVGEN.py:423
TTOnlineID::crateHash
IdentifierHash crateHash(HWIdentifier crate_id) const
(3) create towerId from hash
Definition: TTOnlineID.h:247
TTOnlineID::m_l1online_regions_index
size_type m_l1online_regions_index
Definition: TTOnlineID.h:158
ExpandedIdentifier
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:108
TTOnlineID::m_full_channel_range
MultiRange m_full_channel_range
Definition: TTOnlineID.h:168
TTOnlineID::crateHashMax
size_type crateHashMax(void) const
Definition: TTOnlineID.h:435
TTOnlineID::m_crate_index
size_type m_crate_index
Definition: TTOnlineID.h:159
TTOnlineID::submoduleContext
IdContext submoduleContext(void) const
Definition: TTOnlineID.cxx:55
TTOnlineID::submodule_end
std::vector< HWIdentifier >::const_iterator submodule_end(void) const
Definition: TTOnlineID.h:371
TTOnlineID::initialize_from_dictionary
virtual int initialize_from_dictionary(const IdDictMgr &dict_mgr)
Initialization from the identifier dictionary.
Definition: TTOnlineID.cxx:70
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:562
TTOnlineID::m_module_impl
IdDictFieldImplementation m_module_impl
Definition: TTOnlineID.h:202
HWIdentifier
Definition: HWIdentifier.h:13
TTOnlineID::HashCalc::m_channelmin
size_type m_channelmin
Definition: TTOnlineID.h:193
TTOnlineID::moduleHash
IdentifierHash moduleHash(HWIdentifier crate_id) const
(3) create towerId from hash
Definition: TTOnlineID.h:300
TTOnlineID::m_iDetZSideFieldValue
int m_iDetZSideFieldValue
Definition: TTOnlineID.h:180
TTOnlineID::HashCalc::m_hash
IdentifierHash m_hash
Definition: TTOnlineID.h:192
TTOnlineID::moduleId
HWIdentifier moduleId(int crate, int module) const
(1) create towerId from fields
Definition: TTOnlineID.h:287
TTOnlineID::channelHash
IdentifierHash channelHash(HWIdentifier crate_id) const
(3) create towerId from hash
Definition: TTOnlineID.h:411
TTOnlineID::submoduleHash
IdentifierHash submoduleHash(HWIdentifier crate_id) const
(3) create towerId from hash
Definition: TTOnlineID.h:355
IdDictDefs.h
python.PyAthena.module
module
Definition: PyAthena.py:134
TTOnlineID::size_type
Identifier::size_type size_type
Definition: TTOnlineID.h:40
AtlasDetectorID.h
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
IdDictMgr
Definition: IdDictDefs.h:32
TTOnlineID::module_begin
std::vector< HWIdentifier >::const_iterator module_begin(void) const
(4) iterator over towerId
Definition: TTOnlineID.h:310
TTOnlineID::m_module_vec
std::vector< HWIdentifier > m_module_vec
Definition: TTOnlineID.h:176
TTOnlineID::module
int module(const HWIdentifier id) const
Definition: TTOnlineID.h:465
TTOnlineID::~TTOnlineID
~TTOnlineID(void)
TTOnlineID::submoduleId
HWIdentifier submoduleId(int crate, int module, int submodule) const
(1) create towerId from fields
Definition: TTOnlineID.h:341
TTOnlineID::channel_begin
std::vector< HWIdentifier >::const_iterator channel_begin(void) const
(4) iterator over towerId
Definition: TTOnlineID.h:421
TTOnlineID::m_detzside_index
size_type m_detzside_index
Definition: TTOnlineID.h:157
createCoolChannelIdFile.channel_id
channel_id
Definition: createCoolChannelIdFile.py:52
TTOnlineID::m_submoduleHashMax
size_type m_submoduleHashMax
Definition: TTOnlineID.h:172
TTOnlineID::detzside_field_value
int detzside_field_value() const
return the value of the detzside field (initialized in initialize_from_dictionary())
Definition: TTOnlineID.h:483
TTOnlineID::submodule_begin
std::vector< HWIdentifier >::const_iterator submodule_begin(void) const
(4) iterator over towerId
Definition: TTOnlineID.h:365
TTOnlineID::submoduleHashMax
size_type submoduleHashMax(void) const
Definition: TTOnlineID.h:447
TTOnlineID::channelContext
IdContext channelContext(void) const
Definition: TTOnlineID.cxx:61
TTOnlineID::m_hash_calcs
std::vector< HashCalc > m_hash_calcs
Definition: TTOnlineID.h:195
TTOnlineID::channel_end
std::vector< HWIdentifier >::const_iterator channel_end(void) const
Definition: TTOnlineID.h:427
TTOnlineID::channel_Id_checks
void channel_Id_checks(int crate, int module, int submodule, int channel) const
Definition: TTOnlineID.cxx:232
TTOnlineID::m_moduleHashMax
size_type m_moduleHashMax
Definition: TTOnlineID.h:171
TTOnlineID::channel_hash_binary_search
IdentifierHash channel_hash_binary_search(HWIdentifier channelId) const
TTOnlineID::m_crate_impl
IdDictFieldImplementation m_crate_impl
Definition: TTOnlineID.h:201
TTOnlineID::m_full_module_range
MultiRange m_full_module_range
Definition: TTOnlineID.h:166
TTOnlineID::m_calo_index
size_type m_calo_index
Member Data index.
Definition: TTOnlineID.h:156
MultiRange
A MultiRange combines several Ranges.
Definition: DetectorDescription/Identifier/Identifier/Range.h:351
HWIdentifier.h
IdentifierHash.h
TTOnlineID::module_end
std::vector< HWIdentifier >::const_iterator module_end(void) const
Definition: TTOnlineID.h:316
TTOnlineID::m_submodule_impl
IdDictFieldImplementation m_submodule_impl
Definition: TTOnlineID.h:203
TTOnlineID::m_calo_impl
IdDictFieldImplementation m_calo_impl
Field Implementation.
Definition: TTOnlineID.h:199
Range
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
Definition: DetectorDescription/Identifier/Identifier/Range.h:27
TTOnlineID::HashCalc
small class holding the starting hash value, the min eta and the number of phi bins of each region ...
Definition: TTOnlineID.h:187
TTOnlineID::init_hashes
int init_hashes(void)
Definition: TTOnlineID.cxx:507
IdDictDictionary
Definition: IdDictDefs.h:97
IdDictFieldImplementation.h
TTOnlineID::get_expanded_id
int get_expanded_id(const HWIdentifier &id, ExpandedIdentifier &exp_id, const IdContext *context) const
create expanded HWIdentifier from HWIdentifier (return == 0 for OK)
Definition: TTOnlineID.cxx:207
TTOnlineID::moduleContext
IdContext moduleContext(void) const
Definition: TTOnlineID.cxx:49
TTOnlineID::submodule_Id_checks
void submodule_Id_checks(int crate, int module, int submodule) const
Definition: TTOnlineID.cxx:312
TTOnlineID::m_full_crate_range
MultiRange m_full_crate_range
Definition: TTOnlineID.h:165
TTOnlineID::submodule
int submodule(const HWIdentifier id) const
Definition: TTOnlineID.h:471
TTOnlineID::m_channel_index
size_type m_channel_index
Definition: TTOnlineID.h:162
TTOnlineID::initLevelsFromDict
int initLevelsFromDict(void)
init() hashes
Definition: TTOnlineID.cxx:358
CLASS_DEF
#define CLASS_DEF(NAME, CID, VERSION)
associate a clid and a version to a type eg
Definition: Control/AthenaKernel/AthenaKernel/CLASS_DEF.h:64
TTOnlineID::crateId
HWIdentifier crateId(int crate) const
(1) create towerId from fields
Definition: TTOnlineID.h:234
TTOnlineID::channelId
HWIdentifier channelId(int crate, int module, int submodule, int channel) const
(1) create towerId from fields
Definition: TTOnlineID.h:398
TTOnlineID::channelHashMax
size_type channelHashMax(void) const
Definition: TTOnlineID.h:453
Identifier::size_type
IDENTIFIER_TYPE size_type
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:41
TTOnlineID::crateContext
IdContext crateContext(void) const
context for feedthroughs, feb & channels
Definition: TTOnlineID.cxx:43
TTOnlineID::m_dict
const IdDictDictionary * m_dict
Definition: TTOnlineID.h:164
TTOnlineID::m_module_index
size_type m_module_index
Definition: TTOnlineID.h:160
IdDictFieldImplementation
IdDictFieldImplementation is used to capture the specification of a single field of an Identifier.
Definition: IdDictFieldImplementation.h:58
IdentifierHash
Definition: IdentifierHash.h:38
TTOnlineID::crate_end
std::vector< HWIdentifier >::const_iterator crate_end(void) const
Definition: TTOnlineID.h:263
TTOnlineID::m_crate_vec
std::vector< HWIdentifier > m_crate_vec
Definition: TTOnlineID.h:175
TTOnlineID::m_channelHashMax
size_type m_channelHashMax
Definition: TTOnlineID.h:173
TTOnlineID::crate
int crate(const HWIdentifier id) const
Definition: TTOnlineID.h:459
CaloID_Exception.h
TTOnlineID::module_Id_checks
void module_Id_checks(int crate, int module) const
Definition: TTOnlineID.cxx:327
TTOnlineID::m_crateHashMax
size_type m_crateHashMax
Definition: TTOnlineID.h:170
AtlasDetectorID::do_checks
virtual bool do_checks(void) const override
Checks are performed by default in debug compilation and NOT in optimized compilation.
Definition: AtlasDetectorID.cxx:728
IdContext
class IdContext
Definition: IdContext.h:34
CLASS_DEF.h
macros to associate a CLID to a type
AtlasDetectorID
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
Definition: AtlasDetectorID.h:57
TTOnlineID::NOT_VALID_HASH
@ NOT_VALID_HASH
Definition: TTOnlineID.h:130
TTOnlineID::TTOnlineID
TTOnlineID(void)
Definition: TTOnlineID.cxx:22
TTOnlineID::m_full_submodule_range
MultiRange m_full_submodule_range
Definition: TTOnlineID.h:167
TTOnlineID::m_channel_vec
std::vector< HWIdentifier > m_channel_vec
Definition: TTOnlineID.h:178