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 //_____________________________________________________________
25 // The L3 Binary File handler
28 // This class does all the memory I/O handling on raw binary files.
29 // For the moment the compressed binary files are run-length encoded, using
34 // 1) Reading a binary file:
36 // AliL3MemHandler file;
37 // file.SetBinaryInput(filename);
40 // AliL3DigitRowData *data = file.CompBinary2Memory(ndigits);
42 // for(int i=0; i<NumberOfRowsInPatch; i++)
45 // AliL3DigitData *dataPt = (AliL3DigitData*)data->fDigitData;
46 // for(int j=0; j<data->fNDigit; j++)
48 // pad = dataPt[j].fPad;
49 // time = dataPt[j].fTime;
50 // charge = dataPt[j].fCharge;
53 // file.UpdateRowPointer(data);
56 // file.CloseBinaryInput();
57 // ________________________
59 // 2) Writing a binary file:
61 // //First of all you need to store the data in memory,
62 // //and have a pointer to it of type AliL3DigitRowData.
63 // //E.g. if you just want to write the data you read in example 1)
64 // //into a new file, you can do the following:
66 // AliL3MemHandler newfile;
67 // newfile.SetBinaryOutput(newfilename);
68 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
69 // newfile.CloseBinaryOutput();
71 ClassImp(AliL3MemHandler)
73 AliL3MemHandler::AliL3MemHandler()
91 Int_t row[2] = {0,175};
97 AliL3MemHandler::~AliL3MemHandler()
100 if(fPt) delete[] fPt;
101 if(fDigits) delete [] fDigits;
102 if(fDPt) delete [] fDPt;
105 void AliL3MemHandler::ResetROI()
107 //Resets the Look-up table for Region of Interest mode.
109 for(Int_t i=fRowMin; i<=fRowMax; i++)
111 fEtaMinTimeBin[i] = 0;
112 fEtaMaxTimeBin[i] = 445;
117 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:
122 // eta[0] = mimium eta
123 // eta[1] = maximum eta
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)
172 //Set the input binary file.
174 fInBinary = fopen(name,"r");
176 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
177 <<"Error opening file "<<name<<ENDLOG;
183 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
185 //Set the input binary file.
189 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
190 <<"Pointer to File = 0x0 "<<ENDLOG;
196 void AliL3MemHandler::CloseBinaryInput()
198 //Close the input file.
201 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
202 <<"Nothing to Close"<<ENDLOG;
209 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
211 //Set the binary output file.
212 fOutBinary = fopen(name,"w");
214 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
215 <<"Pointer to File = 0x0 "<<ENDLOG;
221 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
223 //Set the binary output file.
227 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
228 <<"Pointer to File = 0x0 "<<ENDLOG;
234 void AliL3MemHandler::CloseBinaryOutput()
237 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
238 <<"Nothing to Close"<<ENDLOG;
246 UInt_t AliL3MemHandler::GetFileSize()
248 //Returns the file size in bytes of the input file.
251 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
252 <<"No Input File"<<ENDLOG;
255 fseek(fInBinary,0,SEEK_END);
256 UInt_t size = (UInt_t) ftell(fInBinary);
261 Byte_t *AliL3MemHandler::Allocate()
263 return Allocate(GetFileSize());
266 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
268 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
271 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
272 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
275 return Allocate(array->GetOutSize());
278 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
280 //Allocate memory of size in bytes.
283 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
284 <<"Delete Memory"<<ENDLOG;
287 fPt = new Byte_t[size];
290 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
291 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
295 void AliL3MemHandler::Free()
297 //Clear the memory, if allocated.
300 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
301 <<"No Memory allocated - can't Free"<<ENDLOG;
309 ///////////////////////////////////////// Random
310 void AliL3MemHandler::SetRandomSeed()
312 //If you are adding random data to the original data.
314 SetRandomSeed(time(tp));
317 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
319 //If you are adding random data to the original data.
322 fNRandom = maxnumber;
324 if(fDigits) delete [] fDigits;
325 fDigits = new AliL3RandomDigitData[fNRandom*9];
326 if(fDPt) delete [] fDPt;
327 fDPt = new AliL3RandomDigitData *[fNRandom*9];
330 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)
363 if (j - first < last - (j + 1)) {
365 first = j + 1; // QSort(j + 1, last);
367 QSort(a, j + 1, last);
368 last = j; // QSort(first, j);
373 UInt_t AliL3MemHandler::GetRandomSize()
376 for(Int_t r=fRowMin;r<=fRowMax;r++){
377 Int_t npad=fTransformer->GetNPads(r);
378 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
380 return 9 * nrandom * sizeof(AliL3DigitData);
383 void AliL3MemHandler::Generate(Int_t row)
385 //Generate random data on row, if you didn't ask for this, nothing happens here.
387 if(!IsRandom) return;
390 Int_t npad=fTransformer->GetNPads(row);
391 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
392 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
393 (Double_t) ntime/(Double_t) fTransformer->GetNTimeBins() );
395 for(Int_t n=0;n<nrandom;n++){
396 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
397 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
398 Int_t charge = (int)((float)rand()/RAND_MAX*1023);
399 DigitizePoint(row,pad,time,charge);
401 QSort(fDPt,0,fNDigits);
402 // for(Int_t d=0;d<fNDigits;d++)
403 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
404 // fDPt[d]->fTime,fDPt[d]->fCharge);
408 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
409 Int_t time,Int_t charge)
411 //Making one single random cluster.
412 for(Int_t j=-1;j<2;j++){
413 for(Int_t k=-1;k<2;k++){
414 Int_t dcharge = charge;
417 if(dcharge<10) continue;
418 Int_t dpad = j + pad;
419 Int_t dtime = k + time;
421 if(dpad<0||dpad>=fTransformer->GetNPads(row)) continue;
422 if(dtime<0||dtime>=fTransformer->GetNTimeBins()) continue;
424 fDigits[fNDigits].fCharge = dcharge;
425 fDigits[fNDigits].fRow = row;
426 fDigits[fNDigits].fPad = dpad;
427 fDigits[fNDigits].fTime = dtime;
428 fDPt[fNDigits] = &fDigits[fNDigits];
434 ///////////////////////////////////////// Digit IO
435 Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
437 //Write data to the outputfile as is. No run-length encoding is done.
440 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
441 <<"No Output File"<<ENDLOG;
445 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
446 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
450 AliL3DigitRowData *row_pt = data;
452 for(UInt_t i=0;i<nrow;i++){
453 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
454 + sizeof(AliL3DigitRowData);
456 fwrite(row_pt,size,1,fOutBinary);
457 Byte_t *byte_pt =(Byte_t *) row_pt;
459 row_pt = (AliL3DigitRowData *) byte_pt;
461 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
462 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
463 <<nrow<<" Rows)"<<ENDLOG;
467 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
469 //Read inputfile into memory as is, and store it in data. No run-length encoding
473 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
474 <<"No Input File"<<ENDLOG;
478 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
479 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
483 AliL3DigitRowData *row_pt = data;
486 while(!feof(fInBinary)){
487 Byte_t *byte_pt =(Byte_t *) row_pt;
489 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
490 byte_pt += sizeof(AliL3DigitRowData);
491 outsize += sizeof(AliL3DigitRowData);
493 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
495 if(fread(byte_pt,size,1,fInBinary)!=1) break;
499 row_pt = (AliL3DigitRowData *) byte_pt;
503 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
504 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
505 <<rowcount<<" Rows)"<<ENDLOG;
509 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
510 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
512 data[ndata].fPad = pad;
513 data[ndata].fTime = time;
514 data[ndata].fCharge = charge;
518 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
520 data[ndata].fPad = fDPt[fNUsed]->fPad;
521 data[ndata].fTime = fDPt[fNUsed]->fTime;
522 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
527 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
528 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
530 data[ndata].fPad = pad;
531 data[ndata].fTime = time;
532 data[ndata].fCharge = charge;
533 while(ComparePoints(row,pad,time)==0){
534 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
535 if(charge>1023) ch = 1023;
536 data[ndata].fCharge = ch;
542 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
543 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
546 while((action=ComparePoints(row,pad,time))==1){
547 AddRandom(data,ndata);
550 MergeDataRandom(data,ndata,row,pad,time,charge);
553 AddData(data,ndata,row,pad,time,charge);
557 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
558 UInt_t & subindex, UShort_t value)
560 UInt_t shift[3] = {0,10,20};
561 if(subindex==0) comp[index] =0; //clean up memory
562 comp[index] |= (value&0x03ff)<<shift[subindex];
570 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
572 UInt_t shift[3] = {0,10,20};
573 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
583 UShort_t AliL3MemHandler::Test(UInt_t *comp,
584 UInt_t index, UInt_t subindex)
586 UInt_t shift[3] = {0,10,20};
587 return (comp[index]>>shift[subindex])&0x03ff;
590 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
591 AliL3DigitRowData *data,UInt_t *comp)
593 //Performs run-length encoding on data stored in memory pointed to by data.
594 //The compressed data is written to comp.
596 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
597 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
601 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
602 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
605 AliL3DigitRowData *row_pt = data;
609 for(UInt_t i=0;i<nrow;i++){
610 UShort_t value = row_pt->fRow;
611 Write(comp,index,subindex,value);
615 for(Int_t d=0;d<200;d++) ddd[d]=0;
616 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
617 if(row_pt->fDigitData[dig].fPad <200){
618 ddd[row_pt->fDigitData[dig].fPad]++;
621 for(Int_t d=0;d<200;d++){
627 Write(comp,index,subindex,npad);
629 for(UShort_t pad=0;pad <= maxpad;pad++){
630 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
632 Write(comp,index,subindex,pad);
633 // write zero if time != 0
634 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
635 if(row_pt->fDigitData[digit].fTime>0){
636 Write(comp,index,subindex,0);
637 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
640 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
641 UShort_t charge = row_pt->fDigitData[digit].fCharge;
645 Write(comp,index,subindex,charge);
646 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
647 if(row_pt->fDigitData[digit].fTime +1 !=
648 row_pt->fDigitData[digit+1].fTime){
649 Write(comp,index,subindex,0);
650 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
651 (row_pt->fDigitData[digit].fTime +1);
652 Write(comp,index,subindex,nzero);
657 Write(comp,index,subindex,0);
658 Write(comp,index,subindex,0);
661 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
662 sizeof(AliL3DigitRowData);
663 Byte_t *byte_pt =(Byte_t *) row_pt;
665 row_pt = (AliL3DigitRowData *) byte_pt;
668 Write(comp,index,subindex,0);
669 return index * sizeof(UInt_t);
672 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
673 AliL3DigitRowData *data,UInt_t *comp)
675 //Uncompress the run-length encoded data in memory pointed to by comp, and
679 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
680 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
684 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
685 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
690 AliL3DigitRowData *row_pt = data;
694 for(UInt_t i=0;i<nrow;i++){
696 UInt_t row =Read(comp,index,subindex);
699 UShort_t npad = Read(comp,index,subindex);
700 for(UShort_t p=0;p<npad;p++){
703 UShort_t pad = Read(comp,index,subindex);
704 if(Test(comp,index,subindex)==0){
705 Read(comp,index,subindex);
706 if( (time = Read(comp,index,subindex)) == 0 ){
711 while( (charge=Read(comp,index,subindex)) != 0){
712 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
713 // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
714 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
717 UShort_t tshift = Read(comp,index,subindex);
718 if(tshift ==0) break;
722 row_pt->fNDigit = ndigit;
723 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
724 sizeof(AliL3DigitRowData);
725 Byte_t *byte_pt =(Byte_t *) row_pt;
728 row_pt = (AliL3DigitRowData *) byte_pt;
733 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
735 //Return the size of RLE data, after compressing data.
738 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
739 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
742 AliL3DigitRowData *row_pt = data;
745 for(UInt_t i=0;i<nrow;i++){
750 for(Int_t d=0;d<200;d++) ddd[d]=0;
751 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
752 if(row_pt->fDigitData[dig].fPad <200){
753 ddd[row_pt->fDigitData[dig].fPad]++;
756 for(Int_t d=0;d<200;d++){
764 for(UShort_t pad=0;pad <= maxpad;pad++){
765 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
768 // write zero if time != 0
769 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
770 if(row_pt->fDigitData[digit].fTime>0){
775 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
777 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
778 if(row_pt->fDigitData[digit].fTime +1 !=
779 row_pt->fDigitData[digit+1].fTime){
790 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
791 sizeof(AliL3DigitRowData);
792 Byte_t *byte_pt =(Byte_t *) row_pt;
794 row_pt = (AliL3DigitRowData *) byte_pt;
798 return (index/3) * sizeof(UInt_t);
801 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
803 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
804 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
812 for(UInt_t i=0;i<nrow;i++){
814 Read(comp,index,subindex);
815 UShort_t npad = Read(comp,index,subindex);
816 for(UShort_t p=0;p<npad;p++){
817 Read(comp,index,subindex);
818 if(Test(comp,index,subindex)==0){
819 Read(comp,index,subindex);
820 if(Read(comp,index,subindex)== 0) continue;
823 while(Read(comp,index,subindex)!=0) ndigit++;
824 if(Read(comp,index,subindex)==0) break;
827 Int_t size = sizeof(AliL3DigitData) * ndigit+
828 sizeof(AliL3DigitRowData);
835 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
838 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
839 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
846 while(index<size-1){ //don't start with last word
849 Read(comp,index,subindex);
850 UShort_t npad = Read(comp,index,subindex);
851 for(UShort_t p=0;p<npad;p++){
852 Read(comp,index,subindex);
853 if(Test(comp,index,subindex)==0){
854 Read(comp,index,subindex);
855 if(Read(comp,index,subindex)==0)continue;
858 while(Read(comp,index,subindex)!=0) ndigit++;
859 if(Read(comp,index,subindex)==0) break;
863 if(index==size-1){ //last word
865 if(Read(comp,index,subindex)!=0) nrow++;
871 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
874 //Write the RLE data in comp to the output file.
877 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
878 <<"No Output File"<<ENDLOG;
882 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
883 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
887 size=GetMemorySize(nrow,comp);
889 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
890 <<"Memory size = 0 "<<ENDLOG;
893 UInt_t length = size/sizeof(UInt_t);
894 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
895 fwrite(comp,size,1,fOutBinary);
899 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
901 //Read the RLE data from file, and store it in comp. No unpacking yet.
904 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
905 <<"No Output File"<<ENDLOG;
909 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
910 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
915 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
916 UInt_t size = length*sizeof(UInt_t);
917 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
918 // now find the number of dig
919 nrow = GetNRow(comp,size);
923 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
925 // Read the RLE inputfile, unpack it and return the pointer to it.
927 AliL3MemHandler * handler = new AliL3MemHandler();
928 handler->SetBinaryInput(fInBinary);
929 UInt_t *comp =(UInt_t *)handler->Allocate();
930 handler->CompBinary2CompMemory(nrow,comp);
931 UInt_t size = GetMemorySize(nrow,comp);
932 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
933 CompMemory2Memory(nrow,data,comp);
939 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
941 //Perform RLE on the data, and write it to the output file.
943 AliL3MemHandler * handler = new AliL3MemHandler();
944 UInt_t size = GetCompMemorySize(nrow,data);
945 UInt_t *comp =(UInt_t *)handler->Allocate(size);
946 Memory2CompMemory(nrow,data,comp);
947 CompMemory2CompBinary(nrow,comp,size);
954 ///////////////////////////////////////// Point IO
955 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
957 //Writing spacepoints stored in data to the outputfile.
959 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
960 <<"No Output File"<<ENDLOG;
964 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
965 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
968 UInt_t size = npoint*sizeof(AliL3SpacePointData);
969 fwrite(data,size,1,fOutBinary);
974 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,
975 Int_t slice, AliL3Transform* trans)
977 //Transform the space points in data, to global coordinates in slice.
979 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
980 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
984 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Object")
985 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
988 for(UInt_t i=0;i<npoint;i++){
993 trans->Local2Global(xyz,slice);
1001 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1003 //Read the space points in inputfile, and store it in data.
1005 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1006 <<"No Input File"<<ENDLOG;
1010 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1011 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1015 Int_t size = GetFileSize();
1017 UInt_t size,slice,patch,row[2];
1018 AliL3EventDataTypeRoot datatype;
1020 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1021 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1022 <<"File Read Error "<<ENDLOG;
1025 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1026 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1027 <<"File Read Error "<<ENDLOG;
1030 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1031 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1032 <<"File Read Error "<<ENDLOG;
1035 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1036 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1037 <<"File Read Error "<<ENDLOG;
1040 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1041 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1042 <<"File Read Error "<<ENDLOG;
1045 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1046 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1047 <<"File Read Error "<<ENDLOG;
1051 npoint = size/sizeof(AliL3SpacePointData);
1052 if(fread(data,size,1,fInBinary)!=1){
1053 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1054 <<"File Read Error "<<ENDLOG;
1057 if(size%sizeof(AliL3SpacePointData)){
1058 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1059 <<"File Size wrong "<<ENDLOG;
1062 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1063 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1067 ///////////////////////////////////////// Track IO
1068 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1070 //Write the tracks stored in data, to outputfile.
1072 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1073 <<"No Output File"<<ENDLOG;
1077 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1078 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1081 AliL3TrackSegmentData *track_pt = data;
1082 for(UInt_t i=0;i<ntrack;i++){
1083 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1084 fwrite(track_pt,size,1,fOutBinary);
1085 Byte_t *byte_pt = (Byte_t*) track_pt;
1087 track_pt = (AliL3TrackSegmentData*) byte_pt;
1089 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1090 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1095 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1097 //Read the tracks in inputfile, and store it in data.
1100 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1101 <<"No Input File"<<ENDLOG;
1105 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1106 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1111 AliL3TrackSegmentData *track_pt = data;
1114 UInt_t size,slice,patch,row[2];
1115 AliL3EventDataTypeRoot datatype;
1117 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1118 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1119 <<"File Read Error "<<ENDLOG;
1122 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1123 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1124 <<"File Read Error "<<ENDLOG;
1127 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1128 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1129 <<"File Read Error "<<ENDLOG;
1132 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1133 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1134 <<"File Read Error "<<ENDLOG;
1137 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1138 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1139 <<"File Read Error "<<ENDLOG;
1142 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1143 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1144 <<"File Read Error "<<ENDLOG;
1148 while(!feof(fInBinary)){
1149 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1150 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1151 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1152 Byte_t *byte_pt = (Byte_t*) track_pt;
1153 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1154 track_pt = (AliL3TrackSegmentData*) byte_pt;
1157 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1158 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1162 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1164 //Write the trackarray to the outputfile.
1166 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1167 <<"No Output File"<<ENDLOG;
1171 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1172 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1175 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1177 TrackArray2Memory(ntrack,data,array);
1178 Memory2Binary(ntrack,data);
1183 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1185 //Read the tracks in inputfile, and fill it in trackarray.
1186 //array should already be constructed.
1188 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1189 <<"No Input File"<<ENDLOG;
1193 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1194 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1197 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1199 Binary2Memory(ntrack,data);
1200 Memory2TrackArray(ntrack,data,array);
1205 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1207 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1209 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1210 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1214 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1215 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1218 array->WriteTracks(ntrack,data);
1222 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1224 //Fill the tracks in data into trackarray.
1227 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1228 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1232 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1233 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1236 array->FillTracks(ntrack,data);
1240 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice,
1241 AliL3Transform* trans)
1243 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1246 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1247 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1251 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1252 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1256 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Object")
1257 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
1260 array->FillTracks(ntrack,data,slice,trans);
1264 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1266 //Update the data pointer to the next padrow in memory.
1268 Byte_t *tmp = (Byte_t*)tempPt;
1269 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1271 tempPt = (AliL3DigitRowData*)tmp;