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
30 // This class does all the memory I/O handling on raw binary files.
31 // For the moment the compressed binary files are run-length encoded, using
36 // 1) Reading a binary file:
38 // AliL3MemHandler file;
39 // file.SetBinaryInput(filename);
42 // AliL3DigitRowData *data = file.CompBinary2Memory(ndigits);
44 // for(int i=0; i<NumberOfRowsInPatch; i++)
47 // AliL3DigitData *dataPt = (AliL3DigitData*)data->fDigitData;
48 // for(int j=0; j<data->fNDigit; j++)
50 // pad = dataPt[j].fPad;
51 // time = dataPt[j].fTime;
52 // charge = dataPt[j].fCharge;
55 // file.UpdateRowPointer(data);
58 // file.CloseBinaryInput();
59 // ________________________
61 // 2) Writing a binary file:
63 // //First of all you need to store the data in memory,
64 // //and have a pointer to it of type AliL3DigitRowData.
65 // //E.g. if you just want to write the data you read in example 1)
66 // //into a new file, you can do the following:
68 // AliL3MemHandler newfile;
69 // newfile.SetBinaryOutput(newfilename);
70 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
71 // newfile.CloseBinaryOutput();
74 ClassImp(AliL3MemHandler)
76 AliL3MemHandler::AliL3MemHandler()
94 Int_t row[2] = {0,175};
100 AliL3MemHandler::~AliL3MemHandler()
103 if(fPt) delete[] fPt;
104 if(fDigits) delete [] fDigits;
105 if(fDPt) delete [] fDPt;
108 void AliL3MemHandler::ResetROI()
110 //Resets the Look-up table for Region of Interest mode.
112 for(Int_t i=fRowMin; i<=fRowMax; i++)
114 fEtaMinTimeBin[i] = 0;
115 fEtaMaxTimeBin[i] = 445;
120 void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice)
122 // Init the Look-up table for the Region of Interest mode.
123 // Here you can specify a certain etaregion, - all data
124 // outside this region will be discarded:
125 // eta[0] = mimium eta
126 // eta[1] = maximum eta
127 // slice[0] = mimumum slice
128 // slice[1] = maximum slice
133 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values")
134 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
135 for(Int_t i=fRowMin; i<=fRowMax; i++)
143 for(Int_t i=fRowMin; i<=fRowMax; i++)
148 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
150 xyz[0] = fTransformer->Row2X(i);
152 xyz[2] = xyz[0]/tan(thetamax);
153 fTransformer->Slice2Sector(fSlice,i,sector,row);
154 fTransformer->Local2Raw(xyz,sector,row);
156 fEtaMinTimeBin[i] = (Int_t)xyz[2];
159 fEtaMaxTimeBin[i] = 445;
162 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
163 xyz[0] = fTransformer->Row2X(i);
164 xyz[1] = fTransformer->GetMaxY(i);
165 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
166 xyz[2] = radii/tan(thetamin);
167 fTransformer->Local2Raw(xyz,sector,row);
168 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
174 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
176 //Set the input binary file.
178 fInBinary = fopen(name,"r");
180 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
181 <<"Error opening file "<<name<<ENDLOG;
187 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
189 //Set the input binary file.
193 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
194 <<"Pointer to File = 0x0 "<<ENDLOG;
200 void AliL3MemHandler::CloseBinaryInput()
202 //Close the input file.
205 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
206 <<"Nothing to Close"<<ENDLOG;
213 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
215 //Set the binary output file.
216 fOutBinary = fopen(name,"w");
218 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
219 <<"Pointer to File = 0x0 "<<ENDLOG;
225 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
227 //Set the binary output file.
231 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
232 <<"Pointer to File = 0x0 "<<ENDLOG;
238 void AliL3MemHandler::CloseBinaryOutput()
241 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
242 <<"Nothing to Close"<<ENDLOG;
249 UInt_t AliL3MemHandler::GetFileSize()
251 //Returns the file size in bytes of the input file.
254 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
255 <<"No Input File"<<ENDLOG;
258 fseek(fInBinary,0,SEEK_END);
259 UInt_t size = (UInt_t) ftell(fInBinary);
264 Byte_t *AliL3MemHandler::Allocate()
266 return Allocate(GetFileSize());
269 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
271 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
274 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
275 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
278 return Allocate(array->GetOutSize());
281 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
283 //Allocate memory of size in bytes.
286 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
287 <<"Delete Memory"<<ENDLOG;
290 fPt = new Byte_t[size];
293 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
294 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
298 void AliL3MemHandler::Free()
300 //Clear the memory, if allocated.
303 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
304 <<"No Memory allocated - can't Free"<<ENDLOG;
312 ///////////////////////////////////////// Random
313 void AliL3MemHandler::SetRandomSeed()
315 //If you are adding random data to the original data.
317 SetRandomSeed(time(tp));
320 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
322 //If you are adding random data to the original data.
325 fNRandom = maxnumber;
327 if(fDigits) delete [] fDigits;
328 fDigits = new AliL3RandomDigitData[fNRandom*9];
329 if(fDPt) delete [] fDPt;
330 fDPt = new AliL3RandomDigitData *[fNRandom*9];
333 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last){
335 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
336 // Uses CompareDigits() to compare objects.
339 static AliL3RandomDigitData *tmp;
340 static int i; // "static" to save stack space
343 while (last - first > 1) {
347 while (++i < last && CompareDigits(a[i], a[first]) < 0)
349 while (--j > first && CompareDigits(a[j], a[first]) > 0)
366 if (j - first < last - (j + 1)) {
368 first = j + 1; // QSort(j + 1, last);
370 QSort(a, j + 1, last);
371 last = j; // QSort(first, j);
376 UInt_t AliL3MemHandler::GetRandomSize()
379 for(Int_t r=fRowMin;r<=fRowMax;r++){
380 Int_t npad=fTransformer->GetNPads(r);
381 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
383 return 9 * nrandom * sizeof(AliL3DigitData);
386 void AliL3MemHandler::Generate(Int_t row)
388 //Generate random data on row, if you didn't ask for this, nothing happens here.
390 if(!IsRandom) return;
393 Int_t npad=fTransformer->GetNPads(row);
394 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
395 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
396 (Double_t) ntime/(Double_t) fTransformer->GetNTimeBins() );
398 for(Int_t n=0;n<nrandom;n++){
399 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
400 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
401 Int_t charge = (int)((float)rand()/RAND_MAX*1023);
402 DigitizePoint(row,pad,time,charge);
404 QSort(fDPt,0,fNDigits);
405 // for(Int_t d=0;d<fNDigits;d++)
406 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
407 // fDPt[d]->fTime,fDPt[d]->fCharge);
411 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
412 Int_t time,Int_t charge)
414 //Making one single random cluster.
415 for(Int_t j=-1;j<2;j++){
416 for(Int_t k=-1;k<2;k++){
417 Int_t dcharge = charge;
420 if(dcharge<10) continue;
421 Int_t dpad = j + pad;
422 Int_t dtime = k + time;
424 if(dpad<0||dpad>=fTransformer->GetNPads(row)) continue;
425 if(dtime<0||dtime>=fTransformer->GetNTimeBins()) continue;
427 fDigits[fNDigits].fCharge = dcharge;
428 fDigits[fNDigits].fRow = row;
429 fDigits[fNDigits].fPad = dpad;
430 fDigits[fNDigits].fTime = dtime;
431 fDPt[fNDigits] = &fDigits[fNDigits];
437 ///////////////////////////////////////// Digit IO
438 Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
440 //Write data to the outputfile as is. No run-length encoding is done.
443 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
444 <<"No Output File"<<ENDLOG;
448 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
449 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
453 AliL3DigitRowData *row_pt = data;
455 for(UInt_t i=0;i<nrow;i++){
456 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
457 + sizeof(AliL3DigitRowData);
459 fwrite(row_pt,size,1,fOutBinary);
460 Byte_t *byte_pt =(Byte_t *) row_pt;
462 row_pt = (AliL3DigitRowData *) byte_pt;
464 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
465 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
466 <<nrow<<" Rows)"<<ENDLOG;
470 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
472 //Read inputfile into memory as is, and store it in data. No run-length encoding
476 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
477 <<"No Input File"<<ENDLOG;
481 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
482 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
486 AliL3DigitRowData *row_pt = data;
489 while(!feof(fInBinary)){
490 Byte_t *byte_pt =(Byte_t *) row_pt;
492 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
493 byte_pt += sizeof(AliL3DigitRowData);
494 outsize += sizeof(AliL3DigitRowData);
496 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
498 if(fread(byte_pt,size,1,fInBinary)!=1) break;
502 row_pt = (AliL3DigitRowData *) byte_pt;
506 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
507 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
508 <<rowcount<<" Rows)"<<ENDLOG;
512 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
513 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
515 data[ndata].fPad = pad;
516 data[ndata].fTime = time;
517 data[ndata].fCharge = charge;
521 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
523 data[ndata].fPad = fDPt[fNUsed]->fPad;
524 data[ndata].fTime = fDPt[fNUsed]->fTime;
525 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
530 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
531 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
533 data[ndata].fPad = pad;
534 data[ndata].fTime = time;
535 data[ndata].fCharge = charge;
536 while(ComparePoints(row,pad,time)==0){
537 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
538 if(charge>1023) ch = 1023;
539 data[ndata].fCharge = ch;
545 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
546 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
549 while((action=ComparePoints(row,pad,time))==1){
550 AddRandom(data,ndata);
553 MergeDataRandom(data,ndata,row,pad,time,charge);
556 AddData(data,ndata,row,pad,time,charge);
560 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
561 UInt_t & subindex, UShort_t value)
563 UInt_t shift[3] = {0,10,20};
564 if(subindex==0) comp[index] =0; //clean up memory
565 comp[index] |= (value&0x03ff)<<shift[subindex];
573 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
575 UInt_t shift[3] = {0,10,20};
576 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
586 UShort_t AliL3MemHandler::Test(UInt_t *comp,
587 UInt_t index, UInt_t subindex)
589 UInt_t shift[3] = {0,10,20};
590 return (comp[index]>>shift[subindex])&0x03ff;
593 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
594 AliL3DigitRowData *data,UInt_t *comp)
596 //Performs run-length encoding on data stored in memory pointed to by data.
597 //The compressed data is written to comp.
599 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
600 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
604 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
605 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
608 AliL3DigitRowData *row_pt = data;
612 for(UInt_t i=0;i<nrow;i++){
613 UShort_t value = row_pt->fRow;
614 Write(comp,index,subindex,value);
618 for(Int_t d=0;d<200;d++) ddd[d]=0;
619 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
620 if(row_pt->fDigitData[dig].fPad <200){
621 ddd[row_pt->fDigitData[dig].fPad]++;
624 for(Int_t d=0;d<200;d++){
630 Write(comp,index,subindex,npad);
632 for(UShort_t pad=0;pad <= maxpad;pad++){
633 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
635 Write(comp,index,subindex,pad);
636 // write zero if time != 0
637 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
638 if(row_pt->fDigitData[digit].fTime>0){
639 Write(comp,index,subindex,0);
640 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
643 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
644 UShort_t charge = row_pt->fDigitData[digit].fCharge;
648 Write(comp,index,subindex,charge);
649 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
650 if(row_pt->fDigitData[digit].fTime +1 !=
651 row_pt->fDigitData[digit+1].fTime){
652 Write(comp,index,subindex,0);
653 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
654 (row_pt->fDigitData[digit].fTime +1);
655 Write(comp,index,subindex,nzero);
660 Write(comp,index,subindex,0);
661 Write(comp,index,subindex,0);
664 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
665 sizeof(AliL3DigitRowData);
666 Byte_t *byte_pt =(Byte_t *) row_pt;
668 row_pt = (AliL3DigitRowData *) byte_pt;
671 Write(comp,index,subindex,0);
672 return index * sizeof(UInt_t);
675 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
676 AliL3DigitRowData *data,UInt_t *comp)
678 //Uncompress the run-length encoded data in memory pointed to by comp, and
682 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
683 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
687 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
688 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
693 AliL3DigitRowData *row_pt = data;
697 for(UInt_t i=0;i<nrow;i++){
699 UInt_t row =Read(comp,index,subindex);
702 UShort_t npad = Read(comp,index,subindex);
703 for(UShort_t p=0;p<npad;p++){
706 UShort_t pad = Read(comp,index,subindex);
707 if(Test(comp,index,subindex)==0){
708 Read(comp,index,subindex);
709 if( (time = Read(comp,index,subindex)) == 0 ){
714 while( (charge=Read(comp,index,subindex)) != 0){
715 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
716 // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
717 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
720 UShort_t tshift = Read(comp,index,subindex);
721 if(tshift ==0) break;
725 row_pt->fNDigit = ndigit;
726 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
727 sizeof(AliL3DigitRowData);
728 Byte_t *byte_pt =(Byte_t *) row_pt;
731 row_pt = (AliL3DigitRowData *) byte_pt;
736 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
738 //Return the size of RLE data, after compressing data.
741 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
742 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
745 AliL3DigitRowData *row_pt = data;
748 for(UInt_t i=0;i<nrow;i++){
753 for(Int_t d=0;d<200;d++) ddd[d]=0;
754 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
755 if(row_pt->fDigitData[dig].fPad <200){
756 ddd[row_pt->fDigitData[dig].fPad]++;
759 for(Int_t d=0;d<200;d++){
767 for(UShort_t pad=0;pad <= maxpad;pad++){
768 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
771 // write zero if time != 0
772 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
773 if(row_pt->fDigitData[digit].fTime>0){
778 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
780 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
781 if(row_pt->fDigitData[digit].fTime +1 !=
782 row_pt->fDigitData[digit+1].fTime){
793 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
794 sizeof(AliL3DigitRowData);
795 Byte_t *byte_pt =(Byte_t *) row_pt;
797 row_pt = (AliL3DigitRowData *) byte_pt;
801 return (index/3) * sizeof(UInt_t);
804 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
806 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
807 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
815 for(UInt_t i=0;i<nrow;i++){
817 Read(comp,index,subindex);
818 UShort_t npad = Read(comp,index,subindex);
819 for(UShort_t p=0;p<npad;p++){
820 Read(comp,index,subindex);
821 if(Test(comp,index,subindex)==0){
822 Read(comp,index,subindex);
823 if(Read(comp,index,subindex)== 0) continue;
826 while(Read(comp,index,subindex)!=0) ndigit++;
827 if(Read(comp,index,subindex)==0) break;
830 Int_t size = sizeof(AliL3DigitData) * ndigit+
831 sizeof(AliL3DigitRowData);
838 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
841 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
842 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
849 while(index<size-1){ //don't start with last word
852 Read(comp,index,subindex);
853 UShort_t npad = Read(comp,index,subindex);
854 for(UShort_t p=0;p<npad;p++){
855 Read(comp,index,subindex);
856 if(Test(comp,index,subindex)==0){
857 Read(comp,index,subindex);
858 if(Read(comp,index,subindex)==0)continue;
861 while(Read(comp,index,subindex)!=0) ndigit++;
862 if(Read(comp,index,subindex)==0) break;
866 if(index==size-1){ //last word
868 if(Read(comp,index,subindex)!=0) nrow++;
874 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
877 //Write the RLE data in comp to the output file.
880 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
881 <<"No Output File"<<ENDLOG;
885 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
886 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
890 size=GetMemorySize(nrow,comp);
892 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
893 <<"Memory size = 0 "<<ENDLOG;
896 UInt_t length = size/sizeof(UInt_t);
897 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
898 fwrite(comp,size,1,fOutBinary);
902 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
904 //Read the RLE data from file, and store it in comp. No unpacking yet.
907 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
908 <<"No Output File"<<ENDLOG;
912 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
913 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
918 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
919 UInt_t size = length*sizeof(UInt_t);
920 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
921 // now find the number of dig
922 nrow = GetNRow(comp,size);
926 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
928 // Read the RLE inputfile, unpack it and return the pointer to it.
930 AliL3MemHandler * handler = new AliL3MemHandler();
931 handler->SetBinaryInput(fInBinary);
932 UInt_t *comp =(UInt_t *)handler->Allocate();
933 handler->CompBinary2CompMemory(nrow,comp);
934 UInt_t size = GetMemorySize(nrow,comp);
935 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
936 CompMemory2Memory(nrow,data,comp);
942 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
944 //Perform RLE on the data, and write it to the output file.
946 AliL3MemHandler * handler = new AliL3MemHandler();
947 UInt_t size = GetCompMemorySize(nrow,data);
948 UInt_t *comp =(UInt_t *)handler->Allocate(size);
949 Memory2CompMemory(nrow,data,comp);
950 CompMemory2CompBinary(nrow,comp,size);
957 ///////////////////////////////////////// Point IO
958 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
960 //Writing spacepoints stored in data to the outputfile.
962 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
963 <<"No Output File"<<ENDLOG;
967 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
968 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
971 UInt_t size = npoint*sizeof(AliL3SpacePointData);
972 fwrite(data,size,1,fOutBinary);
977 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,
978 Int_t slice, AliL3Transform* trans)
980 //Transform the space points in data, to global coordinates in slice.
982 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
983 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
987 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Object")
988 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
991 for(UInt_t i=0;i<npoint;i++){
996 trans->Local2Global(xyz,slice);
1004 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1006 //Read the space points in inputfile, and store it in data.
1008 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1009 <<"No Input File"<<ENDLOG;
1013 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1014 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1018 Int_t size = GetFileSize();
1020 UInt_t size,slice,patch,row[2];
1021 AliL3EventDataTypeRoot datatype;
1023 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1024 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1025 <<"File Read Error "<<ENDLOG;
1028 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1029 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1030 <<"File Read Error "<<ENDLOG;
1033 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1034 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1035 <<"File Read Error "<<ENDLOG;
1038 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1039 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1040 <<"File Read Error "<<ENDLOG;
1043 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1044 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1045 <<"File Read Error "<<ENDLOG;
1048 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1049 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1050 <<"File Read Error "<<ENDLOG;
1054 npoint = size/sizeof(AliL3SpacePointData);
1055 if(fread(data,size,1,fInBinary)!=1){
1056 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1057 <<"File Read Error "<<ENDLOG;
1060 if(size%sizeof(AliL3SpacePointData)){
1061 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1062 <<"File Size wrong "<<ENDLOG;
1065 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1066 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1070 ///////////////////////////////////////// Track IO
1071 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1073 //Write the tracks stored in data, to outputfile.
1075 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1076 <<"No Output File"<<ENDLOG;
1080 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1081 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1084 AliL3TrackSegmentData *track_pt = data;
1085 for(UInt_t i=0;i<ntrack;i++){
1086 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1087 fwrite(track_pt,size,1,fOutBinary);
1088 Byte_t *byte_pt = (Byte_t*) track_pt;
1090 track_pt = (AliL3TrackSegmentData*) byte_pt;
1092 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1093 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1098 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1100 //Read the tracks in inputfile, and store it in data.
1103 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1104 <<"No Input File"<<ENDLOG;
1108 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1109 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1114 AliL3TrackSegmentData *track_pt = data;
1117 UInt_t size,slice,patch,row[2];
1118 AliL3EventDataTypeRoot datatype;
1120 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1121 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1122 <<"File Read Error "<<ENDLOG;
1125 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1126 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1127 <<"File Read Error "<<ENDLOG;
1130 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1131 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1132 <<"File Read Error "<<ENDLOG;
1135 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1136 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1137 <<"File Read Error "<<ENDLOG;
1140 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1141 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1142 <<"File Read Error "<<ENDLOG;
1145 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1146 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1147 <<"File Read Error "<<ENDLOG;
1151 while(!feof(fInBinary)){
1152 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1153 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1154 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1155 Byte_t *byte_pt = (Byte_t*) track_pt;
1156 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1157 track_pt = (AliL3TrackSegmentData*) byte_pt;
1160 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1161 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1165 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1167 //Write the trackarray to the outputfile.
1169 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1170 <<"No Output File"<<ENDLOG;
1174 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1175 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1178 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1180 TrackArray2Memory(ntrack,data,array);
1181 Memory2Binary(ntrack,data);
1186 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1188 //Read the tracks in inputfile, and fill it in trackarray.
1189 //array should already be constructed.
1191 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1192 <<"No Input File"<<ENDLOG;
1196 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1197 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1200 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1202 Binary2Memory(ntrack,data);
1203 Memory2TrackArray(ntrack,data,array);
1208 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1210 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1212 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1213 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1217 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1218 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1221 array->WriteTracks(ntrack,data);
1225 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1227 //Fill the tracks in data into trackarray.
1230 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1231 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1235 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1236 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1239 array->FillTracks(ntrack,data);
1243 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice,
1244 AliL3Transform* trans)
1246 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1249 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1250 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1254 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1255 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1259 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Object")
1260 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
1263 array->FillTracks(ntrack,data,slice,trans);
1267 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1269 //Update the data pointer to the next padrow in memory.
1271 Byte_t *tmp = (Byte_t*)tempPt;
1272 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1274 tempPt = (AliL3DigitRowData*)tmp;