2 // Original: AliHLTMemHandler.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()
105 AliHLTTPCMemHandler::AliHLTTPCMemHandler(const AliHLTTPCMemHandler& src)
126 AliHLTTPCMemHandler& AliHLTTPCMemHandler::operator=(const AliHLTTPCMemHandler& src)
131 AliHLTTPCMemHandler::~AliHLTTPCMemHandler()
134 if(fPt) delete[] fPt;
135 if(fRandomDigits) delete [] fRandomDigits;
136 if(fDPt) delete [] fDPt;
139 void AliHLTTPCMemHandler::Init(Int_t s,Int_t p, Int_t *r)
147 fRowMin=AliHLTTPCTransform::GetFirstRow(p);
148 fRowMax=AliHLTTPCTransform::GetLastRow(p);
153 void AliHLTTPCMemHandler::ResetROI()
155 //Resets the Look-up table for Region of Interest mode.
156 for(Int_t i=fRowMin; i<=fRowMax; i++)
158 fEtaMinTimeBin[i] = 0;
159 fEtaMaxTimeBin[i] = AliHLTTPCTransform::GetNTimeBins()-1;
163 void AliHLTTPCMemHandler::SetROI(Float_t *eta,Int_t */*slice*/)
165 // Init the Look-up table for the Region of Interest mode.
166 // Here you can specify a certain etaregion, - all data
167 // outside this region will be discarded:
168 // eta[0] = mimium eta
169 // eta[1] = maximum eta
170 // slice[0] = mimumum slice
171 // slice[1] = maximum slice
176 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetROI","Eta Values")
177 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
178 for(Int_t i=fRowMin; i<=fRowMax; i++)
186 for(Int_t i=fRowMin; i<=fRowMax; i++)
191 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
193 xyz[0] = AliHLTTPCTransform::Row2X(i);
195 xyz[2] = xyz[0]/tan(thetamax);
196 AliHLTTPCTransform::Slice2Sector(fSlice,i,sector,row);
197 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
199 fEtaMinTimeBin[i] = (Int_t)xyz[2];
202 fEtaMaxTimeBin[i] = 445;
205 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
206 xyz[0] = AliHLTTPCTransform::Row2X(i);
207 xyz[1] = AliHLTTPCTransform::GetMaxY(i);
208 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
209 xyz[2] = radii/tan(thetamin);
210 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
211 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
217 Bool_t AliHLTTPCMemHandler::SetBinaryInput(char *name)
219 //Set the input binary file.
220 fInBinary = fopen(name,"r");
222 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
223 <<"Error opening file "<<name<<ENDLOG;
229 Bool_t AliHLTTPCMemHandler::SetBinaryInput(FILE *file)
231 //Set the input binary file.
234 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
235 <<"Pointer to File = 0x0 "<<ENDLOG;
241 void AliHLTTPCMemHandler::CloseBinaryInput()
243 //Close the input file.
245 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryInput","File Close")
246 <<"Nothing to Close"<<ENDLOG;
253 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(char *name)
255 //Set the binary output file.
256 fOutBinary = fopen(name,"w");
258 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
259 <<"Pointer to File = 0x0 "<<ENDLOG;
265 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(FILE *file)
267 //Set the binary output file.
270 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
271 <<"Pointer to File = 0x0 "<<ENDLOG;
277 void AliHLTTPCMemHandler::CloseBinaryOutput()
281 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryOutPut","File Close")
282 <<"Nothing to Close"<<ENDLOG;
289 UInt_t AliHLTTPCMemHandler::GetFileSize()
291 //Returns the file size in bytes of the input file.
293 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetFileSize","File")
294 <<"No Input File"<<ENDLOG;
297 fseek(fInBinary,0,SEEK_END);
298 UInt_t size = (UInt_t) ftell(fInBinary);
303 Byte_t *AliHLTTPCMemHandler::Allocate()
306 return Allocate(GetFileSize());
309 Byte_t *AliHLTTPCMemHandler::Allocate(AliHLTTPCTrackArray *array)
311 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
313 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Allocate","Memory")
314 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
317 return Allocate(array->GetOutSize());
320 Byte_t *AliHLTTPCMemHandler::Allocate(UInt_t size)
322 //Allocate memory of size in bytes.
324 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Allocate","Memory")
325 <<"Delete Memory"<<ENDLOG;
328 fPt = new Byte_t[size];
331 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Allocate","Memory")
332 <<AliHLTTPCLog::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
336 void AliHLTTPCMemHandler::Free()
338 //Clear the memory, if allocated.
340 // LOG(AliHLTTPCLog::kInformational,"AliHLTTPCMemHandler::Free","Memory")
341 // <<"No Memory allocated - can't Free"<<ENDLOG;
349 ///////////////////////////////////////// Random
350 void AliHLTTPCMemHandler::SetRandomSeed()
352 //If you are adding random data to the original data.
354 SetRandomSeed(time(tp));
357 void AliHLTTPCMemHandler::SetRandomCluster(Int_t maxnumber)
359 //If you are adding random data to the original data.
362 fNRandom = maxnumber;
364 if(fRandomDigits) delete [] fRandomDigits;
365 fRandomDigits = new AliHLTTPCRandomDigitData[fNRandom*9];
366 if(fDPt) delete [] fDPt;
367 fDPt = new AliHLTTPCRandomDigitData *[fNRandom*9];
370 void AliHLTTPCMemHandler::QSort(AliHLTTPCRandomDigitData **a, Int_t first, Int_t last)
373 // Sort array of AliHLTTPCRandomDigitData pointers using a quicksort algorithm.
374 // Uses CompareDigits() to compare objects.
377 static AliHLTTPCRandomDigitData *tmp;
378 static int i; // "static" to save stack space
381 while (last - first > 1) {
385 while (++i < last && CompareDigits(a[i], a[first]) < 0)
387 while (--j > first && CompareDigits(a[j], a[first]) > 0)
404 if (j - first < last - (j + 1)) {
406 first = j + 1; // QSort(j + 1, last);
408 QSort(a, j + 1, last);
409 last = j; // QSort(first, j);
414 UInt_t AliHLTTPCMemHandler::GetRandomSize() const
418 for(Int_t r=fRowMin;r<=fRowMax;r++){
419 Int_t npad=AliHLTTPCTransform::GetNPads(r);
420 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
422 return 9 * nrandom * sizeof(AliHLTTPCDigitData);
425 void AliHLTTPCMemHandler::Generate(Int_t row)
427 //Generate random data on row, if you didn't
428 //ask for this, nothing happens here.
430 if(!fIsRandom) return;
433 Int_t npad=AliHLTTPCTransform::GetNPads(row);
434 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
435 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
436 (Double_t) ntime/(Double_t) AliHLTTPCTransform::GetNTimeBins() );
438 for(Int_t n=0;n<nrandom;n++){
439 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
440 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
441 Int_t charge = (int)((float)rand()/RAND_MAX*AliHLTTPCTransform::GetADCSat());
442 DigitizePoint(row,pad,time,charge);
444 QSort(fDPt,0,fNDigits);
448 void AliHLTTPCMemHandler::DigitizePoint(Int_t row, Int_t pad,
449 Int_t time,Int_t charge)
451 //Making one single random cluster.
452 for(Int_t j=-1;j<2;j++){
453 for(Int_t k=-1;k<2;k++){
454 Int_t dcharge = charge;
457 if(dcharge<10) continue;
458 Int_t dpad = j + pad;
459 Int_t dtime = k + time;
461 if(dpad<0||dpad>=AliHLTTPCTransform::GetNPads(row)) continue;
462 if(dtime<0||dtime>=AliHLTTPCTransform::GetNTimeBins()) continue;
464 fRandomDigits[fNDigits].fCharge = dcharge;
465 fRandomDigits[fNDigits].fRow = row;
466 fRandomDigits[fNDigits].fPad = dpad;
467 fRandomDigits[fNDigits].fTime = dtime;
468 fDPt[fNDigits] = &fRandomDigits[fNDigits];
474 ///////////////////////////////////////// Digit IO
475 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t nrow,AliHLTTPCDigitRowData *data)
477 //Write data to the outputfile as is. No run-length encoding is done.
480 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
481 <<"No Output File"<<ENDLOG;
485 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
486 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
490 AliHLTTPCDigitRowData *rowPt = data;
492 for(UInt_t i=0;i<nrow;i++){
493 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit
494 + sizeof(AliHLTTPCDigitRowData);
496 fwrite(rowPt,size,1,fOutBinary);
497 Byte_t *bytePt =(Byte_t *) rowPt;
499 rowPt = (AliHLTTPCDigitRowData *) bytePt;
501 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","Memory")
502 <<AliHLTTPCLog::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
503 <<nrow<<" Rows)"<<ENDLOG;
507 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & nrow,AliHLTTPCDigitRowData *data,UInt_t& sz)
509 //Read inputfile into memory as is, and store it in data.
510 // No run-length encoding is assumed.
513 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
514 <<"No Input File"<<ENDLOG;
518 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
519 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
523 AliHLTTPCDigitRowData *rowPt = data;
526 while(!feof(fInBinary)){
527 Byte_t *bytePt =(Byte_t *) rowPt;
529 if(fread(rowPt,sizeof(AliHLTTPCDigitRowData),1,fInBinary)!=1) break;
531 bytePt += sizeof(AliHLTTPCDigitRowData);
532 outsize += sizeof(AliHLTTPCDigitRowData);
534 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit;
536 //if(fread(bytePt,size,1,fInBinary)!=1) break;
537 fread(bytePt,size,1,fInBinary);
540 rowPt = (AliHLTTPCDigitRowData *) bytePt;
544 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","Memory")
545 <<AliHLTTPCLog::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
546 <<rowcount<<" Rows)"<<ENDLOG;
551 void AliHLTTPCMemHandler::AddData(AliHLTTPCDigitData *data,UInt_t & ndata,
552 UInt_t /*row*/,UShort_t pad,UShort_t time,UShort_t charge) const
555 data[ndata].fPad = pad;
556 data[ndata].fTime = time;
557 data[ndata].fCharge = charge;
561 void AliHLTTPCMemHandler::AddRandom(AliHLTTPCDigitData *data, UInt_t & ndata)
563 //add some random data
564 data[ndata].fPad = fDPt[fNUsed]->fPad;
565 data[ndata].fTime = fDPt[fNUsed]->fTime;
566 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
571 void AliHLTTPCMemHandler::MergeDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
572 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
575 data[ndata].fPad = pad;
576 data[ndata].fTime = time;
577 data[ndata].fCharge = charge;
578 while(ComparePoints(row,pad,time)==0){
579 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
580 if(charge>=AliHLTTPCTransform::GetADCSat()) ch = AliHLTTPCTransform::GetADCSat();
581 data[ndata].fCharge = ch;
587 void AliHLTTPCMemHandler::AddDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
588 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
592 while((action=ComparePoints(row,pad,time))==1){
593 AddRandom(data,ndata);
596 MergeDataRandom(data,ndata,row,pad,time,charge);
599 AddData(data,ndata,row,pad,time,charge);
603 void AliHLTTPCMemHandler::Write(UInt_t *comp, UInt_t & index,
604 UInt_t & subindex, UShort_t value) const
606 //write compressed data
607 UInt_t shift[3] = {0,10,20};
608 if(subindex==0) comp[index] =0; //clean up memory
609 comp[index] |= (value&0x03ff)<<shift[subindex];
617 UShort_t AliHLTTPCMemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex) const
619 //read compressed data
620 UInt_t shift[3] = {0,10,20};
621 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
631 UShort_t AliHLTTPCMemHandler::Test(UInt_t *comp,
632 UInt_t index, UInt_t subindex) const
635 UInt_t shift[3] = {0,10,20};
636 return (comp[index]>>shift[subindex])&0x03ff;
639 Int_t AliHLTTPCMemHandler::Memory2CompMemory(UInt_t nrow,
640 AliHLTTPCDigitRowData *data,UInt_t *comp)
642 //Performs run-length encoding on data stored in memory pointed to by data.
643 //The compressed data is written to comp.
645 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
646 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
650 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
651 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
654 AliHLTTPCDigitRowData *rowPt = data;
658 for(UInt_t i=0;i<nrow;i++){
659 UShort_t value = rowPt->fRow;
660 Write(comp,index,subindex,value);
664 for(Int_t d=0;d<200;d++) ddd[d]=0;
665 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
666 if(rowPt->fDigitData[dig].fPad <200){
667 ddd[rowPt->fDigitData[dig].fPad]++;
670 for(Int_t d=0;d<200;d++){
676 Write(comp,index,subindex,npad);
678 for(UShort_t pad=0;pad <= maxpad;pad++){
679 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
681 Write(comp,index,subindex,pad);
682 // write zero if time != 0
683 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
684 if(rowPt->fDigitData[digit].fTime>0){
685 Write(comp,index,subindex,0);
686 Write(comp,index,subindex,rowPt->fDigitData[digit].fTime);
689 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
690 UShort_t charge = rowPt->fDigitData[digit].fCharge;
694 Write(comp,index,subindex,charge);
695 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
696 if(rowPt->fDigitData[digit].fTime +1 !=
697 rowPt->fDigitData[digit+1].fTime){
698 Write(comp,index,subindex,0);
699 UShort_t nzero = rowPt->fDigitData[digit+1].fTime -
700 (rowPt->fDigitData[digit].fTime +1);
701 Write(comp,index,subindex,nzero);
706 Write(comp,index,subindex,0);
707 Write(comp,index,subindex,0);
710 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
711 sizeof(AliHLTTPCDigitRowData);
712 Byte_t *bytePt =(Byte_t *) rowPt;
714 rowPt = (AliHLTTPCDigitRowData *) bytePt;
717 Write(comp,index,subindex,0);
718 return index * sizeof(UInt_t);
721 Int_t AliHLTTPCMemHandler::CompMemory2Memory(UInt_t nrow,
722 AliHLTTPCDigitRowData *data,UInt_t *comp, UInt_t& sz)
724 //Uncompress the run-length encoded data in memory pointed to by comp, and
728 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2Memory","Memory")
729 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
733 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2Memory","Memory")
734 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
739 AliHLTTPCDigitRowData *rowPt = data;
743 for(UInt_t i=0;i<nrow;i++){
745 UInt_t row =Read(comp,index,subindex);
748 UShort_t npad = Read(comp,index,subindex);
749 for(UShort_t p=0;p<npad;p++){
752 UShort_t pad = Read(comp,index,subindex);
753 if(Test(comp,index,subindex)==0){
754 Read(comp,index,subindex);
755 if( (time = Read(comp,index,subindex)) == 0 ){
760 while( (charge=Read(comp,index,subindex)) != 0){
761 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
762 //AddData(rowPt->fDigitData,ndigit,row,pad,time,charge);
763 //seems we are using this function... but dont know why
764 AddDataRandom(rowPt->fDigitData,ndigit,row,pad,time,charge);
767 UShort_t tshift = Read(comp,index,subindex);
768 if(tshift == 0) break;
772 rowPt->fNDigit = ndigit;
773 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
774 sizeof(AliHLTTPCDigitRowData);
775 Byte_t *bytePt =(Byte_t *) rowPt;
778 rowPt = (AliHLTTPCDigitRowData *) bytePt;
784 UInt_t AliHLTTPCMemHandler::GetCompMemorySize(UInt_t nrow,AliHLTTPCDigitRowData *data) const
786 //Return the size of RLE data, after compressing data.
789 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetCompMemorySize","Memory")
790 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
793 AliHLTTPCDigitRowData *rowPt = data;
796 for(UInt_t i=0;i<nrow;i++){
801 for(Int_t d=0;d<200;d++) ddd[d]=0;
802 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
803 if(rowPt->fDigitData[dig].fPad <200){
804 ddd[rowPt->fDigitData[dig].fPad]++;
807 for(Int_t d=0;d<200;d++){
815 for(UShort_t pad=0;pad <= maxpad;pad++){
816 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
819 // write zero if time != 0
820 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
821 if(rowPt->fDigitData[digit].fTime>0){
826 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
828 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
829 if(rowPt->fDigitData[digit].fTime +1 !=
830 rowPt->fDigitData[digit+1].fTime){
841 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
842 sizeof(AliHLTTPCDigitRowData);
843 Byte_t *bytePt =(Byte_t *) rowPt;
845 rowPt = (AliHLTTPCDigitRowData *) bytePt;
849 return (index/3) * sizeof(UInt_t);
852 UInt_t AliHLTTPCMemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp) const
856 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetMemorySize","Memory")
857 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
865 for(UInt_t i=0;i<nrow;i++){
867 Read(comp,index,subindex);
868 UShort_t npad = Read(comp,index,subindex);
869 for(UShort_t p=0;p<npad;p++){
870 Read(comp,index,subindex);
871 if(Test(comp,index,subindex)==0){
872 Read(comp,index,subindex);
873 if(Read(comp,index,subindex)== 0) continue;
876 while(Read(comp,index,subindex)!=0) ndigit++;
877 if(Read(comp,index,subindex)==0) break;
880 Int_t size = sizeof(AliHLTTPCDigitData) * ndigit+
881 sizeof(AliHLTTPCDigitRowData);
888 UInt_t AliHLTTPCMemHandler::GetNRow(UInt_t *comp,UInt_t size)
892 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetNRow","Memory")
893 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
900 while(index<size-1){ //don't start with last word
903 Read(comp,index,subindex);
904 UShort_t npad = Read(comp,index,subindex);
905 for(UShort_t p=0;p<npad;p++){
906 Read(comp,index,subindex);
907 if(Test(comp,index,subindex)==0){
908 Read(comp,index,subindex);
909 if(Read(comp,index,subindex)==0)continue;
912 while(Read(comp,index,subindex)!=0) ndigit++;
913 if(Read(comp,index,subindex)==0) break;
917 if(index==size-1){ //last word
919 if(Read(comp,index,subindex)!=0) nrow++;
925 Bool_t AliHLTTPCMemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
928 //Write the RLE data in comp to the output file.
931 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","File")
932 <<"No Output File"<<ENDLOG;
936 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
937 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
941 size=GetMemorySize(nrow,comp);
943 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
944 <<"Memory size = 0 "<<ENDLOG;
947 UInt_t length = size/sizeof(UInt_t);
948 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
949 fwrite(comp,size,1,fOutBinary);
953 Bool_t AliHLTTPCMemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
955 //Read the RLE data from file, and store it in comp. No unpacking yet.
958 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompBinary2CompMemory","File")
959 <<"No Output File"<<ENDLOG;
963 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompBinary2CompMemory","Memory")
964 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
969 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
970 UInt_t size = length*sizeof(UInt_t);
971 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
972 // now find the number of dig
973 nrow = GetNRow(comp,size);
977 AliHLTTPCDigitRowData *AliHLTTPCMemHandler::CompBinary2Memory(UInt_t & nrow, UInt_t& sz )
979 // Read the RLE inputfile, unpack it and return the pointer to it.
980 AliHLTTPCMemHandler * handler = new AliHLTTPCMemHandler();
981 handler->SetBinaryInput(fInBinary);
982 UInt_t *comp =(UInt_t *)handler->Allocate();
983 handler->CompBinary2CompMemory(nrow,comp);
984 UInt_t size = GetMemorySize(nrow,comp);
986 AliHLTTPCDigitRowData *data = (AliHLTTPCDigitRowData *)Allocate(size);
987 CompMemory2Memory(nrow,data,comp);
993 Bool_t AliHLTTPCMemHandler::Memory2CompBinary(UInt_t nrow,AliHLTTPCDigitRowData *data)
995 //Perform RLE on the data, and write it to the output file.
997 AliHLTTPCMemHandler * handler = new AliHLTTPCMemHandler();
998 UInt_t size = GetCompMemorySize(nrow,data);
999 UInt_t *comp =(UInt_t *)handler->Allocate(size);
1000 Memory2CompMemory(nrow,data,comp);
1001 CompMemory2CompBinary(nrow,comp,size);
1008 ///////////////////////////////////////// Point IO
1009 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t npoint,AliHLTTPCSpacePointData *data)
1011 //Writing spacepoints stored in data to the outputfile.
1013 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
1014 <<"No Output File"<<ENDLOG;
1018 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
1019 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
1022 UInt_t size = npoint*sizeof(AliHLTTPCSpacePointData);
1023 fwrite(data,size,1,fOutBinary);
1028 Bool_t AliHLTTPCMemHandler::Transform(UInt_t npoint,AliHLTTPCSpacePointData *data,Int_t slice)
1030 //Transform the space points in data, to global coordinates in slice.
1032 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Transform","Memory")
1033 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
1037 for(UInt_t i=0;i<npoint;i++){
1039 xyz[0] = data[i].fX;
1040 xyz[1] = data[i].fY;
1041 xyz[2] = data[i].fZ;
1042 AliHLTTPCTransform::Local2Global(xyz,slice);
1043 data[i].fX = xyz[0];
1044 data[i].fY = xyz[1];
1045 data[i].fZ = xyz[2];
1050 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & npoint,AliHLTTPCSpacePointData *data, UInt_t& sz)
1052 //Read the space points in inputfile, and store it in data.
1054 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1055 <<"No Input File"<<ENDLOG;
1059 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
1060 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
1064 Int_t size = GetFileSize();
1066 npoint = size/sizeof(AliHLTTPCSpacePointData);
1068 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1069 <<"File Size == 0"<<ENDLOG;
1073 if(fread(data,size,1,fInBinary)!=1){
1074 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","File")
1075 <<"File Read Error "<<ENDLOG;
1078 if(size%sizeof(AliHLTTPCSpacePointData)){
1079 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","File Size")
1080 <<"File Size wrong "<<ENDLOG;
1083 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","File")
1084 <<AliHLTTPCLog::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1088 ///////////////////////////////////////// Track IO
1089 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t ntrack,AliHLTTPCTrackSegmentData *data)
1091 //Write the tracks stored in data, to outputfile.
1093 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
1094 <<"No Output File"<<ENDLOG;
1098 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
1099 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1102 AliHLTTPCTrackSegmentData *trackPt = data;
1103 for(UInt_t i=0;i<ntrack;i++){
1104 Int_t size=sizeof(AliHLTTPCTrackSegmentData)+trackPt->fNPoints*sizeof(UInt_t);
1105 fwrite(trackPt,size,1,fOutBinary);
1106 Byte_t *bytePt = (Byte_t*) trackPt;
1108 trackPt = (AliHLTTPCTrackSegmentData*) bytePt;
1110 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","File")
1111 <<AliHLTTPCLog::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1116 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & ntrack,AliHLTTPCTrackSegmentData *data)
1118 //Read the tracks in inputfile, and store it in data.
1120 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1121 <<"No Input File"<<ENDLOG;
1125 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
1126 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1131 AliHLTTPCTrackSegmentData *trackPt = data;
1134 while(!feof(fInBinary)){
1135 if(fread(trackPt,sizeof(AliHLTTPCTrackSegmentData),1,fInBinary)!=1) break;
1136 Int_t size=trackPt->fNPoints*sizeof(UInt_t);
1137 if(fread(trackPt->fPointIDs,size,1,fInBinary)!=1) break;
1138 Byte_t *bytePt = (Byte_t*) trackPt;
1139 bytePt += sizeof(AliHLTTPCTrackSegmentData)+size;
1140 trackPt = (AliHLTTPCTrackSegmentData*) bytePt;
1143 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","File")
1144 <<AliHLTTPCLog::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1148 Bool_t AliHLTTPCMemHandler::TrackArray2Binary(AliHLTTPCTrackArray *array)
1150 //Write the trackarray to the outputfile.
1152 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","File")
1153 <<"No Output File"<<ENDLOG;
1157 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","Memory")
1158 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1161 AliHLTTPCTrackSegmentData *data = (AliHLTTPCTrackSegmentData *)Allocate(array);
1164 TrackArray2Memory(ntrack,data,array);
1165 Memory2Binary(ntrack,data);
1170 Bool_t AliHLTTPCMemHandler::Binary2TrackArray(AliHLTTPCTrackArray *array)
1172 //Read the tracks in inputfile, and fill it in trackarray.
1173 //array should already be constructed.
1175 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2TrackArray","File")
1176 <<"No Input File"<<ENDLOG;
1180 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2TrackArray","Memory")
1181 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1184 AliHLTTPCTrackSegmentData *data = (AliHLTTPCTrackSegmentData *)Allocate();
1186 Binary2Memory(ntrack,data);
1187 Memory2TrackArray(ntrack,data,array);
1192 Bool_t AliHLTTPCMemHandler::TrackArray2Memory(UInt_t & ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
1194 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1196 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
1197 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1201 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
1202 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1206 array->WriteTracks(ntrack,data);
1210 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
1212 //Fill the tracks in data into trackarray.
1215 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1216 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1220 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1221 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1224 array->FillTracks(ntrack,data);
1228 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array,Int_t slice) const
1230 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1233 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1234 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1238 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1239 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1242 array->FillTracks(ntrack,data,slice);
1246 void AliHLTTPCMemHandler::UpdateRowPointer(AliHLTTPCDigitRowData *&tempPt)
1248 //Update the data pointer to the next padrow in memory.
1250 Byte_t *tmp = (Byte_t*)tempPt;
1251 Int_t size = sizeof(AliHLTTPCDigitRowData) + tempPt->fNDigit*sizeof(AliHLTTPCDigitData);
1253 tempPt = (AliHLTTPCDigitRowData*)tmp;
1256 Int_t AliHLTTPCMemHandler::ComparePoints(UInt_t /*row*/,UShort_t pad,UShort_t time) const
1258 //compare two points
1259 if(fNUsed>=fNDigits) return -2;
1261 if(pad==fDPt[fNUsed]->fPad&&time==fDPt[fNUsed]->fTime) return 0;
1263 if(pad<fDPt[fNUsed]->fPad) return -1;
1264 if(pad==fDPt[fNUsed]->fPad&&time<fDPt[fNUsed]->fTime) return -1;
1269 Int_t AliHLTTPCMemHandler::CompareDigits(AliHLTTPCRandomDigitData *a,AliHLTTPCRandomDigitData *b) const
1271 //compare two digits
1272 if(a->fPad==b->fPad && a->fTime == b->fTime) return 0;
1274 if(a->fPad<b->fPad) return -1;
1275 if(a->fPad==b->fPad && a->fTime<b->fTime) return -1;