1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////////
18 /// This is a class for reading the AD DDL raw data
19 /// The format of the raw data corresponds to the one
20 /// implemented in AliADBuffer class.
22 ///////////////////////////////////////////////////////////////////////////////
24 #include "AliADRawStream.h"
25 #include "AliRawReader.h"
28 #include "AliADCalibData.h"
29 ClassImp(AliADRawStream)
31 //_____________________________________________________________________________
32 AliADRawStream::AliADRawStream(AliRawReader* rawReader) :
36 fRawReader(rawReader),
39 // create an object to read AD raw data
41 // select the raw data corresponding to
44 AliDebug(1,Form("Selecting raw data for detector %d",AliDAQ::DetectorID("VZERO")));
45 fRawReader->Select("VZERO");
47 // Initalize the containers
48 for(Int_t i = 0; i < kNChannels; i++) {
49 fTime[i] = fWidth[i] = 0;
50 for(Int_t j = 0; j < kNEvOfInt; j++) {
52 fIsInt[i][j] = fIsBB[i][j] = fIsBG[i][j] = kFALSE;
54 fBBScalers[i] = fBGScalers[i] = 0;
55 for(Int_t j = 0; j < kNBunches; j++) {
57 fIsIntMB[i][j] = fIsBBMB[i][j] = fIsBGMB[i][j] = kFALSE;
60 for(Int_t i = 0; i < kNScalers; i++) fScalers[i] = 0;
61 for(Int_t i = 0; i < kNBunches; i++) fBunchNumbers[i] = 0;
64 //_____________________________________________________________________________
65 AliADRawStream::~AliADRawStream()
70 //_____________________________________________________________________________
71 void AliADRawStream::Reset()
73 // reset raw stream params
75 // Reinitalize the containers
76 for(Int_t i = 0; i < kNChannels; i++) {
77 fTime[i] = fWidth[i] = 0;
78 for(Int_t j = 0; j < kNEvOfInt; j++) {
80 fIsInt[i][j] = fIsBB[i][j] = fIsBG[i][j] = kFALSE;
82 fBBScalers[i] = fBGScalers[i] = 0;
83 for(Int_t j = 0; j < kNBunches; j++) {
85 fIsIntMB[i][j] = fIsBBMB[i][j] = fIsBGMB[i][j] = kFALSE;
88 for(Int_t i = 0; i < kNScalers; i++) fScalers[i] = 0;
89 for(Int_t i = 0; i < kNBunches; i++) fBunchNumbers[i] = 0;
91 fTrigger = fTriggerMask = 0;
95 if (fRawReader) fRawReader->Reset();
98 //_____________________________________________________________________________
99 Bool_t AliADRawStream::Next()
101 // read next digit from the AD raw data stream
102 // return kFALSE in case of error or no digits left
104 if (fPosition >= 0) return kFALSE;
106 if (!fRawReader->ReadNextData(fData)) return kFALSE;
107 if (fRawReader->GetDataSize() == 0) return kFALSE;
109 if (fRawReader->GetDataSize() != 5936) {
110 fRawReader->AddFatalErrorLog(kRawDataSizeErr,Form("size %d != 5936",fRawReader->GetDataSize()));
111 AliWarning(Form("Wrong AD raw data size: %d, expected 5936 bytes!",fRawReader->GetDataSize()));
117 fTrigger = GetNextWord() & 0xffff;
118 fTriggerMask = GetNextWord() & 0xffff;
120 for(Int_t iScaler = 0; iScaler < kNScalers; iScaler++)
121 fScalers[iScaler] = GetNextWord();
123 for(Int_t iBunch = 0; iBunch < kNBunches; iBunch++)
124 fBunchNumbers[iBunch] = GetNextWord();
127 for (Int_t iV0CIU = 0; iV0CIU < 8; iV0CIU++) {
129 if(iV0CIU != 1 || iV0CIU != 5) {
130 for(Int_t iWord = 0; iWord<182; iWord++) GetNextWord();
134 // decoding of one Channel Interface Unit numbered iCIU - there are 8 channels per CIU (and 2 CIUs) :
136 for (Int_t iChannel_Offset = iCIU*8; iChannel_Offset < (iCIU*8)+8; iChannel_Offset=iChannel_Offset+4) {
137 for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
138 for(Int_t iEvOfInt = 0; iEvOfInt < kNEvOfInt; iEvOfInt++) {
139 UShort_t data = GetNextShort();
140 fADC[iChannel][iEvOfInt] = data & 0x3ff;
141 fIsInt[iChannel][iEvOfInt] = (data >> 10) & 0x1;
144 for(Int_t iEvOfInt = 0; iEvOfInt < kNEvOfInt; iEvOfInt=iEvOfInt+2) {
145 UShort_t data = GetNextShort();
146 for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
147 fIsBB[iChannel][iEvOfInt] = (data >> 2*(iChannel-iChannel_Offset)) & 0x1;
148 fIsBG[iChannel][iEvOfInt] = (data >> (2*(iChannel-iChannel_Offset)+1)) & 0x1;
149 if(iEvOfInt < (kNEvOfInt - 1)) {
150 fIsBB[iChannel][iEvOfInt+1] = (data >> (8+ 2*(iChannel-iChannel_Offset))) & 0x1;
151 fIsBG[iChannel][iEvOfInt+1] = (data >> (8+ 2*(iChannel-iChannel_Offset)+1)) & 0x1;
158 for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
159 for(Int_t iBunch = 0; iBunch < kNBunches; iBunch++) {
160 UShort_t data = GetNextShort();
161 fChargeMB[iChannel][iBunch] = data & 0x3ff;
162 fIsIntMB[iChannel][iBunch] = (data >> 10) & 0x1;
166 for(Int_t iBunch = 0; iBunch < kNBunches; iBunch=iBunch+2) {
167 UShort_t data = GetNextShort();
168 for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
169 fIsBBMB[iChannel][iBunch] = (data >> 2*iBunch) & 0x1;
170 fIsBGMB[iChannel][iBunch] = (data >> (2*iBunch+1)) & 0x1;
171 if(iBunch < (kNBunches - 1)) {
172 fIsBBMB[iChannel][iBunch+1] = (data >> (8+2*iBunch)) & 0x1;
173 fIsBGMB[iChannel][iBunch+1] = (data >> (8+2*iBunch+1)) & 0x1;
180 for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
181 fBBScalers[iChannel] = ((ULong64_t)GetNextWord()) << 32;
182 fBBScalers[iChannel] |= GetNextWord();
183 fBGScalers[iChannel] = ((ULong64_t)GetNextWord()) << 32;
184 fBGScalers[iChannel] |= GetNextWord();
189 for(Int_t iChannel = (iCIU*8) + 7; iChannel >= iCIU*8; iChannel--) {
190 UInt_t time = GetNextWord();
191 fTime[iChannel] = time & 0xfff;
192 fWidth[iChannel] = ((time >> 12) & 0x7f); // HPTDC used in pairing mode
195 // End of decoding of one CIU card
196 AliWarning(Form("Number of bytes used at end of reading CIU card number %d %d", iCIU+1, fPosition));
198 } // end of decoding the eight CIUs
203 //_____________________________________________________________________________
204 UInt_t AliADRawStream::GetNextWord()
206 // This method returns the next 32 bit word
207 // inside the raw data payload.
208 // The method is supposed to be endian (platform)
210 if (!fData || fPosition < 0) AliFatal("Raw data payload buffer is not yet initialized !");
213 word |= fData[fPosition++];
214 word |= fData[fPosition++] << 8;
215 word |= fData[fPosition++] << 16;
216 word |= fData[fPosition++] << 24;
221 //_____________________________________________________________________________
222 UShort_t AliADRawStream::GetNextShort()
224 // This method returns the next 16 bit word
225 // inside the raw data payload.
226 // The method is supposed to be endian (platform)
228 if (!fData || fPosition < 0) AliFatal("Raw data payload buffer is not yet initialized !");
231 word |= fData[fPosition++];
232 word |= fData[fPosition++] << 8;