3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>, Anders Vestbo <mailto:vestbo$fi.uib.no>, Constantin Loizides <mailto:loizides@ikf.uni-frankfurt.de>
4 //*-- Copyright © ALICE HLT Group
6 /** \class AliHLTTPCMemHandler
8 //_____________________________________________________________
11 // The HLT Binary File handler
13 // This class does all the memory I/O handling of HLT binary files.
18 // 1) Reading a binary file:
20 // AliHLTTPCMemHandler file;
21 // file.SetBinaryInput(filename);
22 // file.Init(slice,patch);
25 // AliHLTTPCDigitRowData *data = file.CompBinary2Memory(nrows);
27 // for(int i=0; i<nrows; i++)
30 // AliHLTTPCDigitData *dataPt = (AliHLTTPCDigitData*)data->fDigitData;
31 // for(int j=0; j<data->fNDigit; j++)
33 // pad = dataPt[j].fPad;
34 // time = dataPt[j].fTime;
35 // charge = dataPt[j].fCharge;
38 // file.UpdateRowPointer(data);
41 // file.CloseBinaryInput();
42 // ________________________
44 // 2) Writing a binary file:
46 // //First of all you need to store the data in memory,
47 // //and have a pointer to it of type AliHLTTPCDigitRowData.
48 // //E.g. if you just want to write the data you read in example 1)
49 // //into a new file, you can do the following:
51 // AliHLTTPCMemHandler newfile;
52 // newfile.Init(slice,patch);
53 // newfile.SetBinaryOutput(newfilename);
54 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliHLTTPCDigitRowData*)data);
55 // newfile.CloseBinaryOutput();
58 // Compressed file format:
59 // -----------------------
61 // The data is RLE encoded and currently using _10_ bit range for the ADC-values.
65 #include "AliHLTTPCRootTypes.h"
66 #include "AliHLTTPCDigitData.h"
67 #include "AliHLTTPCLogging.h"
68 #include "AliHLTTPCTransform.h"
69 #include "AliHLTTPCTrackSegmentData.h"
70 #include "AliHLTTPCSpacePointData.h"
71 #include "AliHLTTPCTrackArray.h"
72 #include "AliHLTTPCMemHandler.h"
78 ClassImp(AliHLTTPCMemHandler)
80 AliHLTTPCMemHandler::AliHLTTPCMemHandler()
99 AliHLTTPCMemHandler::~AliHLTTPCMemHandler()
102 if(fPt) delete[] fPt;
103 if(fRandomDigits) delete [] fRandomDigits;
104 if(fDPt) delete [] fDPt;
107 void AliHLTTPCMemHandler::Init(Int_t s,Int_t p, Int_t *r)
115 fRowMin=AliHLTTPCTransform::GetFirstRow(p);
116 fRowMax=AliHLTTPCTransform::GetLastRow(p);
121 void AliHLTTPCMemHandler::ResetROI()
123 //Resets the Look-up table for Region of Interest mode.
124 for(Int_t i=fRowMin; i<=fRowMax; i++)
126 fEtaMinTimeBin[i] = 0;
127 fEtaMaxTimeBin[i] = AliHLTTPCTransform::GetNTimeBins()-1;
131 void AliHLTTPCMemHandler::SetROI(Float_t *eta,Int_t */*slice*/)
133 // Init the Look-up table for the Region of Interest mode.
134 // Here you can specify a certain etaregion, - all data
135 // outside this region will be discarded:
136 // eta[0] = mimium eta
137 // eta[1] = maximum eta
138 // slice[0] = mimumum slice
139 // slice[1] = maximum slice
144 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetROI","Eta Values")
145 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
146 for(Int_t i=fRowMin; i<=fRowMax; i++)
154 for(Int_t i=fRowMin; i<=fRowMax; i++)
159 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
161 xyz[0] = AliHLTTPCTransform::Row2X(i);
163 xyz[2] = xyz[0]/tan(thetamax);
164 AliHLTTPCTransform::Slice2Sector(fSlice,i,sector,row);
165 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
167 fEtaMinTimeBin[i] = (Int_t)xyz[2];
170 fEtaMaxTimeBin[i] = 445;
173 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
174 xyz[0] = AliHLTTPCTransform::Row2X(i);
175 xyz[1] = AliHLTTPCTransform::GetMaxY(i);
176 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
177 xyz[2] = radii/tan(thetamin);
178 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
179 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
185 Bool_t AliHLTTPCMemHandler::SetBinaryInput(char *name)
187 //Set the input binary file.
188 fInBinary = fopen(name,"r");
190 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
191 <<"Error opening file "<<name<<ENDLOG;
197 Bool_t AliHLTTPCMemHandler::SetBinaryInput(FILE *file)
199 //Set the input binary file.
202 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
203 <<"Pointer to File = 0x0 "<<ENDLOG;
209 void AliHLTTPCMemHandler::CloseBinaryInput()
211 //Close the input file.
213 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryInput","File Close")
214 <<"Nothing to Close"<<ENDLOG;
221 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(char *name)
223 //Set the binary output file.
224 fOutBinary = fopen(name,"w");
226 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
227 <<"Pointer to File = 0x0 "<<ENDLOG;
233 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(FILE *file)
235 //Set the binary output file.
238 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
239 <<"Pointer to File = 0x0 "<<ENDLOG;
245 void AliHLTTPCMemHandler::CloseBinaryOutput()
249 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryOutPut","File Close")
250 <<"Nothing to Close"<<ENDLOG;
257 UInt_t AliHLTTPCMemHandler::GetFileSize()
259 //Returns the file size in bytes of the input file.
261 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetFileSize","File")
262 <<"No Input File"<<ENDLOG;
265 fseek(fInBinary,0,SEEK_END);
266 UInt_t size = (UInt_t) ftell(fInBinary);
271 Byte_t *AliHLTTPCMemHandler::Allocate()
274 return Allocate(GetFileSize());
277 Byte_t *AliHLTTPCMemHandler::Allocate(AliHLTTPCTrackArray *array)
279 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
281 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Allocate","Memory")
282 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
285 return Allocate(array->GetOutSize());
288 Byte_t *AliHLTTPCMemHandler::Allocate(UInt_t size)
290 //Allocate memory of size in bytes.
292 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Allocate","Memory")
293 <<"Delete Memory"<<ENDLOG;
296 fPt = new Byte_t[size];
299 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Allocate","Memory")
300 <<AliHLTTPCLog::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
304 void AliHLTTPCMemHandler::Free()
306 //Clear the memory, if allocated.
308 // LOG(AliHLTTPCLog::kInformational,"AliHLTTPCMemHandler::Free","Memory")
309 // <<"No Memory allocated - can't Free"<<ENDLOG;
317 ///////////////////////////////////////// Random
318 void AliHLTTPCMemHandler::SetRandomSeed()
320 //If you are adding random data to the original data.
322 SetRandomSeed(time(tp));
325 void AliHLTTPCMemHandler::SetRandomCluster(Int_t maxnumber)
327 //If you are adding random data to the original data.
330 fNRandom = maxnumber;
332 if(fRandomDigits) delete [] fRandomDigits;
333 fRandomDigits = new AliHLTTPCRandomDigitData[fNRandom*9];
334 if(fDPt) delete [] fDPt;
335 fDPt = new AliHLTTPCRandomDigitData *[fNRandom*9];
338 void AliHLTTPCMemHandler::QSort(AliHLTTPCRandomDigitData **a, Int_t first, Int_t last)
341 // Sort array of AliHLTTPCRandomDigitData pointers using a quicksort algorithm.
342 // Uses CompareDigits() to compare objects.
345 static AliHLTTPCRandomDigitData *tmp;
346 static int i; // "static" to save stack space
349 while (last - first > 1) {
353 while (++i < last && CompareDigits(a[i], a[first]) < 0)
355 while (--j > first && CompareDigits(a[j], a[first]) > 0)
372 if (j - first < last - (j + 1)) {
374 first = j + 1; // QSort(j + 1, last);
376 QSort(a, j + 1, last);
377 last = j; // QSort(first, j);
382 UInt_t AliHLTTPCMemHandler::GetRandomSize() const
386 for(Int_t r=fRowMin;r<=fRowMax;r++){
387 Int_t npad=AliHLTTPCTransform::GetNPads(r);
388 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
390 return 9 * nrandom * sizeof(AliHLTTPCDigitData);
393 void AliHLTTPCMemHandler::Generate(Int_t row)
395 //Generate random data on row, if you didn't
396 //ask for this, nothing happens here.
398 if(!fIsRandom) return;
401 Int_t npad=AliHLTTPCTransform::GetNPads(row);
402 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
403 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
404 (Double_t) ntime/(Double_t) AliHLTTPCTransform::GetNTimeBins() );
406 for(Int_t n=0;n<nrandom;n++){
407 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
408 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
409 Int_t charge = (int)((float)rand()/RAND_MAX*AliHLTTPCTransform::GetADCSat());
410 DigitizePoint(row,pad,time,charge);
412 QSort(fDPt,0,fNDigits);
416 void AliHLTTPCMemHandler::DigitizePoint(Int_t row, Int_t pad,
417 Int_t time,Int_t charge)
419 //Making one single random cluster.
420 for(Int_t j=-1;j<2;j++){
421 for(Int_t k=-1;k<2;k++){
422 Int_t dcharge = charge;
425 if(dcharge<10) continue;
426 Int_t dpad = j + pad;
427 Int_t dtime = k + time;
429 if(dpad<0||dpad>=AliHLTTPCTransform::GetNPads(row)) continue;
430 if(dtime<0||dtime>=AliHLTTPCTransform::GetNTimeBins()) continue;
432 fRandomDigits[fNDigits].fCharge = dcharge;
433 fRandomDigits[fNDigits].fRow = row;
434 fRandomDigits[fNDigits].fPad = dpad;
435 fRandomDigits[fNDigits].fTime = dtime;
436 fDPt[fNDigits] = &fRandomDigits[fNDigits];
442 ///////////////////////////////////////// Digit IO
443 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t nrow,AliHLTTPCDigitRowData *data)
445 //Write data to the outputfile as is. No run-length encoding is done.
448 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
449 <<"No Output File"<<ENDLOG;
453 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
454 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
458 AliHLTTPCDigitRowData *rowPt = data;
460 for(UInt_t i=0;i<nrow;i++){
461 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit
462 + sizeof(AliHLTTPCDigitRowData);
464 fwrite(rowPt,size,1,fOutBinary);
465 Byte_t *bytePt =(Byte_t *) rowPt;
467 rowPt = (AliHLTTPCDigitRowData *) bytePt;
469 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","Memory")
470 <<AliHLTTPCLog::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
471 <<nrow<<" Rows)"<<ENDLOG;
475 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & nrow,AliHLTTPCDigitRowData *data,UInt_t& sz)
477 //Read inputfile into memory as is, and store it in data.
478 // No run-length encoding is assumed.
481 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
482 <<"No Input File"<<ENDLOG;
486 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
487 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
491 AliHLTTPCDigitRowData *rowPt = data;
494 while(!feof(fInBinary)){
495 Byte_t *bytePt =(Byte_t *) rowPt;
497 if(fread(rowPt,sizeof(AliHLTTPCDigitRowData),1,fInBinary)!=1) break;
499 bytePt += sizeof(AliHLTTPCDigitRowData);
500 outsize += sizeof(AliHLTTPCDigitRowData);
502 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit;
504 //if(fread(bytePt,size,1,fInBinary)!=1) break;
505 fread(bytePt,size,1,fInBinary);
508 rowPt = (AliHLTTPCDigitRowData *) bytePt;
512 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","Memory")
513 <<AliHLTTPCLog::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
514 <<rowcount<<" Rows)"<<ENDLOG;
519 void AliHLTTPCMemHandler::AddData(AliHLTTPCDigitData *data,UInt_t & ndata,
520 UInt_t /*row*/,UShort_t pad,UShort_t time,UShort_t charge) const
523 data[ndata].fPad = pad;
524 data[ndata].fTime = time;
525 data[ndata].fCharge = charge;
529 void AliHLTTPCMemHandler::AddRandom(AliHLTTPCDigitData *data, UInt_t & ndata)
531 //add some random data
532 data[ndata].fPad = fDPt[fNUsed]->fPad;
533 data[ndata].fTime = fDPt[fNUsed]->fTime;
534 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
539 void AliHLTTPCMemHandler::MergeDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
540 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
543 data[ndata].fPad = pad;
544 data[ndata].fTime = time;
545 data[ndata].fCharge = charge;
546 while(ComparePoints(row,pad,time)==0){
547 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
548 if(charge>=AliHLTTPCTransform::GetADCSat()) ch = AliHLTTPCTransform::GetADCSat();
549 data[ndata].fCharge = ch;
555 void AliHLTTPCMemHandler::AddDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
556 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
560 while((action=ComparePoints(row,pad,time))==1){
561 AddRandom(data,ndata);
564 MergeDataRandom(data,ndata,row,pad,time,charge);
567 AddData(data,ndata,row,pad,time,charge);
571 void AliHLTTPCMemHandler::Write(UInt_t *comp, UInt_t & index,
572 UInt_t & subindex, UShort_t value) const
574 //write compressed data
575 UInt_t shift[3] = {0,10,20};
576 if(subindex==0) comp[index] =0; //clean up memory
577 comp[index] |= (value&0x03ff)<<shift[subindex];
585 UShort_t AliHLTTPCMemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex) const
587 //read compressed data
588 UInt_t shift[3] = {0,10,20};
589 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
599 UShort_t AliHLTTPCMemHandler::Test(UInt_t *comp,
600 UInt_t index, UInt_t subindex) const
603 UInt_t shift[3] = {0,10,20};
604 return (comp[index]>>shift[subindex])&0x03ff;
607 Int_t AliHLTTPCMemHandler::Memory2CompMemory(UInt_t nrow,
608 AliHLTTPCDigitRowData *data,UInt_t *comp)
610 //Performs run-length encoding on data stored in memory pointed to by data.
611 //The compressed data is written to comp.
613 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
614 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
618 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
619 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
622 AliHLTTPCDigitRowData *rowPt = data;
626 for(UInt_t i=0;i<nrow;i++){
627 UShort_t value = rowPt->fRow;
628 Write(comp,index,subindex,value);
632 for(Int_t d=0;d<200;d++) ddd[d]=0;
633 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
634 if(rowPt->fDigitData[dig].fPad <200){
635 ddd[rowPt->fDigitData[dig].fPad]++;
638 for(Int_t d=0;d<200;d++){
644 Write(comp,index,subindex,npad);
646 for(UShort_t pad=0;pad <= maxpad;pad++){
647 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
649 Write(comp,index,subindex,pad);
650 // write zero if time != 0
651 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
652 if(rowPt->fDigitData[digit].fTime>0){
653 Write(comp,index,subindex,0);
654 Write(comp,index,subindex,rowPt->fDigitData[digit].fTime);
657 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
658 UShort_t charge = rowPt->fDigitData[digit].fCharge;
662 Write(comp,index,subindex,charge);
663 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
664 if(rowPt->fDigitData[digit].fTime +1 !=
665 rowPt->fDigitData[digit+1].fTime){
666 Write(comp,index,subindex,0);
667 UShort_t nzero = rowPt->fDigitData[digit+1].fTime -
668 (rowPt->fDigitData[digit].fTime +1);
669 Write(comp,index,subindex,nzero);
674 Write(comp,index,subindex,0);
675 Write(comp,index,subindex,0);
678 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
679 sizeof(AliHLTTPCDigitRowData);
680 Byte_t *bytePt =(Byte_t *) rowPt;
682 rowPt = (AliHLTTPCDigitRowData *) bytePt;
685 Write(comp,index,subindex,0);
686 return index * sizeof(UInt_t);
689 Int_t AliHLTTPCMemHandler::CompMemory2Memory(UInt_t nrow,
690 AliHLTTPCDigitRowData *data,UInt_t *comp, UInt_t& sz)
692 //Uncompress the run-length encoded data in memory pointed to by comp, and
696 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2Memory","Memory")
697 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
701 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2Memory","Memory")
702 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
707 AliHLTTPCDigitRowData *rowPt = data;
711 for(UInt_t i=0;i<nrow;i++){
713 UInt_t row =Read(comp,index,subindex);
716 UShort_t npad = Read(comp,index,subindex);
717 for(UShort_t p=0;p<npad;p++){
720 UShort_t pad = Read(comp,index,subindex);
721 if(Test(comp,index,subindex)==0){
722 Read(comp,index,subindex);
723 if( (time = Read(comp,index,subindex)) == 0 ){
728 while( (charge=Read(comp,index,subindex)) != 0){
729 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
730 //AddData(rowPt->fDigitData,ndigit,row,pad,time,charge);
731 //seems we are using this function... but dont know why
732 AddDataRandom(rowPt->fDigitData,ndigit,row,pad,time,charge);
735 UShort_t tshift = Read(comp,index,subindex);
736 if(tshift == 0) break;
740 rowPt->fNDigit = ndigit;
741 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
742 sizeof(AliHLTTPCDigitRowData);
743 Byte_t *bytePt =(Byte_t *) rowPt;
746 rowPt = (AliHLTTPCDigitRowData *) bytePt;
752 UInt_t AliHLTTPCMemHandler::GetCompMemorySize(UInt_t nrow,AliHLTTPCDigitRowData *data) const
754 //Return the size of RLE data, after compressing data.
757 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetCompMemorySize","Memory")
758 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
761 AliHLTTPCDigitRowData *rowPt = data;
764 for(UInt_t i=0;i<nrow;i++){
769 for(Int_t d=0;d<200;d++) ddd[d]=0;
770 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
771 if(rowPt->fDigitData[dig].fPad <200){
772 ddd[rowPt->fDigitData[dig].fPad]++;
775 for(Int_t d=0;d<200;d++){
783 for(UShort_t pad=0;pad <= maxpad;pad++){
784 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
787 // write zero if time != 0
788 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
789 if(rowPt->fDigitData[digit].fTime>0){
794 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
796 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
797 if(rowPt->fDigitData[digit].fTime +1 !=
798 rowPt->fDigitData[digit+1].fTime){
809 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
810 sizeof(AliHLTTPCDigitRowData);
811 Byte_t *bytePt =(Byte_t *) rowPt;
813 rowPt = (AliHLTTPCDigitRowData *) bytePt;
817 return (index/3) * sizeof(UInt_t);
820 UInt_t AliHLTTPCMemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp) const
824 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetMemorySize","Memory")
825 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
833 for(UInt_t i=0;i<nrow;i++){
835 Read(comp,index,subindex);
836 UShort_t npad = Read(comp,index,subindex);
837 for(UShort_t p=0;p<npad;p++){
838 Read(comp,index,subindex);
839 if(Test(comp,index,subindex)==0){
840 Read(comp,index,subindex);
841 if(Read(comp,index,subindex)== 0) continue;
844 while(Read(comp,index,subindex)!=0) ndigit++;
845 if(Read(comp,index,subindex)==0) break;
848 Int_t size = sizeof(AliHLTTPCDigitData) * ndigit+
849 sizeof(AliHLTTPCDigitRowData);
856 UInt_t AliHLTTPCMemHandler::GetNRow(UInt_t *comp,UInt_t size)
860 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetNRow","Memory")
861 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
868 while(index<size-1){ //don't start with last word
871 Read(comp,index,subindex);
872 UShort_t npad = Read(comp,index,subindex);
873 for(UShort_t p=0;p<npad;p++){
874 Read(comp,index,subindex);
875 if(Test(comp,index,subindex)==0){
876 Read(comp,index,subindex);
877 if(Read(comp,index,subindex)==0)continue;
880 while(Read(comp,index,subindex)!=0) ndigit++;
881 if(Read(comp,index,subindex)==0) break;
885 if(index==size-1){ //last word
887 if(Read(comp,index,subindex)!=0) nrow++;
893 Bool_t AliHLTTPCMemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
896 //Write the RLE data in comp to the output file.
899 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","File")
900 <<"No Output File"<<ENDLOG;
904 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
905 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
909 size=GetMemorySize(nrow,comp);
911 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
912 <<"Memory size = 0 "<<ENDLOG;
915 UInt_t length = size/sizeof(UInt_t);
916 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
917 fwrite(comp,size,1,fOutBinary);
921 Bool_t AliHLTTPCMemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
923 //Read the RLE data from file, and store it in comp. No unpacking yet.
926 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompBinary2CompMemory","File")
927 <<"No Output File"<<ENDLOG;
931 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompBinary2CompMemory","Memory")
932 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
937 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
938 UInt_t size = length*sizeof(UInt_t);
939 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
940 // now find the number of dig
941 nrow = GetNRow(comp,size);
945 AliHLTTPCDigitRowData *AliHLTTPCMemHandler::CompBinary2Memory(UInt_t & nrow, UInt_t& sz )
947 // Read the RLE inputfile, unpack it and return the pointer to it.
948 AliHLTTPCMemHandler * handler = new AliHLTTPCMemHandler();
949 handler->SetBinaryInput(fInBinary);
950 UInt_t *comp =(UInt_t *)handler->Allocate();
951 handler->CompBinary2CompMemory(nrow,comp);
952 UInt_t size = GetMemorySize(nrow,comp);
954 AliHLTTPCDigitRowData *data = (AliHLTTPCDigitRowData *)Allocate(size);
955 CompMemory2Memory(nrow,data,comp);
961 Bool_t AliHLTTPCMemHandler::Memory2CompBinary(UInt_t nrow,AliHLTTPCDigitRowData *data)
963 //Perform RLE on the data, and write it to the output file.
965 AliHLTTPCMemHandler * handler = new AliHLTTPCMemHandler();
966 UInt_t size = GetCompMemorySize(nrow,data);
967 UInt_t *comp =(UInt_t *)handler->Allocate(size);
968 Memory2CompMemory(nrow,data,comp);
969 CompMemory2CompBinary(nrow,comp,size);
976 ///////////////////////////////////////// Point IO
977 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t npoint,AliHLTTPCSpacePointData *data)
979 //Writing spacepoints stored in data to the outputfile.
981 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
982 <<"No Output File"<<ENDLOG;
986 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
987 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
990 UInt_t size = npoint*sizeof(AliHLTTPCSpacePointData);
991 fwrite(data,size,1,fOutBinary);
996 Bool_t AliHLTTPCMemHandler::Transform(UInt_t npoint,AliHLTTPCSpacePointData *data,Int_t slice)
998 //Transform the space points in data, to global coordinates in slice.
1000 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Transform","Memory")
1001 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
1005 for(UInt_t i=0;i<npoint;i++){
1007 xyz[0] = data[i].fX;
1008 xyz[1] = data[i].fY;
1009 xyz[2] = data[i].fZ;
1010 AliHLTTPCTransform::Local2Global(xyz,slice);
1011 data[i].fX = xyz[0];
1012 data[i].fY = xyz[1];
1013 data[i].fZ = xyz[2];
1018 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & npoint,AliHLTTPCSpacePointData *data, UInt_t& sz)
1020 //Read the space points in inputfile, and store it in data.
1022 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1023 <<"No Input File"<<ENDLOG;
1027 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
1028 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
1032 Int_t size = GetFileSize();
1034 npoint = size/sizeof(AliHLTTPCSpacePointData);
1036 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1037 <<"File Size == 0"<<ENDLOG;
1041 if(fread(data,size,1,fInBinary)!=1){
1042 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","File")
1043 <<"File Read Error "<<ENDLOG;
1046 if(size%sizeof(AliHLTTPCSpacePointData)){
1047 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","File Size")
1048 <<"File Size wrong "<<ENDLOG;
1051 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","File")
1052 <<AliHLTTPCLog::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1056 ///////////////////////////////////////// Track IO
1057 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t ntrack,AliHLTTPCTrackSegmentData *data)
1059 //Write the tracks stored in data, to outputfile.
1061 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
1062 <<"No Output File"<<ENDLOG;
1066 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
1067 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1070 AliHLTTPCTrackSegmentData *trackPt = data;
1071 for(UInt_t i=0;i<ntrack;i++){
1072 Int_t size=sizeof(AliHLTTPCTrackSegmentData)+trackPt->fNPoints*sizeof(UInt_t);
1073 fwrite(trackPt,size,1,fOutBinary);
1074 Byte_t *bytePt = (Byte_t*) trackPt;
1076 trackPt = (AliHLTTPCTrackSegmentData*) bytePt;
1078 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","File")
1079 <<AliHLTTPCLog::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1084 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & ntrack,AliHLTTPCTrackSegmentData *data)
1086 //Read the tracks in inputfile, and store it in data.
1088 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1089 <<"No Input File"<<ENDLOG;
1093 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
1094 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1099 AliHLTTPCTrackSegmentData *trackPt = data;
1102 while(!feof(fInBinary)){
1103 if(fread(trackPt,sizeof(AliHLTTPCTrackSegmentData),1,fInBinary)!=1) break;
1104 Int_t size=trackPt->fNPoints*sizeof(UInt_t);
1105 if(fread(trackPt->fPointIDs,size,1,fInBinary)!=1) break;
1106 Byte_t *bytePt = (Byte_t*) trackPt;
1107 bytePt += sizeof(AliHLTTPCTrackSegmentData)+size;
1108 trackPt = (AliHLTTPCTrackSegmentData*) bytePt;
1111 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","File")
1112 <<AliHLTTPCLog::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1116 Bool_t AliHLTTPCMemHandler::TrackArray2Binary(AliHLTTPCTrackArray *array)
1118 //Write the trackarray to the outputfile.
1120 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","File")
1121 <<"No Output File"<<ENDLOG;
1125 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","Memory")
1126 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1129 AliHLTTPCTrackSegmentData *data = (AliHLTTPCTrackSegmentData *)Allocate(array);
1132 TrackArray2Memory(ntrack,data,array);
1133 Memory2Binary(ntrack,data);
1138 Bool_t AliHLTTPCMemHandler::Binary2TrackArray(AliHLTTPCTrackArray *array)
1140 //Read the tracks in inputfile, and fill it in trackarray.
1141 //array should already be constructed.
1143 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2TrackArray","File")
1144 <<"No Input File"<<ENDLOG;
1148 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2TrackArray","Memory")
1149 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1152 AliHLTTPCTrackSegmentData *data = (AliHLTTPCTrackSegmentData *)Allocate();
1154 Binary2Memory(ntrack,data);
1155 Memory2TrackArray(ntrack,data,array);
1160 Bool_t AliHLTTPCMemHandler::TrackArray2Memory(UInt_t & ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
1162 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1164 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
1165 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1169 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
1170 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1174 array->WriteTracks(ntrack,data);
1178 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
1180 //Fill the tracks in data into trackarray.
1183 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1184 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1188 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1189 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1192 array->FillTracks(ntrack,data);
1196 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array,Int_t slice) const
1198 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1201 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1202 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1206 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1207 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1210 array->FillTracks(ntrack,data,slice);
1214 void AliHLTTPCMemHandler::UpdateRowPointer(AliHLTTPCDigitRowData *&tempPt)
1216 //Update the data pointer to the next padrow in memory.
1218 Byte_t *tmp = (Byte_t*)tempPt;
1219 Int_t size = sizeof(AliHLTTPCDigitRowData) + tempPt->fNDigit*sizeof(AliHLTTPCDigitData);
1221 tempPt = (AliHLTTPCDigitRowData*)tmp;
1224 Int_t AliHLTTPCMemHandler::ComparePoints(UInt_t /*row*/,UShort_t pad,UShort_t time) const
1226 //compare two points
1227 if(fNUsed>=fNDigits) return -2;
1229 if(pad==fDPt[fNUsed]->fPad&&time==fDPt[fNUsed]->fTime) return 0;
1231 if(pad<fDPt[fNUsed]->fPad) return -1;
1232 if(pad==fDPt[fNUsed]->fPad&&time<fDPt[fNUsed]->fTime) return -1;
1237 Int_t AliHLTTPCMemHandler::CompareDigits(AliHLTTPCRandomDigitData *a,AliHLTTPCRandomDigitData *b) const
1239 //compare two digits
1240 if(a->fPad==b->fPad && a->fTime == b->fTime) return 0;
1242 if(a->fPad<b->fPad) return -1;
1243 if(a->fPad==b->fPad && a->fTime<b->fTime) return -1;