3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>, Anders Vestbo <mailto:vestbo$fi.uib.no>
4 //*-- Copyright © Uli
5 // changes done by Constantin Loizides <mailto:loizides@ikf.physik.uni-frankfurt.de>
14 #include "AliL3MemHandler.h"
15 #include "AliL3Logging.h"
17 #include "AliL3DigitData.h"
18 #include "AliL3TrackSegmentData.h"
19 #include "AliL3SpacePointData.h"
20 #include "AliL3TrackArray.h"
22 /** \class AliL3MemHandler
24 //_____________________________________________________________
27 // The HLT Binary File handler
29 // This class does all the memory I/O handling of HLT binary files.
34 // 1) Reading a binary file:
36 // AliL3MemHandler file;
37 // file.SetBinaryInput(filename);
40 // AliL3DigitRowData *data = file.CompBinary2Memory(nrowss);
42 // for(int i=0; i<nrows; i++)
45 // AliL3DigitData *dataPt = (AliL3DigitData*)data->fDigitData;
46 // for(int j=0; j<data->fNDigit; j++)
48 // pad = dataPt[j].fPad;
49 // time = dataPt[j].fTime;
50 // charge = dataPt[j].fCharge;
53 // file.UpdateRowPointer(data);
56 // file.CloseBinaryInput();
57 // ________________________
59 // 2) Writing a binary file:
61 // //First of all you need to store the data in memory,
62 // //and have a pointer to it of type AliL3DigitRowData.
63 // //E.g. if you just want to write the data you read in example 1)
64 // //into a new file, you can do the following:
66 // AliL3MemHandler newfile;
67 // newfile.SetBinaryOutput(newfilename);
68 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
69 // newfile.CloseBinaryOutput();
72 // Compressed file format:
73 // -----------------------
75 // The data is RLE encoded and currently using _10_ bit range for the ADC-values.
79 ClassImp(AliL3MemHandler)
81 AliL3MemHandler::AliL3MemHandler()
101 AliL3MemHandler::~AliL3MemHandler()
104 if(fPt) delete[] fPt;
105 if(fDigits) delete [] fDigits;
106 if(fDPt) delete [] fDPt;
109 void AliL3MemHandler::Init(Int_t s,Int_t p, Int_t *r=0)
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.
126 for(Int_t i=fRowMin; i<=fRowMax; i++)
128 fEtaMinTimeBin[i] = 0;
129 fEtaMaxTimeBin[i] = 445;
133 void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice)
135 // Init the Look-up table for the Region of Interest mode.
136 // Here you can specify a certain etaregion, - all data
137 // outside this region will be discarded:
138 // eta[0] = mimium eta
139 // eta[1] = maximum eta
140 // slice[0] = mimumum slice
141 // slice[1] = maximum slice
146 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values")
147 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
148 for(Int_t i=fRowMin; i<=fRowMax; i++)
156 for(Int_t i=fRowMin; i<=fRowMax; i++)
161 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
163 xyz[0] = AliL3Transform::Row2X(i);
165 xyz[2] = xyz[0]/tan(thetamax);
166 AliL3Transform::Slice2Sector(fSlice,i,sector,row);
167 AliL3Transform::Local2Raw(xyz,sector,row);
169 fEtaMinTimeBin[i] = (Int_t)xyz[2];
172 fEtaMaxTimeBin[i] = 445;
175 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
176 xyz[0] = AliL3Transform::Row2X(i);
177 xyz[1] = AliL3Transform::GetMaxY(i);
178 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
179 xyz[2] = radii/tan(thetamin);
180 AliL3Transform::Local2Raw(xyz,sector,row);
181 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
187 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
189 //Set the input binary file.
191 fInBinary = fopen(name,"r");
193 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
194 <<"Error opening file "<<name<<ENDLOG;
200 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
202 //Set the input binary file.
206 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
207 <<"Pointer to File = 0x0 "<<ENDLOG;
213 void AliL3MemHandler::CloseBinaryInput()
215 //Close the input file.
218 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
219 <<"Nothing to Close"<<ENDLOG;
226 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
228 //Set the binary output file.
229 fOutBinary = fopen(name,"w");
231 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
232 <<"Pointer to File = 0x0 "<<ENDLOG;
238 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
240 //Set the binary output file.
244 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
245 <<"Pointer to File = 0x0 "<<ENDLOG;
251 void AliL3MemHandler::CloseBinaryOutput()
254 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
255 <<"Nothing to Close"<<ENDLOG;
262 UInt_t AliL3MemHandler::GetFileSize()
264 //Returns the file size in bytes of the input file.
267 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
268 <<"No Input File"<<ENDLOG;
271 fseek(fInBinary,0,SEEK_END);
272 UInt_t size = (UInt_t) ftell(fInBinary);
277 Byte_t *AliL3MemHandler::Allocate()
279 return Allocate(GetFileSize());
282 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
284 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
287 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
288 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
291 return Allocate(array->GetOutSize());
294 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
296 //Allocate memory of size in bytes.
299 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
300 <<"Delete Memory"<<ENDLOG;
303 fPt = new Byte_t[size];
306 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
307 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
311 void AliL3MemHandler::Free()
313 //Clear the memory, if allocated.
316 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
317 <<"No Memory allocated - can't Free"<<ENDLOG;
325 ///////////////////////////////////////// Random
326 void AliL3MemHandler::SetRandomSeed()
328 //If you are adding random data to the original data.
330 SetRandomSeed(time(tp));
333 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
335 //If you are adding random data to the original data.
338 fNRandom = maxnumber;
340 if(fDigits) delete [] fDigits;
341 fDigits = new AliL3RandomDigitData[fNRandom*9];
342 if(fDPt) delete [] fDPt;
343 fDPt = new AliL3RandomDigitData *[fNRandom*9];
346 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last){
348 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
349 // Uses CompareDigits() to compare objects.
352 static AliL3RandomDigitData *tmp;
353 static int i; // "static" to save stack space
356 while (last - first > 1) {
360 while (++i < last && CompareDigits(a[i], a[first]) < 0)
362 while (--j > first && CompareDigits(a[j], a[first]) > 0)
379 if (j - first < last - (j + 1)) {
381 first = j + 1; // QSort(j + 1, last);
383 QSort(a, j + 1, last);
384 last = j; // QSort(first, j);
389 UInt_t AliL3MemHandler::GetRandomSize()
392 for(Int_t r=fRowMin;r<=fRowMax;r++){
393 Int_t npad=AliL3Transform::GetNPads(r);
394 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
396 return 9 * nrandom * sizeof(AliL3DigitData);
399 void AliL3MemHandler::Generate(Int_t row)
401 //Generate random data on row, if you didn't ask for this, nothing happens here.
403 if(!IsRandom) return;
406 Int_t npad=AliL3Transform::GetNPads(row);
407 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
408 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
409 (Double_t) ntime/(Double_t) AliL3Transform::GetNTimeBins() );
411 for(Int_t n=0;n<nrandom;n++){
412 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
413 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
414 Int_t charge = (int)((float)rand()/RAND_MAX*1023);
415 DigitizePoint(row,pad,time,charge);
417 QSort(fDPt,0,fNDigits);
418 // for(Int_t d=0;d<fNDigits;d++)
419 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
420 // fDPt[d]->fTime,fDPt[d]->fCharge);
424 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
425 Int_t time,Int_t charge)
427 //Making one single random cluster.
428 for(Int_t j=-1;j<2;j++){
429 for(Int_t k=-1;k<2;k++){
430 Int_t dcharge = charge;
433 if(dcharge<10) continue;
434 Int_t dpad = j + pad;
435 Int_t dtime = k + time;
437 if(dpad<0||dpad>=AliL3Transform::GetNPads(row)) continue;
438 if(dtime<0||dtime>=AliL3Transform::GetNTimeBins()) continue;
440 fDigits[fNDigits].fCharge = dcharge;
441 fDigits[fNDigits].fRow = row;
442 fDigits[fNDigits].fPad = dpad;
443 fDigits[fNDigits].fTime = dtime;
444 fDPt[fNDigits] = &fDigits[fNDigits];
450 ///////////////////////////////////////// Digit IO
451 Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
453 //Write data to the outputfile as is. No run-length encoding is done.
456 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
457 <<"No Output File"<<ENDLOG;
461 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
462 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
466 AliL3DigitRowData *row_pt = data;
468 for(UInt_t i=0;i<nrow;i++){
469 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
470 + sizeof(AliL3DigitRowData);
472 fwrite(row_pt,size,1,fOutBinary);
473 Byte_t *byte_pt =(Byte_t *) row_pt;
475 row_pt = (AliL3DigitRowData *) byte_pt;
477 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
478 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
479 <<nrow<<" Rows)"<<ENDLOG;
483 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
485 //Read inputfile into memory as is, and store it in data. No run-length encoding
489 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
490 <<"No Input File"<<ENDLOG;
494 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
495 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
499 AliL3DigitRowData *row_pt = data;
502 while(!feof(fInBinary)){
503 Byte_t *byte_pt =(Byte_t *) row_pt;
505 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
506 byte_pt += sizeof(AliL3DigitRowData);
507 outsize += sizeof(AliL3DigitRowData);
509 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
511 if(fread(byte_pt,size,1,fInBinary)!=1) break;
515 row_pt = (AliL3DigitRowData *) byte_pt;
519 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
520 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
521 <<rowcount<<" Rows)"<<ENDLOG;
525 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
526 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
528 data[ndata].fPad = pad;
529 data[ndata].fTime = time;
530 data[ndata].fCharge = charge;
534 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
536 data[ndata].fPad = fDPt[fNUsed]->fPad;
537 data[ndata].fTime = fDPt[fNUsed]->fTime;
538 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
543 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
544 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
546 data[ndata].fPad = pad;
547 data[ndata].fTime = time;
548 data[ndata].fCharge = charge;
549 while(ComparePoints(row,pad,time)==0){
550 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
551 if(charge>1023) ch = 1023;
552 data[ndata].fCharge = ch;
558 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
559 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
562 while((action=ComparePoints(row,pad,time))==1){
563 AddRandom(data,ndata);
566 MergeDataRandom(data,ndata,row,pad,time,charge);
569 AddData(data,ndata,row,pad,time,charge);
573 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
574 UInt_t & subindex, UShort_t value)
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 AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
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)
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 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
733 UShort_t tshift = Read(comp,index,subindex);
734 if(tshift ==0) break;
738 row_pt->fNDigit = ndigit;
739 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
740 sizeof(AliL3DigitRowData);
741 Byte_t *byte_pt =(Byte_t *) row_pt;
744 row_pt = (AliL3DigitRowData *) byte_pt;
749 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
751 //Return the size of RLE data, after compressing data.
754 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
755 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
758 AliL3DigitRowData *row_pt = data;
761 for(UInt_t i=0;i<nrow;i++){
766 for(Int_t d=0;d<200;d++) ddd[d]=0;
767 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
768 if(row_pt->fDigitData[dig].fPad <200){
769 ddd[row_pt->fDigitData[dig].fPad]++;
772 for(Int_t d=0;d<200;d++){
780 for(UShort_t pad=0;pad <= maxpad;pad++){
781 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
784 // write zero if time != 0
785 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
786 if(row_pt->fDigitData[digit].fTime>0){
791 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
793 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
794 if(row_pt->fDigitData[digit].fTime +1 !=
795 row_pt->fDigitData[digit+1].fTime){
806 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
807 sizeof(AliL3DigitRowData);
808 Byte_t *byte_pt =(Byte_t *) row_pt;
810 row_pt = (AliL3DigitRowData *) byte_pt;
814 return (index/3) * sizeof(UInt_t);
817 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
819 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
820 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
828 for(UInt_t i=0;i<nrow;i++){
830 Read(comp,index,subindex);
831 UShort_t npad = Read(comp,index,subindex);
832 for(UShort_t p=0;p<npad;p++){
833 Read(comp,index,subindex);
834 if(Test(comp,index,subindex)==0){
835 Read(comp,index,subindex);
836 if(Read(comp,index,subindex)== 0) continue;
839 while(Read(comp,index,subindex)!=0) ndigit++;
840 if(Read(comp,index,subindex)==0) break;
843 Int_t size = sizeof(AliL3DigitData) * ndigit+
844 sizeof(AliL3DigitRowData);
851 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
854 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
855 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
862 while(index<size-1){ //don't start with last word
865 Read(comp,index,subindex);
866 UShort_t npad = Read(comp,index,subindex);
867 for(UShort_t p=0;p<npad;p++){
868 Read(comp,index,subindex);
869 if(Test(comp,index,subindex)==0){
870 Read(comp,index,subindex);
871 if(Read(comp,index,subindex)==0)continue;
874 while(Read(comp,index,subindex)!=0) ndigit++;
875 if(Read(comp,index,subindex)==0) break;
879 if(index==size-1){ //last word
881 if(Read(comp,index,subindex)!=0) nrow++;
887 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
890 //Write the RLE data in comp to the output file.
893 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
894 <<"No Output File"<<ENDLOG;
898 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
899 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
903 size=GetMemorySize(nrow,comp);
905 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
906 <<"Memory size = 0 "<<ENDLOG;
909 UInt_t length = size/sizeof(UInt_t);
910 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
911 fwrite(comp,size,1,fOutBinary);
915 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
917 //Read the RLE data from file, and store it in comp. No unpacking yet.
920 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
921 <<"No Output File"<<ENDLOG;
925 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
926 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
931 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
932 UInt_t size = length*sizeof(UInt_t);
933 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
934 // now find the number of dig
935 nrow = GetNRow(comp,size);
939 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
941 // Read the RLE inputfile, unpack it and return the pointer to it.
943 AliL3MemHandler * handler = new AliL3MemHandler();
944 handler->SetBinaryInput(fInBinary);
945 UInt_t *comp =(UInt_t *)handler->Allocate();
946 handler->CompBinary2CompMemory(nrow,comp);
947 UInt_t size = GetMemorySize(nrow,comp);
948 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
949 CompMemory2Memory(nrow,data,comp);
955 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
957 //Perform RLE on the data, and write it to the output file.
959 AliL3MemHandler * handler = new AliL3MemHandler();
960 UInt_t size = GetCompMemorySize(nrow,data);
961 UInt_t *comp =(UInt_t *)handler->Allocate(size);
962 Memory2CompMemory(nrow,data,comp);
963 CompMemory2CompBinary(nrow,comp,size);
970 ///////////////////////////////////////// Point IO
971 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
973 //Writing spacepoints stored in data to the outputfile.
975 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
976 <<"No Output File"<<ENDLOG;
980 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
981 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
984 UInt_t size = npoint*sizeof(AliL3SpacePointData);
985 fwrite(data,size,1,fOutBinary);
990 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,Int_t slice)
992 //Transform the space points in data, to global coordinates in slice.
994 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
995 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
999 for(UInt_t i=0;i<npoint;i++){
1001 xyz[0] = data[i].fX;
1002 xyz[1] = data[i].fY;
1003 xyz[2] = data[i].fZ;
1004 AliL3Transform::Local2Global(xyz,slice);
1005 data[i].fX = xyz[0];
1006 data[i].fY = xyz[1];
1007 data[i].fZ = xyz[2];
1012 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1014 //Read the space points in inputfile, and store it in data.
1016 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1017 <<"No Input File"<<ENDLOG;
1021 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1022 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1026 Int_t size = GetFileSize();
1028 UInt_t size,slice,patch,row[2];
1029 AliL3EventDataTypeRoot datatype;
1031 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1032 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1033 <<"File Read Error "<<ENDLOG;
1036 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1037 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1038 <<"File Read Error "<<ENDLOG;
1041 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1042 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1043 <<"File Read Error "<<ENDLOG;
1046 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1047 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1048 <<"File Read Error "<<ENDLOG;
1051 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1052 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1053 <<"File Read Error "<<ENDLOG;
1056 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1057 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1058 <<"File Read Error "<<ENDLOG;
1062 npoint = size/sizeof(AliL3SpacePointData);
1063 if(fread(data,size,1,fInBinary)!=1){
1064 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1065 <<"File Read Error "<<ENDLOG;
1068 if(size%sizeof(AliL3SpacePointData)){
1069 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1070 <<"File Size wrong "<<ENDLOG;
1073 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1074 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1078 ///////////////////////////////////////// Track IO
1079 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1081 //Write the tracks stored in data, to outputfile.
1083 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1084 <<"No Output File"<<ENDLOG;
1088 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1089 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1092 AliL3TrackSegmentData *track_pt = data;
1093 for(UInt_t i=0;i<ntrack;i++){
1094 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1095 fwrite(track_pt,size,1,fOutBinary);
1096 Byte_t *byte_pt = (Byte_t*) track_pt;
1098 track_pt = (AliL3TrackSegmentData*) byte_pt;
1100 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1101 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1106 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1108 //Read the tracks in inputfile, and store it in data.
1111 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1112 <<"No Input File"<<ENDLOG;
1116 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1117 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1122 AliL3TrackSegmentData *track_pt = data;
1125 UInt_t size,slice,patch,row[2];
1126 AliL3EventDataTypeRoot datatype;
1128 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1129 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1130 <<"File Read Error "<<ENDLOG;
1133 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1134 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1135 <<"File Read Error "<<ENDLOG;
1138 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1139 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1140 <<"File Read Error "<<ENDLOG;
1143 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1144 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1145 <<"File Read Error "<<ENDLOG;
1148 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1149 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1150 <<"File Read Error "<<ENDLOG;
1153 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1154 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1155 <<"File Read Error "<<ENDLOG;
1159 while(!feof(fInBinary)){
1160 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1161 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1162 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1163 Byte_t *byte_pt = (Byte_t*) track_pt;
1164 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1165 track_pt = (AliL3TrackSegmentData*) byte_pt;
1168 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1169 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1173 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1175 //Write the trackarray to the outputfile.
1177 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1178 <<"No Output File"<<ENDLOG;
1182 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1183 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1186 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1189 TrackArray2Memory(ntrack,data,array);
1190 Memory2Binary(ntrack,data);
1195 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1197 //Read the tracks in inputfile, and fill it in trackarray.
1198 //array should already be constructed.
1200 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1201 <<"No Input File"<<ENDLOG;
1205 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1206 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1209 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1211 Binary2Memory(ntrack,data);
1212 Memory2TrackArray(ntrack,data,array);
1217 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1219 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1221 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1222 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1226 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1227 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1231 array->WriteTracks(ntrack,data);
1235 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1237 //Fill the tracks in data into trackarray.
1240 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1241 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1245 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1246 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1249 array->FillTracks(ntrack,data);
1253 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice)
1255 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1258 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1259 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1263 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1264 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1267 array->FillTracks(ntrack,data,slice);
1271 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1273 //Update the data pointer to the next padrow in memory.
1275 Byte_t *tmp = (Byte_t*)tempPt;
1276 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1278 tempPt = (AliL3DigitRowData*)tmp;