1 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
2 //*-- Copyright © Uli
10 #include "AliL3MemHandler.h"
11 #include "AliL3Transform.h"
12 #include "AliL3Logging.h"
14 #include "AliL3DigitData.h"
15 #include "AliL3TrackSegmentData.h"
16 #include "AliL3SpacePointData.h"
17 #include "AliL3TrackArray.h"
19 //_____________________________________________________________
22 // The L3 Binary File handler
25 This class does all the memory I/O handling on raw binary files.
26 For the moment the compressed binary files are run-length encoded, using
31 1) Reading a binary file:
34 file.SetBinaryInput(filename);
37 AliL3DigitRowData *data = file.CompBinary2Memory(ndigits);
39 for(int i=0; i<NumberOfRowsInPatch; i++)
42 AliL3DigitData *dataPt = (AliL3DigitData*)data->fDigitData;
43 for(int j=0; j<data->fNDigit; j++)
46 time = dataPt[j].fTime;
47 charge = dataPt[j].fCharge;
50 file.UpdateRowPointer(data);
53 file.CloseBinaryInput();
54 ________________________
56 2) Writing a binary file:
58 //First of all you need to store the data in memory,
59 //and have a pointer to it of type AliL3DigitRowData.
60 //E.g. if you just want to write the data you read in example 1)
61 //into a new file, you can do the following:
63 AliL3MemHandler newfile;
64 newfile.SetBinaryOutput(newfilename);
65 newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
66 newfile.CloseBinaryOutput();
70 ClassImp(AliL3MemHandler)
72 AliL3MemHandler::AliL3MemHandler()
90 Int_t row[2] = {0,175};
96 AliL3MemHandler::~AliL3MemHandler()
100 if(fDigits) delete [] fDigits;
101 if(fDPt) delete [] fDPt;
104 void AliL3MemHandler::ResetROI()
106 //*Resets the Look-up table for Region of Interest mode.
108 for(Int_t i=fRowMin; i<=fRowMax; i++)
110 fEtaMinTimeBin[i] = 0;
111 fEtaMaxTimeBin[i] = 445;
116 void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice)
119 Init the Look-up table for the Region of Interest mode.
120 Here you can specify a certain etaregion, - all data
121 outside this region will be discarded:
124 slice[0] = mimumum slice
125 slice[1] = maximum slice
129 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values")
130 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
131 for(Int_t i=fRowMin; i<=fRowMax; i++)
139 for(Int_t i=fRowMin; i<=fRowMax; i++)
144 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
146 xyz[0] = fTransformer->Row2X(i);
148 xyz[2] = xyz[0]/tan(thetamax);
149 fTransformer->Slice2Sector(fSlice,i,sector,row);
150 fTransformer->Local2Raw(xyz,sector,row);
152 fEtaMinTimeBin[i] = (Int_t)xyz[2];
155 fEtaMaxTimeBin[i] = 445;
158 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
159 xyz[0] = fTransformer->Row2X(i);
160 xyz[1] = fTransformer->GetMaxY(i);
161 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
162 xyz[2] = radii/tan(thetamin);
163 fTransformer->Local2Raw(xyz,sector,row);
164 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
170 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
173 Set the input binary file.
175 fInBinary = fopen(name,"r");
177 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
178 <<"Error opening file "<<name<<ENDLOG;
184 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
187 Set the input binary file.
191 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
192 <<"Pointer to File = 0x0 "<<ENDLOG;
198 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)
215 Set the binary output file.
217 fOutBinary = fopen(name,"w");
219 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
220 <<"Pointer to File = 0x0 "<<ENDLOG;
226 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
229 Set the binary output file.
233 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
234 <<"Pointer to File = 0x0 "<<ENDLOG;
240 void AliL3MemHandler::CloseBinaryOutput()
243 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
244 <<"Nothing to Close"<<ENDLOG;
252 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)
276 Allocate memory for tracks in memory. Used by TrackArray2Binary()
279 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
280 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
283 return Allocate(array->GetOutSize());
286 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
289 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()
307 Clear the memory, if allocated.
310 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
311 <<"No Memory allocated - can't Free"<<ENDLOG;
319 ///////////////////////////////////////// Random
320 void AliL3MemHandler::SetRandomSeed()
323 If you are adding random data to the original data.
326 SetRandomSeed(time(tp));
329 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
332 If you are adding random data to the original data.
335 fNRandom = maxnumber;
337 if(fDigits) delete [] fDigits;
338 fDigits = new AliL3RandomDigitData[fNRandom*9];
339 if(fDPt) delete [] fDPt;
340 fDPt = new AliL3RandomDigitData *[fNRandom*9];
343 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last)
346 //* Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
347 //* Uses CompareDigits() to compare objects.
350 static AliL3RandomDigitData *tmp;
351 static int i; // "static" to save stack space
354 while (last - first > 1) {
358 while (++i < last && CompareDigits(a[i], a[first]) < 0)
360 while (--j > first && CompareDigits(a[j], a[first]) > 0)
376 if (j - first < last - (j + 1)) {
378 first = j + 1; // QSort(j + 1, last);
380 QSort(a, j + 1, last);
381 last = j; // QSort(first, j);
386 UInt_t AliL3MemHandler::GetRandomSize()
389 for(Int_t r=fRowMin;r<=fRowMax;r++){
390 Int_t npad=fTransformer->GetNPads(r);
391 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
393 return 9 * nrandom * sizeof(AliL3DigitData);
396 void AliL3MemHandler::Generate(Int_t row)
399 Generate random data on row, if you didn't ask for this, nothing happens here.
401 if(!IsRandom) return;
404 Int_t npad=fTransformer->GetNPads(row);
405 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
406 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
407 (Double_t) ntime/(Double_t) fTransformer->GetNTimeBins() );
409 for(Int_t n=0;n<nrandom;n++){
410 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
411 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
412 Int_t charge = (int)((float)rand()/RAND_MAX*1023);
413 DigitizePoint(row,pad,time,charge);
415 QSort(fDPt,0,fNDigits);
416 // for(Int_t d=0;d<fNDigits;d++)
417 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
418 // fDPt[d]->fTime,fDPt[d]->fCharge);
422 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
423 Int_t time,Int_t charge)
426 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>=fTransformer->GetNPads(row)) continue;
438 if(dtime<0||dtime>=fTransformer->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)
454 Write data to the outputfile as is. No run-length encoding is done.
458 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
459 <<"No Output File"<<ENDLOG;
463 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
464 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
468 AliL3DigitRowData *row_pt = data;
470 for(UInt_t i=0;i<nrow;i++){
471 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
472 + sizeof(AliL3DigitRowData);
474 fwrite(row_pt,size,1,fOutBinary);
475 Byte_t *byte_pt =(Byte_t *) row_pt;
477 row_pt = (AliL3DigitRowData *) byte_pt;
479 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
480 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
481 <<nrow<<" Rows)"<<ENDLOG;
485 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
488 Read inputfile into memory as is, and store it in data. No run-length encoding
492 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
493 <<"No Input File"<<ENDLOG;
497 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
498 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
502 AliL3DigitRowData *row_pt = data;
505 while(!feof(fInBinary)){
506 Byte_t *byte_pt =(Byte_t *) row_pt;
508 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
509 byte_pt += sizeof(AliL3DigitRowData);
510 outsize += sizeof(AliL3DigitRowData);
512 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
514 if(fread(byte_pt,size,1,fInBinary)!=1) break;
518 row_pt = (AliL3DigitRowData *) byte_pt;
522 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
523 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
524 <<rowcount<<" Rows)"<<ENDLOG;
528 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
529 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
531 data[ndata].fPad = pad;
532 data[ndata].fTime = time;
533 data[ndata].fCharge = charge;
537 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
539 data[ndata].fPad = fDPt[fNUsed]->fPad;
540 data[ndata].fTime = fDPt[fNUsed]->fTime;
541 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
546 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
547 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
549 data[ndata].fPad = pad;
550 data[ndata].fTime = time;
551 data[ndata].fCharge = charge;
552 while(ComparePoints(row,pad,time)==0){
553 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
554 if(charge>1023) ch = 1023;
555 data[ndata].fCharge = ch;
561 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
562 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
565 while((action=ComparePoints(row,pad,time))==1){
566 AddRandom(data,ndata);
569 MergeDataRandom(data,ndata,row,pad,time,charge);
572 AddData(data,ndata,row,pad,time,charge);
576 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
577 UInt_t & subindex, UShort_t value)
579 UInt_t shift[3] = {0,10,20};
580 if(subindex==0) comp[index] =0; //clean up memory
581 comp[index] |= (value&0x03ff)<<shift[subindex];
589 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
591 UInt_t shift[3] = {0,10,20};
592 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
602 UShort_t AliL3MemHandler::Test(UInt_t *comp,
603 UInt_t index, UInt_t subindex)
605 UInt_t shift[3] = {0,10,20};
606 return (comp[index]>>shift[subindex])&0x03ff;
609 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
610 AliL3DigitRowData *data,UInt_t *comp)
613 Performs run-length encoding on data stored in memory pointed to by data.
614 The compressed data is written to comp.
617 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
618 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
622 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
623 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
626 AliL3DigitRowData *row_pt = data;
630 for(UInt_t i=0;i<nrow;i++){
631 UShort_t value = row_pt->fRow;
632 Write(comp,index,subindex,value);
636 for(Int_t d=0;d<200;d++) ddd[d]=0;
637 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
638 if(row_pt->fDigitData[dig].fPad <200){
639 ddd[row_pt->fDigitData[dig].fPad]++;
642 for(Int_t d=0;d<200;d++){
648 Write(comp,index,subindex,npad);
650 for(UShort_t pad=0;pad <= maxpad;pad++){
651 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
653 Write(comp,index,subindex,pad);
654 // write zero if time != 0
655 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
656 if(row_pt->fDigitData[digit].fTime>0){
657 Write(comp,index,subindex,0);
658 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
661 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
662 UShort_t charge = row_pt->fDigitData[digit].fCharge;
666 Write(comp,index,subindex,charge);
667 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
668 if(row_pt->fDigitData[digit].fTime +1 !=
669 row_pt->fDigitData[digit+1].fTime){
670 Write(comp,index,subindex,0);
671 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
672 (row_pt->fDigitData[digit].fTime +1);
673 Write(comp,index,subindex,nzero);
678 Write(comp,index,subindex,0);
679 Write(comp,index,subindex,0);
682 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
683 sizeof(AliL3DigitRowData);
684 Byte_t *byte_pt =(Byte_t *) row_pt;
686 row_pt = (AliL3DigitRowData *) byte_pt;
689 Write(comp,index,subindex,0);
690 return index * sizeof(UInt_t);
693 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
694 AliL3DigitRowData *data,UInt_t *comp)
697 Uncompress the run-length encoded data in memory pointed to by comp, and
701 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
702 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
706 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
707 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
712 AliL3DigitRowData *row_pt = data;
716 for(UInt_t i=0;i<nrow;i++){
718 UInt_t row =Read(comp,index,subindex);
721 UShort_t npad = Read(comp,index,subindex);
722 for(UShort_t p=0;p<npad;p++){
725 UShort_t pad = Read(comp,index,subindex);
726 if(Test(comp,index,subindex)==0){
727 Read(comp,index,subindex);
728 if( (time = Read(comp,index,subindex)) == 0 ){
733 while( (charge=Read(comp,index,subindex)) != 0){
734 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
735 // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
736 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
739 UShort_t tshift = Read(comp,index,subindex);
740 if(tshift ==0) break;
744 row_pt->fNDigit = ndigit;
745 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
746 sizeof(AliL3DigitRowData);
747 Byte_t *byte_pt =(Byte_t *) row_pt;
750 row_pt = (AliL3DigitRowData *) byte_pt;
755 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
758 Return the size of RLE data, after compressing data.
761 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
762 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
765 AliL3DigitRowData *row_pt = data;
768 for(UInt_t i=0;i<nrow;i++){
773 for(Int_t d=0;d<200;d++) ddd[d]=0;
774 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
775 if(row_pt->fDigitData[dig].fPad <200){
776 ddd[row_pt->fDigitData[dig].fPad]++;
779 for(Int_t d=0;d<200;d++){
787 for(UShort_t pad=0;pad <= maxpad;pad++){
788 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
791 // write zero if time != 0
792 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
793 if(row_pt->fDigitData[digit].fTime>0){
798 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
800 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
801 if(row_pt->fDigitData[digit].fTime +1 !=
802 row_pt->fDigitData[digit+1].fTime){
813 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
814 sizeof(AliL3DigitRowData);
815 Byte_t *byte_pt =(Byte_t *) row_pt;
817 row_pt = (AliL3DigitRowData *) byte_pt;
821 return (index/3) * sizeof(UInt_t);
824 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
826 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
827 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
835 for(UInt_t i=0;i<nrow;i++){
837 Read(comp,index,subindex);
838 UShort_t npad = Read(comp,index,subindex);
839 for(UShort_t p=0;p<npad;p++){
840 Read(comp,index,subindex);
841 if(Test(comp,index,subindex)==0){
842 Read(comp,index,subindex);
843 if(Read(comp,index,subindex)== 0) continue;
846 while(Read(comp,index,subindex)!=0) ndigit++;
847 if(Read(comp,index,subindex)==0) break;
850 Int_t size = sizeof(AliL3DigitData) * ndigit+
851 sizeof(AliL3DigitRowData);
858 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
861 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
862 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
869 while(index<size-1){ //don't start with last word
872 Read(comp,index,subindex);
873 UShort_t npad = Read(comp,index,subindex);
874 for(UShort_t p=0;p<npad;p++){
875 Read(comp,index,subindex);
876 if(Test(comp,index,subindex)==0){
877 Read(comp,index,subindex);
878 if(Read(comp,index,subindex)==0)continue;
881 while(Read(comp,index,subindex)!=0) ndigit++;
882 if(Read(comp,index,subindex)==0) break;
886 if(index==size-1){ //last word
888 if(Read(comp,index,subindex)!=0) nrow++;
894 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
898 Write the RLE data in comp to the output file.
903 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
904 <<"No Output File"<<ENDLOG;
908 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
909 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
913 size=GetMemorySize(nrow,comp);
915 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
916 <<"Memory size = 0 "<<ENDLOG;
919 UInt_t length = size/sizeof(UInt_t);
920 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
921 fwrite(comp,size,1,fOutBinary);
925 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
928 Read the RLE data from file, and store it in comp. No unpacking yet.
931 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
932 <<"No Output File"<<ENDLOG;
936 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
937 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
942 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
943 UInt_t size = length*sizeof(UInt_t);
944 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
945 // now find the number of dig
946 nrow = GetNRow(comp,size);
950 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
953 Read the RLE inputfile, unpack it and return the pointer to it.
956 AliL3MemHandler * handler = new AliL3MemHandler();
957 handler->SetBinaryInput(fInBinary);
958 UInt_t *comp =(UInt_t *)handler->Allocate();
959 handler->CompBinary2CompMemory(nrow,comp);
960 UInt_t size = GetMemorySize(nrow,comp);
961 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
962 CompMemory2Memory(nrow,data,comp);
968 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
971 Perform RLE on the data, and write it to the output file.
974 AliL3MemHandler * handler = new AliL3MemHandler();
975 UInt_t size = GetCompMemorySize(nrow,data);
976 UInt_t *comp =(UInt_t *)handler->Allocate(size);
977 Memory2CompMemory(nrow,data,comp);
978 CompMemory2CompBinary(nrow,comp,size);
985 ///////////////////////////////////////// Point IO
986 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
989 Writing spacepoints stored in data to the outputfile.
992 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
993 <<"No Output File"<<ENDLOG;
997 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
998 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1001 UInt_t size = npoint*sizeof(AliL3SpacePointData);
1002 fwrite(data,size,1,fOutBinary);
1007 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,
1008 Int_t slice, AliL3Transform* trans)
1011 Transform the space points in data, to global coordinates in slice.
1015 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
1016 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1020 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Object")
1021 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
1024 for(UInt_t i=0;i<npoint;i++){
1026 xyz[0] = data[i].fX;
1027 xyz[1] = data[i].fY;
1028 xyz[2] = data[i].fZ;
1029 trans->Local2Global(xyz,slice);
1030 data[i].fX = xyz[0];
1031 data[i].fY = xyz[1];
1032 data[i].fZ = xyz[2];
1037 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1040 Read the space points in inputfile, and store it in data.
1043 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1044 <<"No Input File"<<ENDLOG;
1048 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1049 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1053 Int_t size = GetFileSize();
1055 UInt_t size,slice,patch,row[2];
1056 AliL3EventDataTypeRoot datatype;
1058 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1059 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1060 <<"File Read Error "<<ENDLOG;
1063 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1064 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1065 <<"File Read Error "<<ENDLOG;
1068 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1069 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1070 <<"File Read Error "<<ENDLOG;
1073 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1074 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1075 <<"File Read Error "<<ENDLOG;
1078 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1079 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1080 <<"File Read Error "<<ENDLOG;
1083 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1084 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1085 <<"File Read Error "<<ENDLOG;
1089 npoint = size/sizeof(AliL3SpacePointData);
1090 if(fread(data,size,1,fInBinary)!=1){
1091 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1092 <<"File Read Error "<<ENDLOG;
1095 if(size%sizeof(AliL3SpacePointData)){
1096 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1097 <<"File Size wrong "<<ENDLOG;
1100 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1101 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1105 ///////////////////////////////////////// Track IO
1106 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1109 Write the tracks stored in data, to outputfile.
1112 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1113 <<"No Output File"<<ENDLOG;
1117 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1118 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1121 AliL3TrackSegmentData *track_pt = data;
1122 for(UInt_t i=0;i<ntrack;i++){
1123 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1124 fwrite(track_pt,size,1,fOutBinary);
1125 Byte_t *byte_pt = (Byte_t*) track_pt;
1127 track_pt = (AliL3TrackSegmentData*) byte_pt;
1129 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1130 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1135 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1138 Read the tracks in inputfile, and store it in data.
1141 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1142 <<"No Input File"<<ENDLOG;
1146 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1147 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1152 AliL3TrackSegmentData *track_pt = data;
1155 UInt_t size,slice,patch,row[2];
1156 AliL3EventDataTypeRoot datatype;
1158 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1159 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1160 <<"File Read Error "<<ENDLOG;
1163 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1164 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1165 <<"File Read Error "<<ENDLOG;
1168 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1169 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1170 <<"File Read Error "<<ENDLOG;
1173 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1174 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1175 <<"File Read Error "<<ENDLOG;
1178 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1179 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1180 <<"File Read Error "<<ENDLOG;
1183 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1184 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1185 <<"File Read Error "<<ENDLOG;
1189 while(!feof(fInBinary)){
1190 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1191 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1192 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1193 Byte_t *byte_pt = (Byte_t*) track_pt;
1194 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1195 track_pt = (AliL3TrackSegmentData*) byte_pt;
1198 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1199 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1203 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1206 Write the trackarray to the outputfile.
1209 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1210 <<"No Output File"<<ENDLOG;
1214 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1215 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1218 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1220 TrackArray2Memory(ntrack,data,array);
1221 Memory2Binary(ntrack,data);
1226 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1229 Read the tracks in inputfile, and fill it in trackarray.
1230 array should already be constructed.
1233 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1234 <<"No Input File"<<ENDLOG;
1238 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1239 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1242 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1244 Binary2Memory(ntrack,data);
1245 Memory2TrackArray(ntrack,data,array);
1250 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1253 Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1256 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1257 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1261 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1262 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1265 array->WriteTracks(ntrack,data);
1269 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1272 Fill the tracks in data into trackarray.
1275 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1276 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1280 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1281 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1284 array->FillTracks(ntrack,data);
1288 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice,
1289 AliL3Transform* trans)
1292 Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1295 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1296 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1300 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1301 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1305 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Object")
1306 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
1309 array->FillTracks(ntrack,data,slice,trans);
1313 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1315 //Update the data pointer to the next padrow in memory.
1317 Byte_t *tmp = (Byte_t*)tempPt;
1318 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1320 tempPt = (AliL3DigitRowData*)tmp;