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),
48 fIsADCDataWord(kFALSE),
53 fDARCEvBlockLenght(0),
54 fDARCBlockAttributes(0),
70 fIsScEventGood(kTRUE),
71 fIsScHeaderRead(kFALSE),
78 // Create an object to read ZDC raw digits
80 fRawReader->Select("ZDC");
83 for(Int_t i=0; i<kNch; i++){
84 for(Int_t j=0; j<5; j++) fMapADC[i][j]=-1;
89 //_____________________________________________________________________________
90 AliZDCRawStream::AliZDCRawStream(const AliZDCRawStream& stream) :
92 fRawReader(stream.fRawReader),
93 fBuffer(stream.GetRawBuffer()),
94 fEvType(stream.fEvType),
95 fPosition(stream.fPosition),
96 fIsCalib(stream.fIsCalib),
97 fIsDARCHeader(stream.fIsDARCHeader),
98 fIsChMapping(stream.fIsChMapping),
99 fIsADCDataWord(stream.fIsADCDataWord),
100 fIsADCHeader(stream.fIsADCHeader),
101 fIsADCEOB(stream.fIsADCEOB),
102 fSODReading(stream.fSODReading),
103 fIsMapRead(stream.fIsMapRead),
104 fDARCEvBlockLenght(stream.fDARCEvBlockLenght),
105 fDARCBlockAttributes(stream.fDARCBlockAttributes),
106 fDeadfaceOffset(stream.GetDeadfaceOffset()),
107 fDeadbeefOffset(stream.GetDeadbeefOffset()),
108 fDataOffset(stream.GetDataOffset()),
109 fModType(stream.GetModType()),
110 fADCModule(stream.GetADCModule()),
111 fADCNChannels(stream.GetADCNChannels()),
112 fADCChannel(stream.GetADCChannel()),
113 fADCValue(stream.GetADCValue()),
114 fADCGain(stream.GetADCGain()),
115 fIsUnderflow(stream.fIsUnderflow),
116 fIsOverflow(stream.fIsOverflow),
117 fScGeo(stream.GetScGeo()),
118 fScNWords(stream.GetScNWords()),
119 fScTriggerSource(stream.GetScTriggerSource()),
120 fScTriggerNumber(stream.fScTriggerNumber),
121 fIsScEventGood(stream.fIsScEventGood),
122 fIsScHeaderRead(stream.fIsScHeaderRead),
123 fScStartCounter(stream.fScStartCounter),
124 fScEvCounter(stream.fScEvCounter),
125 fNChannelsOn(stream.fNChannelsOn),
126 fNConnCh(stream.fNConnCh),
127 fCabledSignal(stream.GetCabledSignal())
131 for(Int_t j=0; j<2; j++) fSector[j] = stream.GetSector(j);
132 for(Int_t i=0; i<kNch; i++){
133 for(Int_t j=0; j<5; j++) fMapADC[i][j] = stream.fMapADC[i][j];
137 //_____________________________________________________________________________
138 AliZDCRawStream& AliZDCRawStream::operator = (const AliZDCRawStream&
141 // Assignment operator
142 Fatal("operator =", "assignment operator not implemented");
146 //_____________________________________________________________________________
147 AliZDCRawStream::~AliZDCRawStream()
153 //_____________________________________________________________________________
154 void AliZDCRawStream::ReadChMap()
156 // Reading channel map
158 printf("\n\t Reading ZDC ADC mapping from OCDB\n");
159 AliZDCChMap * chMap = GetChMap();
161 for(Int_t i=0; i<kNch; i++){
162 fMapADC[i][0] = chMap->GetADCModule(i);
163 fMapADC[i][1] = chMap->GetADCChannel(i);
165 fMapADC[i][3] = chMap->GetDetector(i);
166 fMapADC[i][4] = chMap->GetSector(i);
171 //_____________________________________________________________________________
172 void AliZDCRawStream::ReadCDHHeader()
175 const AliRawDataHeader* header = fRawReader->GetDataHeader();
177 AliError(" No CDH in raw data streaming");
178 fRawReader->AddMajorErrorLog(kCDHError);
182 //printf("\t AliZDCRawStream::ReadCDHHeader -> Data Size = %d\n",fRawReader->GetDataSize());
184 fDARCEvBlockLenght = header->fSize;
185 //printf("\t AliZDCRawStream::ReadCDHHeader -> fDARCEvBlockLenght = %d\n",fDARCEvBlockLenght);
187 UChar_t message = header->GetAttributes();
188 //printf("\t AliZDCRawStream::ReadCDHHeader -> Attributes %x\n",message);
190 if(message & 0x0){ // PHYSICS RUN
191 //printf("\t PHYSICS RUN raw data found\n");
193 else if(message & 0x10){ // COSMIC RUN
194 //printf("\t STANDALONE_COSMIC RUN raw data found\n");
196 else if(message & 0x20){ // PEDESTAL RUN
197 //printf("\t STANDALONE_PEDESTAL RUN raw data found\n");
199 else if(message & 0x30){ // LASER RUN
200 //printf("\t STANDALONE_LASER RUN raw data found\n");
202 else if(message & 0x40){ // CALIBRATION_CENTRAL RUN
203 //printf("\t CALIBRATION_CENTRAL RUN raw data found\n");
205 else if(message & 0x50){ // CALIBRATION_SEMICENTRAL
206 //printf("\t CALIBRATION_SEMICENTRAL RUN raw data found\n");
208 else if(message & 0x60){ // CALIBRATION_MB
209 //printf("\t CALIBRATION_MB RUN raw data found\n");
211 else if(message & 0x70){ // CALIBRATION_EMD
212 //printf("\t CALIBRATION_EMD RUN raw data found\n");
215 if(header->GetL1TriggerMessage() & 0x1){ // Calibration bit set in CDH
218 //printf("\t AliZDCRawStream::ReadCDHHeader -> L1TriggerMessage %x\n",header->GetL1TriggerMessage());
219 //printf("\t AliZDCRawStream::ReadCDHHeader -> Calibration bit = %d\n",fIsCalib);
221 UInt_t status = header->GetStatus();
222 //printf("\t AliZDCRawStream::ReadCDHHeader -> status = %d\n",status);
223 if((status & 0x000f) == 0x0001){
224 AliDebug(2,"CDH -> DARC trg0 overlap error");
225 fRawReader->AddMajorErrorLog(kDARCError);
227 if((status & 0x000f) == 0x0002){
228 AliDebug(2,"CDH -> DARC trg0 missing error");
229 fRawReader->AddMajorErrorLog(kDARCError);
231 if((status & 0x000f) == 0x0004){
232 AliDebug(2,"CDH -> DARC data parity error");
233 fRawReader->AddMajorErrorLog(kDARCError);
235 if((status & 0x000f) == 0x0008){
236 AliDebug(2,"CDH -> DARC ctrl parity error");
237 fRawReader->AddMajorErrorLog(kDARCError);
240 if((status & 0x00f0) == 0x0010){
241 AliDebug(2,"CDH -> DARC trg unavailable");
242 fRawReader->AddMajorErrorLog(kDARCError);
244 if((status & 0x00f0) == 0x0020){
245 AliWarning("CDH -> DARC FEE error");
246 fRawReader->AddMajorErrorLog(kDARCError);
249 if((status & 0x0f00) == 0x0200){
250 AliDebug(2,"CDH -> DARC L1 time violation");
251 fRawReader->AddMajorErrorLog(kDARCError);
253 if((status & 0x0f00) == 0x0400){
254 AliWarning("CDH -> DARC L2 time-out");
255 fRawReader->AddMajorErrorLog(kDARCError);
257 if((status & 0x0f00) == 0x0800){
258 AliWarning("CDH -> DARC prepulse time violation");
259 fRawReader->AddMajorErrorLog(kDARCError);
262 if((status & 0xf000) == 0x1000){
263 AliDebug(2,"CDH -> DARC other error");
264 fRawReader->AddMajorErrorLog(kDARCError);
268 fIsDARCHeader = kTRUE;
271 //_____________________________________________________________________________
272 Bool_t AliZDCRawStream::Next()
274 // Read the next raw digit
275 // Returns kFALSE if there is no digit left
277 if(!fRawReader->ReadNextInt((UInt_t&) fBuffer)) return kFALSE;
279 Bool_t readScaler = kFALSE;
280 fIsChMapping = kFALSE; fIsADCHeader = kFALSE;
281 fIsADCDataWord = kFALSE; fIsADCEOB = kFALSE;
282 fIsUnderflow = kFALSE;
283 fIsOverflow = kFALSE;
284 fSector[0] = fSector[1] = -1;
286 fEvType = fRawReader->GetType();
288 //printf("\n\t AliZDCRawStream::Next() -> ev. type %d\n",fEvType);
289 //printf("\n AliZDCRawStream::Next() - fBuffer[%d] = %x\n",fPosition, fBuffer);
292 //if(fEvType==7 || fEvType ==8){ //Physics or calibration event
299 // *** End of ZDC event
300 if(fBuffer == 0xcafefade){
301 //printf("\n-> AliZDCRawStream::Next() ***** End of ZDC event *****\n\n");
305 // -------------------------------------------
307 // -------------------------------------------
308 // If the CDH has been read then
309 // the DARC header must follow
311 //printf("\t ---- DARC header ----\n");
314 fDeadbeefOffset = 25;
321 fDataOffset = 1+fDeadbeefOffset;
322 fIsDARCHeader = kFALSE;
326 // -------------------------------------------
327 // --- Start of data event
328 // --- decoding mapping of connected ADC ch.
329 // -------------------------------------------
330 // In the SOD event ADC ch. mapping is written
331 if(fEvType==10 && fSODReading){
332 //printf("\n-> AliZDCRawStream::Next() - fBuffer[%d] = %x\n",fPosition, fBuffer);
334 if(fPosition>fDataOffset){
335 if((fBuffer&0xff000000) == 0xff000000){
336 if(fPosition==(fDataOffset+1)){
337 printf("\n\n\t AliZDCRawStream -> Reading mapping from StartOfData event\n");
341 //printf("\n\t AliZDCRawStream -> End of ZDC StartOfData event\n\n");
342 //printf("AliZDCRawStream: fSODReading after SOD reading set to %d\n", fSODReading);
346 else if((fBuffer&0x80000000)>>31 == 1){
347 // Mapping identification
348 fADCModule = ((fBuffer & 0x7f000000)>>24);
349 fModType = ((fBuffer & 0x7ff00)>>8);
350 fADCNChannels = (fBuffer & 0xff);
352 printf(" ******** GEO %d, mod. type %d, #ch. %d\n",fADCModule,fModType,fADCNChannels);
354 else if(fModType==1 && (fBuffer&0x80000000)>>31 == 0){
356 if((fBuffer&0x40000000)>>30==0){ // high range chain ADC
357 fIsChMapping = kTRUE;
358 fADCChannel = ((fBuffer & 0x3fff0000)>>16);
359 fCabledSignal = (fBuffer&0xffff);
360 //printf("\tADC ch. %d, signal %d\n",fADCChannel,fCabledSignal);
362 fMapADC[fNConnCh][0] = fADCModule;
363 fMapADC[fNConnCh][1] = fADCChannel;
364 fMapADC[fNConnCh][2] = fCabledSignal;
366 // Determining detector and sector
367 // -----------------------------------------
368 // For the decoding of the following lines
369 // look the enum in AliZDCRawStream.h file
370 // -----------------------------------------
371 if((fCabledSignal>=2 && fCabledSignal<=6) || (fCabledSignal>=26 && fCabledSignal<=30)
372 || fCabledSignal==24 || fCabledSignal==48){
373 fMapADC[fNConnCh][3] = 4; //ZNA
375 if(fCabledSignal==2 || fCabledSignal==26) fMapADC[fNConnCh][4]=0;
376 else if(fCabledSignal==3 || fCabledSignal==27) fMapADC[fNConnCh][4]=1;
377 else if(fCabledSignal==4 || fCabledSignal==28) fMapADC[fNConnCh][4]=2;
378 else if(fCabledSignal==5 || fCabledSignal==29) fMapADC[fNConnCh][4]=3;
379 else if(fCabledSignal==6 || fCabledSignal==30) fMapADC[fNConnCh][4]=4;
380 else if(fCabledSignal==24 || fCabledSignal==48) fMapADC[fNConnCh][4]=5;
382 else if((fCabledSignal>=7 && fCabledSignal<=11) || (fCabledSignal>=31 && fCabledSignal<=35)){
383 fMapADC[fNConnCh][3] = 5; //ZPA
385 if(fCabledSignal==7 || fCabledSignal==31) fMapADC[fNConnCh][4]=0;
386 else if(fCabledSignal==8 || fCabledSignal==32) fMapADC[fNConnCh][4]=1;
387 else if(fCabledSignal==9 || fCabledSignal==33) fMapADC[fNConnCh][4]=2;
388 else if(fCabledSignal==10 || fCabledSignal==34) fMapADC[fNConnCh][4]=3;
389 else if(fCabledSignal==11 || fCabledSignal==35) fMapADC[fNConnCh][4]=4;
391 else if((fCabledSignal>=12 && fCabledSignal<=16) || (fCabledSignal>=36 && fCabledSignal<=40)
392 || fCabledSignal==25 || fCabledSignal==49){
393 fMapADC[fNConnCh][3] = 1; //ZNC
395 if(fCabledSignal==12 || fCabledSignal==36) fMapADC[fNConnCh][4]=0;
396 else if(fCabledSignal==13 || fCabledSignal==37) fMapADC[fNConnCh][4]=1;
397 else if(fCabledSignal==14 || fCabledSignal==38) fMapADC[fNConnCh][4]=2;
398 else if(fCabledSignal==15 || fCabledSignal==39) fMapADC[fNConnCh][4]=3;
399 else if(fCabledSignal==16 || fCabledSignal==40) fMapADC[fNConnCh][4]=4;
400 else if(fCabledSignal==25 || fCabledSignal==49) fMapADC[fNConnCh][4]=5;
402 else if((fCabledSignal>=17 && fCabledSignal<=21) || (fCabledSignal>=41 && fCabledSignal<=45)){
403 fMapADC[fNConnCh][3] = 2; //ZPC
405 if(fCabledSignal==17 || fCabledSignal==41) fMapADC[fNConnCh][4]=0;
406 else if(fCabledSignal==18 || fCabledSignal==42) fMapADC[fNConnCh][4]=1;
407 else if(fCabledSignal==19 || fCabledSignal==43) fMapADC[fNConnCh][4]=2;
408 else if(fCabledSignal==20 || fCabledSignal==44) fMapADC[fNConnCh][4]=3;
409 else if(fCabledSignal==21 || fCabledSignal==45) fMapADC[fNConnCh][4]=4;
411 else if(fCabledSignal==22 || fCabledSignal==23 || fCabledSignal==46 || fCabledSignal==47){
412 fMapADC[fNConnCh][3] = 3;
414 if(fCabledSignal==22 || fCabledSignal==46) fMapADC[fNConnCh][4]=1;
415 else if(fCabledSignal==23 || fCabledSignal==47) fMapADC[fNConnCh][4]=2;
420 // Protection manually set since it returned:
421 // RawData48 mod. 3 ch. 2048 signal 515
422 // to be checked with Pietro!!!!!!!!!!!!!!!!!!!!!!!
423 AliDebug(2," No. of cabled channels > kNch !!!");
428 }// ModType=1 (ADC mapping)
429 //else if(fModType!=1){
437 // -------------------------------------------
439 // -------------------------------------------
440 if(fPosition<fDeadfaceOffset){
444 else if(fPosition==fDeadfaceOffset){
445 if(fBuffer != 0xdeadface){
446 AliWarning(" NO deadface after DARC data");
447 fRawReader->AddMajorErrorLog(kDARCError);
455 // -------------------------------------------
456 // --- DARC global data
457 // -------------------------------------------
458 else if(fPosition>fDeadfaceOffset && fPosition<fDeadbeefOffset){
462 else if(fPosition==fDeadbeefOffset){
463 if(fBuffer != 0xdeadbeef){
464 AliWarning(" NO deadbeef after DARC global data");
465 fRawReader->AddMajorErrorLog(kDARCError);
473 // -------------------------------------------
475 // --- ADC buffer + scaler
476 // -------------------------------------------
477 else if(fPosition>=fDataOffset){
479 //printf("AliZDCRawStream: fSODReading = %d\n", fSODReading);
480 if(!fSODReading && !fIsMapRead) ReadChMap();
482 // Not valid datum before the event
483 // there MUST be a NOT valid datum before the event!!!
484 if(fPosition==fDataOffset){
485 //printf("\t **** ZDC data begin ****\n");
486 if((fBuffer & 0x07000000) != 0x06000000){
487 fRawReader->AddMajorErrorLog(kZDCDataError);
490 //printf(" AliZDCRawStream -> Not valid datum in ADC %d,"
491 // "position %d in word data buffer\n",fADCModule,fPosition);
495 // If the not valid datum isn't followed by the 1st ADC header
496 // the event is corrupted (i.e., 2 gates arrived before trigger)
497 else if(fPosition==fDataOffset+1){
498 if((fBuffer & 0x07000000) != 0x02000000){
499 AliWarning("ZDC ADC -> The not valid datum is NOT followed by an ADC header!");
500 fRawReader->AddMajorErrorLog(kZDCDataError);
504 // Get geo address of current word to determine if:
505 // - it is an ADC word (geo address <= 3)
506 // - it is a scaler word (geo address == kScalerAddress)
507 fADCModule = (Int_t) ((fBuffer & 0xf8000000)>>27);
508 //printf(" AliZDCRawStream -> fADCModule %d\n",fADCModule);
510 // ****** ADC MODULES ******
511 if(fADCModule>=0 && fADCModule<=3 && fIsScHeaderRead==kFALSE){//ADC modules (0,1,2,3)
513 if((fBuffer & 0x07000000) == 0x02000000){
514 fIsADCHeader = kTRUE;
515 fADCNChannels = ((fBuffer & 0x00003f00)>>8);
516 if(fADCModule==0) fNChannelsOn = fADCNChannels;
517 else fNChannelsOn += fADCNChannels;
518 //printf(" AliZDCRawStream -> ADC HEADER: mod.%d has %d ch. \n",fADCModule,fADCNChannels);
521 else if((fBuffer & 0x07000000) == 0x00000000){
522 fIsADCDataWord = kTRUE;
523 fADCChannel = ((fBuffer & 0x1e0000) >> 17);
524 fADCGain = ((fBuffer & 0x10000) >> 16);
525 fADCValue = (fBuffer & 0xfff);
527 //printf(" AliZDCRawStream -> DATA: ADC mod. %d ch. %d gain %d value %d\n",
528 // fADCModule,fADCChannel,fADCGain,fADCValue);
530 // Checking if the channel map for the ADCs has been provided/read
531 if(fMapADC[0][0]==-1){
532 printf("\t ATTENTION!!! No ADC mapping has been found/provided!!!\n");
536 /*for(Int_t ci=0; ci<kNch; ci++){
537 printf(" %d mod %d ch %d det %d sec %d\n",ci,fMapADC[ci][0],
538 fMapADC[ci][1], fMapADC[ci][3], fMapADC[ci][4]);
541 // Scan of the map to assign the correct volumes
542 Int_t foundMapEntry = kFALSE;
543 for(Int_t k=0; k<kNch; k++){
544 if(fADCModule==fMapADC[k][0] && fADCChannel==fMapADC[k][1]){
545 fSector[0] = fMapADC[k][3];
546 fSector[1] = fMapADC[k][4];
547 foundMapEntry = kTRUE;
551 if(foundMapEntry==kFALSE){
552 AliWarning(Form(" No valid entry found in ADC mapping for raw data %d ADCmod. %d ch. %d gain %d\n",
553 fPosition,fADCModule,fADCChannel,fADCGain));
556 //printf("AliZDCRawStream -> ADCmod. %d ch. %d gain %d -> det %d sec %d\n",
557 // fADCModule,fADCChannel,fADCGain,fSector[0],fSector[1]);
560 if(foundMapEntry==kTRUE){
561 if(fSector[0]<1 || fSector[0]>5){
562 AliWarning(Form(" No valid detector assignment: %d",fSector[0]));
563 fRawReader->AddMajorErrorLog(kInvalidSector);
566 if(fSector[1]<0 || fSector[1]>5){
567 AliWarning(Form(" No valid sector assignment: %d",fSector[1]));
568 fRawReader->AddMajorErrorLog(kInvalidSector);
571 if(fADCModule<0 || fADCModule>3){
572 AliError(Form(" No valid ADC module: %d",fADCModule));
573 fRawReader->AddMajorErrorLog(kInvalidADCModule);
577 // Checking the underflow and overflow bits
578 if(fBuffer & 0x1000) fIsUnderflow = kTRUE;
579 else if (fBuffer & 0x2000) fIsOverflow = kTRUE;
583 else if((fBuffer & 0x07000000) == 0x04000000){
585 //printf(" AliZDCRawStream -> EOB --------------------------\n");
588 // *** DECODING SCALER
589 else if(fADCModule == 8){
590 if(fBuffer & 0x04000000 && fIsScHeaderRead==kFALSE){ // *** Scaler header
591 fScGeo = (fBuffer & 0xf8000000)>>27;
592 fScNWords = (fBuffer & 0x00fc0000)>>18;
593 fScTriggerSource = (fBuffer & 0x00030000)>>16;
594 fScTriggerNumber = (fBuffer & 0x0000ffff);
595 fIsScHeaderRead = kTRUE;
596 fScStartCounter = (Int_t) (fPosition);
598 //printf(" AliZDCRawStream -> SCALER HEADER: geo %d Nwords %d TS %d TN %d\n",
599 // fScGeo,fScNWords,fScTriggerSource,fScTriggerNumber);
601 else if(!(fBuffer & 0x04000000)){
602 fIsScEventGood = kFALSE;
605 if(fIsScHeaderRead && fPosition>=fScStartCounter+1){ // *** Scaler word
606 fScEvCounter = fBuffer;
607 Int_t nWords = (Int_t) (fScNWords);
608 if(fPosition == fScStartCounter+nWords) fIsScHeaderRead = kFALSE;
610 //printf(" AliZDCRawStream -> scaler datum %d", fScEvCounter);
619 //_____________________________________________________________________________
620 AliCDBStorage* AliZDCRawStream::SetStorage(const char *uri)
622 // Setting the storage
624 AliCDBStorage *storage = AliCDBManager::Instance()->GetStorage(uri);
630 //_____________________________________________________________________________
631 AliZDCChMap* AliZDCRawStream::GetChMap() const
634 // Getting calibration object for ZDC
636 AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/ChMap");
637 if(!entry) AliFatal("No calibration data loaded!");
639 AliZDCChMap *calibdata = dynamic_cast<AliZDCChMap*> (entry->GetObject());
640 if(!calibdata) AliFatal("Wrong calibration object in calibration file!");