]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDrawData.cxx
Fix in procedure for vertex recalculation
[u/mrichter/AliRoot.git] / TRD / AliTRDrawData.cxx
CommitLineData
5990c064 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
88cb7938 16/* $Id$ */
5990c064 17
18///////////////////////////////////////////////////////////////////////////////
19// //
20// TRD raw data conversion class //
21// //
22///////////////////////////////////////////////////////////////////////////////
23
0aff7a99 24
090026bf 25#include <TMath.h>
ecf39416 26#include "TClass.h"
5990c064 27
2745a409 28#include "AliDAQ.h"
f7ee745b 29#include "AliRawDataHeaderSim.h"
2745a409 30#include "AliRawReader.h"
31#include "AliLog.h"
0c349049 32#include "AliFstream.h"
cc26f39c 33#include "AliTreeLoader.h"
2745a409 34
5990c064 35#include "AliTRDrawData.h"
36#include "AliTRDdigitsManager.h"
bd0f8685 37#include "AliTRDgeometry.h"
b65e5048 38#include "AliTRDarrayDictionary.h"
39#include "AliTRDarrayADC.h"
8df1f8f5 40#include "AliTRDrawStream.h"
3551db50 41#include "AliTRDcalibDB.h"
ca21baaa 42#include "AliTRDSignalIndex.h"
dfd03fc3 43#include "AliTRDfeeParam.h"
44#include "AliTRDmcmSim.h"
f2ab58d4 45#include "AliTRDtrackletWord.h"
5896bc23 46#include "AliTRDdigitsParam.h"
dfd03fc3 47
5990c064 48ClassImp(AliTRDrawData)
49
037c5823 50Int_t AliTRDrawData::fgDataSuppressionLevel = 0;
987ba9a3 51
5990c064 52//_____________________________________________________________________________
2cb20be6 53AliTRDrawData::AliTRDrawData()
54 :TObject()
92c7f341 55 ,fRunLoader(NULL)
dfd03fc3 56 ,fGeo(NULL)
57 ,fFee(NULL)
8c703901 58 ,fNumberOfDDLs(0)
92c7f341 59 ,fTrackletTree(NULL)
eba523a2 60 ,fTracklets(NULL)
61 ,fTracks(NULL)
6a04e92b 62 ,fSMindexPos(0)
63 ,fStackindexPos(0)
64 ,fEventCounter(0)
50002f37 65 ,fMcmSim(new AliTRDmcmSim)
a0446ff1 66 ,fDigitsParam(NULL)
5990c064 67{
b864d801 68 //
69 // Default constructor
70 //
0c349049 71
dfd03fc3 72 fFee = AliTRDfeeParam::Instance();
73 fNumberOfDDLs = AliDAQ::NumberOfDdls("TRD");
0c349049 74
5990c064 75}
76
8c703901 77//_____________________________________________________________________________
78AliTRDrawData::AliTRDrawData(const AliTRDrawData &r)
79 :TObject(r)
92c7f341 80 ,fRunLoader(NULL)
dfd03fc3 81 ,fGeo(NULL)
82 ,fFee(NULL)
8c703901 83 ,fNumberOfDDLs(0)
92c7f341 84 ,fTrackletTree(NULL)
eba523a2 85 ,fTracklets(NULL)
86 ,fTracks(NULL)
6a04e92b 87 ,fSMindexPos(0)
88 ,fStackindexPos(0)
89 ,fEventCounter(0)
50002f37 90 ,fMcmSim(new AliTRDmcmSim)
a0446ff1 91 ,fDigitsParam(NULL)
8c703901 92{
93 //
94 // Copy constructor
95 //
0c349049 96
dfd03fc3 97 fFee = AliTRDfeeParam::Instance();
98 fNumberOfDDLs = AliDAQ::NumberOfDdls("TRD");
0c349049 99
8c703901 100}
101
5990c064 102//_____________________________________________________________________________
103AliTRDrawData::~AliTRDrawData()
104{
105 //
106 // Destructor
107 //
0c349049 108
eba523a2 109 if (fTracklets){
110 fTracklets->Delete();
111 delete fTracklets;
112 }
113
114 if (fTracks){
115 fTracks->Delete();
116 delete fTracks;
92c7f341 117 }
118
50002f37 119 delete fMcmSim;
120
8c703901 121}
122
123//_____________________________________________________________________________
037c5823 124Bool_t AliTRDrawData::Digits2Raw(TTree *digitsTree, const TTree *tracks )
8c703901 125{
126 //
127 // Initialize necessary parameters and call one
128 // of the raw data simulator selected by SetRawVersion.
129 //
130 // Currently tracklet output is not spported yet and it
131 // will be supported in higher version simulator.
132 //
133
037c5823 134 AliTRDdigitsManager* const digitsManager = new AliTRDdigitsManager();
8c703901 135
136 if (!digitsManager->ReadDigits(digitsTree)) {
137 delete digitsManager;
138 return kFALSE;
139 }
140
141 if (tracks != NULL) {
142 delete digitsManager;
7925de54 143 AliError("Tracklet input is not supported yet.");
8c703901 144 return kFALSE;
145 }
146
147 fGeo = new AliTRDgeometry();
148
f162af62 149 if (!AliTRDcalibDB::Instance()) {
7925de54 150 AliError("Could not get calibration object");
8c703901 151 delete fGeo;
152 delete digitsManager;
153 return kFALSE;
154 }
155
156 Int_t retval = kTRUE;
dfd03fc3 157 Int_t rv = fFee->GetRAWversion();
8c703901 158
159 // Call appropriate Raw Simulator
dfd03fc3 160 if ( rv > 0 && rv <= 3 ) retval = Digits2Raw(digitsManager);
7925de54 161 else {
162 retval = kFALSE;
dfd03fc3 163 AliWarning(Form("Unsupported raw version (%d).", rv));
8c703901 164 }
165
166 // Cleanup
167 delete fGeo;
168 delete digitsManager;
169
170 return retval;
171
172}
173
174//_____________________________________________________________________________
50378239 175Bool_t AliTRDrawData::Digits2Raw(AliTRDdigitsManager *digitsManager)
8c703901 176{
177 //
7925de54 178 // Raw data simulator for all versions > 0. This is prepared for real data.
8c703901 179 // This version simulate only raw data with ADC data and not with tracklet.
8c703901 180 //
181
0c349049 182 const Int_t kMaxHcWords = (fGeo->TBmax()/3)
183 * fGeo->ADCmax()
184 * fGeo->MCMmax()
185 * fGeo->ROBmaxC1()/2
186 + 100 + 20;
8c703901 187
188 // Buffer to temporary store half chamber data
0c349049 189 UInt_t *hcBuffer = new UInt_t[kMaxHcWords];
5896bc23 190
1d93b218 191 Bool_t newEvent = kFALSE; // only for correct readout tree
6a04e92b 192 Bool_t newSM = kFALSE; // new SM flag, for writing SM index words
193 Bool_t newStack = kFALSE; // new stack flag, for writing stack index words
8c703901 194
a0446ff1 195 // Get digits parameter
196 fDigitsParam = digitsManager->GetDigitsParam();
197
8c703901 198 // sect is same as iDDL, so I use only sect here.
053767a4 199 for (Int_t sect = 0; sect < fGeo->Nsector(); sect++) {
8c703901 200
201 char name[1024];
8df1f8f5 202 snprintf(name,1024,"TRD_%d.ddl",sect + AliTRDrawStream::kDDLOffset);
8c703901 203
08f92f14 204 AliFstream* of = new AliFstream(name);
8c703901 205
7d619a80 206 // Write a dummy data header
f7ee745b 207 AliRawDataHeaderSim header; // the event header
08f92f14 208 UInt_t hpos = of->Tellp();
209 of->WriteBuffer((char *) (& header), sizeof(header));
7d619a80 210
8c703901 211 // Reset payload byte size (payload does not include header).
212 Int_t npayloadbyte = 0;
213
6a04e92b 214 // check the existance of the data
215 // SM index word and Stack index word
037c5823 216 UInt_t *iwbuffer = new UInt_t[109]; // index word buffer; max 109 = 2 SM headers + 67 dummy headers + 5*8 stack headers
6a04e92b 217 Int_t nheader = 0;
037c5823 218 UInt_t bStackMask = 0x0;
219 Bool_t bStackHasData = kFALSE;
220 Bool_t bSMHasData = kFALSE;
7d619a80 221
037c5823 222 //iwbuffer[nheader++] = 0x0001a020; // SM index words
223 iwbuffer[nheader++] = 0x0044a020; // SM index words | additional SM header:48 = 1 SM header + 47 dummy words(for future use)
6a04e92b 224 iwbuffer[nheader++] = 0x10404071; // SM header
037c5823 225 for ( Int_t i=0; i<66; i++ ) iwbuffer[nheader++] = 0x00000000; // dummy words
226 iwbuffer[nheader++] = 0x10000000; // end of dummy words
7d619a80 227
6a04e92b 228 for ( Int_t stack= 0; stack < fGeo->Nstack(); stack++) {
7d619a80 229 UInt_t linkMask = 0x0;
230 for( Int_t layer = 0; layer < fGeo->Nlayer(); layer++) {
231 Int_t iDet = fGeo->GetDetector(layer,stack,sect);
232 AliTRDarrayADC *digits = (AliTRDarrayADC *) digitsManager->GetDigits(iDet);
233 if ( fgDataSuppressionLevel==0 || digits->HasData() ) {
234 bStackMask = bStackMask | ( 1 << stack ); // active stack mask for new stack
235 linkMask = linkMask | ( 3 << (2*layer) ); // 3 = 0011
236 bStackHasData = kTRUE;
237 bSMHasData = kTRUE;
238 } // has data
239 } // loop over layer
240
241 if ( fgDataSuppressionLevel==0 || bStackHasData ){
242 iwbuffer[nheader++] = 0x0007a000 | linkMask; // stack index word + link masks
243 if (fgDataSuppressionLevel==0) iwbuffer[nheader-1] = 0x0007afff; // no suppression
244 iwbuffer[nheader++] = 0x04045b01; // stack header
245 for (Int_t i=0;i<6;i++) iwbuffer[nheader++] = 0x00000000; // 6 dummy words
246 bStackHasData = kFALSE;
247 }
6a04e92b 248 } // loop over stack
7d619a80 249
037c5823 250 if ( fgDataSuppressionLevel==0 || bSMHasData ){
7d619a80 251 iwbuffer[0] = iwbuffer[0] | bStackMask; // add stack masks to SM index word
252 if (fgDataSuppressionLevel==0) iwbuffer[0] = 0x0044a03f; // no suppression : all stacks are active
253 of->WriteBuffer((char *) iwbuffer, nheader*4);
ff792017 254 AliDebug(11, Form("SM %d index word: %08x", sect, iwbuffer[0]));
255 AliDebug(11, Form("SM %d header: %08x", sect, iwbuffer[1]));
6a04e92b 256 }
6a04e92b 257 // end of SM & stack header ------------------------------------------------------------------------
258 // -------------------------------------------------------------------------------------------------
7d619a80 259
8c703901 260 // Prepare chamber data
053767a4 261 for( Int_t stack = 0; stack < fGeo->Nstack(); stack++) {
262 for( Int_t layer = 0; layer < fGeo->Nlayer(); layer++) {
7d619a80 263
264 Int_t iDet = fGeo->GetDetector(layer,stack,sect);
265 if (iDet == 0){
266 newEvent = kTRUE; // it is expected that each event has at least one tracklet;
267 // this is only needed for correct readout tree
268 fEventCounter++;
269 AliDebug(11, Form("New event!! Event counter: %d",fEventCounter));
270 }
271
272 if ( stack==0 && layer==0 ) newSM = kTRUE; // new SM flag
273 if ( layer==0 ) newStack = kTRUE; // new stack flag
274 AliDebug(15, Form("stack : %d, layer : %d, iDec : %d\n",stack,layer,iDet));
275 // Get the digits array
276 AliTRDarrayADC *digits = (AliTRDarrayADC *) digitsManager->GetDigits(iDet);
277 if (fgDataSuppressionLevel==0 || digits->HasData() ) { // second part is new!! and is for indicating a new event
278
279 if (digits->HasData()) digits->Expand();
280
281 Int_t hcwords = 0;
282
283 // Process A side of the chamber
284 hcwords = ProduceHcData(digits,0,iDet,hcBuffer,kMaxHcWords,newEvent,newSM);
285 if ( newEvent ) newEvent = kFALSE;
286 //AssignLinkMask(hcBuffer, layer); // active link mask for this layer(2*HC)
287 of->WriteBuffer((char *) hcBuffer, hcwords*4);
288 npayloadbyte += hcwords*4;
289
290 // Process B side of the chamber
291 hcwords = ProduceHcData(digits,1,iDet,hcBuffer,kMaxHcWords,newEvent,newSM);
292 of->WriteBuffer((char *) hcBuffer, hcwords*4);
293 npayloadbyte += hcwords*4;
294 } // has data
295
6a04e92b 296 } // loop over layer
297 } // loop over stack
7d619a80 298
8c703901 299 // Complete header
08f92f14 300 header.fSize = UInt_t(of->Tellp()) - hpos;
8c703901 301 header.SetAttribute(0); // Valid data
08f92f14 302 of->Seekp(hpos); // Rewind to header position
303 of->WriteBuffer((char *) (& header), sizeof(header));
8c703901 304 delete of;
8bd87c5e 305
306 delete [] iwbuffer;
307
037c5823 308 } // loop over sector(SM)
7d619a80 309
0c349049 310 delete [] hcBuffer;
7d619a80 311
8c703901 312 return kTRUE;
8c703901 313}
314
987ba9a3 315//_____________________________________________________________________________
316void AliTRDrawData::ProduceSMIndexData(UInt_t *buf, Int_t& nw){
317 //
318 // This function generates
319 // 1) SM index words : ssssssss ssssssss vvvv rrrr r d t mmmmm
320 // - s : size of SM header (number of header, default = 0x0001)
321 // - v : SM header version (default = 0xa)
322 // - r : reserved for future use (default = 00000)
323 // - d : track data enabled bit (default = 0)
324 // - t : tracklet data enabled bit (default = 1)
325 // - m : stack mask (each bit corresponds a stack, default = 11111)
326 //
327 // 2) SM header : rrr c vvvv vvvvvvvv vvvv rrrr bbbbbbbb
328 // - r : reserved for future use (default = 000)
329 // - c : clean check out flag (default = 1)
330 // - v : hardware design revision (default = 0x0404)
331 // - r : reserved for future use (default = 0x0)
332 // - b : physical board ID (default = 0x71)
333 //
334 // 3) stack index words : ssssssss ssssssss vvvv mmmm mmmmmmmm
335 // - s : size of stack header (number of header, (default = 0x0007)
336 // - v : header version (default = 0xa)
337 // - m : link mask (default = 0xfff)
338 //
339 // 4) stack header : vvvvvvvv vvvvvvvv bbbbbbbb rrrr rrr c
340 // - v : hardware design revision (default = 0x0404)
341 // - b : physical board ID (default = 0x5b)
342 // - r : reserved for future use (default = 0000 000)
343 // - c : clean checkout flag (default = 1)
344 //
345 // and 6 dummy words(0x00000000)
346 //
347
6a04e92b 348 //buf[nw++] = 0x0001a03f; // SM index words
349 fSMindexPos = nw; // memorize position of the SM index word for re-allocating stack mask
350 buf[nw++] = 0x0001a020; // SM index words
351 buf[nw++] = 0x10404071; // SM header
352
353 fStackindexPos = nw; // memorize position of the stack index word for future adding
354 /*
355 for (Int_t istack=0; istack<5; istack++){
356 buf[nw++] = 0x0007afff; // stack index words
357 buf[nw++] = 0x04045b01; // stack header
358 for (Int_t i=0;i<6;i++) buf[nw++] = 0x00000000; // 6 dummy words
359 } // loop over 5 stacks
360 */
361}
987ba9a3 362
6a04e92b 363//_____________________________________________________________________________
364void AliTRDrawData::AssignStackMask(UInt_t *buf, Int_t nStack){
365 //
366 // This function re-assign stack mask active(from 0 to 1) in the SM index word
367 //
368 buf[fSMindexPos] = buf[fSMindexPos] | ( 1 << nStack );
369}
370
371//_____________________________________________________________________________
543691ea 372Int_t AliTRDrawData::AddStackIndexWords(UInt_t *buf, Int_t /*nStack*/, Int_t nMax){
6a04e92b 373 //
374 // This function add stack index words and stack header when there is data for the stack
375 //
376 // 1) stack index words : ssssssss ssssssss vvvv mmmm mmmmmmmm
377 // - s : size of stack header (number of header, (default = 0x0007)
378 // - v : header version (default = 0xa)
379 // - m : link mask (default = 0xfff)
380 // - m : link mask (starting value = 0x000)
381 //
382 // 2) stack header : vvvvvvvv vvvvvvvv bbbbbbbb rrrr rrr c
383 // - v : hardware design revision (default = 0x0404)
384 // - b : physical board ID (default = 0x5b)
385 // - r : reserved for future use (default = 0000 000)
386 // - c : clean checkout flag (default = 1)
387 //
388 // and 6 dummy words(0x00000000)
389 //
390
391 Int_t nAddedWords = 0; // Number of added words
392 if ( ShiftWords(buf, fStackindexPos, 8, nMax)== kFALSE ){
393 AliError("Adding stack header failed.");
394 return 0;
395 }
396
397 buf[fStackindexPos++] = 0x0007a000; // stack index words
398 buf[fStackindexPos++] = 0x04045b01; // stack header
399 for (Int_t i=0;i<6;i++) buf[fStackindexPos++] = 0x00000000; // 6 dummy words
400 nAddedWords += 8;
987ba9a3 401
6a04e92b 402 return nAddedWords;
987ba9a3 403}
404
405//_____________________________________________________________________________
6a04e92b 406void AliTRDrawData::AssignLinkMask(UInt_t *buf, Int_t nLayer){
407 //
408 // This function re-assign link mask active(from 0 to 1) in the stack index word
409 //
410 buf[fStackindexPos-8] = buf[fStackindexPos-8] | ( 3 << (2*nLayer) ); // 3 = 0011
411}
412
413//_____________________________________________________________________________
414Bool_t AliTRDrawData::ShiftWords(UInt_t *buf, Int_t nStart, Int_t nWords, Int_t nMax){
415 //
416 // This function shifts n words
417 //
418 //if ( nStart+nWords > sizeof(buf)/sizeof(UInt_t) ){
419 // AliError("Words shift failed. No more buffer space.");
420 // return kFALSE;
421 //}
422
423 for ( Int_t iw=nMax; iw>nStart-1; iw--){
424 buf[iw+nWords] = buf[iw];
425 }
426 return kTRUE;
427}
428
429//_____________________________________________________________________________
0aff7a99 430Int_t AliTRDrawData::ProduceHcData(AliTRDarrayADC *digits, Int_t side, Int_t det, UInt_t *buf, Int_t maxSize, Bool_t /*newEvent = kFALSE*/, Bool_t /*newSM = kFALSE*/){
987ba9a3 431 //
7d619a80 432 // This function produces the raw data for one HC, i.e. tracklets, tracklet endmarkers,
433 // raw data, raw data endmarkers.
987ba9a3 434 // This function can be used for both ZS and NZS data
435 //
436
437 Int_t nw = 0; // Number of written words
438 Int_t of = 0; // Number of overflowed words
7d619a80 439 Int_t *tempnw = &nw; // Number of written words for temp. buffer
440 Int_t *tempof = &of; // Number of overflowed words for temp. buffer
987ba9a3 441 Int_t layer = fGeo->GetLayer( det ); // Layer
442 Int_t stack = fGeo->GetStack( det ); // Stack
443 Int_t sect = fGeo->GetSector( det ); // Sector (=iDDL)
f793c83d 444 const Int_t kCtype = fGeo->GetStack(det) == 2 ? 0 : 1; // Chamber type (0:C0, 1:C1)
987ba9a3 445
037c5823 446 Bool_t trackletOn = fFee->GetTracklet(); // tracklet simulation active?
987ba9a3 447
448 AliDebug(1,Form("Producing raw data for sect=%d layer=%d stack=%d side=%d",sect,layer,stack,side));
f793c83d 449
f793c83d 450 UInt_t *tempBuffer = buf; // tempBuffer used to write ADC data
451 // different in case of tracklet writing
452
037c5823 453 if (trackletOn) {
f793c83d 454 tempBuffer = new UInt_t[maxSize];
8bd87c5e 455 tempnw = new Int_t(0);
456 tempof = new Int_t(0);
7d619a80 457 }
458
459 WriteIntermediateWords(tempBuffer,*tempnw,*tempof,maxSize,det,side);
460
461 if (digits->HasData()) {
462 // scanning direction such, that tracklet-words are sorted in ascending z and then in ascending y order
463 // ROB numbering on chamber and MCM numbering on ROB increase with decreasing z and increasing y
464 for (Int_t iRobRow = 0; iRobRow <= (kCtype + 3)-1; iRobRow++ ) {
465 // ROB number should be increasing
466 Int_t iRob = iRobRow * 2 + side;
467 // MCM on one ROB
468 for (Int_t iMcmRB = 0; iMcmRB < fGeo->MCMmax(); iMcmRB++ ) {
469 Int_t iMcm = 16 - 4*(iMcmRB/4 + 1) + (iMcmRB%4);
470
50002f37 471 fMcmSim->Init(det, iRob, iMcm);
472 fMcmSim->SetData(digits); // no filtering done here (already done in digitizer)
7d619a80 473 if (trackletOn) {
50002f37 474 fMcmSim->Tracklet();
475 Int_t tempNw = fMcmSim->ProduceTrackletStream(&buf[nw], maxSize - nw);
7d619a80 476 if( tempNw < 0 ) {
477 of += tempNw;
478 nw += maxSize - nw;
479 AliError(Form("Buffer overflow detected. Please increase the buffer size and recompile."));
480 } else {
481 nw += tempNw;
482 }
483 }
50002f37 484 fMcmSim->ZSMapping(); // Calculate zero suppression mapping
7d619a80 485 // at the moment it has to be rerun here
486 // Write MCM data to temp. buffer
50002f37 487 Int_t tempNw = fMcmSim->ProduceRawStream( &tempBuffer[*tempnw], maxSize - *tempnw, fEventCounter );
7d619a80 488 if ( tempNw < 0 ) {
489 *tempof += tempNw;
490 *tempnw += maxSize - nw;
f793c83d 491 AliError(Form("Buffer overflow detected. Please increase the buffer size and recompile."));
492 } else {
7d619a80 493 *tempnw += tempNw;
f793c83d 494 }
495 }
f793c83d 496 }
7d619a80 497
7d619a80 498 // in case of tracklet writing copy temp data to final buffer
499 if (trackletOn) {
500 if (nw + *tempnw < maxSize) {
501 memcpy(&buf[nw], tempBuffer, *tempnw * sizeof(UInt_t));
502 nw += *tempnw;
503 }
504 else {
505 AliError("Buffer overflow detected");
506 }
f793c83d 507 }
987ba9a3 508 }
509
8bd87c5e 510 if (trackletOn) {
511 delete [] tempBuffer;
512 delete tempof;
513 delete tempnw;
514 }
515
987ba9a3 516 // Write end of raw data marker
6a04e92b 517 if (nw+3 < maxSize) {
7d619a80 518 buf[nw++] = fgkEndOfDataMarker;
519 buf[nw++] = fgkEndOfDataMarker;
520 buf[nw++] = fgkEndOfDataMarker;
521 buf[nw++] = fgkEndOfDataMarker;
987ba9a3 522 } else {
7d619a80 523 of += 4;
987ba9a3 524 }
525
526 if (of != 0) {
f793c83d 527 AliError("Buffer overflow. Data is truncated. Please increase buffer size and recompile.");
987ba9a3 528 }
529
530 return nw;
531}
532
5990c064 533//_____________________________________________________________________________
7925de54 534AliTRDdigitsManager *AliTRDrawData::Raw2Digits(AliRawReader *rawReader)
5990c064 535{
b864d801 536 //
50378239 537 // Vx of the raw data reading
b864d801 538 //
5990c064 539
e2e85093 540 rawReader->Select("TRD"); //[mj]
541
b65e5048 542 AliTRDarrayADC *digits = 0;
543 AliTRDarrayDictionary *track0 = 0;
544 AliTRDarrayDictionary *track1 = 0;
545 AliTRDarrayDictionary *track2 = 0;
5990c064 546
dfbb4bb9 547 //AliTRDSignalIndex *indexes = 0;
548 // Create the digits manager
549 AliTRDdigitsManager* digitsManager = new AliTRDdigitsManager();
550 digitsManager->CreateArrays();
551
eba523a2 552 AliTRDrawStream input(rawReader);
dfbb4bb9 553
f2ab58d4 554 // ----- preparing tracklet output -----
555 AliDataLoader *trklLoader = AliRunLoader::Instance()->GetLoader("TRDLoader")->GetDataLoader("tracklets");
556 if (!trklLoader) {
f2ab58d4 557 trklLoader = new AliDataLoader("TRD.Tracklets.root","tracklets", "tracklets");
558 AliRunLoader::Instance()->GetLoader("TRDLoader")->AddDataLoader(trklLoader);
559 }
8bd87c5e 560 if (!trklLoader) {
561 return 0x0;
562 }
cc26f39c 563 AliTreeLoader *trklTreeLoader = dynamic_cast<AliTreeLoader*> (trklLoader->GetBaseLoader("tracklets-raw"));
564 if (!trklTreeLoader) {
565 trklTreeLoader = new AliTreeLoader("tracklets-raw", trklLoader);
566 trklLoader->AddBaseLoader(trklTreeLoader);
567 }
8bd87c5e 568 if (!trklTreeLoader) {
569 return 0x0;
570 }
cc26f39c 571
572 if (!trklTreeLoader->Tree())
573 trklTreeLoader->MakeTree();
f2ab58d4 574
eba523a2 575 input.SetTrackletArray(TrackletsArray());
576 input.SetTrackArray(TracksArray());
577
dfbb4bb9 578 // Loop through the digits
579 Int_t det = 0;
580
581 while (det >= 0)
582 {
eba523a2 583 det = input.NextChamber(digitsManager);
50002f37 584
dfbb4bb9 585 if (det >= 0)
586 {
587 // get...
b65e5048 588 digits = (AliTRDarrayADC *) digitsManager->GetDigits(det);
589 track0 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,0);
590 track1 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,1);
591 track2 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,2);
dfbb4bb9 592 // and compress
b65e5048 593 if (digits) digits->Compress();
594 if (track0) track0->Compress();
595 if (track1) track1->Compress();
596 if (track2) track2->Compress();
dfbb4bb9 597 }
598 }
599
8bd87c5e 600 trklTreeLoader->WriteData("OVERWRITE");
601 trklLoader->UnloadAll();
f2ab58d4 602
dfbb4bb9 603 return digitsManager;
604}
605
1d93b218 606//_____________________________________________________________________________
607void AliTRDrawData::WriteIntermediateWords(UInt_t* buf, Int_t& nw, Int_t& of, const Int_t& maxSize, const Int_t& det, const Int_t& side) {
037c5823 608 //
609 // write tracklet end marker(0x10001000)
610 // and half chamber headers(H[0] and H[1])
611 //
987ba9a3 612
613 Int_t layer = fGeo->GetLayer( det ); // Layer
614 Int_t stack = fGeo->GetStack( det ); // Stack
615 Int_t sect = fGeo->GetSector( det ); // Sector (=iDDL)
616 Int_t rv = fFee->GetRAWversion();
a0446ff1 617 const Int_t kNTBin = fDigitsParam->GetNTimeBins(det);
5896bc23 618 Bool_t trackletOn = fFee->GetTracklet();
987ba9a3 619 UInt_t x = 0;
620
621 // Write end of tracklet marker
7d619a80 622 if (nw < maxSize){
623 buf[nw++] = fgkEndOfTrackletMarker;
624 buf[nw++] = fgkEndOfTrackletMarker; // the number of tracklet end marker should be more than 2
6a04e92b 625 }
626 else {
7d619a80 627 of++;
6a04e92b 628 }
987ba9a3 629
7d619a80 630 // Half Chamber header
631 // h[0] (there are 2 HC headers) xmmm mmmm nnnn nnnq qqss sssp ppcc ci01
632 // , where x : Raw version speacial number (=1)
633 // m : Raw version major number (test pattern, ZS, disable tracklet, 0, options)
634 // n : Raw version minor number
635 // q : number of addtional header words (default = 1)
636 // s : SM sector number (ALICE numbering)
637 // p : plane(layer) number
638 // c : chamber(stack) number
639 // i : side number (0:A, 1:B)
640 Int_t majorv = 0; // The major version number
987ba9a3 641 Int_t minorv = 0; // The minor version number
642 Int_t add = 1; // The number of additional header words to follow : now 1, previous 2
7d619a80 643 Int_t tp = 0; // test pattern (default=0)
644 Int_t zs = (rv==3) ? 1 : 0; // zero suppression
645 Int_t dt = (trackletOn) ? 0 : 1; // disable tracklet
646
647 majorv = (tp<<6) | (zs<<5) | (dt<<4) | 1; // major version
648
987ba9a3 649 x = (1<<31) | (majorv<<24) | (minorv<<17) | (add<<14) | (sect<<9) | (layer<<6) | (stack<<3) | (side<<2) | 1;
650 if (nw < maxSize) buf[nw++] = x; else of++;
7d619a80 651
987ba9a3 652 // h[1] tttt ttbb bbbb bbbb bbbb bbpp pphh hh01
7d619a80 653 // , where t : number of time bins
654 // b : bunch crossing number
655 // p : pretrigger counter
656 // h : pretrigger phase
987ba9a3 657 Int_t bcCtr = 99; // bunch crossing counter. Here it is set to 99 always for no reason
658 Int_t ptCtr = 15; // pretrigger counter. Here it is set to 15 always for no reason
659 Int_t ptPhase = 11; // pretrigger phase. Here it is set to 11 always for no reason
660 //x = (bcCtr<<16) | (ptCtr<<12) | (ptPhase<<8) | ((kNTBin-1)<<2) | 1; // old format
6a04e92b 661 x = ((kNTBin)<<26) | (bcCtr<<10) | (ptCtr<<6) | (ptPhase<<2) | 1;
987ba9a3 662 if (nw < maxSize) buf[nw++] = x; else of++;
987ba9a3 663}
1d93b218 664
eba523a2 665TClonesArray *AliTRDrawData::TrackletsArray()
92c7f341 666{
eba523a2 667 // Returns the array of on-line tracklets
92c7f341 668
eba523a2 669 if (!fTracklets) {
670 fTracklets = new TClonesArray("AliTRDtrackletWord", 2*MAXTRACKLETSPERHC);
92c7f341 671 }
eba523a2 672 return fTracklets;
673}
92c7f341 674
eba523a2 675TClonesArray* AliTRDrawData::TracksArray()
676{
677 // return array of GTU tracks (create TClonesArray if necessary)
92c7f341 678
eba523a2 679 if (!fTracks) {
680 fTracks = new TClonesArray("AliESDTrdTrack",100);
92c7f341 681 }
eba523a2 682 return fTracks;
92c7f341 683}