X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ZDC%2FAliZDCRawStream.cxx;h=516bfa6e63f622cf492f29e96abf207c5f0ea916;hb=42742c3754f3e9e8f9df5b0d867ee61b50b95b23;hp=047bd6029a3db4a41a6a7c4926e905c805be81a9;hpb=6d6536499427dee57a7ce41406bc8b0f04e5d8d3;p=u%2Fmrichter%2FAliRoot.git diff --git a/ZDC/AliZDCRawStream.cxx b/ZDC/AliZDCRawStream.cxx index 047bd6029a3..516bfa6e63f 100644 --- a/ZDC/AliZDCRawStream.cxx +++ b/ZDC/AliZDCRawStream.cxx @@ -40,20 +40,20 @@ ClassImp(AliZDCRawStream) AliZDCRawStream::AliZDCRawStream(AliRawReader* rawReader) : fRawReader(rawReader), fBuffer(0), + fReadOutCard(-1), fEvType(0), fPosition(0), fIsCalib(kFALSE), fIsDARCHeader(kFALSE), + fIsHeaderMapping(kFALSE), fIsChMapping(kFALSE), fIsADCDataWord(kFALSE), fIsADCHeader(kFALSE), fIsADCEOB(kFALSE), fSODReading(kFALSE), fIsMapRead(kFALSE), - fDARCEvBlockLenght(0), - fDARCBlockAttributes(0), - fDeadfaceOffset(0), - fDeadbeefOffset(0), + fDeadfaceOffset(-1), + fDeadbeefOffset(-1), fDataOffset(0), fModType(-1), fADCModule(-1), @@ -63,22 +63,59 @@ AliZDCRawStream::AliZDCRawStream(AliRawReader* rawReader) : fADCGain(-1), fIsUnderflow(kFALSE), fIsOverflow(kFALSE), - fScNWords(0), fScGeo(0), - fScTS(0), + fScNWords(0), + fScTriggerSource(0), fScTriggerNumber(0), - fIsScEventGood(kFALSE), - fNChannelsOn(48), - fNConnCh(-1), - fCabledSignal(-1) + fIsScEventGood(kTRUE), + fIsScHeaderRead(kFALSE), + fScStartCounter(0), + fScEvCounter(0), + fDetPattern(0), + fTrigCountNWords(0), + fIsTriggerScaler(kFALSE), + fTrigCountStart(0), + fMBTrigInput(0), + fCentralTrigInput(0), + fSCentralTrigInput(0), + fEMDTrigInput(0), + fL0Received(0), + fMBtrig2CTP(0), + fCentralTrig2CTP(0), + fSCentralTrig2CTP(0), + fEMDTrig2CTP(0), + fTrigHistNWords(0), + fIsTriggerHistory(kFALSE), + fTrigHistStart(0), + fPileUpBit1stWord(0), + fL0Bit1stWord(0), + fCentralTrigHist(0), + fMBTrigHist(0), + fPileUpBit2ndWord(0), + fL0Bit2ndWord(0), + fSCentralTrigHist(0), + fEMDTrigHist(0), + fNChannelsOn(0), + fCurrentCh(-1), + fCabledSignal(-1), + fCurrScCh(-1), + fIsADCEventGood(kTRUE), + fIsL0BitSet(kTRUE), + fIsPileUpEvent(kFALSE) { // Create an object to read ZDC raw digits fRawReader->Reset(); fRawReader->Select("ZDC"); // - for(Int_t i=0; iPrint(""); - for(Int_t i=0; iGetADCModule(i); fMapADC[i][1] = chMap->GetADCChannel(i); fMapADC[i][2] = -1; @@ -170,24 +246,47 @@ void AliZDCRawStream::ReadCDHHeader() return; } else{ - //printf("\t AliZDCRawStream::ReadCDHHeader -> Data Size = %d\n",fRawReader->GetDataSize()); + //printf("\t AliZDCRawStream::ReadCDHHeader -> Data Size = %x\n",fRawReader->GetDataSize()); - fDARCEvBlockLenght = header->fSize; - //printf("\t AliZDCRawStream::ReadCDHHeader -> fDARCEvBlockLenght = %d\n",fDARCEvBlockLenght); - UChar_t message = header->GetAttributes(); //printf("\t AliZDCRawStream::ReadCDHHeader -> Attributes %x\n",message); - if(message & 0x10){ // COSMIC RUN + if((message & 0x0) == 0x0){ // PHYSICS RUN + //printf("\t PHYSICS RUN raw data found\n"); + } + else if((message & 0x10) == 0x10){ // COSMIC RUN //printf("\t STANDALONE_COSMIC RUN raw data found\n"); } - else if(message & 0x20){ // PEDESTAL RUN + else if((message & 0x20) == 0x20){ // PEDESTAL RUN //printf("\t STANDALONE_PEDESTAL RUN raw data found\n"); } - else if(message & 0x30){ // LASER RUN + else if((message & 0x30) == 0x30){ // LASER RUN //printf("\t STANDALONE_LASER RUN raw data found\n"); } - + else if((message & 0x40) == 0x40){ // CALIBRATION_CENTRAL RUN + //printf("\t CALIBRATION_CENTRAL RUN raw data found\n"); + } + else if((message & 0x50) == 0x50){ // CALIBRATION_SEMICENTRAL + //printf("\t CALIBRATION_SEMICENTRAL RUN raw data found\n"); + } + else if((message & 0x60) == 0x60){ // CALIBRATION_MB + //printf("\t CALIBRATION_MB RUN raw data found\n"); + } + else if((message & 0x70) == 0x70){ // CALIBRATION_EMD + //printf("\t CALIBRATION_EMD RUN raw data found\n"); + } + // *** Checking the bit indicating the used readout card + // (the payload is different in the 2 cases!) + if((message & 0x08) == 0){ // ** DARC card + fReadOutCard = 0; + fIsDARCHeader = kTRUE; + AliInfo("\t ZDC readout card used: DARC"); + } + else if((message & 0x08) == 0x08){ // ** ZRC card + fReadOutCard = 1; + AliInfo("\t ZDC readout card used: ZRC"); + } + if(header->GetL1TriggerMessage() & 0x1){ // Calibration bit set in CDH fIsCalib = kTRUE; } @@ -197,51 +296,50 @@ void AliZDCRawStream::ReadCDHHeader() UInt_t status = header->GetStatus(); //printf("\t AliZDCRawStream::ReadCDHHeader -> status = %d\n",status); if((status & 0x000f) == 0x0001){ - AliWarning("CDH -> DARC trg0 overlap error"); + AliDebug(2,"CDH -> DARC trg0 overlap error"); fRawReader->AddMajorErrorLog(kDARCError); } if((status & 0x000f) == 0x0002){ - AliWarning("CDH -> DARC trg0 missing error"); + AliDebug(2,"CDH -> DARC trg0 missing error"); fRawReader->AddMajorErrorLog(kDARCError); } if((status & 0x000f) == 0x0004){ - AliWarning("CDH -> DARC data parity error"); + AliDebug(2,"CDH -> DARC data parity error"); fRawReader->AddMajorErrorLog(kDARCError); } if((status & 0x000f) == 0x0008){ - AliWarning("CDH -> DARC ctrl parity error"); + AliDebug(2,"CDH -> DARC ctrl parity error"); fRawReader->AddMajorErrorLog(kDARCError); } // if((status & 0x00f0) == 0x0010){ - AliWarning("CDH -> DARC trg unavailable"); + AliDebug(2,"CDH -> DARC trg unavailable"); fRawReader->AddMajorErrorLog(kDARCError); } if((status & 0x00f0) == 0x0020){ - AliWarning("CDH -> DARC FEE error"); + AliDebug(2,"CDH -> DARC FEE error"); fRawReader->AddMajorErrorLog(kDARCError); } // if((status & 0x0f00) == 0x0200){ - AliWarning("CDH -> DARC L1 time violation"); + AliDebug(2,"CDH -> DARC L1 time violation"); fRawReader->AddMajorErrorLog(kDARCError); } if((status & 0x0f00) == 0x0400){ - AliWarning("CDH -> DARC L2 time-out"); + AliDebug(2,"CDH -> DARC L2 time-out"); fRawReader->AddMajorErrorLog(kDARCError); } if((status & 0x0f00) == 0x0800){ - AliWarning("CDH -> DARC prepulse time violation"); + AliDebug(2,"CDH -> DARC prepulse time violation"); fRawReader->AddMajorErrorLog(kDARCError); } // if((status & 0xf000) == 0x1000){ - AliWarning("CDH -> DARC other error"); + AliDebug(2,"CDH -> DARC other error"); fRawReader->AddMajorErrorLog(kDARCError); } } - // - fIsDARCHeader = kTRUE; + } //_____________________________________________________________________________ @@ -251,27 +349,31 @@ Bool_t AliZDCRawStream::Next() // Returns kFALSE if there is no digit left if(!fRawReader->ReadNextInt((UInt_t&) fBuffer)) return kFALSE; - fIsChMapping = kFALSE; fIsADCHeader = kFALSE; - fIsADCDataWord = kFALSE; fIsADCEOB = kFALSE; - fIsUnderflow = kFALSE; - fIsOverflow = kFALSE; - fSector[0]=fSector[1] = -1; - + const int kNch = 48; + Int_t kFirstADCGeo=0, kLastADCGeo=3, kScalerGeo=8, kPUGeo=29, kTrigScales=30, kTrigHistory=31; + fIsHeaderMapping = kFALSE; fIsChMapping = kFALSE; + fIsADCHeader = kFALSE; fIsADCDataWord = kFALSE; fIsADCEOB = kFALSE; + fIsUnderflow = kFALSE; fIsOverflow = kFALSE; + fSector[0] = fSector[1] = -1; +// fTrigCountNWords = 9; fTrigHistNWords = 2; + for(Int_t kl=0; kl<4; kl++) fCPTInput[kl] = 0; + fEvType = fRawReader->GetType(); - //printf("\n\t AliZDCRawStream::Next() -> ev. type %d\n",fEvType); - //printf("\n AliZDCRawStream::Next() - fBuffer[%d] = %x\n",fPosition, fBuffer); - if(fPosition==0){ //if(fEvType==7 || fEvType ==8){ //Physics or calibration event - //ReadEventHeader(); ReadCDHHeader(); //} - fNConnCh=0; + fCurrentCh=0; fCurrScCh=0; fNChannelsOn=0; + // Ch. debug + //printf("\n AliZDCRawStream::Next() - ev. type %d",fEvType); } + // Ch. debug + //printf("\n AliZDCRawStream::Next() - fBuffer[%d] = %x\n",fPosition, fBuffer); + // *** End of ZDC event if(fBuffer == 0xcafefade){ - //printf("\n-> AliZDCRawStream::Next() ***** End of ZDC event *****\n\n"); + //printf("\n AliZDCRawStream::Next() ***** End of ZDC event *****\n\n"); return kFALSE; } @@ -280,7 +382,7 @@ Bool_t AliZDCRawStream::Next() // ------------------------------------------- // If the CDH has been read then // the DARC header must follow - if(fIsDARCHeader){ + if(fReadOutCard==0 && fIsDARCHeader){ //printf("\t ---- DARC header ----\n"); if(fIsCalib){ fDeadfaceOffset = 9; @@ -293,198 +395,275 @@ Bool_t AliZDCRawStream::Next() fDataOffset = 1+fDeadbeefOffset; fIsDARCHeader = kFALSE; } - - // ------------------------------------------- - // --- Start of data event - // --- decoding mapping of connected ADC ch. - // ------------------------------------------- + // --------------------------------------------- + // --- Start of data event (SOD) --- + // --- decoding mapping of connected ADC ch. --- + // --------------------------------------------- // In the SOD event ADC ch. mapping is written - if(fEvType==10 && fSODReading){ - //printf("\n-> AliZDCRawStream::Next() - fBuffer[%d] = %x\n",fPosition, fBuffer); + if(fEvType==10){ + if(fSODReading){ - if(fPosition>fDataOffset){ - if((fBuffer&0xff000000) == 0xff000000){ - if(fPosition==(fDataOffset+1)){ - printf("\n\n\t AliZDCRawStream -> Reading mapping from StartOfData event\n"); - fNConnCh=0; + if(fPosition>=fDataOffset){ + if((fBuffer&0xff000001) == 0xff000001){ // ************** Mapping + // DARC 1st datum @ fDataOffset+1 \ ZRC 1st valid datum fDataOffset=0 + if((fPosition==fDataOffset+1) || (fPosition==fDataOffset)){ + printf("\n\n ------ AliZDCRawStream -> Reading mapping from StartOfData event ------\n"); + fCurrentCh=0; fCurrScCh=0; } else{ - printf("\n\t AliZDCRawStream -> End of ZDC StartOfData event\n\n"); - //printf("AliZDCRawStream: fSODReading after SOD reading set to %d\n", fSODReading); + printf(" ------ AliZDCRawStream -> End of ZDC StartOfData event ------\n\n"); + fSODReading = kFALSE; return kFALSE; } } - else if((fBuffer&0x80000000)>>31 == 1){ - // Mapping identification - fADCModule = ((fBuffer & 0x7f000000)>>24); - fModType = ((fBuffer & 0x7ff00)>>8); - fADCNChannels = (fBuffer & 0xff); + else if((fBuffer&0xff000002) == 0xff000002){ // ************** Threshold settings + fPosition++; + return kFALSE; // !!!!!!!!!!!!!!!!!!!!! For the moment thresholds are not read + } + else if((fBuffer&0x80000000)>>31 == 1){ // --- Mapping header + fIsHeaderMapping = kTRUE; + fADCModule = ((fBuffer & 0x7f000000)>>24); // GEO address!!! + fModType = ((fBuffer & 0x7ff00)>>8); + fADCNChannels = (fBuffer & 0xff); // # of channels following the header // - //printf(" ******** GEO %d, mod. type %d, #ch. %d\n",fADCModule,fModType,fADCNChannels); + printf(" ******** GEO %d, mod. type %d, #ch. %d\n",fADCModule,fModType,fADCNChannels); } - else if(fModType==1 && (fBuffer&0x80000000)>>31 == 0){ - // Channel signal - if((fBuffer&0x40000000)>>30==0){ // high range chain ADC - fIsChMapping = kTRUE; - fADCChannel = ((fBuffer & 0x3fff0000)>>16); - fCabledSignal = (fBuffer&0xffff); - //printf("\tADC ch. %d, signal %d\n",fADCChannel,fCabledSignal); - // - fMapADC[fNConnCh][0] = fADCModule; - fMapADC[fNConnCh][1] = fADCChannel; - fMapADC[fNConnCh][2] = fCabledSignal; + else if((fBuffer&0x80000000)>>31 == 0){ // --- Mapping channel + fADCChannel = ((fBuffer & 0x3fff0000)>>16); + fCabledSignal = (fBuffer&0xffff); + // + if(fModType == kV965){ // ******** ADCs ******************************** + // Channel signal + if((fBuffer&0x40000000)>>30==0){ // high range chain ADC + fIsChMapping = kTRUE; + fMapADC[fCurrentCh][0] = fADCModule; + fMapADC[fCurrentCh][1] = fADCChannel; + fMapADC[fCurrentCh][2] = fCabledSignal; + // - No. of channels on + fNChannelsOn++; + // + // Determining detector and sector + // ----------------------------------------- + // For the decoding of the following lines + // look the enum in AliZDCRawStream.h file + // ----------------------------------------- + if((fCabledSignal>=2 && fCabledSignal<=6) || (fCabledSignal>=26 && fCabledSignal<=30) + || fCabledSignal==24 || fCabledSignal==48){ + fMapADC[fCurrentCh][3] = 4; //ZNA + // + if(fCabledSignal==kZNAC || fCabledSignal==kZNACoot) fMapADC[fCurrentCh][4]=0; + else if(fCabledSignal==3 || fCabledSignal==27) fMapADC[fCurrentCh][4]=1; + else if(fCabledSignal==4 || fCabledSignal==28) fMapADC[fCurrentCh][4]=2; + else if(fCabledSignal==5 || fCabledSignal==29) fMapADC[fCurrentCh][4]=3; + else if(fCabledSignal==6 || fCabledSignal==30) fMapADC[fCurrentCh][4]=4; + else if(fCabledSignal==24 || fCabledSignal==48) fMapADC[fCurrentCh][4]=5; //Reference PTM + } + else if((fCabledSignal>=7 && fCabledSignal<=11) || (fCabledSignal>=31 && fCabledSignal<=35)){ + fMapADC[fCurrentCh][3] = 5; //ZPA + // + if(fCabledSignal==7 || fCabledSignal==31) fMapADC[fCurrentCh][4]=0; + else if(fCabledSignal==8 || fCabledSignal==32) fMapADC[fCurrentCh][4]=1; + else if(fCabledSignal==9 || fCabledSignal==33) fMapADC[fCurrentCh][4]=2; + else if(fCabledSignal==10 || fCabledSignal==34) fMapADC[fCurrentCh][4]=3; + else if(fCabledSignal==11 || fCabledSignal==35) fMapADC[fCurrentCh][4]=4; + } + else if((fCabledSignal>=12 && fCabledSignal<=16) || (fCabledSignal>=36 && fCabledSignal<=40) + || fCabledSignal==25 || fCabledSignal==49){ + fMapADC[fCurrentCh][3] = 1; //ZNC + // + if(fCabledSignal==12 || fCabledSignal==36) fMapADC[fCurrentCh][4]=0; + else if(fCabledSignal==13 || fCabledSignal==37) fMapADC[fCurrentCh][4]=1; + else if(fCabledSignal==14 || fCabledSignal==38) fMapADC[fCurrentCh][4]=2; + else if(fCabledSignal==15 || fCabledSignal==39) fMapADC[fCurrentCh][4]=3; + else if(fCabledSignal==16 || fCabledSignal==40) fMapADC[fCurrentCh][4]=4; + else if(fCabledSignal==25 || fCabledSignal==49) fMapADC[fCurrentCh][4]=5; //Reference PTM + } + else if((fCabledSignal>=17 && fCabledSignal<=21) || (fCabledSignal>=41 && fCabledSignal<=45)){ + fMapADC[fCurrentCh][3] = 2; //ZPC + // + if(fCabledSignal==17 || fCabledSignal==41) fMapADC[fCurrentCh][4]=0; + else if(fCabledSignal==18 || fCabledSignal==42) fMapADC[fCurrentCh][4]=1; + else if(fCabledSignal==19 || fCabledSignal==43) fMapADC[fCurrentCh][4]=2; + else if(fCabledSignal==20 || fCabledSignal==44) fMapADC[fCurrentCh][4]=3; + else if(fCabledSignal==21 || fCabledSignal==45) fMapADC[fCurrentCh][4]=4; + } + else if(fCabledSignal==22 || fCabledSignal==23 || fCabledSignal==46 || fCabledSignal==47){ + fMapADC[fCurrentCh][3] = 3; // ZEM + // + if(fCabledSignal==22 || fCabledSignal==46) fMapADC[fCurrentCh][4]=1; + else if(fCabledSignal==23 || fCabledSignal==47) fMapADC[fCurrentCh][4]=2; + } + //Ch. debug + //printf("\tADC mod. %d ch. %d signal %d ",fADCModule,fADCChannel,fCabledSignal); + //printf(" det. %d sec. %d\n",fMapADC[fCurrentCh][3],fMapADC[fCurrentCh][4]); + // + fCurrentCh++; + // + } // high range channels + }// ModType=1 (ADC mapping) + else if(fModType == kV830){ // ******** VME scaler ************************** + fIsChMapping = kTRUE; + fScalerMap[fCurrScCh][0] = fADCModule; + fScalerMap[fCurrScCh][1] = fADCChannel; + fScalerMap[fCurrScCh][2] = fCabledSignal; // // Determining detector and sector // ----------------------------------------- // For the decoding of the following lines // look the enum in AliZDCRawStream.h file // ----------------------------------------- - if((fCabledSignal>=2 && fCabledSignal<=6) || (fCabledSignal>=26 && fCabledSignal<=30) - || fCabledSignal==24 || fCabledSignal==48){ - fMapADC[fNConnCh][3] = 4; //ZNA + // NOT CONSIDERING OUT OF TIME OR REFERENCE SIGNALS FOR SCALER!!!!! + if(fCabledSignal>=2 && fCabledSignal<=6){ + fScalerMap[fCurrScCh][3] = 4; //ZNA // - if(fCabledSignal==2 || fCabledSignal==26) fMapADC[fNConnCh][4]=0; - else if(fCabledSignal==3 || fCabledSignal==27) fMapADC[fNConnCh][4]=1; - else if(fCabledSignal==4 || fCabledSignal==28) fMapADC[fNConnCh][4]=2; - else if(fCabledSignal==5 || fCabledSignal==29) fMapADC[fNConnCh][4]=3; - else if(fCabledSignal==6 || fCabledSignal==30) fMapADC[fNConnCh][4]=4; - else if(fCabledSignal==24 || fCabledSignal==48) fMapADC[fNConnCh][4]=5; + if(fCabledSignal==2 ) fScalerMap[fCurrScCh][4]=0; + else if(fCabledSignal==3) fScalerMap[fCurrScCh][4]=1; + else if(fCabledSignal==4) fScalerMap[fCurrScCh][4]=2; + else if(fCabledSignal==5) fScalerMap[fCurrScCh][4]=3; + else if(fCabledSignal==6) fScalerMap[fCurrScCh][4]=4; } - else if((fCabledSignal>=7 && fCabledSignal<=11) || (fCabledSignal>=31 && fCabledSignal<=35)){ - fMapADC[fNConnCh][3] = 5; //ZPA + else if(fCabledSignal>=7 && fCabledSignal<=11){ + fScalerMap[fCurrScCh][3] = 5; //ZPA // - if(fCabledSignal==7 || fCabledSignal==31) fMapADC[fNConnCh][4]=0; - else if(fCabledSignal==8 || fCabledSignal==32) fMapADC[fNConnCh][4]=1; - else if(fCabledSignal==9 || fCabledSignal==33) fMapADC[fNConnCh][4]=2; - else if(fCabledSignal==10 || fCabledSignal==34) fMapADC[fNConnCh][4]=3; - else if(fCabledSignal==11 || fCabledSignal==35) fMapADC[fNConnCh][4]=4; + if(fCabledSignal==7 ) fScalerMap[fCurrScCh][4]=0; + else if(fCabledSignal==8) fScalerMap[fCurrScCh][4]=1; + else if(fCabledSignal==9) fScalerMap[fCurrScCh][4]=2; + else if(fCabledSignal==10) fScalerMap[fCurrScCh][4]=3; + else if(fCabledSignal==11) fScalerMap[fCurrScCh][4]=4; } - else if((fCabledSignal>=12 && fCabledSignal<=16) || (fCabledSignal>=36 && fCabledSignal<=40) - || fCabledSignal==25 || fCabledSignal==49){ - fMapADC[fNConnCh][3] = 1; //ZNC + else if(fCabledSignal>=12 && fCabledSignal<=16){ + fScalerMap[fCurrScCh][3] = 1; //ZNC // - if(fCabledSignal==12 || fCabledSignal==36) fMapADC[fNConnCh][4]=0; - else if(fCabledSignal==13 || fCabledSignal==37) fMapADC[fNConnCh][4]=1; - else if(fCabledSignal==14 || fCabledSignal==38) fMapADC[fNConnCh][4]=2; - else if(fCabledSignal==15 || fCabledSignal==39) fMapADC[fNConnCh][4]=3; - else if(fCabledSignal==16 || fCabledSignal==40) fMapADC[fNConnCh][4]=4; - else if(fCabledSignal==25 || fCabledSignal==49) fMapADC[fNConnCh][4]=5; + if(fCabledSignal==12) fScalerMap[fCurrScCh][4]=0; + else if(fCabledSignal==13) fScalerMap[fCurrScCh][4]=1; + else if(fCabledSignal==14) fScalerMap[fCurrScCh][4]=2; + else if(fCabledSignal==15) fScalerMap[fCurrScCh][4]=3; + else if(fCabledSignal==16) fScalerMap[fCurrScCh][4]=4; } - else if((fCabledSignal>=17 && fCabledSignal<=21) || (fCabledSignal>=41 && fCabledSignal<=45)){ - fMapADC[fNConnCh][3] = 2; //ZPC + else if(fCabledSignal>=17 && fCabledSignal<=21){ + fScalerMap[fCurrScCh][3] = 2; //ZPC // - if(fCabledSignal==17 || fCabledSignal==41) fMapADC[fNConnCh][4]=0; - else if(fCabledSignal==18 || fCabledSignal==42) fMapADC[fNConnCh][4]=1; - else if(fCabledSignal==19 || fCabledSignal==43) fMapADC[fNConnCh][4]=2; - else if(fCabledSignal==20 || fCabledSignal==44) fMapADC[fNConnCh][4]=3; - else if(fCabledSignal==21 || fCabledSignal==45) fMapADC[fNConnCh][4]=4; + if(fCabledSignal==17) fScalerMap[fCurrScCh][4]=0; + else if(fCabledSignal==18) fScalerMap[fCurrScCh][4]=1; + else if(fCabledSignal==19) fScalerMap[fCurrScCh][4]=2; + else if(fCabledSignal==20) fScalerMap[fCurrScCh][4]=3; + else if(fCabledSignal==21) fScalerMap[fCurrScCh][4]=4; } - else if(fCabledSignal==22 || fCabledSignal==23 || fCabledSignal==46 || fCabledSignal==47){ - fMapADC[fNConnCh][3] = 3; + else if(fCabledSignal==22 || fCabledSignal==23){ + fScalerMap[fCurrScCh][3] = 3; // ZEM // - if(fCabledSignal==22 || fCabledSignal==46) fMapADC[fNConnCh][4]=1; - else if(fCabledSignal==23 || fCabledSignal==47) fMapADC[fNConnCh][4]=2; + if(fCabledSignal==22 ) fScalerMap[fCurrScCh][4]=1; + else if(fCabledSignal==23) fScalerMap[fCurrScCh][4]=2; } - // - //if(fNConnCh=fNChannelsOn){ - // Protection manually set since it returns: - // RawData48 mod. 3 ch. 2048 signal 515 - // to be checked with Pietro!!!!!!!!!!!!!!!!!!!!!!! - //AliDebug(2," No. of cabled channels > fNChannelsOn!!!"); - fPosition++; - return kTRUE; - } - } - }// ModType=1 (ADC mapping) + // Ch debug. + //printf("\t VME scaler mod. %d ch. %d, signal %d",fScalerMap[fCurrScCh][0],fADCChannel,fCabledSignal); + //if(fCabledSignal!=0 && fCabledSignal!=1) printf(" det. %d sec. %d\n",fScalerMap[fCurrScCh][3],fScalerMap[fCurrScCh][4]); + //else printf(" Signal void/not connected\n"); + + fCurrScCh++; + } + /*else if(fModType == kTRG){ // **** scalers from trigger card + //printf("\t Trigger scaler mod. %d ch. %d, signal %d\n",fADCModule,fADCChannel,fCabledSignal); + } + else if(fModType == kTRGI){ // **** trigger history from trigger card + //printf("\t Trigger card ch. %d, signal %d\n",fADCChannel,fCabledSignal); + } + else if(fModType == kPU){ // **** pattern unit + //printf("\t P.U. mod. %d ch. %d, signal %d\n",fADCModule,fADCChannel,fCabledSignal); + }*/ + }//reading channel mapping } - fPosition++; - return kTRUE; - } // SOD event + } // if fSODREading + fPosition++; + return kTRUE; + } // ------------------------------- SOD event // ------------------------------------------- // --- DARC data // ------------------------------------------- - if(fPositionAddMajorErrorLog(kDARCError); + fRawReader->AddMajorErrorLog(kDARCError); } else{ fPosition++; return kTRUE; } } - - // ------------------------------------------- - // --- DARC global data - // ------------------------------------------- - else if(fPosition>fDeadfaceOffset && fPositionfDeadfaceOffset && fPositionAddMajorErrorLog(kDARCError); + fPosition++; + return kFALSE; } else{ fPosition++; return kTRUE; } - } - - // ------------------------------------------- + } // ------------------------------- End of DARC data + + // --------------------------------------------- // --- ZDC data - // --- ADC buffer + scaler - // ------------------------------------------- + // --- ADCs + VME scaler + trigger card + P.U. + // --------------------------------------------- else if(fPosition>=fDataOffset){ //printf("AliZDCRawStream: fSODReading = %d\n", fSODReading); 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(fPosition==fDataOffset){ - //printf("\t **** ZDC data begin ****\n"); - if((fBuffer & 0x07000000) == 0x06000000){ - //printf(" AliZDCRawStream -> Not valid datum in ADC %d," - // "position %d in word data buffer\n",fADCModule,fPosition); + 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; + } } - else fRawReader->AddMajorErrorLog(kZDCDataError); - } - // 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); + // 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 to determine - // if it is a scaler word (geo address == kScalerAddress) - // if it is an ADC word (geo address != 8) - Int_t kScalerAddress=8; - fADCModule = ((fBuffer & 0xf8000000)>>27); - if(fADCModule == kScalerAddress){ - DecodeScaler(); - } - else{//ADC module + // Get geo address of current word + // - ADC GEO = 0, 1, 2, 3 + // - VME scaler GEO = 8 + // - PU GEO = 29 + // - Trigger card scales GEO = 30 + // - Trigger card history GEO = 31 + 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 -> HEADER: ADC mod.%d has %d ch. \n",fADCModule,fADCNChannels); + //printf(" AliZDCRawStream -> ADC HEADER: mod.%d has %d ch. \n",fADCModule,fADCNChannels); } // *** ADC data word else if((fBuffer & 0x07000000) == 0x00000000){ @@ -492,8 +671,8 @@ Bool_t AliZDCRawStream::Next() fADCChannel = ((fBuffer & 0x1e0000) >> 17); fADCGain = ((fBuffer & 0x10000) >> 16); fADCValue = (fBuffer & 0xfff); - - //printf(" AliZDCRawStream -> DATA: ADC mod. %d ch. %d gain %d value %d\n", + // + //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 @@ -502,14 +681,14 @@ Bool_t AliZDCRawStream::Next() return kFALSE; } // - /*for(Int_t ci=0; ci ADCmod. %d ch. %d gain %d -> det %d sec %d\n", - // fADCModule,fADCChannel,fADCGain,fSector[0],fSector[1]); + //printf("AliZDCRawStream -> ADCmod. %d ch. %d -> det %d sec %d\n", + // fADCModule,fADCChannel,fSector[0],fSector[1]); // Final checks if(foundMapEntry==kTRUE){ @@ -553,42 +732,134 @@ Bool_t AliZDCRawStream::Next() fIsADCEOB = kTRUE; //printf(" AliZDCRawStream -> EOB --------------------------\n"); } - }//ADC module - + }//ADC module + // ********************************* 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; + fScEvCounter = fBuffer; + Int_t nWords = (Int_t) (fScNWords); + if(fPosition == fScStartCounter+nWords) fIsScHeaderRead = kFALSE; + //Ch. debug + //printf(" AliZDCRawStream -> scaler datum %d", fScEvCounter); + } + // ******************************** TRIGGER SCALER DATA ******************************** + // Reading trigger scaler data + if(fIsTriggerScaler && fPosition>=fTrigCountStart+1){ + fADCModule = kTrigScales; + 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; + 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); + } } + fPosition++; return kTRUE; } -//_____________________________________________________________________________ -void AliZDCRawStream::DecodeScaler() -{ - // Decoding scaler event - - if(!fBuffer & 0x04000000){ - AliWarning(" Scaler header corrupted"); - fIsScEventGood = kFALSE; - } - Int_t scNwords = (Int_t) fScNWords; - if(fPosition==scNwords && fBuffer != 0x0){ - AliWarning(" Scaler trailer corrupted"); - fIsScEventGood = kFALSE; - } - fIsScEventGood = kTRUE; - - if(fPosition==0){ - fScNWords = (fBuffer & 0x00fc0000)>>18; - fScGeo = (fBuffer & 0xf8000000)>>27; - fScTS = (fBuffer & 0x00030000)>>16; - fScTriggerNumber = (fBuffer & 0x0000ffff); - } - - fPosition++; - -} - //_____________________________________________________________________________ AliCDBStorage* AliZDCRawStream::SetStorage(const char *uri) {