1 #include "AliSTARTRawReader.h"
2 #include "AliSTARTRawData.h"
3 #include "AliSTARTdigit.h"
4 #include "AliBitPacking.h"
13 ClassImp(AliSTARTRawReader)
15 AliSTARTRawReader::AliSTARTRawReader (AliRawReader *rawReader, TTree* tree)
16 : TTask("STARTRawReader","read raw START data"),
22 // create an object to read STARTraw digits
24 if (fDigits == 0x0) fDigits = new AliSTARTdigit();
25 fTree->Branch("START","AliSTARTdigit",&fDigits,405,1);
28 fRawReader->Select("START");
32 AliSTARTRawReader::~AliSTARTRawReader ()
37 Bool_t AliSTARTRawReader::Next()
39 // read the next raw digit
40 // returns kFALSE if there is no digit left
42 // Amplitude LED TRM=0; chain=0; TDC 0 -5 channel 0,2,4,6
43 // Time CFD TRM=0; chain=0; TDC 6 - 11 channel 0,2,4,6
44 // mean time TRM=0; chain=0; TDC 12 channel 0
45 // T0A TRM=0; chain=0; TDC 12 channel 2
46 // T0C TRM=0; chain=0; TDC 12 channel 4
47 // vertex TRM=0; chain=0; TDC 12 channel 6
48 // mult QTC0 TRM=0; chain=0; TDC 13 channel 0
49 // mult QTC1 TRM=0; chain=0; TDC 13 channel 2
51 // Charge QTC0 TRM=1; chain=0; TDC 0 -5 channel 0,2,4,6
52 // Charge QTC1 TRM=1; chain=0; TDC 6 - 11 channel 0,2,4,6
53 // T0A trigger TRM=1; chain=0; TDC 12 channel 0
54 // T0C trigger TRM=1; chain=0; TDC 12 channel 2
55 // vertex trigger TRM=1; chain=0; TDC 12 channel 4
56 // trigger central TRM=1; chain=0; TDC 13 channel 0
57 // tigger semicenral TRM=1; chain=0; TDC 13 channel 2
61 Int_t time=0, itdc=0, ichannel=0;
62 Int_t numberOfWordsInTRM=0, iTRM=0;
66 TArrayI *timeTDC1 = new TArrayI(24);
67 TArrayI * chargeTDC1 = new TArrayI(24);
68 TArrayI *timeTDC2 = new TArrayI(24);
69 TArrayI *chargeTDC2 = new TArrayI(24);
71 for ( Int_t k=0; k<107; k++) allData[k]=0;
73 if (!fRawReader->ReadNextData(fData)) return kFALSE;
74 } while (fRawReader->GetDataSize() == 0);
76 // fPosition = GetPosition();
80 for (Int_t i=0; i<4; i++) {
85 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
86 iTRM=AliBitPacking::UnpackWord(word,0,3);
91 for (Int_t i=0; i<numberOfWordsInTRM; i++) {
93 tdcTime = AliBitPacking::UnpackWord(word,31,31);
97 itdc=AliBitPacking::UnpackWord(word,24,27);
98 ichannel=AliBitPacking::UnpackWord(word,21,23);
99 time=AliBitPacking::UnpackWord(word,0,20);
100 koef = itdc*4 + ichannel/2;
104 word = GetNextWord(); //chain trailer
105 word = GetNextWord(); //TRM trailer
108 word = GetNextWord();
109 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
110 iTRM=AliBitPacking::UnpackWord(word,0,3);
112 word = GetNextWord();
114 for (Int_t iword=0; iword<numberOfWordsInTRM; iword++) {
115 word = GetNextWord();
116 tdcTime = AliBitPacking::UnpackWord(word,31,31);
120 itdc=AliBitPacking::UnpackWord(word,24,27);
121 ichannel=AliBitPacking::UnpackWord(word,21,23);
122 time=AliBitPacking::UnpackWord(word,0,20);
123 koef = itdc*4 + ichannel/2;
124 allData[koef+54]=time;
128 for (Int_t in=0; in<24; in++)
130 timeTDC1->AddAt(allData[in],in);
131 timeTDC2->AddAt(allData[in+24],in);
132 chargeTDC1->AddAt(allData[in+54],in);
133 chargeTDC2->AddAt(allData[in+78],in);
135 word = GetNextWord();
136 word = GetNextWord();
138 fDigits->SetTime(*timeTDC2);
139 fDigits->SetADC(*chargeTDC1);
141 fDigits->SetTimeAmp(*timeTDC1);
142 fDigits->SetADCAmp(*chargeTDC2);
152 //_____________________________________________________________________________
154 void AliSTARTRawReader::UnpackTime(Int_t outTime, Int_t outCh)
159 word = GetNextWord();
160 unpackword=AliBitPacking::UnpackWord(word,0,12);
162 unpackword= AliBitPacking::UnpackWord(word,21,27);
166 //_____________________________________________________________________________
167 Int_t AliSTARTRawReader::GetPosition()
169 // Sets the position in the
171 if (((fRawReader->GetDataSize() * 8) % 32) != 0)
172 AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
173 return (fRawReader->GetDataSize() * 8) / 32;
175 //_____________________________________________________________________________
176 UInt_t AliSTARTRawReader::GetNextWord()
178 // Read the next 32 bit word in backward direction
179 // The input stream access is given by fData and fPosition
183 Int_t iBit = fPosition * 32;
184 Int_t iByte = iBit / 8;
187 word = fData[iByte+3]<<24;
188 word |= fData[iByte+2]<<16;
189 word |= fData[iByte+1]<<8;
190 word |= fData[iByte];