]> git.uio.no Git - u/mrichter/AliRoot.git/blame - START/AliSTARTRawReader.cxx
events quality macro
[u/mrichter/AliRoot.git] / START / AliSTARTRawReader.cxx
CommitLineData
ee74718b 1#include "AliSTARTRawReader.h"
2#include "AliSTARTRawData.h"
db173afc 3#include "AliSTARTdigit.h"
460b4363 4#include "AliBitPacking.h"
31199586 5#include "TBits.h"
ee74718b 6
7#include <Riostream.h>
8#include "TMath.h"
9#include "TH1F.h"
10#include "TArrayI.h"
11#include "AliLog.h"
12
13ClassImp(AliSTARTRawReader)
db173afc 14
15 AliSTARTRawReader::AliSTARTRawReader (AliRawReader *rawReader, TTree* tree)
16 : TTask("STARTRawReader","read raw START data"),
074027eb 17 fDigits(NULL),
db173afc 18 fTree(tree),
19 fRawReader(rawReader)
ee74718b 20{
21 //
22// create an object to read STARTraw digits
23 AliDebug(1,"Start ");
31199586 24 if (fDigits == 0x0) fDigits = new AliSTARTdigit();
25 fTree->Branch("START","AliSTARTdigit",&fDigits,405,1);
26
27 fRawReader->Reset();
362c9d61 28 fRawReader->Select("START");
31199586 29
ee74718b 30
31}
32 AliSTARTRawReader::~AliSTARTRawReader ()
33{
db173afc 34 //
ee74718b 35}
ee74718b 36
4c7da157 37Bool_t AliSTARTRawReader::Next()
ee74718b 38{
39// read the next raw digit
40// returns kFALSE if there is no digit left
61be8c4a 41//"LookUpTable":
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
50
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
58
59
60 UInt_t word;
61 Int_t time=0, itdc=0, ichannel=0;
62 Int_t numberOfWordsInTRM=0, iTRM=0;
63 Int_t tdcTime, koef ;
64 Int_t allData[107];
460b4363 65
db173afc 66 TArrayI *timeTDC1 = new TArrayI(24);
67 TArrayI * chargeTDC1 = new TArrayI(24);
68 TArrayI *timeTDC2 = new TArrayI(24);
69 TArrayI *chargeTDC2 = new TArrayI(24);
61be8c4a 70
71 for ( Int_t k=0; k<107; k++) allData[k]=0;
31199586 72 do {
73 if (!fRawReader->ReadNextData(fData)) return kFALSE;
74 } while (fRawReader->GetDataSize() == 0);
db173afc 75
61be8c4a 76 // fPosition = GetPosition();
77 fPosition = 0;
3e32c02e 78
61be8c4a 79 //DRM header
80 for (Int_t i=0; i<4; i++) {
81 word = GetNextWord();
82 }
83 //TRMheader
31199586 84 word = GetNextWord();
61be8c4a 85 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
86 iTRM=AliBitPacking::UnpackWord(word,0,3);
3e32c02e 87
61be8c4a 88 //chain header
3e32c02e 89 word = GetNextWord();
61be8c4a 90
91 for (Int_t i=0; i<numberOfWordsInTRM; i++) {
92 word = GetNextWord();
93 tdcTime = AliBitPacking::UnpackWord(word,31,31);
94
95 if ( tdcTime == 1)
96 {
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;
101 allData[koef]=time;
102 }
103 }
104 word = GetNextWord(); //chain trailer
105 word = GetNextWord(); //TRM trailer
106
107 //TRMheader
108 word = GetNextWord();
109 numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
110 iTRM=AliBitPacking::UnpackWord(word,0,3);
111 //chain header
3e32c02e 112 word = GetNextWord();
61be8c4a 113
114 for (Int_t iword=0; iword<numberOfWordsInTRM; iword++) {
115 word = GetNextWord();
116 tdcTime = AliBitPacking::UnpackWord(word,31,31);
117
118 if ( tdcTime == 1)
119 {
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;
125 }
126 }
127
128 for (Int_t in=0; in<24; in++)
129 {
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);
134 }
3e32c02e 135 word = GetNextWord();
3e32c02e 136 word = GetNextWord();
d1e4fb84 137
61be8c4a 138 fDigits->SetTime(*timeTDC2);
139 fDigits->SetADC(*chargeTDC1);
3e32c02e 140
61be8c4a 141 fDigits->SetTimeAmp(*timeTDC1);
142 fDigits->SetADCAmp(*chargeTDC2);
143 fTree->Fill();
3e32c02e 144
61be8c4a 145 delete timeTDC1 ;
146 delete chargeTDC1;
147 delete timeTDC2 ;
148 delete chargeTDC2;
149
150 return kTRUE;
151}
152//_____________________________________________________________________________
153/*
154void AliSTARTRawReader::UnpackTime(Int_t outTime, Int_t outCh)
155{
156 UInt_t word=0;
157 UInt_t unpackword=0;
31199586 158
159 word = GetNextWord();
61be8c4a 160 unpackword=AliBitPacking::UnpackWord(word,0,12);
161 outTime=unpackword;
162 unpackword= AliBitPacking::UnpackWord(word,21,27);
163 outCh=unpackword;
164 }
165 */
31199586 166//_____________________________________________________________________________
167Int_t AliSTARTRawReader::GetPosition()
168{
169 // Sets the position in the
170 // input stream
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;
174}
175//_____________________________________________________________________________
176UInt_t AliSTARTRawReader::GetNextWord()
177{
178 // Read the next 32 bit word in backward direction
179 // The input stream access is given by fData and fPosition
180
61be8c4a 181
182 // fPosition--;
31199586 183 Int_t iBit = fPosition * 32;
184 Int_t iByte = iBit / 8;
1d88be16 185
31199586 186 UInt_t word = 0;
1d88be16 187 word = fData[iByte+3]<<24;
188 word |= fData[iByte+2]<<16;
189 word |= fData[iByte+1]<<8;
190 word |= fData[iByte];
61be8c4a 191 fPosition++;
192
31199586 193 return word;
194
195}
196