3 // Author: Anders Vestbo <mailto:vestbo$fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliL3StandardIncludes.h"
9 #include "AliL3RootTypes.h"
10 #include "AliL3Models.h"
11 #include "AliL3DigitData.h"
12 #include "AliL3Logging.h"
13 #include "AliL3TrackArray.h"
14 #include "AliL3ModelTrack.h"
15 #include "AliL3Transform.h"
16 #include "AliL3MemHandler.h"
17 #include "AliL3DataCompressor.h"
26 #include "AliL3FileHandler.h"
30 #include "AliL3Compress.h"
36 //_____________________________________________________________
40 // Class for compressing and uncompressing data.
42 ClassImp(AliL3Compress)
44 AliL3Compress::AliL3Compress()
53 AliL3Compress::AliL3Compress(Int_t slice,Int_t patch,Char_t *path,Bool_t writeshape,Int_t event)
59 sprintf(fPath,"%s",path);
60 fWriteShape=writeshape;
63 AliL3Compress::~AliL3Compress()
69 Bool_t AliL3Compress::WriteFile(AliL3TrackArray *tracks,Char_t *filename)
73 sprintf(fname,"%s/comp/%s",fPath,filename);
75 sprintf(fname,"%s/comp/tracks_m_%d_%d.raw",fPath,fSlice,fPatch);
77 sprintf(fname,"%s/comp/tracks_m_%d_%d_%d.raw",fPath,fEvent,fSlice,fPatch);
79 FILE *file = fopen(fname,"w");
82 cerr<<"AliL3Compress::WriteFile : Error opening file "<<fname<<endl;
85 Short_t ntracks = tracks->GetNTracks();
88 AliL3ClusterModel *clusters=0;
89 AliL3TrackModel *model=0;
90 for(Int_t i=0; i<ntracks; i++)
92 AliL3ModelTrack *track = (AliL3ModelTrack*)tracks->GetCheckedTrack(i);
95 //Do not save useless tracks or clusters:
96 //if(track->GetNPresentClusters() == 0)
100 model = track->GetModel();
101 if(model->fNClusters==0) continue;
102 clusters = track->GetClusters();
103 if(fwrite(model,sizeof(AliL3TrackModel),1,file)!=1) break;
104 if(fwrite(clusters,model->fNClusters*sizeof(AliL3ClusterModel),1,file)!=1) break;
112 Bool_t AliL3Compress::ReadFile(Char_t which,Char_t *filename)
114 //Read the trackfile.
118 sprintf(fname,"%s/comp/%s",fPath,filename);
124 sprintf(fname,"%s/comp/tracks_m_%d_%d.raw",fPath,fSlice,fPatch);
126 sprintf(fname,"%s/comp/tracks_m_%d_%d_%d.raw",fPath,fEvent,fSlice,fPatch);
128 else if(which == 'u')
131 sprintf(fname,"%s/comp/tracks_u_%d_%d.raw",fPath,fSlice,fPatch);
133 sprintf(fname,"%s/comp/tracks_u_%d_%d_%d.raw",fPath,fEvent,fSlice,fPatch);
137 cerr<<"AliL3Compress::ReadFile() : Wrong option"<<endl;
142 FILE *file = fopen(fname,"r");
145 cerr<<"AliL3Compress::ReadFile : Cannot open file "<<fname<<endl;
151 fTracks = new AliL3TrackArray("AliL3ModelTrack");
155 AliL3ModelTrack *track = (AliL3ModelTrack*)fTracks->NextTrack();
156 track->Init(fSlice,fPatch);
157 AliL3TrackModel *model = track->GetModel();
158 AliL3ClusterModel *clusters = track->GetClusters();
159 if(fread(model,sizeof(AliL3TrackModel),1,file)!=1) break;
160 if(fread(clusters,model->fNClusters*sizeof(AliL3ClusterModel),1,file)!=1) break;
164 fTracks->RemoveLast();
169 Bool_t AliL3Compress::CompressFile()
173 sprintf(fname,"%s/comp/tracks_c_%d_%d.raw",fPath,fSlice,fPatch);
175 sprintf(fname,"%s/comp/tracks_c_%d_%d_%d.raw",fPath,fEvent,fSlice,fPatch);
176 BIT_FILE *output = OpenOutputBitFile(fname);
179 sprintf(fname,"%s/comp/tracks_m_%d_%d.raw",fPath,fSlice,fPatch);
181 sprintf(fname,"%s/comp/tracks_m_%d_%d_%d.raw",fPath,fEvent,fSlice,fPatch);
183 FILE *input = fopen(fname,"r");
186 cerr<<"AliL3Compress::CompressFile() : Error opening file: "<<fname<<endl;
190 AliL3TrackModel track;
191 AliL3ClusterModel cluster;
195 Int_t timeo,pado,chargeo,shapeo;
196 timeo=pado=chargeo=shapeo=0;
199 if(fread(&track,sizeof(AliL3TrackModel),1,input)!=1) break;
201 if(output->mask != 0x80) //Write the current byte to file.
203 //cerr<<"\nAliL3Compress::CompressFile() : Writing overhead bits!!!"<<endl;
204 if(putc(output->rack,output->file )!=output->rack)
205 cerr<<"AliL3Compress::ComressFile : Error writing to bitfile"<<endl;
210 //Write track parameters:
211 fwrite(&track,sizeof(AliL3TrackModel),1,output->file);
213 Int_t origslice=-1,slice,clustercount=0;
214 for(Int_t i=0; i<track.fNClusters; i++)
216 if(fread(&cluster,sizeof(AliL3ClusterModel),1,input)!=1) break;
219 temp = (Int_t)cluster.fPresent;
220 OutputBit(output,temp);
223 if(cluster.fSlice<0 || cluster.fSlice>35)
225 cerr<<"AliL3DataCompress::CompressFile : Fucked up slice number :"<<cluster.fSlice<<endl;
229 //Write slice number of first point
232 origslice = cluster.fSlice;
233 OutputBits(output,origslice,6); //Need 6 bits to encode slice number
237 slice = cluster.fSlice;
238 if(slice == origslice)
243 OutputBits(output,slice,6);
248 //Write time information:
249 temp = (Int_t)rint(cluster.fDTime);
254 power = 1<<(AliL3DataCompressor::GetNTimeBits()-1);
260 OutputBits(output,abs(temp),(AliL3DataCompressor::GetNTimeBits()-1));
262 //Write pad information:
263 temp = (Int_t)rint(cluster.fDPad);
268 power = 1<<(AliL3DataCompressor::GetNPadBits()-1);
274 OutputBits(output,abs(temp),(AliL3DataCompressor::GetNPadBits()-1));
276 //Write charge information:
277 temp = (Int_t)cluster.fDCharge;
278 power = 1<<(AliL3DataCompressor::GetNChargeBits());
284 OutputBits(output,abs(temp),(AliL3DataCompressor::GetNChargeBits()));
288 //Write shape information:
289 temp = (Int_t)cluster.fDSigmaY2;
294 power = 1<<(AliL3DataCompressor::GetNShapeBits()-1);
295 if(abs(temp) >= power)
300 OutputBits(output,abs(temp),(AliL3DataCompressor::GetNShapeBits()-1));
302 temp = (Int_t)cluster.fDSigmaZ2;
307 power = 1<<(AliL3DataCompressor::GetNShapeBits()-1);
308 if(abs(temp) >= power)
313 OutputBits(output,abs(temp),(AliL3DataCompressor::GetNShapeBits()-1));
321 CloseOutputBitFile(output);
322 if(pado || timeo || chargeo || shapeo)
324 cout<<endl<<"Saturations: "<<endl
326 <<"Time "<<timeo<<endl
327 <<"Charge "<<chargeo<<endl
328 <<"Shape "<<shapeo<<endl<<endl;
333 Bool_t AliL3Compress::ExpandFile()
337 sprintf(fname,"%s/comp/tracks_c_%d_%d.raw",fPath,fSlice,fPatch);
339 sprintf(fname,"%s/comp/tracks_c_%d_%d_%d.raw",fPath,fEvent,fSlice,fPatch);
340 BIT_FILE *input = OpenInputBitFile(fname);
343 sprintf(fname,"%s/comp/tracks_u_%d_%d.raw",fPath,fSlice,fPatch);
345 sprintf(fname,"%s/comp/tracks_u_%d_%d_%d.raw",fPath,fEvent,fSlice,fPatch);
346 FILE *output = fopen(fname,"w");
349 cerr<<"AliL3Compress::ExpandFile() : Error opening file: "<<fname<<endl;
353 AliL3TrackModel trackmodel;
354 AliL3ClusterModel *clusters=0;
357 clusters = new AliL3ClusterModel[(AliL3Transform::GetNRows(fPatch))];
358 while(!feof(input->file))
360 input->mask=0x80;//make sure we read a new byte from file.
362 //Read and write track:
363 if(fread(&trackmodel,sizeof(AliL3TrackModel),1,input->file)!=1) break;
364 fwrite(&trackmodel,sizeof(AliL3TrackModel),1,output);
366 memset(clusters,0,AliL3Transform::GetNRows(fPatch)*sizeof(AliL3ClusterModel));
367 Int_t origslice=-1,clustercount=0;
368 for(Int_t i=0; i<trackmodel.fNClusters; i++)
373 temp = InputBit(input);
376 clusters[i].fPresent=kFALSE;
379 clusters[i].fPresent=kTRUE;
381 //Read slice information
384 temp = InputBits(input,6);
385 clusters[i].fSlice = temp;
390 temp = InputBit(input);
392 clusters[i].fSlice = origslice;
395 temp = InputBits(input,6);//read new slice
396 clusters[i].fSlice = temp;
397 origslice = temp;//store new slice
401 //Read time information:
402 sign=InputBit(input);
403 temp = InputBits(input,(AliL3DataCompressor::GetNTimeBits()-1));
406 clusters[i].fDTime = temp;
408 //Read pad information:
409 sign=InputBit(input);
410 temp = InputBits(input,(AliL3DataCompressor::GetNPadBits()-1));
413 clusters[i].fDPad = temp;
415 //Read charge information:
416 temp=InputBits(input,(AliL3DataCompressor::GetNChargeBits()));
417 clusters[i].fDCharge = temp;
421 //Read shape information:
422 sign = InputBit(input);
423 temp = InputBits(input,(AliL3DataCompressor::GetNShapeBits()-1));
426 clusters[i].fDSigmaY2 = temp;
428 sign = InputBit(input);
429 temp = InputBits(input,(AliL3DataCompressor::GetNShapeBits()-1));
432 clusters[i].fDSigmaZ2 = temp;
437 fwrite(clusters,(trackmodel.fNClusters)*sizeof(AliL3ClusterModel),1,output);
443 CloseInputBitFile(input);
447 void AliL3Compress::PrintCompRatio(ofstream *outfile)
449 AliL3MemHandler *mem = new AliL3MemHandler();
451 UInt_t remain_size=0,digit_size=0;
452 for(Int_t i=0; i<36; i++)
455 sprintf(fname,"%s/comp/remains_%d_%d.raw",fPath,i,-1);
457 sprintf(fname,"%s/comp/remains_%d_%d_%d.raw",fPath,fEvent,i,-1);
458 mem->SetBinaryInput(fname);
459 remain_size += mem->GetFileSize();
460 mem->CloseBinaryInput();
462 sprintf(fname,"%s/binaries/digits_c8_%d_%d_%d.raw",fPath,fEvent,i,-1);
463 mem->SetBinaryInput(fname);
464 digit_size += mem->GetFileSize();
465 mem->CloseBinaryInput();
470 sprintf(fname,"%s/comp/tracks_c_%d_%d.raw",fPath,fSlice,fPatch);
472 sprintf(fname,"%s/comp/tracks_c_%d_%d_%d.raw",fPath,fEvent,fSlice,fPatch);
474 mem->SetBinaryInput(fname);
475 UInt_t compress_size = mem->GetFileSize();
476 mem->CloseBinaryInput();
480 cerr<<"AliL3Compress::PrintCompRatio : Zero digit size "<<endl;
484 Float_t compratio = (Float_t)(compress_size + remain_size)/(Float_t)digit_size;
487 ofstream &out = *outfile;
488 out<<compress_size<<' '<<remain_size<<' '<<digit_size<<endl;
491 cout<<"=========================================="<<endl;
492 cout<<"Original digits size : "<<digit_size/1000<<" kByte ( 100 % )"<<endl;
493 cout<<"Compressed file size : "<<compress_size/1000<<" kByte ( "<<(Float_t)compress_size*100/(Float_t)digit_size<<" % )"<<endl;
494 cout<<"Remainig file size : "<<remain_size/1000<<" kByte ( "<<(Float_t)remain_size*100/(Float_t)digit_size<<" % )"<<endl;
495 cout<<"---------------------- "<<endl;
496 cout<<"Compression ratio : "<<compratio*100<<" %"<<endl;
497 cout<<"=========================================="<<endl;