1717// -----------------------------------------------------------------------------
1818namespace {
1919
20+ // ---------------------------------------------------------------------------
21+ template <typename Stream, char CharOn = ' x' , char CharOff = ' -' >
22+ class ByteDumper {
23+ static constexpr char symbols[2 ] = { CharOff, CharOn };
24+
25+ Stream& out;
26+
27+ public:
28+ ByteDumper (Stream& out): out{ out } {}
29+
30+ void operator () (std::uint8_t bits, std::size_t nBits = 8 ) const
31+ {
32+ std::uint8_t mask = 1 << (nBits - 1 ); // default: 0x80
33+ do { out << symbols[(bits & mask)? 1 : 0 ]; } while (mask >>= 1 );
34+ }
35+
36+ }; // ByteDumper
37+
38+
2039 // ---------------------------------------------------------------------------
2140 template <typename T = std::uint64_t >
2241 struct TimestampDumper { T timestamp; };
@@ -71,6 +90,31 @@ namespace {
7190 }
7291
7392
93+ // ---------------------------------------------------------------------------
94+ template <typename T>
95+ struct BitDumper { T bits; unsigned int n; };
96+
97+ template <typename T>
98+ BitDumper<T> dumpBits
99+ (T bits, unsigned int n = sizeof (T) * 8 ) { return { bits, n }; }
100+
101+ template <typename T>
102+ std::ostream& operator << (std::ostream& out, BitDumper<T> wrapper) {
103+ static auto const bitMask = [](unsigned int n)
104+ { return (n == sizeof (T)*8 )? ~T{0 }: T ((1 << n) - 1 ); };
105+
106+ ByteDumper const dumpByte{ out };
107+ unsigned int bitsLeft = wrapper.n ;
108+ while (bitsLeft > 0 ) { // goes 8 by 8 (fewer on the first iteration)
109+ unsigned int const maskBits = (bitsLeft - 1 ) % 8 + 1 ;
110+ bitsLeft -= maskBits;
111+ dumpByte ((wrapper.bits >> bitsLeft) & bitMask (maskBits), maskBits);
112+ } // while
113+
114+ return out;
115+ } // operator<< (LVDSmaskDumper)
116+
117+
74118 // ---------------------------------------------------------------------------
75119
76120 struct LVDSmaskDumper { std::uint64_t bits; };
@@ -80,32 +124,22 @@ namespace {
80124 std::ostream& operator << (std::ostream& out, LVDSmaskDumper wrapper) {
81125 std::uint64_t const bits { wrapper.bits };
82126
83- auto dumpBoard = [&out](std::uint8_t bits)
84- {
85- static constexpr char symbols[2 ] = { ' -' , ' x' };
86- std::uint8_t mask = 0x80 ;
87- do { out << symbols[(bits & mask)? 1 : 0 ]; } while (mask >>= 1 );
88- };
89127 auto boardBits = [](std::uint64_t bits, short int board) -> std::uint8_t
90128 { return static_cast <std::uint8_t >((bits >> (board * 8 )) & 0xFF ); };
91129
92- // positions 3 and 7 are empty
93- dumpBoard (boardBits (bits, 6 ));
94- out << ' ' ;
95- dumpBoard (boardBits (bits, 5 ));
96- out << ' ' ;
97- dumpBoard (boardBits (bits, 4 ));
98- out << ' ' ;
99- out << ' ' ;
100- dumpBoard (boardBits (bits, 2 ));
101- out << ' ' ;
102- dumpBoard (boardBits (bits, 1 ));
103- out << ' ' ;
104- dumpBoard (boardBits (bits, 0 ));
130+ // positions 3 and 7 are empty
131+ out
132+ << dumpBits (boardBits (bits, 6 )) << ' '
133+ << dumpBits (boardBits (bits, 5 )) << ' '
134+ << dumpBits (boardBits (bits, 4 )) << ' '
135+ << ' '
136+ << dumpBits (boardBits (bits, 2 )) << ' '
137+ << dumpBits (boardBits (bits, 1 )) << ' '
138+ << dumpBits (boardBits (bits, 0 ))
139+ ;
105140
106141 return out;
107- } // operator<< (LVDSmaskDumper)
108-
142+ } // operator<< (LVDSmaskDumper)
109143
110144} // local namespace
111145
@@ -173,34 +207,41 @@ std::ostream& sbn::operator<< (std::ostream& out, ExtraTriggerInfo const& info)
173207 for (std::string const & bitName: names (info.triggerLocation ()))
174208 out << " " << bitName;
175209 }
176- out << " \n West cryostat: "
177- << info.cryostats [ExtraTriggerInfo::WestCryostat ].triggerCount
210+ out << " \n East cryostat: "
211+ << info.cryostats [ExtraTriggerInfo::EastCryostat ].triggerCount
178212 << " triggers" ;
179- if (auto const & cryo = info.cryostats [ExtraTriggerInfo::WestCryostat ];
213+ if (auto const & cryo = info.cryostats [ExtraTriggerInfo::EastCryostat ];
180214 cryo.hasLVDS ()
181215 ) {
182216 out
183- << " \n west wall: "
184- << dumpLVDSmask (cryo.LVDSstatus [ExtraTriggerInfo::WestPMTwall])
185217 << " \n east wall: "
186218 << dumpLVDSmask (cryo.LVDSstatus [ExtraTriggerInfo::EastPMTwall])
219+ << " , sectors: "
220+ << dumpBits (cryo.SectorStatus [ExtraTriggerInfo::EastPMTwall], 6 )
221+ << " \n west wall: "
222+ << dumpLVDSmask (cryo.LVDSstatus [ExtraTriggerInfo::WestPMTwall])
223+ << " , sectors: "
224+ << dumpBits (cryo.SectorStatus [ExtraTriggerInfo::WestPMTwall], 6 )
187225 ;
188226 }
189227
190- out << " \n East cryostat: "
191- << info.cryostats [ExtraTriggerInfo::EastCryostat ].triggerCount
228+ out << " \n West cryostat: "
229+ << info.cryostats [ExtraTriggerInfo::WestCryostat ].triggerCount
192230 << " triggers" ;
193- if (auto const & cryo = info.cryostats [ExtraTriggerInfo::EastCryostat ];
231+ if (auto const & cryo = info.cryostats [ExtraTriggerInfo::WestCryostat ];
194232 cryo.hasLVDS ()
195233 ) {
196234 out
197- << " \n west wall: "
198- << dumpLVDSmask (cryo.LVDSstatus [ExtraTriggerInfo::WestPMTwall])
199235 << " \n east wall: "
200236 << dumpLVDSmask (cryo.LVDSstatus [ExtraTriggerInfo::EastPMTwall])
237+ << " , sectors: "
238+ << dumpBits (cryo.SectorStatus [ExtraTriggerInfo::EastPMTwall], 6 )
239+ << " \n west wall: "
240+ << dumpLVDSmask (cryo.LVDSstatus [ExtraTriggerInfo::WestPMTwall])
241+ << " , sectors: "
242+ << dumpBits (cryo.SectorStatus [ExtraTriggerInfo::WestPMTwall], 6 )
201243 ;
202244 }
203-
204245
205246 return out;
206247} // sbn::operator<< (ExtraTriggerInfo)
0 commit comments