2 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
3 // -- Copyright © Uli
4 // changes done by Constantin Loizides <mailto:loizides@ikf.physik.uni-frankfurt.de>
13 #include "AliL3MemHandler.h"
14 #include "AliL3Transform.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(ndigits);
42 // for(int i=0; i<NumberOfRowsInPatch; 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.
78 ClassImp(AliL3MemHandler)
80 AliL3MemHandler::AliL3MemHandler()
98 Int_t row[2] = {0,175};
104 AliL3MemHandler::~AliL3MemHandler()
107 if(fPt) delete[] fPt;
108 if(fDigits) delete [] fDigits;
109 if(fDPt) delete [] fDPt;
112 void AliL3MemHandler::ResetROI()
114 //Resets the Look-up table for Region of Interest mode.
116 for(Int_t i=fRowMin; i<=fRowMax; i++)
118 fEtaMinTimeBin[i] = 0;
119 fEtaMaxTimeBin[i] = 445;
124 void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice)
126 // Init the Look-up table for the Region of Interest mode.
127 // Here you can specify a certain etaregion, - all data
128 // outside this region will be discarded:
129 // eta[0] = mimium eta
130 // eta[1] = maximum eta
131 // slice[0] = mimumum slice
132 // slice[1] = maximum slice
137 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values")
138 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
139 for(Int_t i=fRowMin; i<=fRowMax; i++)
147 for(Int_t i=fRowMin; i<=fRowMax; i++)
152 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
154 xyz[0] = fTransformer->Row2X(i);
156 xyz[2] = xyz[0]/tan(thetamax);
157 fTransformer->Slice2Sector(fSlice,i,sector,row);
158 fTransformer->Local2Raw(xyz,sector,row);
160 fEtaMinTimeBin[i] = (Int_t)xyz[2];
163 fEtaMaxTimeBin[i] = 445;
166 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
167 xyz[0] = fTransformer->Row2X(i);
168 xyz[1] = fTransformer->GetMaxY(i);
169 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
170 xyz[2] = radii/tan(thetamin);
171 fTransformer->Local2Raw(xyz,sector,row);
172 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
178 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
180 //Set the input binary file.
182 fInBinary = fopen(name,"r");
184 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
185 <<"Error opening file "<<name<<ENDLOG;
191 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
193 //Set the input binary file.
197 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
198 <<"Pointer to File = 0x0 "<<ENDLOG;
204 void AliL3MemHandler::CloseBinaryInput()
206 //Close the input file.
209 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
210 <<"Nothing to Close"<<ENDLOG;
217 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
219 //Set the binary output file.
220 fOutBinary = fopen(name,"w");
222 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
223 <<"Pointer to File = 0x0 "<<ENDLOG;
229 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
231 //Set the binary output file.
235 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
236 <<"Pointer to File = 0x0 "<<ENDLOG;
242 void AliL3MemHandler::CloseBinaryOutput()
245 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
246 <<"Nothing to Close"<<ENDLOG;
253 UInt_t AliL3MemHandler::GetFileSize()
255 //Returns the file size in bytes of the input file.
258 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
259 <<"No Input File"<<ENDLOG;
262 fseek(fInBinary,0,SEEK_END);
263 UInt_t size = (UInt_t) ftell(fInBinary);
268 Byte_t *AliL3MemHandler::Allocate()
270 return Allocate(GetFileSize());
273 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
275 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
278 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
279 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
282 return Allocate(array->GetOutSize());
285 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
287 //Allocate memory of size in bytes.
290 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
291 <<"Delete Memory"<<ENDLOG;
294 fPt = new Byte_t[size];
297 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
298 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
302 void AliL3MemHandler::Free()
304 //Clear the memory, if allocated.
307 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
308 <<"No Memory allocated - can't Free"<<ENDLOG;
316 ///////////////////////////////////////// Random
317 void AliL3MemHandler::SetRandomSeed()
319 //If you are adding random data to the original data.
321 SetRandomSeed(time(tp));
324 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
326 //If you are adding random data to the original data.
329 fNRandom = maxnumber;
331 if(fDigits) delete [] fDigits;
332 fDigits = new AliL3RandomDigitData[fNRandom*9];
333 if(fDPt) delete [] fDPt;
334 fDPt = new AliL3RandomDigitData *[fNRandom*9];
337 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last){
339 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
340 // Uses CompareDigits() to compare objects.
343 static AliL3RandomDigitData *tmp;
344 static int i; // "static" to save stack space
347 while (last - first > 1) {
351 while (++i < last && CompareDigits(a[i], a[first]) < 0)
353 while (--j > first && CompareDigits(a[j], a[first]) > 0)
370 if (j - first < last - (j + 1)) {
372 first = j + 1; // QSort(j + 1, last);
374 QSort(a, j + 1, last);
375 last = j; // QSort(first, j);
380 UInt_t AliL3MemHandler::GetRandomSize()
383 for(Int_t r=fRowMin;r<=fRowMax;r++){
384 Int_t npad=fTransformer->GetNPads(r);
385 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
387 return 9 * nrandom * sizeof(AliL3DigitData);
390 void AliL3MemHandler::Generate(Int_t row)
392 //Generate random data on row, if you didn't ask for this, nothing happens here.
394 if(!IsRandom) return;
397 Int_t npad=fTransformer->GetNPads(row);
398 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
399 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
400 (Double_t) ntime/(Double_t) fTransformer->GetNTimeBins() );
402 for(Int_t n=0;n<nrandom;n++){
403 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
404 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
405 Int_t charge = (int)((float)rand()/RAND_MAX*1023);
406 DigitizePoint(row,pad,time,charge);
408 QSort(fDPt,0,fNDigits);
409 // for(Int_t d=0;d<fNDigits;d++)
410 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
411 // fDPt[d]->fTime,fDPt[d]->fCharge);
415 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
416 Int_t time,Int_t charge)
418 //Making one single random cluster.
419 for(Int_t j=-1;j<2;j++){
420 for(Int_t k=-1;k<2;k++){
421 Int_t dcharge = charge;
424 if(dcharge<10) continue;
425 Int_t dpad = j + pad;
426 Int_t dtime = k + time;
428 if(dpad<0||dpad>=fTransformer->GetNPads(row)) continue;
429 if(dtime<0||dtime>=fTransformer->GetNTimeBins()) continue;
431 fDigits[fNDigits].fCharge = dcharge;
432 fDigits[fNDigits].fRow = row;
433 fDigits[fNDigits].fPad = dpad;
434 fDigits[fNDigits].fTime = dtime;
435 fDPt[fNDigits] = &fDigits[fNDigits];
441 ///////////////////////////////////////// Digit IO
442 Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
444 //Write data to the outputfile as is. No run-length encoding is done.
447 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
448 <<"No Output File"<<ENDLOG;
452 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
453 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
457 AliL3DigitRowData *row_pt = data;
459 for(UInt_t i=0;i<nrow;i++){
460 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
461 + sizeof(AliL3DigitRowData);
463 fwrite(row_pt,size,1,fOutBinary);
464 Byte_t *byte_pt =(Byte_t *) row_pt;
466 row_pt = (AliL3DigitRowData *) byte_pt;
468 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
469 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
470 <<nrow<<" Rows)"<<ENDLOG;
474 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
476 //Read inputfile into memory as is, and store it in data. No run-length encoding
480 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
481 <<"No Input File"<<ENDLOG;
485 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
486 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
490 AliL3DigitRowData *row_pt = data;
493 while(!feof(fInBinary)){
494 Byte_t *byte_pt =(Byte_t *) row_pt;
496 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
497 byte_pt += sizeof(AliL3DigitRowData);
498 outsize += sizeof(AliL3DigitRowData);
500 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
502 if(fread(byte_pt,size,1,fInBinary)!=1) break;
506 row_pt = (AliL3DigitRowData *) byte_pt;
510 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
511 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
512 <<rowcount<<" Rows)"<<ENDLOG;
516 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
517 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
519 data[ndata].fPad = pad;
520 data[ndata].fTime = time;
521 data[ndata].fCharge = charge;
525 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
527 data[ndata].fPad = fDPt[fNUsed]->fPad;
528 data[ndata].fTime = fDPt[fNUsed]->fTime;
529 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
534 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
535 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
537 data[ndata].fPad = pad;
538 data[ndata].fTime = time;
539 data[ndata].fCharge = charge;
540 while(ComparePoints(row,pad,time)==0){
541 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
542 if(charge>1023) ch = 1023;
543 data[ndata].fCharge = ch;
549 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
550 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
553 while((action=ComparePoints(row,pad,time))==1){
554 AddRandom(data,ndata);
557 MergeDataRandom(data,ndata,row,pad,time,charge);
560 AddData(data,ndata,row,pad,time,charge);
564 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
565 UInt_t & subindex, UShort_t value)
567 UInt_t shift[3] = {0,10,20};
568 if(subindex==0) comp[index] =0; //clean up memory
569 comp[index] |= (value&0x03ff)<<shift[subindex];
577 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
579 UInt_t shift[3] = {0,10,20};
580 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
590 UShort_t AliL3MemHandler::Test(UInt_t *comp,
591 UInt_t index, UInt_t subindex)
593 UInt_t shift[3] = {0,10,20};
594 return (comp[index]>>shift[subindex])&0x03ff;
597 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
598 AliL3DigitRowData *data,UInt_t *comp)
600 //Performs run-length encoding on data stored in memory pointed to by data.
601 //The compressed data is written to comp.
603 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
604 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
608 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
609 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
612 AliL3DigitRowData *row_pt = data;
616 for(UInt_t i=0;i<nrow;i++){
617 UShort_t value = row_pt->fRow;
618 Write(comp,index,subindex,value);
622 for(Int_t d=0;d<200;d++) ddd[d]=0;
623 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
624 if(row_pt->fDigitData[dig].fPad <200){
625 ddd[row_pt->fDigitData[dig].fPad]++;
628 for(Int_t d=0;d<200;d++){
634 Write(comp,index,subindex,npad);
636 for(UShort_t pad=0;pad <= maxpad;pad++){
637 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
639 Write(comp,index,subindex,pad);
640 // write zero if time != 0
641 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
642 if(row_pt->fDigitData[digit].fTime>0){
643 Write(comp,index,subindex,0);
644 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
647 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
648 UShort_t charge = row_pt->fDigitData[digit].fCharge;
652 Write(comp,index,subindex,charge);
653 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
654 if(row_pt->fDigitData[digit].fTime +1 !=
655 row_pt->fDigitData[digit+1].fTime){
656 Write(comp,index,subindex,0);
657 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
658 (row_pt->fDigitData[digit].fTime +1);
659 Write(comp,index,subindex,nzero);
664 Write(comp,index,subindex,0);
665 Write(comp,index,subindex,0);
668 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
669 sizeof(AliL3DigitRowData);
670 Byte_t *byte_pt =(Byte_t *) row_pt;
672 row_pt = (AliL3DigitRowData *) byte_pt;
675 Write(comp,index,subindex,0);
676 return index * sizeof(UInt_t);
679 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
680 AliL3DigitRowData *data,UInt_t *comp)
682 //Uncompress the run-length encoded data in memory pointed to by comp, and
686 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
687 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
691 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
692 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
697 AliL3DigitRowData *row_pt = data;
701 for(UInt_t i=0;i<nrow;i++){
703 UInt_t row =Read(comp,index,subindex);
706 UShort_t npad = Read(comp,index,subindex);
707 for(UShort_t p=0;p<npad;p++){
710 UShort_t pad = Read(comp,index,subindex);
711 if(Test(comp,index,subindex)==0){
712 Read(comp,index,subindex);
713 if( (time = Read(comp,index,subindex)) == 0 ){
718 while( (charge=Read(comp,index,subindex)) != 0){
719 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
720 // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
721 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
724 UShort_t tshift = Read(comp,index,subindex);
725 if(tshift ==0) break;
729 row_pt->fNDigit = ndigit;
730 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
731 sizeof(AliL3DigitRowData);
732 Byte_t *byte_pt =(Byte_t *) row_pt;
735 row_pt = (AliL3DigitRowData *) byte_pt;
740 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
742 //Return the size of RLE data, after compressing data.
745 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
746 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
749 AliL3DigitRowData *row_pt = data;
752 for(UInt_t i=0;i<nrow;i++){
757 for(Int_t d=0;d<200;d++) ddd[d]=0;
758 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
759 if(row_pt->fDigitData[dig].fPad <200){
760 ddd[row_pt->fDigitData[dig].fPad]++;
763 for(Int_t d=0;d<200;d++){
771 for(UShort_t pad=0;pad <= maxpad;pad++){
772 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
775 // write zero if time != 0
776 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
777 if(row_pt->fDigitData[digit].fTime>0){
782 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
784 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
785 if(row_pt->fDigitData[digit].fTime +1 !=
786 row_pt->fDigitData[digit+1].fTime){
797 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
798 sizeof(AliL3DigitRowData);
799 Byte_t *byte_pt =(Byte_t *) row_pt;
801 row_pt = (AliL3DigitRowData *) byte_pt;
805 return (index/3) * sizeof(UInt_t);
808 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
810 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
811 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
819 for(UInt_t i=0;i<nrow;i++){
821 Read(comp,index,subindex);
822 UShort_t npad = Read(comp,index,subindex);
823 for(UShort_t p=0;p<npad;p++){
824 Read(comp,index,subindex);
825 if(Test(comp,index,subindex)==0){
826 Read(comp,index,subindex);
827 if(Read(comp,index,subindex)== 0) continue;
830 while(Read(comp,index,subindex)!=0) ndigit++;
831 if(Read(comp,index,subindex)==0) break;
834 Int_t size = sizeof(AliL3DigitData) * ndigit+
835 sizeof(AliL3DigitRowData);
842 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
845 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
846 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
853 while(index<size-1){ //don't start with last word
856 Read(comp,index,subindex);
857 UShort_t npad = Read(comp,index,subindex);
858 for(UShort_t p=0;p<npad;p++){
859 Read(comp,index,subindex);
860 if(Test(comp,index,subindex)==0){
861 Read(comp,index,subindex);
862 if(Read(comp,index,subindex)==0)continue;
865 while(Read(comp,index,subindex)!=0) ndigit++;
866 if(Read(comp,index,subindex)==0) break;
870 if(index==size-1){ //last word
872 if(Read(comp,index,subindex)!=0) nrow++;
878 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
881 //Write the RLE data in comp to the output file.
884 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
885 <<"No Output File"<<ENDLOG;
889 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
890 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
894 size=GetMemorySize(nrow,comp);
896 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
897 <<"Memory size = 0 "<<ENDLOG;
900 UInt_t length = size/sizeof(UInt_t);
901 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
902 fwrite(comp,size,1,fOutBinary);
906 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
908 //Read the RLE data from file, and store it in comp. No unpacking yet.
911 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
912 <<"No Output File"<<ENDLOG;
916 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
917 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
922 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
923 UInt_t size = length*sizeof(UInt_t);
924 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
925 // now find the number of dig
926 nrow = GetNRow(comp,size);
930 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
932 // Read the RLE inputfile, unpack it and return the pointer to it.
934 AliL3MemHandler * handler = new AliL3MemHandler();
935 handler->SetBinaryInput(fInBinary);
936 UInt_t *comp =(UInt_t *)handler->Allocate();
937 handler->CompBinary2CompMemory(nrow,comp);
938 UInt_t size = GetMemorySize(nrow,comp);
939 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
940 CompMemory2Memory(nrow,data,comp);
946 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
948 //Perform RLE on the data, and write it to the output file.
950 AliL3MemHandler * handler = new AliL3MemHandler();
951 UInt_t size = GetCompMemorySize(nrow,data);
952 UInt_t *comp =(UInt_t *)handler->Allocate(size);
953 Memory2CompMemory(nrow,data,comp);
954 CompMemory2CompBinary(nrow,comp,size);
961 ///////////////////////////////////////// Point IO
962 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
964 //Writing spacepoints stored in data to the outputfile.
966 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
967 <<"No Output File"<<ENDLOG;
971 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
972 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
975 UInt_t size = npoint*sizeof(AliL3SpacePointData);
976 fwrite(data,size,1,fOutBinary);
981 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,Int_t slice)
983 //Transform the space points in data, to global coordinates in slice.
985 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
986 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
990 LOG(AliL3Log::kError,"AliL3MemHandler::Transform","Object")
991 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
994 for(UInt_t i=0;i<npoint;i++){
999 fTransformer->Local2Global(xyz,slice);
1000 data[i].fX = xyz[0];
1001 data[i].fY = xyz[1];
1002 data[i].fZ = xyz[2];
1007 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1009 //Read the space points in inputfile, and store it in data.
1011 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1012 <<"No Input File"<<ENDLOG;
1016 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1017 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1021 Int_t size = GetFileSize();
1023 UInt_t size,slice,patch,row[2];
1024 AliL3EventDataTypeRoot datatype;
1026 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1027 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1028 <<"File Read Error "<<ENDLOG;
1031 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1032 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1033 <<"File Read Error "<<ENDLOG;
1036 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1037 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1038 <<"File Read Error "<<ENDLOG;
1041 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1042 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1043 <<"File Read Error "<<ENDLOG;
1046 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1047 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1048 <<"File Read Error "<<ENDLOG;
1051 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1052 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1053 <<"File Read Error "<<ENDLOG;
1057 npoint = size/sizeof(AliL3SpacePointData);
1058 if(fread(data,size,1,fInBinary)!=1){
1059 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1060 <<"File Read Error "<<ENDLOG;
1063 if(size%sizeof(AliL3SpacePointData)){
1064 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1065 <<"File Size wrong "<<ENDLOG;
1068 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1069 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1073 ///////////////////////////////////////// Track IO
1074 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1076 //Write the tracks stored in data, to outputfile.
1078 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1079 <<"No Output File"<<ENDLOG;
1083 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1084 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1087 AliL3TrackSegmentData *track_pt = data;
1088 for(UInt_t i=0;i<ntrack;i++){
1089 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1090 fwrite(track_pt,size,1,fOutBinary);
1091 Byte_t *byte_pt = (Byte_t*) track_pt;
1093 track_pt = (AliL3TrackSegmentData*) byte_pt;
1095 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1096 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1101 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1103 //Read the tracks in inputfile, and store it in data.
1106 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1107 <<"No Input File"<<ENDLOG;
1111 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1112 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1117 AliL3TrackSegmentData *track_pt = data;
1120 UInt_t size,slice,patch,row[2];
1121 AliL3EventDataTypeRoot datatype;
1123 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1124 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1125 <<"File Read Error "<<ENDLOG;
1128 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1129 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1130 <<"File Read Error "<<ENDLOG;
1133 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1134 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1135 <<"File Read Error "<<ENDLOG;
1138 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1139 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1140 <<"File Read Error "<<ENDLOG;
1143 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1144 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1145 <<"File Read Error "<<ENDLOG;
1148 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1149 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1150 <<"File Read Error "<<ENDLOG;
1154 while(!feof(fInBinary)){
1155 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1156 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1157 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1158 Byte_t *byte_pt = (Byte_t*) track_pt;
1159 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1160 track_pt = (AliL3TrackSegmentData*) byte_pt;
1163 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1164 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1168 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1170 //Write the trackarray to the outputfile.
1172 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1173 <<"No Output File"<<ENDLOG;
1177 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1178 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1181 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1183 TrackArray2Memory(ntrack,data,array);
1184 Memory2Binary(ntrack,data);
1189 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1191 //Read the tracks in inputfile, and fill it in trackarray.
1192 //array should already be constructed.
1194 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1195 <<"No Input File"<<ENDLOG;
1199 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1200 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1203 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1205 Binary2Memory(ntrack,data);
1206 Memory2TrackArray(ntrack,data,array);
1211 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1213 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1215 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1216 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1220 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1221 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1224 array->WriteTracks(ntrack,data);
1228 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1230 //Fill the tracks in data into trackarray.
1233 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1234 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1238 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1239 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1242 array->FillTracks(ntrack,data);
1246 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice)
1248 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1251 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1252 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1256 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1257 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1261 LOG(AliL3Log::kError,"AliL3MemHandler::Memory2TrackArray","Object")
1262 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
1265 array->FillTracks(ntrack,data,slice,fTransformer);
1269 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1271 //Update the data pointer to the next padrow in memory.
1273 Byte_t *tmp = (Byte_t*)tempPt;
1274 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1276 tempPt = (AliL3DigitRowData*)tmp;