///////////////////////////////////////////////////////////////////////////////
#include "AliITSRawStreamSDD.h"
+#include "AliITSRawStreamSDDCompressed.h"
#include "AliRawReader.h"
#include "AliLog.h"
fLowThresholdArray[im][1]=0;
}
for(Int_t i=0;i<kFifoWords;i++) fNfifo[i]=0;
- for(Int_t i=0;i<kDDLsNumber;i++) fSkip[i]=0;
fRawReader->Reset();
fRawReader->Select("ITSSDD");
if(fDDLModuleMap) delete fDDLModuleMap;
}
//______________________________________________________________________
+UChar_t AliITSRawStreamSDD::ReadBlockAttributes(AliRawReader* rawReader){
+ // reads block attribuited from CDH
+ UChar_t *data;
+ rawReader->Reset();
+ rawReader->Select("ITSSDD");
+ do{
+ if(!rawReader->ReadNextData(data)) return 0x0;
+ }while(rawReader->GetDataSize()==0);
+ UChar_t attr=rawReader->GetBlockAttributes();
+ return attr;
+}
+//______________________________________________________________________
+AliITSRawStream* AliITSRawStreamSDD::CreateRawStreamSDD(AliRawReader* rawReader, UChar_t attributes){
+ // instantiates the proper raw stream from block attributes value
+
+ Int_t rawFormat=(attributes&0xE0)>>5;
+ rawReader->Reset();
+ AliITSRawStream* inputSDD;
+ if(rawFormat==0){
+ inputSDD=new AliITSRawStreamSDDCompressed(rawReader);
+ inputSDD->SetADCEncoded(kTRUE);
+ }else{
+ inputSDD=new AliITSRawStreamSDD(rawReader);
+ }
+ return inputSDD;
+}
+//______________________________________________________________________
+AliITSRawStream* AliITSRawStreamSDD::CreateRawStreamSDD(AliRawReader* rawReader){
+ // reads the data format from CDH and instantiates the proper raw stream
+ UChar_t attr=ReadBlockAttributes(rawReader);
+ return CreateRawStreamSDD(rawReader,attr);
+}
+//______________________________________________________________________
UInt_t AliITSRawStreamSDD::ReadBits()
{
// read bits from the given channel
if ((value & 0x80) == 0) {
return value & 0x7f;
} else if ((value & 0x40) == 0) {
+ if(value&1) return 0x080 + ((value & 0x3f) << 1);
return 0x081 + ((value & 0x3f) << 1);
} else if ((value & 0x20) == 0) {
+ if(value&1) return 0x103 + ((value & 0x1f) << 3);
return 0x104 + ((value & 0x1f) << 3);
} else {
+ if(value&1) return 0x207 + ((value & 0x1f) << 4);
return 0x208 + ((value & 0x1f) << 4);
}
fNfifo[iFifoIdx] = fCarlosId;
} else if (fData>=fIFifoWord[0]&&fData<=fIFifoWord[3]){ // FIFO word
fCarlosId = fNfifo[fData-fIFifoWord[0]];
- } else if(fData==0x3FFFFFFF){ // Carlos footer
+ } else if(fData==0x3FFFFFFF && fCarlosId>=0 && fCarlosId<kModulesPerDDL){ // Carlos footer
fICountFoot[fCarlosId]++; // stop before the last word (last word=jitter)
if(fICountFoot[fCarlosId]==3){
fCompletedModule=kTRUE;
if(fCarlosId>=0 && fCarlosId <kModulesPerDDL){
Int_t nDDL=fRawReader->GetDDLID();
- fModuleID = GetModuleNumber(nDDL,fCarlosId);
+ if(nDDL>=0){
+ fModuleID = GetModuleNumber(nDDL,fCarlosId);
+ }
}
} else { // decode data
if (fReadCode[fCarlosId][fChannel]) {// read the next code word