fix minor bug: add task argument was not passed to tak
[u/mrichter/AliRoot.git] / ACORDE / AliACORDERawStream.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 ///////////////////////////////////////////////////////////////////////////////
17 //                                                                           //
18 //  Reads ACORDE DDL raw data from raw data stream                           //
19 //                                                                           //
20 ///////////////////////////////////////////////////////////////////////////////
21
22 #include "AliACORDERawStream.h"
23 #include "AliRawReader.h"
24 #include "AliLog.h"
25 #include "AliDAQ.h"
26 #include "AliRawReaderRoot.h"
27
28 ClassImp(AliACORDERawStream)
29
30 //_____________________________________________________________________________
31 AliACORDERawStream::AliACORDERawStream(AliRawReader* rawReader) :
32   fRawReader(rawReader),
33   fPosition(-1),
34   fData(NULL),
35   fDataSize(0)
36 {
37   //
38   // Create an object to read ACORDE raw data
39   //
40   // Created:      04 Feb 2008  Mario Sitta
41   //
42
43   fWord[0] = fWord[1] = fWord[2] = fWord[3] = 0;
44
45   // Select the raw data corresponding to the ACORDE detector id
46 //  fRawReader->Reset();
47   AliDebug(1,Form("Selecting raw data for detector %d",AliDAQ::DetectorID("ACORDE")));
48   fRawReader->Select("ACORDE");
49
50 }
51
52 //_____________________________________________________________________________
53 AliACORDERawStream::AliACORDERawStream(const AliACORDERawStream &r) :
54   TObject(),
55   fRawReader(r.fRawReader),
56   fPosition(-1),
57   fData(NULL),
58   fDataSize(0)
59 {
60   // Simple copy constructor
61   ((AliACORDERawStream &) r).Copy(*this);
62 }
63
64 //_____________________________________________________________________________
65 AliACORDERawStream::~AliACORDERawStream()
66 {
67   // Default destructor
68 }
69
70 //_____________________________________________________________________________
71 AliACORDERawStream &AliACORDERawStream::operator=(const AliACORDERawStream &r)
72 {
73   // Simple operator=
74   if (this != &r)  ((AliACORDERawStream &) r).Copy(*this);
75   return *this;
76 }
77
78 //_____________________________________________________________________________
79 void AliACORDERawStream::Reset()
80 {
81   //
82   // Reset the raw stream parameters
83   //
84   // Input:
85   //
86   // Output:
87   //
88   // Created:      04 Feb 2008  Mario Sitta
89   //
90
91   fPosition = -1;
92   fData = NULL;
93
94   if (fRawReader) fRawReader->Reset();
95 }
96
97 //_____________________________________________________________________________
98 Bool_t AliACORDERawStream::Next()
99 {
100   //
101   // Read next digit from the ACORDE raw data stream;
102   // return kFALSE in case of error or no digits left
103   //
104   // Input:
105   //
106   // Output:
107   //
108   // Created:      04 Feb 2008  Mario Sitta
109   //
110
111   if (fPosition >= 0) return kFALSE;
112
113   if (!fRawReader->ReadNextData(fData)) return kFALSE;
114   if (fRawReader->GetDataSize() == 0) return kFALSE;
115
116   fDataSize = fRawReader->GetDataSize();
117   if (fDataSize != 16) {
118     fRawReader->AddFatalErrorLog(kRawDataSizeErr,Form("size %d != 16",fDataSize));
119     AliWarning(Form("Wrong ACORDE raw data size: %d, expected 16 bytes!",fDataSize));
120     return kFALSE;
121   }
122
123   fPosition = 0;
124
125   for (Int_t i=0; i<4; i++)
126     fWord[i] = GetNextWord();
127
128   return kTRUE;
129 }
130
131 //_____________________________________________________________________________
132 UInt_t AliACORDERawStream::GetWord(Int_t index) const
133 {
134   //
135   // Returns the ``index'' word from ACORDE raw data.
136   //
137   // Input:
138   //         index : the index of the requested word
139   // Output:
140   //         word  : the 32 bit ``index'' word
141   //
142   // Created:      12 Feb 2008  Mario Sitta
143   //
144
145   if (index < 0 || index > 3) {
146     AliWarning(Form("Wrong word index %d, returning 0",index));
147     return 0;
148   } else {
149     return fWord[index];
150   }
151   
152 }
153
154 //_____________________________________________________________________________
155 UInt_t AliACORDERawStream::GetNextWord()
156 {
157   //
158   // Returns the next 32 bit word inside the raw data payload.
159   // The method is supposed to be endian (platform) independent.
160   //
161   // Input:
162   //
163   // Output:
164   //         word : a 32 bit word containing the data
165   //
166   // Created:      04 Feb 2008  Mario Sitta
167   //
168
169   if (!fData || fPosition < 0)
170     AliFatal("Raw data payload buffer is not yet initialized !");
171
172   UInt_t word = 0;
173   word |= fData[fPosition++];
174   word |= fData[fPosition++] << 8;
175   word |= fData[fPosition++] << 16;
176   word |= fData[fPosition++] << 24;
177
178   return word;
179 }
180
181 //_____________________________________________________________________________
182
183 Int_t AliACORDERawStream::GetNEvents(char* fileName) 
184 {
185         // Returns the Total Number of Events recorded by ACORDE 
186         // Note: it may be a better way to do it !!
187         // Input: fileName to Analyze
188         // Output: Number of Total Events (fNEvents) in fileName
189         // Created: 25 March 2008
190         // Author: Mario Rodriguez Cahuantzi <mrodrigu@mail.cern.ch>
191         
192         AliRawReader* rCount = new AliRawReaderRoot(fileName);
193         Int_t DyM=0;
194         Int_t fNEvents=0;
195         while(DyM==0)
196         {
197         if (!rCount->NextEvent()) DyM=1;
198         else fNEvents++;
199         }
200         delete rCount;
201         return fNEvents;
202 }
203
204 //____________________________________________________________________________