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 #include "AliL3StandardIncludes.h"
8 #include "AliL3Logging.h"
9 #include "AliL3Transform.h"
10 #include "AliL3TrackSegmentData.h"
11 #include "AliL3SpacePointData.h"
12 #include "AliL3TrackArray.h"
13 #include "AliL3MemHandler.h"
19 /** \class AliL3MemHandler
21 //_____________________________________________________________
24 // The HLT Binary File handler
26 // This class does all the memory I/O handling of HLT binary files.
31 // 1) Reading a binary file:
33 // AliL3MemHandler file;
34 // file.SetBinaryInput(filename);
35 // file.Init(slice,patch);
38 // AliL3DigitRowData *data = file.CompBinary2Memory(nrows);
40 // for(int i=0; i<nrows; i++)
43 // AliL3DigitData *dataPt = (AliL3DigitData*)data->fDigitData;
44 // for(int j=0; j<data->fNDigit; j++)
46 // pad = dataPt[j].fPad;
47 // time = dataPt[j].fTime;
48 // charge = dataPt[j].fCharge;
51 // file.UpdateRowPointer(data);
54 // file.CloseBinaryInput();
55 // ________________________
57 // 2) Writing a binary file:
59 // //First of all you need to store the data in memory,
60 // //and have a pointer to it of type AliL3DigitRowData.
61 // //E.g. if you just want to write the data you read in example 1)
62 // //into a new file, you can do the following:
64 // AliL3MemHandler newfile;
65 // newfile.Init(slice,patch);
66 // newfile.SetBinaryOutput(newfilename);
67 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
68 // newfile.CloseBinaryOutput();
71 // Compressed file format:
72 // -----------------------
74 // The data is RLE encoded and currently using _10_ bit range for the ADC-values.
78 ClassImp(AliL3MemHandler)
80 AliL3MemHandler::AliL3MemHandler()
99 AliL3MemHandler::~AliL3MemHandler()
102 if(fPt) delete[] fPt;
103 if(fRandomDigits) delete [] fRandomDigits;
104 if(fDPt) delete [] fDPt;
107 void AliL3MemHandler::Init(Int_t s,Int_t p, Int_t *r)
115 fRowMin=AliL3Transform::GetFirstRow(p);
116 fRowMax=AliL3Transform::GetLastRow(p);
121 void AliL3MemHandler::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] = AliL3Transform::GetNTimeBins()-1;
131 void AliL3MemHandler::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(AliL3Log::kWarning,"AliL3MemHandler::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] = AliL3Transform::Row2X(i);
163 xyz[2] = xyz[0]/tan(thetamax);
164 AliL3Transform::Slice2Sector(fSlice,i,sector,row);
165 AliL3Transform::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] = AliL3Transform::Row2X(i);
175 xyz[1] = AliL3Transform::GetMaxY(i);
176 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
177 xyz[2] = radii/tan(thetamin);
178 AliL3Transform::Local2Raw(xyz,sector,row);
179 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
185 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
187 //Set the input binary file.
188 fInBinary = fopen(name,"r");
190 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
191 <<"Error opening file "<<name<<ENDLOG;
197 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
199 //Set the input binary file.
202 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
203 <<"Pointer to File = 0x0 "<<ENDLOG;
209 void AliL3MemHandler::CloseBinaryInput()
211 //Close the input file.
213 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
214 <<"Nothing to Close"<<ENDLOG;
221 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
223 //Set the binary output file.
224 fOutBinary = fopen(name,"w");
226 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
227 <<"Pointer to File = 0x0 "<<ENDLOG;
233 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
235 //Set the binary output file.
238 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
239 <<"Pointer to File = 0x0 "<<ENDLOG;
245 void AliL3MemHandler::CloseBinaryOutput()
249 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
250 <<"Nothing to Close"<<ENDLOG;
257 UInt_t AliL3MemHandler::GetFileSize()
259 //Returns the file size in bytes of the input file.
261 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
262 <<"No Input File"<<ENDLOG;
265 fseek(fInBinary,0,SEEK_END);
266 UInt_t size = (UInt_t) ftell(fInBinary);
271 Byte_t *AliL3MemHandler::Allocate()
274 return Allocate(GetFileSize());
277 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
279 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
281 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
282 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
285 return Allocate(array->GetOutSize());
288 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
290 //Allocate memory of size in bytes.
292 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
293 <<"Delete Memory"<<ENDLOG;
296 fPt = new Byte_t[size];
299 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
300 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
304 void AliL3MemHandler::Free()
306 //Clear the memory, if allocated.
308 LOG(AliL3Log::kInformational,"AliL3MemHandler::Free","Memory")
309 <<"No Memory allocated - can't Free"<<ENDLOG;
317 ///////////////////////////////////////// Random
318 void AliL3MemHandler::SetRandomSeed()
320 //If you are adding random data to the original data.
322 SetRandomSeed(time(tp));
325 void AliL3MemHandler::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 AliL3RandomDigitData[fNRandom*9];
334 if(fDPt) delete [] fDPt;
335 fDPt = new AliL3RandomDigitData *[fNRandom*9];
338 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last)
341 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
342 // Uses CompareDigits() to compare objects.
345 static AliL3RandomDigitData *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 AliL3MemHandler::GetRandomSize() const
386 for(Int_t r=fRowMin;r<=fRowMax;r++){
387 Int_t npad=AliL3Transform::GetNPads(r);
388 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
390 return 9 * nrandom * sizeof(AliL3DigitData);
393 void AliL3MemHandler::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=AliL3Transform::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) AliL3Transform::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*AliL3Transform::GetADCSat());
410 DigitizePoint(row,pad,time,charge);
412 QSort(fDPt,0,fNDigits);
416 void AliL3MemHandler::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>=AliL3Transform::GetNPads(row)) continue;
430 if(dtime<0||dtime>=AliL3Transform::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 AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
445 //Write data to the outputfile as is. No run-length encoding is done.
448 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
449 <<"No Output File"<<ENDLOG;
453 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
454 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
458 AliL3DigitRowData *row_pt = data;
460 for(UInt_t i=0;i<nrow;i++){
461 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
462 + sizeof(AliL3DigitRowData);
464 fwrite(row_pt,size,1,fOutBinary);
465 Byte_t *byte_pt =(Byte_t *) row_pt;
467 row_pt = (AliL3DigitRowData *) byte_pt;
469 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
470 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
471 <<nrow<<" Rows)"<<ENDLOG;
475 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
477 //Read inputfile into memory as is, and store it in data.
478 // No run-length encoding is assumed.
481 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
482 <<"No Input File"<<ENDLOG;
486 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
487 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
491 AliL3DigitRowData *row_pt = data;
494 while(!feof(fInBinary)){
495 Byte_t *byte_pt =(Byte_t *) row_pt;
497 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
499 byte_pt += sizeof(AliL3DigitRowData);
500 outsize += sizeof(AliL3DigitRowData);
502 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
504 //if(fread(byte_pt,size,1,fInBinary)!=1) break;
505 fread(byte_pt,size,1,fInBinary);
508 row_pt = (AliL3DigitRowData *) byte_pt;
512 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
513 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
514 <<rowcount<<" Rows)"<<ENDLOG;
518 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
519 UInt_t /*row*/,UShort_t pad,UShort_t time,UShort_t charge) const
522 data[ndata].fPad = pad;
523 data[ndata].fTime = time;
524 data[ndata].fCharge = charge;
528 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
530 //add some random data
531 data[ndata].fPad = fDPt[fNUsed]->fPad;
532 data[ndata].fTime = fDPt[fNUsed]->fTime;
533 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
538 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
539 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
542 data[ndata].fPad = pad;
543 data[ndata].fTime = time;
544 data[ndata].fCharge = charge;
545 while(ComparePoints(row,pad,time)==0){
546 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
547 if(charge>=AliL3Transform::GetADCSat()) ch = AliL3Transform::GetADCSat();
548 data[ndata].fCharge = ch;
554 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
555 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
559 while((action=ComparePoints(row,pad,time))==1){
560 AddRandom(data,ndata);
563 MergeDataRandom(data,ndata,row,pad,time,charge);
566 AddData(data,ndata,row,pad,time,charge);
570 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
571 UInt_t & subindex, UShort_t value) const
573 //write compressed data
574 UInt_t shift[3] = {0,10,20};
575 if(subindex==0) comp[index] =0; //clean up memory
576 comp[index] |= (value&0x03ff)<<shift[subindex];
584 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex) const
586 //read compressed data
587 UInt_t shift[3] = {0,10,20};
588 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
598 UShort_t AliL3MemHandler::Test(UInt_t *comp,
599 UInt_t index, UInt_t subindex) const
602 UInt_t shift[3] = {0,10,20};
603 return (comp[index]>>shift[subindex])&0x03ff;
606 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
607 AliL3DigitRowData *data,UInt_t *comp)
609 //Performs run-length encoding on data stored in memory pointed to by data.
610 //The compressed data is written to comp.
612 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
613 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
617 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
618 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
621 AliL3DigitRowData *row_pt = data;
625 for(UInt_t i=0;i<nrow;i++){
626 UShort_t value = row_pt->fRow;
627 Write(comp,index,subindex,value);
631 for(Int_t d=0;d<200;d++) ddd[d]=0;
632 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
633 if(row_pt->fDigitData[dig].fPad <200){
634 ddd[row_pt->fDigitData[dig].fPad]++;
637 for(Int_t d=0;d<200;d++){
643 Write(comp,index,subindex,npad);
645 for(UShort_t pad=0;pad <= maxpad;pad++){
646 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
648 Write(comp,index,subindex,pad);
649 // write zero if time != 0
650 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
651 if(row_pt->fDigitData[digit].fTime>0){
652 Write(comp,index,subindex,0);
653 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
656 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
657 UShort_t charge = row_pt->fDigitData[digit].fCharge;
661 Write(comp,index,subindex,charge);
662 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
663 if(row_pt->fDigitData[digit].fTime +1 !=
664 row_pt->fDigitData[digit+1].fTime){
665 Write(comp,index,subindex,0);
666 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
667 (row_pt->fDigitData[digit].fTime +1);
668 Write(comp,index,subindex,nzero);
673 Write(comp,index,subindex,0);
674 Write(comp,index,subindex,0);
677 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
678 sizeof(AliL3DigitRowData);
679 Byte_t *byte_pt =(Byte_t *) row_pt;
681 row_pt = (AliL3DigitRowData *) byte_pt;
684 Write(comp,index,subindex,0);
685 return index * sizeof(UInt_t);
688 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
689 AliL3DigitRowData *data,UInt_t *comp)
691 //Uncompress the run-length encoded data in memory pointed to by comp, and
695 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
696 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
700 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
701 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
706 AliL3DigitRowData *row_pt = data;
710 for(UInt_t i=0;i<nrow;i++){
712 UInt_t row =Read(comp,index,subindex);
715 UShort_t npad = Read(comp,index,subindex);
716 for(UShort_t p=0;p<npad;p++){
719 UShort_t pad = Read(comp,index,subindex);
720 if(Test(comp,index,subindex)==0){
721 Read(comp,index,subindex);
722 if( (time = Read(comp,index,subindex)) == 0 ){
727 while( (charge=Read(comp,index,subindex)) != 0){
728 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
729 //AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
730 //seems we are using this function... but dont know why
731 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
734 UShort_t tshift = Read(comp,index,subindex);
735 if(tshift == 0) break;
739 row_pt->fNDigit = ndigit;
740 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
741 sizeof(AliL3DigitRowData);
742 Byte_t *byte_pt =(Byte_t *) row_pt;
745 row_pt = (AliL3DigitRowData *) byte_pt;
750 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data) const
752 //Return the size of RLE data, after compressing data.
755 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
756 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
759 AliL3DigitRowData *row_pt = data;
762 for(UInt_t i=0;i<nrow;i++){
767 for(Int_t d=0;d<200;d++) ddd[d]=0;
768 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
769 if(row_pt->fDigitData[dig].fPad <200){
770 ddd[row_pt->fDigitData[dig].fPad]++;
773 for(Int_t d=0;d<200;d++){
781 for(UShort_t pad=0;pad <= maxpad;pad++){
782 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
785 // write zero if time != 0
786 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
787 if(row_pt->fDigitData[digit].fTime>0){
792 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
794 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
795 if(row_pt->fDigitData[digit].fTime +1 !=
796 row_pt->fDigitData[digit+1].fTime){
807 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
808 sizeof(AliL3DigitRowData);
809 Byte_t *byte_pt =(Byte_t *) row_pt;
811 row_pt = (AliL3DigitRowData *) byte_pt;
815 return (index/3) * sizeof(UInt_t);
818 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp) const
822 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
823 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
831 for(UInt_t i=0;i<nrow;i++){
833 Read(comp,index,subindex);
834 UShort_t npad = Read(comp,index,subindex);
835 for(UShort_t p=0;p<npad;p++){
836 Read(comp,index,subindex);
837 if(Test(comp,index,subindex)==0){
838 Read(comp,index,subindex);
839 if(Read(comp,index,subindex)== 0) continue;
842 while(Read(comp,index,subindex)!=0) ndigit++;
843 if(Read(comp,index,subindex)==0) break;
846 Int_t size = sizeof(AliL3DigitData) * ndigit+
847 sizeof(AliL3DigitRowData);
854 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
858 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
859 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
866 while(index<size-1){ //don't start with last word
869 Read(comp,index,subindex);
870 UShort_t npad = Read(comp,index,subindex);
871 for(UShort_t p=0;p<npad;p++){
872 Read(comp,index,subindex);
873 if(Test(comp,index,subindex)==0){
874 Read(comp,index,subindex);
875 if(Read(comp,index,subindex)==0)continue;
878 while(Read(comp,index,subindex)!=0) ndigit++;
879 if(Read(comp,index,subindex)==0) break;
883 if(index==size-1){ //last word
885 if(Read(comp,index,subindex)!=0) nrow++;
891 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
894 //Write the RLE data in comp to the output file.
897 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
898 <<"No Output File"<<ENDLOG;
902 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
903 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
907 size=GetMemorySize(nrow,comp);
909 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
910 <<"Memory size = 0 "<<ENDLOG;
913 UInt_t length = size/sizeof(UInt_t);
914 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
915 fwrite(comp,size,1,fOutBinary);
919 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
921 //Read the RLE data from file, and store it in comp. No unpacking yet.
924 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
925 <<"No Output File"<<ENDLOG;
929 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
930 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
935 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
936 UInt_t size = length*sizeof(UInt_t);
937 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
938 // now find the number of dig
939 nrow = GetNRow(comp,size);
943 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
945 // Read the RLE inputfile, unpack it and return the pointer to it.
946 AliL3MemHandler * handler = new AliL3MemHandler();
947 handler->SetBinaryInput(fInBinary);
948 UInt_t *comp =(UInt_t *)handler->Allocate();
949 handler->CompBinary2CompMemory(nrow,comp);
950 UInt_t size = GetMemorySize(nrow,comp);
951 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
952 CompMemory2Memory(nrow,data,comp);
958 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
960 //Perform RLE on the data, and write it to the output file.
962 AliL3MemHandler * handler = new AliL3MemHandler();
963 UInt_t size = GetCompMemorySize(nrow,data);
964 UInt_t *comp =(UInt_t *)handler->Allocate(size);
965 Memory2CompMemory(nrow,data,comp);
966 CompMemory2CompBinary(nrow,comp,size);
973 ///////////////////////////////////////// Point IO
974 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
976 //Writing spacepoints stored in data to the outputfile.
978 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
979 <<"No Output File"<<ENDLOG;
983 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
984 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
987 UInt_t size = npoint*sizeof(AliL3SpacePointData);
988 fwrite(data,size,1,fOutBinary);
993 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,Int_t slice)
995 //Transform the space points in data, to global coordinates in slice.
997 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
998 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1002 for(UInt_t i=0;i<npoint;i++){
1004 xyz[0] = data[i].fX;
1005 xyz[1] = data[i].fY;
1006 xyz[2] = data[i].fZ;
1007 AliL3Transform::Local2Global(xyz,slice);
1008 data[i].fX = xyz[0];
1009 data[i].fY = xyz[1];
1010 data[i].fZ = xyz[2];
1015 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1017 //Read the space points in inputfile, and store it in data.
1019 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1020 <<"No Input File"<<ENDLOG;
1024 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1025 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1029 Int_t size = GetFileSize();
1030 npoint = size/sizeof(AliL3SpacePointData);
1032 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1033 <<"File Size == 0"<<ENDLOG;
1037 if(fread(data,size,1,fInBinary)!=1){
1038 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1039 <<"File Read Error "<<ENDLOG;
1042 if(size%sizeof(AliL3SpacePointData)){
1043 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1044 <<"File Size wrong "<<ENDLOG;
1047 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1048 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1052 ///////////////////////////////////////// Track IO
1053 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1055 //Write the tracks stored in data, to outputfile.
1057 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1058 <<"No Output File"<<ENDLOG;
1062 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1063 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1066 AliL3TrackSegmentData *track_pt = data;
1067 for(UInt_t i=0;i<ntrack;i++){
1068 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1069 fwrite(track_pt,size,1,fOutBinary);
1070 Byte_t *byte_pt = (Byte_t*) track_pt;
1072 track_pt = (AliL3TrackSegmentData*) byte_pt;
1074 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1075 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1080 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1082 //Read the tracks in inputfile, and store it in data.
1084 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1085 <<"No Input File"<<ENDLOG;
1089 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1090 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1095 AliL3TrackSegmentData *track_pt = data;
1098 while(!feof(fInBinary)){
1099 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1100 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1101 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1102 Byte_t *byte_pt = (Byte_t*) track_pt;
1103 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1104 track_pt = (AliL3TrackSegmentData*) byte_pt;
1107 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1108 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1112 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1114 //Write the trackarray to the outputfile.
1116 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1117 <<"No Output File"<<ENDLOG;
1121 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1122 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1125 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1128 TrackArray2Memory(ntrack,data,array);
1129 Memory2Binary(ntrack,data);
1134 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1136 //Read the tracks in inputfile, and fill it in trackarray.
1137 //array should already be constructed.
1139 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1140 <<"No Input File"<<ENDLOG;
1144 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1145 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1148 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1150 Binary2Memory(ntrack,data);
1151 Memory2TrackArray(ntrack,data,array);
1156 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array) const
1158 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1160 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1161 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1165 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1166 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1170 array->WriteTracks(ntrack,data);
1174 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array) const
1176 //Fill the tracks in data into trackarray.
1179 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1180 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1184 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1185 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1188 array->FillTracks(ntrack,data);
1192 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice) const
1194 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1197 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1198 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1202 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1203 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1206 array->FillTracks(ntrack,data,slice);
1210 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1212 //Update the data pointer to the next padrow in memory.
1214 Byte_t *tmp = (Byte_t*)tempPt;
1215 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1217 tempPt = (AliL3DigitRowData*)tmp;