1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // This class provides access to ZDC digits in raw data. //
22 // It loops over all ZDC digits in the raw data given by the AliRawReader. //
23 // The Next method goes to the next digit. If there are no digits left //
24 // it returns kFALSE. //
25 // Getters provide information about the current digit. //
27 ///////////////////////////////////////////////////////////////////////////////
30 #include "AliZDCRawStream.h"
31 #include "AliRawReader.h"
32 #include "AliRawDataHeader.h"
33 #include "AliRawEventHeaderBase.h"
36 ClassImp(AliZDCRawStream)
39 //_____________________________________________________________________________
40 AliZDCRawStream::AliZDCRawStream(AliRawReader* rawReader) :
41 fRawReader(rawReader),
46 fIsDARCHeader(kFALSE),
47 fIsHeaderMapping(kFALSE),
49 fIsADCDataWord(kFALSE),
54 fDARCEvBlockLenght(0),
55 fDARCBlockAttributes(0),
71 fIsScEventGood(kTRUE),
72 fIsScHeaderRead(kFALSE),
77 fIsTriggerScaler(kFALSE),
81 fSCentralTrigInput(0),
89 fIsTriggerHistory(kFALSE),
103 fIsADCEventGood(kTRUE),
105 fIsPileUpEvent(kFALSE)
107 // Create an object to read ZDC raw digits
109 fRawReader->Select("ZDC");
112 for(Int_t i=0; i<kNch; i++){
113 for(Int_t j=0; j<5; j++){
115 if(i<32) fScalerMap[i][j]=-1;
119 for(Int_t k=0; k<4; k++) fCPTInput[k] = 0;
123 //_____________________________________________________________________________
124 AliZDCRawStream::AliZDCRawStream(const AliZDCRawStream& stream) :
126 fRawReader(stream.fRawReader),
127 fBuffer(stream.GetRawBuffer()),
128 fEvType(stream.fEvType),
129 fPosition(stream.fPosition),
130 fIsCalib(stream.fIsCalib),
131 fIsDARCHeader(stream.fIsDARCHeader),
132 fIsHeaderMapping(stream.fIsHeaderMapping),
133 fIsChMapping(stream.fIsChMapping),
134 fIsADCDataWord(stream.fIsADCDataWord),
135 fIsADCHeader(stream.fIsADCHeader),
136 fIsADCEOB(stream.fIsADCEOB),
137 fSODReading(stream.fSODReading),
138 fIsMapRead(stream.fIsMapRead),
139 fDARCEvBlockLenght(stream.fDARCEvBlockLenght),
140 fDARCBlockAttributes(stream.fDARCBlockAttributes),
141 fDeadfaceOffset(stream.GetDeadfaceOffset()),
142 fDeadbeefOffset(stream.GetDeadbeefOffset()),
143 fDataOffset(stream.GetDataOffset()),
144 fModType(stream.GetModType()),
145 fADCModule(stream.GetADCModule()),
146 fADCNChannels(stream.GetADCNChannels()),
147 fADCChannel(stream.GetADCChannel()),
148 fADCValue(stream.GetADCValue()),
149 fADCGain(stream.GetADCGain()),
150 fIsUnderflow(stream.fIsUnderflow),
151 fIsOverflow(stream.fIsOverflow),
152 fScGeo(stream.GetScGeo()),
153 fScNWords(stream.GetScNWords()),
154 fScTriggerSource(stream.GetScTriggerSource()),
155 fScTriggerNumber(stream.fScTriggerNumber),
156 fIsScEventGood(stream.fIsScEventGood),
157 fIsScHeaderRead(stream.fIsScHeaderRead),
158 fScStartCounter(stream.fScStartCounter),
159 fScEvCounter(stream.fScEvCounter),
160 fDetPattern(stream.fDetPattern),
161 fTrigCountNWords(stream.fTrigCountNWords),
162 fIsTriggerScaler(stream.fIsTriggerScaler),
163 fTrigCountStart(stream.fTrigCountStart),
164 fMBTrigInput(stream.fMBTrigInput),
165 fCentralTrigInput(stream.fCentralTrigInput),
166 fSCentralTrigInput(stream.fSCentralTrigInput),
167 fEMDTrigInput(stream.fEMDTrigInput),
168 fL0Received(stream.fL0Received),
169 fMBtrig2CTP(stream.fMBtrig2CTP),
170 fCentralTrig2CTP(stream.fCentralTrig2CTP),
171 fSCentralTrig2CTP(stream.fSCentralTrig2CTP),
172 fEMDTrig2CTP(stream.fEMDTrig2CTP),
173 fTrigHistNWords(stream.fTrigHistNWords),
174 fIsTriggerHistory(stream.fIsTriggerHistory),
175 fTrigHistStart(stream.fTrigHistStart),
176 fPileUpBit1stWord(stream.fPileUpBit1stWord),
177 fL0Bit1stWord(stream.fL0Bit1stWord),
178 fCentralTrigHist(stream.fCentralTrigHist),
179 fMBTrigHist(stream.fMBTrigHist),
180 fPileUpBit2ndWord(stream.fPileUpBit2ndWord),
181 fL0Bit2ndWord(stream.fL0Bit2ndWord),
182 fSCentralTrigHist(stream.fSCentralTrigHist),
183 fEMDTrigHist(stream.fEMDTrigHist),
184 fNChannelsOn(stream.fNChannelsOn),
185 fCurrentCh(stream.fCurrentCh),
186 fCabledSignal(stream.GetCabledSignal()),
187 fCurrScCh(stream.fCurrScCh),
188 fIsADCEventGood(stream.fIsADCEventGood),
189 fIsL0BitSet(stream.fIsL0BitSet),
190 fIsPileUpEvent(stream.fIsPileUpEvent)
195 for(Int_t j=0; j<2; j++) fSector[j] = stream.GetSector(j);
196 for(Int_t i=0; i<kNch; i++){
197 for(Int_t j=0; j<5; j++){
198 fMapADC[i][j] = stream.fMapADC[i][j];
199 if(i<32) fScalerMap[i][j] = stream.fMapADC[i][j];
203 for(Int_t k=0; k<4; k++) fCPTInput[k] = stream.fCPTInput[k];
206 //_____________________________________________________________________________
207 AliZDCRawStream& AliZDCRawStream::operator = (const AliZDCRawStream&
210 // Assignment operator
211 Fatal("operator =", "assignment operator not implemented");
215 //_____________________________________________________________________________
216 AliZDCRawStream::~AliZDCRawStream()
222 //_____________________________________________________________________________
223 void AliZDCRawStream::ReadChMap()
225 // Reading channel map
227 //printf("\t Reading ZDC ADC mapping from OCDB\n");
228 AliZDCChMap * chMap = GetChMap();
230 for(Int_t i=0; i<kNch; i++){
231 fMapADC[i][0] = chMap->GetADCModule(i);
232 fMapADC[i][1] = chMap->GetADCChannel(i);
234 fMapADC[i][3] = chMap->GetDetector(i);
235 fMapADC[i][4] = chMap->GetSector(i);
240 //_____________________________________________________________________________
241 void AliZDCRawStream::ReadCDHHeader()
244 const AliRawDataHeader* header = fRawReader->GetDataHeader();
246 AliError(" No CDH in raw data streaming");
247 fRawReader->AddMajorErrorLog(kCDHError);
251 //printf("\t AliZDCRawStream::ReadCDHHeader -> Data Size = %d\n",fRawReader->GetDataSize());
253 fDARCEvBlockLenght = header->fSize;
254 //printf("\t AliZDCRawStream::ReadCDHHeader -> fDARCEvBlockLenght = %d\n",fDARCEvBlockLenght);
256 UChar_t message = header->GetAttributes();
257 //printf("\t AliZDCRawStream::ReadCDHHeader -> Attributes %x\n",message);
259 if(message == 0x0){ // PHYSICS RUN
260 //printf("\t PHYSICS RUN raw data found\n");
262 else if(message == 0x10){ // COSMIC RUN
263 //printf("\t STANDALONE_COSMIC RUN raw data found\n");
265 else if(message == 0x20){ // PEDESTAL RUN
266 //printf("\t STANDALONE_PEDESTAL RUN raw data found\n");
268 else if(message == 0x30){ // LASER RUN
269 //printf("\t STANDALONE_LASER RUN raw data found\n");
271 else if(message == 0x40){ // CALIBRATION_CENTRAL RUN
272 //printf("\t CALIBRATION_CENTRAL RUN raw data found\n");
274 else if(message == 0x50){ // CALIBRATION_SEMICENTRAL
275 //printf("\t CALIBRATION_SEMICENTRAL RUN raw data found\n");
277 else if(message == 0x60){ // CALIBRATION_MB
278 //printf("\t CALIBRATION_MB RUN raw data found\n");
280 else if(message == 0x70){ // CALIBRATION_EMD
281 //printf("\t CALIBRATION_EMD RUN raw data found\n");
284 if(header->GetL1TriggerMessage() & 0x1){ // Calibration bit set in CDH
287 //printf("\t AliZDCRawStream::ReadCDHHeader -> L1TriggerMessage %x\n",header->GetL1TriggerMessage());
288 //printf("\t AliZDCRawStream::ReadCDHHeader -> Calibration bit = %d\n",fIsCalib);
290 UInt_t status = header->GetStatus();
291 //printf("\t AliZDCRawStream::ReadCDHHeader -> status = %d\n",status);
292 if((status & 0x000f) == 0x0001){
293 AliDebug(2,"CDH -> DARC trg0 overlap error");
294 fRawReader->AddMajorErrorLog(kDARCError);
296 if((status & 0x000f) == 0x0002){
297 AliDebug(2,"CDH -> DARC trg0 missing error");
298 fRawReader->AddMajorErrorLog(kDARCError);
300 if((status & 0x000f) == 0x0004){
301 AliDebug(2,"CDH -> DARC data parity error");
302 fRawReader->AddMajorErrorLog(kDARCError);
304 if((status & 0x000f) == 0x0008){
305 AliDebug(2,"CDH -> DARC ctrl parity error");
306 fRawReader->AddMajorErrorLog(kDARCError);
309 if((status & 0x00f0) == 0x0010){
310 AliDebug(2,"CDH -> DARC trg unavailable");
311 fRawReader->AddMajorErrorLog(kDARCError);
313 if((status & 0x00f0) == 0x0020){
314 AliDebug(2,"CDH -> DARC FEE error");
315 fRawReader->AddMajorErrorLog(kDARCError);
318 if((status & 0x0f00) == 0x0200){
319 AliDebug(2,"CDH -> DARC L1 time violation");
320 fRawReader->AddMajorErrorLog(kDARCError);
322 if((status & 0x0f00) == 0x0400){
323 AliDebug(2,"CDH -> DARC L2 time-out");
324 fRawReader->AddMajorErrorLog(kDARCError);
326 if((status & 0x0f00) == 0x0800){
327 AliDebug(2,"CDH -> DARC prepulse time violation");
328 fRawReader->AddMajorErrorLog(kDARCError);
331 if((status & 0xf000) == 0x1000){
332 AliDebug(2,"CDH -> DARC other error");
333 fRawReader->AddMajorErrorLog(kDARCError);
337 fIsDARCHeader = kTRUE;
340 //_____________________________________________________________________________
341 Bool_t AliZDCRawStream::Next()
343 // Read the next raw digit
344 // Returns kFALSE if there is no digit left
346 if(!fRawReader->ReadNextInt((UInt_t&) fBuffer)) return kFALSE;
348 Int_t kFirstADCGeo=0, kLastADCGeo=3, kScalerGeo=8, kPUGeo=29, kTrigScales=30, kTrigHistory=31;
349 fIsHeaderMapping = kFALSE; fIsChMapping = kFALSE;
350 fIsADCHeader = kFALSE; fIsADCDataWord = kFALSE; fIsADCEOB = kFALSE;
351 fIsUnderflow = kFALSE; fIsOverflow = kFALSE;
352 fSector[0] = fSector[1] = -1;
353 // fTrigCountNWords = 9; fTrigHistNWords = 2;
354 for(Int_t kl=0; kl<4; kl++) fCPTInput[kl] = 0;
356 fEvType = fRawReader->GetType();
358 //if(fEvType==7 || fEvType ==8){ //Physics or calibration event
362 fCurrentCh=0; fCurrScCh=0; fNChannelsOn=0;
364 //printf("\n AliZDCRawStream::Next() - ev. type %d",fEvType);
368 //printf("\n AliZDCRawStream::Next() - fBuffer[%d] = %x\n",fPosition, fBuffer);
370 // *** End of ZDC event
371 if(fBuffer == 0xcafefade){
372 //printf("\n-> AliZDCRawStream::Next() ***** End of ZDC event *****\n\n");
376 // -------------------------------------------
378 // -------------------------------------------
379 // If the CDH has been read then
380 // the DARC header must follow
382 //printf("\t ---- DARC header ----\n");
385 fDeadbeefOffset = 25;
391 fDataOffset = 1+fDeadbeefOffset;
392 fIsDARCHeader = kFALSE;
396 // -------------------------------------------
397 // --- Start of data event
398 // --- decoding mapping of connected ADC ch.
399 // -------------------------------------------
400 // In the SOD event ADC ch. mapping is written
401 if(fEvType==10 && fSODReading){
402 //printf("\n-> AliZDCRawStream::Next() - fBuffer[%d] = %x\n",fPosition, fBuffer);
404 if(fPosition>fDataOffset){
405 if((fBuffer&0xff000001) == 0xff000001){ // ************** Mapping
406 if(fPosition==(fDataOffset+1)){
407 printf("\n\n ------ AliZDCRawStream -> Reading mapping from StartOfData event ------\n");
408 fCurrentCh=0; fCurrScCh=0;
411 printf(" ------ AliZDCRawStream -> End of ZDC StartOfData event ------\n\n");
412 //printf("AliZDCRawStream: fSODReading after SOD reading set to %d\n", fSODReading);
416 else if((fBuffer&0xff000002) == 0xff000002){ // ************** Threshold settings
420 else if((fBuffer&0x80000000)>>31 == 1){ // --- Mapping header
421 fIsHeaderMapping = kTRUE;
422 fADCModule = ((fBuffer & 0x7f000000)>>24); // GEO address!!!
423 fModType = ((fBuffer & 0x7ff00)>>8);
424 fADCNChannels = (fBuffer & 0xff); // # of channels following the header
426 printf(" ******** GEO %d, mod. type %d, #ch. %d\n",fADCModule,fModType,fADCNChannels);
428 else if((fBuffer&0x80000000)>>31 == 0){ // --- Mapping channel
429 fADCChannel = ((fBuffer & 0x3fff0000)>>16);
430 fCabledSignal = (fBuffer&0xffff);
432 if(fModType==1){ // ******** ADCs ********************************
434 if((fBuffer&0x40000000)>>30==0){ // high range chain ADC
435 fIsChMapping = kTRUE;
436 fMapADC[fCurrentCh][0] = fADCModule;
437 fMapADC[fCurrentCh][1] = fADCChannel;
438 fMapADC[fCurrentCh][2] = fCabledSignal;
439 // - No. of channels on
442 // Determining detector and sector
443 // -----------------------------------------
444 // For the decoding of the following lines
445 // look the enum in AliZDCRawStream.h file
446 // -----------------------------------------
447 if((fCabledSignal>=2 && fCabledSignal<=6) || (fCabledSignal>=26 && fCabledSignal<=30)
448 || fCabledSignal==24 || fCabledSignal==48){
449 fMapADC[fCurrentCh][3] = 4; //ZNA
451 if(fCabledSignal==2 || fCabledSignal==26) fMapADC[fCurrentCh][4]=0;
452 else if(fCabledSignal==3 || fCabledSignal==27) fMapADC[fCurrentCh][4]=1;
453 else if(fCabledSignal==4 || fCabledSignal==28) fMapADC[fCurrentCh][4]=2;
454 else if(fCabledSignal==5 || fCabledSignal==29) fMapADC[fCurrentCh][4]=3;
455 else if(fCabledSignal==6 || fCabledSignal==30) fMapADC[fCurrentCh][4]=4;
456 else if(fCabledSignal==24 || fCabledSignal==48) fMapADC[fCurrentCh][4]=5; //Reference PTM
458 else if((fCabledSignal>=7 && fCabledSignal<=11) || (fCabledSignal>=31 && fCabledSignal<=35)){
459 fMapADC[fCurrentCh][3] = 5; //ZPA
461 if(fCabledSignal==7 || fCabledSignal==31) fMapADC[fCurrentCh][4]=0;
462 else if(fCabledSignal==8 || fCabledSignal==32) fMapADC[fCurrentCh][4]=1;
463 else if(fCabledSignal==9 || fCabledSignal==33) fMapADC[fCurrentCh][4]=2;
464 else if(fCabledSignal==10 || fCabledSignal==34) fMapADC[fCurrentCh][4]=3;
465 else if(fCabledSignal==11 || fCabledSignal==35) fMapADC[fCurrentCh][4]=4;
467 else if((fCabledSignal>=12 && fCabledSignal<=16) || (fCabledSignal>=36 && fCabledSignal<=40)
468 || fCabledSignal==25 || fCabledSignal==49){
469 fMapADC[fCurrentCh][3] = 1; //ZNC
471 if(fCabledSignal==12 || fCabledSignal==36) fMapADC[fCurrentCh][4]=0;
472 else if(fCabledSignal==13 || fCabledSignal==37) fMapADC[fCurrentCh][4]=1;
473 else if(fCabledSignal==14 || fCabledSignal==38) fMapADC[fCurrentCh][4]=2;
474 else if(fCabledSignal==15 || fCabledSignal==39) fMapADC[fCurrentCh][4]=3;
475 else if(fCabledSignal==16 || fCabledSignal==40) fMapADC[fCurrentCh][4]=4;
476 else if(fCabledSignal==25 || fCabledSignal==49) fMapADC[fCurrentCh][4]=5; //Reference PTM
478 else if((fCabledSignal>=17 && fCabledSignal<=21) || (fCabledSignal>=41 && fCabledSignal<=45)){
479 fMapADC[fCurrentCh][3] = 2; //ZPC
481 if(fCabledSignal==17 || fCabledSignal==41) fMapADC[fCurrentCh][4]=0;
482 else if(fCabledSignal==18 || fCabledSignal==42) fMapADC[fCurrentCh][4]=1;
483 else if(fCabledSignal==19 || fCabledSignal==43) fMapADC[fCurrentCh][4]=2;
484 else if(fCabledSignal==20 || fCabledSignal==44) fMapADC[fCurrentCh][4]=3;
485 else if(fCabledSignal==21 || fCabledSignal==45) fMapADC[fCurrentCh][4]=4;
487 else if(fCabledSignal==22 || fCabledSignal==23 || fCabledSignal==46 || fCabledSignal==47){
488 fMapADC[fCurrentCh][3] = 3; // ZEM
490 if(fCabledSignal==22 || fCabledSignal==46) fMapADC[fCurrentCh][4]=1;
491 else if(fCabledSignal==23 || fCabledSignal==47) fMapADC[fCurrentCh][4]=2;
494 //printf("\tADC mod. %d ch. %d signal %d ",fADCModule,fADCChannel,fCabledSignal);
495 //printf(" det. %d sec. %d\n",fMapADC[fCurrentCh][3],fMapADC[fCurrentCh][4]);
499 } // high range channels
500 }// ModType=1 (ADC mapping)
501 else if(fModType==2){ // ******** VME scaler **************************
502 fIsChMapping = kTRUE;
503 fScalerMap[fCurrScCh][0] = fADCModule;
504 fScalerMap[fCurrScCh][1] = fADCChannel;
505 fScalerMap[fCurrScCh][2] = fCabledSignal;
507 // Determining detector and sector
508 // -----------------------------------------
509 // For the decoding of the following lines
510 // look the enum in AliZDCRawStream.h file
511 // -----------------------------------------
512 // NOT CONSIDERING OUT OF TIME OR REFERENCE SIGNALS FOR SCALER!!!!!
513 if(fCabledSignal>=2 && fCabledSignal<=6){
514 fScalerMap[fCurrScCh][3] = 4; //ZNA
516 if(fCabledSignal==2 ) fScalerMap[fCurrScCh][4]=0;
517 else if(fCabledSignal==3) fScalerMap[fCurrScCh][4]=1;
518 else if(fCabledSignal==4) fScalerMap[fCurrScCh][4]=2;
519 else if(fCabledSignal==5) fScalerMap[fCurrScCh][4]=3;
520 else if(fCabledSignal==6) fScalerMap[fCurrScCh][4]=4;
522 else if(fCabledSignal>=7 && fCabledSignal<=11){
523 fScalerMap[fCurrScCh][3] = 5; //ZPA
525 if(fCabledSignal==7 ) fScalerMap[fCurrScCh][4]=0;
526 else if(fCabledSignal==8) fScalerMap[fCurrScCh][4]=1;
527 else if(fCabledSignal==9) fScalerMap[fCurrScCh][4]=2;
528 else if(fCabledSignal==10) fScalerMap[fCurrScCh][4]=3;
529 else if(fCabledSignal==11) fScalerMap[fCurrScCh][4]=4;
531 else if(fCabledSignal>=12 && fCabledSignal<=16){
532 fScalerMap[fCurrScCh][3] = 1; //ZNC
534 if(fCabledSignal==12) fScalerMap[fCurrScCh][4]=0;
535 else if(fCabledSignal==13) fScalerMap[fCurrScCh][4]=1;
536 else if(fCabledSignal==14) fScalerMap[fCurrScCh][4]=2;
537 else if(fCabledSignal==15) fScalerMap[fCurrScCh][4]=3;
538 else if(fCabledSignal==16) fScalerMap[fCurrScCh][4]=4;
540 else if(fCabledSignal>=17 && fCabledSignal<=21){
541 fScalerMap[fCurrScCh][3] = 2; //ZPC
543 if(fCabledSignal==17) fScalerMap[fCurrScCh][4]=0;
544 else if(fCabledSignal==18) fScalerMap[fCurrScCh][4]=1;
545 else if(fCabledSignal==19) fScalerMap[fCurrScCh][4]=2;
546 else if(fCabledSignal==20) fScalerMap[fCurrScCh][4]=3;
547 else if(fCabledSignal==21) fScalerMap[fCurrScCh][4]=4;
549 else if(fCabledSignal==22 || fCabledSignal==23){
550 fScalerMap[fCurrScCh][3] = 3; // ZEM
552 if(fCabledSignal==22 ) fScalerMap[fCurrScCh][4]=1;
553 else if(fCabledSignal==23) fScalerMap[fCurrScCh][4]=2;
556 //printf("\t VME scaler mod. %d ch. %d, signal %d",fScalerMap[fCurrScCh][0],fADCChannel,fCabledSignal);
557 //if(fCabledSignal!=0 && fCabledSignal!=1) printf(" det. %d sec. %d\n",fScalerMap[fCurrScCh][3],fScalerMap[fCurrScCh][4]);
558 //else printf(" Signal void/not connected\n");
562 else if(fModType==3){ // **** scalers from trigger card
563 //printf("\t Trigger scaler mod. %d ch. %d, signal %d\n",fADCModule,fADCChannel,fCabledSignal);
565 else if(fModType==4){ // **** trigger history from trigger card
566 //printf("\t Trigger card ch. %d, signal %d\n",fADCChannel,fCabledSignal);
568 else if(fModType==5){ // **** pattern unit
569 //printf("\t P.U. mod. %d ch. %d, signal %d\n",fADCModule,fADCChannel,fCabledSignal);
571 }//reading channel mapping
577 // -------------------------------------------
579 // -------------------------------------------
580 if(fPosition<fDeadfaceOffset){
584 else if(fPosition==fDeadfaceOffset){
585 if(fBuffer != 0xdeadface){
586 AliWarning(" NO deadface after DARC data");
587 fRawReader->AddMajorErrorLog(kDARCError);
595 // -------------------------------------------
596 // --- DARC global data
597 // -------------------------------------------
598 else if(fPosition>fDeadfaceOffset && fPosition<fDeadbeefOffset){
602 else if(fPosition==fDeadbeefOffset){
603 if(fBuffer != 0xdeadbeef){
604 AliWarning(" NO deadbeef after DARC global data");
605 fRawReader->AddMajorErrorLog(kDARCError);
615 // -------------------------------------------
617 // --- ADCs + VME scaler + trigger card + P.U.
618 // -------------------------------------------
619 else if(fPosition>=fDataOffset){
621 //printf("AliZDCRawStream: fSODReading = %d\n", fSODReading);
622 if(!fSODReading && !fIsMapRead) ReadChMap();
624 // Not valid datum before the event
625 // there MUST be a NOT valid datum before the event!!!
626 if(fPosition==fDataOffset){
627 //printf("\t **** ZDC data begin ****\n");
628 if((fBuffer & 0x07000000) != 0x06000000){
629 fRawReader->AddMajorErrorLog(kZDCDataError);
631 else if((fBuffer & 0x07000000) == 0x06000001){ // Corrupted event!!!
632 fIsADCEventGood = kFALSE;
636 // If the not valid datum isn't followed by the 1st ADC header
637 // the event is corrupted (i.e., 2 gates arrived before trigger)
638 else if(fPosition==fDataOffset+1){
639 if((fBuffer & 0x07000000) != 0x02000000){
640 AliWarning("ZDC ADC -> The not valid datum is NOT followed by an ADC header!");
641 fRawReader->AddMajorErrorLog(kZDCDataError);
642 fIsADCEventGood = kFALSE;
648 // Get geo address of current word
649 // - ADC GEO = 0, 1, 2, 3
650 // - VME scaler GEO = 8
652 // - Trigger card scales GEO = 30
653 // - Trigger card history GEO = 31
654 fADCModule = (Int_t) ((fBuffer & 0xf8000000)>>27);
656 // ************************************ ADC MODULES ************************************
657 if(fADCModule>=kFirstADCGeo && fADCModule<=kLastADCGeo){
659 if((fBuffer & 0x07000000) == 0x02000000){
660 fIsADCHeader = kTRUE;
661 fADCNChannels = ((fBuffer & 0x00003f00)>>8);
662 //printf(" AliZDCRawStream -> ADC HEADER: mod.%d has %d ch. \n",fADCModule,fADCNChannels);
665 else if((fBuffer & 0x07000000) == 0x00000000){
666 fIsADCDataWord = kTRUE;
667 fADCChannel = ((fBuffer & 0x1e0000) >> 17);
668 fADCGain = ((fBuffer & 0x10000) >> 16);
669 fADCValue = (fBuffer & 0xfff);
671 //printf(" AliZDCRawStream -> ADC DATUM: mod. %d ch. %d gain %d value %d\n",
672 // fADCModule,fADCChannel,fADCGain,fADCValue);
674 // Checking if the channel map for the ADCs has been provided/read
675 if(fMapADC[0][0]==-1){
676 printf("\t ATTENTION!!! No ADC mapping has been found/provided!!!\n");
680 /*for(Int_t ci=0; ci<kNch; ci++){
681 printf(" %d mod %d ch %d det %d sec %d\n",ci,fMapADC[ci][0],
682 fMapADC[ci][1], fMapADC[ci][3], fMapADC[ci][4]);
685 // Scan of the map to assign the correct volumes
686 Int_t foundMapEntry = kFALSE;
687 for(Int_t k=0; k<kNch; k++){
688 if(fADCModule==fMapADC[k][0] && fADCChannel==fMapADC[k][1]){
689 fSector[0] = fMapADC[k][3];
690 fSector[1] = fMapADC[k][4];
691 foundMapEntry = kTRUE;
695 if(foundMapEntry==kFALSE){
696 AliWarning(Form(" No valid entry in ADC mapping for raw data %d ADCmod. %d ch. %d\n",
697 fPosition,fADCModule,fADCChannel));
700 //printf("AliZDCRawStream -> ADCmod. %d ch. %d -> det %d sec %d\n",
701 // fADCModule,fADCChannel,fSector[0],fSector[1]);
704 if(foundMapEntry==kTRUE){
705 if(fSector[0]<1 || fSector[0]>5){
706 AliWarning(Form(" No valid detector assignment: %d",fSector[0]));
707 fRawReader->AddMajorErrorLog(kInvalidSector);
710 if(fSector[1]<0 || fSector[1]>5){
711 AliWarning(Form(" No valid sector assignment: %d",fSector[1]));
712 fRawReader->AddMajorErrorLog(kInvalidSector);
715 if(fADCModule<0 || fADCModule>3){
716 AliError(Form(" No valid ADC module: %d",fADCModule));
717 fRawReader->AddMajorErrorLog(kInvalidADCModule);
721 // Checking the underflow and overflow bits
722 if(fBuffer & 0x1000) fIsUnderflow = kTRUE;
723 else if (fBuffer & 0x2000) fIsOverflow = kTRUE;
727 else if((fBuffer & 0x07000000) == 0x04000000){
729 //printf(" AliZDCRawStream -> EOB --------------------------\n");
732 // ********************************* VME SCALER HEADER *********************************
733 else if(fADCModule == kScalerGeo){
734 if(fBuffer & 0x04000000 && fIsScHeaderRead==kFALSE){ // *** Scaler header
735 fScGeo = (fBuffer & 0xf8000000)>>27;
736 fScNWords = (fBuffer & 0x00fc0000)>>18;
737 fScTriggerSource = (fBuffer & 0x00030000)>>16;
738 fScTriggerNumber = (fBuffer & 0x0000ffff);
739 fIsScHeaderRead = kTRUE;
740 fScStartCounter = fPosition;
742 //printf(" AliZDCRawStream -> VME SCALER HEADER: geo %d Nwords %d TrigSource %d TrigNo. %d\n",
743 // fScGeo,fScNWords,fScTriggerSource,fScTriggerNumber);
745 else if(!(fBuffer & 0x04000000)){
746 fIsScEventGood = kFALSE;
749 // *********************************** PATTERN UNIT ***********************************
750 else if(fADCModule == kPUGeo){
751 // still to be implemented!!! Not yet in data!!!
752 fDetPattern = (fBuffer & 0x0000003f);
754 //printf(" AliZDCRawStream -> Pattern Unit\n");
757 // ******************************** TRIGGER CARD COUNTS ********************************
758 else if(fADCModule == kTrigScales){
759 if(fIsTriggerScaler == kFALSE){
760 fTrigCountNWords = (Int_t) ((fBuffer & 0xfc0000)>>17);
761 fTrigCountStart = fPosition;
762 fIsTriggerScaler = kTRUE;
765 //printf(" AliZDCRawStream -> Trigger Scaler header\n");
767 // ********************************** TRIGGER HISTORY **********************************
768 else if(fADCModule == kTrigHistory){
769 if(fIsTriggerHistory == kFALSE){
770 fTrigHistNWords = (Int_t) ((fBuffer & 0xfc0000)>>17);
771 fTrigHistStart = fPosition;
772 fIsTriggerHistory = kTRUE;
775 //printf(" AliZDCRawStream -> Trigger History header\n");
778 // ********************************** VME SCALER DATA **********************************
779 // Reading VME scaler data
780 if(fIsScHeaderRead && fPosition>=fScStartCounter+1){ // *** Scaler word
781 fADCModule = kScalerGeo;
782 fScEvCounter = fBuffer;
783 Int_t nWords = (Int_t) (fScNWords);
784 if(fPosition == fScStartCounter+nWords) fIsScHeaderRead = kFALSE;
786 //printf(" AliZDCRawStream -> scaler datum %d", fScEvCounter);
788 // ******************************** TRIGGER SCALER DATA ********************************
789 // Reading trigger scaler data
790 if(fIsTriggerScaler && fPosition>=fTrigCountStart+1){
791 fADCModule = kTrigScales;
792 if(fPosition == fTrigCountStart+1) fMBTrigInput = fBuffer;
793 else if(fPosition == fTrigCountStart+2) fCentralTrigInput = fBuffer;
794 else if(fPosition == fTrigCountStart+3) fSCentralTrigInput = fBuffer;
795 else if(fPosition == fTrigCountStart+4) fEMDTrigInput = fBuffer;
796 else if(fPosition == fTrigCountStart+5) fL0Received = fBuffer;
797 else if(fPosition == fTrigCountStart+6) fMBtrig2CTP = fBuffer;
798 else if(fPosition == fTrigCountStart+7) fCentralTrig2CTP = fBuffer;
799 else if(fPosition == fTrigCountStart+8) fSCentralTrig2CTP = fBuffer;
800 else if(fPosition == fTrigCountStart+9){
801 fEMDTrig2CTP = fBuffer;
802 fIsTriggerScaler = kFALSE;
805 //printf(" AliZDCRawStream -> Trigger Scaler datum %d\n", fPosition-fTrigCountStart);
807 // ******************************* TRIGGER HISTORY WORDS ******************************
808 // Reading trigger history
809 if(fIsTriggerHistory && fPosition>=fTrigHistStart+1){
810 fADCModule = kTrigHistory;
811 if(fPosition == fTrigHistStart+1){
812 fPileUpBit1stWord = (fBuffer & 0x80000000) >> 31;
813 fL0Bit1stWord = (fBuffer & 0x40000000) >> 30;
814 fCentralTrigHist = (fBuffer & 0x3fff8000) >> 14;
815 fMBTrigHist = (fBuffer & 0x00007fff);
817 fCPTInput[0] = (fBuffer & 0x00000080) >> 6; // MB bit
818 fCPTInput[1] = (fBuffer & 0x00400000) >> 21; // CENTRAL bit
821 else if(fPosition == fTrigHistStart+fTrigHistNWords){
822 fPileUpBit2ndWord = (fBuffer & 0x80000000) >> 31;
823 fL0Bit2ndWord = (fBuffer & 0x40000000) >> 30;
824 fSCentralTrigHist = (fBuffer & 0x3fff8000) >> 14;
825 fEMDTrigHist = (fBuffer & 0x00007fff);
827 fCPTInput[2] = (fBuffer & 0x00000080) >> 6; // SEMICENTRAL bit
828 fCPTInput[3] = (fBuffer & 0x00400000) >> 21; // EMD bit
830 fIsTriggerHistory = kFALSE;
832 // Checking if the event is good
833 // (1) both history word pile up bits must be = 0
834 if(fPileUpBit1stWord==0 && fPileUpBit2ndWord==0) fIsPileUpEvent = kFALSE;
836 fIsPileUpEvent = kTRUE;
837 printf(" AliZDCRawStream -> PILE UP EVENT: bitPileUp0 %d bitPileUp1 %d\n",
838 fPileUpBit1stWord, fPileUpBit2ndWord);
840 // (2) both history word L0 bits must be = 1
841 if(fL0Bit1stWord==1 && fL0Bit2ndWord==1) fIsL0BitSet = kTRUE;
843 fIsL0BitSet = kFALSE;
844 printf(" AliZDCRawStream -> L0 wrongly set: bitL0word0 %d bitL0word1 %d\n",
845 fL0Bit1stWord, fL0Bit2ndWord);
849 //printf(" AliZDCRawStream -> Trigger history word %d\n", fPosition-fTrigHistStart);
859 //_____________________________________________________________________________
860 AliCDBStorage* AliZDCRawStream::SetStorage(const char *uri)
862 // Setting the storage
864 AliCDBStorage *storage = AliCDBManager::Instance()->GetStorage(uri);
870 //_____________________________________________________________________________
871 AliZDCChMap* AliZDCRawStream::GetChMap() const
874 // Getting calibration object for ZDC
876 AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/ChMap");
877 if(!entry) AliFatal("No calibration data loaded!");
879 AliZDCChMap *calibdata = dynamic_cast<AliZDCChMap*> (entry->GetObject());
880 if(!calibdata) AliFatal("Wrong calibration object in calibration file!");