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"
23 //_____________________________________________________________
26 // The L3 Binary File handler
29 // This class does all the memory I/O handling on raw binary files.
30 // For the moment the compressed binary files are run-length encoded, using
35 // 1) Reading a binary file:
37 // AliL3MemHandler file;
38 // file.SetBinaryInput(filename);
41 // AliL3DigitRowData *data = file.CompBinary2Memory(ndigits);
43 // for(int i=0; i<NumberOfRowsInPatch; i++)
46 // AliL3DigitData *dataPt = (AliL3DigitData*)data->fDigitData;
47 // for(int j=0; j<data->fNDigit; j++)
49 // pad = dataPt[j].fPad;
50 // time = dataPt[j].fTime;
51 // charge = dataPt[j].fCharge;
54 // file.UpdateRowPointer(data);
57 // file.CloseBinaryInput();
58 // ________________________
60 // 2) Writing a binary file:
62 // //First of all you need to store the data in memory,
63 // //and have a pointer to it of type AliL3DigitRowData.
64 // //E.g. if you just want to write the data you read in example 1)
65 // //into a new file, you can do the following:
67 // AliL3MemHandler newfile;
68 // newfile.SetBinaryOutput(newfilename);
69 // newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
70 // newfile.CloseBinaryOutput();
72 ClassImp(AliL3MemHandler)
74 AliL3MemHandler::AliL3MemHandler()
92 Int_t row[2] = {0,175};
98 AliL3MemHandler::~AliL3MemHandler()
101 if(fPt) delete[] fPt;
102 if(fDigits) delete [] fDigits;
103 if(fDPt) delete [] fDPt;
106 void AliL3MemHandler::ResetROI()
108 //Resets the Look-up table for Region of Interest mode.
110 for(Int_t i=fRowMin; i<=fRowMax; i++)
112 fEtaMinTimeBin[i] = 0;
113 fEtaMaxTimeBin[i] = 445;
118 void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice)
120 // Init the Look-up table for the Region of Interest mode.
121 // Here you can specify a certain etaregion, - all data
122 // outside this region will be discarded:
123 // eta[0] = mimium eta
124 // eta[1] = maximum eta
125 // slice[0] = mimumum slice
126 // slice[1] = maximum slice
131 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values")
132 <<"Bad ROI parameters. IDIOT! "<<ENDLOG;
133 for(Int_t i=fRowMin; i<=fRowMax; i++)
141 for(Int_t i=fRowMin; i<=fRowMax; i++)
146 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
148 xyz[0] = fTransformer->Row2X(i);
150 xyz[2] = xyz[0]/tan(thetamax);
151 fTransformer->Slice2Sector(fSlice,i,sector,row);
152 fTransformer->Local2Raw(xyz,sector,row);
154 fEtaMinTimeBin[i] = (Int_t)xyz[2];
157 fEtaMaxTimeBin[i] = 445;
160 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
161 xyz[0] = fTransformer->Row2X(i);
162 xyz[1] = fTransformer->GetMaxY(i);
163 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
164 xyz[2] = radii/tan(thetamin);
165 fTransformer->Local2Raw(xyz,sector,row);
166 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
172 Bool_t AliL3MemHandler::SetBinaryInput(char *name)
174 //Set the input binary file.
176 fInBinary = fopen(name,"r");
178 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
179 <<"Error opening file "<<name<<ENDLOG;
185 Bool_t AliL3MemHandler::SetBinaryInput(FILE *file)
187 //Set the input binary file.
191 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryInput","File Open")
192 <<"Pointer to File = 0x0 "<<ENDLOG;
198 void AliL3MemHandler::CloseBinaryInput()
200 //Close the input file.
203 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryInput","File Close")
204 <<"Nothing to Close"<<ENDLOG;
211 Bool_t AliL3MemHandler::SetBinaryOutput(char *name)
213 //Set the binary output file.
214 fOutBinary = fopen(name,"w");
216 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
217 <<"Pointer to File = 0x0 "<<ENDLOG;
223 Bool_t AliL3MemHandler::SetBinaryOutput(FILE *file)
225 //Set the binary output file.
229 LOG(AliL3Log::kWarning,"AliL3MemHandler::SetBinaryOutput","File Open")
230 <<"Pointer to File = 0x0 "<<ENDLOG;
236 void AliL3MemHandler::CloseBinaryOutput()
239 LOG(AliL3Log::kWarning,"AliL3MemHandler::CloseBinaryOutPut","File Close")
240 <<"Nothing to Close"<<ENDLOG;
247 UInt_t AliL3MemHandler::GetFileSize()
249 //Returns the file size in bytes of the input file.
252 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetFileSize","File")
253 <<"No Input File"<<ENDLOG;
256 fseek(fInBinary,0,SEEK_END);
257 UInt_t size = (UInt_t) ftell(fInBinary);
262 Byte_t *AliL3MemHandler::Allocate()
264 return Allocate(GetFileSize());
267 Byte_t *AliL3MemHandler::Allocate(AliL3TrackArray *array)
269 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
272 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
273 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
276 return Allocate(array->GetOutSize());
279 Byte_t *AliL3MemHandler::Allocate(UInt_t size)
281 //Allocate memory of size in bytes.
284 LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory")
285 <<"Delete Memory"<<ENDLOG;
288 fPt = new Byte_t[size];
291 LOG(AliL3Log::kDebug,"AliL3MemHandler::Allocate","Memory")
292 <<AliL3Log::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
296 void AliL3MemHandler::Free()
298 //Clear the memory, if allocated.
301 LOG(AliL3Log::kWarning,"AliL3MemHandler::Free","Memory")
302 <<"No Memory allocated - can't Free"<<ENDLOG;
310 ///////////////////////////////////////// Random
311 void AliL3MemHandler::SetRandomSeed()
313 //If you are adding random data to the original data.
315 SetRandomSeed(time(tp));
318 void AliL3MemHandler::SetRandomCluster(Int_t maxnumber)
320 //If you are adding random data to the original data.
323 fNRandom = maxnumber;
325 if(fDigits) delete [] fDigits;
326 fDigits = new AliL3RandomDigitData[fNRandom*9];
327 if(fDPt) delete [] fDPt;
328 fDPt = new AliL3RandomDigitData *[fNRandom*9];
331 void AliL3MemHandler::QSort(AliL3RandomDigitData **a, Int_t first, Int_t last){
333 // Sort array of AliL3RandomDigitData pointers using a quicksort algorithm.
334 // Uses CompareDigits() to compare objects.
337 static AliL3RandomDigitData *tmp;
338 static int i; // "static" to save stack space
341 while (last - first > 1) {
345 while (++i < last && CompareDigits(a[i], a[first]) < 0)
347 while (--j > first && CompareDigits(a[j], a[first]) > 0)
364 if (j - first < last - (j + 1)) {
366 first = j + 1; // QSort(j + 1, last);
368 QSort(a, j + 1, last);
369 last = j; // QSort(first, j);
374 UInt_t AliL3MemHandler::GetRandomSize()
377 for(Int_t r=fRowMin;r<=fRowMax;r++){
378 Int_t npad=fTransformer->GetNPads(r);
379 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
381 return 9 * nrandom * sizeof(AliL3DigitData);
384 void AliL3MemHandler::Generate(Int_t row)
386 //Generate random data on row, if you didn't ask for this, nothing happens here.
388 if(!IsRandom) return;
391 Int_t npad=fTransformer->GetNPads(row);
392 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
393 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
394 (Double_t) ntime/(Double_t) fTransformer->GetNTimeBins() );
396 for(Int_t n=0;n<nrandom;n++){
397 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
398 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
399 Int_t charge = (int)((float)rand()/RAND_MAX*1023);
400 DigitizePoint(row,pad,time,charge);
402 QSort(fDPt,0,fNDigits);
403 // for(Int_t d=0;d<fNDigits;d++)
404 // fprintf(stderr,"%d %d %d %d\n",fDPt[d]->fRow,fDPt[d]->fPad,
405 // fDPt[d]->fTime,fDPt[d]->fCharge);
409 void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad,
410 Int_t time,Int_t charge)
412 //Making one single random cluster.
413 for(Int_t j=-1;j<2;j++){
414 for(Int_t k=-1;k<2;k++){
415 Int_t dcharge = charge;
418 if(dcharge<10) continue;
419 Int_t dpad = j + pad;
420 Int_t dtime = k + time;
422 if(dpad<0||dpad>=fTransformer->GetNPads(row)) continue;
423 if(dtime<0||dtime>=fTransformer->GetNTimeBins()) continue;
425 fDigits[fNDigits].fCharge = dcharge;
426 fDigits[fNDigits].fRow = row;
427 fDigits[fNDigits].fPad = dpad;
428 fDigits[fNDigits].fTime = dtime;
429 fDPt[fNDigits] = &fDigits[fNDigits];
435 ///////////////////////////////////////// Digit IO
436 Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data)
438 //Write data to the outputfile as is. No run-length encoding is done.
441 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
442 <<"No Output File"<<ENDLOG;
446 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
447 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
451 AliL3DigitRowData *row_pt = data;
453 for(UInt_t i=0;i<nrow;i++){
454 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit
455 + sizeof(AliL3DigitRowData);
457 fwrite(row_pt,size,1,fOutBinary);
458 Byte_t *byte_pt =(Byte_t *) row_pt;
460 row_pt = (AliL3DigitRowData *) byte_pt;
462 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory")
463 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
464 <<nrow<<" Rows)"<<ENDLOG;
468 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data)
470 //Read inputfile into memory as is, and store it in data. No run-length encoding
474 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
475 <<"No Input File"<<ENDLOG;
479 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
480 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
484 AliL3DigitRowData *row_pt = data;
487 while(!feof(fInBinary)){
488 Byte_t *byte_pt =(Byte_t *) row_pt;
490 if(fread(row_pt,sizeof(AliL3DigitRowData),1,fInBinary)!=1) break;
491 byte_pt += sizeof(AliL3DigitRowData);
492 outsize += sizeof(AliL3DigitRowData);
494 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit;
496 if(fread(byte_pt,size,1,fInBinary)!=1) break;
500 row_pt = (AliL3DigitRowData *) byte_pt;
504 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","Memory")
505 <<AliL3Log::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
506 <<rowcount<<" Rows)"<<ENDLOG;
510 void AliL3MemHandler::AddData(AliL3DigitData *data,UInt_t & ndata,
511 UInt_t row,UShort_t pad,UShort_t time,UShort_t charge)
513 data[ndata].fPad = pad;
514 data[ndata].fTime = time;
515 data[ndata].fCharge = charge;
519 void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata)
521 data[ndata].fPad = fDPt[fNUsed]->fPad;
522 data[ndata].fTime = fDPt[fNUsed]->fTime;
523 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
528 void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata,
529 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
531 data[ndata].fPad = pad;
532 data[ndata].fTime = time;
533 data[ndata].fCharge = charge;
534 while(ComparePoints(row,pad,time)==0){
535 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
536 if(charge>1023) ch = 1023;
537 data[ndata].fCharge = ch;
543 void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata,
544 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
547 while((action=ComparePoints(row,pad,time))==1){
548 AddRandom(data,ndata);
551 MergeDataRandom(data,ndata,row,pad,time,charge);
554 AddData(data,ndata,row,pad,time,charge);
558 void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index,
559 UInt_t & subindex, UShort_t value)
561 UInt_t shift[3] = {0,10,20};
562 if(subindex==0) comp[index] =0; //clean up memory
563 comp[index] |= (value&0x03ff)<<shift[subindex];
571 UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex)
573 UInt_t shift[3] = {0,10,20};
574 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
584 UShort_t AliL3MemHandler::Test(UInt_t *comp,
585 UInt_t index, UInt_t subindex)
587 UInt_t shift[3] = {0,10,20};
588 return (comp[index]>>shift[subindex])&0x03ff;
591 Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow,
592 AliL3DigitRowData *data,UInt_t *comp)
594 //Performs run-length encoding on data stored in memory pointed to by data.
595 //The compressed data is written to comp.
597 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
598 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
602 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory")
603 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
606 AliL3DigitRowData *row_pt = data;
610 for(UInt_t i=0;i<nrow;i++){
611 UShort_t value = row_pt->fRow;
612 Write(comp,index,subindex,value);
616 for(Int_t d=0;d<200;d++) ddd[d]=0;
617 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
618 if(row_pt->fDigitData[dig].fPad <200){
619 ddd[row_pt->fDigitData[dig].fPad]++;
622 for(Int_t d=0;d<200;d++){
628 Write(comp,index,subindex,npad);
630 for(UShort_t pad=0;pad <= maxpad;pad++){
631 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
633 Write(comp,index,subindex,pad);
634 // write zero if time != 0
635 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
636 if(row_pt->fDigitData[digit].fTime>0){
637 Write(comp,index,subindex,0);
638 Write(comp,index,subindex,row_pt->fDigitData[digit].fTime);
641 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
642 UShort_t charge = row_pt->fDigitData[digit].fCharge;
646 Write(comp,index,subindex,charge);
647 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
648 if(row_pt->fDigitData[digit].fTime +1 !=
649 row_pt->fDigitData[digit+1].fTime){
650 Write(comp,index,subindex,0);
651 UShort_t nzero = row_pt->fDigitData[digit+1].fTime -
652 (row_pt->fDigitData[digit].fTime +1);
653 Write(comp,index,subindex,nzero);
658 Write(comp,index,subindex,0);
659 Write(comp,index,subindex,0);
662 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
663 sizeof(AliL3DigitRowData);
664 Byte_t *byte_pt =(Byte_t *) row_pt;
666 row_pt = (AliL3DigitRowData *) byte_pt;
669 Write(comp,index,subindex,0);
670 return index * sizeof(UInt_t);
673 Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow,
674 AliL3DigitRowData *data,UInt_t *comp)
676 //Uncompress the run-length encoded data in memory pointed to by comp, and
680 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
681 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
685 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2Memory","Memory")
686 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
691 AliL3DigitRowData *row_pt = data;
695 for(UInt_t i=0;i<nrow;i++){
697 UInt_t row =Read(comp,index,subindex);
700 UShort_t npad = Read(comp,index,subindex);
701 for(UShort_t p=0;p<npad;p++){
704 UShort_t pad = Read(comp,index,subindex);
705 if(Test(comp,index,subindex)==0){
706 Read(comp,index,subindex);
707 if( (time = Read(comp,index,subindex)) == 0 ){
712 while( (charge=Read(comp,index,subindex)) != 0){
713 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
714 // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge);
715 AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge);
718 UShort_t tshift = Read(comp,index,subindex);
719 if(tshift ==0) break;
723 row_pt->fNDigit = ndigit;
724 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
725 sizeof(AliL3DigitRowData);
726 Byte_t *byte_pt =(Byte_t *) row_pt;
729 row_pt = (AliL3DigitRowData *) byte_pt;
734 UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data)
736 //Return the size of RLE data, after compressing data.
739 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory")
740 <<"Pointer to AliL3DigitRowData = 0x0 "<<ENDLOG;
743 AliL3DigitRowData *row_pt = data;
746 for(UInt_t i=0;i<nrow;i++){
751 for(Int_t d=0;d<200;d++) ddd[d]=0;
752 for(UInt_t dig=0;dig<row_pt->fNDigit;dig++){
753 if(row_pt->fDigitData[dig].fPad <200){
754 ddd[row_pt->fDigitData[dig].fPad]++;
757 for(Int_t d=0;d<200;d++){
765 for(UShort_t pad=0;pad <= maxpad;pad++){
766 if(digit>=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad)
769 // write zero if time != 0
770 if(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
771 if(row_pt->fDigitData[digit].fTime>0){
776 while(digit<row_pt->fNDigit && row_pt->fDigitData[digit].fPad == pad){
778 if(digit+1<row_pt->fNDigit&&row_pt->fDigitData[digit+1].fPad == pad){
779 if(row_pt->fDigitData[digit].fTime +1 !=
780 row_pt->fDigitData[digit+1].fTime){
791 Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+
792 sizeof(AliL3DigitRowData);
793 Byte_t *byte_pt =(Byte_t *) row_pt;
795 row_pt = (AliL3DigitRowData *) byte_pt;
799 return (index/3) * sizeof(UInt_t);
802 UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){
804 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetMemorySize","Memory")
805 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
813 for(UInt_t i=0;i<nrow;i++){
815 Read(comp,index,subindex);
816 UShort_t npad = Read(comp,index,subindex);
817 for(UShort_t p=0;p<npad;p++){
818 Read(comp,index,subindex);
819 if(Test(comp,index,subindex)==0){
820 Read(comp,index,subindex);
821 if(Read(comp,index,subindex)== 0) continue;
824 while(Read(comp,index,subindex)!=0) ndigit++;
825 if(Read(comp,index,subindex)==0) break;
828 Int_t size = sizeof(AliL3DigitData) * ndigit+
829 sizeof(AliL3DigitRowData);
836 UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size)
839 LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory")
840 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
847 while(index<size-1){ //don't start with last word
850 Read(comp,index,subindex);
851 UShort_t npad = Read(comp,index,subindex);
852 for(UShort_t p=0;p<npad;p++){
853 Read(comp,index,subindex);
854 if(Test(comp,index,subindex)==0){
855 Read(comp,index,subindex);
856 if(Read(comp,index,subindex)==0)continue;
859 while(Read(comp,index,subindex)!=0) ndigit++;
860 if(Read(comp,index,subindex)==0) break;
864 if(index==size-1){ //last word
866 if(Read(comp,index,subindex)!=0) nrow++;
872 Bool_t AliL3MemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
875 //Write the RLE data in comp to the output file.
878 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","File")
879 <<"No Output File"<<ENDLOG;
883 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
884 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
888 size=GetMemorySize(nrow,comp);
890 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompMemory2CompBinary","Memory")
891 <<"Memory size = 0 "<<ENDLOG;
894 UInt_t length = size/sizeof(UInt_t);
895 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
896 fwrite(comp,size,1,fOutBinary);
900 Bool_t AliL3MemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
902 //Read the RLE data from file, and store it in comp. No unpacking yet.
905 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","File")
906 <<"No Output File"<<ENDLOG;
910 LOG(AliL3Log::kWarning,"AliL3MemHandler::CompBinary2CompMemory","Memory")
911 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
916 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
917 UInt_t size = length*sizeof(UInt_t);
918 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
919 // now find the number of dig
920 nrow = GetNRow(comp,size);
924 AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow)
926 // Read the RLE inputfile, unpack it and return the pointer to it.
928 AliL3MemHandler * handler = new AliL3MemHandler();
929 handler->SetBinaryInput(fInBinary);
930 UInt_t *comp =(UInt_t *)handler->Allocate();
931 handler->CompBinary2CompMemory(nrow,comp);
932 UInt_t size = GetMemorySize(nrow,comp);
933 AliL3DigitRowData *data = (AliL3DigitRowData *)Allocate(size);
934 CompMemory2Memory(nrow,data,comp);
940 Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data)
942 //Perform RLE on the data, and write it to the output file.
944 AliL3MemHandler * handler = new AliL3MemHandler();
945 UInt_t size = GetCompMemorySize(nrow,data);
946 UInt_t *comp =(UInt_t *)handler->Allocate(size);
947 Memory2CompMemory(nrow,data,comp);
948 CompMemory2CompBinary(nrow,comp,size);
955 ///////////////////////////////////////// Point IO
956 Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data)
958 //Writing spacepoints stored in data to the outputfile.
960 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
961 <<"No Output File"<<ENDLOG;
965 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
966 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
969 UInt_t size = npoint*sizeof(AliL3SpacePointData);
970 fwrite(data,size,1,fOutBinary);
975 Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data,
976 Int_t slice, AliL3Transform* trans)
978 //Transform the space points in data, to global coordinates in slice.
980 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Memory")
981 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
985 LOG(AliL3Log::kWarning,"AliL3MemHandler::Transform","Object")
986 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
989 for(UInt_t i=0;i<npoint;i++){
994 trans->Local2Global(xyz,slice);
1002 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data)
1004 //Read the space points in inputfile, and store it in data.
1006 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1007 <<"No Input File"<<ENDLOG;
1011 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1012 <<"Pointer to AliL3SpacePointData = 0x0 "<<ENDLOG;
1016 Int_t size = GetFileSize();
1018 UInt_t size,slice,patch,row[2];
1019 AliL3EventDataTypeRoot datatype;
1021 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1022 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1023 <<"File Read Error "<<ENDLOG;
1026 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1027 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1028 <<"File Read Error "<<ENDLOG;
1031 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1032 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1033 <<"File Read Error "<<ENDLOG;
1036 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1037 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1038 <<"File Read Error "<<ENDLOG;
1041 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1042 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1043 <<"File Read Error "<<ENDLOG;
1046 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1047 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1048 <<"File Read Error "<<ENDLOG;
1052 npoint = size/sizeof(AliL3SpacePointData);
1053 if(fread(data,size,1,fInBinary)!=1){
1054 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1055 <<"File Read Error "<<ENDLOG;
1058 if(size%sizeof(AliL3SpacePointData)){
1059 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File Size")
1060 <<"File Size wrong "<<ENDLOG;
1063 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1064 <<AliL3Log::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1068 ///////////////////////////////////////// Track IO
1069 Bool_t AliL3MemHandler::Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data)
1071 //Write the tracks stored in data, to outputfile.
1073 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File")
1074 <<"No Output File"<<ENDLOG;
1078 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","Memory")
1079 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1082 AliL3TrackSegmentData *track_pt = data;
1083 for(UInt_t i=0;i<ntrack;i++){
1084 Int_t size=sizeof(AliL3TrackSegmentData)+track_pt->fNPoints*sizeof(UInt_t);
1085 fwrite(track_pt,size,1,fOutBinary);
1086 Byte_t *byte_pt = (Byte_t*) track_pt;
1088 track_pt = (AliL3TrackSegmentData*) byte_pt;
1090 LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","File")
1091 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1096 Bool_t AliL3MemHandler::Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data)
1098 //Read the tracks in inputfile, and store it in data.
1101 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File")
1102 <<"No Input File"<<ENDLOG;
1106 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","Memory")
1107 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1112 AliL3TrackSegmentData *track_pt = data;
1115 UInt_t size,slice,patch,row[2];
1116 AliL3EventDataTypeRoot datatype;
1118 if(fread(&datatype,sizeof(AliL3EventDataTypeRoot),1,fInBinary)!=1){
1119 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1120 <<"File Read Error "<<ENDLOG;
1123 if(fread(&node,sizeof(UInt_t),1,fInBinary)!=1){
1124 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1125 <<"File Read Error "<<ENDLOG;
1128 if(fread(&size,sizeof(UInt_t),1,fInBinary)!=1){
1129 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1130 <<"File Read Error "<<ENDLOG;
1133 if(fread(&slice,sizeof(UInt_t),1,fInBinary)!=1){
1134 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1135 <<"File Read Error "<<ENDLOG;
1138 if(fread(&patch,sizeof(UInt_t),1,fInBinary)!=1){
1139 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1140 <<"File Read Error "<<ENDLOG;
1143 if(fread(row,2*sizeof(UInt_t),1,fInBinary)!=1){
1144 LOG(AliL3Log::kFatal,"AliL3MemHandler::Binary2Memory","File")
1145 <<"File Read Error "<<ENDLOG;
1149 while(!feof(fInBinary)){
1150 if(fread(track_pt,sizeof(AliL3TrackSegmentData),1,fInBinary)!=1) break;
1151 Int_t size=track_pt->fNPoints*sizeof(UInt_t);
1152 if(fread(track_pt->fPointIDs,size,1,fInBinary)!=1) break;
1153 Byte_t *byte_pt = (Byte_t*) track_pt;
1154 byte_pt += sizeof(AliL3TrackSegmentData)+size;
1155 track_pt = (AliL3TrackSegmentData*) byte_pt;
1158 LOG(AliL3Log::kDebug,"AliL3MemHandler::Binary2Memory","File")
1159 <<AliL3Log::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1163 Bool_t AliL3MemHandler::TrackArray2Binary(AliL3TrackArray *array)
1165 //Write the trackarray to the outputfile.
1167 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","File")
1168 <<"No Output File"<<ENDLOG;
1172 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Binary","Memory")
1173 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1176 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate(array);
1178 TrackArray2Memory(ntrack,data,array);
1179 Memory2Binary(ntrack,data);
1184 Bool_t AliL3MemHandler::Binary2TrackArray(AliL3TrackArray *array)
1186 //Read the tracks in inputfile, and fill it in trackarray.
1187 //array should already be constructed.
1189 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","File")
1190 <<"No Input File"<<ENDLOG;
1194 LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2TrackArray","Memory")
1195 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1198 AliL3TrackSegmentData *data = (AliL3TrackSegmentData *)Allocate();
1200 Binary2Memory(ntrack,data);
1201 Memory2TrackArray(ntrack,data,array);
1206 Bool_t AliL3MemHandler::TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1208 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1210 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1211 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1215 LOG(AliL3Log::kWarning,"AliL3MemHandler::TrackArray2Memory","Memory")
1216 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1219 array->WriteTracks(ntrack,data);
1223 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array)
1225 //Fill the tracks in data into trackarray.
1228 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1229 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1233 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1234 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1237 array->FillTracks(ntrack,data);
1241 Bool_t AliL3MemHandler::Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,AliL3TrackArray *array,Int_t slice,
1242 AliL3Transform* trans)
1244 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1247 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1248 <<"Pointer to AliL3TrackSegmentData = 0x0 "<<ENDLOG;
1252 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Memory")
1253 <<"Pointer to AliL3TrackArray = 0x0 "<<ENDLOG;
1257 LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2TrackArray","Object")
1258 <<"Pointer to AliL3Transform = 0x0 "<<ENDLOG;
1261 array->FillTracks(ntrack,data,slice,trans);
1265 void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt)
1267 //Update the data pointer to the next padrow in memory.
1269 Byte_t *tmp = (Byte_t*)tempPt;
1270 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
1272 tempPt = (AliL3DigitRowData*)tmp;