2 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>, Anders Vestbo <mailto:vestbo$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 "AliL3Logging.h"
16 #include "AliL3DigitData.h"
17 #include "AliL3TrackSegmentData.h"
18 #include "AliL3SpacePointData.h"
19 #include "AliL3TrackArray.h"
21 /** \class AliL3MemHandler
23 //_____________________________________________________________
26 // The HLT Binary File handler
28 // This class does all the memory I/O handling of HLT binary files.
33 // 1) Reading a binary file:
35 // AliL3MemHandler file;
36 // file.SetBinaryInput(filename);
39 // AliL3DigitRowData *data = file.CompBinary2Memory(nrowss);
41 // for(int i=0; i<nrows; i++)
44 // AliL3DigitData *dataPt = (AliL3DigitData*)data->fDigitData;
45 // for(int j=0; j<data->fNDigit; j++)
47 // pad = dataPt[j].fPad;
48 // time = dataPt[j].fTime;
49 // charge = dataPt[j].fCharge;
52 // file.UpdateRowPointer(data);
55 // file.CloseBinaryInput();
56 // ________________________
58 // 2) Writing a binary file:
60 // //First of all you need to store the data in memory,
61 // //and have a pointer to it of type AliL3DigitRowData.
62 // //E.g. if you just want to write the data you read in example 1)
63 // //into a new file, you can do the following:
65 // AliL3MemHandler newfile;
66 // newfile.SetBinaryOutput(newfilename);
67 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
68 // newfile.CloseBinaryOutput();
71 // Compressed file format:
72 // -----------------------
74 // The data is RLE encoded and currently using _10_ bit range for the ADC-values.
78 ClassImp(AliL3MemHandler)
80 AliL3MemHandler::AliL3MemHandler()
100 AliL3MemHandler::~AliL3MemHandler()
103 if(fPt) delete[] fPt;
104 if(fDigits) delete [] fDigits;
105 if(fDPt) delete [] fDPt;
108 void AliL3MemHandler::Init(Int_t s,Int_t p, Int_t *r=0)
115 fRowMin=AliL3Transform::GetFirstRow(p);
116 fRowMax=AliL3Transform::GetLastRow(p);
121 void AliL3MemHandler::ResetROI()
123 //Resets the Look-up table for Region of Interest mode.
125 for(Int_t i=fRowMin; i<=fRowMax; i++)
127 fEtaMinTimeBin[i] = 0;
128 fEtaMaxTimeBin[i] = 445;
132 void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice)
134 // Init the Look-up table for the Region of Interest mode.
135 // Here you can specify a certain etaregion, - all data
136 // outside this region will be discarded:
137 // eta[0] = mimium eta
138 // eta[1] = maximum eta
139 // slice[0] = mimumum slice
140 // slice[1] = maximum slice
145 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values")
146 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
147 for(Int_t i=fRowMin; i<=fRowMax; i++)
155 for(Int_t i=fRowMin; i<=fRowMax; i++)
160 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
162 xyz[0] = AliL3Transform::Row2X(i);
164 xyz[2] = xyz[0]/tan(thetamax);
165 AliL3Transform::Slice2Sector(fSlice,i,sector,row);
166 AliL3Transform::Local2Raw(xyz,sector,row);
168 fEtaMinTimeBin[i] = (Int_t)xyz[2];
171 fEtaMaxTimeBin[i] = 445;
174 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
175 xyz[0] = AliL3Transform::Row2X(i);
176 xyz[1] = AliL3Transform::GetMaxY(i);
177 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
178 xyz[2] = radii/tan(thetamin);
179 AliL3Transform::Local2Raw(xyz,sector,row);
180 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
186 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
188 //Set the input binary file.
190 fInBinary = fopen(name,"r");
192 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
193 <<"Error opening file "<<name<<ENDLOG;
199 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
201 //Set the input binary file.
205 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
206 <<"Pointer to File = 0x0 "<<ENDLOG;
212 void AliL3MemHandler::CloseBinaryInput()
214 //Close the input file.
217 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
218 <<"Nothing to Close"<<ENDLOG;
225 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
227 //Set the binary output file.
228 fOutBinary = fopen(name,"w");
230 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
231 <<"Pointer to File = 0x0 "<<ENDLOG;
237 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
239 //Set the binary output file.
243 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
244 <<"Pointer to File = 0x0 "<<ENDLOG;
250 void AliL3MemHandler::CloseBinaryOutput()
253 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
254 <<"Nothing to Close"<<ENDLOG;
261 UInt_t AliL3MemHandler::GetFileSize()
263 //Returns the file size in bytes of the input file.
266 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
267 <<"No Input File"<<ENDLOG;
270 fseek(fInBinary,0,SEEK_END);
271 UInt_t size = (UInt_t) ftell(fInBinary);
276 Byte_t *AliL3MemHandler::Allocate()
278 return Allocate(GetFileSize());
281 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
283 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
286 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
287 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
290 return Allocate(array->GetOutSize());
293 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
295 //Allocate memory of size in bytes.
298 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
299 <<"Delete Memory"<<ENDLOG;
302 fPt = new Byte_t[size];
305 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
306 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
310 void AliL3MemHandler::Free()
312 //Clear the memory, if allocated.
315 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
316 <<"No Memory allocated - can't Free"<<ENDLOG;
324 ///////////////////////////////////////// Random
325 void AliL3MemHandler::SetRandomSeed()
327 //If you are adding random data to the original data.
329 SetRandomSeed(time(tp));
332 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
334 //If you are adding random data to the original data.
337 fNRandom = maxnumber;
339 if(fDigits) delete [] fDigits;
340 fDigits = new AliL3RandomDigitData[fNRandom*9];
341 if(fDPt) delete [] fDPt;
342 fDPt = new AliL3RandomDigitData *[fNRandom*9];
345 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last){
347 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
348 // Uses CompareDigits() to compare objects.
351 static AliL3RandomDigitData *tmp;
352 static int i; // "static" to save stack space
355 while (last - first > 1) {
359 while (++i < last && CompareDigits(a[i], a[first]) < 0)
361 while (--j > first && CompareDigits(a[j], a[first]) > 0)
378 if (j - first < last - (j + 1)) {
380 first = j + 1; // QSort(j + 1, last);
382 QSort(a, j + 1, last);
383 last = j; // QSort(first, j);
388 UInt_t AliL3MemHandler::GetRandomSize()
391 for(Int_t r=fRowMin;r<=fRowMax;r++){
392 Int_t npad=AliL3Transform::GetNPads(r);
393 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
395 return 9 * nrandom * sizeof(AliL3DigitData);
398 void AliL3MemHandler::Generate(Int_t row)
400 //Generate random data on row, if you didn't ask for this, nothing happens here.
402 if(!IsRandom) return;
405 Int_t npad=AliL3Transform::GetNPads(row);
406 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
407 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
408 (Double_t) ntime/(Double_t) AliL3Transform::GetNTimeBins() );
410 for(Int_t n=0;n<nrandom;n++){
411 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
412 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
413 Int_t charge = (int)((float)rand()/RAND_MAX*1023);
414 DigitizePoint(row,pad,time,charge);
416 QSort(fDPt,0,fNDigits);
417 // for(Int_t d=0;d<fNDigits;d++)
418 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
419 // fDPt[d]->fTime,fDPt[d]->fCharge);
423 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
424 Int_t time,Int_t charge)
426 //Making one single random cluster.
427 for(Int_t j=-1;j<2;j++){
428 for(Int_t k=-1;k<2;k++){
429 Int_t dcharge = charge;
432 if(dcharge<10) continue;
433 Int_t dpad = j + pad;
434 Int_t dtime = k + time;
436 if(dpad<0||dpad>=AliL3Transform::GetNPads(row)) continue;
437 if(dtime<0||dtime>=AliL3Transform::GetNTimeBins()) continue;
439 fDigits[fNDigits].fCharge = dcharge;
440 fDigits[fNDigits].fRow = row;
441 fDigits[fNDigits].fPad = dpad;
442 fDigits[fNDigits].fTime = dtime;
443 fDPt[fNDigits] = &fDigits[fNDigits];
449 ///////////////////////////////////////// Digit IO
450 Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
452 //Write data to the outputfile as is. No run-length encoding is done.
455 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
456 <<"No Output File"<<ENDLOG;
460 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
461 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
465 AliL3DigitRowData *row_pt = data;
467 for(UInt_t i=0;i<nrow;i++){
468 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
469 + sizeof(AliL3DigitRowData);
471 fwrite(row_pt,size,1,fOutBinary);
472 Byte_t *byte_pt =(Byte_t *) row_pt;
474 row_pt = (AliL3DigitRowData *) byte_pt;
476 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
477 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
478 <<nrow<<" Rows)"<<ENDLOG;
482 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
484 //Read inputfile into memory as is, and store it in data. No run-length encoding
488 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
489 <<"No Input File"<<ENDLOG;
493 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
494 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
498 AliL3DigitRowData *row_pt = data;
501 while(!feof(fInBinary)){
502 Byte_t *byte_pt =(Byte_t *) row_pt;
504 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
505 byte_pt += sizeof(AliL3DigitRowData);
506 outsize += sizeof(AliL3DigitRowData);
508 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
510 if(fread(byte_pt,size,1,fInBinary)!=1) break;
514 row_pt = (AliL3DigitRowData *) byte_pt;
518 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
519 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
520 <<rowcount<<" Rows)"<<ENDLOG;
524 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
525 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
527 data[ndata].fPad = pad;
528 data[ndata].fTime = time;
529 data[ndata].fCharge = charge;
533 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
535 data[ndata].fPad = fDPt[fNUsed]->fPad;
536 data[ndata].fTime = fDPt[fNUsed]->fTime;
537 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
542 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
543 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
545 data[ndata].fPad = pad;
546 data[ndata].fTime = time;
547 data[ndata].fCharge = charge;
548 while(ComparePoints(row,pad,time)==0){
549 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
550 if(charge>1023) ch = 1023;
551 data[ndata].fCharge = ch;
557 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
558 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
561 while((action=ComparePoints(row,pad,time))==1){
562 AddRandom(data,ndata);
565 MergeDataRandom(data,ndata,row,pad,time,charge);
568 AddData(data,ndata,row,pad,time,charge);
572 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
573 UInt_t & subindex, UShort_t value)
575 UInt_t shift[3] = {0,10,20};
576 if(subindex==0) comp[index] =0; //clean up memory
577 comp[index] |= (value&0x03ff)<<shift[subindex];
585 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
587 UInt_t shift[3] = {0,10,20};
588 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
598 UShort_t AliL3MemHandler::Test(UInt_t *comp,
599 UInt_t index, UInt_t subindex)
601 UInt_t shift[3] = {0,10,20};
602 return (comp[index]>>shift[subindex])&0x03ff;
605 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
606 AliL3DigitRowData *data,UInt_t *comp)
608 //Performs run-length encoding on data stored in memory pointed to by data.
609 //The compressed data is written to comp.
611 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
612 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
616 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
617 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
620 AliL3DigitRowData *row_pt = data;
624 for(UInt_t i=0;i<nrow;i++){
625 UShort_t value = row_pt->fRow;
626 Write(comp,index,subindex,value);
630 for(Int_t d=0;d<200;d++) ddd[d]=0;
631 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
632 if(row_pt->fDigitData[dig].fPad <200){
633 ddd[row_pt->fDigitData[dig].fPad]++;
636 for(Int_t d=0;d<200;d++){
642 Write(comp,index,subindex,npad);
644 for(UShort_t pad=0;pad <= maxpad;pad++){
645 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
647 Write(comp,index,subindex,pad);
648 // write zero if time != 0
649 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
650 if(row_pt->fDigitData[digit].fTime>0){
651 Write(comp,index,subindex,0);
652 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
655 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
656 UShort_t charge = row_pt->fDigitData[digit].fCharge;
660 Write(comp,index,subindex,charge);
661 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
662 if(row_pt->fDigitData[digit].fTime +1 !=
663 row_pt->fDigitData[digit+1].fTime){
664 Write(comp,index,subindex,0);
665 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
666 (row_pt->fDigitData[digit].fTime +1);
667 Write(comp,index,subindex,nzero);
672 Write(comp,index,subindex,0);
673 Write(comp,index,subindex,0);
676 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
677 sizeof(AliL3DigitRowData);
678 Byte_t *byte_pt =(Byte_t *) row_pt;
680 row_pt = (AliL3DigitRowData *) byte_pt;
683 Write(comp,index,subindex,0);
684 return index * sizeof(UInt_t);
687 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
688 AliL3DigitRowData *data,UInt_t *comp)
690 //Uncompress the run-length encoded data in memory pointed to by comp, and
694 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
695 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
699 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
700 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
705 AliL3DigitRowData *row_pt = data;
709 for(UInt_t i=0;i<nrow;i++){
711 UInt_t row =Read(comp,index,subindex);
714 UShort_t npad = Read(comp,index,subindex);
715 for(UShort_t p=0;p<npad;p++){
718 UShort_t pad = Read(comp,index,subindex);
719 if(Test(comp,index,subindex)==0){
720 Read(comp,index,subindex);
721 if( (time = Read(comp,index,subindex)) == 0 ){
726 while( (charge=Read(comp,index,subindex)) != 0){
727 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
728 // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
729 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
732 UShort_t tshift = Read(comp,index,subindex);
733 if(tshift ==0) break;
737 row_pt->fNDigit = ndigit;
738 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
739 sizeof(AliL3DigitRowData);
740 Byte_t *byte_pt =(Byte_t *) row_pt;
743 row_pt = (AliL3DigitRowData *) byte_pt;
748 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
750 //Return the size of RLE data, after compressing data.
753 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
754 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
757 AliL3DigitRowData *row_pt = data;
760 for(UInt_t i=0;i<nrow;i++){
765 for(Int_t d=0;d<200;d++) ddd[d]=0;
766 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
767 if(row_pt->fDigitData[dig].fPad <200){
768 ddd[row_pt->fDigitData[dig].fPad]++;
771 for(Int_t d=0;d<200;d++){
779 for(UShort_t pad=0;pad <= maxpad;pad++){
780 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
783 // write zero if time != 0
784 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
785 if(row_pt->fDigitData[digit].fTime>0){
790 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
792 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
793 if(row_pt->fDigitData[digit].fTime +1 !=
794 row_pt->fDigitData[digit+1].fTime){
805 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
806 sizeof(AliL3DigitRowData);
807 Byte_t *byte_pt =(Byte_t *) row_pt;
809 row_pt = (AliL3DigitRowData *) byte_pt;
813 return (index/3) * sizeof(UInt_t);
816 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
818 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
819 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
827 for(UInt_t i=0;i<nrow;i++){
829 Read(comp,index,subindex);
830 UShort_t npad = Read(comp,index,subindex);
831 for(UShort_t p=0;p<npad;p++){
832 Read(comp,index,subindex);
833 if(Test(comp,index,subindex)==0){
834 Read(comp,index,subindex);
835 if(Read(comp,index,subindex)== 0) continue;
838 while(Read(comp,index,subindex)!=0) ndigit++;
839 if(Read(comp,index,subindex)==0) break;
842 Int_t size = sizeof(AliL3DigitData) * ndigit+
843 sizeof(AliL3DigitRowData);
850 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
853 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
854 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
861 while(index<size-1){ //don't start with last word
864 Read(comp,index,subindex);
865 UShort_t npad = Read(comp,index,subindex);
866 for(UShort_t p=0;p<npad;p++){
867 Read(comp,index,subindex);
868 if(Test(comp,index,subindex)==0){
869 Read(comp,index,subindex);
870 if(Read(comp,index,subindex)==0)continue;
873 while(Read(comp,index,subindex)!=0) ndigit++;
874 if(Read(comp,index,subindex)==0) break;
878 if(index==size-1){ //last word
880 if(Read(comp,index,subindex)!=0) nrow++;
886 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
889 //Write the RLE data in comp to the output file.
892 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
893 <<"No Output File"<<ENDLOG;
897 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
898 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
902 size=GetMemorySize(nrow,comp);
904 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
905 <<"Memory size = 0 "<<ENDLOG;
908 UInt_t length = size/sizeof(UInt_t);
909 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
910 fwrite(comp,size,1,fOutBinary);
914 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
916 //Read the RLE data from file, and store it in comp. No unpacking yet.
919 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
920 <<"No Output File"<<ENDLOG;
924 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
925 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
930 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
931 UInt_t size = length*sizeof(UInt_t);
932 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
933 // now find the number of dig
934 nrow = GetNRow(comp,size);
938 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
940 // Read the RLE inputfile, unpack it and return the pointer to it.
942 AliL3MemHandler * handler = new AliL3MemHandler();
943 handler->SetBinaryInput(fInBinary);
944 UInt_t *comp =(UInt_t *)handler->Allocate();
945 handler->CompBinary2CompMemory(nrow,comp);
946 UInt_t size = GetMemorySize(nrow,comp);
947 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
948 CompMemory2Memory(nrow,data,comp);
954 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
956 //Perform RLE on the data, and write it to the output file.
958 AliL3MemHandler * handler = new AliL3MemHandler();
959 UInt_t size = GetCompMemorySize(nrow,data);
960 UInt_t *comp =(UInt_t *)handler->Allocate(size);
961 Memory2CompMemory(nrow,data,comp);
962 CompMemory2CompBinary(nrow,comp,size);
969 ///////////////////////////////////////// Point IO
970 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
972 //Writing spacepoints stored in data to the outputfile.
974 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
975 <<"No Output File"<<ENDLOG;
979 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
980 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
983 UInt_t size = npoint*sizeof(AliL3SpacePointData);
984 fwrite(data,size,1,fOutBinary);
989 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,Int_t slice)
991 //Transform the space points in data, to global coordinates in slice.
993 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
994 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
998 for(UInt_t i=0;i<npoint;i++){
1000 xyz[0] = data[i].fX;
1001 xyz[1] = data[i].fY;
1002 xyz[2] = data[i].fZ;
1003 AliL3Transform::Local2Global(xyz,slice);
1004 data[i].fX = xyz[0];
1005 data[i].fY = xyz[1];
1006 data[i].fZ = xyz[2];
1011 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1013 //Read the space points in inputfile, and store it in data.
1015 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1016 <<"No Input File"<<ENDLOG;
1020 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1021 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1025 Int_t size = GetFileSize();
1027 UInt_t size,slice,patch,row[2];
1028 AliL3EventDataTypeRoot datatype;
1030 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1031 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1032 <<"File Read Error "<<ENDLOG;
1035 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1036 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1037 <<"File Read Error "<<ENDLOG;
1040 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1041 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1042 <<"File Read Error "<<ENDLOG;
1045 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1046 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1047 <<"File Read Error "<<ENDLOG;
1050 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1051 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1052 <<"File Read Error "<<ENDLOG;
1055 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1056 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1057 <<"File Read Error "<<ENDLOG;
1061 npoint = size/sizeof(AliL3SpacePointData);
1062 if(fread(data,size,1,fInBinary)!=1){
1063 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1064 <<"File Read Error "<<ENDLOG;
1067 if(size%sizeof(AliL3SpacePointData)){
1068 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1069 <<"File Size wrong "<<ENDLOG;
1072 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1073 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1077 ///////////////////////////////////////// Track IO
1078 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1080 //Write the tracks stored in data, to outputfile.
1082 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1083 <<"No Output File"<<ENDLOG;
1087 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1088 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1091 AliL3TrackSegmentData *track_pt = data;
1092 for(UInt_t i=0;i<ntrack;i++){
1093 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1094 fwrite(track_pt,size,1,fOutBinary);
1095 Byte_t *byte_pt = (Byte_t*) track_pt;
1097 track_pt = (AliL3TrackSegmentData*) byte_pt;
1099 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1100 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1105 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1107 //Read the tracks in inputfile, and store it in data.
1110 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1111 <<"No Input File"<<ENDLOG;
1115 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1116 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1121 AliL3TrackSegmentData *track_pt = data;
1124 UInt_t size,slice,patch,row[2];
1125 AliL3EventDataTypeRoot datatype;
1127 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1128 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1129 <<"File Read Error "<<ENDLOG;
1132 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1133 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1134 <<"File Read Error "<<ENDLOG;
1137 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1138 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1139 <<"File Read Error "<<ENDLOG;
1142 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1143 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1144 <<"File Read Error "<<ENDLOG;
1147 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1148 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1149 <<"File Read Error "<<ENDLOG;
1152 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1153 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1154 <<"File Read Error "<<ENDLOG;
1158 while(!feof(fInBinary)){
1159 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1160 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1161 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1162 Byte_t *byte_pt = (Byte_t*) track_pt;
1163 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1164 track_pt = (AliL3TrackSegmentData*) byte_pt;
1167 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1168 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1172 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1174 //Write the trackarray to the outputfile.
1176 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1177 <<"No Output File"<<ENDLOG;
1181 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1182 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1185 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1188 TrackArray2Memory(ntrack,data,array);
1189 Memory2Binary(ntrack,data);
1194 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1196 //Read the tracks in inputfile, and fill it in trackarray.
1197 //array should already be constructed.
1199 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1200 <<"No Input File"<<ENDLOG;
1204 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1205 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1208 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1210 Binary2Memory(ntrack,data);
1211 Memory2TrackArray(ntrack,data,array);
1216 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1218 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1220 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1221 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1225 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1226 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1230 array->WriteTracks(ntrack,data);
1234 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1236 //Fill the tracks in data into trackarray.
1239 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1240 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1244 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1245 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1248 array->FillTracks(ntrack,data);
1252 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice)
1254 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1257 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1258 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1262 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1263 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1266 array->FillTracks(ntrack,data,slice);
1270 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1272 //Update the data pointer to the next padrow in memory.
1274 Byte_t *tmp = (Byte_t*)tempPt;
1275 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1277 tempPt = (AliL3DigitRowData*)tmp;