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. //
28 // Christian Lippmann (C.Lippmann@gsi.de) //
30 ////////////////////////////////////////////////////////////////////////////
33 #include "AliRawReader.h"
35 #include "AliTRDRawStream.h"
36 #include "AliTRDgeometry.h"
37 #include "AliTRDcalibDB.h"
38 #include "AliTRDdigitsManager.h"
39 #include "AliTRDdataArrayI.h"
40 #include "AliTRDdataArrayS.h"
41 #include "AliTRDSignalIndex.h"
42 #include "AliTRDfeeParam.h"
44 ClassImp(AliTRDRawStream)
46 //_____________________________________________________________________________
47 AliTRDRawStream::AliTRDRawStream()
48 :AliTRDrawStreamBase()
117 // Default constructor
120 for (Int_t i = 0; i < 540; i++) {
126 //_____________________________________________________________________________
127 AliTRDRawStream::AliTRDRawStream(AliRawReader *rawReader)
128 :AliTRDrawStreamBase(rawReader)
174 ,fRawReader(rawReader)
197 // Create an object to read TRD raw digits
200 fRawReader->Select("TRD");
202 for (Int_t i = 0; i < 540; i++) {
208 //_____________________________________________________________________________
209 AliTRDRawStream::AliTRDRawStream(const AliTRDRawStream& stream)
210 :AliTRDrawStreamBase(stream)
282 AliFatal("Copy constructor not implemented");
286 //_____________________________________________________________________________
287 AliTRDRawStream& AliTRDRawStream::operator = (const AliTRDRawStream&
291 // Assigment operator
294 AliFatal("Assignment operator not implemented");
299 //_____________________________________________________________________________
300 AliTRDRawStream::~AliTRDRawStream()
312 //_____________________________________________________________________________
313 void AliTRDRawStream::SetRawReader(AliRawReader *rawReader)
316 // Sets the raw reader
321 fRawReader = rawReader;
326 //_____________________________________________________________________________
327 Bool_t AliTRDRawStream::SetRawVersion(Int_t rv)
330 // Set the raw data version
333 if ( rv >= 0 && rv <= 3 ) {
342 //____________________________________________________________________________
343 Bool_t AliTRDRawStream::Init()
349 if (!AliTRDcalibDB::Instance()) {
350 AliError("Could not get calibration object");
355 fGeo = new AliTRDgeometry();
358 fTimeBinsCalib = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
359 AliDebug(2, Form("Number of Timebins read from CDB: %d", fTimeBinsCalib));
361 // The number of data words needed for this number of time bins (there
362 // are 3 time bins in one word)
363 fTimeWords = (fTimeBinsCalib-1)/3 + 1;
368 fHCHctr1 = fHCHctr2 = 0;
369 fGTUctr1 = fGTUctr2 = -1;
381 fNextStatus = kStart;
394 //____________________________________________________________________________
395 Int_t AliTRDRawStream::NextData()
398 // Updates the next data word pointer
401 if (fCountBytes + kSizeWord >= fBufSize)
403 fBufferSet = fRawReader->ReadNextData(fPos);
404 if (fBufferSet == kTRUE)
406 fBufSize = fRawReader->GetDataSize();
408 fDataWord = (UInt_t*)fPos;
409 fNextStatus = kNextSM;
423 fCountBytes += kSizeWord;
424 fDataWord = (UInt_t*)fPos;
430 //____________________________________________________________________________
431 Bool_t AliTRDRawStream::Next()
434 // Updates the next data word pointer
437 if (fNextStatus == kStart)
442 while (fNextStatus != kStop)
445 if (fNextStatus == kNextMCM || fNextStatus == kNextData)
449 if( ((*fDataWord & 0x80000000) == 0x0) && ((*fDataWord & 0x0000000f) == 0xC) )
452 if ( fMCM < 0 || fMCM > 15 || fROB < 0 || fROB > 7 )
454 AliWarning("Wrong fMCM or fROB. Skip this data");
455 fRawReader->AddMajorErrorLog(kWrongMCMorROB,Form("MCM=%d, ROB=%d",fMCM,fROB));
456 fNextStatus = kNextHC;
459 fTbSwitch = 3; // For first adc channel we expect: (*fDataWord & 3) = 3
461 fADC = fTB = 0; // Reset Counter
462 fNextStatus = kNextData;
466 if ( *fDataWord == kEndofrawdatamarker )
467 { // End of half-chamber data, finished
469 fNextStatus = kNextHC;
473 if (fNextStatus == kNextData )
474 { // MCM header is set, ADC data is valid.
476 // Found some data. Decode it now:
477 fRetVal = DecodeDataWord();
478 if ( fRetVal == 0 ) continue;
481 fNextStatus = kNextHC;
491 // following ifs have been moved to DEcodeDatawordV1V2
492 // if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 )
495 // if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax )
510 if ( fNextStatus == kNextHC )
513 // 1) Find end_of_tracklet_marker
516 if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
522 // endoftrackletmarker?
523 if ( *fDataWord == kEndoftrackletmarker )
525 AliDebug(3, "end-of-tracklet-marker found");
526 fNextStatus = kSeekNonEoTracklet;
532 AliDebug(3, "Tracklet found");
538 if (fNextStatus == kSeekNonEoTracklet)
541 // 2) Look for non-end_of_tracklet_marker
543 //printf("Word %d: 0x%08x\n", fWordCtr, *fDataWord);
545 if ( *fDataWord != kEndoftrackletmarker )
547 fNextStatus = kDecodeHC;
548 AliDebug(3, "NON end-of-tracklet-marker found");
549 //// no do not continue - this should be the hcheader
553 //just go on and find the non-end_of_tracklet_marker
558 if ( fNextStatus == kDecodeHC )
560 AliDebug(3, "Decode HC");
563 // 3) This Word must be Half Chamber Header
565 if ( (*fDataWord & 0x00000003) == 1 )
567 DecodeHCheader(fTimeBinsCalib); // This is the new header!
569 fDET = fGeo->GetDetector(fLAYER, fSTACK, fSM);
570 fRowMax = fGeo->GetRowMax(fLAYER,fSTACK,fSM);
571 fColMax = fGeo->GetColMax(fROC);
576 fChamberDone[fDET]++;
577 fNextStatus = kNextMCM;
578 AliDebug(3, "Decode HC OK");
583 AliDebug(3, "Decode HC NOT OK");
584 fNextStatus = kNextSM;
589 if (fNextStatus == kNextSM)
598 // After reading the first word check for size of this data and get Eq. ID
601 fDataSize = fRawReader->GetDataSize()/4; // Size of this payload in 32bit words
602 fEqID = fRawReader->GetEquipmentId(); // Get Equipment ID
603 if ( fDataSize > 0 ) fSizeOK = kTRUE;
607 if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
610 fNextStatus = kNextHC;
615 AliWarning(Form("Equipment %d: First data word is not GTU Link Mask!", fEqID));
616 fRawReader->AddMajorErrorLog(kGTULinkMaskMissing,Form("Equipment %d",fEqID));
623 AliDebug(1, Form("That's all folks! %d", fSM));
627 //____________________________________________________________________________
628 Int_t AliTRDRawStream::NextChamber(AliTRDdigitsManager *man)
631 // Updates the next data word pointer
634 AliTRDdataArrayS *digits = 0;
635 AliTRDdataArrayI *track0 = 0;
636 AliTRDdataArrayI *track1 = 0;
637 AliTRDdataArrayI *track2 = 0;
638 AliTRDSignalIndex *indexes = 0;
640 if (fNextStatus == kStart)
645 while (fNextStatus != kStop)
648 if (fNextStatus == kNextMCM || fNextStatus == kNextData)
649 //while (fNextStatus == kNextMCM || fNextStatus == kNextData)
653 if( ((*fDataWord & 0x80000000) == 0x0) && ((*fDataWord & 0x0000000f) == 0xC) )
656 if ( fMCM < 0 || fMCM > 15 || fROB < 0 || fROB > 7 )
658 AliWarning("Wrong fMCM or fROB. Skip this data");
659 fRawReader->AddMajorErrorLog(kWrongMCMorROB,Form("MCM=%d, ROB=%d",fMCM,fROB));
660 fNextStatus = kNextHC;
663 fTbSwitch = 3; // For first adc channel we expect: (*fDataWord & 3) = 3
665 fADC = fTB = 0; // Reset Counter
666 fNextStatus = kNextData;
668 // NextData(); // if while loop!
672 if ( *fDataWord == kEndofrawdatamarker )
673 { // End of half-chamber data, finished
675 fNextStatus = kNextHC;
676 // full chamber processed ?
677 if (fChamberDone[fDET] == 2)
683 // break; // if while loop
688 if (fNextStatus == kNextData )
689 { // MCM header is set, ADC data is valid.
691 // Found some data. Decode it now:
692 fRetVal = DecodeDataWord();
693 if ( fRetVal == 0 ) continue;
696 fNextStatus = kNextHC;
698 // NextData(); // if while loop!
699 // break; //if while loop!
706 // here fill the data arrays
708 for (Int_t it = 0; it < 3; it++)
710 if ( GetTimeBin() + it < GetNumberOfTimeBins() )
712 if (GetSignals()[it] > 0)
714 digits->SetDataUnchecked(fROW, fCOL, fTB + it, fSig[it]);
715 indexes->AddIndexTBin(fROW, fCOL, fTB + it);
716 if (man->UsesDictionaries())
718 track0->SetDataUnchecked(fROW, fCOL, fTB + it, 0);
719 track1->SetDataUnchecked(fROW, fCOL, fTB + it, 0);
720 track2->SetDataUnchecked(fROW, fCOL, fTB + it, 0);
723 } // check the tbins range
724 } // for each tbin of current 3
729 // following ifs have been moved to DEcodeDatawordV1V2
730 // if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 )
733 // if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax )
745 // NextData(); // if while loop!
749 if ( fNextStatus == kNextHC )
752 // 1) Find end_of_tracklet_marker
755 if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
761 // endoftrackletmarker?
762 if ( *fDataWord == kEndoftrackletmarker )
764 AliDebug(3, "end-of-tracklet-marker found");
765 fNextStatus = kSeekNonEoTracklet;
771 AliDebug(3, "Tracklet found");
777 if (fNextStatus == kSeekNonEoTracklet)
780 // 2) Look for non-end_of_tracklet_marker
782 //printf("Word %d: 0x%08x\n", fWordCtr, *fDataWord);
784 if ( *fDataWord != kEndoftrackletmarker )
786 fNextStatus = kDecodeHC;
787 AliDebug(3, "NON end-of-tracklet-marker found");
788 //// no do not continue - this should be the hcheader
792 //just go on and find the non-end_of_tracklet_marker
797 if ( fNextStatus == kDecodeHC )
799 AliDebug(3, "Decode HC");
802 // 3) This Word must be Half Chamber Header
804 if ( (*fDataWord & 0x00000003) == 1 )
806 DecodeHCheader(fTimeBinsCalib); // This is the new header!
807 fDET = fGeo->GetDetector(fLAYER, fSTACK, fSM);
808 fRowMax = fGeo->GetRowMax(fLAYER,fSTACK,fSM);
809 fColMax = fGeo->GetColMax(fROC);
811 if (fLastDET != fDET)
813 AliDebug(4, "New DET!");
814 // allocate stuff for the new det
815 //man->ResetArrays();
816 digits = (AliTRDdataArrayS *) man->GetDigits(fDET);
817 track0 = (AliTRDdataArrayI *) man->GetDictionary(fDET,0);
818 track1 = (AliTRDdataArrayI *) man->GetDictionary(fDET,1);
819 track2 = (AliTRDdataArrayI *) man->GetDictionary(fDET,2);
821 // Allocate memory space for the digits buffer
822 if (digits->GetNtime() == 0)
824 AliDebug(4, "Allocating digits");
825 //AliDebug(5, Form("Alloc digits for det %d", det));
826 digits->Allocate(fRowMax, fColMax, fTBins);
827 if (man->UsesDictionaries())
829 track0->Allocate(fRowMax, fColMax, fTBins);
830 track1->Allocate(fRowMax, fColMax, fTBins);
831 track2->Allocate(fRowMax, fColMax, fTBins);
835 indexes = man->GetIndexes(fDET);
837 indexes->SetStack(fSTACK);
838 indexes->SetLayer(fLAYER);
839 indexes->SetDetNumber(fDET);
841 if (indexes->IsAllocated() == kFALSE)
843 AliDebug(4, "Allocating indexes");
844 indexes->Allocate(fRowMax, fColMax, fTBins);
852 fChamberDone[fDET]++;
853 fNextStatus = kNextMCM;
854 AliDebug(3, "Decode HC OK");
859 AliDebug(3, "Decode HC NOT OK");
860 fNextStatus = kNextSM;
865 if (fNextStatus == kNextSM)
874 // After reading the first word check for size of this data and get Eq. ID
877 fDataSize = fRawReader->GetDataSize()/4; // Size of this payload in 32bit words
878 fEqID = fRawReader->GetEquipmentId(); // Get Equipment ID
879 if ( fDataSize > 0 ) fSizeOK = kTRUE;
883 if ( (*fDataWord & 0xfffff000) == 0xe0000000 )
886 fNextStatus = kNextHC;
891 AliWarning(Form("Equipment %d: First data word is not GTU Link Mask!", fEqID));
892 fRawReader->AddMajorErrorLog(kGTULinkMaskMissing,Form("Equipment %d",fEqID));
899 AliDebug(1, Form("That's all folks! %d", fSM));
904 //============================================================================
905 // Decoding functions
906 //============================================================================
909 //____________________________________________________________________________
910 void AliTRDRawStream::DecodeHCheader(Int_t timeBins)
913 // Decode the HC header (fRawVersion == 2, 3, 4, ???)
916 fRVmajor = (*fDataWord >> 24) & 0x7f;
917 fRVminor = (*fDataWord >> 17) & 0x7f;
919 if (fRVmajor < 2 || fRVmajor > 4)
920 AliError(Form(" Unsupported raw version: %d", fRawVersion))
922 if ( fRawVersion != fRVmajor ) {
924 AliWarning("===============================================================================");
925 AliWarning(Form("Mismatch between fRawVersion (%d) and fRVmajor from HC header (%d)"
926 ,fRawVersion,fRVmajor));
927 AliWarning(Form("Setting fRawVersion to %d", fRVmajor));
928 AliWarning("===============================================================================");
929 fRawVersion = fRVmajor;
934 // check for zero suppression
935 if ( fRawVersion >= 3 || fRawVersion <= 4 ) fZeroSuppressed = kTRUE;
936 else fZeroSuppressed = kFALSE;
939 if ( (*fDataWord & 0x3) == 1 ) {
941 fHCHWords = (*fDataWord >> 14) & 0x7;
942 fSM = (*fDataWord >> 9) & 0x1f;
943 fLAYER = (*fDataWord >> 6) & 0x7;
944 fSTACK = (*fDataWord >> 3) & 0x7;
945 fSIDE = (*fDataWord >> 2) & 0x1;
947 fROC = fGeo->GetDetectorSec(fLAYER, fSTACK);
949 AliDebug(3, Form("0x%08x: HC header: sm=%d; roc=%d; side=%x", *fDataWord, fSM, fROC, fSIDE+10));
959 AliWarning(Form("0x%08x: Strange HC header: dcs=%d; sm=%d; layer=%d; stack=%d.",
960 *fDataWord, fDCS, fSM, fLAYER, fSTACK));
961 fRawReader->AddMajorErrorLog(kHCHeaderCorrupt,Form("0x%08x:dcs=%d; sm=%d; layer=%d; stack=%d.",
962 *fDataWord, fDCS, fSM, fLAYER, fSTACK));
970 AliWarning(Form("0x%08x: No HC header when it was expected.", *fDataWord));
971 fRawReader->AddMajorErrorLog(kHCHeaderMissing,Form("0x%08x", *fDataWord));
975 if ( fHCHWords >= 1 ) {
976 // read one more word
977 if (NextData() != kWordOK)
979 AliWarning("Next HC word missing");
980 fRawReader->AddMajorErrorLog(kHCWordMissing,"Next HC word missing");
981 fNextStatus = kNextHC;
984 if ( (*fDataWord & 0x3) == 1 ) {
986 fBCctr = (*fDataWord >> 16);
987 fPTctr = (*fDataWord >> 12) & 0xf;
988 fPTphase = (*fDataWord >> 8) & 0xf;
989 fTBins = ((*fDataWord >> 2) & 0x3f) + 1;
991 AliDebug(3, Form("0x%08x: HC header 2: BCctr=%d PTctr=%d PTph=%d TB=%d"
992 , *fDataWord, fBCctr, fPTctr, fPTphase, fTBins));
994 if( fTBins != timeBins ) {
996 AliWarning("===============================================================================");
997 AliError(Form("Mismatch between nNTB from CDB (%d) and from HC header (%d)"
998 , timeBins, fTBins));
999 AliWarning(Form("We will use the value from the raw data (HC header): %d", fTBins));
1000 AliWarning("===============================================================================");
1002 fTimeWords = (fTBins - 1)/3 + 1;
1010 if ( fHCHWords >= 2 ) {
1011 // read one more word
1012 if (NextData() != kWordOK)
1014 AliWarning("Next HC word missing");
1015 fRawReader->AddMajorErrorLog(kHCWordMissing,"Next HC word missing");
1016 fNextStatus = kNextHC;
1019 if ( (*fDataWord & 0x3) == 1 ) {
1021 fTCon = (*fDataWord >> 29) & 0x1;
1022 fPEDon = (*fDataWord >> 31) & 0x1;
1023 fGAINon = (*fDataWord >> 30) & 0x1;
1024 fXTon = (*fDataWord >> 28) & 0x1;
1025 fNonLinOn = (*fDataWord >> 27) & 0x1;
1026 fBypass = (*fDataWord >> 26) & 0x1;
1028 fCommonAdditive = (*fDataWord >> 20) & 0x3f;
1030 AliDebug(3, Form("0x%08x: HC header 3: TC=%d, PED=%d, GAIN=%d, XT=%d, NonLin=%d, Bypass=%d, Add=%d"
1031 , fTCon, fPEDon, fGAINon, fXTon, fNonLinOn, fBypass, fCommonAdditive));
1037 //____________________________________________________________________________
1038 void AliTRDRawStream::DecodeMCMheader()
1042 // Decode the MCM header
1045 if ( fRawVersion < 1 || fRawVersion > 3 )
1047 AliError(Form(" Unsupported raw version: %d", fRawVersion));
1050 fMCM = (*fDataWord & 0xff000000) >> 24;
1051 fEv = (*fDataWord & 0x00fffff0) >> 4;
1056 fROW = AliTRDfeeParam::Instance()->GetPadRowFromMCM(fROB, fMCM);
1058 AliDebug(4, Form("0x%08x: SM%d L%dS%d. MCM Header: fROB=%d fMCM=%02d fEv=%02d"
1059 , *fDataWord, fSM, fLAYER, fSTACK, fROB, fMCM, fEv));
1061 if ( fROB % 2 == 0 && fSIDE == 1 ) {
1062 AliWarning(Form("SM%d L%dS%d: Mismatch between fROB (%d) and fSIDE (%d): fMCM=%02d"
1063 , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
1064 fRawReader->AddMajorErrorLog(kROBSideMismatch,Form("SM%d L%dS%d: fROB (%d) fSIDE (%d): fMCM=%02d"
1065 , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
1067 if ( fROB % 2 != 0 && fSIDE == 0 ) {
1068 AliWarning(Form("SM%d L%dS%d: Mismatch between fROB (%d) and fSIDE (%d): fMCM=%02d"
1069 , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
1070 fRawReader->AddMajorErrorLog(kROBSideMismatch,Form("SM%d L%dS%d: fROB (%d) fSIDE (%d): fMCM=%02d"
1071 , fSM, fLAYER, fSTACK, fROB, fSIDE, fMCM ));
1073 if ( (fSTACK == 2 && fROW >= fGeo->RowmaxC0()) ||
1074 (fSTACK != 2 && fROW >= fGeo->RowmaxC1()) || fROW < 0 ) {
1075 AliWarning(Form("SM%d L%dS%d: Wrong Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"
1076 , fSM, fLAYER, fSTACK, fROW, fROB, fSIDE, fMCM ));
1077 fRawReader->AddMajorErrorLog(kWrongPadrow,Form("SM%d L%dS%d: Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"
1078 , fSM, fLAYER, fSTACK, fROW, fROB, fSIDE, fMCM ));
1084 // AdcMask for Zero supressed data
1085 if ( fRawVersion == 3 ) {
1086 // read one more word
1087 if (NextData() != kWordOK)
1089 AliWarning("MCM ADC mask missing");
1090 fRawReader->AddMajorErrorLog(kMCMADCMaskMissing,"Missing");
1091 fNextStatus = kNextHC;
1094 if ( (*fDataWord & 0x000007ff) == 0xC ) { // at the moment bits 4-10 are empty
1096 for ( Int_t ctr = 0; ctr < fGeo->ADCmax(); ctr++ ) {
1097 if ( (*fDataWord >> (11+ctr)) == 0x1 ) fADCmask[ctr] = kTRUE;
1098 else fADCmask[ctr] = kFALSE;
1101 AliDebug(4, Form("0x%08x: ADC mask", *fDataWord));
1105 AliWarning("Expected ADC mask but did not find one!");
1106 fRawReader->AddMajorErrorLog(kMCMADCMaskMissing,"Decode error");
1113 //____________________________________________________________________________
1114 void AliTRDRawStream::DecodeTracklet()
1118 // Decode the Tracklet
1120 // this function is not tested yet on real tracklets
1123 if ( fRawVersion < 1 || fRawVersion > 3 )
1125 AliError(Form(" Unsupported raw version: %d", fRawVersion));
1128 fTracklPID = (*fDataWord >> 24) & 0xff;
1129 fTracklPadRow = (*fDataWord >> 20) & 0xf; // 0:15
1130 fTracklDefL = (*fDataWord >> 13) & 0x7f;
1131 fTracklPadPos = (*fDataWord) & 0x1fff;
1133 fTracklPID /= (Float_t)((1<<8) - 1); // 0:1 (steps of 0.39%)
1134 fTracklDefL = (fTracklDefL - ((1<< 7)-1)/2.) * 140.e-4; // -0.889:0.889cm
1135 fTracklPadPos = (fTracklPadPos - ((1<<13)-1)/2.) * 160.e-4; // -65.528:65.528 cm
1137 //AliDebug(4, Form("0x%08x: Tracklet found: SM%d L%dS%d side %x: PadRow=%d PadPos=%f DefL=%f PID=%f"
1138 // , *fDataWord, fSM, fLAYER, fSTACK, fSIDE+10
1139 // , fTracklPadRow, fTracklPadPos, fTracklDefL, fTracklPID));
1141 if( (fSTACK == 2) && (fTracklPadRow >= (Int_t) fGeo->RowmaxC0()) ||
1142 (fSTACK != 2) && (fTracklPadRow >= (Int_t) fGeo->RowmaxC1()) ) {
1143 AliWarning(Form("Strange Row read from Tracklet Word: %d", fTracklPadRow));
1144 fRawReader->AddMajorErrorLog(kTrackletRowMismatch,Form("Word: %d", fTracklPadRow));
1149 //____________________________________________________________________________
1150 void AliTRDRawStream::DecodeGTUlinkMask()
1154 // Decode the link masks sent by the GTU. These marke the active optical links
1155 // between GTU and Super Module. Up to now only fully active links are found
1156 // (0xfff = 12 active links).
1159 if ( fRawVersion < 1 || fRawVersion > 3 )
1161 AliError(Form(" Unsupported raw version: %d", fRawVersion));
1164 if ( fGTUctr1 == -1 ) fGTUctr2++;
1167 if ( (fGTUctr1 >= 0) && (fGTUctr1 < 5) && (fGTUctr2 >= 0) && (fGTUctr2 < 18) ) {
1168 fGTUlinkMask[fGTUctr2][fGTUctr1] = (*fDataWord & 0xfff);
1173 //____________________________________________________________________________
1174 Int_t AliTRDRawStream::DecodeDataWord()
1181 if ( fRawVersion >= 1 && fRawVersion <= 2 ) {
1182 return DecodeDataWordV1V2();
1184 else if ( fRawVersion >= 3 && fRawVersion <= 3 ) {
1185 return DecodeDataWordV3();
1188 AliError(Form(" Unsupported raw version: %d", fRawVersion));
1193 //____________________________________________________________________________
1194 Int_t AliTRDRawStream::DecodeDataWordV1V2()
1198 // Decode the Data (full raw data. No zero suppression. 21 adc channels)
1200 // return 0 means continue to next data word
1201 // return -1 means break data loop
1204 // // check the content first! - something wrong with that...
1205 // // Decode 32 bit data words with information from 3 time bins and copy the data
1206 // fSig[0] = (*fDataWord & 0x00000ffc) >> 2;
1207 // fSig[1] = (*fDataWord & 0x003ff000) >> 12;
1208 // fSig[2] = (*fDataWord & 0xffc00000) >> 22;
1209 // if (fSig[0] <= 0 && fSig[1] <= 0 && fSig[2] <= 0)
1212 if ( (*fDataWord & 0x00000003) != 0x2 && (*fDataWord & 0x00000003) != 0x3) {
1213 //AliWarning(Form("Data %08x : Data Word ends neither with b11 nor b10", (Int_t)*fDataWord));
1214 fRawReader->AddMinorErrorLog(kDataMaskError,Form("Data %08x", (Int_t)*fDataWord));
1218 if ( (*fDataWord & 0x00000003) != fTbSwitch ) { // Next ADC channel found
1219 fTbSwitch = (fTbSwitch & 2) | !(fTbSwitch & 1); // 0x3 <--> 0x2
1225 fTbSwitchCtr++; // Just read one word
1227 // We have only timeTotal time bins
1228 if ( fTbSwitchCtr > fTimeWords ) {
1229 //AliWarning(Form("Data is strange. Already found %d words for this ADC channel", (Int_t)fTbSwitchCtr));
1230 fRawReader->AddMinorErrorLog(kADCNumberOverflow,Form("%d words", (Int_t)fTbSwitchCtr));
1234 // We have only 21 ADC channels.
1235 if ( fADC > (Int_t)fGeo->ADCmax()-1 ) {
1236 //AliWarning(Form("Data %08x : Data is strange. fADC is already %d", (Int_t)*fDataWord, (Int_t)fADC));
1237 fRawReader->AddMinorErrorLog(kADCChannelOverflow,Form("Data %08x : fADC=%d", (Int_t)*fDataWord, (Int_t)fADC));
1241 // There are 18 pads connected to each MCM ADC channels 2...19. The other channels cross to other
1242 // MCMs and are good for online tracking in the MCM.
1243 if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 ) {
1246 fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fROB, fMCM, fADC);
1248 // We have only 144 Pad Columns
1249 //if ( fCOL > fColMax-1 || fCOL < 0 ) {
1250 if ( fCOL >= 0 && fCOL < fColMax && fROW >= 0 && fROW < fRowMax )
1252 // Decode 32 bit data words with information from 3 time bins and copy the data
1253 fSig[0] = (*fDataWord & 0x00000ffc) >> 2;
1254 fSig[1] = (*fDataWord & 0x003ff000) >> 12;
1255 fSig[2] = (*fDataWord & 0xffc00000) >> 22;
1257 if (fSig[0] > 0 || fSig[1] > 0 || fSig[2] > 0)
1264 // AliWarning(Form("SM%d L%dS%d: Wrong Pad column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
1265 // fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
1266 fRawReader->AddMajorErrorLog(kWrongPadcolumn,Form("SM%d L%dS%d: column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
1267 fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
1270 // Print data to screen:
1271 // Do NOT switch on for default production, it is VERY slow
1272 // AliDebug(5, Form("SM%d L%dS%d: ROB%d MCM=%d ADC=%d (ROW=%d COL=%d): Data %04d %04d %04d\n",
1273 // fSM, fLAYER, fSTACK, fROB, fMCM, fADC, fROW, fCOL, fSig[0], fSig[1], fSig[2]));
1286 //____________________________________________________________________________
1287 Int_t AliTRDRawStream::DecodeDataWordV3()
1291 // Decode the data (Zero suppresses data. 21 adc channels)
1293 // return 0 means continue to next data word
1294 // return -1 means break data loop
1296 // NOT TESTED YET!!!!!!!!
1299 if ( (*fDataWord & 0x00000003) != 0x2 && (*fDataWord & 0x00000003) != 0x3) {
1300 AliWarning(Form("Data %08x : Data Word ends neither with b11 nor b10", (Int_t)*fDataWord));
1301 fRawReader->AddMinorErrorLog(kDataMaskError,Form("Data %08x", (Int_t)*fDataWord));
1305 if ( (*fDataWord & 0x00000003) != fTbSwitch ) { // Next ADC channel found
1306 fTbSwitch = (fTbSwitch & 2) | !(fTbSwitch & 1); // 0x3 <--> 0x2
1309 // Jump to next ADC channel that is not masked
1312 } while ( ((fADC < fGeo->ADCmax()) && (fADCmask[fADC] == kFALSE)) || (fADC >= fGeo->ADCmax()) );
1316 fTbSwitchCtr++; // Just read one word
1318 // We have only timeTotal time bins
1319 if ( fTbSwitchCtr > fTimeWords ) {
1320 AliWarning(Form("Data is strange. Already found %d words for this ADC channel", (Int_t)fTbSwitchCtr));
1321 fRawReader->AddMinorErrorLog(kADCNumberOverflow,Form("%d words", (Int_t)fTbSwitchCtr));
1325 // We have only 21 ADC channels.
1326 if ( fADC > (Int_t)fGeo->ADCmax()-1 ) {
1327 AliWarning(Form("Data %08x : Data is strange. fADC is already %d", (Int_t)*fDataWord, (Int_t)fADC));
1328 fRawReader->AddMinorErrorLog(kADCChannelOverflow,Form("Data %08x : fADC=%d", (Int_t)*fDataWord, (Int_t)fADC));
1332 // There are 18 pads connected to each MCM ADC channels 2...19. The other channels cross to other
1333 // MCMs and are good for online tracking in the MCM.
1334 if ( fADC > 1 && fADC < (Int_t)fGeo->ADCmax()-1 ) {
1337 //fCOL = fGeo->GetPadColFromADC(fROB, fMCM, fADC);
1338 fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fROB, fMCM, fADC);
1340 // We have only 144 Pad Columns
1341 if ( fCOL > fColMax-1 || fCOL < 0 ) {
1342 AliWarning(Form("SM%d L%dS%d: Wrong Pad column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
1343 fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
1344 fRawReader->AddMajorErrorLog(kWrongPadcolumn,Form("SM%d L%dS%d: column (%d) fROB=%d, fSIDE=%d, fMCM=%02d", fSM,
1345 fLAYER, fSTACK, fCOL, fROB, fSIDE, fMCM ));
1348 // Decode 32 bit data words with information from 3 time bins and copy the data
1349 fSig[0] = (*fDataWord & 0x00000ffc) >> 2;
1350 fSig[1] = (*fDataWord & 0x003ff000) >> 12;
1351 fSig[2] = (*fDataWord & 0xffc00000) >> 22;
1353 // Print data to screen:
1354 AliDebug(5, Form("SM%d L%dS%d: ROB%d MCM=%d ADC=%d (ROW=%d COL=%d): Data %04d %04d %04d\n",
1355 fSM, fLAYER, fSTACK, fROB, fMCM, fADC, fROW, fCOL, fSig[0], fSig[1], fSig[2]));