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
23 // _____________________________________________________________
26 // The L3 Binary File handler
29 // This class does all the memory I/O handling on raw binary files.
30 // For the moment the compressed binary files are run-length encoded, using
35 // 1) Reading a binary file:
37 // AliL3MemHandler file;
38 // file.SetBinaryInput(filename);
41 // AliL3DigitRowData *data = file.CompBinary2Memory(ndigits);
43 // for(int i=0; i<NumberOfRowsInPatch; i++)
46 // AliL3DigitData *dataPt = (AliL3DigitData*)data->fDigitData;
47 // for(int j=0; j<data->fNDigit; j++)
49 // pad = dataPt[j].fPad;
50 // time = dataPt[j].fTime;
51 // charge = dataPt[j].fCharge;
54 // file.UpdateRowPointer(data);
57 // file.CloseBinaryInput();
58 // ________________________
60 // 2) Writing a binary file:
62 // //First of all you need to store the data in memory,
63 // //and have a pointer to it of type AliL3DigitRowData.
64 // //E.g. if you just want to write the data you read in example 1)
65 // //into a new file, you can do the following:
67 // AliL3MemHandler newfile;
68 // newfile.SetBinaryOutput(newfilename);
69 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
70 // newfile.CloseBinaryOutput();
73 ClassImp(AliL3MemHandler)
75 AliL3MemHandler::AliL3MemHandler()
93 Int_t row[2] = {0,175};
99 AliL3MemHandler::~AliL3MemHandler()
102 if(fPt) delete[] fPt;
103 if(fDigits) delete [] fDigits;
104 if(fDPt) delete [] fDPt;
107 void AliL3MemHandler::ResetROI()
109 //Resets the Look-up table for Region of Interest mode.
111 for(Int_t i=fRowMin; i<=fRowMax; i++)
113 fEtaMinTimeBin[i] = 0;
114 fEtaMaxTimeBin[i] = 445;
119 void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice)
121 // Init the Look-up table for the Region of Interest mode.
122 // Here you can specify a certain etaregion, - all data
123 // outside this region will be discarded:
124 // eta[0] = mimium eta
125 // eta[1] = maximum eta
126 // slice[0] = mimumum slice
127 // slice[1] = maximum slice
132 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values")
133 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
134 for(Int_t i=fRowMin; i<=fRowMax; i++)
142 for(Int_t i=fRowMin; i<=fRowMax; i++)
147 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
149 xyz[0] = fTransformer->Row2X(i);
151 xyz[2] = xyz[0]/tan(thetamax);
152 fTransformer->Slice2Sector(fSlice,i,sector,row);
153 fTransformer->Local2Raw(xyz,sector,row);
155 fEtaMinTimeBin[i] = (Int_t)xyz[2];
158 fEtaMaxTimeBin[i] = 445;
161 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
162 xyz[0] = fTransformer->Row2X(i);
163 xyz[1] = fTransformer->GetMaxY(i);
164 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
165 xyz[2] = radii/tan(thetamin);
166 fTransformer->Local2Raw(xyz,sector,row);
167 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
173 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
175 //Set the input binary file.
177 fInBinary = fopen(name,"r");
179 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
180 <<"Error opening file "<<name<<ENDLOG;
186 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
188 //Set the input binary file.
192 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
193 <<"Pointer to File = 0x0 "<<ENDLOG;
199 void AliL3MemHandler::CloseBinaryInput()
201 //Close the input file.
204 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
205 <<"Nothing to Close"<<ENDLOG;
212 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
214 //Set the binary output file.
215 fOutBinary = fopen(name,"w");
217 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
218 <<"Pointer to File = 0x0 "<<ENDLOG;
224 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
226 //Set the binary output file.
230 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
231 <<"Pointer to File = 0x0 "<<ENDLOG;
237 void AliL3MemHandler::CloseBinaryOutput()
240 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
241 <<"Nothing to Close"<<ENDLOG;
248 UInt_t AliL3MemHandler::GetFileSize()
250 //Returns the file size in bytes of the input file.
253 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
254 <<"No Input File"<<ENDLOG;
257 fseek(fInBinary,0,SEEK_END);
258 UInt_t size = (UInt_t) ftell(fInBinary);
263 Byte_t *AliL3MemHandler::Allocate()
265 return Allocate(GetFileSize());
268 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
270 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
273 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
274 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
277 return Allocate(array->GetOutSize());
280 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
282 //Allocate memory of size in bytes.
285 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
286 <<"Delete Memory"<<ENDLOG;
289 fPt = new Byte_t[size];
292 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
293 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
297 void AliL3MemHandler::Free()
299 //Clear the memory, if allocated.
302 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
303 <<"No Memory allocated - can't Free"<<ENDLOG;
311 ///////////////////////////////////////// Random
312 void AliL3MemHandler::SetRandomSeed()
314 //If you are adding random data to the original data.
316 SetRandomSeed(time(tp));
319 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
321 //If you are adding random data to the original data.
324 fNRandom = maxnumber;
326 if(fDigits) delete [] fDigits;
327 fDigits = new AliL3RandomDigitData[fNRandom*9];
328 if(fDPt) delete [] fDPt;
329 fDPt = new AliL3RandomDigitData *[fNRandom*9];
332 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last){
334 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
335 // Uses CompareDigits() to compare objects.
338 static AliL3RandomDigitData *tmp;
339 static int i; // "static" to save stack space
342 while (last - first > 1) {
346 while (++i < last && CompareDigits(a[i], a[first]) < 0)
348 while (--j > first && CompareDigits(a[j], a[first]) > 0)
365 if (j - first < last - (j + 1)) {
367 first = j + 1; // QSort(j + 1, last);
369 QSort(a, j + 1, last);
370 last = j; // QSort(first, j);
375 UInt_t AliL3MemHandler::GetRandomSize()
378 for(Int_t r=fRowMin;r<=fRowMax;r++){
379 Int_t npad=fTransformer->GetNPads(r);
380 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
382 return 9 * nrandom * sizeof(AliL3DigitData);
385 void AliL3MemHandler::Generate(Int_t row)
387 //Generate random data on row, if you didn't ask for this, nothing happens here.
389 if(!IsRandom) return;
392 Int_t npad=fTransformer->GetNPads(row);
393 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
394 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
395 (Double_t) ntime/(Double_t) fTransformer->GetNTimeBins() );
397 for(Int_t n=0;n<nrandom;n++){
398 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
399 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
400 Int_t charge = (int)((float)rand()/RAND_MAX*1023);
401 DigitizePoint(row,pad,time,charge);
403 QSort(fDPt,0,fNDigits);
404 // for(Int_t d=0;d<fNDigits;d++)
405 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
406 // fDPt[d]->fTime,fDPt[d]->fCharge);
410 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
411 Int_t time,Int_t charge)
413 //Making one single random cluster.
414 for(Int_t j=-1;j<2;j++){
415 for(Int_t k=-1;k<2;k++){
416 Int_t dcharge = charge;
419 if(dcharge<10) continue;
420 Int_t dpad = j + pad;
421 Int_t dtime = k + time;
423 if(dpad<0||dpad>=fTransformer->GetNPads(row)) continue;
424 if(dtime<0||dtime>=fTransformer->GetNTimeBins()) continue;
426 fDigits[fNDigits].fCharge = dcharge;
427 fDigits[fNDigits].fRow = row;
428 fDigits[fNDigits].fPad = dpad;
429 fDigits[fNDigits].fTime = dtime;
430 fDPt[fNDigits] = &fDigits[fNDigits];
436 ///////////////////////////////////////// Digit IO
437 Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
439 //Write data to the outputfile as is. No run-length encoding is done.
442 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
443 <<"No Output File"<<ENDLOG;
447 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
448 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
452 AliL3DigitRowData *row_pt = data;
454 for(UInt_t i=0;i<nrow;i++){
455 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
456 + sizeof(AliL3DigitRowData);
458 fwrite(row_pt,size,1,fOutBinary);
459 Byte_t *byte_pt =(Byte_t *) row_pt;
461 row_pt = (AliL3DigitRowData *) byte_pt;
463 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
464 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
465 <<nrow<<" Rows)"<<ENDLOG;
469 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
471 //Read inputfile into memory as is, and store it in data. No run-length encoding
475 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
476 <<"No Input File"<<ENDLOG;
480 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
481 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
485 AliL3DigitRowData *row_pt = data;
488 while(!feof(fInBinary)){
489 Byte_t *byte_pt =(Byte_t *) row_pt;
491 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
492 byte_pt += sizeof(AliL3DigitRowData);
493 outsize += sizeof(AliL3DigitRowData);
495 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
497 if(fread(byte_pt,size,1,fInBinary)!=1) break;
501 row_pt = (AliL3DigitRowData *) byte_pt;
505 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
506 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
507 <<rowcount<<" Rows)"<<ENDLOG;
511 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
512 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
514 data[ndata].fPad = pad;
515 data[ndata].fTime = time;
516 data[ndata].fCharge = charge;
520 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
522 data[ndata].fPad = fDPt[fNUsed]->fPad;
523 data[ndata].fTime = fDPt[fNUsed]->fTime;
524 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
529 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
530 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
532 data[ndata].fPad = pad;
533 data[ndata].fTime = time;
534 data[ndata].fCharge = charge;
535 while(ComparePoints(row,pad,time)==0){
536 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
537 if(charge>1023) ch = 1023;
538 data[ndata].fCharge = ch;
544 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
545 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
548 while((action=ComparePoints(row,pad,time))==1){
549 AddRandom(data,ndata);
552 MergeDataRandom(data,ndata,row,pad,time,charge);
555 AddData(data,ndata,row,pad,time,charge);
559 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
560 UInt_t & subindex, UShort_t value)
562 UInt_t shift[3] = {0,10,20};
563 if(subindex==0) comp[index] =0; //clean up memory
564 comp[index] |= (value&0x03ff)<<shift[subindex];
572 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
574 UInt_t shift[3] = {0,10,20};
575 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
585 UShort_t AliL3MemHandler::Test(UInt_t *comp,
586 UInt_t index, UInt_t subindex)
588 UInt_t shift[3] = {0,10,20};
589 return (comp[index]>>shift[subindex])&0x03ff;
592 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
593 AliL3DigitRowData *data,UInt_t *comp)
595 //Performs run-length encoding on data stored in memory pointed to by data.
596 //The compressed data is written to comp.
598 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
599 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
603 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
604 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
607 AliL3DigitRowData *row_pt = data;
611 for(UInt_t i=0;i<nrow;i++){
612 UShort_t value = row_pt->fRow;
613 Write(comp,index,subindex,value);
617 for(Int_t d=0;d<200;d++) ddd[d]=0;
618 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
619 if(row_pt->fDigitData[dig].fPad <200){
620 ddd[row_pt->fDigitData[dig].fPad]++;
623 for(Int_t d=0;d<200;d++){
629 Write(comp,index,subindex,npad);
631 for(UShort_t pad=0;pad <= maxpad;pad++){
632 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
634 Write(comp,index,subindex,pad);
635 // write zero if time != 0
636 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
637 if(row_pt->fDigitData[digit].fTime>0){
638 Write(comp,index,subindex,0);
639 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
642 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
643 UShort_t charge = row_pt->fDigitData[digit].fCharge;
647 Write(comp,index,subindex,charge);
648 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
649 if(row_pt->fDigitData[digit].fTime +1 !=
650 row_pt->fDigitData[digit+1].fTime){
651 Write(comp,index,subindex,0);
652 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
653 (row_pt->fDigitData[digit].fTime +1);
654 Write(comp,index,subindex,nzero);
659 Write(comp,index,subindex,0);
660 Write(comp,index,subindex,0);
663 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
664 sizeof(AliL3DigitRowData);
665 Byte_t *byte_pt =(Byte_t *) row_pt;
667 row_pt = (AliL3DigitRowData *) byte_pt;
670 Write(comp,index,subindex,0);
671 return index * sizeof(UInt_t);
674 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
675 AliL3DigitRowData *data,UInt_t *comp)
677 //Uncompress the run-length encoded data in memory pointed to by comp, and
681 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
682 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
686 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
687 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
692 AliL3DigitRowData *row_pt = data;
696 for(UInt_t i=0;i<nrow;i++){
698 UInt_t row =Read(comp,index,subindex);
701 UShort_t npad = Read(comp,index,subindex);
702 for(UShort_t p=0;p<npad;p++){
705 UShort_t pad = Read(comp,index,subindex);
706 if(Test(comp,index,subindex)==0){
707 Read(comp,index,subindex);
708 if( (time = Read(comp,index,subindex)) == 0 ){
713 while( (charge=Read(comp,index,subindex)) != 0){
714 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
715 // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
716 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
719 UShort_t tshift = Read(comp,index,subindex);
720 if(tshift ==0) break;
724 row_pt->fNDigit = ndigit;
725 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
726 sizeof(AliL3DigitRowData);
727 Byte_t *byte_pt =(Byte_t *) row_pt;
730 row_pt = (AliL3DigitRowData *) byte_pt;
735 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
737 //Return the size of RLE data, after compressing data.
740 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
741 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
744 AliL3DigitRowData *row_pt = data;
747 for(UInt_t i=0;i<nrow;i++){
752 for(Int_t d=0;d<200;d++) ddd[d]=0;
753 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
754 if(row_pt->fDigitData[dig].fPad <200){
755 ddd[row_pt->fDigitData[dig].fPad]++;
758 for(Int_t d=0;d<200;d++){
766 for(UShort_t pad=0;pad <= maxpad;pad++){
767 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
770 // write zero if time != 0
771 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
772 if(row_pt->fDigitData[digit].fTime>0){
777 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
779 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
780 if(row_pt->fDigitData[digit].fTime +1 !=
781 row_pt->fDigitData[digit+1].fTime){
792 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
793 sizeof(AliL3DigitRowData);
794 Byte_t *byte_pt =(Byte_t *) row_pt;
796 row_pt = (AliL3DigitRowData *) byte_pt;
800 return (index/3) * sizeof(UInt_t);
803 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
805 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
806 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
814 for(UInt_t i=0;i<nrow;i++){
816 Read(comp,index,subindex);
817 UShort_t npad = Read(comp,index,subindex);
818 for(UShort_t p=0;p<npad;p++){
819 Read(comp,index,subindex);
820 if(Test(comp,index,subindex)==0){
821 Read(comp,index,subindex);
822 if(Read(comp,index,subindex)== 0) continue;
825 while(Read(comp,index,subindex)!=0) ndigit++;
826 if(Read(comp,index,subindex)==0) break;
829 Int_t size = sizeof(AliL3DigitData) * ndigit+
830 sizeof(AliL3DigitRowData);
837 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
840 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
841 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
848 while(index<size-1){ //don't start with last word
851 Read(comp,index,subindex);
852 UShort_t npad = Read(comp,index,subindex);
853 for(UShort_t p=0;p<npad;p++){
854 Read(comp,index,subindex);
855 if(Test(comp,index,subindex)==0){
856 Read(comp,index,subindex);
857 if(Read(comp,index,subindex)==0)continue;
860 while(Read(comp,index,subindex)!=0) ndigit++;
861 if(Read(comp,index,subindex)==0) break;
865 if(index==size-1){ //last word
867 if(Read(comp,index,subindex)!=0) nrow++;
873 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
876 //Write the RLE data in comp to the output file.
879 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
880 <<"No Output File"<<ENDLOG;
884 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
885 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
889 size=GetMemorySize(nrow,comp);
891 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
892 <<"Memory size = 0 "<<ENDLOG;
895 UInt_t length = size/sizeof(UInt_t);
896 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
897 fwrite(comp,size,1,fOutBinary);
901 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
903 //Read the RLE data from file, and store it in comp. No unpacking yet.
906 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
907 <<"No Output File"<<ENDLOG;
911 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
912 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
917 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
918 UInt_t size = length*sizeof(UInt_t);
919 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
920 // now find the number of dig
921 nrow = GetNRow(comp,size);
925 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
927 // Read the RLE inputfile, unpack it and return the pointer to it.
929 AliL3MemHandler * handler = new AliL3MemHandler();
930 handler->SetBinaryInput(fInBinary);
931 UInt_t *comp =(UInt_t *)handler->Allocate();
932 handler->CompBinary2CompMemory(nrow,comp);
933 UInt_t size = GetMemorySize(nrow,comp);
934 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
935 CompMemory2Memory(nrow,data,comp);
941 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
943 //Perform RLE on the data, and write it to the output file.
945 AliL3MemHandler * handler = new AliL3MemHandler();
946 UInt_t size = GetCompMemorySize(nrow,data);
947 UInt_t *comp =(UInt_t *)handler->Allocate(size);
948 Memory2CompMemory(nrow,data,comp);
949 CompMemory2CompBinary(nrow,comp,size);
956 ///////////////////////////////////////// Point IO
957 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
959 //Writing spacepoints stored in data to the outputfile.
961 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
962 <<"No Output File"<<ENDLOG;
966 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
967 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
970 UInt_t size = npoint*sizeof(AliL3SpacePointData);
971 fwrite(data,size,1,fOutBinary);
976 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,
977 Int_t slice, AliL3Transform* trans)
979 //Transform the space points in data, to global coordinates in slice.
981 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
982 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
986 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Object")
987 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
990 for(UInt_t i=0;i<npoint;i++){
995 trans->Local2Global(xyz,slice);
1003 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1005 //Read the space points in inputfile, and store it in data.
1007 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1008 <<"No Input File"<<ENDLOG;
1012 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1013 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1017 Int_t size = GetFileSize();
1019 UInt_t size,slice,patch,row[2];
1020 AliL3EventDataTypeRoot datatype;
1022 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1023 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1024 <<"File Read Error "<<ENDLOG;
1027 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1028 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1029 <<"File Read Error "<<ENDLOG;
1032 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1033 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1034 <<"File Read Error "<<ENDLOG;
1037 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1038 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1039 <<"File Read Error "<<ENDLOG;
1042 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1043 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1044 <<"File Read Error "<<ENDLOG;
1047 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1048 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1049 <<"File Read Error "<<ENDLOG;
1053 npoint = size/sizeof(AliL3SpacePointData);
1054 if(fread(data,size,1,fInBinary)!=1){
1055 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1056 <<"File Read Error "<<ENDLOG;
1059 if(size%sizeof(AliL3SpacePointData)){
1060 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1061 <<"File Size wrong "<<ENDLOG;
1064 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1065 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1069 ///////////////////////////////////////// Track IO
1070 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1072 //Write the tracks stored in data, to outputfile.
1074 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1075 <<"No Output File"<<ENDLOG;
1079 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1080 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1083 AliL3TrackSegmentData *track_pt = data;
1084 for(UInt_t i=0;i<ntrack;i++){
1085 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1086 fwrite(track_pt,size,1,fOutBinary);
1087 Byte_t *byte_pt = (Byte_t*) track_pt;
1089 track_pt = (AliL3TrackSegmentData*) byte_pt;
1091 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1092 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1097 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1099 //Read the tracks in inputfile, and store it in data.
1102 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1103 <<"No Input File"<<ENDLOG;
1107 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1108 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1113 AliL3TrackSegmentData *track_pt = data;
1116 UInt_t size,slice,patch,row[2];
1117 AliL3EventDataTypeRoot datatype;
1119 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1120 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1121 <<"File Read Error "<<ENDLOG;
1124 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1125 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1126 <<"File Read Error "<<ENDLOG;
1129 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1130 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1131 <<"File Read Error "<<ENDLOG;
1134 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1135 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1136 <<"File Read Error "<<ENDLOG;
1139 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1140 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1141 <<"File Read Error "<<ENDLOG;
1144 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1145 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1146 <<"File Read Error "<<ENDLOG;
1150 while(!feof(fInBinary)){
1151 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1152 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1153 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1154 Byte_t *byte_pt = (Byte_t*) track_pt;
1155 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1156 track_pt = (AliL3TrackSegmentData*) byte_pt;
1159 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1160 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1164 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1166 //Write the trackarray to the outputfile.
1168 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1169 <<"No Output File"<<ENDLOG;
1173 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1174 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1177 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1179 TrackArray2Memory(ntrack,data,array);
1180 Memory2Binary(ntrack,data);
1185 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1187 //Read the tracks in inputfile, and fill it in trackarray.
1188 //array should already be constructed.
1190 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1191 <<"No Input File"<<ENDLOG;
1195 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1196 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1199 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1201 Binary2Memory(ntrack,data);
1202 Memory2TrackArray(ntrack,data,array);
1207 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1209 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1211 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1212 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1216 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1217 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1220 array->WriteTracks(ntrack,data);
1224 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1226 //Fill the tracks in data into trackarray.
1229 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1230 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1234 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1235 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1238 array->FillTracks(ntrack,data);
1242 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice,
1243 AliL3Transform* trans)
1245 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1248 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1249 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1253 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1254 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1258 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Object")
1259 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
1262 array->FillTracks(ntrack,data,slice,trans);
1266 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1268 //Update the data pointer to the next padrow in memory.
1270 Byte_t *tmp = (Byte_t*)tempPt;
1271 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1273 tempPt = (AliL3DigitRowData*)tmp;