//$Id$ // Author: Anders Vestbo //*-- Copyright © ASV #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::SetBitNumbers(Int_t pad,Int_t time,Int_t charge,Int_t shape) { 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(); //cout<<"Writing "<<(int)model->fNClusters<<" clusters"<fNClusters<<" clusters to file"<fNClusters*sizeof(AliL3ClusterModel),1,file)!=1) break; //track->Print(); count++; } cout<<"Wrote "<NextTrack(); 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); 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; 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); temp = (Int_t)cluster.fDSigmaZ2; if(abs(temp) >= 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); 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; }