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 AliL3MemHandler
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 // AliL3MemHandler file;
21 // file.SetBinaryInput(filename);
22 // file.Init(slice,patch);
25 // AliL3DigitRowData *data = file.CompBinary2Memory(nrows);
27 // for(int i=0; i<nrows; i++)
30 // AliL3DigitData *dataPt = (AliL3DigitData*)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 AliL3DigitRowData.
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 // AliL3MemHandler newfile;
52 // newfile.Init(slice,patch);
53 // newfile.SetBinaryOutput(newfilename);
54 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)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 "AliL3RootTypes.h"
66 #include "AliL3StandardIncludes.h"
67 #include "AliL3DigitData.h"
68 #include "AliL3Logging.h"
69 #include "AliL3Transform.h"
70 #include "AliL3TrackSegmentData.h"
71 #include "AliL3SpacePointData.h"
72 #include "AliL3TrackArray.h"
73 #include "AliL3MemHandler.h"
79 ClassImp(AliL3MemHandler)
81 AliL3MemHandler::AliL3MemHandler()
100 AliL3MemHandler::~AliL3MemHandler()
103 if(fPt) delete[] fPt;
104 if(fRandomDigits) delete [] fRandomDigits;
105 if(fDPt) delete [] fDPt;
108 void AliL3MemHandler::Init(Int_t s,Int_t p, Int_t *r)
116 fRowMin=AliL3Transform::GetFirstRow(p);
117 fRowMax=AliL3Transform::GetLastRow(p);
122 void AliL3MemHandler::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] = AliL3Transform::GetNTimeBins()-1;
132 void AliL3MemHandler::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(AliL3Log::kWarning,"AliL3MemHandler::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] = AliL3Transform::Row2X(i);
164 xyz[2] = xyz[0]/tan(thetamax);
165 AliL3Transform::Slice2Sector(fSlice,i,sector,row);
166 AliL3Transform::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] = AliL3Transform::Row2X(i);
176 xyz[1] = AliL3Transform::GetMaxY(i);
177 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
178 xyz[2] = radii/tan(thetamin);
179 AliL3Transform::Local2Raw(xyz,sector,row);
180 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
186 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
188 //Set the input binary file.
189 fInBinary = fopen(name,"r");
191 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
192 <<"Error opening file "<<name<<ENDLOG;
198 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
200 //Set the input binary file.
203 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
204 <<"Pointer to File = 0x0 "<<ENDLOG;
210 void AliL3MemHandler::CloseBinaryInput()
212 //Close the input file.
214 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
215 <<"Nothing to Close"<<ENDLOG;
222 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
224 //Set the binary output file.
225 fOutBinary = fopen(name,"w");
227 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
228 <<"Pointer to File = 0x0 "<<ENDLOG;
234 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
236 //Set the binary output file.
239 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
240 <<"Pointer to File = 0x0 "<<ENDLOG;
246 void AliL3MemHandler::CloseBinaryOutput()
250 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
251 <<"Nothing to Close"<<ENDLOG;
258 UInt_t AliL3MemHandler::GetFileSize()
260 //Returns the file size in bytes of the input file.
262 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
263 <<"No Input File"<<ENDLOG;
266 fseek(fInBinary,0,SEEK_END);
267 UInt_t size = (UInt_t) ftell(fInBinary);
272 Byte_t *AliL3MemHandler::Allocate()
275 return Allocate(GetFileSize());
278 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
280 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
282 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
283 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
286 return Allocate(array->GetOutSize());
289 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
291 //Allocate memory of size in bytes.
293 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
294 <<"Delete Memory"<<ENDLOG;
297 fPt = new Byte_t[size];
300 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
301 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
305 void AliL3MemHandler::Free()
307 //Clear the memory, if allocated.
309 // LOG(AliL3Log::kInformational,"AliL3MemHandler::Free","Memory")
310 // <<"No Memory allocated - can't Free"<<ENDLOG;
318 ///////////////////////////////////////// Random
319 void AliL3MemHandler::SetRandomSeed()
321 //If you are adding random data to the original data.
323 SetRandomSeed(time(tp));
326 void AliL3MemHandler::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 AliL3RandomDigitData[fNRandom*9];
335 if(fDPt) delete [] fDPt;
336 fDPt = new AliL3RandomDigitData *[fNRandom*9];
339 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last)
342 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
343 // Uses CompareDigits() to compare objects.
346 static AliL3RandomDigitData *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 AliL3MemHandler::GetRandomSize() const
387 for(Int_t r=fRowMin;r<=fRowMax;r++){
388 Int_t npad=AliL3Transform::GetNPads(r);
389 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
391 return 9 * nrandom * sizeof(AliL3DigitData);
394 void AliL3MemHandler::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=AliL3Transform::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) AliL3Transform::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*AliL3Transform::GetADCSat());
411 DigitizePoint(row,pad,time,charge);
413 QSort(fDPt,0,fNDigits);
417 void AliL3MemHandler::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>=AliL3Transform::GetNPads(row)) continue;
431 if(dtime<0||dtime>=AliL3Transform::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 AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
446 //Write data to the outputfile as is. No run-length encoding is done.
449 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
450 <<"No Output File"<<ENDLOG;
454 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
455 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
459 AliL3DigitRowData *rowPt = data;
461 for(UInt_t i=0;i<nrow;i++){
462 Int_t size = sizeof(AliL3DigitData) * rowPt->fNDigit
463 + sizeof(AliL3DigitRowData);
465 fwrite(rowPt,size,1,fOutBinary);
466 Byte_t *bytePt =(Byte_t *) rowPt;
468 rowPt = (AliL3DigitRowData *) bytePt;
470 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
471 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
472 <<nrow<<" Rows)"<<ENDLOG;
476 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
478 //Read inputfile into memory as is, and store it in data.
479 // No run-length encoding is assumed.
482 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
483 <<"No Input File"<<ENDLOG;
487 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
488 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
492 AliL3DigitRowData *rowPt = data;
495 while(!feof(fInBinary)){
496 Byte_t *bytePt =(Byte_t *) rowPt;
498 if(fread(rowPt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
500 bytePt += sizeof(AliL3DigitRowData);
501 outsize += sizeof(AliL3DigitRowData);
503 Int_t size = sizeof(AliL3DigitData) * rowPt->fNDigit;
505 //if(fread(bytePt,size,1,fInBinary)!=1) break;
506 fread(bytePt,size,1,fInBinary);
509 rowPt = (AliL3DigitRowData *) bytePt;
513 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
514 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
515 <<rowcount<<" Rows)"<<ENDLOG;
519 void AliL3MemHandler::AddData(AliL3DigitData *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 AliL3MemHandler::AddRandom(AliL3DigitData *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 AliL3MemHandler::MergeDataRandom(AliL3DigitData *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>=AliL3Transform::GetADCSat()) ch = AliL3Transform::GetADCSat();
549 data[ndata].fCharge = ch;
555 void AliL3MemHandler::AddDataRandom(AliL3DigitData *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 AliL3MemHandler::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 AliL3MemHandler::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 AliL3MemHandler::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 AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
608 AliL3DigitRowData *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(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
614 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
618 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
619 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
622 AliL3DigitRowData *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(AliL3DigitData) * rowPt->fNDigit+
679 sizeof(AliL3DigitRowData);
680 Byte_t *bytePt =(Byte_t *) rowPt;
682 rowPt = (AliL3DigitRowData *) bytePt;
685 Write(comp,index,subindex,0);
686 return index * sizeof(UInt_t);
689 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
690 AliL3DigitRowData *data,UInt_t *comp)
692 //Uncompress the run-length encoded data in memory pointed to by comp, and
696 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
697 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
701 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
702 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
707 AliL3DigitRowData *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(AliL3DigitData) * rowPt->fNDigit+
742 sizeof(AliL3DigitRowData);
743 Byte_t *bytePt =(Byte_t *) rowPt;
746 rowPt = (AliL3DigitRowData *) bytePt;
751 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data) const
753 //Return the size of RLE data, after compressing data.
756 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
757 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
760 AliL3DigitRowData *rowPt = data;
763 for(UInt_t i=0;i<nrow;i++){
768 for(Int_t d=0;d<200;d++) ddd[d]=0;
769 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
770 if(rowPt->fDigitData[dig].fPad <200){
771 ddd[rowPt->fDigitData[dig].fPad]++;
774 for(Int_t d=0;d<200;d++){
782 for(UShort_t pad=0;pad <= maxpad;pad++){
783 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
786 // write zero if time != 0
787 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
788 if(rowPt->fDigitData[digit].fTime>0){
793 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
795 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
796 if(rowPt->fDigitData[digit].fTime +1 !=
797 rowPt->fDigitData[digit+1].fTime){
808 Int_t size = sizeof(AliL3DigitData) * rowPt->fNDigit+
809 sizeof(AliL3DigitRowData);
810 Byte_t *bytePt =(Byte_t *) rowPt;
812 rowPt = (AliL3DigitRowData *) bytePt;
816 return (index/3) * sizeof(UInt_t);
819 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp) const
823 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
824 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
832 for(UInt_t i=0;i<nrow;i++){
834 Read(comp,index,subindex);
835 UShort_t npad = Read(comp,index,subindex);
836 for(UShort_t p=0;p<npad;p++){
837 Read(comp,index,subindex);
838 if(Test(comp,index,subindex)==0){
839 Read(comp,index,subindex);
840 if(Read(comp,index,subindex)== 0) continue;
843 while(Read(comp,index,subindex)!=0) ndigit++;
844 if(Read(comp,index,subindex)==0) break;
847 Int_t size = sizeof(AliL3DigitData) * ndigit+
848 sizeof(AliL3DigitRowData);
855 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
859 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
860 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
867 while(index<size-1){ //don't start with last word
870 Read(comp,index,subindex);
871 UShort_t npad = Read(comp,index,subindex);
872 for(UShort_t p=0;p<npad;p++){
873 Read(comp,index,subindex);
874 if(Test(comp,index,subindex)==0){
875 Read(comp,index,subindex);
876 if(Read(comp,index,subindex)==0)continue;
879 while(Read(comp,index,subindex)!=0) ndigit++;
880 if(Read(comp,index,subindex)==0) break;
884 if(index==size-1){ //last word
886 if(Read(comp,index,subindex)!=0) nrow++;
892 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
895 //Write the RLE data in comp to the output file.
898 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
899 <<"No Output File"<<ENDLOG;
903 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
904 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
908 size=GetMemorySize(nrow,comp);
910 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
911 <<"Memory size = 0 "<<ENDLOG;
914 UInt_t length = size/sizeof(UInt_t);
915 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
916 fwrite(comp,size,1,fOutBinary);
920 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
922 //Read the RLE data from file, and store it in comp. No unpacking yet.
925 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
926 <<"No Output File"<<ENDLOG;
930 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
931 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
936 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
937 UInt_t size = length*sizeof(UInt_t);
938 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
939 // now find the number of dig
940 nrow = GetNRow(comp,size);
944 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
946 // Read the RLE inputfile, unpack it and return the pointer to it.
947 AliL3MemHandler * handler = new AliL3MemHandler();
948 handler->SetBinaryInput(fInBinary);
949 UInt_t *comp =(UInt_t *)handler->Allocate();
950 handler->CompBinary2CompMemory(nrow,comp);
951 UInt_t size = GetMemorySize(nrow,comp);
952 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
953 CompMemory2Memory(nrow,data,comp);
959 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
961 //Perform RLE on the data, and write it to the output file.
963 AliL3MemHandler * handler = new AliL3MemHandler();
964 UInt_t size = GetCompMemorySize(nrow,data);
965 UInt_t *comp =(UInt_t *)handler->Allocate(size);
966 Memory2CompMemory(nrow,data,comp);
967 CompMemory2CompBinary(nrow,comp,size);
974 ///////////////////////////////////////// Point IO
975 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
977 //Writing spacepoints stored in data to the outputfile.
979 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
980 <<"No Output File"<<ENDLOG;
984 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
985 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
988 UInt_t size = npoint*sizeof(AliL3SpacePointData);
989 fwrite(data,size,1,fOutBinary);
994 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,Int_t slice)
996 //Transform the space points in data, to global coordinates in slice.
998 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
999 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1003 for(UInt_t i=0;i<npoint;i++){
1005 xyz[0] = data[i].fX;
1006 xyz[1] = data[i].fY;
1007 xyz[2] = data[i].fZ;
1008 AliL3Transform::Local2Global(xyz,slice);
1009 data[i].fX = xyz[0];
1010 data[i].fY = xyz[1];
1011 data[i].fZ = xyz[2];
1016 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1018 //Read the space points in inputfile, and store it in data.
1020 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1021 <<"No Input File"<<ENDLOG;
1025 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1026 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1030 Int_t size = GetFileSize();
1031 npoint = size/sizeof(AliL3SpacePointData);
1033 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1034 <<"File Size == 0"<<ENDLOG;
1038 if(fread(data,size,1,fInBinary)!=1){
1039 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1040 <<"File Read Error "<<ENDLOG;
1043 if(size%sizeof(AliL3SpacePointData)){
1044 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1045 <<"File Size wrong "<<ENDLOG;
1048 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1049 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1053 ///////////////////////////////////////// Track IO
1054 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1056 //Write the tracks stored in data, to outputfile.
1058 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1059 <<"No Output File"<<ENDLOG;
1063 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1064 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1067 AliL3TrackSegmentData *trackPt = data;
1068 for(UInt_t i=0;i<ntrack;i++){
1069 Int_t size=sizeof(AliL3TrackSegmentData)+trackPt->fNPoints*sizeof(UInt_t);
1070 fwrite(trackPt,size,1,fOutBinary);
1071 Byte_t *bytePt = (Byte_t*) trackPt;
1073 trackPt = (AliL3TrackSegmentData*) bytePt;
1075 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1076 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1081 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1083 //Read the tracks in inputfile, and store it in data.
1085 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1086 <<"No Input File"<<ENDLOG;
1090 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1091 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1096 AliL3TrackSegmentData *trackPt = data;
1099 while(!feof(fInBinary)){
1100 if(fread(trackPt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1101 Int_t size=trackPt->fNPoints*sizeof(UInt_t);
1102 if(fread(trackPt->fPointIDs,size,1,fInBinary)!=1) break;
1103 Byte_t *bytePt = (Byte_t*) trackPt;
1104 bytePt += sizeof(AliL3TrackSegmentData)+size;
1105 trackPt = (AliL3TrackSegmentData*) bytePt;
1108 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1109 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1113 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1115 //Write the trackarray to the outputfile.
1117 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1118 <<"No Output File"<<ENDLOG;
1122 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1123 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1126 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1129 TrackArray2Memory(ntrack,data,array);
1130 Memory2Binary(ntrack,data);
1135 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1137 //Read the tracks in inputfile, and fill it in trackarray.
1138 //array should already be constructed.
1140 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1141 <<"No Input File"<<ENDLOG;
1145 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1146 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1149 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1151 Binary2Memory(ntrack,data);
1152 Memory2TrackArray(ntrack,data,array);
1157 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array) const
1159 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1161 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1162 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1166 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1167 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1171 array->WriteTracks(ntrack,data);
1175 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array) const
1177 //Fill the tracks in data into trackarray.
1180 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1181 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1185 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1186 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1189 array->FillTracks(ntrack,data);
1193 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice) const
1195 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1198 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1199 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1203 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1204 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1207 array->FillTracks(ntrack,data,slice);
1211 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1213 //Update the data pointer to the next padrow in memory.
1215 Byte_t *tmp = (Byte_t*)tempPt;
1216 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1218 tempPt = (AliL3DigitRowData*)tmp;
1221 Int_t AliL3MemHandler::ComparePoints(UInt_t /*row*/,UShort_t pad,UShort_t time) const
1223 //compare two points
1224 if(fNUsed>=fNDigits) return -2;
1226 if(pad==fDPt[fNUsed]->fPad&&time==fDPt[fNUsed]->fTime) return 0;
1228 if(pad<fDPt[fNUsed]->fPad) return -1;
1229 if(pad==fDPt[fNUsed]->fPad&&time<fDPt[fNUsed]->fTime) return -1;
1234 Int_t AliL3MemHandler::CompareDigits(AliL3RandomDigitData *a,AliL3RandomDigitData *b) const
1236 //compare two digits
1237 if(a->fPad==b->fPad && a->fTime == b->fTime) return 0;
1239 if(a->fPad<b->fPad) return -1;
1240 if(a->fPad==b->fPad && a->fTime<b->fTime) return -1;