/* $Id$ */
-///////////////////////////////////////////////////////////////////////////////
-// //
-// This class provides access to TRD digits in raw data. //
-// //
-// It loops over all TRD digits in the raw data given by the AliRawReader. //
-// The Next method goes to the next digit. If there are no digits left //
-// it returns kFALSE. //
-// Several getters provide information about the current digit. //
-// //
-// Author: C. Lippmann (C.Lippmann@gsi.de) //
-// //
-///////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////
+// //
+// This class provides access to TRD digits in raw data. //
+// //
+// It loops over all TRD digits in the raw data given by the AliRawReader //
+// The Next method goes to the next digit. If there are no digits left //
+// it returns kFALSE. //
+// Several getters provide information about the current digit. //
+// //
+// Author: //
+// Christian Lippmann (C.Lippmann@gsi.de) //
+// //
+////////////////////////////////////////////////////////////////////////////
#include "AliLog.h"
#include "AliRawReader.h"
-#include "AliTRDdigitsManager.h"
-#include "AliTRDdataArrayI.h"
#include "AliTRDRawStream.h"
#include "AliTRDgeometry.h"
-#include "AliTRDCommonParam.h"
#include "AliTRDcalibDB.h"
+#include "AliTRDdigitsManager.h"
+#include "AliTRDdataArrayI.h"
+#include "AliTRDdataArrayS.h"
+#include "AliTRDSignalIndex.h"
+#include "AliTRDfeeParam.h"
ClassImp(AliTRDRawStream)
//_____________________________________________________________________________
AliTRDRawStream::AliTRDRawStream()
- :TObject()
+ :AliTRDrawStreamBase()
+// :TObject()
+ ,fGeo(NULL)
,fSig()
,fADC(0)
,fTB(0)
,fDCS(0)
,fROW(0)
,fCOL(0)
+ ,fDET(0)
+ ,fLastDET(-1)
,fBCctr(0)
,fPTctr(0)
,fPTphase(0)
,fTracklPadRow(0)
,fGTUlinkMask()
,fRawReader(NULL)
- ,fCount(0)
- ,fDetector(-1)
- ,fPrevDetector(-1)
- ,fNPads(-1)
- ,fRow(-1)
- ,fPrevRow(-1)
- ,fColumn(-1)
- ,fPrevColumn(-1)
- ,fTime(-1)
- ,fSignal(-1)
,fRawVersion(2)
- ,fDataWord(0)
- ,fStatus(0)
+ ,fNextStatus(0)
,fTbSwitch(0)
,fTbSwitchCtr(0)
,fTimeWords(0)
,fColMax(0)
,fADCmask()
,fChamberDone()
- ,fGeo(NULL)
- ,fDigitsManager(NULL)
- ,fDigits(NULL)
- ,fTrack0(NULL)
- ,fTrack1(NULL)
- ,fTrack2(NULL)
+ ,fRetVal(0)
+ ,fEqID(0)
+ ,fDataSize(0)
+ ,fSizeOK(kFALSE)
+ ,fCountBytes(0)
+ ,fBufSize(0)
+ ,fBufferSet(kFALSE)
+ ,fPos(NULL)
+ ,fDataWord(NULL)
+ ,fTimeBinsCalib(0)
{
//
// Default constructor
}
-//_____________________________________________________________________________
-AliTRDRawStream::AliTRDRawStream(AliRawReader *rawReader
- , AliTRDdigitsManager *man
- , AliTRDdataArrayI *dig)
- :TObject()
- ,fSig()
- ,fADC(0)
- ,fTB(0)
- ,fEv(0)
- ,fROB(0)
- ,fMCM(0)
- ,fSM(0)
- ,fLAYER(0)
- ,fSTACK(0)
- ,fROC(0)
- ,fSIDE(0)
- ,fDCS(0)
- ,fROW(0)
- ,fCOL(0)
- ,fBCctr(0)
- ,fPTctr(0)
- ,fPTphase(0)
- ,fRVmajor(0)
- ,fRVminor(0)
- ,fHCHWords(0)
- ,fTBins(0)
- ,fTCon(0)
- ,fPEDon(0)
- ,fGAINon(0)
- ,fXTon(0)
- ,fNonLinOn(0)
- ,fBypass(0)
- ,fCommonAdditive(0)
- ,fZeroSuppressed(0)
- ,fHCHctr1(0)
- ,fHCHctr2(0)
- ,fMCMHctr1(0)
- ,fMCMHctr2(0)
- ,fGTUctr1(0)
- ,fGTUctr2(0)
- ,fHCdataCtr(0)
- ,fTracklPID(0.)
- ,fTracklDefL(0.)
- ,fTracklPadPos(0.)
- ,fTracklPadRow(0)
- ,fGTUlinkMask()
- ,fRawReader(rawReader)
- ,fCount(0)
- ,fDetector(-1)
- ,fPrevDetector(-1)
- ,fNPads(-1)
- ,fRow(-1)
- ,fPrevRow(-1)
- ,fColumn(-1)
- ,fPrevColumn(-1)
- ,fTime(-1)
- ,fSignal(-1)
- ,fRawVersion(2)
- ,fDataWord(0)
- ,fStatus(0)
- ,fTbSwitch(0)
- ,fTbSwitchCtr(0)
- ,fTimeWords(0)
- ,fWordCtr(0)
- ,fRowMax(0)
- ,fColMax(0)
- ,fADCmask()
- ,fChamberDone()
- ,fGeo(NULL)
- ,fDigitsManager(man)
- ,fDigits(dig)
- ,fTrack0(NULL)
- ,fTrack1(NULL)
- ,fTrack2(NULL)
-
-{
- //
- // Create an object to read TRD raw digits
- //
-
- fGeo = new AliTRDgeometry();
-
- fRawReader->Select("TRD");
-
- for (Int_t i = 0; i < 540; i++) {
- fChamberDone[i] = 0;
- }
-
-}
-
//_____________________________________________________________________________
AliTRDRawStream::AliTRDRawStream(AliRawReader *rawReader)
- :TObject()
+ :AliTRDrawStreamBase(rawReader)
+// :TObject()
+ ,fGeo(NULL)
,fSig()
,fADC(0)
,fTB(0)
,fDCS(0)
,fROW(0)
,fCOL(0)
+ ,fDET(0)
+ ,fLastDET(-1)
,fBCctr(0)
,fPTctr(0)
,fPTphase(0)
,fTracklPadRow(0)
,fGTUlinkMask()
,fRawReader(rawReader)
- ,fCount(0)
- ,fDetector(-1)
- ,fPrevDetector(-1)
- ,fNPads(-1)
- ,fRow(-1)
- ,fPrevRow(-1)
- ,fColumn(-1)
- ,fPrevColumn(-1)
- ,fTime(-1)
- ,fSignal(-1)
,fRawVersion(2)
- ,fDataWord(0)
- ,fStatus(0)
+ ,fNextStatus(0)
,fTbSwitch(0)
,fTbSwitchCtr(0)
,fTimeWords(0)
,fColMax(0)
,fADCmask()
,fChamberDone()
- ,fGeo(NULL)
- ,fDigitsManager(NULL)
- ,fDigits(NULL)
- ,fTrack0(NULL)
- ,fTrack1(NULL)
- ,fTrack2(NULL)
-
+ ,fRetVal(0)
+ ,fEqID(0)
+ ,fDataSize(0)
+ ,fSizeOK(kFALSE)
+ ,fCountBytes(0)
+ ,fBufSize(0)
+ ,fBufferSet(kFALSE)
+ ,fPos(NULL)
+ ,fDataWord(NULL)
+ ,fTimeBinsCalib(0)
{
//
// Create an object to read TRD raw digits
//_____________________________________________________________________________
AliTRDRawStream::AliTRDRawStream(const AliTRDRawStream& stream)
- :TObject(stream)
+ :AliTRDrawStreamBase(stream)
+// :TObject()
+ ,fGeo(NULL)
,fSig()
,fADC(-1)
,fTB(-1)
,fDCS(-1)
,fROW(-1)
,fCOL(-1)
+ ,fDET(0)
+ ,fLastDET(-1)
,fBCctr(-1)
,fPTctr(-1)
,fPTphase(-1)
,fTracklPadRow(-1)
,fGTUlinkMask()
,fRawReader(NULL)
- ,fCount(-1)
- ,fDetector(-1)
- ,fPrevDetector(-1)
- ,fNPads(-1)
- ,fRow(-1)
- ,fPrevRow(-1)
- ,fColumn(-1)
- ,fPrevColumn(-1)
- ,fTime(-1)
- ,fSignal(-1)
,fRawVersion(-1)
- ,fDataWord(0)
- ,fStatus(-1)
+ ,fNextStatus(0)
,fTbSwitch(0)
,fTbSwitchCtr(0)
,fTimeWords(0)
,fColMax(-1)
,fADCmask()
,fChamberDone()
- ,fGeo(NULL)
- ,fDigitsManager(NULL)
- ,fDigits(NULL)
- ,fTrack0(NULL)
- ,fTrack1(NULL)
- ,fTrack2(NULL)
-
+ ,fRetVal(0)
+ ,fEqID(0)
+ ,fDataSize(0)
+ ,fSizeOK(kFALSE)
+ ,fCountBytes(0)
+ ,fBufSize(0)
+ ,fBufferSet(kFALSE)
+ ,fPos(NULL)
+ ,fDataWord(NULL)
+ ,fTimeBinsCalib(0)
{
//
// Copy constructor
// Assigment operator
//
- Fatal("operator =", "assignment operator not implemented");
+ AliFatal("Assignment operator not implemented");
return *this;
}
// Destructor
//
+ if (fGeo) {
+ delete fGeo;
+ }
+
}
//_____________________________________________________________________________
-Bool_t AliTRDRawStream::SetRawVersion(Int_t rv)
+void AliTRDRawStream::SetRawReader(AliRawReader *rawReader)
{
//
- // Set the raw data version
+ // Sets the raw reader
//
- if ( rv >= 0 && rv <= 3 ) {
- fRawVersion = rv;
- return kTRUE;
- }
-
- return kFALSE;
+ if (rawReader)
+ {
+ fRawReader = rawReader;
+ }
}
//_____________________________________________________________________________
-Bool_t AliTRDRawStream::Next()
+Bool_t AliTRDRawStream::SetRawVersion(Int_t rv)
{
//
- // This is Bogdans code for reading raw data (offline use only).
- // It is used for fRawVersion == 0. This funcyion read the next raw digit.
- // Returns kFALSE if there is no digit left
+ // Set the raw data version
//
- fPrevDetector = fDetector;
- fPrevRow = fRow;
- fPrevColumn = fColumn;
- UChar_t data;
-
- AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
- if (!calibration) return kFALSE;
-
- Int_t timeBins = calibration->GetNumberOfTimeBins();
-
- while (fCount >= 0) {
-
- while (fCount == 0) { // next detector
-
- // read the flag
- if (!fRawReader->ReadNextChar(data)) {
- return kFALSE;
- }
- if (data != 0xBB) {
- AliError(Form("wrong flag: %x", data));
- fCount = -1;
- return kFALSE;
- }
-
- // read the detector number
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read detector number");
- fCount = -1;
- return kFALSE;
- }
- fDetector = data;
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read detector number");
- fCount = -1;
- return kFALSE;
- }
- fDetector += (UInt_t(data) << 8);
-
- // read the number of byts
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read number of bytes");
- fCount = -1;
- return kFALSE;
- }
- fCount = data;
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read number of bytes");
- fCount = -1;
- return kFALSE;
- }
- fCount += (UInt_t(data) << 8);
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read number of bytes");
- fCount = -1;
- return kFALSE;
- }
- fCount += (UInt_t(data) << 16);
-
- // read the number of active pads
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read number of active pads");
- fCount = -1;
- return kFALSE;
- }
- fNPads = data;
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read number of active pads");
- fCount = -1;
- return kFALSE;
- }
- fNPads += (UInt_t(data) << 8);
-
- fTime = timeBins;
-
- }
-
- // read the pad row and column number
- if ((fTime >= timeBins) && (fCount > 2)) {
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read row number");
- fCount = -1;
- return kFALSE;
- }
- fCount--;
- fRow = data - 1;
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read column number");
- fCount = -1;
- return kFALSE;
- }
- fCount--;
- fColumn = data - 1;
- fTime = 0;
- }
-
- // read the next data byte
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read data");
- fCount = -1;
- return kFALSE;
- }
- fCount--;
-
- if (data == 0) { // zeros
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read time value");
- fCount = -1;
- return kFALSE;
- }
- fCount--;
- fTime += data + 1;
-
- }
- else { // signal
- fSignal = (UInt_t(data & 0x7F) << 8);
- if (!fRawReader->ReadNextChar(data)) {
- AliError("Could not read ADC value");
- fCount = -1;
- return kFALSE;
- }
- fCount--;
- fSignal += data;
- fTime++;
- return kTRUE;
- }
+ if ( rv >= 0 && rv <= 3 ) {
+ fRawVersion = rv;
+ return kTRUE;
}
return kFALSE;
}
//____________________________________________________________________________
-Int_t AliTRDRawStream::ReadAll()
+Bool_t AliTRDRawStream::Init()
{
-
- //
- // Read all TRD raw data word (32 bits). This is for all fRawVersion > 0.
- // Return 0 if something is not cool, 2 if data seems empty
//
- // by C. Lippmann
+ // Initialization
//
-
- AliTRDCommonParam *commonParam = AliTRDCommonParam::Instance();
- if (!commonParam) {
- AliError("Could not get common parameters");
- return 0;
- }
- AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
- if (!calibration) {
+ if (!AliTRDcalibDB::Instance()) {
AliError("Could not get calibration object");
- return 0;
+ return kFALSE;
+ }
+
+ if (!fGeo) {
+ fGeo = new AliTRDgeometry();
}
- UInt_t timeTotal = calibration->GetNumberOfTimeBins();
- AliDebug(2, Form("Number of Timebins read from CDB: %d", timeTotal));
+ fTimeBinsCalib = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
+ AliDebug(2, Form("Number of Timebins read from CDB: %d", fTimeBinsCalib));
// The number of data words needed for this number of time bins (there
// are 3 time bins in one word)
- fTimeWords = (timeTotal-1)/3 + 1;
+ fTimeWords = (fTimeBinsCalib-1)/3 + 1;
fTbSwitch = 3;
fTbSwitchCtr = 0;
- Int_t EqID = 0;
- UInt_t datasize = 0;
- Int_t iDET = 0;
-
- Int_t retval = 0;
-
- Bool_t sizeOK = kFALSE;
-
fHCHctr1 = fHCHctr2 = 0;
fGTUctr1 = fGTUctr2 = -1;
fHCdataCtr = 0;
- fWordCtr = 0;
-
- AliInfo("Converting TRD raw data to digits ...");
-
- while ( 1 ) { // loop over all supermodules
-
- fWordCtr = 0;
- fHCHctr1 = 0;
- fMCMHctr1 = 0;
-
- //
- // 0) Find first GTU Link Mask and test if we can read data
- //
- do {
-
- if ( !fRawReader->ReadNextInt( fDataWord ) ) { // This is the standard exit point
- // Compress also the digits from the last detector
- if ( fChamberDone[iDET] == 2 ) {
- //printf("Compressing data for det %d\n", iDET);
- fDigits->Compress(1,0);
- fTrack0->Compress(1,0);
- fTrack1->Compress(1,0);
- fTrack2->Compress(1,0);
- }
- AliInfo(Form("Finished processing TRD raw data: Found %d Half-Chambers", fHCHctr2));
- //
- /*
- fDigits = fDigitsManager->GetDigits(iDET+1);
- fTrack0 = fDigitsManager->GetDictionary(iDET+1,0);
- fTrack1 = fDigitsManager->GetDictionary(iDET+1,1);
- fTrack2 = fDigitsManager->GetDictionary(iDET+1,2);
- fDigits->Allocate(fRowMax,fColMax,timeTotal);
- fTrack0->Allocate(fRowMax,fColMax,timeTotal);
- fTrack1->Allocate(fRowMax,fColMax,timeTotal);
- fTrack2->Allocate(fRowMax,fColMax,timeTotal);
- fDigits->SetDataUnchecked(0, 0, 0, 50);
- fTrack0->SetDataUnchecked(0, 0, 0, 0);
- fTrack1->Set
- fTrack2->SetDataUnchecked(0, 0, 0, 0);
- fDigits->Compress(1,0);
- fTrack0->Compress(1,0);
- fTrack1->Compress(1,0);
- fTrack2->Compress(1,0);
- */
- //
- if ( sizeOK ) return 1;
- else return 2;
- }
-
- fWordCtr++;
-
- // After reading the first word check for size of this data and get Eq. ID
- if ( fWordCtr == 1 ) {
- datasize = fRawReader->GetDataSize()/4; // Size of this payload in 32bit words
- EqID = fRawReader->GetEquipmentId(); // Get Equipment ID
- //if ( sizeOK = kFALSE && datasize > 0 ) { sizeOK = kTRUE; printf("Yo\n"); }
- if ( datasize > 0 ) sizeOK = kTRUE;
- }
-
- // GTU Link Mask?
- if ( (fDataWord & 0xfffff000) == 0xe0000000 ) {
- fStatus = 1; // GTU link mask found
- DecodeGTUlinkMask();
- break;
- }
- else {
- AliError(Form("Equipment %d: First data word is not GTU Link Mask!", EqID));
- return 0;
- }
+ fWordCtr = 0;
+
+ fDET = 0;
+ fLastDET = -1;
+ fRetVal = 0;
+ fEqID = 0;
+ fDataSize = 0;
+ fSizeOK = kFALSE;
+
+ fNextStatus = kStart;
- }
- while ( fWordCtr < datasize );
+ fCountBytes = 0;
+ fBufSize = 0;
+ fDataWord = NULL;
+ fPos = NULL;
+ fWordCtr = 0;
+ fBufferSet = kFALSE;
- //
- // loop over all half chambers in one supermodule
- //
- while ( fWordCtr < datasize ) {
+ return kTRUE;
- //
- // 1) Find end_of_tracklet_marker
- //
- while ( fWordCtr < datasize ) {
+}
- if ( !fRawReader->ReadNextInt( fDataWord ) ) {
- AliError("Could not read data");
- return 0;
- }
- fWordCtr++;
+//____________________________________________________________________________
+Int_t AliTRDRawStream::NextData()
+{
+ //
+ // Updates the next data word pointer
+ //
- // GTU Link Mask?
- if ( (fDataWord & 0xfffff000) == 0xe0000000 ) {
- DecodeGTUlinkMask();
- continue;
+ if (fCountBytes + kSizeWord >= fBufSize)
+ {
+ fBufferSet = fRawReader->ReadNextData(fPos);
+ if (fBufferSet == kTRUE)
+ {
+ fBufSize = fRawReader->GetDataSize();
+ fCountBytes = 0;
+ fDataWord = (UInt_t*)fPos;
+ fNextStatus = kNextSM;
+ fWordCtr = 0;
+ return kNextSM;
}
-
- // endoftrackletmarker?
- if ( fDataWord == kEndoftrackletmarker ) {
- AliDebug(3, "end-of-tracklet-marker found");
- fStatus = 1;
- break;
- }
- else {
- // Tracklets found
- AliDebug(3, "Tracklet found");
- DecodeTracklet();
+ else
+ {
+ fNextStatus = kStop;
+ return kNoMoreData;
}
+ }
+ else
+ {
- }
-
- if ( fStatus == 0 ) break;
-
- //
- // 2) Look for non-end_of_tracklet_marker
- //
- fStatus = 0;
- while ( fWordCtr < datasize ) {
-
- if ( !fRawReader->ReadNextInt( fDataWord ) ) {
- AliError("Could not read data");
- return 0;
- }
- fWordCtr++;
- //printf("Word %d: 0x%08x\n", fWordCtr, fDataWord);
+ fPos += kSizeWord;
+ fCountBytes += kSizeWord;
+ fDataWord = (UInt_t*)fPos;
+ fWordCtr++;
+ return kWordOK;
+ }
+}
- if ( fDataWord != kEndoftrackletmarker ) {
- fStatus = 1;
- break;
- }
+//____________________________________________________________________________
+Bool_t AliTRDRawStream::Next()
+{
+ //
+ // Updates the next data word pointer
+ //
- }
+ if (fNextStatus == kStart)
+ {
+ Init();
+ }
- if ( fStatus == 0 ) break;
-
- //
- // 3) This Word must be Half Chamber Header
- //
- fStatus = 0;
- if ( (fDataWord & 0x00000003) == 1 ) { // HC header
-
- // If both half chambers of chamber corresponding to previous header
- // were already processed, we can compress these digits
- iDET = fGeo->GetDetector(fLAYER, fSTACK, fSM); // !!this is still the previous HC!!
- if ( fChamberDone[iDET] == 2 ) {
- //printf("Compressing data for det %d\n", iDET);
- fDigits->Compress(1,0);
- fTrack0->Compress(1,0);
- fTrack1->Compress(1,0);
- fTrack2->Compress(1,0);
- }
- // Read from new HC header the chamber position (fLAYER, fSTACK, fSM)
- DecodeHCheader(timeTotal); // This is the new header!
- iDET = fGeo->GetDetector(fLAYER, fSTACK, fSM);
- fRowMax = commonParam->GetRowMax(fLAYER,fSTACK,fSM);
- fColMax = commonParam->GetColMax(fROC);
-
- // The container for the digits of this detector
- fDigits = fDigitsManager->GetDigits(iDET);
- fTrack0 = fDigitsManager->GetDictionary(iDET,0);
- fTrack1 = fDigitsManager->GetDictionary(iDET,1);
- fTrack2 = fDigitsManager->GetDictionary(iDET,2);
-
- // Allocate memory if it was not already done
- if (fDigits->GetNtime() == 0) {
- //printf("Allocating digits memory for det %d\n", iDET);
- fDigits->Allocate(fRowMax, fColMax, fTBins);
- fTrack0->Allocate(fRowMax, fColMax, fTBins);
- fTrack1->Allocate(fRowMax, fColMax, fTBins);
- fTrack2->Allocate(fRowMax, fColMax, fTBins);
- }
- if ( fZeroSuppressed ) { // Make sure digits in this HC are 0
- for ( Int_t colctr = fSIDE*fColMax/2; colctr < fColMax*(1+fSIDE)/2; colctr++ ) {
- for ( Int_t rowctr = 0; rowctr < fRowMax; rowctr++ ) {
- for ( Int_t timectr = 0; timectr < fTBins; timectr++ ) {
- fDigits->SetDataUnchecked(rowctr, colctr, timectr, 0);
- fTrack0->SetDataUnchecked(rowctr, colctr, timectr, 0);
- fTrack1->SetDataUnchecked(rowctr, colctr, timectr, 0);
- fTrack2->SetDataUnchecked(rowctr, colctr, timectr, 0);
- }
+ while (fNextStatus != kStop)
+ { // !kStop
+ NextData();
+ if (fNextStatus == kNextMCM || fNextStatus == kNextData)
+ {
+ fHCdataCtr += 4;
+
+ if( ((*fDataWord & 0x80000000) == 0x0) && ((*fDataWord & 0x0000000f) == 0xC) )
+ { // MCM Header
+ DecodeMCMheader();
+ if ( fMCM < 0 || fMCM > 15 || fROB < 0 || fROB > 7 )
+ {
+ AliWarning("Wrong fMCM or fROB. Skip this data");
+ fRawReader->AddMajorErrorLog(kWrongMCMorROB,Form("MCM=%d, ROB=%d",fMCM,fROB));
+ fNextStatus = kNextHC;
+ continue;
+ }
+ fTbSwitch = 3; // For first adc channel we expect: (*fDataWord & 3) = 3
+ fTbSwitchCtr = 0; //
+ fADC = fTB = 0; // Reset Counter
+ fNextStatus = kNextData;
+ continue;
}
- }
- }
- fMCMHctr2 = 0;
- fHCdataCtr = 0;
-
- fChamberDone[iDET]++;
-
- }
-
- //
- // 4) Scan MCM data
- //
- fStatus = 0;
- while ( fWordCtr < datasize ) {
-
- if ( !fRawReader->ReadNextInt( fDataWord ) ) {
- AliError("Could not read data");
- return 0;
- }
- fWordCtr++;
- //printf("Word %d: 0x%08x\n", fWordCtr, fDataWord);
-
- fHCdataCtr += 4;
-
- //if( (fDataWord & 0x0000000f) == 0xC ) { // MCM Header
- if( ((fDataWord & 0x80000000) == 0x0) && ((fDataWord & 0x0000000f) == 0xC) ) { // MCM Header
- DecodeMCMheader();
- if ( fMCM < 0 || fMCM > 15 || fROB < 0 || fROB > 7 ) {
- AliError("Wrong fMCM or fROB. Skip this data");
- break;
- }
- fTbSwitch = 3; // For first adc channel we expect: (fDataWord & 3) = 3
- fTbSwitchCtr = 0; //
- fADC = fTB = 0; // Reset Counter
- fStatus = 1; // Now 1 means MCM header is found
- continue;
- }
-
- if ( fDataWord == kEndofrawdatamarker ) { // End of half-chamber data, finished
- fGTUctr1 = -1;
- break;
- }
-
- if ( fStatus == 1 ) { // MCM header is set, ADC data is valid.
-
- // Found some data. Decode it now:
- retval = DecodeDataWord();
- if ( retval == 0 ) continue;
- if ( retval == -1 ) break;
- if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 ) {
-
- // Write Digits
- if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax ) { // A real pad
- for ( Int_t ctr = 0; ctr < 3; ctr++ ) {
- if ( fTB+ctr < (Int_t)timeTotal ) {
- /*
- fDigits->SetDataUnchecked(fROW, fCOL, fTB+ctr, fSig[ctr]);
- fTrack0->SetDataUnchecked(fROW, fCOL, fTB+ctr, 0);
- fTrack1->SetDataUnchecked(fROW, fCOL, fTB+ctr, 0);
- fTrack2->SetDataUnchecked(fROW, fCOL, fTB+ctr, 0);
- */
-
- //
- // Pedestal subtraction done here (???):
- //
- //fDigits->SetData(fROW, fCOL, fTB+ctr, fSig[ctr] - fCommonAdditive);
- fDigits->SetData(fROW, fCOL, fTB+ctr, fSig[ctr]);
- fTrack0->SetData(fROW, fCOL, fTB+ctr, 0);
- fTrack1->SetData(fROW, fCOL, fTB+ctr, 0);
- fTrack2->SetData(fROW, fCOL, fTB+ctr, 0);
+ if ( *fDataWord == kEndofrawdatamarker )
+ { // End of half-chamber data, finished
+ fGTUctr1 = -1;
+ fNextStatus = kNextHC;
+ continue;
+ }
+
+ if (fNextStatus == kNextData )
+ { // MCM header is set, ADC data is valid.
+
+ // Found some data. Decode it now:
+ fRetVal = DecodeDataWord();
+ if ( fRetVal == 0 ) continue;
+ if ( fRetVal == -1 )
+ {
+ fNextStatus = kNextHC;
+ continue;
+ }
+ if ( fRetVal == 1)
+ {
+ { // A real pad
+ fTB += 3;
+ return kTRUE;
+ }
}
- }
+ // following ifs have been moved to DEcodeDatawordV1V2
+ // if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 )
+ // {
+ // // Write Digits
+ // if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax )
+ // { // A real pad
+ // fTB += 3;
+ // return kTRUE;
+ // }
+ // }
+ // else
+ // {
+ // fCOL = -1;
+ // }
+ }// kNextData
+
+ continue;
+ } //next mcm
+
+ if ( fNextStatus == kNextHC )
+ {
+ //
+ // 1) Find end_of_tracklet_marker
+ //
+ // GTU Link Mask?
+ if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
+ {
+ DecodeGTUlinkMask();
+ continue;
+ }
+
+ // endoftrackletmarker?
+ if ( *fDataWord == kEndoftrackletmarker )
+ {
+ AliDebug(3, "end-of-tracklet-marker found");
+ fNextStatus = kSeekNonEoTracklet;
+ continue;
+ }
+ else
+ {
+ // Tracklets found
+ AliDebug(3, "Tracklet found");
+ DecodeTracklet();
+ continue;
+ }
+ } //if next HC
+
+ if (fNextStatus == kSeekNonEoTracklet)
+ {
+ //
+ // 2) Look for non-end_of_tracklet_marker
+ //
+ //printf("Word %d: 0x%08x\n", fWordCtr, *fDataWord);
+
+ if ( *fDataWord != kEndoftrackletmarker )
+ {
+ fNextStatus = kDecodeHC;
+ AliDebug(3, "NON end-of-tracklet-marker found");
+ //// no do not continue - this should be the hcheader
+ }
+ else
+ {
+ //just go on and find the non-end_of_tracklet_marker
+ continue;
}
-
- fTB += 3;
-
- }
- else {
-
- fCOL = -1;
-
- }
-
}
- }
-
- AliDebug(2, Form("SM%02d L%dS%d side %x: Processed %dMCMs=%dbyte", fSM, fLAYER, fSTACK, fSIDE+10,
- fMCMHctr2, fHCdataCtr));
-
- } // End Half-Chamber loop
-
- AliDebug(1, Form("SM%02d (Eq %d): Processed %d HC (%dMCMs=%dbyte)", fSM, EqID, fHCHctr1, fMCMHctr1,
- datasize*4));
-
- } // End Super Module loop
-
- // Compress also the digits from the last detector
- if ( fChamberDone[iDET] == 2 ) {
- //printf("Compressing data for det %d\n", iDET);
- fDigits->Compress(1,0);
- fTrack0->Compress(1,0);
- fTrack1->Compress(1,0);
- fTrack2->Compress(1,0);
- }
-
- if ( sizeOK ) return 1;
- else return 2;
+ if ( fNextStatus == kDecodeHC )
+ {
+ AliDebug(3, "Decode HC");
+
+ //
+ // 3) This Word must be Half Chamber Header
+ //
+ if ( (*fDataWord & 0x00000003) == 1 )
+ { // HC header
+ DecodeHCheader(fTimeBinsCalib); // This is the new header!
+ fLastDET = fDET;
+ fDET = fGeo->GetDetector(fLAYER, fSTACK, fSM);
+ fRowMax = fGeo->GetRowMax(fLAYER,fSTACK,fSM);
+ fColMax = fGeo->GetColMax(fROC);
+
+ fMCMHctr2 = 0;
+ fHCdataCtr = 0;
+
+ fChamberDone[fDET]++;
+ fNextStatus = kNextMCM;
+ AliDebug(3, "Decode HC OK");
+ continue;
+ } //HC header
+ else
+ {
+ AliDebug(3, "Decode HC NOT OK");
+ fNextStatus = kNextSM;
+ continue;
+ }
+ } // if decode HC
+ if (fNextStatus == kNextSM)
+ {
+
+ fDET = 0;
+ fRetVal = 0;
+ fEqID = 0;
+ fDataSize = 0;
+ fSizeOK = kFALSE;
+
+ // After reading the first word check for size of this data and get Eq. ID
+ if ( fWordCtr == 1 )
+ {
+ fDataSize = fRawReader->GetDataSize()/4; // Size of this payload in 32bit words
+ fEqID = fRawReader->GetEquipmentId(); // Get Equipment ID
+ if ( fDataSize > 0 ) fSizeOK = kTRUE;
+ }
+
+ // GTU Link Mask?
+ if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
+ {
+ DecodeGTUlinkMask();
+ fNextStatus = kNextHC;
+ continue;
+ }
+ else
+ {
+ AliWarning(Form("Equipment %d: First data word is not GTU Link Mask!", fEqID));
+ fRawReader->AddMajorErrorLog(kGTULinkMaskMissing,Form("Equipment %d",fEqID));
+ fNextStatus = kStop;
+ }
+ }// if nextSM
+
+ } // not kStop
+
+ AliDebug(1, Form("That's all folks! %d", fSM));
+ return kFALSE;
}
-//============================================================================
-// Decoding functions
-//============================================================================
-
//____________________________________________________________________________
-void AliTRDRawStream::DecodeHCheader(Int_t timeBins)
+Int_t AliTRDRawStream::NextChamber(AliTRDdigitsManager *man)
{
//
- // Decode a half chamber header
+ // Updates the next data word pointer
//
- if ( (fDataWord >> 31) == 0 ) { // Can only happen for fRawVersion == 1
-
- if ( fRawVersion != 1 ) {
-
- AliWarning("===============================================================================");
- AliWarning(Form("Mismatch between fRawVersion (%d) and HC header signature", fRawVersion));
- AliWarning("Setting fRawVersion to 1");
- AliWarning("===============================================================================");
- fRawVersion = 1;
-
+ AliTRDdataArrayS *digits = 0;
+ AliTRDdataArrayI *track0 = 0;
+ AliTRDdataArrayI *track1 = 0;
+ AliTRDdataArrayI *track2 = 0;
+ AliTRDSignalIndex *indexes = 0;
+
+ if (fNextStatus == kStart)
+ {
+ Init();
}
- DecodeHCheaderV1();
- return;
-
- }
- else {
-
- fRVmajor = (fDataWord >> 24) & 0x7f;
- fRVminor = (fDataWord >> 17) & 0x7f;
-
- if ( fRawVersion != fRVmajor ) {
-
- AliWarning("===============================================================================");
- AliWarning(Form("Mismatch between fRawVersion (%d) and fRVmajor from HC header (%d)"
- ,fRawVersion,fRVmajor));
- AliWarning(Form("Setting fRawVersion to %d", fRVmajor));
- AliWarning("===============================================================================");
- fRawVersion = fRVmajor;
-
- }
- if ( fRawVersion >= 2 && fRawVersion <= 3 ) {
- DecodeHCheaderV2V3(timeBins);
- }
+ while (fNextStatus != kStop)
+ { // !kStop
+ NextData();
+ if (fNextStatus == kNextMCM || fNextStatus == kNextData)
+ //while (fNextStatus == kNextMCM || fNextStatus == kNextData)
+ {
+ fHCdataCtr += 4;
+
+ if( ((*fDataWord & 0x80000000) == 0x0) && ((*fDataWord & 0x0000000f) == 0xC) )
+ { // MCM Header
+ DecodeMCMheader();
+ if ( fMCM < 0 || fMCM > 15 || fROB < 0 || fROB > 7 )
+ {
+ AliWarning("Wrong fMCM or fROB. Skip this data");
+ fRawReader->AddMajorErrorLog(kWrongMCMorROB,Form("MCM=%d, ROB=%d",fMCM,fROB));
+ fNextStatus = kNextHC;
+ continue;
+ }
+ fTbSwitch = 3; // For first adc channel we expect: (*fDataWord & 3) = 3
+ fTbSwitchCtr = 0; //
+ fADC = fTB = 0; // Reset Counter
+ fNextStatus = kNextData;
- //
- // check for zero suppression
- if ( fRawVersion >= 3 || fRawVersion <= 4 ) fZeroSuppressed = kTRUE;
- else fZeroSuppressed = kFALSE;
+// NextData(); // if while loop!
+ continue; // if if
+ }
+
+ if ( *fDataWord == kEndofrawdatamarker )
+ { // End of half-chamber data, finished
+ fGTUctr1 = -1;
+ fNextStatus = kNextHC;
+ // full chamber processed ?
+ if (fChamberDone[fDET] == 2)
+ {
+ return fDET;
+ }
+ else
+ {
+// break; // if while loop
+ continue; // if if
+ }
+ }
+
+ if (fNextStatus == kNextData )
+ { // MCM header is set, ADC data is valid.
+
+ // Found some data. Decode it now:
+ fRetVal = DecodeDataWord();
+ if ( fRetVal == 0 ) continue;
+ if ( fRetVal == -1 )
+ {
+ fNextStatus = kNextHC;
+
+// NextData(); // if while loop!
+// break; //if while loop!
+ continue;// if if
+ }
+
+ if ( fRetVal == 1)
+ {
+ { // A real pad
+ // here fill the data arrays
+ //return kTRUE;
+ for (Int_t it = 0; it < 3; it++)
+ {
+ if ( GetTimeBin() + it < GetNumberOfTimeBins() )
+ {
+ if (GetSignals()[it] > 0)
+ {
+ digits->SetDataUnchecked(fROW, fCOL, fTB + it, fSig[it]);
+ indexes->AddIndexTBin(fROW, fCOL, fTB + it);
+ if (man->UsesDictionaries())
+ {
+ track0->SetDataUnchecked(fROW, fCOL, fTB + it, 0);
+ track1->SetDataUnchecked(fROW, fCOL, fTB + it, 0);
+ track2->SetDataUnchecked(fROW, fCOL, fTB + it, 0);
+ }
+ }
+ } // check the tbins range
+ } // for each tbin of current 3
+ fTB += 3;
+ }// real pad
+ } // if fRetVal == 1
+
+ // following ifs have been moved to DEcodeDatawordV1V2
+// if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 )
+// {
+// // Write Digits
+// if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax )
+// { // A real pad
+// fTB += 3;
+// return kTRUE;
+// }
+// }
+// else
+// {
+// fCOL = -1;
+// }
+ }// kNextData
+
+// NextData(); // if while loop!
+ continue; //if if
+ } //next mcm
+
+ if ( fNextStatus == kNextHC )
+ {
+ //
+ // 1) Find end_of_tracklet_marker
+ //
+ // GTU Link Mask?
+ if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
+ {
+ DecodeGTUlinkMask();
+ continue;
+ }
+
+ // endoftrackletmarker?
+ if ( *fDataWord == kEndoftrackletmarker )
+ {
+ AliDebug(3, "end-of-tracklet-marker found");
+ fNextStatus = kSeekNonEoTracklet;
+ continue;
+ }
+ else
+ {
+ // Tracklets found
+ AliDebug(3, "Tracklet found");
+ DecodeTracklet();
+ continue;
+ }
+ } //if next HC
+
+ if (fNextStatus == kSeekNonEoTracklet)
+ {
+ //
+ // 2) Look for non-end_of_tracklet_marker
+ //
+ //printf("Word %d: 0x%08x\n", fWordCtr, *fDataWord);
+
+ if ( *fDataWord != kEndoftrackletmarker )
+ {
+ fNextStatus = kDecodeHC;
+ AliDebug(3, "NON end-of-tracklet-marker found");
+ //// no do not continue - this should be the hcheader
+ }
+ else
+ {
+ //just go on and find the non-end_of_tracklet_marker
+ continue;
+ }
+ }
- return;
+ if ( fNextStatus == kDecodeHC )
+ {
+ AliDebug(3, "Decode HC");
+
+ //
+ // 3) This Word must be Half Chamber Header
+ //
+ if ( (*fDataWord & 0x00000003) == 1 )
+ { // HC header
+ DecodeHCheader(fTimeBinsCalib); // This is the new header!
+ fDET = fGeo->GetDetector(fLAYER, fSTACK, fSM);
+ fRowMax = fGeo->GetRowMax(fLAYER,fSTACK,fSM);
+ fColMax = fGeo->GetColMax(fROC);
+
+ if (fLastDET != fDET)
+ {
+ AliDebug(4, "New DET!");
+ // allocate stuff for the new det
+ //man->ResetArrays();
+ digits = (AliTRDdataArrayS *) man->GetDigits(fDET);
+ track0 = (AliTRDdataArrayI *) man->GetDictionary(fDET,0);
+ track1 = (AliTRDdataArrayI *) man->GetDictionary(fDET,1);
+ track2 = (AliTRDdataArrayI *) man->GetDictionary(fDET,2);
+
+ // Allocate memory space for the digits buffer
+ if (digits->GetNtime() == 0)
+ {
+ AliDebug(4, "Allocating digits");
+ //AliDebug(5, Form("Alloc digits for det %d", det));
+ digits->Allocate(fRowMax, fColMax, fTBins);
+ if (man->UsesDictionaries())
+ {
+ track0->Allocate(fRowMax, fColMax, fTBins);
+ track1->Allocate(fRowMax, fColMax, fTBins);
+ track2->Allocate(fRowMax, fColMax, fTBins);
+ }
+ }
+
+ indexes = man->GetIndexes(fDET);
+ indexes->SetSM(fSM);
+ indexes->SetStack(fSTACK);
+ indexes->SetLayer(fLAYER);
+ indexes->SetDetNumber(fDET);
+
+ if (indexes->IsAllocated() == kFALSE)
+ {
+ AliDebug(4, "Allocating indexes");
+ indexes->Allocate(fRowMax, fColMax, fTBins);
+ }
+ fLastDET = fDET;
+ }
+
+ fMCMHctr2 = 0;
+ fHCdataCtr = 0;
+
+ fChamberDone[fDET]++;
+ fNextStatus = kNextMCM;
+ AliDebug(3, "Decode HC OK");
+ continue;
+ } //HC header
+ else
+ {
+ AliDebug(3, "Decode HC NOT OK");
+ fNextStatus = kNextSM;
+ continue;
+ }
+ } // if decode HC
- }
+ if (fNextStatus == kNextSM)
+ {
+
+ fDET = 0;
+ fRetVal = 0;
+ fEqID = 0;
+ fDataSize = 0;
+ fSizeOK = kFALSE;
+
+ // After reading the first word check for size of this data and get Eq. ID
+ if ( fWordCtr == 1 )
+ {
+ fDataSize = fRawReader->GetDataSize()/4; // Size of this payload in 32bit words
+ fEqID = fRawReader->GetEquipmentId(); // Get Equipment ID
+ if ( fDataSize > 0 ) fSizeOK = kTRUE;
+ }
+
+ // GTU Link Mask?
+ if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
+ {
+ DecodeGTUlinkMask();
+ fNextStatus = kNextHC;
+ continue;
+ }
+ else
+ {
+ AliWarning(Form("Equipment %d: First data word is not GTU Link Mask!", fEqID));
+ fRawReader->AddMajorErrorLog(kGTULinkMaskMissing,Form("Equipment %d",fEqID));
+ fNextStatus = kStop;
+ }
+ }// if nextSM
+
+ } // not kStop
+
+ AliDebug(1, Form("That's all folks! %d", fSM));
+ //return kFALSE;
+ return -1;
+}
- AliError(Form(" Unsupported raw version: %d", fRawVersion));
- return;
+//============================================================================
+// Decoding functions
+//============================================================================
-}
//____________________________________________________________________________
-void AliTRDRawStream::DecodeHCheaderV1()
+void AliTRDRawStream::DecodeHCheader(Int_t timeBins)
{
-
//
- // Decode the HC header (fRawVersion == 1, SM I Commissioning 06)
+ // Decode the HC header (fRawVersion == 2, 3, 4, ???)
//
- if ( (fDataWord & 0x3) == 1 ) {
-
- fDCS = (fDataWord >> 20);
- fSM = (fDataWord >> 15) & 0x1f;
- fLAYER = (fDataWord >> 12) & 0x7;
- fSTACK = (fDataWord >> 9) & 0x7;
- fSIDE = (fDataWord >> 8) & 0x1;
-
- fROC = fGeo->GetDetectorSec(fLAYER, fSTACK);
-
- //AliDebug(3, Form("0x%08x: HC header: dcs=%d; sm=%d; roc=%d; side=%x", fDataWord, fDCS, fSM, fROC, fSIDE+10));
+ fRVmajor = (*fDataWord >> 24) & 0x7f;
+ fRVminor = (*fDataWord >> 17) & 0x7f;
- if ((fSM < 0) ||
- (fSM > 17) ||
- (fLAYER < 0) ||
- (fLAYER > 5) ||
- (fSTACK < 0) ||
- (fSTACK > 4) ||
- (fSIDE < 0) ||
- (fSIDE > 1)) {
- AliWarning(Form("0x%08x: Strange HC header: dcs=%d; sm=%d; layer=%d; stack=%d.",
- fDataWord, fDCS, fSM, fLAYER, fSTACK));
- }
- else {
- fStatus = 1;
- fHCHctr1++;
- fHCHctr2++;
- }
- fHCHWords = 0;
-
- }
- else {
-
- AliError(Form("0x%08x: No HC header when it was expected.", fDataWord));
+ if (fRVmajor < 2 || fRVmajor > 4)
+ AliError(Form(" Unsupported raw version: %d", fRawVersion))
+
+ if ( fRawVersion != fRVmajor ) {
+
+ AliWarning("===============================================================================");
+ AliWarning(Form("Mismatch between fRawVersion (%d) and fRVmajor from HC header (%d)"
+ ,fRawVersion,fRVmajor));
+ AliWarning(Form("Setting fRawVersion to %d", fRVmajor));
+ AliWarning("===============================================================================");
+ fRawVersion = fRVmajor;
}
-}
-
-
-//____________________________________________________________________________
-void AliTRDRawStream::DecodeHCheaderV2V3(Int_t timeBins)
-{
//
- // Decode the HC header (fRawVersion == 2, 3, 4, ???)
- //
-
+ // check for zero suppression
+ if ( fRawVersion >= 3 || fRawVersion <= 4 ) fZeroSuppressed = kTRUE;
+ else fZeroSuppressed = kFALSE;
+
// 1st word (h[0])
- if ( (fDataWord & 0x3) == 1 ) {
+ if ( (*fDataWord & 0x3) == 1 ) {
- fHCHWords = (fDataWord >> 14) & 0x7;
- fSM = (fDataWord >> 9) & 0x1f;
- fLAYER = (fDataWord >> 6) & 0x7;
- fSTACK = (fDataWord >> 3) & 0x7;
- fSIDE = (fDataWord >> 2) & 0x1;
+ fHCHWords = (*fDataWord >> 14) & 0x7;
+ fSM = (*fDataWord >> 9) & 0x1f;
+ fLAYER = (*fDataWord >> 6) & 0x7;
+ fSTACK = (*fDataWord >> 3) & 0x7;
+ fSIDE = (*fDataWord >> 2) & 0x1;
fROC = fGeo->GetDetectorSec(fLAYER, fSTACK);
- AliDebug(3, Form("0x%08x: HC header: sm=%d; roc=%d; side=%x", fDataWord, fSM, fROC, fSIDE+10));
+ AliDebug(3, Form("0x%08x: HC header: sm=%d; roc=%d; side=%x", *fDataWord, fSM, fROC, fSIDE+10));
if ((fSM < 0) ||
(fSM > 17) ||
(fSTACK > 4) ||
(fSIDE < 0) ||
(fSIDE > 1)) {
- AliError(Form("0x%08x: Strange HC header: dcs=%d; sm=%d; layer=%d; stack=%d.",
- fDataWord, fDCS, fSM, fLAYER, fSTACK));
+ AliWarning(Form("0x%08x: Strange HC header: dcs=%d; sm=%d; layer=%d; stack=%d.",
+ *fDataWord, fDCS, fSM, fLAYER, fSTACK));
+ fRawReader->AddMajorErrorLog(kHCHeaderCorrupt,Form("0x%08x:dcs=%d; sm=%d; layer=%d; stack=%d.",
+ *fDataWord, fDCS, fSM, fLAYER, fSTACK));
}
else {
- fStatus = 1;
fHCHctr1++;
fHCHctr2++;
}
}
else {
- AliError(Form("0x%08x: No HC header when it was expected.", fDataWord));
+ AliWarning(Form("0x%08x: No HC header when it was expected.", *fDataWord));
+ fRawReader->AddMajorErrorLog(kHCHeaderMissing,Form("0x%08x", *fDataWord));
}
// 2nd word (h[1])
if ( fHCHWords >= 1 ) {
// read one more word
- if ( !fRawReader->ReadNextInt( fDataWord ) ) {
- AliError("Could not read data");
- return;
- }
- fWordCtr++;
- if ( (fDataWord & 0x3) == 1 ) {
+ if (NextData() != kWordOK)
+ {
+ AliWarning("Next HC word missing");
+ fRawReader->AddMajorErrorLog(kHCWordMissing,"Next HC word missing");
+ fNextStatus = kNextHC;
+ return;
+ }
+ if ( (*fDataWord & 0x3) == 1 ) {
- fBCctr = (fDataWord >> 16);
- fPTctr = (fDataWord >> 12) & 0xf;
- fPTphase = (fDataWord >> 8) & 0xf;
- fTBins = ((fDataWord >> 2) & 0x3f) + 1;
+ fBCctr = (*fDataWord >> 16);
+ fPTctr = (*fDataWord >> 12) & 0xf;
+ fPTphase = (*fDataWord >> 8) & 0xf;
+ fTBins = ((*fDataWord >> 2) & 0x3f) + 1;
AliDebug(3, Form("0x%08x: HC header 2: BCctr=%d PTctr=%d PTph=%d TB=%d"
- , fDataWord, fBCctr, fPTctr, fPTphase, fTBins));
+ , *fDataWord, fBCctr, fPTctr, fPTphase, fTBins));
if( fTBins != timeBins ) {
AliWarning(Form("We will use the value from the raw data (HC header): %d", fTBins));
AliWarning("===============================================================================");
+ fTimeWords = (fTBins - 1)/3 + 1;
}
}
// 3nd word (h[2])
if ( fHCHWords >= 2 ) {
// read one more word
- if ( !fRawReader->ReadNextInt( fDataWord ) ) {
- AliError("Could not read data");
- return;
- }
- fWordCtr++;
- if ( (fDataWord & 0x3) == 1 ) {
+ if (NextData() != kWordOK)
+ {
+ AliWarning("Next HC word missing");
+ fRawReader->AddMajorErrorLog(kHCWordMissing,"Next HC word missing");
+ fNextStatus = kNextHC;
+ return;
+ }
+ if ( (*fDataWord & 0x3) == 1 ) {
- fTCon = (fDataWord >> 29) & 0x1;
- fPEDon = (fDataWord >> 31) & 0x1;
- fGAINon = (fDataWord >> 30) & 0x1;
- fXTon = (fDataWord >> 28) & 0x1;
- fNonLinOn = (fDataWord >> 27) & 0x1;
- fBypass = (fDataWord >> 26) & 0x1;
+ fTCon = (*fDataWord >> 29) & 0x1;
+ fPEDon = (*fDataWord >> 31) & 0x1;
+ fGAINon = (*fDataWord >> 30) & 0x1;
+ fXTon = (*fDataWord >> 28) & 0x1;
+ fNonLinOn = (*fDataWord >> 27) & 0x1;
+ fBypass = (*fDataWord >> 26) & 0x1;
- fCommonAdditive = (fDataWord >> 20) & 0x3f;
+ fCommonAdditive = (*fDataWord >> 20) & 0x3f;
AliDebug(3, Form("0x%08x: HC header 3: TC=%d, PED=%d, GAIN=%d, XT=%d, NonLin=%d, Bypass=%d, Add=%d"
, fTCon, fPEDon, fGAINon, fXTon, fNonLinOn, fBypass, fCommonAdditive));
-
- if( fTBins != timeBins ) {
- AliError(Form("Mismatch between Number of Time Bins from CDB (%d) and from HC header (%d)"
- , timeBins, fTBins));
- }
-
}
-
}
}
//____________________________________________________________________________
void AliTRDRawStream::DecodeMCMheader()
-{
- //
- //
- //
-
- if ( fRawVersion >= 1 && fRawVersion <= 3 ) {
- DecodeMCMheaderVx();
- return;
- }
-
- AliError(Form(" Unsupported raw version: %d", fRawVersion));
- return;
-
-}
-
-//____________________________________________________________________________
-void AliTRDRawStream::DecodeMCMheaderVx()
{
//
// Decode the MCM header
//
- fMCM = (fDataWord & 0xff000000) >> 24;
- fEv = (fDataWord & 0x00fffff0) >> 4;
+ if ( fRawVersion < 1 || fRawVersion > 3 )
+ {
+ AliError(Form(" Unsupported raw version: %d", fRawVersion));
+ }
+
+ fMCM = (*fDataWord & 0xff000000) >> 24;
+ fEv = (*fDataWord & 0x00fffff0) >> 4;
fROB = fMCM / 16;
fMCM = fMCM % 16;
- fROW = fGeo->GetPadRowFromMCM(fROB, fMCM);
+ fROW = AliTRDfeeParam::Instance()->GetPadRowFromMCM(fROB, fMCM);
AliDebug(4, Form("0x%08x: SM%d L%dS%d. MCM Header: fROB=%d fMCM=%02d fEv=%02d"
- , fDataWord, fSM, fLAYER, fSTACK, fROB, fMCM, fEv));
+ , *fDataWord, fSM, fLAYER, fSTACK, fROB, fMCM, fEv));
if ( fROB % 2 == 0 && fSIDE == 1 ) {
- AliError(Form("SM%d L%dS%d: Mismatch between fROB (%d) and fSIDE (%d): fMCM=%02d"
- , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
+ AliWarning(Form("SM%d L%dS%d: Mismatch between fROB (%d) and fSIDE (%d): fMCM=%02d"
+ , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
+ fRawReader->AddMajorErrorLog(kROBSideMismatch,Form("SM%d L%dS%d: fROB (%d) fSIDE (%d): fMCM=%02d"
+ , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
}
if ( fROB % 2 != 0 && fSIDE == 0 ) {
- AliError(Form("SM%d L%dS%d: Mismatch between fROB (%d) and fSIDE (%d): fMCM=%02d"
- , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
+ AliWarning(Form("SM%d L%dS%d: Mismatch between fROB (%d) and fSIDE (%d): fMCM=%02d"
+ , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
+ fRawReader->AddMajorErrorLog(kROBSideMismatch,Form("SM%d L%dS%d: fROB (%d) fSIDE (%d): fMCM=%02d"
+ , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
}
if ( (fSTACK == 2 && fROW >= fGeo->RowmaxC0()) ||
(fSTACK != 2 && fROW >= fGeo->RowmaxC1()) || fROW < 0 ) {
- AliError(Form("SM%d L%dS%d: Wrong Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"
- , fSM, fLAYER, fSTACK, fROW, fROB, fSIDE, fMCM ));
+ AliWarning(Form("SM%d L%dS%d: Wrong Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"
+ , fSM, fLAYER, fSTACK, fROW, fROB, fSIDE, fMCM ));
+ fRawReader->AddMajorErrorLog(kWrongPadrow,Form("SM%d L%dS%d: Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"
+ , fSM, fLAYER, fSTACK, fROW, fROB, fSIDE, fMCM ));
}
fMCMHctr1++;
// AdcMask for Zero supressed data
if ( fRawVersion == 3 ) {
// read one more word
- if ( !fRawReader->ReadNextInt( fDataWord ) ) {
- AliError("Could not read data");
- return;
- }
- fWordCtr++;
- if ( (fDataWord & 0x000007ff) == 0xC ) { // at the moment bits 4-10 are empty
- //if ( (fDataWord & 0x0000000f) == 0xC ) {
+ if (NextData() != kWordOK)
+ {
+ AliWarning("MCM ADC mask missing");
+ fRawReader->AddMajorErrorLog(kMCMADCMaskMissing,"Missing");
+ fNextStatus = kNextHC;
+ return;
+ }
+ if ( (*fDataWord & 0x000007ff) == 0xC ) { // at the moment bits 4-10 are empty
for ( Int_t ctr = 0; ctr < fGeo->ADCmax(); ctr++ ) {
- if ( (fDataWord >> (11+ctr)) == 0x1 ) fADCmask[ctr] = kTRUE;
+ if ( (*fDataWord >> (11+ctr)) == 0x1 ) fADCmask[ctr] = kTRUE;
else fADCmask[ctr] = kFALSE;
}
- AliDebug(4, Form("0x%08x: ADC mask", fDataWord));
+ AliDebug(4, Form("0x%08x: ADC mask", *fDataWord));
}
else {
- AliError("Expected ADC mask but did not find one!");
+ AliWarning("Expected ADC mask but did not find one!");
+ fRawReader->AddMajorErrorLog(kMCMADCMaskMissing,"Decode error");
}
}
//____________________________________________________________________________
void AliTRDRawStream::DecodeTracklet()
-{
- //
- //
- //
-
- if ( fRawVersion >= 1 && fRawVersion <= 3 ) {
- DecodeTrackletVx();
- return;
- }
-
- AliError(Form(" Unsupported raw version: %d", fRawVersion));
- return;
-
-}
-
-//____________________________________________________________________________
-void AliTRDRawStream::DecodeTrackletVx()
{
//
// this function is not tested yet on real tracklets
//
- fTracklPID = (fDataWord >> 24) & 0xff;
- fTracklPadRow = (fDataWord >> 20) & 0xf; // 0:15
- fTracklDefL = (fDataWord >> 13) & 0x7f;
- fTracklPadPos = (fDataWord) & 0x1fff;
+ if ( fRawVersion < 1 || fRawVersion > 3 )
+ {
+ AliError(Form(" Unsupported raw version: %d", fRawVersion));
+ }
+
+ fTracklPID = (*fDataWord >> 24) & 0xff;
+ fTracklPadRow = (*fDataWord >> 20) & 0xf; // 0:15
+ fTracklDefL = (*fDataWord >> 13) & 0x7f;
+ fTracklPadPos = (*fDataWord) & 0x1fff;
fTracklPID /= (Float_t)((1<<8) - 1); // 0:1 (steps of 0.39%)
fTracklDefL = (fTracklDefL - ((1<< 7)-1)/2.) * 140.e-4; // -0.889:0.889cm
fTracklPadPos = (fTracklPadPos - ((1<<13)-1)/2.) * 160.e-4; // -65.528:65.528 cm
- AliDebug(4, Form("0x%08x: Tracklet found: SM%d L%dS%d side %x: PadRow=%d PadPos=%f DefL=%f PID=%f"
- , fDataWord, fSM, fLAYER, fSTACK, fSIDE+10
- , fTracklPadRow, fTracklPadPos, fTracklDefL, fTracklPID));
+ //AliDebug(4, Form("0x%08x: Tracklet found: SM%d L%dS%d side %x: PadRow=%d PadPos=%f DefL=%f PID=%f"
+ // , *fDataWord, fSM, fLAYER, fSTACK, fSIDE+10
+ // , fTracklPadRow, fTracklPadPos, fTracklDefL, fTracklPID));
if( (fSTACK == 2) && (fTracklPadRow >= (Int_t) fGeo->RowmaxC0()) ||
(fSTACK != 2) && (fTracklPadRow >= (Int_t) fGeo->RowmaxC1()) ) {
- AliError(Form("Strange Row read from Tracklet Word: %d", fTracklPadRow));
+ AliWarning(Form("Strange Row read from Tracklet Word: %d", fTracklPadRow));
+ fRawReader->AddMajorErrorLog(kTrackletRowMismatch,Form("Word: %d", fTracklPadRow));
}
}
//____________________________________________________________________________
void AliTRDRawStream::DecodeGTUlinkMask()
-{
- //
- //
- //
-
- if ( fRawVersion >= 1 && fRawVersion <= 3 ) {
- DecodeGTUlinkMaskVx();
- return;
- }
-
- AliError(Form(" Unsupported raw version: %d", fRawVersion));
- return;
-
-}
-
-//____________________________________________________________________________
-void AliTRDRawStream::DecodeGTUlinkMaskVx()
{
//
// (0xfff = 12 active links).
//
+ if ( fRawVersion < 1 || fRawVersion > 3 )
+ {
+ AliError(Form(" Unsupported raw version: %d", fRawVersion));
+ }
+
if ( fGTUctr1 == -1 ) fGTUctr2++;
fGTUctr1++;
- //printf("fGTUctr=%d",fGTUctr);
- //printf("fGTUctr1=%d, fGTUctr2=%d",fGTUctr1, fGTUctr2);
-
if ( (fGTUctr1 >= 0) && (fGTUctr1 < 5) && (fGTUctr2 >= 0) && (fGTUctr2 < 18) ) {
- fGTUlinkMask[fGTUctr2][fGTUctr1] = (fDataWord & 0xfff);
- }
-
- for ( Int_t ctr = 0; ctr < 12; ctr++ ) {
- if ( IsGTULinkActive(fGTUctr2, ctr/2, fGTUctr1, ctr%2) ) {
- AliDebug(3, Form("SM %2d Stack %d: GTU Link %2d is active!", fGTUctr2, fGTUctr1, ctr));
- }
+ fGTUlinkMask[fGTUctr2][fGTUctr1] = (*fDataWord & 0xfff);
}
}
// return -1 means break data loop
//
- if ( (fDataWord & 0x00000003) != 0x2 && (fDataWord & 0x00000003) != 0x3) {
- AliError(Form("Data %08x : Data Word ends neither with b11 nor b10", (Int_t)fDataWord));
+// // check the content first! - something wrong with that...
+// // Decode 32 bit data words with information from 3 time bins and copy the data
+// fSig[0] = (*fDataWord & 0x00000ffc) >> 2;
+// fSig[1] = (*fDataWord & 0x003ff000) >> 12;
+// fSig[2] = (*fDataWord & 0xffc00000) >> 22;
+// if (fSig[0] <= 0 && fSig[1] <= 0 && fSig[2] <= 0)
+// return 0;
+
+ if ( (*fDataWord & 0x00000003) != 0x2 && (*fDataWord & 0x00000003) != 0x3) {
+ //AliWarning(Form("Data %08x : Data Word ends neither with b11 nor b10", (Int_t)*fDataWord));
+ fRawReader->AddMinorErrorLog(kDataMaskError,Form("Data %08x", (Int_t)*fDataWord));
return -1;
}
- if ( (fDataWord & 0x00000003) != fTbSwitch ) { // Next ADC channel found
- //if ( fTB+1 != timeBins ) AliError(Form("Time bins in data (%d) != DB (%d)", fTB+1, timeBins));
+ if ( (*fDataWord & 0x00000003) != fTbSwitch ) { // Next ADC channel found
fTbSwitch = (fTbSwitch & 2) | !(fTbSwitch & 1); // 0x3 <--> 0x2
fTbSwitchCtr = 0;
fADC++;
// We have only timeTotal time bins
if ( fTbSwitchCtr > fTimeWords ) {
- AliError(Form("Data is strange. Already found %d words for this ADC channel", (Int_t)fTbSwitchCtr));
+ //AliWarning(Form("Data is strange. Already found %d words for this ADC channel", (Int_t)fTbSwitchCtr));
+ fRawReader->AddMinorErrorLog(kADCNumberOverflow,Form("%d words", (Int_t)fTbSwitchCtr));
return 0;
}
// We have only 21 ADC channels.
if ( fADC > (Int_t)fGeo->ADCmax()-1 ) {
- AliError(Form("Data %08x : Data is strange. fADC is already %d", (Int_t)fDataWord, (Int_t)fADC));
+ //AliWarning(Form("Data %08x : Data is strange. fADC is already %d", (Int_t)*fDataWord, (Int_t)fADC));
+ fRawReader->AddMinorErrorLog(kADCChannelOverflow,Form("Data %08x : fADC=%d", (Int_t)*fDataWord, (Int_t)fADC));
return 0;
}
if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 ) {
// Get Pad column
- fCOL = fGeo->GetPadColFromADC(fROB, fMCM, fADC);
+ fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fROB, fMCM, fADC);
// We have only 144 Pad Columns
- if ( fCOL > fColMax-1 || fCOL < 0 ) {
- AliError(Form("SM%d L%dS%d: Wrong Pad column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
- fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
- }
-
- // Decode 32 bit data words with information from 3 time bins and copy the data
- fSig[0] = (fDataWord & 0x00000ffc) >> 2;
- fSig[1] = (fDataWord & 0x003ff000) >> 12;
- fSig[2] = (fDataWord & 0xffc00000) >> 22;
-
+ //if ( fCOL > fColMax-1 || fCOL < 0 ) {
+ if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax )
+ {
+ // Decode 32 bit data words with information from 3 time bins and copy the data
+ fSig[0] = (*fDataWord & 0x00000ffc) >> 2;
+ fSig[1] = (*fDataWord & 0x003ff000) >> 12;
+ fSig[2] = (*fDataWord & 0xffc00000) >> 22;
+
+ if (fSig[0] > 0 || fSig[1] > 0 || fSig[2] > 0)
+ return 1;
+ else
+ return 0;
+ }
+ else
+ {
+// AliWarning(Form("SM%d L%dS%d: Wrong Pad column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
+// fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
+ fRawReader->AddMajorErrorLog(kWrongPadcolumn,Form("SM%d L%dS%d: column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
+ fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
+ return 0;
+ }
// Print data to screen:
- AliDebug(5, Form("SM%d L%dS%d: ROB%d MCM=%d ADC=%d (ROW=%d COL=%d): Data %04d %04d %04d\n",
- fSM, fLAYER, fSTACK, fROB, fMCM, fADC, fROW, fCOL, fSig[0], fSig[1], fSig[2]));
+ // Do NOT switch on for default production, it is VERY slow
+ // AliDebug(5, Form("SM%d L%dS%d: ROB%d MCM=%d ADC=%d (ROW=%d COL=%d): Data %04d %04d %04d\n",
+ // fSM, fLAYER, fSTACK, fROB, fMCM, fADC, fROW, fCOL, fSig[0], fSig[1], fSig[2]));
}
else {
fCOL = -1;
-
+ return 0;
}
return 1;
// NOT TESTED YET!!!!!!!!
//
- if ( (fDataWord & 0x00000003) != 0x2 && (fDataWord & 0x00000003) != 0x3) {
- AliError(Form("Data %08x : Data Word ends neither with b11 nor b10", (Int_t)fDataWord));
+ if ( (*fDataWord & 0x00000003) != 0x2 && (*fDataWord & 0x00000003) != 0x3) {
+ AliWarning(Form("Data %08x : Data Word ends neither with b11 nor b10", (Int_t)*fDataWord));
+ fRawReader->AddMinorErrorLog(kDataMaskError,Form("Data %08x", (Int_t)*fDataWord));
return -1;
}
- if ( (fDataWord & 0x00000003) != fTbSwitch ) { // Next ADC channel found
- //if ( fTB+1 != timeBins ) AliError(Form("Time bins in data (%d) != DB (%d)", fTB+1, timeBins));
+ if ( (*fDataWord & 0x00000003) != fTbSwitch ) { // Next ADC channel found
fTbSwitch = (fTbSwitch & 2) | !(fTbSwitch & 1); // 0x3 <--> 0x2
fTbSwitchCtr = 0;
//
// We have only timeTotal time bins
if ( fTbSwitchCtr > fTimeWords ) {
- AliError(Form("Data is strange. Already found %d words for this ADC channel", (Int_t)fTbSwitchCtr));
+ AliWarning(Form("Data is strange. Already found %d words for this ADC channel", (Int_t)fTbSwitchCtr));
+ fRawReader->AddMinorErrorLog(kADCNumberOverflow,Form("%d words", (Int_t)fTbSwitchCtr));
return 0;
}
// We have only 21 ADC channels.
if ( fADC > (Int_t)fGeo->ADCmax()-1 ) {
- AliError(Form("Data %08x : Data is strange. fADC is already %d", (Int_t)fDataWord, (Int_t)fADC));
+ AliWarning(Form("Data %08x : Data is strange. fADC is already %d", (Int_t)*fDataWord, (Int_t)fADC));
+ fRawReader->AddMinorErrorLog(kADCChannelOverflow,Form("Data %08x : fADC=%d", (Int_t)*fDataWord, (Int_t)fADC));
return 0;
}
if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 ) {
// Get Pad column
- fCOL = fGeo->GetPadColFromADC(fROB, fMCM, fADC);
+ //fCOL = fGeo->GetPadColFromADC(fROB, fMCM, fADC);
+ fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fROB, fMCM, fADC);
// We have only 144 Pad Columns
if ( fCOL > fColMax-1 || fCOL < 0 ) {
- AliError(Form("SM%d L%dS%d: Wrong Pad column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
+ AliWarning(Form("SM%d L%dS%d: Wrong Pad column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
+ fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
+ fRawReader->AddMajorErrorLog(kWrongPadcolumn,Form("SM%d L%dS%d: column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
}
// Decode 32 bit data words with information from 3 time bins and copy the data
- fSig[0] = (fDataWord & 0x00000ffc) >> 2;
- fSig[1] = (fDataWord & 0x003ff000) >> 12;
- fSig[2] = (fDataWord & 0xffc00000) >> 22;
+ fSig[0] = (*fDataWord & 0x00000ffc) >> 2;
+ fSig[1] = (*fDataWord & 0x003ff000) >> 12;
+ fSig[2] = (*fDataWord & 0xffc00000) >> 22;
// Print data to screen:
AliDebug(5, Form("SM%d L%dS%d: ROB%d MCM=%d ADC=%d (ROW=%d COL=%d): Data %04d %04d %04d\n",