2 // Original: AliHLTMemHandler.cxx,v 1.52 2005/06/14 10:55:21 cvetan
4 //**************************************************************************
5 //* This file is property of and copyright by the ALICE HLT Project *
6 //* ALICE Experiment at CERN, All rights reserved. *
8 //* Primary Authors: U. Frankenfeld, A. Vestbo, C. Loizides *
9 //* Matthias Richter <Matthias.Richter@ift.uib.no> *
10 //* for The ALICE HLT Project. *
12 //* Permission to use, copy, modify and distribute this software and its *
13 //* documentation strictly for non-commercial purposes is hereby granted *
14 //* without fee, provided that the above copyright notice appears in all *
15 //* copies and that both the copyright notice and this permission notice *
16 //* appear in the supporting documentation. The authors make no claims *
17 //* about the suitability of this software for any purpose. It is *
18 //* provided "as is" without express or implied warranty. *
19 //**************************************************************************
21 /** @file AliHLTTPCMemHandler.cxx
22 @author U. Frankenfeld, A. Vestbo, C. Loizides, maintained by
25 @brief input interface base class for the TPC tracking code before
26 migration to the HLT component framework
31 #include "AliHLTTPCRootTypes.h"
32 #include "AliHLTTPCDigitData.h"
33 #include "AliHLTTPCLogging.h"
34 #include "AliHLTTPCTransform.h"
35 #include "AliHLTTPCTrackSegmentData.h"
36 #include "AliHLTTPCSpacePointData.h"
37 #include "AliHLTTPCTrackArray.h"
38 #include "AliHLTTPCMemHandler.h"
44 ClassImp(AliHLTTPCMemHandler)
46 AliHLTTPCMemHandler::AliHLTTPCMemHandler()
70 AliHLTTPCMemHandler::~AliHLTTPCMemHandler()
74 if(fRandomDigits) delete [] fRandomDigits;
75 if(fDPt) delete [] fDPt;
78 void AliHLTTPCMemHandler::Init(Int_t s,Int_t p, Int_t *r)
88 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Init","sector coordinates")
89 <<"Invalid slice no " << s <<ENDLOG;
97 fRowMin=AliHLTTPCTransform::GetFirstRow(p);
98 fRowMax=AliHLTTPCTransform::GetLastRow(p);
103 void AliHLTTPCMemHandler::ResetROI()
105 //Resets the Look-up table for Region of Interest mode.
106 for(Int_t i=fRowMin; i<=fRowMax; i++)
108 fEtaMinTimeBin[i] = 0;
109 fEtaMaxTimeBin[i] = AliHLTTPCTransform::GetNTimeBins()-1;
113 void AliHLTTPCMemHandler::SetROI(Float_t *eta,Int_t */*slice*/)
115 // Init the Look-up table for the Region of Interest mode.
116 // Here you can specify a certain etaregion, - all data
117 // outside this region will be discarded:
118 // eta[0] = mimium eta
119 // eta[1] = maximum eta
120 // slice[0] = mimumum slice
121 // slice[1] = maximum slice
126 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetROI","Eta Values")
127 <<"Bad ROI parameters."<<ENDLOG;
128 for(Int_t i=fRowMin; i<=fRowMax; i++)
136 for(Int_t i=fRowMin; i<=fRowMax; i++)
141 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
143 xyz[0] = AliHLTTPCTransform::Row2X(i);
145 xyz[2] = xyz[0]/tan(thetamax);
146 AliHLTTPCTransform::Slice2Sector(fSlice,i,sector,row);
147 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
149 fEtaMinTimeBin[i] = (Int_t)xyz[2];
152 fEtaMaxTimeBin[i] = 445;
155 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
156 xyz[0] = AliHLTTPCTransform::Row2X(i);
157 xyz[1] = AliHLTTPCTransform::GetMaxY(i);
158 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
159 xyz[2] = radii/tan(thetamin);
160 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
161 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
167 Bool_t AliHLTTPCMemHandler::SetBinaryInput(char *name)
169 //Set the input binary file.
170 fInBinary = fopen(name,"r");
172 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
173 <<"Error opening file "<<name<<ENDLOG;
179 Bool_t AliHLTTPCMemHandler::SetBinaryInput(FILE *file)
181 //Set the input binary file.
184 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
185 <<"Pointer to File = 0x0 "<<ENDLOG;
191 void AliHLTTPCMemHandler::CloseBinaryInput()
193 //Close the input file.
195 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryInput","File Close")
196 <<"Nothing to Close"<<ENDLOG;
203 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(char *name)
205 //Set the binary output file.
206 fOutBinary = fopen(name,"w");
208 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
209 <<"Pointer to File = 0x0 "<<ENDLOG;
215 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(FILE *file)
217 //Set the binary output file.
220 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
221 <<"Pointer to File = 0x0 "<<ENDLOG;
227 void AliHLTTPCMemHandler::CloseBinaryOutput()
231 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryOutPut","File Close")
232 <<"Nothing to Close"<<ENDLOG;
239 UInt_t AliHLTTPCMemHandler::GetFileSize()
241 //Returns the file size in bytes of the input file.
243 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetFileSize","File")
244 <<"No Input File"<<ENDLOG;
247 fseek(fInBinary,0,SEEK_END);
248 UInt_t size = (UInt_t) ftell(fInBinary);
253 Byte_t *AliHLTTPCMemHandler::Allocate()
256 return Allocate(GetFileSize());
259 Byte_t *AliHLTTPCMemHandler::Allocate(AliHLTTPCTrackArray *array)
261 //Allocate memory for tracks in memory. Used by TrackArray2Binary()
263 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Allocate","Memory")
264 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
267 return Allocate(array->GetOutSize());
270 Byte_t *AliHLTTPCMemHandler::Allocate(UInt_t size)
272 //Allocate memory of size in bytes.
274 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Allocate","Memory")
275 <<"Delete Memory"<<ENDLOG;
278 fPt = new Byte_t[size];
281 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Allocate","Memory")
282 <<AliHLTTPCLog::kDec<<"Allocate "<<size<<" Bytes of Memory"<<ENDLOG;
286 void AliHLTTPCMemHandler::Free()
288 //Clear the memory, if allocated.
290 // LOG(AliHLTTPCLog::kInformational,"AliHLTTPCMemHandler::Free","Memory")
291 // <<"No Memory allocated - can't Free"<<ENDLOG;
299 ///////////////////////////////////////// Random
300 void AliHLTTPCMemHandler::SetRandomSeed()
302 //If you are adding random data to the original data.
304 SetRandomSeed(time(tp));
307 void AliHLTTPCMemHandler::SetRandomCluster(Int_t maxnumber)
309 //If you are adding random data to the original data.
312 fNRandom = maxnumber;
314 if(fRandomDigits) delete [] fRandomDigits;
315 fRandomDigits = new AliHLTTPCRandomDigitData[fNRandom*9];
316 if(fDPt) delete [] fDPt;
317 fDPt = new AliHLTTPCRandomDigitData *[fNRandom*9];
320 void AliHLTTPCMemHandler::QSort(AliHLTTPCRandomDigitData **a, Int_t first, Int_t last)
323 // Sort array of AliHLTTPCRandomDigitData pointers using a quicksort algorithm.
324 // Uses CompareDigits() to compare objects.
327 static AliHLTTPCRandomDigitData *tmp;
328 static int i; // "static" to save stack space
331 while (last - first > 1) {
335 while (++i < last && CompareDigits(a[i], a[first]) < 0)
337 while (--j > first && CompareDigits(a[j], a[first]) > 0)
354 if (j - first < last - (j + 1)) {
356 first = j + 1; // QSort(j + 1, last);
358 QSort(a, j + 1, last);
359 last = j; // QSort(first, j);
364 UInt_t AliHLTTPCMemHandler::GetRandomSize() const
368 for(Int_t r=fRowMin;r<=fRowMax;r++){
369 Int_t npad=AliHLTTPCTransform::GetNPads(r);
370 nrandom += Int_t (fNGenerate * ((Double_t) npad/141.));
372 return 9 * nrandom * sizeof(AliHLTTPCDigitData);
375 void AliHLTTPCMemHandler::Generate(Int_t row)
377 //Generate random data on row, if you didn't
378 //ask for this, nothing happens here.
380 if(!fIsRandom) return;
383 Int_t npad=AliHLTTPCTransform::GetNPads(row);
384 Int_t ntime = fEtaMaxTimeBin[row] - fEtaMinTimeBin[row];
385 Int_t nrandom = Int_t (fNGenerate * ((Double_t) npad/141.) *
386 (Double_t) ntime/(Double_t) AliHLTTPCTransform::GetNTimeBins() );
388 for(Int_t n=0;n<nrandom;n++){
389 Int_t pad = (int)((float)rand()/RAND_MAX*npad);
390 Int_t time =(int)((float)rand()/RAND_MAX*ntime+fEtaMinTimeBin[row] );
391 Int_t charge = (int)((float)rand()/RAND_MAX*AliHLTTPCTransform::GetADCSat());
392 DigitizePoint(row,pad,time,charge);
394 QSort(fDPt,0,fNDigits);
398 void AliHLTTPCMemHandler::DigitizePoint(Int_t row, Int_t pad,
399 Int_t time,Int_t charge)
401 //Making one single random cluster.
402 for(Int_t j=-1;j<2;j++){
403 for(Int_t k=-1;k<2;k++){
404 Int_t dcharge = charge;
407 if(dcharge<10) continue;
408 Int_t dpad = j + pad;
409 Int_t dtime = k + time;
411 if(dpad<0||dpad>=AliHLTTPCTransform::GetNPads(row)) continue;
412 if(dtime<0||dtime>=AliHLTTPCTransform::GetNTimeBins()) continue;
414 fRandomDigits[fNDigits].fCharge = dcharge;
415 fRandomDigits[fNDigits].fRow = row;
416 fRandomDigits[fNDigits].fPad = dpad;
417 fRandomDigits[fNDigits].fTime = dtime;
418 fDPt[fNDigits] = &fRandomDigits[fNDigits];
424 ///////////////////////////////////////// Digit IO
425 Bool_t AliHLTTPCMemHandler::Memory2BinaryFile(UInt_t nrow,AliHLTTPCDigitRowData *data)
427 //Write data to the outputfile as is. No run-length encoding is done.
430 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
431 <<"No Output File"<<ENDLOG;
435 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
436 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
440 AliHLTTPCDigitRowData *rowPt = data;
442 for(UInt_t i=0;i<nrow;i++){
443 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit
444 + sizeof(AliHLTTPCDigitRowData);
446 fwrite(rowPt,size,1,fOutBinary);
447 Byte_t *bytePt =(Byte_t *) rowPt;
449 rowPt = (AliHLTTPCDigitRowData *) bytePt;
451 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","Memory")
452 <<AliHLTTPCLog::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
453 <<nrow<<" Rows)"<<ENDLOG;
457 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & nrow,AliHLTTPCDigitRowData *data,UInt_t& sz)
459 //Read inputfile into memory as is, and store it in data.
460 // No run-length encoding is assumed.
463 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
464 <<"No Input File"<<ENDLOG;
468 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
469 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
473 AliHLTTPCDigitRowData *rowPt = data;
476 while(!feof(fInBinary)){
477 Byte_t *bytePt =(Byte_t *) rowPt;
479 if (sz<outsize+sizeof(AliHLTTPCDigitRowData)) {
480 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","Memory")
481 << "target data buffer too small" <<ENDLOG;
484 if(fread(rowPt,sizeof(AliHLTTPCDigitRowData),1,fInBinary)!=1) break;
486 bytePt += sizeof(AliHLTTPCDigitRowData);
487 outsize += sizeof(AliHLTTPCDigitRowData);
489 UInt_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit;
491 if (sz<outsize+size) {
492 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","Memory")
493 << "target data buffer too small" <<ENDLOG;
496 //if(fread(bytePt,size,1,fInBinary)!=1) break;
497 fread(bytePt,size,1,fInBinary);
500 rowPt = (AliHLTTPCDigitRowData *) bytePt;
504 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","Memory")
505 <<AliHLTTPCLog::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
506 <<rowcount<<" Rows)"<<ENDLOG;
511 void AliHLTTPCMemHandler::AddData(AliHLTTPCDigitData *data,UInt_t & ndata,
512 UInt_t /*row*/,UShort_t pad,UShort_t time,UShort_t charge) const
515 data[ndata].fPad = pad;
516 data[ndata].fTime = time;
517 data[ndata].fCharge = charge;
521 void AliHLTTPCMemHandler::AddRandom(AliHLTTPCDigitData *data, UInt_t & ndata)
523 //add some random data
524 data[ndata].fPad = fDPt[fNUsed]->fPad;
525 data[ndata].fTime = fDPt[fNUsed]->fTime;
526 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
531 void AliHLTTPCMemHandler::MergeDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
532 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
535 data[ndata].fPad = pad;
536 data[ndata].fTime = time;
537 data[ndata].fCharge = charge;
538 while(ComparePoints(row,pad,time)==0){
539 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
540 if(charge>=AliHLTTPCTransform::GetADCSat()) ch = AliHLTTPCTransform::GetADCSat();
541 data[ndata].fCharge = ch;
547 void AliHLTTPCMemHandler::AddDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
548 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
552 while((action=ComparePoints(row,pad,time))==1){
553 AddRandom(data,ndata);
556 MergeDataRandom(data,ndata,row,pad,time,charge);
559 AddData(data,ndata,row,pad,time,charge);
563 void AliHLTTPCMemHandler::Write(UInt_t *comp, UInt_t & index,
564 UInt_t & subindex, UShort_t value) const
566 //write compressed data
567 UInt_t shift[3] = {0,10,20};
568 if(subindex==0) comp[index] =0; //clean up memory
569 comp[index] |= (value&0x03ff)<<shift[subindex];
577 UShort_t AliHLTTPCMemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex) const
579 //read compressed data
580 UInt_t shift[3] = {0,10,20};
581 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
591 UShort_t AliHLTTPCMemHandler::Test(UInt_t *comp,
592 UInt_t index, UInt_t subindex) const
595 UInt_t shift[3] = {0,10,20};
596 return (comp[index]>>shift[subindex])&0x03ff;
599 Int_t AliHLTTPCMemHandler::Memory2CompMemory(UInt_t nrow,
600 AliHLTTPCDigitRowData *data,UInt_t *comp)
602 //Performs run-length encoding on data stored in memory pointed to by data.
603 //The compressed data is written to comp.
605 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
606 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
610 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
611 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
614 AliHLTTPCDigitRowData *rowPt = data;
618 for(UInt_t i=0;i<nrow;i++){
619 UShort_t value = rowPt->fRow;
620 Write(comp,index,subindex,value);
624 for(Int_t d=0;d<200;d++) ddd[d]=0;
625 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
626 if(rowPt->fDigitData[dig].fPad <200){
627 ddd[rowPt->fDigitData[dig].fPad]++;
630 for(Int_t d=0;d<200;d++){
636 Write(comp,index,subindex,npad);
638 for(UShort_t pad=0;pad <= maxpad;pad++){
639 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
641 Write(comp,index,subindex,pad);
642 // write zero if time != 0
643 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
644 if(rowPt->fDigitData[digit].fTime>0){
645 Write(comp,index,subindex,0);
646 Write(comp,index,subindex,rowPt->fDigitData[digit].fTime);
649 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
650 UShort_t charge = rowPt->fDigitData[digit].fCharge;
654 Write(comp,index,subindex,charge);
655 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
656 if(rowPt->fDigitData[digit].fTime +1 !=
657 rowPt->fDigitData[digit+1].fTime){
658 Write(comp,index,subindex,0);
659 UShort_t nzero = rowPt->fDigitData[digit+1].fTime -
660 (rowPt->fDigitData[digit].fTime +1);
661 Write(comp,index,subindex,nzero);
666 Write(comp,index,subindex,0);
667 Write(comp,index,subindex,0);
670 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
671 sizeof(AliHLTTPCDigitRowData);
672 Byte_t *bytePt =(Byte_t *) rowPt;
674 rowPt = (AliHLTTPCDigitRowData *) bytePt;
677 Write(comp,index,subindex,0);
678 return index * sizeof(UInt_t);
681 Int_t AliHLTTPCMemHandler::CompMemory2Memory(UInt_t nrow,
682 AliHLTTPCDigitRowData *data,UInt_t *comp, UInt_t& sz)
684 //Uncompress the run-length encoded data in memory pointed to by comp, and
688 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2Memory","Memory")
689 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
693 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2Memory","Memory")
694 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
699 AliHLTTPCDigitRowData *rowPt = data;
703 for(UInt_t i=0;i<nrow;i++){
705 UInt_t row =Read(comp,index,subindex);
708 UShort_t npad = Read(comp,index,subindex);
709 for(UShort_t p=0;p<npad;p++){
712 UShort_t pad = Read(comp,index,subindex);
713 if(Test(comp,index,subindex)==0){
714 Read(comp,index,subindex);
715 if( (time = Read(comp,index,subindex)) == 0 ){
720 while( (charge=Read(comp,index,subindex)) != 0){
721 if(time>=fEtaMinTimeBin[row]&&time<=fEtaMaxTimeBin[row])
722 //AddData(rowPt->fDigitData,ndigit,row,pad,time,charge);
723 //seems we are using this function... but dont know why
724 AddDataRandom(rowPt->fDigitData,ndigit,row,pad,time,charge);
727 UShort_t tshift = Read(comp,index,subindex);
728 if(tshift == 0) break;
732 rowPt->fNDigit = ndigit;
733 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
734 sizeof(AliHLTTPCDigitRowData);
735 Byte_t *bytePt =(Byte_t *) rowPt;
738 rowPt = (AliHLTTPCDigitRowData *) bytePt;
744 UInt_t AliHLTTPCMemHandler::GetCompMemorySize(UInt_t nrow,AliHLTTPCDigitRowData *data) const
746 //Return the size of RLE data, after compressing data.
749 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetCompMemorySize","Memory")
750 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
753 AliHLTTPCDigitRowData *rowPt = data;
756 for(UInt_t i=0;i<nrow;i++){
761 for(Int_t d=0;d<200;d++) ddd[d]=0;
762 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
763 if(rowPt->fDigitData[dig].fPad <200){
764 ddd[rowPt->fDigitData[dig].fPad]++;
767 for(Int_t d=0;d<200;d++){
775 for(UShort_t pad=0;pad <= maxpad;pad++){
776 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
779 // write zero if time != 0
780 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
781 if(rowPt->fDigitData[digit].fTime>0){
786 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
788 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
789 if(rowPt->fDigitData[digit].fTime +1 !=
790 rowPt->fDigitData[digit+1].fTime){
801 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
802 sizeof(AliHLTTPCDigitRowData);
803 Byte_t *bytePt =(Byte_t *) rowPt;
805 rowPt = (AliHLTTPCDigitRowData *) bytePt;
809 return (index/3) * sizeof(UInt_t);
812 UInt_t AliHLTTPCMemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp) const
816 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetMemorySize","Memory")
817 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
825 for(UInt_t i=0;i<nrow;i++){
827 Read(comp,index,subindex);
828 UShort_t npad = Read(comp,index,subindex);
829 for(UShort_t p=0;p<npad;p++){
830 Read(comp,index,subindex);
831 if(Test(comp,index,subindex)==0){
832 Read(comp,index,subindex);
833 if(Read(comp,index,subindex)== 0) continue;
836 while(Read(comp,index,subindex)!=0) ndigit++;
837 if(Read(comp,index,subindex)==0) break;
840 Int_t size = sizeof(AliHLTTPCDigitData) * ndigit+
841 sizeof(AliHLTTPCDigitRowData);
848 UInt_t AliHLTTPCMemHandler::GetNRow(UInt_t *comp,UInt_t size)
852 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetNRow","Memory")
853 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
860 while(index<size-1){ //don't start with last word
863 Read(comp,index,subindex);
864 UShort_t npad = Read(comp,index,subindex);
865 for(UShort_t p=0;p<npad;p++){
866 Read(comp,index,subindex);
867 if(Test(comp,index,subindex)==0){
868 Read(comp,index,subindex);
869 if(Read(comp,index,subindex)==0)continue;
872 while(Read(comp,index,subindex)!=0) ndigit++;
873 if(Read(comp,index,subindex)==0) break;
877 if(index==size-1){ //last word
879 if(Read(comp,index,subindex)!=0) nrow++;
885 Bool_t AliHLTTPCMemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
888 //Write the RLE data in comp to the output file.
891 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","File")
892 <<"No Output File"<<ENDLOG;
896 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
897 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
901 size=GetMemorySize(nrow,comp);
903 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
904 <<"Memory size = 0 "<<ENDLOG;
907 UInt_t length = size/sizeof(UInt_t);
908 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
909 fwrite(comp,size,1,fOutBinary);
913 Bool_t AliHLTTPCMemHandler::CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp)
915 //Read the RLE data from file, and store it in comp. No unpacking yet.
918 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompBinary2CompMemory","File")
919 <<"No Output File"<<ENDLOG;
923 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompBinary2CompMemory","Memory")
924 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
929 if(fread(&length,sizeof(UInt_t),1,fInBinary)!=1) return kFALSE;
930 UInt_t size = length*sizeof(UInt_t);
931 if(fread(comp,size,1,fInBinary)!=1) return kFALSE;
932 // now find the number of dig
933 nrow = GetNRow(comp,size);
937 AliHLTTPCDigitRowData *AliHLTTPCMemHandler::CompBinary2Memory(UInt_t & nrow, UInt_t& sz )
939 // Read the RLE inputfile, unpack it and return the pointer to it.
940 AliHLTTPCMemHandler * handler = new AliHLTTPCMemHandler();
941 handler->SetBinaryInput(fInBinary);
942 UInt_t *comp =(UInt_t *)handler->Allocate();
943 handler->CompBinary2CompMemory(nrow,comp);
944 UInt_t size = GetMemorySize(nrow,comp);
946 AliHLTTPCDigitRowData *data = (AliHLTTPCDigitRowData *)Allocate(size);
947 CompMemory2Memory(nrow,data,comp);
953 Bool_t AliHLTTPCMemHandler::Memory2CompBinary(UInt_t nrow,AliHLTTPCDigitRowData *data)
955 //Perform RLE on the data, and write it to the output file.
957 AliHLTTPCMemHandler * handler = new AliHLTTPCMemHandler();
958 UInt_t size = GetCompMemorySize(nrow,data);
959 UInt_t *comp =(UInt_t *)handler->Allocate(size);
960 Memory2CompMemory(nrow,data,comp);
961 CompMemory2CompBinary(nrow,comp,size);
968 ///////////////////////////////////////// Point IO
969 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t npoint,AliHLTTPCSpacePointData *data)
971 //Writing spacepoints stored in data to the outputfile.
973 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
974 <<"No Output File"<<ENDLOG;
978 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
979 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
982 UInt_t size = npoint*sizeof(AliHLTTPCSpacePointData);
983 fwrite(data,size,1,fOutBinary);
988 Bool_t AliHLTTPCMemHandler::Transform(UInt_t npoint,AliHLTTPCSpacePointData *data,Int_t slice)
990 //Transform the space points in data, to global coordinates in slice.
992 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Transform","Memory")
993 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
997 for(UInt_t i=0;i<npoint;i++){
1000 xyz[1] = data[i].fY;
1001 xyz[2] = data[i].fZ;
1002 AliHLTTPCTransform::Local2Global(xyz,slice);
1003 data[i].fX = xyz[0];
1004 data[i].fY = xyz[1];
1005 data[i].fZ = xyz[2];
1010 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & npoint,AliHLTTPCSpacePointData *data, UInt_t& sz)
1012 //Read the space points in inputfile, and store it in data.
1014 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1015 <<"No Input File"<<ENDLOG;
1019 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
1020 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
1024 Int_t size = GetFileSize();
1026 npoint = size/sizeof(AliHLTTPCSpacePointData);
1028 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1029 <<"File Size == 0"<<ENDLOG;
1033 if(fread(data,size,1,fInBinary)!=1){
1034 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","File")
1035 <<"File Read Error "<<ENDLOG;
1038 if(size%sizeof(AliHLTTPCSpacePointData)){
1039 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCMemHandler::Binary2Memory","File Size")
1040 <<"File Size wrong "<<ENDLOG;
1043 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","File")
1044 <<AliHLTTPCLog::kDec<<"Wrote "<<size<<" Bytes to Memory"<<ENDLOG;
1048 ///////////////////////////////////////// Track IO
1049 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t ntrack,AliHLTTPCTrackSegmentData *data)
1051 //Write the tracks stored in data, to outputfile.
1053 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
1054 <<"No Output File"<<ENDLOG;
1058 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
1059 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1062 AliHLTTPCTrackSegmentData *trackPt = data;
1063 for(UInt_t i=0;i<ntrack;i++){
1064 Int_t size=sizeof(AliHLTTPCTrackSegmentData)+trackPt->fNPoints*sizeof(UInt_t);
1065 fwrite(trackPt,size,1,fOutBinary);
1066 Byte_t *bytePt = (Byte_t*) trackPt;
1068 trackPt = (AliHLTTPCTrackSegmentData*) bytePt;
1070 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","File")
1071 <<AliHLTTPCLog::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
1076 Bool_t AliHLTTPCMemHandler::Binary2Memory(UInt_t & ntrack,AliHLTTPCTrackSegmentData *data)
1078 //Read the tracks in inputfile, and store it in data.
1080 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","File")
1081 <<"No Input File"<<ENDLOG;
1085 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2Memory","Memory")
1086 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1091 AliHLTTPCTrackSegmentData *trackPt = data;
1094 while(!feof(fInBinary)){
1095 if(fread(trackPt,sizeof(AliHLTTPCTrackSegmentData),1,fInBinary)!=1) break;
1096 Int_t size=trackPt->fNPoints*sizeof(UInt_t);
1097 if(fread(trackPt->fPointIDs,size,1,fInBinary)!=1) break;
1098 Byte_t *bytePt = (Byte_t*) trackPt;
1099 bytePt += sizeof(AliHLTTPCTrackSegmentData)+size;
1100 trackPt = (AliHLTTPCTrackSegmentData*) bytePt;
1103 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Binary2Memory","File")
1104 <<AliHLTTPCLog::kDec<<"Wrote "<<ntrack<<" Tracks to Memory"<<ENDLOG;
1108 Bool_t AliHLTTPCMemHandler::TrackArray2Binary(AliHLTTPCTrackArray *array)
1110 //Write the trackarray to the outputfile.
1112 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","File")
1113 <<"No Output File"<<ENDLOG;
1117 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","Memory")
1118 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1121 AliHLTTPCTrackSegmentData *data = (AliHLTTPCTrackSegmentData *)Allocate(array);
1124 TrackArray2Memory(ntrack,data,array);
1125 Memory2Binary(ntrack,data);
1130 Bool_t AliHLTTPCMemHandler::Binary2TrackArray(AliHLTTPCTrackArray *array)
1132 //Read the tracks in inputfile, and fill it in trackarray.
1133 //array should already be constructed.
1135 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2TrackArray","File")
1136 <<"No Input File"<<ENDLOG;
1140 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Binary2TrackArray","Memory")
1141 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1144 AliHLTTPCTrackSegmentData *data = (AliHLTTPCTrackSegmentData *)Allocate();
1146 Binary2Memory(ntrack,data);
1147 Memory2TrackArray(ntrack,data,array);
1152 Bool_t AliHLTTPCMemHandler::TrackArray2Memory(UInt_t & ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
1154 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
1156 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
1157 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1161 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
1162 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1166 array->WriteTracks(ntrack,data);
1170 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
1172 //Fill the tracks in data into trackarray.
1175 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1176 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1180 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1181 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1184 array->FillTracks(ntrack,data);
1188 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array,Int_t slice) const
1190 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
1193 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1194 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
1198 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
1199 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
1202 array->FillTracks(ntrack,data,slice);
1206 void AliHLTTPCMemHandler::UpdateRowPointer(AliHLTTPCDigitRowData *&tempPt)
1208 //Update the data pointer to the next padrow in memory.
1210 Byte_t *tmp = (Byte_t*)tempPt;
1211 Int_t size = sizeof(AliHLTTPCDigitRowData) + tempPt->fNDigit*sizeof(AliHLTTPCDigitData);
1213 tempPt = (AliHLTTPCDigitRowData*)tmp;
1216 Int_t AliHLTTPCMemHandler::ComparePoints(UInt_t /*row*/,UShort_t pad,UShort_t time) const
1218 //compare two points
1219 if(fNUsed>=fNDigits) return -2;
1221 if(pad==fDPt[fNUsed]->fPad&&time==fDPt[fNUsed]->fTime) return 0;
1223 if(pad<fDPt[fNUsed]->fPad) return -1;
1224 if(pad==fDPt[fNUsed]->fPad&&time<fDPt[fNUsed]->fTime) return -1;
1229 Int_t AliHLTTPCMemHandler::CompareDigits(AliHLTTPCRandomDigitData *a,AliHLTTPCRandomDigitData *b) const
1231 //compare two digits
1232 if(a->fPad==b->fPad && a->fTime == b->fTime) return 0;
1234 if(a->fPad<b->fPad) return -1;
1235 if(a->fPad==b->fPad && a->fTime<b->fTime) return -1;