X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=HLT%2Fcomp%2FAliL3Compress.cxx;h=53043b35ea3c2fe770325442bba77d691880d095;hp=2b285f844af9858d63df525bd0d0afff71bfc5af;hb=e2e0cb813b7aaf7b70b9f8b4d94093ffa073bc78;hpb=95a00d93ac223c4b86b864899ed9e2b3eae26bc9 diff --git a/HLT/comp/AliL3Compress.cxx b/HLT/comp/AliL3Compress.cxx index 2b285f844af..53043b35ea3 100644 --- a/HLT/comp/AliL3Compress.cxx +++ b/HLT/comp/AliL3Compress.cxx @@ -6,28 +6,72 @@ #include #include #include +#include +#include +#include #include "AliL3Compress.h" #include "AliL3TrackArray.h" #include "AliL3ModelTrack.h" +#include "AliL3Transform.h" +#include "AliL3MemHandler.h" +#ifdef use_aliroot +#include "AliL3FileHandler.h" +#endif #include "bitio.h" +//_____________________________________________________________ +// +// AliL3Compress +// +// Class for compressing and uncompressing data. + ClassImp(AliL3Compress) AliL3Compress::AliL3Compress() { fTracks=0; + SetBitNumbers(0,0,0,0); + fSlice =0; + fPatch=0; + fDigits=0; + fDPt=0; +} + +AliL3Compress::AliL3Compress(Int_t slice,Int_t patch,Char_t *path) +{ + fSlice=slice; + fPatch=patch; + SetBitNumbers(0,0,0,0); + fTracks=0; + fDigits=0; + fDPt=0; + sprintf(fPath,"%s",path); } AliL3Compress::~AliL3Compress() { if(fTracks) delete fTracks; + if(fDigits) + delete [] fDigits; + if(fDPt) + delete [] fDPt; } -void AliL3Compress::WriteFile(AliL3TrackArray *tracks,Char_t *filename) +void AliL3Compress::SetBitNumbers(Int_t pad,Int_t time,Int_t charge,Int_t shape) { - FILE *file = fopen(filename,"w"); + fNumPadBits=pad; + fNumTimeBits=time; + fNumChargeBits=charge; + fNumShapeBits=shape; +} + +void AliL3Compress::WriteFile(AliL3TrackArray *tracks) +{ + Char_t fname[100]; + sprintf(fname,"%s/tracks_m_%d_%d.raw",fPath,fSlice,fPatch); + FILE *file = fopen(fname,"w"); Short_t ntracks = tracks->GetNTracks(); //cout<<"Writing "<GetCheckedTrack(i); if(!track) continue; + + track->FillModel(); model = track->GetModel(); if(model->fNClusters==0) continue; clusters = track->GetClusters(); @@ -45,104 +91,222 @@ void AliL3Compress::WriteFile(AliL3TrackArray *tracks,Char_t *filename) if(fwrite(model,sizeof(AliL3TrackModel),1,file)!=1) break; //cout<<"Writing "<<(int)model->fNClusters<<" clusters to file"<fNClusters*sizeof(AliL3ClusterModel),1,file)!=1) break; + //track->Print(); count++; + } cout<<"Wrote "<NextTrack(); - track->Init(0,0); + track->Init(fSlice,fPatch); AliL3TrackModel *model = track->GetModel(); AliL3ClusterModel *clusters = track->GetClusters(); + //cout<<"Reading model "<<(int)model<fNClusters)*sizeof(AliL3ClusterModel),1,file)!=1) break; + //cout<<"Filling track"<FillTrack(); + //track->Print(); } - + + fTracks->RemoveLast(); cout<<"Read "<GetNTracks()<<" tracks from file"<mask != 0x80) //Write the current byte to file. { + //cerr<<"\nAliL3Compress::CompressFile() : Writing overhead bits!!!"<rack,output->file )!=output->rack) cerr<<"AliL3Compress::ComressFile : Error writing to bitfile"<mask=0x80; + output->rack=0; } + + //Write track parameters: fwrite(&track,sizeof(AliL3TrackModel),1,output->file); for(Int_t i=0; i=power) + { + timeo++; + temp=power - 1; + } + OutputBits(output,abs(temp),(fNumTimeBits-1)); + + //Write pad information: temp = (Int_t)cluster.fDPad; if(temp<0) OutputBit(output,0); else OutputBit(output,1); - OutputBits(output,abs(temp),8); + power = 1<<(fNumPadBits-1); + if(abs(temp)>=power) + { + pado++; + temp=power - 1; + } + OutputBits(output,abs(temp),(fNumPadBits-1)); + + //Write charge information: temp = (Int_t)cluster.fDCharge; - OutputBits(output,temp,10); + if(temp<0) + OutputBit(output,0); + else + OutputBit(output,1); + power = 1<<(fNumChargeBits-1); + if(abs(temp)>=power) + { + chargeo++; + temp=power - 1; + } + OutputBits(output,abs(temp),(fNumChargeBits-1)); + + //Write shape information: + temp = (Int_t)cluster.fDSigmaY2; + power = 1<= power) + { + shapeo++; + temp = power - 1; + } + OutputBits(output,abs(temp),fNumShapeBits); - //Short_t temp=(Short_t)cluster.fDTime; - // cout<<"flag "<<(int)flag<<" dtime "<<(int)cluster.fDTime<<" dpad "<<(int)cluster.fDPad<<" charge "<= power) + { + shapeo++; + temp=power - 1; + } + OutputBits(output,abs(temp),fNumShapeBits); } - } fclose(input); CloseOutputBitFile(output); + + cout<file)) { + input->mask=0x80;//make sure we read a new byte from file. + //Read and write track: if(fread(&trackmodel,sizeof(AliL3TrackModel),1,input->file)!=1) break; fwrite(&trackmodel,sizeof(AliL3TrackModel),1,output); - input->mask=0x80;//make sure we read a new byte from file. - clusters = new AliL3ClusterModel[(trackmodel.fNClusters)]; - for(Int_t i=0; iGetNTracks(); i++) + { + AliL3ModelTrack *track = (AliL3ModelTrack*)fTracks->GetCheckedTrack(i); + if(!track) continue; + if(!track->GetPad(j,pad) || + !track->GetTime(j,time) || + !track->GetClusterCharge(j,charge) || + !track->GetXYWidth(j,sigmaY2) || + !track->GetZWidth(j,sigmaZ2)) + continue; + + CreateDigits(j,pad,time,charge,sigmaY2,sigmaZ2); + } + } + + QSort(fDPt,0,fNDigits); +} + +void AliL3Compress::PrintDigits() +{ + Int_t pad,time,charge,row; + for(Int_t i=0; ifRow; + pad = fDPt[i]->fPad; + time = fDPt[i]->fTime; + charge = fDPt[i]->fCharge; + if(i>0 && row != fDPt[i-1]->fRow) + cout<<"---Padrow "<SetBinaryInput(fname); + UInt_t numdigits; + AliL3DigitRowData *origRow = mem->CompBinary2Memory(numdigits); + mem->CloseBinaryInput(); + + //Allocate memory for the merged data: + UInt_t size = mem->GetAllocatedSize() + fNDigits*sizeof(AliL3DigitData); + cout<<"Allocating "<fRow = i; + ndigits=0; + AliL3DigitData *origDig = origRow->fDigitData; + AliL3DigitData *tempDig = tempRow->fDigitData; + if((Int_t)origRow->fRow != i) + cerr<<"AliL3Compress::WriteRestoredData() : Mismatching row numbering "<<(Int_t)origRow->fRow<<" "<fNDigit<<" old digits"<fNDigit) + { + pad = origDig[digit_counter].fPad; + time = origDig[digit_counter].fTime; + charge = origDig[digit_counter].fCharge; + digit_counter++; + while((action=ComparePoints(i,pad,time)) == 1) + { + tempDig[ndigits].fPad = fDPt[fNUsed]->fPad; + tempDig[ndigits].fTime = fDPt[fNUsed]->fTime; + tempDig[ndigits].fCharge = fDPt[fNUsed]->fCharge; + ndigits++; + fNUsed++; + + } + if(action == 0) + { + tempDig[ndigits].fPad = pad; + tempDig[ndigits].fTime = time; + tempDig[ndigits].fCharge = charge; + ndigits++; + } + } + + if(fNUsed >= fNDigits) + break; + if(fDPt[fNUsed]->fRow != i) //we are on a new row + break; + tempDig[ndigits].fPad = fDPt[fNUsed]->fPad; + tempDig[ndigits].fTime = fDPt[fNUsed]->fTime; + tempDig[ndigits].fCharge = fDPt[fNUsed]->fCharge; + ndigits++; + fNUsed++; + } + //cout<<"Writing "<fNDigit = ndigits; + Int_t size = sizeof(AliL3DigitData)*tempRow->fNDigit + sizeof(AliL3DigitRowData); + Byte_t *byte_pt = (Byte_t*)tempRow; + byte_pt += size; + tempRow = (AliL3DigitRowData*)byte_pt; + mem->UpdateRowPointer(origRow); + } + + if(row_counter != NumRows[fPatch]) + cerr<<"AliL3Compress::WriteRestoredData() : Written rows: "<Free(); + sprintf(fname,"%s/restored_%d_%d.raw",fPath,fSlice,fPatch); + mem->SetBinaryOutput(fname); + mem->Memory2CompBinary((UInt_t)NumRows[fPatch],(AliL3DigitRowData*)data); + mem->CloseBinaryOutput(); + + delete [] data; + delete mem; + +} + +void AliL3Compress::CreateDigits(Int_t row,Float_t pad,Float_t time,Int_t charge,Float_t sigmaY2,Float_t sigmaZ2) +{ + //Create raw data out of the cluster. + + AliL3Transform *tr = new AliL3Transform(); + TRandom *random = new TRandom(); + + Int_t entries=1000; + TH1F *hist1 = new TH1F("hist1","",tr->GetNPads(row),0,tr->GetNPads(row)-1); + TH1F *hist2 = new TH1F("hist2","",tr->GetNTimeBins(),0,tr->GetNTimeBins()-1); + TH2F *hist3 = new TH2F("hist3","",tr->GetNPads(row),0,tr->GetNPads(row)-1,tr->GetNTimeBins(),0,tr->GetNTimeBins()-1); + + //Convert back the sigmas: + Float_t padw,timew; + if(fPatch < 3) + padw = tr->GetPadPitchWidthLow(); + else + padw = tr->GetPadPitchWidthUp(); + timew = tr->GetZWidth(); + + if(fPatch < 3) + sigmaY2 = sigmaY2/2.07; + sigmaY2 = sigmaY2/0.108; + sigmaY2 = sigmaY2/(padw*padw); + sigmaY2 = sigmaY2 - 1./12; + + if(fPatch < 3) + sigmaZ2 = sigmaZ2/1.77; + sigmaZ2 = sigmaZ2/0.169; + sigmaZ2 = sigmaZ2/(timew*timew); + sigmaZ2 = sigmaZ2 - 1./12; + + if(sigmaY2 <= 0 || sigmaZ2 <= 0) + { + cerr<<"AliL3Compress::CreateDigits() : Wrong sigmas : "<Fill(random->Gaus(pad,sqrt(sigmaY2))); + hist2->Fill(random->Gaus(time,sqrt(sigmaZ2))); + } + + //Create the cluster: + Int_t bin1,bin2; + Double_t content1,content2,dpad,dtime; + for(Int_t i=0; iGetEntries(); i++) + { + bin1 = hist1->GetBin(i); + content1 = hist1->GetBinContent(bin1); + if((Int_t)content1==0) continue; + content1 = charge*content1/entries; + dpad = hist1->GetBinCenter(bin1); + for(Int_t j=0; jGetEntries(); j++) + { + bin2 = hist2->GetBin(j); + content2 = hist2->GetBinContent(bin2); + if((Int_t)content2==0) continue; + content2 = content1*content2/entries; + dtime = hist2->GetBinCenter(bin2); + hist3->Fill(dpad,dtime,content2); + } + } + + //Fill it into the digit array: + for(Int_t i=0; iGetNbinsX(); i++) + { + for(Int_t j=0; jGetNbinsY(); j++) + { + bin1 = hist3->GetBin(i,j); + content1 = hist3->GetBinContent(bin1); + if((Int_t)content1 < 3) continue; + if(content1 >= 1024) + content1 = 1023; + if(fNDigits >= fMaxDigits) + { + cerr<<"AliL3Compress::CreateDigits() : Array index out of range : "<GetXaxis()->GetBinCenter(i); + fDigits[fNDigits].fTime = (Int_t)hist3->GetYaxis()->GetBinCenter(j); + fDPt[fNDigits] = &fDigits[fNDigits]; + fNDigits++; + } + } + + delete random; + delete hist1; + delete hist2; + delete hist3; + delete tr; +} + +void AliL3Compress::PrintCompRatio() +{ + Char_t fname[100]; + sprintf(fname,"%s/remains_%d_%d.raw",fPath,fSlice,fPatch); + AliL3MemHandler *mem = new AliL3MemHandler(); + if(!mem->SetBinaryInput(fname)) + { + cerr<<"AliL3Compress::PrintCompRatio(): Error opening file: "<CompBinary2Memory(ndigits); + mem->CloseBinaryInput(); + + Int_t digit_counter=0; + for(Int_t i=NRows[fPatch][0]; i<=NRows[fPatch][1]; i++) + { + digit_counter += rowPt->fNDigit; + mem->UpdateRowPointer(rowPt); + } + delete mem; + + sprintf(fname,"%s/tracks_c_%d_%d.raw",fPath,fSlice,fPatch); + FILE *file1 = fopen(fname,"r"); + if(!file1) + { + cerr<<"AliL3Compress::PrintCompRatio(): Error opening file: "< 1) { + i = first; + j = last; + for (;;) { + while (++i < last && CompareDigits(a[i], a[first]) < 0) + ; + while (--j > first && CompareDigits(a[j], a[first]) > 0) + ; + if (i >= j) + break; + + tmp = a[i]; + a[i] = a[j]; + a[j] = tmp; + } + if (j == first) { + ++first; + continue; + } + tmp = a[first]; + a[first] = a[j]; + a[j] = tmp; + if (j - first < last - (j + 1)) { + QSort(a, first, j); + first = j + 1; // QSort(j + 1, last); + } else { + QSort(a, j + 1, last); + last = j; // QSort(first, j); + } + } +} + +void AliL3Compress::WriteRootFile(Char_t *digitsfile,Char_t *rootfile) +{ +#ifdef use_aliroot + Char_t fname[100]; + AliL3MemHandler *mem = new AliL3MemHandler(); + sprintf(fname,"%s/restored_%d_%d.raw",fPath,fSlice,fPatch); + mem->SetBinaryInput(fname); + UInt_t ndigits; + AliL3DigitRowData *rowPt = (AliL3DigitRowData*)mem->CompBinary2Memory(ndigits); + mem->CloseBinaryInput(); + + AliL3FileHandler *file = new AliL3FileHandler(); + if(!file->SetAliInput(digitsfile)) + { + cerr<<"AliL3Compress::WriteRootFile() : Error opening file: "<Init(fSlice,fPatch,NRows[fPatch]); + file->AliDigits2RootFile(rowPt,rootfile); + file->CloseAliInput(); + + delete mem; + delete file; +#endif + + return; +}