]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/BASE/AliHLTReadoutList.cxx
14b65cddd40a6ec40582b6063d3b4e262ce9a8ba
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTReadoutList.cxx
1 // $Id$
2 /**************************************************************************
3  * This file is property of and copyright by the ALICE HLT Project        *
4  * ALICE Experiment at CERN, All rights reserved.                         *
5  *                                                                        *
6  * Primary Authors: Artur Szostak <artursz@iafrica.com>                   *
7  *                  for The ALICE HLT Project.                            *
8  *                                                                        *
9  * Permission to use, copy, modify and distribute this software and its   *
10  * documentation strictly for non-commercial purposes is hereby granted   *
11  * without fee, provided that the above copyright notice appears in all   *
12  * copies and that both the copyright notice and this permission notice   *
13  * appear in the supporting documentation. The authors make no claims     *
14  * about the suitability of this software for any purpose. It is          *
15  * provided "as is" without express or implied warranty.                  *
16  **************************************************************************/
17
18 /// @file   AliHLTReadoutList.cxx
19 /// @author Artur Szostak <artursz@iafrica.com>
20 /// @date   19 Nov 2008
21 /// @brief  Implementation of the AliHLTReadoutList class.
22 ///
23 /// The AliHLTReadoutList class is used as an interface to the AliHLTEventDDL
24 /// structure. It makes it easy to manipulate the bits in this structure, which
25 /// define what DDLs should be readout by DAQ.
26 /// Several operators are also overloaded which are meant to be used in the trigger
27 /// menu specification for the AliHLTGlobalTrigger. It allows one to construct
28 /// expressions for the readout lists, which is necessary to be able to evaluate
29 /// or compose the final readout list, given multiple input readout lists received
30 /// from individual components that derive from AliHLTTrigger.
31
32 #include "AliHLTReadoutList.h"
33 #include "AliHLTDAQ.h"
34 #include "Riostream.h"
35 #include "TString.h"
36 #include "TObjString.h"
37 #include "TObjArray.h"
38 #include <cassert>
39
40 ClassImp(AliHLTReadoutList)
41
42
43 AliHLTReadoutList::AliHLTReadoutList() :
44         TNamed("AliHLTReadoutList", "Readout list object used for manipulating and storing an AliHLTEventDDL structure."),
45         fReadoutList()
46 {
47   // Default constructor.
48   
49   fReadoutList.fCount = gkAliHLTDDLListSize;  // Required by ALICE-INT-2007-015
50   memset(fReadoutList.fList, 0x0, sizeof(fReadoutList.fList));
51 }
52
53
54 AliHLTReadoutList::AliHLTReadoutList(Int_t enabledDetectors) :
55         TNamed("AliHLTReadoutList", "Readout list object used for manipulating and storing an AliHLTEventDDL structure."),
56         fReadoutList()
57 {
58   // Constructor to select which detectors to enable for readout.
59   // See header file for more details.
60   
61   fReadoutList.fCount = gkAliHLTDDLListSize;  // Required by ALICE-INT-2007-015
62   memset(fReadoutList.fList, 0x0, sizeof(fReadoutList.fList));
63   Enable(enabledDetectors);
64 }
65
66
67 AliHLTReadoutList::AliHLTReadoutList(const char* enabledList) :
68         TNamed("AliHLTReadoutList", "Readout list object used for manipulating and storing an AliHLTEventDDL structure."),
69         fReadoutList()
70 {
71   // Constructor to select which detectors and DDLs to enable for readout.
72   // See header file for more details.
73   
74   fReadoutList.fCount = gkAliHLTDDLListSize;  // Required by ALICE-INT-2007-015
75   memset(fReadoutList.fList, 0x0, sizeof(fReadoutList.fList));
76   
77   TString str(enabledList);
78   str.ToUpper();
79   Int_t enabledDetectors = 0;
80   if (str.Contains("ITSSPD")) enabledDetectors |= kITSSPD;
81   if (str.Contains("ITSSDD")) enabledDetectors |= kITSSDD;
82   if (str.Contains("ITSSSD")) enabledDetectors |= kITSSSD;
83   if (str.Contains("TPC")) enabledDetectors |= kTPC;
84   if (str.Contains("TRD")) enabledDetectors |= kTRD;
85   if (str.Contains("TOF")) enabledDetectors |= kTOF;
86   if (str.Contains("HMPID")) enabledDetectors |= kHMPID;
87   if (str.Contains("PHOS")) enabledDetectors |= kPHOS;
88   if (str.Contains("CPV")) enabledDetectors |= kCPV;
89   if (str.Contains("PMD")) enabledDetectors |= kPMD;
90   if (str.Contains("MUONTRK")) enabledDetectors |= kMUONTRK;
91   if (str.Contains("MUONTRG")) enabledDetectors |= kMUONTRG;
92   if (str.Contains("FMD")) enabledDetectors |= kFMD;
93   if (str.Contains("T0")) enabledDetectors |= kT0;
94   if (str.Contains("V0")) enabledDetectors |= kV0;
95   if (str.Contains("ZDC")) enabledDetectors |= kZDC;
96   if (str.Contains("ACORDE")) enabledDetectors |= kACORDE;
97   if (str.Contains("TRG")) enabledDetectors |= kTRG;
98   if (str.Contains("EMCAL")) enabledDetectors |= kEMCAL;
99   if (str.Contains("DAQTEST")) enabledDetectors |= kDAQTEST;
100   if (str.Contains("HLT")) enabledDetectors |= kHLT;
101   if (str.Contains("ALL")) enabledDetectors |= kALLDET;
102   Enable(enabledDetectors);
103   
104   TObjArray* list = str.Tokenize(" ");
105   TIter next(list);
106   const TObjString* objstr = NULL;
107   while ((objstr = dynamic_cast<const TObjString*>(next())) != NULL)
108   {
109     str = objstr->GetString();
110     if (str.IsDigit()) EnableDDLBit(str.Atoi());
111   }
112   delete list;
113 }
114
115
116 AliHLTReadoutList::AliHLTReadoutList(const AliHLTEventDDL& list) :
117         TNamed("AliHLTReadoutList", "Readout list object used for manipulating and storing an AliHLTEventDDL structure."),
118         fReadoutList()
119 {
120   // Constructor to create readout list from AliHLTEventDDL structure.
121   // See header file for more details.
122   memset(&fReadoutList, 0, sizeof(fReadoutList));
123   // handle lists of different sizes, copy only the overlapping part of the list
124   fReadoutList.fCount=sizeof(fReadoutList.fList)/sizeof(AliHLTUInt32_t);
125   memcpy(&fReadoutList.fList, &list.fList, (fReadoutList.fCount<list.fCount?fReadoutList.fCount:list.fCount)*sizeof(AliHLTUInt32_t));
126 }
127
128
129 AliHLTReadoutList::AliHLTReadoutList(const AliHLTReadoutList& list) :
130         TNamed(list),
131         fReadoutList()
132 {
133   // Copy constructor performs a deep copy.
134   
135   memcpy(&fReadoutList, &list.fReadoutList, sizeof(fReadoutList));
136 }
137
138
139 AliHLTReadoutList::~AliHLTReadoutList()
140 {
141   // Default destructor.
142 }
143
144
145 bool AliHLTReadoutList::Empty() const
146 {
147   // Returns true if the readout list has no DDLs enabled.
148
149   for (size_t i = 0; i < sizeof(fReadoutList.fList) / sizeof(fReadoutList.fList[0]); i++)
150   {
151     if (fReadoutList.fList[i] != 0x0) return false;
152   }
153   return true;
154 }
155
156
157 void AliHLTReadoutList::Clear(Option_t* /*option*/)
158 {
159   // Resets all the DDL readout bits.
160   memset(fReadoutList.fList, 0x0, sizeof(fReadoutList.fList));
161 }
162
163
164 bool AliHLTReadoutList::DecodeDDLID(Int_t ddlId, Int_t& wordIndex, Int_t& bitIndex)
165 {
166   // Decodes the word index and bit index within that word for the readout list structure.
167   // See header file for more details.
168   
169   // The detector number is bits 15..8 of ddlId and DDL number is bits 7..0.
170   Int_t detNum = ddlId >> 8;
171   Int_t ddlNum = ddlId & 0xFF;
172   
173   switch (detNum)
174   {
175   case 0: // SPD
176   case 1: // SDD
177   case 2: // SSD
178     if (ddlNum >= 32) return false; // only have 1 32-bit word.
179     // the 3 ITS detectors have one word each
180     wordIndex = detNum;
181     break;
182   case 3: // TPC
183     // the TPC bitfield has in total 8 words
184     wordIndex = detNum + (ddlNum >> 5);
185     break;
186   case 4: // TRD
187     if (ddlNum >= 32) return false; // only have 1 32-bit word.
188     // the TRD bitfield starts at word 11 (3 words ITS + 8 words TPC)
189     wordIndex = 11;
190     break;
191   case 5: // TOF
192     if (ddlNum >= 3*32) return false; // only have 3 32-bit words.
193     // TOF has 72 DDLs, the bitfield is 3 words starting at position 12
194     wordIndex = 12 + (ddlNum >> 5);
195     break;
196   case 6: // HMPID
197   case 7: // PHOS
198   case 8: // CPV
199   case 9: // PMD
200   case 10: // MUONTRK (MCH)
201   case 11: // MUONTRG (MTR)
202   case 12: // FMD
203   case 13: // T0
204   case 14: // V0
205   case 15: // ZDC
206   case 16: // ACORDE
207   case 17: // TRG
208     if (ddlNum >= 32) return false; // only have 1 32-bit word.
209     // all these detectors fit into one word, the offset is due to
210     // TPC and TOF
211     wordIndex = detNum + 9;
212     break;
213   case 18: // EMCAL
214     if (ddlNum >= 2*32) return false; // only have 2 32-bit words.
215     // 2 words for EMCAL + DCAL
216     wordIndex = detNum + 7;
217     wordIndex = 27 + (ddlNum >> 5);
218     break;
219   case 19: // DAQTEST
220     if (ddlNum >= 32) return false; // only have 1 32-bit word.
221     wordIndex = 29;
222     break;
223   case 30: // HLT
224     if (ddlNum >= 32) return false; // only have 1 32-bit word.
225     // the HLT bitfield is in the last word
226     wordIndex = 30;
227     break;
228   default:
229     return false;
230   }
231   
232   if (ddlNum >= AliHLTDAQ::NumberOfDdls(detNum == 30 ? 20 : detNum)) return false;
233   
234   // The bit index within the word indicated by wordIndex.
235   bitIndex = ddlNum % 32;
236   return true;
237 }
238
239
240 Bool_t AliHLTReadoutList::GetDDLBit(Int_t ddlId) const
241 {
242   // Fetches the bit value for a particular DDL in the readout list.
243   // See header file for more details.
244   
245   Int_t wordIndex, bitIndex;
246   if (! DecodeDDLID(ddlId, wordIndex, bitIndex)) return kFALSE;
247   return ((fReadoutList.fList[wordIndex] >> bitIndex) & 0x1) == 0x1;
248 }
249
250
251 void AliHLTReadoutList::SetDDLBit(Int_t ddlId, Bool_t state)
252 {
253   // Sets the bit value for a particular DDL in the readout list.
254   // See header file for more details.
255   
256   Int_t wordIndex, bitIndex;
257   if (! DecodeDDLID(ddlId, wordIndex, bitIndex)) return;
258
259   // To set, 'OR' word with bit mask
260   if ( state )
261     fReadoutList.fList[wordIndex] |= (0x00000001 << bitIndex);
262   // To unset, 'AND' word with bit mask
263   else
264     fReadoutList.fList[wordIndex] &= (0xFFFFFFFF ^ (0x00000001 << bitIndex));
265 }
266
267
268 void AliHLTReadoutList::Enable(Int_t detector)
269 {
270   // Enables all DDLs for a particular detector or detectors.
271   // See header file for more details.
272   
273   if ((detector & kITSSPD) != 0) fReadoutList.fList[0] = 0x000FFFFF;
274   if ((detector & kITSSDD) != 0) fReadoutList.fList[1] = 0x00FFFFFF;
275   if ((detector & kITSSSD) != 0) fReadoutList.fList[2] = 0x0000FFFF;
276   if ((detector & kTPC) != 0)
277   {
278     fReadoutList.fList[3] = 0xFFFFFFFF;
279     fReadoutList.fList[4] = 0xFFFFFFFF;
280     fReadoutList.fList[5] = 0xFFFFFFFF;
281     fReadoutList.fList[6] = 0xFFFFFFFF;
282     fReadoutList.fList[7] = 0xFFFFFFFF;
283     fReadoutList.fList[8] = 0xFFFFFFFF;
284     fReadoutList.fList[9] = 0x00FFFFFF;
285     fReadoutList.fList[10] = 0x00000000;
286   }
287   if ((detector & kTRD) != 0) fReadoutList.fList[11] = 0x0003FFFF;
288   if ((detector & kTOF) != 0)
289   {
290     fReadoutList.fList[12] = 0xFFFFFFFF;
291     fReadoutList.fList[13] = 0xFFFFFFFF;
292     fReadoutList.fList[14] = 0x000000FF;
293   }
294   if ((detector & kHMPID) != 0) fReadoutList.fList[15] = 0x00003FFF;
295   if ((detector & kPHOS) != 0) fReadoutList.fList[16] = 0x000FFFFF;
296   if ((detector & kCPV) != 0) fReadoutList.fList[17] = 0x000003FF;
297   if ((detector & kPMD) != 0) fReadoutList.fList[18] = 0x0000003F;
298   if ((detector & kMUONTRK) != 0) fReadoutList.fList[19] = 0x000FFFFF;
299   if ((detector & kMUONTRG) != 0) fReadoutList.fList[20] = 0x00000003;
300   if ((detector & kFMD) != 0) fReadoutList.fList[21] = 0x00000007;
301   if ((detector & kT0) != 0) fReadoutList.fList[22] = 0x00000001;
302   if ((detector & kV0) != 0) fReadoutList.fList[23] = 0x00000001;
303   if ((detector & kZDC) != 0) fReadoutList.fList[24] = 0x00000001;
304   if ((detector & kACORDE) != 0) fReadoutList.fList[25] = 0x00000001;
305   if ((detector & kTRG) != 0) fReadoutList.fList[26] = 0x00000001;
306   if ((detector & kEMCAL) != 0)
307   {
308     fReadoutList.fList[27] = 0xFFFFFFFF;
309     fReadoutList.fList[28] = 0x00003FFF;
310   }
311   if ((detector & kDAQTEST) != 0) fReadoutList.fList[29] = 0x00000001;
312   if ((detector & kHLT) != 0) fReadoutList.fList[30] = 0x000003FF;
313 }
314
315
316 void AliHLTReadoutList::Disable(Int_t detector)
317 {
318   // Disables all DDLs for a particular detector or detectors.
319   // See header file for more details.
320   
321   if ((detector & kITSSPD) != 0) fReadoutList.fList[0] = 0x00000000;
322   if ((detector & kITSSDD) != 0) fReadoutList.fList[1] = 0x00000000;
323   if ((detector & kITSSSD) != 0) fReadoutList.fList[2] = 0x00000000;
324   if ((detector & kTPC) != 0)
325   {
326     fReadoutList.fList[3] = 0x00000000;
327     fReadoutList.fList[4] = 0x00000000;
328     fReadoutList.fList[5] = 0x00000000;
329     fReadoutList.fList[6] = 0x00000000;
330     fReadoutList.fList[7] = 0x00000000;
331     fReadoutList.fList[8] = 0x00000000;
332     fReadoutList.fList[9] = 0x00000000;
333     fReadoutList.fList[10] = 0x00000000;
334   }
335   if ((detector & kTRD) != 0) fReadoutList.fList[11] = 0x00000000;
336   if ((detector & kTOF) != 0)
337   {
338     fReadoutList.fList[12] = 0x00000000;
339     fReadoutList.fList[13] = 0x00000000;
340     fReadoutList.fList[14] = 0x00000000;
341   }
342   if ((detector & kHMPID) != 0) fReadoutList.fList[15] = 0x00000000;
343   if ((detector & kPHOS) != 0) fReadoutList.fList[16] = 0x00000000;
344   if ((detector & kCPV) != 0) fReadoutList.fList[17] = 0x00000000;
345   if ((detector & kPMD) != 0) fReadoutList.fList[18] = 0x00000000;
346   if ((detector & kMUONTRK) != 0) fReadoutList.fList[19] = 0x00000000;
347   if ((detector & kMUONTRG) != 0) fReadoutList.fList[20] = 0x00000000;
348   if ((detector & kFMD) != 0) fReadoutList.fList[21] = 0x00000000;
349   if ((detector & kT0) != 0) fReadoutList.fList[22] = 0x00000000;
350   if ((detector & kV0) != 0) fReadoutList.fList[23] = 0x00000000;
351   if ((detector & kZDC) != 0) fReadoutList.fList[24] = 0x00000000;
352   if ((detector & kACORDE) != 0) fReadoutList.fList[25] = 0x00000000;
353   if ((detector & kTRG) != 0) fReadoutList.fList[26] = 0x00000000;
354   if ((detector & kEMCAL) != 0)
355   {
356     fReadoutList.fList[27] = 0x00000000;
357     fReadoutList.fList[28] = 0x00000000;
358   }
359   if ((detector & kDAQTEST) != 0) fReadoutList.fList[29] = 0x00000000;
360   if ((detector & kHLT) != 0) fReadoutList.fList[30] = 0x00000000;
361 }
362
363
364 bool AliHLTReadoutList::DetectorEnabled(Int_t detector) const
365 {
366   // Checks if a particular detector's DDLs are enabled.
367   // See header file for more details.
368   
369   bool result = true;
370   if ((detector & kITSSPD) != 0) result &= fReadoutList.fList[0] == 0x000FFFFF;
371   if ((detector & kITSSDD) != 0) result &= fReadoutList.fList[1] == 0x00FFFFFF;
372   if ((detector & kITSSSD) != 0) result &= fReadoutList.fList[2] == 0x0000FFFF;
373   if ((detector & kTPC) != 0)
374   {
375     result &= fReadoutList.fList[3] == 0xFFFFFFFF;
376     result &= fReadoutList.fList[4] == 0xFFFFFFFF;
377     result &= fReadoutList.fList[5] == 0xFFFFFFFF;
378     result &= fReadoutList.fList[6] == 0xFFFFFFFF;
379     result &= fReadoutList.fList[7] == 0xFFFFFFFF;
380     result &= fReadoutList.fList[8] == 0xFFFFFFFF;
381     result &= fReadoutList.fList[9] == 0x00FFFFFF;
382   }
383   if ((detector & kTRD) != 0) result &= fReadoutList.fList[11] == 0x0003FFFF;
384   if ((detector & kTOF) != 0)
385   {
386     result &= fReadoutList.fList[12] == 0xFFFFFFFF;
387     result &= fReadoutList.fList[13] == 0xFFFFFFFF;
388     result &= fReadoutList.fList[14] == 0x000000FF;
389   }
390   if ((detector & kHMPID) != 0) result &= fReadoutList.fList[15] == 0x00003FFF;
391   if ((detector & kPHOS) != 0) result &= fReadoutList.fList[16] == 0x000FFFFF;
392   if ((detector & kCPV) != 0) result &= fReadoutList.fList[17] == 0x000003FF;
393   if ((detector & kPMD) != 0) result &= fReadoutList.fList[18] == 0x0000003F;
394   if ((detector & kMUONTRK) != 0) result &= fReadoutList.fList[19] == 0x000FFFFF;
395   if ((detector & kMUONTRG) != 0) result &= fReadoutList.fList[20] == 0x00000003;
396   if ((detector & kFMD) != 0) result &= fReadoutList.fList[21] == 0x00000007;
397   if ((detector & kT0) != 0) result &= fReadoutList.fList[22] == 0x00000001;
398   if ((detector & kV0) != 0) result &= fReadoutList.fList[23] == 0x00000001;
399   if ((detector & kZDC) != 0) result &= fReadoutList.fList[24] == 0x00000001;
400   if ((detector & kACORDE) != 0) result &= fReadoutList.fList[25] == 0x00000001;
401   if ((detector & kTRG) != 0) result &= fReadoutList.fList[26] == 0x00000001;
402   if ((detector & kEMCAL) != 0)
403   {
404     result &= fReadoutList.fList[27] == 0xFFFFFFFF;
405     result &= fReadoutList.fList[28] == 0x00003FFF;
406   }
407   if ((detector & kDAQTEST) != 0) result &= fReadoutList.fList[29] == 0x00000001;
408   if ((detector & kHLT) != 0) result &= fReadoutList.fList[30] == 0x000003FF;
409   
410   return result;
411 }
412
413
414 void AliHLTReadoutList::Print(Option_t* /*option*/) const
415 {
416   // Prints the DDLs that will be readout according to this readout list.
417   
418   cout << "Readout enabled for DDLs:" << endl;
419   for (Int_t i = 0; i < AliHLTDAQ::NumberOfDetectors(); i++)
420   {
421     Int_t maxddls = AliHLTDAQ::NumberOfDdls(i);
422     cout << AliHLTDAQ::DetectorName(i) << ":";
423     bool nonefound = true;
424     for (Int_t j = 0; j < maxddls; j++)
425     {
426       Int_t ddlId = ( ((i == AliHLTDAQ::NumberOfDetectors()-1) ? 30 : i) << 8 ) + j;
427       if (GetDDLBit(ddlId))
428       {
429         cout << " " << ddlId;
430         nonefound = false;
431       }
432     }
433     if (nonefound) cout << " none";
434     cout << endl;
435   }
436 }
437
438
439 AliHLTReadoutList& AliHLTReadoutList::operator = (const AliHLTReadoutList& list)
440 {
441   // Assignment operator performs a deep copy.
442   
443   TObject::operator = (list);
444   if (&list != this)
445   {
446     memcpy(&fReadoutList, &list.fReadoutList, sizeof(fReadoutList));
447   }
448   return *this;
449 }
450
451
452 AliHLTReadoutList& AliHLTReadoutList::operator |= (const AliHLTReadoutList& list)
453 {
454   // This operator performs a bitwise inclusive or operation on all DDL bits.
455   // See header file for more details.
456   this->OrEq(list);
457   return *this;
458 }
459
460 AliHLTReadoutList& AliHLTReadoutList::OrEq(const AliHLTReadoutList& list)
461 {
462   // a bitwise inclusive or operation on all DDL bits.
463   // See header file for more details.
464   
465   assert( fReadoutList.fCount == (unsigned)gkAliHLTDDLListSize );
466   for (Int_t i = 0; i < gkAliHLTDDLListSize; i++)
467   {
468     fReadoutList.fList[i] |= list.fReadoutList.fList[i];
469   }
470   return *this;
471 }
472
473
474 AliHLTReadoutList& AliHLTReadoutList::operator ^= (const AliHLTReadoutList& list)
475 {
476   // This operator performs a bitwise exclusive or (xor) operation on all DDL bits.
477   // See header file for more details.
478
479   this->XorEq(list);
480   return *this;
481 }
482
483 AliHLTReadoutList& AliHLTReadoutList::XorEq(const AliHLTReadoutList& list)
484 {
485   // bitwise exclusive or (xor) operation on all DDL bits.
486   // See header file for more details.
487   
488   assert( fReadoutList.fCount == (unsigned)gkAliHLTDDLListSize );
489   for (Int_t i = 0; i < gkAliHLTDDLListSize; i++)
490   {
491     fReadoutList.fList[i] ^= list.fReadoutList.fList[i];
492   }
493   return *this;
494 }
495
496
497 AliHLTReadoutList& AliHLTReadoutList::operator &= (const AliHLTReadoutList& list)
498 {
499   // This operator performs a bitwise and operation on all DDL bits.
500   // See header file for more details.
501
502   this->AndEq(list);
503   return *this;
504 }
505
506 AliHLTReadoutList& AliHLTReadoutList::AndEq(const AliHLTReadoutList& list)
507 {
508   // bitwise and operation on all DDL bits.
509   // See header file for more details.
510
511   assert( fReadoutList.fCount == (unsigned)gkAliHLTDDLListSize );
512   for (Int_t i = 0; i < gkAliHLTDDLListSize; i++)
513   {
514     fReadoutList.fList[i] &= list.fReadoutList.fList[i];
515   }
516   return *this;
517 }
518
519 AliHLTReadoutList& AliHLTReadoutList::operator -= (const AliHLTReadoutList& list)
520 {
521   // This operator removes all the DDLs specified in list from this readout list.
522   // See header file for more details.
523   
524   assert( fReadoutList.fCount == (unsigned)gkAliHLTDDLListSize );
525   for (Int_t i = 0; i < gkAliHLTDDLListSize; i++)
526   {
527     // Effectively apply: this = this & (~ (this & list))
528     // i.e. this = this & (this ^ list)
529     fReadoutList.fList[i] &= fReadoutList.fList[i] ^ list.fReadoutList.fList[i];
530   }
531   return *this;
532 }
533
534
535 AliHLTReadoutList AliHLTReadoutList::operator ~ () const
536 {
537   // This operator performs a bitwise ones compliment on all DDL bits.
538   // See header file for more details.
539   
540   AliHLTReadoutList readoutlist;
541   readoutlist.fReadoutList.fCount = fReadoutList.fCount;
542   readoutlist.fReadoutList.fList[0] = 0x000FFFFF & (~fReadoutList.fList[0]);
543   readoutlist.fReadoutList.fList[1] = 0x00FFFFFF & (~fReadoutList.fList[1]);
544   readoutlist.fReadoutList.fList[2] = 0x0000FFFF & (~fReadoutList.fList[2]);
545   readoutlist.fReadoutList.fList[3] = 0xFFFFFFFF & (~fReadoutList.fList[3]);
546   readoutlist.fReadoutList.fList[4] = 0xFFFFFFFF & (~fReadoutList.fList[4]);
547   readoutlist.fReadoutList.fList[5] = 0xFFFFFFFF & (~fReadoutList.fList[5]);
548   readoutlist.fReadoutList.fList[6] = 0xFFFFFFFF & (~fReadoutList.fList[6]);
549   readoutlist.fReadoutList.fList[7] = 0xFFFFFFFF & (~fReadoutList.fList[7]);
550   readoutlist.fReadoutList.fList[8] = 0xFFFFFFFF & (~fReadoutList.fList[8]);
551   readoutlist.fReadoutList.fList[9] = 0x00FFFFFF & (~fReadoutList.fList[9]);
552   readoutlist.fReadoutList.fList[10] = 0x00000000 & (~fReadoutList.fList[10]);
553   readoutlist.fReadoutList.fList[11] = 0x0003FFFF & (~fReadoutList.fList[11]);
554   readoutlist.fReadoutList.fList[12] = 0xFFFFFFFF & (~fReadoutList.fList[12]);
555   readoutlist.fReadoutList.fList[13] = 0xFFFFFFFF & (~fReadoutList.fList[13]);
556   readoutlist.fReadoutList.fList[14] = 0x000000FF & (~fReadoutList.fList[14]);
557   readoutlist.fReadoutList.fList[15] = 0x00003FFF & (~fReadoutList.fList[15]);
558   readoutlist.fReadoutList.fList[16] = 0x000FFFFF & (~fReadoutList.fList[16]);
559   readoutlist.fReadoutList.fList[17] = 0x000003FF & (~fReadoutList.fList[17]);
560   readoutlist.fReadoutList.fList[18] = 0x0000003F & (~fReadoutList.fList[18]);
561   readoutlist.fReadoutList.fList[19] = 0x000FFFFF & (~fReadoutList.fList[19]);
562   readoutlist.fReadoutList.fList[20] = 0x00000003 & (~fReadoutList.fList[20]);
563   readoutlist.fReadoutList.fList[21] = 0x00000007 & (~fReadoutList.fList[21]);
564   readoutlist.fReadoutList.fList[22] = 0x00000001 & (~fReadoutList.fList[22]);
565   readoutlist.fReadoutList.fList[23] = 0x00000001 & (~fReadoutList.fList[23]);
566   readoutlist.fReadoutList.fList[24] = 0x00000001 & (~fReadoutList.fList[24]);
567   readoutlist.fReadoutList.fList[25] = 0x00000001 & (~fReadoutList.fList[25]);
568   readoutlist.fReadoutList.fList[26] = 0x00000001 & (~fReadoutList.fList[26]);
569   readoutlist.fReadoutList.fList[27] = 0xFFFFFFFF & (~fReadoutList.fList[27]);
570   readoutlist.fReadoutList.fList[28] = 0x00003FFF & (~fReadoutList.fList[28]);
571   readoutlist.fReadoutList.fList[29] = 0x00000001 & (~fReadoutList.fList[29]);
572   readoutlist.fReadoutList.fList[30] = 0x000003FF & (~fReadoutList.fList[30]);
573   return readoutlist;
574 }
575