3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>, Anders Vestbo <mailto:vestbo$fi.uib.no>
4 //*-- Copyright © Uli
5 // changes done by Constantin Loizides <mailto:loizides@ikf.physik.uni-frankfurt.de>
7 #include "AliL3StandardIncludes.h"
9 #include "AliL3Logging.h"
10 #include "AliL3Transform.h"
11 #include "AliL3TrackSegmentData.h"
12 #include "AliL3SpacePointData.h"
13 #include "AliL3TrackArray.h"
14 #include "AliL3MemHandler.h"
16 /** \class AliL3MemHandler
18 //_____________________________________________________________
21 // The HLT Binary File handler
23 // This class does all the memory I/O handling of HLT binary files.
28 // 1) Reading a binary file:
30 // AliL3MemHandler file;
31 // file.SetBinaryInput(filename);
32 // file.Init(slice,patch);
35 // AliL3DigitRowData *data = file.CompBinary2Memory(nrowss);
37 // for(int i=0; i<nrows; i++)
40 // AliL3DigitData *dataPt = (AliL3DigitData*)data->fDigitData;
41 // for(int j=0; j<data->fNDigit; j++)
43 // pad = dataPt[j].fPad;
44 // time = dataPt[j].fTime;
45 // charge = dataPt[j].fCharge;
48 // file.UpdateRowPointer(data);
51 // file.CloseBinaryInput();
52 // ________________________
54 // 2) Writing a binary file:
56 // //First of all you need to store the data in memory,
57 // //and have a pointer to it of type AliL3DigitRowData.
58 // //E.g. if you just want to write the data you read in example 1)
59 // //into a new file, you can do the following:
61 // AliL3MemHandler newfile;
62 // newfile.Init(slice,patch);
63 // newfile.SetBinaryOutput(newfilename);
64 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
65 // newfile.CloseBinaryOutput();
68 // Compressed file format:
69 // -----------------------
71 // The data is RLE encoded and currently using _10_ bit range for the ADC-values.
75 ClassImp(AliL3MemHandler)
77 AliL3MemHandler::AliL3MemHandler()
97 AliL3MemHandler::~AliL3MemHandler()
100 if(fPt) delete[] fPt;
101 if(fDigits) delete [] fDigits;
102 if(fDPt) delete [] fDPt;
105 void AliL3MemHandler::Init(Int_t s,Int_t p, Int_t *r)
112 fRowMin=AliL3Transform::GetFirstRow(p);
113 fRowMax=AliL3Transform::GetLastRow(p);
118 void AliL3MemHandler::ResetROI()
120 //Resets the Look-up table for Region of Interest mode.
122 for(Int_t i=fRowMin; i<=fRowMax; i++)
124 fEtaMinTimeBin[i] = 0;
125 fEtaMaxTimeBin[i] = AliL3Transform::GetNTimeBins()-1;
129 void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice)
131 // Init the Look-up table for the Region of Interest mode.
132 // Here you can specify a certain etaregion, - all data
133 // outside this region will be discarded:
134 // eta[0] = mimium eta
135 // eta[1] = maximum eta
136 // slice[0] = mimumum slice
137 // slice[1] = maximum slice
142 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values")
143 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
144 for(Int_t i=fRowMin; i<=fRowMax; i++)
152 for(Int_t i=fRowMin; i<=fRowMax; i++)
157 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
159 xyz[0] = AliL3Transform::Row2X(i);
161 xyz[2] = xyz[0]/tan(thetamax);
162 AliL3Transform::Slice2Sector(fSlice,i,sector,row);
163 AliL3Transform::Local2Raw(xyz,sector,row);
165 fEtaMinTimeBin[i] = (Int_t)xyz[2];
168 fEtaMaxTimeBin[i] = 445;
171 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
172 xyz[0] = AliL3Transform::Row2X(i);
173 xyz[1] = AliL3Transform::GetMaxY(i);
174 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
175 xyz[2] = radii/tan(thetamin);
176 AliL3Transform::Local2Raw(xyz,sector,row);
177 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
183 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
185 //Set the input binary file.
187 fInBinary = fopen(name,"r");
189 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
190 <<"Error opening file "<<name<<ENDLOG;
196 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
198 //Set the input binary file.
202 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
203 <<"Pointer to File = 0x0 "<<ENDLOG;
209 void AliL3MemHandler::CloseBinaryInput()
211 //Close the input file.
214 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
215 <<"Nothing to Close"<<ENDLOG;
222 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
224 //Set the binary output file.
225 fOutBinary = fopen(name,"w");
227 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
228 <<"Pointer to File = 0x0 "<<ENDLOG;
234 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
236 //Set the binary output file.
240 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
241 <<"Pointer to File = 0x0 "<<ENDLOG;
247 void AliL3MemHandler::CloseBinaryOutput()
250 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
251 <<"Nothing to Close"<<ENDLOG;
258 UInt_t AliL3MemHandler::GetFileSize()
260 //Returns the file size in bytes of the input file.
263 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
264 <<"No Input File"<<ENDLOG;
267 fseek(fInBinary,0,SEEK_END);
268 UInt_t size = (UInt_t) ftell(fInBinary);
273 Byte_t *AliL3MemHandler::Allocate()
275 return Allocate(GetFileSize());
278 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
280 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
283 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
284 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
287 return Allocate(array->GetOutSize());
290 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
292 //Allocate memory of size in bytes.
295 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
296 <<"Delete Memory"<<ENDLOG;
299 fPt = new Byte_t[size];
302 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
303 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
307 void AliL3MemHandler::Free()
309 //Clear the memory, if allocated.
312 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
313 <<"No Memory allocated - can't Free"<<ENDLOG;
321 ///////////////////////////////////////// Random
322 void AliL3MemHandler::SetRandomSeed()
324 //If you are adding random data to the original data.
326 SetRandomSeed(time(tp));
329 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
331 //If you are adding random data to the original data.
334 fNRandom = maxnumber;
336 if(fDigits) delete [] fDigits;
337 fDigits = new AliL3RandomDigitData[fNRandom*9];
338 if(fDPt) delete [] fDPt;
339 fDPt = new AliL3RandomDigitData *[fNRandom*9];
342 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last){
344 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
345 // Uses CompareDigits() to compare objects.
348 static AliL3RandomDigitData *tmp;
349 static int i; // "static" to save stack space
352 while (last - first > 1) {
356 while (++i < last && CompareDigits(a[i], a[first]) < 0)
358 while (--j > first && CompareDigits(a[j], a[first]) > 0)
375 if (j - first < last - (j + 1)) {
377 first = j + 1; // QSort(j + 1, last);
379 QSort(a, j + 1, last);
380 last = j; // QSort(first, j);
385 UInt_t AliL3MemHandler::GetRandomSize()
388 for(Int_t r=fRowMin;r<=fRowMax;r++){
389 Int_t npad=AliL3Transform::GetNPads(r);
390 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
392 return 9 * nrandom * sizeof(AliL3DigitData);
395 void AliL3MemHandler::Generate(Int_t row)
397 //Generate random data on row, if you didn't ask for this, nothing happens here.
399 if(!IsRandom) return;
402 Int_t npad=AliL3Transform::GetNPads(row);
403 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
404 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
405 (Double_t) ntime/(Double_t) AliL3Transform::GetNTimeBins() );
407 for(Int_t n=0;n<nrandom;n++){
408 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
409 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
410 Int_t charge = (int)((float)rand()/RAND_MAX*AliL3Transform::GetADCSat());
411 DigitizePoint(row,pad,time,charge);
413 QSort(fDPt,0,fNDigits);
414 // for(Int_t d=0;d<fNDigits;d++)
415 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
416 // fDPt[d]->fTime,fDPt[d]->fCharge);
420 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
421 Int_t time,Int_t charge)
423 //Making one single random cluster.
424 for(Int_t j=-1;j<2;j++){
425 for(Int_t k=-1;k<2;k++){
426 Int_t dcharge = charge;
429 if(dcharge<10) continue;
430 Int_t dpad = j + pad;
431 Int_t dtime = k + time;
433 if(dpad<0||dpad>=AliL3Transform::GetNPads(row)) continue;
434 if(dtime<0||dtime>=AliL3Transform::GetNTimeBins()) continue;
436 fDigits[fNDigits].fCharge = dcharge;
437 fDigits[fNDigits].fRow = row;
438 fDigits[fNDigits].fPad = dpad;
439 fDigits[fNDigits].fTime = dtime;
440 fDPt[fNDigits] = &fDigits[fNDigits];
446 ///////////////////////////////////////// Digit IO
447 Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
449 //Write data to the outputfile as is. No run-length encoding is done.
452 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
453 <<"No Output File"<<ENDLOG;
457 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
458 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
462 AliL3DigitRowData *row_pt = data;
464 for(UInt_t i=0;i<nrow;i++){
465 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
466 + sizeof(AliL3DigitRowData);
468 fwrite(row_pt,size,1,fOutBinary);
469 Byte_t *byte_pt =(Byte_t *) row_pt;
471 row_pt = (AliL3DigitRowData *) byte_pt;
473 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
474 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
475 <<nrow<<" Rows)"<<ENDLOG;
479 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
481 //Read inputfile into memory as is, and store it in data. No run-length encoding
485 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
486 <<"No Input File"<<ENDLOG;
490 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
491 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
495 AliL3DigitRowData *row_pt = data;
498 while(!feof(fInBinary)){
499 Byte_t *byte_pt =(Byte_t *) row_pt;
501 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
502 byte_pt += sizeof(AliL3DigitRowData);
503 outsize += sizeof(AliL3DigitRowData);
505 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
507 if(fread(byte_pt,size,1,fInBinary)!=1) break;
511 row_pt = (AliL3DigitRowData *) byte_pt;
515 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
516 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
517 <<rowcount<<" Rows)"<<ENDLOG;
521 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
522 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
524 data[ndata].fPad = pad;
525 data[ndata].fTime = time;
526 data[ndata].fCharge = charge;
530 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
532 data[ndata].fPad = fDPt[fNUsed]->fPad;
533 data[ndata].fTime = fDPt[fNUsed]->fTime;
534 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
539 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
540 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
542 data[ndata].fPad = pad;
543 data[ndata].fTime = time;
544 data[ndata].fCharge = charge;
545 while(ComparePoints(row,pad,time)==0){
546 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
547 if(charge>=AliL3Transform::GetADCSat()) ch = AliL3Transform::GetADCSat();
548 data[ndata].fCharge = ch;
554 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
555 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
558 while((action=ComparePoints(row,pad,time))==1){
559 AddRandom(data,ndata);
562 MergeDataRandom(data,ndata,row,pad,time,charge);
565 AddData(data,ndata,row,pad,time,charge);
569 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
570 UInt_t & subindex, UShort_t value)
572 UInt_t shift[3] = {0,10,20};
573 if(subindex==0) comp[index] =0; //clean up memory
574 comp[index] |= (value&0x03ff)<<shift[subindex];
582 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
584 UInt_t shift[3] = {0,10,20};
585 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
595 UShort_t AliL3MemHandler::Test(UInt_t *comp,
596 UInt_t index, UInt_t subindex)
598 UInt_t shift[3] = {0,10,20};
599 return (comp[index]>>shift[subindex])&0x03ff;
602 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
603 AliL3DigitRowData *data,UInt_t *comp)
605 //Performs run-length encoding on data stored in memory pointed to by data.
606 //The compressed data is written to comp.
608 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
609 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
613 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
614 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
617 AliL3DigitRowData *row_pt = data;
621 for(UInt_t i=0;i<nrow;i++){
622 UShort_t value = row_pt->fRow;
623 Write(comp,index,subindex,value);
627 for(Int_t d=0;d<200;d++) ddd[d]=0;
628 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
629 if(row_pt->fDigitData[dig].fPad <200){
630 ddd[row_pt->fDigitData[dig].fPad]++;
633 for(Int_t d=0;d<200;d++){
639 Write(comp,index,subindex,npad);
641 for(UShort_t pad=0;pad <= maxpad;pad++){
642 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
644 Write(comp,index,subindex,pad);
645 // write zero if time != 0
646 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
647 if(row_pt->fDigitData[digit].fTime>0){
648 Write(comp,index,subindex,0);
649 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
652 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
653 UShort_t charge = row_pt->fDigitData[digit].fCharge;
657 Write(comp,index,subindex,charge);
658 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
659 if(row_pt->fDigitData[digit].fTime +1 !=
660 row_pt->fDigitData[digit+1].fTime){
661 Write(comp,index,subindex,0);
662 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
663 (row_pt->fDigitData[digit].fTime +1);
664 Write(comp,index,subindex,nzero);
669 Write(comp,index,subindex,0);
670 Write(comp,index,subindex,0);
673 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
674 sizeof(AliL3DigitRowData);
675 Byte_t *byte_pt =(Byte_t *) row_pt;
677 row_pt = (AliL3DigitRowData *) byte_pt;
680 Write(comp,index,subindex,0);
681 return index * sizeof(UInt_t);
684 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
685 AliL3DigitRowData *data,UInt_t *comp)
687 //Uncompress the run-length encoded data in memory pointed to by comp, and
691 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
692 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
696 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
697 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
702 AliL3DigitRowData *row_pt = data;
706 for(UInt_t i=0;i<nrow;i++){
708 UInt_t row =Read(comp,index,subindex);
711 UShort_t npad = Read(comp,index,subindex);
712 for(UShort_t p=0;p<npad;p++){
715 UShort_t pad = Read(comp,index,subindex);
716 if(Test(comp,index,subindex)==0){
717 Read(comp,index,subindex);
718 if( (time = Read(comp,index,subindex)) == 0 ){
723 while( (charge=Read(comp,index,subindex)) != 0){
724 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
725 // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
726 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
729 UShort_t tshift = Read(comp,index,subindex);
730 if(tshift == 0) break;
734 row_pt->fNDigit = ndigit;
735 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
736 sizeof(AliL3DigitRowData);
737 Byte_t *byte_pt =(Byte_t *) row_pt;
740 row_pt = (AliL3DigitRowData *) byte_pt;
745 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
747 //Return the size of RLE data, after compressing data.
750 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
751 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
754 AliL3DigitRowData *row_pt = data;
757 for(UInt_t i=0;i<nrow;i++){
762 for(Int_t d=0;d<200;d++) ddd[d]=0;
763 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
764 if(row_pt->fDigitData[dig].fPad <200){
765 ddd[row_pt->fDigitData[dig].fPad]++;
768 for(Int_t d=0;d<200;d++){
776 for(UShort_t pad=0;pad <= maxpad;pad++){
777 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
780 // write zero if time != 0
781 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
782 if(row_pt->fDigitData[digit].fTime>0){
787 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
789 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
790 if(row_pt->fDigitData[digit].fTime +1 !=
791 row_pt->fDigitData[digit+1].fTime){
802 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
803 sizeof(AliL3DigitRowData);
804 Byte_t *byte_pt =(Byte_t *) row_pt;
806 row_pt = (AliL3DigitRowData *) byte_pt;
810 return (index/3) * sizeof(UInt_t);
813 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
815 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
816 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
824 for(UInt_t i=0;i<nrow;i++){
826 Read(comp,index,subindex);
827 UShort_t npad = Read(comp,index,subindex);
828 for(UShort_t p=0;p<npad;p++){
829 Read(comp,index,subindex);
830 if(Test(comp,index,subindex)==0){
831 Read(comp,index,subindex);
832 if(Read(comp,index,subindex)== 0) continue;
835 while(Read(comp,index,subindex)!=0) ndigit++;
836 if(Read(comp,index,subindex)==0) break;
839 Int_t size = sizeof(AliL3DigitData) * ndigit+
840 sizeof(AliL3DigitRowData);
847 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
850 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
851 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
858 while(index<size-1){ //don't start with last word
861 Read(comp,index,subindex);
862 UShort_t npad = Read(comp,index,subindex);
863 for(UShort_t p=0;p<npad;p++){
864 Read(comp,index,subindex);
865 if(Test(comp,index,subindex)==0){
866 Read(comp,index,subindex);
867 if(Read(comp,index,subindex)==0)continue;
870 while(Read(comp,index,subindex)!=0) ndigit++;
871 if(Read(comp,index,subindex)==0) break;
875 if(index==size-1){ //last word
877 if(Read(comp,index,subindex)!=0) nrow++;
883 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
886 //Write the RLE data in comp to the output file.
889 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
890 <<"No Output File"<<ENDLOG;
894 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
895 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
899 size=GetMemorySize(nrow,comp);
901 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
902 <<"Memory size = 0 "<<ENDLOG;
905 UInt_t length = size/sizeof(UInt_t);
906 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
907 fwrite(comp,size,1,fOutBinary);
911 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
913 //Read the RLE data from file, and store it in comp. No unpacking yet.
916 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
917 <<"No Output File"<<ENDLOG;
921 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
922 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
927 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
928 UInt_t size = length*sizeof(UInt_t);
929 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
930 // now find the number of dig
931 nrow = GetNRow(comp,size);
935 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
937 // Read the RLE inputfile, unpack it and return the pointer to it.
939 AliL3MemHandler * handler = new AliL3MemHandler();
940 handler->SetBinaryInput(fInBinary);
941 UInt_t *comp =(UInt_t *)handler->Allocate();
942 handler->CompBinary2CompMemory(nrow,comp);
943 UInt_t size = GetMemorySize(nrow,comp);
944 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
945 CompMemory2Memory(nrow,data,comp);
951 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
953 //Perform RLE on the data, and write it to the output file.
955 AliL3MemHandler * handler = new AliL3MemHandler();
956 UInt_t size = GetCompMemorySize(nrow,data);
957 UInt_t *comp =(UInt_t *)handler->Allocate(size);
958 Memory2CompMemory(nrow,data,comp);
959 CompMemory2CompBinary(nrow,comp,size);
966 ///////////////////////////////////////// Point IO
967 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
969 //Writing spacepoints stored in data to the outputfile.
971 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
972 <<"No Output File"<<ENDLOG;
976 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
977 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
980 UInt_t size = npoint*sizeof(AliL3SpacePointData);
981 fwrite(data,size,1,fOutBinary);
986 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,Int_t slice)
988 //Transform the space points in data, to global coordinates in slice.
990 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
991 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
995 for(UInt_t i=0;i<npoint;i++){
1000 AliL3Transform::Local2Global(xyz,slice);
1001 data[i].fX = xyz[0];
1002 data[i].fY = xyz[1];
1003 data[i].fZ = xyz[2];
1008 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1010 //Read the space points in inputfile, and store it in data.
1012 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1013 <<"No Input File"<<ENDLOG;
1017 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1018 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1022 Int_t size = GetFileSize();
1024 UInt_t size,slice,patch,row[2];
1025 AliL3EventDataTypeRoot datatype;
1027 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1028 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1029 <<"File Read Error "<<ENDLOG;
1032 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1033 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1034 <<"File Read Error "<<ENDLOG;
1037 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1038 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1039 <<"File Read Error "<<ENDLOG;
1042 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1043 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1044 <<"File Read Error "<<ENDLOG;
1047 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1048 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1049 <<"File Read Error "<<ENDLOG;
1052 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1053 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1054 <<"File Read Error "<<ENDLOG;
1058 npoint = size/sizeof(AliL3SpacePointData);
1059 if(fread(data,size,1,fInBinary)!=1){
1060 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1061 <<"File Read Error "<<ENDLOG;
1064 if(size%sizeof(AliL3SpacePointData)){
1065 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1066 <<"File Size wrong "<<ENDLOG;
1069 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1070 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1074 ///////////////////////////////////////// Track IO
1075 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1077 //Write the tracks stored in data, to outputfile.
1079 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1080 <<"No Output File"<<ENDLOG;
1084 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1085 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1088 AliL3TrackSegmentData *track_pt = data;
1089 for(UInt_t i=0;i<ntrack;i++){
1090 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1091 fwrite(track_pt,size,1,fOutBinary);
1092 Byte_t *byte_pt = (Byte_t*) track_pt;
1094 track_pt = (AliL3TrackSegmentData*) byte_pt;
1096 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1097 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1102 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1104 //Read the tracks in inputfile, and store it in data.
1107 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1108 <<"No Input File"<<ENDLOG;
1112 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1113 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1118 AliL3TrackSegmentData *track_pt = data;
1121 UInt_t size,slice,patch,row[2];
1122 AliL3EventDataTypeRoot datatype;
1124 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1125 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1126 <<"File Read Error "<<ENDLOG;
1129 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1130 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1131 <<"File Read Error "<<ENDLOG;
1134 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1135 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1136 <<"File Read Error "<<ENDLOG;
1139 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1140 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1141 <<"File Read Error "<<ENDLOG;
1144 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1145 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1146 <<"File Read Error "<<ENDLOG;
1149 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1150 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1151 <<"File Read Error "<<ENDLOG;
1155 while(!feof(fInBinary)){
1156 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1157 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1158 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1159 Byte_t *byte_pt = (Byte_t*) track_pt;
1160 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1161 track_pt = (AliL3TrackSegmentData*) byte_pt;
1164 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1165 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1169 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1171 //Write the trackarray to the outputfile.
1173 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1174 <<"No Output File"<<ENDLOG;
1178 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1179 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1182 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1185 TrackArray2Memory(ntrack,data,array);
1186 Memory2Binary(ntrack,data);
1191 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1193 //Read the tracks in inputfile, and fill it in trackarray.
1194 //array should already be constructed.
1196 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1197 <<"No Input File"<<ENDLOG;
1201 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1202 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1205 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1207 Binary2Memory(ntrack,data);
1208 Memory2TrackArray(ntrack,data,array);
1213 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1215 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1217 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1218 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1222 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1223 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1227 array->WriteTracks(ntrack,data);
1231 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1233 //Fill the tracks in data into trackarray.
1236 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1237 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1241 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1242 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1245 array->FillTracks(ntrack,data);
1249 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice)
1251 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1254 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1255 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1259 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1260 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1263 array->FillTracks(ntrack,data,slice);
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;