X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=HLT%2Fsrc%2FAliL3MemHandler.cxx;h=c103ce1110223ac4cca3059cfa6814947814fcf5;hb=17e961af8cad6456b894960cb813bab2049a63ee;hp=fd274a350c3be464725e7af5be5ce7ef9e1d91e6;hpb=fc600b9edd51512f38f4b178d8471883f3371743;p=u%2Fmrichter%2FAliRoot.git diff --git a/HLT/src/AliL3MemHandler.cxx b/HLT/src/AliL3MemHandler.cxx index fd274a350c3..c103ce11102 100644 --- a/HLT/src/AliL3MemHandler.cxx +++ b/HLT/src/AliL3MemHandler.cxx @@ -1,10 +1,14 @@ -//Author: Uli Frankenfeld -//Last Modified: 17.12.2000 +/* $Id$ +// Author: Uli Frankenfeld , Anders Vestbo +// -- Copyright © Uli +// changes done by Constantin Loizides +*/ #include #include #include #include +#include #include "AliL3MemHandler.h" #include "AliL3Transform.h" @@ -14,106 +18,176 @@ #include "AliL3TrackSegmentData.h" #include "AliL3SpacePointData.h" #include "AliL3TrackArray.h" + +/** \class AliL3MemHandler +//
 //_____________________________________________________________
+// AliL3MemHandler
 //
-// The L3 Binary File handler 
+// The HLT Binary File handler 
 //
-
+//  This class does all the memory I/O handling of HLT binary files.
+//  
+//  Examples:
+//  ---------
+//
+//  1) Reading a binary file:
+//  
+//  AliL3MemHandler file;
+//  file.SetBinaryInput(filename);
+//  
+//  UInt_t ndigits;
+//  AliL3DigitRowData *data = file.CompBinary2Memory(ndigits);
+//  
+//  for(int i=0; ifDigitData;
+//    for(int j=0; jfNDigit; j++) 
+//      {
+//      pad = dataPt[j].fPad;
+//      time = dataPt[j].fTime;
+//      charge = dataPt[j].fCharge;
+//     }
+//     
+//    file.UpdateRowPointer(data);
+//  
+//    }
+//  file.CloseBinaryInput();
+//  ________________________
+//  
+//  2) Writing a binary file:
+//  
+//  //First of all you need to store the data in memory,
+//  //and have a pointer to it of type AliL3DigitRowData.
+//  //E.g. if you just want to write the data you read in example 1)
+//  //into a new file, you can do the following:
+//  
+//  AliL3MemHandler newfile;
+//  newfile.SetBinaryOutput(newfilename);
+//  newfile.Memory2CompBinary((UInt_t)NumberOfRowsInPatch,(AliL3DigitRowData*)data);
+//  newfile.CloseBinaryOutput();
+//
+//
+// Compressed file format:
+// -----------------------
+//
+// The data is RLE encoded and currently using _10_ bit range for the ADC-values.
+
*/ + ClassImp(AliL3MemHandler) - -AliL3MemHandler::AliL3MemHandler(){ - // Default constructor + +AliL3MemHandler::AliL3MemHandler() +{ + //Constructor + fPt = 0; fSize =0; fInBinary = 0; fOutBinary = 0; fNRandom = 0; - Int_t r[2]={0,0}; - Init(0,0,r); + Init(0,0); IsRandom = kFALSE; fDigits = 0; fDPt =0; fNGenerate = 0; fNUsed = 0; fNDigits = 0; - - Int_t row[2] = {0,173}; - Init(0,0,row); ResetROI(); } -AliL3MemHandler::~AliL3MemHandler(){ +AliL3MemHandler::~AliL3MemHandler() +{ //Destructor if(fPt) delete[] fPt; if(fDigits) delete [] fDigits; if(fDPt) delete [] fDPt; } -void AliL3MemHandler::ResetROI(){ - for(Int_t i=fRowMin; i<=fRowMax; i++) - { +void AliL3MemHandler::ResetROI() +{ + //Resets the Look-up table for Region of Interest mode. + + for(Int_t i=fRowMin; i<=fRowMax; i++) + { fEtaMinTimeBin[i] = 0; fEtaMaxTimeBin[i] = 445; - } + } } -void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice){ - if(eta[1]==0) - { - LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values") - <<"Bad ROI parameters. IDIOT! "<Row2X(i); - xyz[1]=0; - xyz[2] = xyz[0]/tan(thetamax); - fTransformer->Slice2Sector(fSlice,i,sector,row); - fTransformer->Local2Raw(xyz,sector,row); - - fEtaMinTimeBin[i] = (Int_t)xyz[2]; - - if(eta[0]==0) - fEtaMaxTimeBin[i] = 445; - else - { - Float_t thetamin = 2*atan(exp(-1.*eta[0])); - xyz[0] = fTransformer->Row2X(i); - xyz[1] = fTransformer->GetMaxY(i); - Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2)); - xyz[2] = radii/tan(thetamin); - fTransformer->Local2Raw(xyz,sector,row); - fEtaMaxTimeBin[i] = (Int_t)xyz[2]; - } - } - +void AliL3MemHandler::SetROI(Float_t *eta,Int_t *slice) +{ + // Init the Look-up table for the Region of Interest mode. + // Here you can specify a certain etaregion, - all data + // outside this region will be discarded: + // eta[0] = mimium eta + // eta[1] = maximum eta + // slice[0] = mimumum slice + // slice[1] = maximum slice + + + if(eta[1]==0) + { + LOG(AliL3Log::kWarning,"AliL3MemHandler::SetROI","Eta Values") + <<"Bad ROI parameters. IDIOT! "<GetOutSize()); } -Byte_t *AliL3MemHandler::Allocate(UInt_t size){ +Byte_t *AliL3MemHandler::Allocate(UInt_t size) +{ + //Allocate memory of size in bytes. + if(fPt){ LOG(AliL3Log::kWarning,"AliL3MemHandler::Allocate","Memory") - <<"Delete Memory"<GetNPads(r); + Int_t npad=AliL3Transform::GetNPads(r); nrandom += Int_t (fNGenerate * ((Double_t) npad/141.)); } return 9 * nrandom * sizeof(AliL3DigitData); } -void AliL3MemHandler::Generate(Int_t row){ +void AliL3MemHandler::Generate(Int_t row) +{ + //Generate random data on row, if you didn't ask for this, nothing happens here. + if(!IsRandom) return; ResetRandom(); fNDigits = 0; - Int_t npad=fTransformer->GetNPads(row); + Int_t npad=AliL3Transform::GetNPads(row); Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row]; Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) * - (Double_t) ntime/(Double_t) fTransformer->GetNTimeBins() ); - + (Double_t) ntime/(Double_t) AliL3Transform::GetNTimeBins() ); + for(Int_t n=0;nfRow,fDPt[d]->fPad, -// fDPt[d]->fTime,fDPt[d]->fCharge); + // for(Int_t d=0;dfRow,fDPt[d]->fPad, + // fDPt[d]->fTime,fDPt[d]->fCharge); } void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad, - Int_t time,Int_t charge){ + Int_t time,Int_t charge) +{ + //Making one single random cluster. for(Int_t j=-1;j<2;j++){ for(Int_t k=-1;k<2;k++){ Int_t dcharge = charge; @@ -312,10 +420,10 @@ void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad, if(dcharge<10) continue; Int_t dpad = j + pad; Int_t dtime = k + time; - - if(dpad<0||dpad>=fTransformer->GetNPads(row)) continue; - if(dtime<0||dtime>=fTransformer->GetNTimeBins()) continue; - + + if(dpad<0||dpad>=AliL3Transform::GetNPads(row)) continue; + if(dtime<0||dtime>=AliL3Transform::GetNTimeBins()) continue; + fDigits[fNDigits].fCharge = dcharge; fDigits[fNDigits].fRow = row; fDigits[fNDigits].fPad = dpad; @@ -327,23 +435,26 @@ void AliL3MemHandler::DigitizePoint(Int_t row, Int_t pad, } ///////////////////////////////////////// Digit IO -Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data){ +Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data) +{ + //Write data to the outputfile as is. No run-length encoding is done. + if(!fOutBinary){ LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File") - <<"No Output File"<fNDigit - + sizeof(AliL3DigitRowData); + + sizeof(AliL3DigitRowData); outsize += size; fwrite(row_pt,size,1,fOutBinary); Byte_t *byte_pt =(Byte_t *) row_pt; @@ -351,20 +462,24 @@ Bool_t AliL3MemHandler::Memory2Binary(UInt_t nrow,AliL3DigitRowData *data){ row_pt = (AliL3DigitRowData *) byte_pt; } LOG(AliL3Log::kDebug,"AliL3MemHandler::Memory2Binary","Memory") - <fPad; data[ndata].fTime = fDPt[fNUsed]->fTime; data[ndata].fCharge = fDPt[fNUsed]->fCharge; @@ -411,8 +528,8 @@ void AliL3MemHandler::AddRandom(AliL3DigitData *data, UInt_t & ndata){ } void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata, - UInt_t row, UShort_t pad, UShort_t time, UShort_t charge){ -// AddData(data,ndata,row,pad,time,charge); + UInt_t row, UShort_t pad, UShort_t time, UShort_t charge) +{ data[ndata].fPad = pad; data[ndata].fTime = time; data[ndata].fCharge = charge; @@ -426,7 +543,8 @@ void AliL3MemHandler::MergeDataRandom(AliL3DigitData *data, UInt_t & ndata, } void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata, - UInt_t row, UShort_t pad, UShort_t time, UShort_t charge){ + UInt_t row, UShort_t pad, UShort_t time, UShort_t charge) +{ Int_t action; while((action=ComparePoints(row,pad,time))==1){ AddRandom(data,ndata); @@ -440,8 +558,10 @@ void AliL3MemHandler::AddDataRandom(AliL3DigitData *data, UInt_t & ndata, } void AliL3MemHandler::Write(UInt_t *comp, UInt_t & index, - UInt_t & subindex, UShort_t value){ + UInt_t & subindex, UShort_t value) +{ UInt_t shift[3] = {0,10,20}; + if(subindex==0) comp[index] =0; //clean up memory comp[index] |= (value&0x03ff)<>shift[subindex])&0x03ff; if(subindex == 2){ @@ -463,21 +584,25 @@ UShort_t AliL3MemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex){ } UShort_t AliL3MemHandler::Test(UInt_t *comp, - UInt_t index, UInt_t subindex){ + UInt_t index, UInt_t subindex) +{ UInt_t shift[3] = {0,10,20}; return (comp[index]>>shift[subindex])&0x03ff; } Int_t AliL3MemHandler::Memory2CompMemory(UInt_t nrow, - AliL3DigitRowData *data,UInt_t *comp){ + AliL3DigitRowData *data,UInt_t *comp) +{ + //Performs run-length encoding on data stored in memory pointed to by data. + //The compressed data is written to comp. if(!comp){ LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2CompMemory","Memory") - <<"Pointer to compressed data = 0x0 "<=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row]) -// AddData(row_pt->fDigitData,ndigit,row,pad,time,charge); + // AddData(row_pt->fDigitData,ndigit,row,pad,time,charge); AddDataRandom(row_pt->fDigitData,ndigit,row,pad,time,charge); time++; } @@ -595,7 +724,7 @@ Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow, } row_pt->fNDigit = ndigit; Int_t size = sizeof(AliL3DigitData) * row_pt->fNDigit+ - sizeof(AliL3DigitRowData); + sizeof(AliL3DigitRowData); Byte_t *byte_pt =(Byte_t *) row_pt; byte_pt += size; outsize += size; @@ -604,10 +733,13 @@ Int_t AliL3MemHandler::CompMemory2Memory(UInt_t nrow, return outsize; } -UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data){ +UInt_t AliL3MemHandler::GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data) +{ + //Return the size of RLE data, after compressing data. + if(!data){ LOG(AliL3Log::kWarning,"AliL3MemHandler::GetCompMemorySize","Memory") - <<"Pointer to AliL3DigitRowData = 0x0 "<=row_pt->fNDigit || row_pt->fDigitData[digit].fPad != pad) continue; index++; -// write zero if time != 0 + // write zero if time != 0 if(digitfNDigit && row_pt->fDigitData[digit].fPad == pad){ if(row_pt->fDigitData[digit].fTime>0){ index++; @@ -703,17 +835,18 @@ UInt_t AliL3MemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp){ return outsize; } -UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size){ +UInt_t AliL3MemHandler::GetNRow(UInt_t *comp,UInt_t size) +{ if(!comp){ LOG(AliL3Log::kWarning,"AliL3MemHandler::GetNRow","Memory") - <<"Pointer to compressed data = 0x0 "<SetBinaryInput(fInBinary); UInt_t *comp =(UInt_t *)handler->Allocate(); @@ -796,7 +939,9 @@ AliL3DigitRowData *AliL3MemHandler::CompBinary2Memory(UInt_t & nrow){ return data; } -Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data){ +Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data) +{ + //Perform RLE on the data, and write it to the output file. Bool_t out = kTRUE; AliL3MemHandler * handler = new AliL3MemHandler(); UInt_t size = GetCompMemorySize(nrow,data); @@ -810,41 +955,40 @@ Bool_t AliL3MemHandler::Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data){ ///////////////////////////////////////// Point IO -Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data){ +Bool_t AliL3MemHandler::Memory2Binary(UInt_t npoint,AliL3SpacePointData *data) +{ + //Writing spacepoints stored in data to the outputfile. if(!fOutBinary){ LOG(AliL3Log::kWarning,"AliL3MemHandler::Memory2Binary","File") - <<"No Output File"<Local2Global(xyz,slice); + AliL3Transform::Local2Global(xyz,slice); data[i].fX = xyz[0]; data[i].fY = xyz[1]; data[i].fZ = xyz[2]; @@ -852,7 +996,9 @@ Bool_t AliL3MemHandler::Transform(UInt_t npoint,AliL3SpacePointData *data, return kTRUE; } -Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data){ +Bool_t AliL3MemHandler::Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data) +{ + //Read the space points in inputfile, and store it in data. if(!fInBinary){ LOG(AliL3Log::kWarning,"AliL3MemHandler::Binary2Memory","File") <<"No Input File"<FillTracks(ntrack,data,slice,trans); + array->FillTracks(ntrack,data,slice); return kTRUE; } +void AliL3MemHandler::UpdateRowPointer(AliL3DigitRowData *&tempPt) +{ + //Update the data pointer to the next padrow in memory. + + Byte_t *tmp = (Byte_t*)tempPt; + Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData); + tmp += size; + tempPt = (AliL3DigitRowData*)tmp; +}