2 // Original: AliL3MemHandler.cxx,v 1.52 2005/06/14 10:55:21 cvetan
4 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>, Anders Vestbo <mailto:vestbo$fi.uib.no>, Constantin Loizides <mailto:loizides@ikf.uni-frankfurt.de>
5 //*-- Copyright © ALICE HLT Group
7 /** \class AliHLTTPCMemHandler
9 //_____________________________________________________________
10 // AliHLTTPCMemHandler
12 // The HLT Binary File handler
14 // This class does all the memory I/O handling of HLT binary files.
19 // 1) Reading a binary file:
21 // AliHLTTPCMemHandler file;
22 // file.SetBinaryInput(filename);
23 // file.Init(slice,patch);
26 // AliHLTTPCDigitRowData *data = file.CompBinary2Memory(nrows);
28 // for(int i=0; i<nrows; i++)
31 // AliHLTTPCDigitData *dataPt = (AliHLTTPCDigitData*)data->fDigitData;
32 // for(int j=0; j<data->fNDigit; j++)
34 // pad = dataPt[j].fPad;
35 // time = dataPt[j].fTime;
36 // charge = dataPt[j].fCharge;
39 // file.UpdateRowPointer(data);
42 // file.CloseBinaryInput();
43 // ________________________
45 // 2) Writing a binary file:
47 // //First of all you need to store the data in memory,
48 // //and have a pointer to it of type AliHLTTPCDigitRowData.
49 // //E.g. if you just want to write the data you read in example 1)
50 // //into a new file, you can do the following:
52 // AliHLTTPCMemHandler newfile;
53 // newfile.Init(slice,patch);
54 // newfile.SetBinaryOutput(newfilename);
55 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliHLTTPCDigitRowData*)data);
56 // newfile.CloseBinaryOutput();
59 // Compressed file format:
60 // -----------------------
62 // The data is RLE encoded and currently using _10_ bit range for the ADC-values.
66 #include "AliHLTTPCRootTypes.h"
67 #include "AliHLTTPCDigitData.h"
68 #include "AliHLTTPCLogging.h"
69 #include "AliHLTTPCTransform.h"
70 #include "AliHLTTPCTrackSegmentData.h"
71 #include "AliHLTTPCSpacePointData.h"
72 #include "AliHLTTPCTrackArray.h"
73 #include "AliHLTTPCMemHandler.h"
79 ClassImp(AliHLTTPCMemHandler)
81 AliHLTTPCMemHandler::AliHLTTPCMemHandler()
100 AliHLTTPCMemHandler::~AliHLTTPCMemHandler()
103 if(fPt) delete[] fPt;
104 if(fRandomDigits) delete [] fRandomDigits;
105 if(fDPt) delete [] fDPt;
108 void AliHLTTPCMemHandler::Init(Int_t s,Int_t p, Int_t *r)
116 fRowMin=AliHLTTPCTransform::GetFirstRow(p);
117 fRowMax=AliHLTTPCTransform::GetLastRow(p);
122 void AliHLTTPCMemHandler::ResetROI()
124 //Resets the Look-up table for Region of Interest mode.
125 for(Int_t i=fRowMin; i<=fRowMax; i++)
127 fEtaMinTimeBin[i] = 0;
128 fEtaMaxTimeBin[i] = AliHLTTPCTransform::GetNTimeBins()-1;
132 void AliHLTTPCMemHandler::SetROI(Float_t *eta,Int_t */*slice*/)
134 // Init the Look-up table for the Region of Interest mode.
135 // Here you can specify a certain etaregion, - all data
136 // outside this region will be discarded:
137 // eta[0] = mimium eta
138 // eta[1] = maximum eta
139 // slice[0] = mimumum slice
140 // slice[1] = maximum slice
145 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetROI","Eta Values")
146 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
147 for(Int_t i=fRowMin; i<=fRowMax; i++)
155 for(Int_t i=fRowMin; i<=fRowMax; i++)
160 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
162 xyz[0] = AliHLTTPCTransform::Row2X(i);
164 xyz[2] = xyz[0]/tan(thetamax);
165 AliHLTTPCTransform::Slice2Sector(fSlice,i,sector,row);
166 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
168 fEtaMinTimeBin[i] = (Int_t)xyz[2];
171 fEtaMaxTimeBin[i] = 445;
174 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
175 xyz[0] = AliHLTTPCTransform::Row2X(i);
176 xyz[1] = AliHLTTPCTransform::GetMaxY(i);
177 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
178 xyz[2] = radii/tan(thetamin);
179 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
180 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
186 Bool_t AliHLTTPCMemHandler::SetBinaryInput(char *name)
188 //Set the input binary file.
189 fInBinary = fopen(name,"r");
191 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
192 <<"Error opening file "<<name<<ENDLOG;
198 Bool_t AliHLTTPCMemHandler::SetBinaryInput(FILE *file)
200 //Set the input binary file.
203 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
204 <<"Pointer to File = 0x0 "<<ENDLOG;
210 void AliHLTTPCMemHandler::CloseBinaryInput()
212 //Close the input file.
214 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryInput","File Close")
215 <<"Nothing to Close"<<ENDLOG;
222 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(char *name)
224 //Set the binary output file.
225 fOutBinary = fopen(name,"w");
227 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
228 <<"Pointer to File = 0x0 "<<ENDLOG;
234 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(FILE *file)
236 //Set the binary output file.
239 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
240 <<"Pointer to File = 0x0 "<<ENDLOG;
246 void AliHLTTPCMemHandler::CloseBinaryOutput()
250 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryOutPut","File Close")
251 <<"Nothing to Close"<<ENDLOG;
258 UInt_t AliHLTTPCMemHandler::GetFileSize()
260 //Returns the file size in bytes of the input file.
262 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetFileSize","File")
263 <<"No Input File"<<ENDLOG;
266 fseek(fInBinary,0,SEEK_END);
267 UInt_t size = (UInt_t) ftell(fInBinary);
272 Byte_t *AliHLTTPCMemHandler::Allocate()
275 return Allocate(GetFileSize());
278 Byte_t *AliHLTTPCMemHandler::Allocate(AliHLTTPCTrackArray *array)
280 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
282 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Allocate","Memory")
283 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
286 return Allocate(array->GetOutSize());
289 Byte_t *AliHLTTPCMemHandler::Allocate(UInt_t size)
291 //Allocate memory of size in bytes.
293 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Allocate","Memory")
294 <<"Delete Memory"<<ENDLOG;
297 fPt = new Byte_t[size];
300 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Allocate","Memory")
301 <<AliHLTTPCLog::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
305 void AliHLTTPCMemHandler::Free()
307 //Clear the memory, if allocated.
309 // LOG(AliHLTTPCLog::kInformational,"AliHLTTPCMemHandler::Free","Memory")
310 // <<"No Memory allocated - can't Free"<<ENDLOG;
318 ///////////////////////////////////////// Random
319 void AliHLTTPCMemHandler::SetRandomSeed()
321 //If you are adding random data to the original data.
323 SetRandomSeed(time(tp));
326 void AliHLTTPCMemHandler::SetRandomCluster(Int_t maxnumber)
328 //If you are adding random data to the original data.
331 fNRandom = maxnumber;
333 if(fRandomDigits) delete [] fRandomDigits;
334 fRandomDigits = new AliHLTTPCRandomDigitData[fNRandom*9];
335 if(fDPt) delete [] fDPt;
336 fDPt = new AliHLTTPCRandomDigitData *[fNRandom*9];
339 void AliHLTTPCMemHandler::QSort(AliHLTTPCRandomDigitData **a, Int_t first, Int_t last)
342 // Sort array of AliHLTTPCRandomDigitData pointers using a quicksort algorithm.
343 // Uses CompareDigits() to compare objects.
346 static AliHLTTPCRandomDigitData *tmp;
347 static int i; // "static" to save stack space
350 while (last - first > 1) {
354 while (++i < last && CompareDigits(a[i], a[first]) < 0)
356 while (--j > first && CompareDigits(a[j], a[first]) > 0)
373 if (j - first < last - (j + 1)) {
375 first = j + 1; // QSort(j + 1, last);
377 QSort(a, j + 1, last);
378 last = j; // QSort(first, j);
383 UInt_t AliHLTTPCMemHandler::GetRandomSize() const
387 for(Int_t r=fRowMin;r<=fRowMax;r++){
388 Int_t npad=AliHLTTPCTransform::GetNPads(r);
389 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
391 return 9 * nrandom * sizeof(AliHLTTPCDigitData);
394 void AliHLTTPCMemHandler::Generate(Int_t row)
396 //Generate random data on row, if you didn't
397 //ask for this, nothing happens here.
399 if(!fIsRandom) return;
402 Int_t npad=AliHLTTPCTransform::GetNPads(row);
403 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
404 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
405 (Double_t) ntime/(Double_t) AliHLTTPCTransform::GetNTimeBins() );
407 for(Int_t n=0;n<nrandom;n++){
408 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
409 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
410 Int_t charge = (int)((float)rand()/RAND_MAX*AliHLTTPCTransform::GetADCSat());
411 DigitizePoint(row,pad,time,charge);
413 QSort(fDPt,0,fNDigits);
417 void AliHLTTPCMemHandler::DigitizePoint(Int_t row, Int_t pad,
418 Int_t time,Int_t charge)
420 //Making one single random cluster.
421 for(Int_t j=-1;j<2;j++){
422 for(Int_t k=-1;k<2;k++){
423 Int_t dcharge = charge;
426 if(dcharge<10) continue;
427 Int_t dpad = j + pad;
428 Int_t dtime = k + time;
430 if(dpad<0||dpad>=AliHLTTPCTransform::GetNPads(row)) continue;
431 if(dtime<0||dtime>=AliHLTTPCTransform::GetNTimeBins()) continue;
433 fRandomDigits[fNDigits].fCharge = dcharge;
434 fRandomDigits[fNDigits].fRow = row;
435 fRandomDigits[fNDigits].fPad = dpad;
436 fRandomDigits[fNDigits].fTime = dtime;
437 fDPt[fNDigits] = &fRandomDigits[fNDigits];
443 ///////////////////////////////////////// Digit IO
444 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t nrow,AliHLTTPCDigitRowData *data)
446 //Write data to the outputfile as is. No run-length encoding is done.
449 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
450 <<"No Output File"<<ENDLOG;
454 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
455 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
459 AliHLTTPCDigitRowData *rowPt = data;
461 for(UInt_t i=0;i<nrow;i++){
462 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit
463 + sizeof(AliHLTTPCDigitRowData);
465 fwrite(rowPt,size,1,fOutBinary);
466 Byte_t *bytePt =(Byte_t *) rowPt;
468 rowPt = (AliHLTTPCDigitRowData *) bytePt;
470 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","Memory")
471 <<AliHLTTPCLog::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
472 <<nrow<<" Rows)"<<ENDLOG;
476 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & nrow,AliHLTTPCDigitRowData *data,UInt_t& sz)
478 //Read inputfile into memory as is, and store it in data.
479 // No run-length encoding is assumed.
482 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
483 <<"No Input File"<<ENDLOG;
487 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
488 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
492 AliHLTTPCDigitRowData *rowPt = data;
495 while(!feof(fInBinary)){
496 Byte_t *bytePt =(Byte_t *) rowPt;
498 if(fread(rowPt,sizeof(AliHLTTPCDigitRowData),1,fInBinary)!=1) break;
500 bytePt += sizeof(AliHLTTPCDigitRowData);
501 outsize += sizeof(AliHLTTPCDigitRowData);
503 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit;
505 //if(fread(bytePt,size,1,fInBinary)!=1) break;
506 fread(bytePt,size,1,fInBinary);
509 rowPt = (AliHLTTPCDigitRowData *) bytePt;
513 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","Memory")
514 <<AliHLTTPCLog::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
515 <<rowcount<<" Rows)"<<ENDLOG;
520 void AliHLTTPCMemHandler::AddData(AliHLTTPCDigitData *data,UInt_t & ndata,
521 UInt_t /*row*/,UShort_t pad,UShort_t time,UShort_t charge) const
524 data[ndata].fPad = pad;
525 data[ndata].fTime = time;
526 data[ndata].fCharge = charge;
530 void AliHLTTPCMemHandler::AddRandom(AliHLTTPCDigitData *data, UInt_t & ndata)
532 //add some random data
533 data[ndata].fPad = fDPt[fNUsed]->fPad;
534 data[ndata].fTime = fDPt[fNUsed]->fTime;
535 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
540 void AliHLTTPCMemHandler::MergeDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
541 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
544 data[ndata].fPad = pad;
545 data[ndata].fTime = time;
546 data[ndata].fCharge = charge;
547 while(ComparePoints(row,pad,time)==0){
548 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
549 if(charge>=AliHLTTPCTransform::GetADCSat()) ch = AliHLTTPCTransform::GetADCSat();
550 data[ndata].fCharge = ch;
556 void AliHLTTPCMemHandler::AddDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
557 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
561 while((action=ComparePoints(row,pad,time))==1){
562 AddRandom(data,ndata);
565 MergeDataRandom(data,ndata,row,pad,time,charge);
568 AddData(data,ndata,row,pad,time,charge);
572 void AliHLTTPCMemHandler::Write(UInt_t *comp, UInt_t & index,
573 UInt_t & subindex, UShort_t value) const
575 //write compressed data
576 UInt_t shift[3] = {0,10,20};
577 if(subindex==0) comp[index] =0; //clean up memory
578 comp[index] |= (value&0x03ff)<<shift[subindex];
586 UShort_t AliHLTTPCMemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex) const
588 //read compressed data
589 UInt_t shift[3] = {0,10,20};
590 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
600 UShort_t AliHLTTPCMemHandler::Test(UInt_t *comp,
601 UInt_t index, UInt_t subindex) const
604 UInt_t shift[3] = {0,10,20};
605 return (comp[index]>>shift[subindex])&0x03ff;
608 Int_t AliHLTTPCMemHandler::Memory2CompMemory(UInt_t nrow,
609 AliHLTTPCDigitRowData *data,UInt_t *comp)
611 //Performs run-length encoding on data stored in memory pointed to by data.
612 //The compressed data is written to comp.
614 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
615 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
619 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
620 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
623 AliHLTTPCDigitRowData *rowPt = data;
627 for(UInt_t i=0;i<nrow;i++){
628 UShort_t value = rowPt->fRow;
629 Write(comp,index,subindex,value);
633 for(Int_t d=0;d<200;d++) ddd[d]=0;
634 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
635 if(rowPt->fDigitData[dig].fPad <200){
636 ddd[rowPt->fDigitData[dig].fPad]++;
639 for(Int_t d=0;d<200;d++){
645 Write(comp,index,subindex,npad);
647 for(UShort_t pad=0;pad <= maxpad;pad++){
648 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
650 Write(comp,index,subindex,pad);
651 // write zero if time != 0
652 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
653 if(rowPt->fDigitData[digit].fTime>0){
654 Write(comp,index,subindex,0);
655 Write(comp,index,subindex,rowPt->fDigitData[digit].fTime);
658 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
659 UShort_t charge = rowPt->fDigitData[digit].fCharge;
663 Write(comp,index,subindex,charge);
664 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
665 if(rowPt->fDigitData[digit].fTime +1 !=
666 rowPt->fDigitData[digit+1].fTime){
667 Write(comp,index,subindex,0);
668 UShort_t nzero = rowPt->fDigitData[digit+1].fTime -
669 (rowPt->fDigitData[digit].fTime +1);
670 Write(comp,index,subindex,nzero);
675 Write(comp,index,subindex,0);
676 Write(comp,index,subindex,0);
679 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
680 sizeof(AliHLTTPCDigitRowData);
681 Byte_t *bytePt =(Byte_t *) rowPt;
683 rowPt = (AliHLTTPCDigitRowData *) bytePt;
686 Write(comp,index,subindex,0);
687 return index * sizeof(UInt_t);
690 Int_t AliHLTTPCMemHandler::CompMemory2Memory(UInt_t nrow,
691 AliHLTTPCDigitRowData *data,UInt_t *comp, UInt_t& sz)
693 //Uncompress the run-length encoded data in memory pointed to by comp, and
697 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2Memory","Memory")
698 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
702 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2Memory","Memory")
703 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
708 AliHLTTPCDigitRowData *rowPt = data;
712 for(UInt_t i=0;i<nrow;i++){
714 UInt_t row =Read(comp,index,subindex);
717 UShort_t npad = Read(comp,index,subindex);
718 for(UShort_t p=0;p<npad;p++){
721 UShort_t pad = Read(comp,index,subindex);
722 if(Test(comp,index,subindex)==0){
723 Read(comp,index,subindex);
724 if( (time = Read(comp,index,subindex)) == 0 ){
729 while( (charge=Read(comp,index,subindex)) != 0){
730 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
731 //AddData(rowPt->fDigitData,ndigit,row,pad,time,charge);
732 //seems we are using this function... but dont know why
733 AddDataRandom(rowPt->fDigitData,ndigit,row,pad,time,charge);
736 UShort_t tshift = Read(comp,index,subindex);
737 if(tshift == 0) break;
741 rowPt->fNDigit = ndigit;
742 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
743 sizeof(AliHLTTPCDigitRowData);
744 Byte_t *bytePt =(Byte_t *) rowPt;
747 rowPt = (AliHLTTPCDigitRowData *) bytePt;
753 UInt_t AliHLTTPCMemHandler::GetCompMemorySize(UInt_t nrow,AliHLTTPCDigitRowData *data) const
755 //Return the size of RLE data, after compressing data.
758 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetCompMemorySize","Memory")
759 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
762 AliHLTTPCDigitRowData *rowPt = data;
765 for(UInt_t i=0;i<nrow;i++){
770 for(Int_t d=0;d<200;d++) ddd[d]=0;
771 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
772 if(rowPt->fDigitData[dig].fPad <200){
773 ddd[rowPt->fDigitData[dig].fPad]++;
776 for(Int_t d=0;d<200;d++){
784 for(UShort_t pad=0;pad <= maxpad;pad++){
785 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
788 // write zero if time != 0
789 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
790 if(rowPt->fDigitData[digit].fTime>0){
795 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
797 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
798 if(rowPt->fDigitData[digit].fTime +1 !=
799 rowPt->fDigitData[digit+1].fTime){
810 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
811 sizeof(AliHLTTPCDigitRowData);
812 Byte_t *bytePt =(Byte_t *) rowPt;
814 rowPt = (AliHLTTPCDigitRowData *) bytePt;
818 return (index/3) * sizeof(UInt_t);
821 UInt_t AliHLTTPCMemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp) const
825 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetMemorySize","Memory")
826 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
834 for(UInt_t i=0;i<nrow;i++){
836 Read(comp,index,subindex);
837 UShort_t npad = Read(comp,index,subindex);
838 for(UShort_t p=0;p<npad;p++){
839 Read(comp,index,subindex);
840 if(Test(comp,index,subindex)==0){
841 Read(comp,index,subindex);
842 if(Read(comp,index,subindex)== 0) continue;
845 while(Read(comp,index,subindex)!=0) ndigit++;
846 if(Read(comp,index,subindex)==0) break;
849 Int_t size = sizeof(AliHLTTPCDigitData) * ndigit+
850 sizeof(AliHLTTPCDigitRowData);
857 UInt_t AliHLTTPCMemHandler::GetNRow(UInt_t *comp,UInt_t size)
861 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetNRow","Memory")
862 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
869 while(index<size-1){ //don't start with last word
872 Read(comp,index,subindex);
873 UShort_t npad = Read(comp,index,subindex);
874 for(UShort_t p=0;p<npad;p++){
875 Read(comp,index,subindex);
876 if(Test(comp,index,subindex)==0){
877 Read(comp,index,subindex);
878 if(Read(comp,index,subindex)==0)continue;
881 while(Read(comp,index,subindex)!=0) ndigit++;
882 if(Read(comp,index,subindex)==0) break;
886 if(index==size-1){ //last word
888 if(Read(comp,index,subindex)!=0) nrow++;
894 Bool_t AliHLTTPCMemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
897 //Write the RLE data in comp to the output file.
900 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","File")
901 <<"No Output File"<<ENDLOG;
905 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
906 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
910 size=GetMemorySize(nrow,comp);
912 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
913 <<"Memory size = 0 "<<ENDLOG;
916 UInt_t length = size/sizeof(UInt_t);
917 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
918 fwrite(comp,size,1,fOutBinary);
922 Bool_t AliHLTTPCMemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
924 //Read the RLE data from file, and store it in comp. No unpacking yet.
927 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompBinary2CompMemory","File")
928 <<"No Output File"<<ENDLOG;
932 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompBinary2CompMemory","Memory")
933 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
938 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
939 UInt_t size = length*sizeof(UInt_t);
940 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
941 // now find the number of dig
942 nrow = GetNRow(comp,size);
946 AliHLTTPCDigitRowData *AliHLTTPCMemHandler::CompBinary2Memory(UInt_t & nrow, UInt_t& sz )
948 // Read the RLE inputfile, unpack it and return the pointer to it.
949 AliHLTTPCMemHandler * handler = new AliHLTTPCMemHandler();
950 handler->SetBinaryInput(fInBinary);
951 UInt_t *comp =(UInt_t *)handler->Allocate();
952 handler->CompBinary2CompMemory(nrow,comp);
953 UInt_t size = GetMemorySize(nrow,comp);
955 AliHLTTPCDigitRowData *data = (AliHLTTPCDigitRowData *)Allocate(size);
956 CompMemory2Memory(nrow,data,comp);
962 Bool_t AliHLTTPCMemHandler::Memory2CompBinary(UInt_t nrow,AliHLTTPCDigitRowData *data)
964 //Perform RLE on the data, and write it to the output file.
966 AliHLTTPCMemHandler * handler = new AliHLTTPCMemHandler();
967 UInt_t size = GetCompMemorySize(nrow,data);
968 UInt_t *comp =(UInt_t *)handler->Allocate(size);
969 Memory2CompMemory(nrow,data,comp);
970 CompMemory2CompBinary(nrow,comp,size);
977 ///////////////////////////////////////// Point IO
978 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t npoint,AliHLTTPCSpacePointData *data)
980 //Writing spacepoints stored in data to the outputfile.
982 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
983 <<"No Output File"<<ENDLOG;
987 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
988 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
991 UInt_t size = npoint*sizeof(AliHLTTPCSpacePointData);
992 fwrite(data,size,1,fOutBinary);
997 Bool_t AliHLTTPCMemHandler::Transform(UInt_t npoint,AliHLTTPCSpacePointData *data,Int_t slice)
999 //Transform the space points in data, to global coordinates in slice.
1001 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Transform","Memory")
1002 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
1006 for(UInt_t i=0;i<npoint;i++){
1008 xyz[0] = data[i].fX;
1009 xyz[1] = data[i].fY;
1010 xyz[2] = data[i].fZ;
1011 AliHLTTPCTransform::Local2Global(xyz,slice);
1012 data[i].fX = xyz[0];
1013 data[i].fY = xyz[1];
1014 data[i].fZ = xyz[2];
1019 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & npoint,AliHLTTPCSpacePointData *data, UInt_t& sz)
1021 //Read the space points in inputfile, and store it in data.
1023 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1024 <<"No Input File"<<ENDLOG;
1028 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
1029 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
1033 Int_t size = GetFileSize();
1035 npoint = size/sizeof(AliHLTTPCSpacePointData);
1037 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1038 <<"File Size == 0"<<ENDLOG;
1042 if(fread(data,size,1,fInBinary)!=1){
1043 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","File")
1044 <<"File Read Error "<<ENDLOG;
1047 if(size%sizeof(AliHLTTPCSpacePointData)){
1048 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","File Size")
1049 <<"File Size wrong "<<ENDLOG;
1052 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","File")
1053 <<AliHLTTPCLog::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1057 ///////////////////////////////////////// Track IO
1058 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t ntrack,AliHLTTPCTrackSegmentData *data)
1060 //Write the tracks stored in data, to outputfile.
1062 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
1063 <<"No Output File"<<ENDLOG;
1067 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
1068 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1071 AliHLTTPCTrackSegmentData *trackPt = data;
1072 for(UInt_t i=0;i<ntrack;i++){
1073 Int_t size=sizeof(AliHLTTPCTrackSegmentData)+trackPt->fNPoints*sizeof(UInt_t);
1074 fwrite(trackPt,size,1,fOutBinary);
1075 Byte_t *bytePt = (Byte_t*) trackPt;
1077 trackPt = (AliHLTTPCTrackSegmentData*) bytePt;
1079 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","File")
1080 <<AliHLTTPCLog::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1085 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & ntrack,AliHLTTPCTrackSegmentData *data)
1087 //Read the tracks in inputfile, and store it in data.
1089 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1090 <<"No Input File"<<ENDLOG;
1094 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
1095 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1100 AliHLTTPCTrackSegmentData *trackPt = data;
1103 while(!feof(fInBinary)){
1104 if(fread(trackPt,sizeof(AliHLTTPCTrackSegmentData),1,fInBinary)!=1) break;
1105 Int_t size=trackPt->fNPoints*sizeof(UInt_t);
1106 if(fread(trackPt->fPointIDs,size,1,fInBinary)!=1) break;
1107 Byte_t *bytePt = (Byte_t*) trackPt;
1108 bytePt += sizeof(AliHLTTPCTrackSegmentData)+size;
1109 trackPt = (AliHLTTPCTrackSegmentData*) bytePt;
1112 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","File")
1113 <<AliHLTTPCLog::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1117 Bool_t AliHLTTPCMemHandler::TrackArray2Binary(AliHLTTPCTrackArray *array)
1119 //Write the trackarray to the outputfile.
1121 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","File")
1122 <<"No Output File"<<ENDLOG;
1126 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","Memory")
1127 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1130 AliHLTTPCTrackSegmentData *data = (AliHLTTPCTrackSegmentData *)Allocate(array);
1133 TrackArray2Memory(ntrack,data,array);
1134 Memory2Binary(ntrack,data);
1139 Bool_t AliHLTTPCMemHandler::Binary2TrackArray(AliHLTTPCTrackArray *array)
1141 //Read the tracks in inputfile, and fill it in trackarray.
1142 //array should already be constructed.
1144 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2TrackArray","File")
1145 <<"No Input File"<<ENDLOG;
1149 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2TrackArray","Memory")
1150 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1153 AliHLTTPCTrackSegmentData *data = (AliHLTTPCTrackSegmentData *)Allocate();
1155 Binary2Memory(ntrack,data);
1156 Memory2TrackArray(ntrack,data,array);
1161 Bool_t AliHLTTPCMemHandler::TrackArray2Memory(UInt_t & ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
1163 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1165 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
1166 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1170 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
1171 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1175 array->WriteTracks(ntrack,data);
1179 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
1181 //Fill the tracks in data into trackarray.
1184 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1185 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1189 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1190 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1193 array->FillTracks(ntrack,data);
1197 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array,Int_t slice) const
1199 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1202 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1203 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1207 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1208 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1211 array->FillTracks(ntrack,data,slice);
1215 void AliHLTTPCMemHandler::UpdateRowPointer(AliHLTTPCDigitRowData *&tempPt)
1217 //Update the data pointer to the next padrow in memory.
1219 Byte_t *tmp = (Byte_t*)tempPt;
1220 Int_t size = sizeof(AliHLTTPCDigitRowData) + tempPt->fNDigit*sizeof(AliHLTTPCDigitData);
1222 tempPt = (AliHLTTPCDigitRowData*)tmp;
1225 Int_t AliHLTTPCMemHandler::ComparePoints(UInt_t /*row*/,UShort_t pad,UShort_t time) const
1227 //compare two points
1228 if(fNUsed>=fNDigits) return -2;
1230 if(pad==fDPt[fNUsed]->fPad&&time==fDPt[fNUsed]->fTime) return 0;
1232 if(pad<fDPt[fNUsed]->fPad) return -1;
1233 if(pad==fDPt[fNUsed]->fPad&&time<fDPt[fNUsed]->fTime) return -1;
1238 Int_t AliHLTTPCMemHandler::CompareDigits(AliHLTTPCRandomDigitData *a,AliHLTTPCRandomDigitData *b) const
1240 //compare two digits
1241 if(a->fPad==b->fPad && a->fTime == b->fTime) return 0;
1243 if(a->fPad<b->fPad) return -1;
1244 if(a->fPad==b->fPad && a->fTime<b->fTime) return -1;