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:
33 // AliL3MemHandler 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++)
45 // pad = dataPt[j].fPad;
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)
118 // Init the Look-up table for the Region of Interest mode.
119 // Here you can specify a certain etaregion, - all data
120 // outside this region will be discarded:
121 // eta[0] = mimium eta
122 // eta[1] = maximum eta
123 // slice[0] = mimumum slice
124 // slice[1] = maximum slice
128 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values")
129 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
130 for(Int_t i=fRowMin; i<=fRowMax; i++)
138 for(Int_t i=fRowMin; i<=fRowMax; i++)
143 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
145 xyz[0] = fTransformer->Row2X(i);
147 xyz[2] = xyz[0]/tan(thetamax);
148 fTransformer->Slice2Sector(fSlice,i,sector,row);
149 fTransformer->Local2Raw(xyz,sector,row);
151 fEtaMinTimeBin[i] = (Int_t)xyz[2];
154 fEtaMaxTimeBin[i] = 445;
157 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
158 xyz[0] = fTransformer->Row2X(i);
159 xyz[1] = fTransformer->GetMaxY(i);
160 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
161 xyz[2] = radii/tan(thetamin);
162 fTransformer->Local2Raw(xyz,sector,row);
163 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
169 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
171 //Set the input binary file.
173 fInBinary = fopen(name,"r");
175 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
176 <<"Error opening file "<<name<<ENDLOG;
182 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
184 //Set the input binary file.
188 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
189 <<"Pointer to File = 0x0 "<<ENDLOG;
195 void AliL3MemHandler::CloseBinaryInput()
197 //Close the input file.
200 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
201 <<"Nothing to Close"<<ENDLOG;
208 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
210 //Set the binary output file.
211 fOutBinary = fopen(name,"w");
213 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
214 <<"Pointer to File = 0x0 "<<ENDLOG;
220 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
222 //Set the binary output file.
226 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
227 <<"Pointer to File = 0x0 "<<ENDLOG;
233 void AliL3MemHandler::CloseBinaryOutput()
236 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
237 <<"Nothing to Close"<<ENDLOG;
245 UInt_t AliL3MemHandler::GetFileSize()
247 //Returns the file size in bytes of the input file.
250 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
251 <<"No Input File"<<ENDLOG;
254 fseek(fInBinary,0,SEEK_END);
255 UInt_t size = (UInt_t) ftell(fInBinary);
260 Byte_t *AliL3MemHandler::Allocate()
262 return Allocate(GetFileSize());
265 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
267 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
270 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
271 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
274 return Allocate(array->GetOutSize());
277 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
279 //Allocate memory of size in bytes.
282 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
283 <<"Delete Memory"<<ENDLOG;
286 fPt = new Byte_t[size];
289 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
290 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
294 void AliL3MemHandler::Free()
296 //Clear the memory, if allocated.
299 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
300 <<"No Memory allocated - can't Free"<<ENDLOG;
308 ///////////////////////////////////////// Random
309 void AliL3MemHandler::SetRandomSeed()
311 //If you are adding random data to the original data.
313 SetRandomSeed(time(tp));
316 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
318 //If you are adding random data to the original data.
321 fNRandom = maxnumber;
323 if(fDigits) delete [] fDigits;
324 fDigits = new AliL3RandomDigitData[fNRandom*9];
325 if(fDPt) delete [] fDPt;
326 fDPt = new AliL3RandomDigitData *[fNRandom*9];
329 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last)
332 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
333 // Uses CompareDigits() to compare objects.
336 static AliL3RandomDigitData *tmp;
337 static int i; // "static" to save stack space
340 while (last - first > 1) {
344 while (++i < last && CompareDigits(a[i], a[first]) < 0)
346 while (--j > first && CompareDigits(a[j], a[first]) > 0)
362 if (j - first < last - (j + 1)) {
364 first = j + 1; // QSort(j + 1, last);
366 QSort(a, j + 1, last);
367 last = j; // QSort(first, j);
372 UInt_t AliL3MemHandler::GetRandomSize()
375 for(Int_t r=fRowMin;r<=fRowMax;r++){
376 Int_t npad=fTransformer->GetNPads(r);
377 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
379 return 9 * nrandom * sizeof(AliL3DigitData);
382 void AliL3MemHandler::Generate(Int_t row)
384 //Generate random data on row, if you didn't ask for this, nothing happens here.
386 if(!IsRandom) return;
389 Int_t npad=fTransformer->GetNPads(row);
390 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
391 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
392 (Double_t) ntime/(Double_t) fTransformer->GetNTimeBins() );
394 for(Int_t n=0;n<nrandom;n++){
395 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
396 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
397 Int_t charge = (int)((float)rand()/RAND_MAX*1023);
398 DigitizePoint(row,pad,time,charge);
400 QSort(fDPt,0,fNDigits);
401 // for(Int_t d=0;d<fNDigits;d++)
402 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
403 // fDPt[d]->fTime,fDPt[d]->fCharge);
407 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
408 Int_t time,Int_t charge)
410 //Making one single random cluster.
411 for(Int_t j=-1;j<2;j++){
412 for(Int_t k=-1;k<2;k++){
413 Int_t dcharge = charge;
416 if(dcharge<10) continue;
417 Int_t dpad = j + pad;
418 Int_t dtime = k + time;
420 if(dpad<0||dpad>=fTransformer->GetNPads(row)) continue;
421 if(dtime<0||dtime>=fTransformer->GetNTimeBins()) continue;
423 fDigits[fNDigits].fCharge = dcharge;
424 fDigits[fNDigits].fRow = row;
425 fDigits[fNDigits].fPad = dpad;
426 fDigits[fNDigits].fTime = dtime;
427 fDPt[fNDigits] = &fDigits[fNDigits];
433 ///////////////////////////////////////// Digit IO
434 Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
436 //Write data to the outputfile as is. No run-length encoding is done.
439 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
440 <<"No Output File"<<ENDLOG;
444 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
445 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
449 AliL3DigitRowData *row_pt = data;
451 for(UInt_t i=0;i<nrow;i++){
452 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
453 + sizeof(AliL3DigitRowData);
455 fwrite(row_pt,size,1,fOutBinary);
456 Byte_t *byte_pt =(Byte_t *) row_pt;
458 row_pt = (AliL3DigitRowData *) byte_pt;
460 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
461 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
462 <<nrow<<" Rows)"<<ENDLOG;
466 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
468 //Read inputfile into memory as is, and store it in data. No run-length encoding
472 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
473 <<"No Input File"<<ENDLOG;
477 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
478 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
482 AliL3DigitRowData *row_pt = data;
485 while(!feof(fInBinary)){
486 Byte_t *byte_pt =(Byte_t *) row_pt;
488 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
489 byte_pt += sizeof(AliL3DigitRowData);
490 outsize += sizeof(AliL3DigitRowData);
492 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
494 if(fread(byte_pt,size,1,fInBinary)!=1) break;
498 row_pt = (AliL3DigitRowData *) byte_pt;
502 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
503 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
504 <<rowcount<<" Rows)"<<ENDLOG;
508 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
509 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
511 data[ndata].fPad = pad;
512 data[ndata].fTime = time;
513 data[ndata].fCharge = charge;
517 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
519 data[ndata].fPad = fDPt[fNUsed]->fPad;
520 data[ndata].fTime = fDPt[fNUsed]->fTime;
521 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
526 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
527 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
529 data[ndata].fPad = pad;
530 data[ndata].fTime = time;
531 data[ndata].fCharge = charge;
532 while(ComparePoints(row,pad,time)==0){
533 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
534 if(charge>1023) ch = 1023;
535 data[ndata].fCharge = ch;
541 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
542 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
545 while((action=ComparePoints(row,pad,time))==1){
546 AddRandom(data,ndata);
549 MergeDataRandom(data,ndata,row,pad,time,charge);
552 AddData(data,ndata,row,pad,time,charge);
556 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
557 UInt_t & subindex, UShort_t value)
559 UInt_t shift[3] = {0,10,20};
560 if(subindex==0) comp[index] =0; //clean up memory
561 comp[index] |= (value&0x03ff)<<shift[subindex];
569 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
571 UInt_t shift[3] = {0,10,20};
572 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
582 UShort_t AliL3MemHandler::Test(UInt_t *comp,
583 UInt_t index, UInt_t subindex)
585 UInt_t shift[3] = {0,10,20};
586 return (comp[index]>>shift[subindex])&0x03ff;
589 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
590 AliL3DigitRowData *data,UInt_t *comp)
592 //Performs run-length encoding on data stored in memory pointed to by data.
593 //The compressed data is written to comp.
595 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
596 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
600 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
601 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
604 AliL3DigitRowData *row_pt = data;
608 for(UInt_t i=0;i<nrow;i++){
609 UShort_t value = row_pt->fRow;
610 Write(comp,index,subindex,value);
614 for(Int_t d=0;d<200;d++) ddd[d]=0;
615 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
616 if(row_pt->fDigitData[dig].fPad <200){
617 ddd[row_pt->fDigitData[dig].fPad]++;
620 for(Int_t d=0;d<200;d++){
626 Write(comp,index,subindex,npad);
628 for(UShort_t pad=0;pad <= maxpad;pad++){
629 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
631 Write(comp,index,subindex,pad);
632 // write zero if time != 0
633 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
634 if(row_pt->fDigitData[digit].fTime>0){
635 Write(comp,index,subindex,0);
636 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
639 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
640 UShort_t charge = row_pt->fDigitData[digit].fCharge;
644 Write(comp,index,subindex,charge);
645 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
646 if(row_pt->fDigitData[digit].fTime +1 !=
647 row_pt->fDigitData[digit+1].fTime){
648 Write(comp,index,subindex,0);
649 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
650 (row_pt->fDigitData[digit].fTime +1);
651 Write(comp,index,subindex,nzero);
656 Write(comp,index,subindex,0);
657 Write(comp,index,subindex,0);
660 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
661 sizeof(AliL3DigitRowData);
662 Byte_t *byte_pt =(Byte_t *) row_pt;
664 row_pt = (AliL3DigitRowData *) byte_pt;
667 Write(comp,index,subindex,0);
668 return index * sizeof(UInt_t);
671 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
672 AliL3DigitRowData *data,UInt_t *comp)
674 //Uncompress the run-length encoded data in memory pointed to by comp, and
678 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
679 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
683 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
684 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
689 AliL3DigitRowData *row_pt = data;
693 for(UInt_t i=0;i<nrow;i++){
695 UInt_t row =Read(comp,index,subindex);
698 UShort_t npad = Read(comp,index,subindex);
699 for(UShort_t p=0;p<npad;p++){
702 UShort_t pad = Read(comp,index,subindex);
703 if(Test(comp,index,subindex)==0){
704 Read(comp,index,subindex);
705 if( (time = Read(comp,index,subindex)) == 0 ){
710 while( (charge=Read(comp,index,subindex)) != 0){
711 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
712 // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
713 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
716 UShort_t tshift = Read(comp,index,subindex);
717 if(tshift ==0) break;
721 row_pt->fNDigit = ndigit;
722 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
723 sizeof(AliL3DigitRowData);
724 Byte_t *byte_pt =(Byte_t *) row_pt;
727 row_pt = (AliL3DigitRowData *) byte_pt;
732 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
734 //Return the size of RLE data, after compressing data.
737 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
738 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
741 AliL3DigitRowData *row_pt = data;
744 for(UInt_t i=0;i<nrow;i++){
749 for(Int_t d=0;d<200;d++) ddd[d]=0;
750 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
751 if(row_pt->fDigitData[dig].fPad <200){
752 ddd[row_pt->fDigitData[dig].fPad]++;
755 for(Int_t d=0;d<200;d++){
763 for(UShort_t pad=0;pad <= maxpad;pad++){
764 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
767 // write zero if time != 0
768 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
769 if(row_pt->fDigitData[digit].fTime>0){
774 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
776 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
777 if(row_pt->fDigitData[digit].fTime +1 !=
778 row_pt->fDigitData[digit+1].fTime){
789 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
790 sizeof(AliL3DigitRowData);
791 Byte_t *byte_pt =(Byte_t *) row_pt;
793 row_pt = (AliL3DigitRowData *) byte_pt;
797 return (index/3) * sizeof(UInt_t);
800 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
802 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
803 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
811 for(UInt_t i=0;i<nrow;i++){
813 Read(comp,index,subindex);
814 UShort_t npad = Read(comp,index,subindex);
815 for(UShort_t p=0;p<npad;p++){
816 Read(comp,index,subindex);
817 if(Test(comp,index,subindex)==0){
818 Read(comp,index,subindex);
819 if(Read(comp,index,subindex)== 0) continue;
822 while(Read(comp,index,subindex)!=0) ndigit++;
823 if(Read(comp,index,subindex)==0) break;
826 Int_t size = sizeof(AliL3DigitData) * ndigit+
827 sizeof(AliL3DigitRowData);
834 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
837 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
838 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
845 while(index<size-1){ //don't start with last word
848 Read(comp,index,subindex);
849 UShort_t npad = Read(comp,index,subindex);
850 for(UShort_t p=0;p<npad;p++){
851 Read(comp,index,subindex);
852 if(Test(comp,index,subindex)==0){
853 Read(comp,index,subindex);
854 if(Read(comp,index,subindex)==0)continue;
857 while(Read(comp,index,subindex)!=0) ndigit++;
858 if(Read(comp,index,subindex)==0) break;
862 if(index==size-1){ //last word
864 if(Read(comp,index,subindex)!=0) nrow++;
870 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
873 //Write the RLE data in comp to the output file.
876 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
877 <<"No Output File"<<ENDLOG;
881 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
882 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
886 size=GetMemorySize(nrow,comp);
888 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
889 <<"Memory size = 0 "<<ENDLOG;
892 UInt_t length = size/sizeof(UInt_t);
893 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
894 fwrite(comp,size,1,fOutBinary);
898 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
900 //Read the RLE data from file, and store it in comp. No unpacking yet.
903 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
904 <<"No Output File"<<ENDLOG;
908 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
909 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
914 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
915 UInt_t size = length*sizeof(UInt_t);
916 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
917 // now find the number of dig
918 nrow = GetNRow(comp,size);
922 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
924 // Read the RLE inputfile, unpack it and return the pointer to it.
926 AliL3MemHandler * handler = new AliL3MemHandler();
927 handler->SetBinaryInput(fInBinary);
928 UInt_t *comp =(UInt_t *)handler->Allocate();
929 handler->CompBinary2CompMemory(nrow,comp);
930 UInt_t size = GetMemorySize(nrow,comp);
931 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
932 CompMemory2Memory(nrow,data,comp);
938 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
940 //Perform RLE on the data, and write it to the output file.
942 AliL3MemHandler * handler = new AliL3MemHandler();
943 UInt_t size = GetCompMemorySize(nrow,data);
944 UInt_t *comp =(UInt_t *)handler->Allocate(size);
945 Memory2CompMemory(nrow,data,comp);
946 CompMemory2CompBinary(nrow,comp,size);
953 ///////////////////////////////////////// Point IO
954 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
956 //Writing spacepoints stored in data to the outputfile.
958 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
959 <<"No Output File"<<ENDLOG;
963 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
964 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
967 UInt_t size = npoint*sizeof(AliL3SpacePointData);
968 fwrite(data,size,1,fOutBinary);
973 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,
974 Int_t slice, AliL3Transform* trans)
976 //Transform the space points in data, to global coordinates in slice.
978 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
979 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
983 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Object")
984 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
987 for(UInt_t i=0;i<npoint;i++){
992 trans->Local2Global(xyz,slice);
1000 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1002 //Read the space points in inputfile, and store it in data.
1004 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1005 <<"No Input File"<<ENDLOG;
1009 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1010 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1014 Int_t size = GetFileSize();
1016 UInt_t size,slice,patch,row[2];
1017 AliL3EventDataTypeRoot datatype;
1019 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1020 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1021 <<"File Read Error "<<ENDLOG;
1024 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1025 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1026 <<"File Read Error "<<ENDLOG;
1029 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1030 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1031 <<"File Read Error "<<ENDLOG;
1034 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1035 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1036 <<"File Read Error "<<ENDLOG;
1039 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1040 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1041 <<"File Read Error "<<ENDLOG;
1044 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1045 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1046 <<"File Read Error "<<ENDLOG;
1050 npoint = size/sizeof(AliL3SpacePointData);
1051 if(fread(data,size,1,fInBinary)!=1){
1052 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1053 <<"File Read Error "<<ENDLOG;
1056 if(size%sizeof(AliL3SpacePointData)){
1057 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1058 <<"File Size wrong "<<ENDLOG;
1061 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1062 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1066 ///////////////////////////////////////// Track IO
1067 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1069 //Write the tracks stored in data, to outputfile.
1071 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1072 <<"No Output File"<<ENDLOG;
1076 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1077 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1080 AliL3TrackSegmentData *track_pt = data;
1081 for(UInt_t i=0;i<ntrack;i++){
1082 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1083 fwrite(track_pt,size,1,fOutBinary);
1084 Byte_t *byte_pt = (Byte_t*) track_pt;
1086 track_pt = (AliL3TrackSegmentData*) byte_pt;
1088 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1089 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1094 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1096 //Read the tracks in inputfile, and store it in data.
1099 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1100 <<"No Input File"<<ENDLOG;
1104 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1105 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1110 AliL3TrackSegmentData *track_pt = data;
1113 UInt_t size,slice,patch,row[2];
1114 AliL3EventDataTypeRoot datatype;
1116 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1117 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1118 <<"File Read Error "<<ENDLOG;
1121 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1122 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1123 <<"File Read Error "<<ENDLOG;
1126 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1127 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1128 <<"File Read Error "<<ENDLOG;
1131 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1132 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1133 <<"File Read Error "<<ENDLOG;
1136 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1137 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1138 <<"File Read Error "<<ENDLOG;
1141 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1142 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1143 <<"File Read Error "<<ENDLOG;
1147 while(!feof(fInBinary)){
1148 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1149 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1150 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1151 Byte_t *byte_pt = (Byte_t*) track_pt;
1152 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1153 track_pt = (AliL3TrackSegmentData*) byte_pt;
1156 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1157 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1161 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1163 //Write the trackarray to the outputfile.
1165 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1166 <<"No Output File"<<ENDLOG;
1170 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1171 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1174 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1176 TrackArray2Memory(ntrack,data,array);
1177 Memory2Binary(ntrack,data);
1182 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1184 //Read the tracks in inputfile, and fill it in trackarray.
1185 //array should already be constructed.
1187 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1188 <<"No Input File"<<ENDLOG;
1192 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1193 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1196 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1198 Binary2Memory(ntrack,data);
1199 Memory2TrackArray(ntrack,data,array);
1204 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1206 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1208 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1209 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1213 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1214 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1217 array->WriteTracks(ntrack,data);
1221 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1223 //Fill the tracks in data into trackarray.
1226 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1227 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1231 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1232 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1235 array->FillTracks(ntrack,data);
1239 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice,
1240 AliL3Transform* trans)
1242 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1245 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1246 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1250 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1251 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1255 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Object")
1256 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
1259 array->FillTracks(ntrack,data,slice,trans);
1263 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1265 //Update the data pointer to the next padrow in memory.
1267 Byte_t *tmp = (Byte_t*)tempPt;
1268 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1270 tempPt = (AliL3DigitRowData*)tmp;