+ }//ADC module
+ // ********************************* ADD ADC *********************************
+ else if(fADCModule == kADDADCGeo){
+ // *** ADC header
+ if((fBuffer & 0x07000000) == 0x02000000){
+ fIsADCHeader = kTRUE;
+ fADCNChannels = ((fBuffer & 0x00003f00)>>8);
+ //printf(" AliZDCRawStream -> ADD ADC HEADER: mod.%d has %d ch. \n",fADCModule,fADCNChannels);
+ }
+ // *** ADC data word
+ else if((fBuffer & 0x07000000) == 0x00000000){
+ fIsADDChannel = kTRUE;
+ fADCChannel = ((fBuffer & 0x1e0000) >> 17);
+ fADCGain = ((fBuffer & 0x10000) >> 16);
+ fADCValue = (fBuffer & 0xfff);
+ //
+ //printf(" ADD ADC DATUM -> mod. %d ch. %d gain %d value %d\n",
+ // fADCModule,fADCChannel,fADCGain,fADCValue);
+ }
+ // *** ADC EOB
+ else if((fBuffer & 0x07000000) == 0x04000000){
+ fIsADCEOB = kTRUE;
+ //printf(" AliZDCRawStream -> EOB --------------------------\n");
+ }
+ }
+ // ********************************* TDC *********************************
+ else if(fADCModule==kTDCFakeGeo && fIsTDCHeaderRead==kFALSE){
+ // *** TDC header
+ fIsTDCHeaderRead = kTRUE;
+ fTDCStartCounter = fPosition;
+ // GEO address from TDC header
+ fADCModule = (Int_t) (fBuffer & 0x1f);
+ if(fADCModule==kZDCTDCGeo){ // *** ZDC TDC
+ fIsZDCTDCHeader = kTRUE;
+ //Ch. debug
+ //printf(" AliZDCRawStream -> ZDC TDC: mod.%d\n",fADCModule);
+ }
+ else if(fADCModule==kADDTDCGeo){ // *** ADD TDC
+ fIsADDTDCHeader = kTRUE;
+ //Ch. debug
+ //printf(" AliZDCRawStream -> ADD TDC: mod.%d\n",fADCModule);
+ }
+ }
+ // ********************************* VME SCALER HEADER *********************************
+ else if(fADCModule == kScalerGeo){
+ if(fBuffer & 0x04000000 && fIsScHeaderRead==kFALSE){ // *** Scaler header
+ fScGeo = (fBuffer & 0xf8000000)>>27;
+ fScNWords = (fBuffer & 0x00fc0000)>>18;
+ fScTriggerSource = (fBuffer & 0x00030000)>>16;
+ fScTriggerNumber = (fBuffer & 0x0000ffff);
+ fIsScHeaderRead = kTRUE;
+ fScStartCounter = fPosition;
+ //Ch. debug
+ //printf(" AliZDCRawStream -> VME SCALER HEADER: geo %d Nwords %d TrigSource %d TrigNo. %d\n",
+ // fScGeo,fScNWords,fScTriggerSource,fScTriggerNumber);
+ }
+ else if(!(fBuffer & 0x04000000)){
+ fIsScEventGood = kFALSE;
+ }
+ }
+ // *********************************** PATTERN UNIT ***********************************
+ else if(fADCModule == kPUGeo){
+ // still to be implemented!!! Not yet in data!!!
+ fDetPattern = (fBuffer & 0x0000003f);
+ // Ch. debug
+ //printf(" AliZDCRawStream -> Pattern Unit\n");
+
+ }
+ // ******************************** TRIGGER CARD COUNTS ********************************
+ else if(fADCModule == kTrigScales){
+ if(fIsTriggerScaler == kFALSE){
+ fTrigCountNWords = (Int_t) ((fBuffer & 0xfc0000)>>17);
+ fTrigCountStart = fPosition;
+ fIsTriggerScaler = kTRUE;
+ }
+ // Ch. debug
+ //printf(" AliZDCRawStream -> Trigger Scaler header\n");
+ }
+ // ********************************** TRIGGER HISTORY **********************************
+ else if(fADCModule == kTrigHistory){
+ if(fIsTriggerHistory == kFALSE){
+ fTrigHistNWords = (Int_t) ((fBuffer & 0xfc0000)>>17);
+ fTrigHistStart = fPosition;
+ fIsTriggerHistory = kTRUE;
+ }
+ // Ch. debug
+ //printf(" AliZDCRawStream -> Trigger History header\n");
+
+ }
+ // ********************************** VME SCALER DATA **********************************
+ // Reading VME scaler data
+ if(fIsScHeaderRead && fPosition>=fScStartCounter+1){ // *** Scaler word
+ fADCModule=kScalerGeo; fIsADCDataWord=kFALSE; fIsScalerWord=kTRUE;
+ fScEvCounter = fBuffer;
+ Int_t nWords = (Int_t) (fScNWords);
+ if(fPosition == fScStartCounter+nWords) fIsScHeaderRead = kFALSE;
+ //Ch. debug
+ //printf(" AliZDCRawStream -> scaler datum %d", fScEvCounter);
+ }
+ // ********************************** ZDC TDC DATA **********************************
+ // ZDC TDC data
+ if(fIsTDCHeaderRead && fIsZDCTDCHeader && fPosition>=fTDCStartCounter+1){
+ fIsADCDataWord=kFALSE; fIsScalerWord=kFALSE;
+ if(((fBuffer & 0xf0000000)==0x00000000) && (((fBuffer & 0x08000000) >> 27) == 0)){ // TDC datum
+ fADCChannel = (Int_t) ((fBuffer & 0x3e00000) >> 21);
+ fIsZDCTDCdatum = kTRUE;
+ fZDCTDCdatum = (Int_t) (fBuffer & 0x1fffff);
+ // Ch. debug
+ //printf(" AliZDCRawStream -> ZDC TDC mod. %d ch. %d datum %d\n",fADCModule,fADCChannel,fZDCTDCdatum);
+ }
+ if(((fBuffer & 0xf0000000) == 0x80000000) && ((fBuffer & 0x08000000) >> 27) == 0){
+ // Trailer
+ fIsTDCHeaderRead = kFALSE;
+ // Ch. debug
+ //printf(" AliZDCRawStream -> ZDC TDC global trailer\n");
+ }
+ }
+ // ********************************** ADD TDC DATA **********************************
+ // ADD TDC data
+ if(fIsTDCHeaderRead && fIsADDTDCHeader && fPosition>=fTDCStartCounter+1){
+ fIsADCDataWord=kFALSE; fIsScalerWord=kFALSE;
+ if(((fBuffer & 0xf0000000)==0x00000000) && (((fBuffer & 0x08000000) >> 27) == 0)){ // TDC datum
+ fADCChannel = (Int_t) ((fBuffer & 0x3e00000) >> 21);
+ fIsADDTDCdatum = kTRUE;
+ fADDTDCdatum = (Int_t) (fBuffer & 0x1fffff);
+ // Ch. debug
+ //printf(" AliZDCRawStream -> ADD TDC mod. %d ch. %d datum %d\n",fADCModule,fADCChannel,fADDTDCdatum);
+ }
+ if(((fBuffer & 0xf0000000) == 0x80000000) && ((fBuffer & 0x08000000) >> 27) == 0){
+ // Trailer
+ fIsTDCHeaderRead = kFALSE;
+ // Ch. debug
+ //printf(" AliZDCRawStream -> ADD TDC global trailer\n");
+ }
+ }
+ // ******************************** TRIGGER SCALER DATA ********************************
+ // Reading trigger scaler data
+ if(fIsTriggerScaler && fPosition>=fTrigCountStart+1){
+ fADCModule = kTrigScales; fIsADCDataWord = kFALSE;
+ if(fPosition == fTrigCountStart+1) fMBTrigInput = fBuffer;
+ else if(fPosition == fTrigCountStart+2) fCentralTrigInput = fBuffer;
+ else if(fPosition == fTrigCountStart+3) fSCentralTrigInput = fBuffer;
+ else if(fPosition == fTrigCountStart+4) fEMDTrigInput = fBuffer;
+ else if(fPosition == fTrigCountStart+5) fL0Received = fBuffer;
+ else if(fPosition == fTrigCountStart+6) fMBtrig2CTP = fBuffer;
+ else if(fPosition == fTrigCountStart+7) fCentralTrig2CTP = fBuffer;
+ else if(fPosition == fTrigCountStart+8) fSCentralTrig2CTP = fBuffer;
+ else if(fPosition == fTrigCountStart+9){
+ fEMDTrig2CTP = fBuffer;
+ fIsTriggerScaler = kFALSE;
+ }
+ // Ch. debug
+ //printf(" AliZDCRawStream -> Trigger Scaler datum %d\n", fPosition-fTrigCountStart);
+ }
+ // ******************************* TRIGGER HISTORY WORDS ******************************
+ // Reading trigger history
+ if(fIsTriggerHistory && fPosition>=fTrigHistStart+1){
+ fADCModule = kTrigHistory; fIsADCDataWord = kFALSE;
+ if(fPosition == fTrigHistStart+1){
+ fPileUpBit1stWord = (fBuffer & 0x80000000) >> 31;
+ fL0Bit1stWord = (fBuffer & 0x40000000) >> 30;
+ fCentralTrigHist = (fBuffer & 0x3fff8000) >> 14;
+ fMBTrigHist = (fBuffer & 0x00007fff);
+ //
+ fCPTInput[0] = (fBuffer & 0x00000080) >> 6; // MB bit
+ fCPTInput[1] = (fBuffer & 0x00400000) >> 21; // CENTRAL bit
+ }
+
+ else if(fPosition == fTrigHistStart+fTrigHistNWords){
+ fPileUpBit2ndWord = (fBuffer & 0x80000000) >> 31;
+ fL0Bit2ndWord = (fBuffer & 0x40000000) >> 30;
+ fSCentralTrigHist = (fBuffer & 0x3fff8000) >> 14;
+ fEMDTrigHist = (fBuffer & 0x00007fff);
+ //
+ fCPTInput[2] = (fBuffer & 0x00000080) >> 6; // SEMICENTRAL bit
+ fCPTInput[3] = (fBuffer & 0x00400000) >> 21; // EMD bit
+ //
+ fIsTriggerHistory = kFALSE;
+
+ // Checking if the event is good
+ // (1) both history word pile up bits must be = 0
+ if(fPileUpBit1stWord==0 && fPileUpBit2ndWord==0) fIsPileUpEvent = kFALSE;
+ else{
+ fIsPileUpEvent = kTRUE;
+ printf(" AliZDCRawStream -> PILE UP EVENT: bitPileUp0 %d bitPileUp1 %d\n",
+ fPileUpBit1stWord, fPileUpBit2ndWord);
+ }
+ // (2) both history word L0 bits must be = 1
+ if(fL0Bit1stWord==1 && fL0Bit2ndWord==1) fIsL0BitSet = kTRUE;
+ else{
+ fIsL0BitSet = kFALSE;
+ printf(" AliZDCRawStream -> L0 wrongly set: bitL0word0 %d bitL0word1 %d\n",
+ fL0Bit1stWord, fL0Bit2ndWord);
+ }
+ }
+ // Ch. debug
+ //printf(" AliZDCRawStream -> Trigger history word %d\n", fPosition-fTrigHistStart);
+ }