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 TRD digits in raw data. //
22 // It loops over all TRD 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 // Several getters provide information about the current digit. //
27 // Author: C. Lippmann (C.Lippmann@gsi.de) //
29 ///////////////////////////////////////////////////////////////////////////////
32 #include "AliRawReader.h"
33 #include "AliTRDRawStream.h"
34 #include "AliTRDgeometry.h"
35 #include "AliTRDcalibDB.h"
37 #include "AliTRDdigitsManager.h"
38 #include "AliTRDdataArrayI.h"
39 #include "AliTRDSignalIndex.h"
41 #include "AliTRDfeeParam.h"
42 ClassImp(AliTRDRawStream)
44 //_____________________________________________________________________________
45 AliTRDRawStream::AliTRDRawStream()
114 // Default constructor
117 for (Int_t i = 0; i < 540; i++) {
123 //_____________________________________________________________________________
124 AliTRDRawStream::AliTRDRawStream(AliRawReader *rawReader)
169 ,fRawReader(rawReader)
193 // Create an object to read TRD raw digits
196 fRawReader->Select("TRD");
198 for (Int_t i = 0; i < 540; i++) {
204 //_____________________________________________________________________________
205 AliTRDRawStream::AliTRDRawStream(const AliTRDRawStream& stream)
277 AliFatal("Copy constructor not implemented");
281 //_____________________________________________________________________________
282 AliTRDRawStream& AliTRDRawStream::operator = (const AliTRDRawStream&
286 // Assigment operator
289 Fatal("operator =", "assignment operator not implemented");
294 //_____________________________________________________________________________
295 AliTRDRawStream::~AliTRDRawStream()
307 //_____________________________________________________________________________
308 void AliTRDRawStream::SetRawReader(AliRawReader *rawReader)
312 fRawReader = rawReader;
316 //_____________________________________________________________________________
317 Bool_t AliTRDRawStream::SetRawVersion(Int_t rv)
320 // Set the raw data version
323 if ( rv >= 0 && rv <= 3 ) {
333 //____________________________________________________________________________
334 Int_t AliTRDRawStream::Init()
340 if (!AliTRDcalibDB::Instance()) {
341 AliError("Could not get calibration object");
346 fGeo = new AliTRDgeometry();
349 fTimeBinsCalib = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
350 AliDebug(2, Form("Number of Timebins read from CDB: %d", fTimeBinsCalib));
352 // The number of data words needed for this number of time bins (there
353 // are 3 time bins in one word)
354 fTimeWords = (fTimeBinsCalib-1)/3 + 1;
359 fHCHctr1 = fHCHctr2 = 0;
360 fGTUctr1 = fGTUctr2 = -1;
372 fNextStatus = fkStart;
379 fkBufferSet = kFALSE;
383 //____________________________________________________________________________
384 Int_t AliTRDRawStream::NextData()
387 // Updates the next data word pointer
390 if (fCountBytes + kSizeWord >= fBufSize)
392 fkBufferSet = fRawReader->ReadNextData(fPos);
393 if (fkBufferSet == kTRUE)
395 fBufSize = fRawReader->GetDataSize();
397 fDataWord = (UInt_t*)fPos;
398 fNextStatus = fkNextSM;
404 fNextStatus = fkStop;
412 fCountBytes += kSizeWord;
413 fDataWord = (UInt_t*)fPos;
419 //____________________________________________________________________________
420 Bool_t AliTRDRawStream::Next()
423 // Updates the next data word pointer
426 if (fNextStatus == fkStart)
431 while (fNextStatus != fkStop)
434 if (fNextStatus == fkNextMCM || fNextStatus == fkNextData)
438 if( ((*fDataWord & 0x80000000) == 0x0) && ((*fDataWord & 0x0000000f) == 0xC) )
441 if ( fMCM < 0 || fMCM > 15 || fROB < 0 || fROB > 7 )
443 AliWarning("Wrong fMCM or fROB. Skip this data");
444 fRawReader->AddMajorErrorLog(kWrongMCMorROB,Form("MCM=%d, ROB=%d",fMCM,fROB));
445 fNextStatus = fkNextHC;
448 fTbSwitch = 3; // For first adc channel we expect: (*fDataWord & 3) = 3
450 fADC = fTB = 0; // Reset Counter
451 fNextStatus = fkNextData;
455 if ( *fDataWord == kEndofrawdatamarker )
456 { // End of half-chamber data, finished
458 fNextStatus = fkNextHC;
462 if (fNextStatus == fkNextData )
463 { // MCM header is set, ADC data is valid.
465 // Found some data. Decode it now:
466 fRetVal = DecodeDataWord();
467 if ( fRetVal == 0 ) continue;
470 fNextStatus = fkNextHC;
480 // following ifs have been moved to DEcodeDatawordV1V2
481 // if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 )
484 // if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax )
499 if ( fNextStatus == fkNextHC )
502 // 1) Find end_of_tracklet_marker
505 if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
511 // endoftrackletmarker?
512 if ( *fDataWord == kEndoftrackletmarker )
514 AliDebug(3, "end-of-tracklet-marker found");
515 fNextStatus = fkSeekNonEoTracklet;
521 AliDebug(3, "Tracklet found");
527 if (fNextStatus == fkSeekNonEoTracklet)
530 // 2) Look for non-end_of_tracklet_marker
532 //printf("Word %d: 0x%08x\n", fWordCtr, *fDataWord);
534 if ( *fDataWord != kEndoftrackletmarker )
536 fNextStatus = fkDecodeHC;
537 AliDebug(3, "NON end-of-tracklet-marker found");
538 //// no do not continue - this should be the hcheader
542 //just go on and find the non-end_of_tracklet_marker
547 if ( fNextStatus == fkDecodeHC )
549 AliDebug(3, "Decode HC");
552 // 3) This Word must be Half Chamber Header
554 if ( (*fDataWord & 0x00000003) == 1 )
556 DecodeHCheader(fTimeBinsCalib); // This is the new header!
558 fDET = fGeo->GetDetector(fLAYER, fSTACK, fSM);
559 fRowMax = fGeo->GetRowMax(fLAYER,fSTACK,fSM);
560 fColMax = fGeo->GetColMax(fROC);
565 fChamberDone[fDET]++;
566 fNextStatus = fkNextMCM;
567 AliDebug(3, "Decode HC OK");
572 AliDebug(3, "Decode HC NOT OK");
573 fNextStatus = fkNextSM;
578 if (fNextStatus == fkNextSM)
587 // After reading the first word check for size of this data and get Eq. ID
590 fDataSize = fRawReader->GetDataSize()/4; // Size of this payload in 32bit words
591 fEqID = fRawReader->GetEquipmentId(); // Get Equipment ID
592 if ( fDataSize > 0 ) fSizeOK = kTRUE;
596 if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
599 fNextStatus = fkNextHC;
604 AliWarning(Form("Equipment %d: First data word is not GTU Link Mask!", fEqID));
605 fRawReader->AddMajorErrorLog(kGTULinkMaskMissing,Form("Equipment %d",fEqID));
606 fNextStatus = fkStop;
612 AliDebug(1, Form("That's all folks! %d", fSM));
616 //____________________________________________________________________________
617 Int_t AliTRDRawStream::NextChamber(AliTRDdigitsManager *man)
620 // Updates the next data word pointer
623 AliTRDdataArrayI *digits = 0;
624 AliTRDdataArrayI *track0 = 0;
625 AliTRDdataArrayI *track1 = 0;
626 AliTRDdataArrayI *track2 = 0;
627 AliTRDSignalIndex *indexes = 0;
629 if (fNextStatus == fkStart)
634 while (fNextStatus != fkStop)
637 if (fNextStatus == fkNextMCM || fNextStatus == fkNextData)
638 //while (fNextStatus == fkNextMCM || fNextStatus == fkNextData)
642 if( ((*fDataWord & 0x80000000) == 0x0) && ((*fDataWord & 0x0000000f) == 0xC) )
645 if ( fMCM < 0 || fMCM > 15 || fROB < 0 || fROB > 7 )
647 AliWarning("Wrong fMCM or fROB. Skip this data");
648 fRawReader->AddMajorErrorLog(kWrongMCMorROB,Form("MCM=%d, ROB=%d",fMCM,fROB));
649 fNextStatus = fkNextHC;
652 fTbSwitch = 3; // For first adc channel we expect: (*fDataWord & 3) = 3
654 fADC = fTB = 0; // Reset Counter
655 fNextStatus = fkNextData;
657 // NextData(); // if while loop!
661 if ( *fDataWord == kEndofrawdatamarker )
662 { // End of half-chamber data, finished
664 fNextStatus = fkNextHC;
665 // full chamber processed ?
666 if (fChamberDone[fDET] == 2)
672 // break; // if while loop
677 if (fNextStatus == fkNextData )
678 { // MCM header is set, ADC data is valid.
680 // Found some data. Decode it now:
681 fRetVal = DecodeDataWord();
682 if ( fRetVal == 0 ) continue;
685 fNextStatus = fkNextHC;
687 // NextData(); // if while loop!
688 // break; //if while loop!
695 // here fill the data arrays
697 for (Int_t it = 0; it < 3; it++)
699 if ( GetTimeBin() + it < GetNumberOfTimeBins() )
701 if (GetSignals()[it] > 0)
703 digits->SetDataUnchecked(fROW, fCOL, fTB + it, fSig[it]);
704 indexes->AddIndexTBin(fROW, fCOL, fTB + it);
705 if (man->UsesDictionaries())
707 track0->SetDataUnchecked(fROW, fCOL, fTB + it, 0);
708 track1->SetDataUnchecked(fROW, fCOL, fTB + it, 0);
709 track2->SetDataUnchecked(fROW, fCOL, fTB + it, 0);
712 } // check the tbins range
713 } // for each tbin of current 3
718 // following ifs have been moved to DEcodeDatawordV1V2
719 // if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 )
722 // if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax )
734 // NextData(); // if while loop!
738 if ( fNextStatus == fkNextHC )
741 // 1) Find end_of_tracklet_marker
744 if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
750 // endoftrackletmarker?
751 if ( *fDataWord == kEndoftrackletmarker )
753 AliDebug(3, "end-of-tracklet-marker found");
754 fNextStatus = fkSeekNonEoTracklet;
760 AliDebug(3, "Tracklet found");
766 if (fNextStatus == fkSeekNonEoTracklet)
769 // 2) Look for non-end_of_tracklet_marker
771 //printf("Word %d: 0x%08x\n", fWordCtr, *fDataWord);
773 if ( *fDataWord != kEndoftrackletmarker )
775 fNextStatus = fkDecodeHC;
776 AliDebug(3, "NON end-of-tracklet-marker found");
777 //// no do not continue - this should be the hcheader
781 //just go on and find the non-end_of_tracklet_marker
786 if ( fNextStatus == fkDecodeHC )
788 AliDebug(3, "Decode HC");
791 // 3) This Word must be Half Chamber Header
793 if ( (*fDataWord & 0x00000003) == 1 )
795 DecodeHCheader(fTimeBinsCalib); // This is the new header!
796 fDET = fGeo->GetDetector(fLAYER, fSTACK, fSM);
797 fRowMax = fGeo->GetRowMax(fLAYER,fSTACK,fSM);
798 fColMax = fGeo->GetColMax(fROC);
800 if (fLastDET != fDET)
802 AliDebug(4, "New DET!");
803 // allocate stuff for the new det
804 //man->ResetArrays();
805 digits = man->GetDigits(fDET);
806 track0 = man->GetDictionary(fDET,0);
807 track1 = man->GetDictionary(fDET,1);
808 track2 = man->GetDictionary(fDET,2);
810 // Allocate memory space for the digits buffer
811 if (digits->GetNtime() == 0)
813 AliDebug(4, "Allocating digits");
814 //AliDebug(5, Form("Alloc digits for det %d", det));
815 digits->Allocate(fRowMax, fColMax, fTBins);
816 if (man->UsesDictionaries())
818 track0->Allocate(fRowMax, fColMax, fTBins);
819 track1->Allocate(fRowMax, fColMax, fTBins);
820 track2->Allocate(fRowMax, fColMax, fTBins);
824 indexes = man->GetIndexes(fDET);
826 indexes->SetStack(fSTACK);
827 indexes->SetLayer(fLAYER);
828 indexes->SetDetNumber(fDET);
830 if (indexes->IsAllocated() == kFALSE)
832 AliDebug(4, "Allocating indexes");
833 indexes->Allocate(fRowMax, fColMax, fTBins);
841 fChamberDone[fDET]++;
842 fNextStatus = fkNextMCM;
843 AliDebug(3, "Decode HC OK");
848 AliDebug(3, "Decode HC NOT OK");
849 fNextStatus = fkNextSM;
854 if (fNextStatus == fkNextSM)
863 // After reading the first word check for size of this data and get Eq. ID
866 fDataSize = fRawReader->GetDataSize()/4; // Size of this payload in 32bit words
867 fEqID = fRawReader->GetEquipmentId(); // Get Equipment ID
868 if ( fDataSize > 0 ) fSizeOK = kTRUE;
872 if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
875 fNextStatus = fkNextHC;
880 AliWarning(Form("Equipment %d: First data word is not GTU Link Mask!", fEqID));
881 fRawReader->AddMajorErrorLog(kGTULinkMaskMissing,Form("Equipment %d",fEqID));
882 fNextStatus = fkStop;
888 AliDebug(1, Form("That's all folks! %d", fSM));
893 //============================================================================
894 // Decoding functions
895 //============================================================================
898 //____________________________________________________________________________
899 void AliTRDRawStream::DecodeHCheader(Int_t timeBins)
902 // Decode the HC header (fRawVersion == 2, 3, 4, ???)
905 fRVmajor = (*fDataWord >> 24) & 0x7f;
906 fRVminor = (*fDataWord >> 17) & 0x7f;
908 if (fRVmajor < 2 || fRVmajor > 4)
909 AliError(Form(" Unsupported raw version: %d", fRawVersion))
911 if ( fRawVersion != fRVmajor ) {
913 AliWarning("===============================================================================");
914 AliWarning(Form("Mismatch between fRawVersion (%d) and fRVmajor from HC header (%d)"
915 ,fRawVersion,fRVmajor));
916 AliWarning(Form("Setting fRawVersion to %d", fRVmajor));
917 AliWarning("===============================================================================");
918 fRawVersion = fRVmajor;
923 // check for zero suppression
924 if ( fRawVersion >= 3 || fRawVersion <= 4 ) fZeroSuppressed = kTRUE;
925 else fZeroSuppressed = kFALSE;
928 if ( (*fDataWord & 0x3) == 1 ) {
930 fHCHWords = (*fDataWord >> 14) & 0x7;
931 fSM = (*fDataWord >> 9) & 0x1f;
932 fLAYER = (*fDataWord >> 6) & 0x7;
933 fSTACK = (*fDataWord >> 3) & 0x7;
934 fSIDE = (*fDataWord >> 2) & 0x1;
936 fROC = fGeo->GetDetectorSec(fLAYER, fSTACK);
938 AliDebug(3, Form("0x%08x: HC header: sm=%d; roc=%d; side=%x", *fDataWord, fSM, fROC, fSIDE+10));
948 AliWarning(Form("0x%08x: Strange HC header: dcs=%d; sm=%d; layer=%d; stack=%d.",
949 *fDataWord, fDCS, fSM, fLAYER, fSTACK));
950 fRawReader->AddMajorErrorLog(kHCHeaderCorrupt,Form("0x%08x:dcs=%d; sm=%d; layer=%d; stack=%d.",
951 *fDataWord, fDCS, fSM, fLAYER, fSTACK));
959 AliWarning(Form("0x%08x: No HC header when it was expected.", *fDataWord));
960 fRawReader->AddMajorErrorLog(kHCHeaderMissing,Form("0x%08x", *fDataWord));
964 if ( fHCHWords >= 1 ) {
965 // read one more word
966 if (NextData() != fkWordOK)
968 AliWarning("Next HC word missing");
969 fRawReader->AddMajorErrorLog(kHCWordMissing,"Next HC word missing");
970 fNextStatus = fkNextHC;
973 if ( (*fDataWord & 0x3) == 1 ) {
975 fBCctr = (*fDataWord >> 16);
976 fPTctr = (*fDataWord >> 12) & 0xf;
977 fPTphase = (*fDataWord >> 8) & 0xf;
978 fTBins = ((*fDataWord >> 2) & 0x3f) + 1;
980 AliDebug(3, Form("0x%08x: HC header 2: BCctr=%d PTctr=%d PTph=%d TB=%d"
981 , *fDataWord, fBCctr, fPTctr, fPTphase, fTBins));
983 if( fTBins != timeBins ) {
985 AliWarning("===============================================================================");
986 AliError(Form("Mismatch between nNTB from CDB (%d) and from HC header (%d)"
987 , timeBins, fTBins));
988 AliWarning(Form("We will use the value from the raw data (HC header): %d", fTBins));
989 AliWarning("===============================================================================");
991 fTimeWords = (fTBins - 1)/3 + 1;
999 if ( fHCHWords >= 2 ) {
1000 // read one more word
1001 if (NextData() != fkWordOK)
1003 AliWarning("Next HC word missing");
1004 fRawReader->AddMajorErrorLog(kHCWordMissing,"Next HC word missing");
1005 fNextStatus = fkNextHC;
1008 if ( (*fDataWord & 0x3) == 1 ) {
1010 fTCon = (*fDataWord >> 29) & 0x1;
1011 fPEDon = (*fDataWord >> 31) & 0x1;
1012 fGAINon = (*fDataWord >> 30) & 0x1;
1013 fXTon = (*fDataWord >> 28) & 0x1;
1014 fNonLinOn = (*fDataWord >> 27) & 0x1;
1015 fBypass = (*fDataWord >> 26) & 0x1;
1017 fCommonAdditive = (*fDataWord >> 20) & 0x3f;
1019 AliDebug(3, Form("0x%08x: HC header 3: TC=%d, PED=%d, GAIN=%d, XT=%d, NonLin=%d, Bypass=%d, Add=%d"
1020 , fTCon, fPEDon, fGAINon, fXTon, fNonLinOn, fBypass, fCommonAdditive));
1026 //____________________________________________________________________________
1027 void AliTRDRawStream::DecodeMCMheader()
1031 // Decode the MCM header
1034 if ( fRawVersion < 1 || fRawVersion > 3 )
1036 AliError(Form(" Unsupported raw version: %d", fRawVersion));
1039 fMCM = (*fDataWord & 0xff000000) >> 24;
1040 fEv = (*fDataWord & 0x00fffff0) >> 4;
1045 fROW = AliTRDfeeParam::Instance()->GetPadRowFromMCM(fROB, fMCM);
1047 AliDebug(4, Form("0x%08x: SM%d L%dS%d. MCM Header: fROB=%d fMCM=%02d fEv=%02d"
1048 , *fDataWord, fSM, fLAYER, fSTACK, fROB, fMCM, fEv));
1050 if ( fROB % 2 == 0 && fSIDE == 1 ) {
1051 AliWarning(Form("SM%d L%dS%d: Mismatch between fROB (%d) and fSIDE (%d): fMCM=%02d"
1052 , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
1053 fRawReader->AddMajorErrorLog(kROBSideMismatch,Form("SM%d L%dS%d: fROB (%d) fSIDE (%d): fMCM=%02d"
1054 , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
1056 if ( fROB % 2 != 0 && fSIDE == 0 ) {
1057 AliWarning(Form("SM%d L%dS%d: Mismatch between fROB (%d) and fSIDE (%d): fMCM=%02d"
1058 , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
1059 fRawReader->AddMajorErrorLog(kROBSideMismatch,Form("SM%d L%dS%d: fROB (%d) fSIDE (%d): fMCM=%02d"
1060 , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
1062 if ( (fSTACK == 2 && fROW >= fGeo->RowmaxC0()) ||
1063 (fSTACK != 2 && fROW >= fGeo->RowmaxC1()) || fROW < 0 ) {
1064 AliWarning(Form("SM%d L%dS%d: Wrong Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"
1065 , fSM, fLAYER, fSTACK, fROW, fROB, fSIDE, fMCM ));
1066 fRawReader->AddMajorErrorLog(kWrongPadrow,Form("SM%d L%dS%d: Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"
1067 , fSM, fLAYER, fSTACK, fROW, fROB, fSIDE, fMCM ));
1073 // AdcMask for Zero supressed data
1074 if ( fRawVersion == 3 ) {
1075 // read one more word
1076 if (NextData() != fkWordOK)
1078 AliWarning("MCM ADC mask missing");
1079 fRawReader->AddMajorErrorLog(kMCMADCMaskMissing,"Missing");
1080 fNextStatus = fkNextHC;
1083 if ( (*fDataWord & 0x000007ff) == 0xC ) { // at the moment bits 4-10 are empty
1085 for ( Int_t ctr = 0; ctr < fGeo->ADCmax(); ctr++ ) {
1086 if ( (*fDataWord >> (11+ctr)) == 0x1 ) fADCmask[ctr] = kTRUE;
1087 else fADCmask[ctr] = kFALSE;
1090 AliDebug(4, Form("0x%08x: ADC mask", *fDataWord));
1094 AliWarning("Expected ADC mask but did not find one!");
1095 fRawReader->AddMajorErrorLog(kMCMADCMaskMissing,"Decode error");
1102 //____________________________________________________________________________
1103 void AliTRDRawStream::DecodeTracklet()
1107 // Decode the Tracklet
1109 // this function is not tested yet on real tracklets
1112 if ( fRawVersion < 1 || fRawVersion > 3 )
1114 AliError(Form(" Unsupported raw version: %d", fRawVersion));
1117 fTracklPID = (*fDataWord >> 24) & 0xff;
1118 fTracklPadRow = (*fDataWord >> 20) & 0xf; // 0:15
1119 fTracklDefL = (*fDataWord >> 13) & 0x7f;
1120 fTracklPadPos = (*fDataWord) & 0x1fff;
1122 fTracklPID /= (Float_t)((1<<8) - 1); // 0:1 (steps of 0.39%)
1123 fTracklDefL = (fTracklDefL - ((1<< 7)-1)/2.) * 140.e-4; // -0.889:0.889cm
1124 fTracklPadPos = (fTracklPadPos - ((1<<13)-1)/2.) * 160.e-4; // -65.528:65.528 cm
1126 //AliDebug(4, Form("0x%08x: Tracklet found: SM%d L%dS%d side %x: PadRow=%d PadPos=%f DefL=%f PID=%f"
1127 // , *fDataWord, fSM, fLAYER, fSTACK, fSIDE+10
1128 // , fTracklPadRow, fTracklPadPos, fTracklDefL, fTracklPID));
1130 if( (fSTACK == 2) && (fTracklPadRow >= (Int_t) fGeo->RowmaxC0()) ||
1131 (fSTACK != 2) && (fTracklPadRow >= (Int_t) fGeo->RowmaxC1()) ) {
1132 AliWarning(Form("Strange Row read from Tracklet Word: %d", fTracklPadRow));
1133 fRawReader->AddMajorErrorLog(kTrackletRowMismatch,Form("Word: %d", fTracklPadRow));
1138 //____________________________________________________________________________
1139 void AliTRDRawStream::DecodeGTUlinkMask()
1143 // Decode the link masks sent by the GTU. These marke the active optical links
1144 // between GTU and Super Module. Up to now only fully active links are found
1145 // (0xfff = 12 active links).
1148 if ( fRawVersion < 1 || fRawVersion > 3 )
1150 AliError(Form(" Unsupported raw version: %d", fRawVersion));
1153 if ( fGTUctr1 == -1 ) fGTUctr2++;
1156 if ( (fGTUctr1 >= 0) && (fGTUctr1 < 5) && (fGTUctr2 >= 0) && (fGTUctr2 < 18) ) {
1157 fGTUlinkMask[fGTUctr2][fGTUctr1] = (*fDataWord & 0xfff);
1162 //____________________________________________________________________________
1163 Int_t AliTRDRawStream::DecodeDataWord()
1170 if ( fRawVersion >= 1 && fRawVersion <= 2 ) {
1171 return DecodeDataWordV1V2();
1173 else if ( fRawVersion >= 3 && fRawVersion <= 3 ) {
1174 return DecodeDataWordV3();
1177 AliError(Form(" Unsupported raw version: %d", fRawVersion));
1182 //____________________________________________________________________________
1183 Int_t AliTRDRawStream::DecodeDataWordV1V2()
1187 // Decode the Data (full raw data. No zero suppression. 21 adc channels)
1189 // return 0 means continue to next data word
1190 // return -1 means break data loop
1193 // // check the content first! - something wrong with that...
1194 // // Decode 32 bit data words with information from 3 time bins and copy the data
1195 // fSig[0] = (*fDataWord & 0x00000ffc) >> 2;
1196 // fSig[1] = (*fDataWord & 0x003ff000) >> 12;
1197 // fSig[2] = (*fDataWord & 0xffc00000) >> 22;
1198 // if (fSig[0] <= 0 && fSig[1] <= 0 && fSig[2] <= 0)
1201 if ( (*fDataWord & 0x00000003) != 0x2 && (*fDataWord & 0x00000003) != 0x3) {
1202 //AliWarning(Form("Data %08x : Data Word ends neither with b11 nor b10", (Int_t)*fDataWord));
1203 fRawReader->AddMinorErrorLog(kDataMaskError,Form("Data %08x", (Int_t)*fDataWord));
1207 if ( (*fDataWord & 0x00000003) != fTbSwitch ) { // Next ADC channel found
1208 fTbSwitch = (fTbSwitch & 2) | !(fTbSwitch & 1); // 0x3 <--> 0x2
1214 fTbSwitchCtr++; // Just read one word
1216 // We have only timeTotal time bins
1217 if ( fTbSwitchCtr > fTimeWords ) {
1218 //AliWarning(Form("Data is strange. Already found %d words for this ADC channel", (Int_t)fTbSwitchCtr));
1219 fRawReader->AddMinorErrorLog(kADCNumberOverflow,Form("%d words", (Int_t)fTbSwitchCtr));
1223 // We have only 21 ADC channels.
1224 if ( fADC > (Int_t)fGeo->ADCmax()-1 ) {
1225 //AliWarning(Form("Data %08x : Data is strange. fADC is already %d", (Int_t)*fDataWord, (Int_t)fADC));
1226 fRawReader->AddMinorErrorLog(kADCChannelOverflow,Form("Data %08x : fADC=%d", (Int_t)*fDataWord, (Int_t)fADC));
1230 // There are 18 pads connected to each MCM ADC channels 2...19. The other channels cross to other
1231 // MCMs and are good for online tracking in the MCM.
1232 if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 ) {
1235 fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fROB, fMCM, fADC);
1237 // We have only 144 Pad Columns
1238 //if ( fCOL > fColMax-1 || fCOL < 0 ) {
1239 if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax )
1241 // Decode 32 bit data words with information from 3 time bins and copy the data
1242 fSig[0] = (*fDataWord & 0x00000ffc) >> 2;
1243 fSig[1] = (*fDataWord & 0x003ff000) >> 12;
1244 fSig[2] = (*fDataWord & 0xffc00000) >> 22;
1246 if (fSig[0] > 0 || fSig[1] > 0 || fSig[2] > 0)
1253 // AliWarning(Form("SM%d L%dS%d: Wrong Pad column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
1254 // fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
1255 fRawReader->AddMajorErrorLog(kWrongPadcolumn,Form("SM%d L%dS%d: column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
1256 fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
1259 // Print data to screen:
1260 // Do NOT switch on for default production, it is VERY slow
1261 // AliDebug(5, Form("SM%d L%dS%d: ROB%d MCM=%d ADC=%d (ROW=%d COL=%d): Data %04d %04d %04d\n",
1262 // fSM, fLAYER, fSTACK, fROB, fMCM, fADC, fROW, fCOL, fSig[0], fSig[1], fSig[2]));
1275 //____________________________________________________________________________
1276 Int_t AliTRDRawStream::DecodeDataWordV3()
1280 // Decode the data (Zero suppresses data. 21 adc channels)
1282 // return 0 means continue to next data word
1283 // return -1 means break data loop
1285 // NOT TESTED YET!!!!!!!!
1288 if ( (*fDataWord & 0x00000003) != 0x2 && (*fDataWord & 0x00000003) != 0x3) {
1289 AliWarning(Form("Data %08x : Data Word ends neither with b11 nor b10", (Int_t)*fDataWord));
1290 fRawReader->AddMinorErrorLog(kDataMaskError,Form("Data %08x", (Int_t)*fDataWord));
1294 if ( (*fDataWord & 0x00000003) != fTbSwitch ) { // Next ADC channel found
1295 fTbSwitch = (fTbSwitch & 2) | !(fTbSwitch & 1); // 0x3 <--> 0x2
1298 // Jump to next ADC channel that is not masked
1301 } while ( ((fADC < fGeo->ADCmax()) && (fADCmask[fADC] == kFALSE)) || (fADC >= fGeo->ADCmax()) );
1305 fTbSwitchCtr++; // Just read one word
1307 // We have only timeTotal time bins
1308 if ( fTbSwitchCtr > fTimeWords ) {
1309 AliWarning(Form("Data is strange. Already found %d words for this ADC channel", (Int_t)fTbSwitchCtr));
1310 fRawReader->AddMinorErrorLog(kADCNumberOverflow,Form("%d words", (Int_t)fTbSwitchCtr));
1314 // We have only 21 ADC channels.
1315 if ( fADC > (Int_t)fGeo->ADCmax()-1 ) {
1316 AliWarning(Form("Data %08x : Data is strange. fADC is already %d", (Int_t)*fDataWord, (Int_t)fADC));
1317 fRawReader->AddMinorErrorLog(kADCChannelOverflow,Form("Data %08x : fADC=%d", (Int_t)*fDataWord, (Int_t)fADC));
1321 // There are 18 pads connected to each MCM ADC channels 2...19. The other channels cross to other
1322 // MCMs and are good for online tracking in the MCM.
1323 if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 ) {
1326 //fCOL = fGeo->GetPadColFromADC(fROB, fMCM, fADC);
1327 fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fROB, fMCM, fADC);
1329 // We have only 144 Pad Columns
1330 if ( fCOL > fColMax-1 || fCOL < 0 ) {
1331 AliWarning(Form("SM%d L%dS%d: Wrong Pad column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
1332 fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
1333 fRawReader->AddMajorErrorLog(kWrongPadcolumn,Form("SM%d L%dS%d: column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
1334 fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
1337 // Decode 32 bit data words with information from 3 time bins and copy the data
1338 fSig[0] = (*fDataWord & 0x00000ffc) >> 2;
1339 fSig[1] = (*fDataWord & 0x003ff000) >> 12;
1340 fSig[2] = (*fDataWord & 0xffc00000) >> 22;
1342 // Print data to screen:
1343 AliDebug(5, Form("SM%d L%dS%d: ROB%d MCM=%d ADC=%d (ROW=%d COL=%d): Data %04d %04d %04d\n",
1344 fSM, fLAYER, fSTACK, fROB, fMCM, fADC, fROW, fCOL, fSig[0], fSig[1], fSig[2]));