+ else if(fModType == kPU){ // **** pattern unit
+ //printf("\t P.U. mod. %d ch. %d, signal %d\n",fADCModule,fADCChannel,fCabledSignal);
+ }*/
+ }//reading channel mapping
+ }
+ } // if fSODREading
+ fPosition++;
+ return kTRUE;
+ } // ------------------------------- SOD event
+
+ // -------------------------------------------
+ // --- DARC data
+ // -------------------------------------------
+ if(fPosition<fDeadfaceOffset && fReadOutCard==0){
+ fPosition++;
+ return kTRUE;
+ }
+ else if(fPosition==fDeadfaceOffset && fReadOutCard==0){
+ if(fBuffer != 0xdeadface){
+ //AliWarning(" NO deadface after DARC data");
+ fRawReader->AddMajorErrorLog(kDARCError);
+ }
+ else{
+ fPosition++;
+ return kTRUE;
+ }
+ }
+ else if(fPosition>fDeadfaceOffset && fPosition<fDeadbeefOffset && fReadOutCard==0){
+ fPosition++;
+ return kTRUE;
+ }
+ else if(fPosition==fDeadbeefOffset && fReadOutCard==0){
+ if(fBuffer != 0xdeadbeef){
+ //AliWarning(" NO deadbeef after DARC global data");
+ fRawReader->AddMajorErrorLog(kDARCError);
+ fPosition++;
+ return kFALSE;
+ }
+ else{
+ fPosition++;
+ return kTRUE;
+ }
+ } // ------------------------------- End of DARC data
+
+ // ---------------------------------------------
+ // --- ZDC data
+ // --- ADCs + VME scaler + trigger card + P.U.
+ // ---------------------------------------------
+ else if(fPosition>=fDataOffset){
+
+ if(!fSODReading && !fIsMapRead) ReadChMap();
+
+ // !!!!!!!!!!!!!!! DARC readout card only !!!!!!!!!!!
+ // Not valid datum before the event
+ // there MUST be a NOT valid datum before the event!!!
+ if(fReadOutCard==0){
+ if(fPosition==fDataOffset){
+ //printf("\t **** ZDC data begin ****\n");
+ if((fBuffer & 0x07000000) != 0x06000000){
+ fRawReader->AddMajorErrorLog(kZDCDataError);
+ }
+ //else if((fBuffer & 0x07000000) == 0x06000001){ // Corrupted event!!!
+ // fIsADCEventGood = kFALSE;
+ //}
+ }
+
+ // If the not valid datum isn't followed by the 1st ADC header
+ // the event is corrupted (i.e., 2 gates arrived before trigger)
+ else if(fPosition==fDataOffset+1){
+ if((fBuffer & 0x07000000) != 0x02000000){
+ AliWarning("ZDC ADC -> The not valid datum is NOT followed by an ADC header!");
+ fRawReader->AddMajorErrorLog(kZDCDataError);
+ fIsADCEventGood = kFALSE;
+ fPosition++;
+ return kFALSE;
+ }
+ }
+ }
+
+ // Get geo address of current word
+ if(fIsTDCHeaderRead && fIsZDCTDCHeader) fADCModule = kZDCTDCGeo;
+ else if(fIsTDCHeaderRead && fIsADDTDCHeader) fADCModule = kADDTDCGeo;
+ else fADCModule = (Int_t) ((fBuffer & 0xf8000000)>>27);
+
+ // ************************************ ADC MODULES ************************************
+ if(fADCModule>=kFirstADCGeo && fADCModule<=kLastADCGeo){
+ // *** ADC header
+ if((fBuffer & 0x07000000) == 0x02000000){
+ fIsADCHeader = kTRUE;
+ fADCNChannels = ((fBuffer & 0x00003f00)>>8);
+ //printf(" AliZDCRawStream -> ADC HEADER: mod.%d has %d ch. \n",fADCModule,fADCNChannels);
+ }
+ // *** ADC data word
+ else if((fBuffer & 0x07000000) == 0x00000000){
+ fIsADCDataWord = kTRUE;
+ fADCChannel = ((fBuffer & 0x1e0000) >> 17);
+ fADCGain = ((fBuffer & 0x10000) >> 16);
+ fADCValue = (fBuffer & 0xfff);
+ //
+ //printf(" AliZDCRawStream -> ADC DATUM: mod. %d ch. %d gain %d value %d\n",
+ // fADCModule,fADCChannel,fADCGain,fADCValue);
+
+ // Checking if the channel map for the ADCs has been provided/read
+ if(fMapADC[0][0]==-1){
+ printf("\t ATTENTION!!! No ADC mapping has been found/provided!!!\n");
+ return kFALSE;
+ }
+ //
+ /*for(Int_t ci=0; ci<kNch; ci++){
+ printf(" %d mod %d ch %d det %d sec %d\n",ci,fMapADC[ci][0],
+ fMapADC[ci][1], fMapADC[ci][3], fMapADC[ci][4]);
+ }*/
+
+ // Scan of the map to assign the correct volumes
+ Int_t foundMapEntry = kFALSE;
+ for(Int_t k=0; k<kNch; k++){
+ if(fADCModule==fMapADC[k][0] && fADCChannel==fMapADC[k][1]){
+ fSector[0] = fMapADC[k][3];
+ fSector[1] = fMapADC[k][4];
+ foundMapEntry = kTRUE;
+ break;
+ }
+ }
+ if(foundMapEntry==kFALSE && fEvType==7){
+ AliWarning(Form(" No valid entry in ADC mapping for raw data %d ADCmod. %d ch. %d\n",
+ fPosition,fADCModule,fADCChannel));
+ }
+
+ // Final checks
+ if(foundMapEntry==kTRUE && fEvType==7){
+ if(fSector[0]<1 || fSector[0]>5){
+ AliWarning(Form(" No valid detector assignment: %d",fSector[0]));
+ fRawReader->AddMajorErrorLog(kInvalidSector);
+ }
+ //
+ if(fSector[1]<0 || fSector[1]>5){
+ AliWarning(Form(" No valid sector assignment: %d",fSector[1]));
+ fRawReader->AddMajorErrorLog(kInvalidSector);
+ }
+ //
+ if(fADCModule<0 || fADCModule>3){
+ AliError(Form(" No valid ADC module: %d",fADCModule));
+ fRawReader->AddMajorErrorLog(kInvalidADCModule);
+ }
+ }
+
+ // Checking the underflow and overflow bits
+ if(fBuffer & 0x1000) fIsUnderflow = kTRUE;
+ else if (fBuffer & 0x2000) fIsOverflow = kTRUE;
+
+ }//ADC data word
+ // *** ADC EOB
+ else if((fBuffer & 0x07000000) == 0x04000000){
+ fIsADCEOB = kTRUE;
+ //printf(" AliZDCRawStream -> EOB --------------------------\n");
+ }
+ }//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");