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
29 #include "AliHLTTPCRootTypes.h"
30 #include "AliHLTTPCDigitData.h"
31 #include "AliHLTTPCLogging.h"
32 #include "AliHLTTPCTransform.h"
33 #include "AliHLTTPCTrackSegmentData.h"
34 #include "AliHLTTPCSpacePointData.h"
35 #include "AliHLTTPCTrackArray.h"
36 #include "AliHLTTPCMemHandler.h"
43 ClassImp(AliHLTTPCMemHandler)
45 AliHLTTPCMemHandler::AliHLTTPCMemHandler()
69 AliHLTTPCMemHandler::~AliHLTTPCMemHandler()
73 if(fRandomDigits) delete [] fRandomDigits;
74 if(fDPt) delete [] fDPt;
77 void AliHLTTPCMemHandler::Init(Int_t s,Int_t p, Int_t *r)
87 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Init","sector coordinates")
88 <<"Invalid slice no " << s <<ENDLOG;
96 fRowMin=AliHLTTPCTransform::GetFirstRow(p);
97 fRowMax=AliHLTTPCTransform::GetLastRow(p);
102 void AliHLTTPCMemHandler::ResetROI()
104 //Resets the Look-up table for Region of Interest mode.
105 for(Int_t i=fRowMin; i<=fRowMax; i++)
107 fEtaMinTimeBin[i] = 0;
108 fEtaMaxTimeBin[i] = AliHLTTPCTransform::GetNTimeBins()-1;
112 void AliHLTTPCMemHandler::SetROI(const Float_t *eta,Int_t */*slice*/)
114 // Init the Look-up table for the Region of Interest mode.
115 // Here you can specify a certain etaregion, - all data
116 // outside this region will be discarded:
117 // eta[0] = mimium eta
118 // eta[1] = maximum eta
119 // slice[0] = mimumum slice
120 // slice[1] = maximum slice
123 if(TMath::Abs(eta[1])<.00001)
125 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetROI","Eta Values")
126 <<"Bad ROI parameters."<<ENDLOG;
127 for(Int_t i=fRowMin; i<=fRowMax; i++)
135 for(Int_t i=fRowMin; i<=fRowMax; i++)
140 Float_t thetamax = 2*atan(exp(-1.*eta[1]));
142 xyz[0] = AliHLTTPCTransform::Row2X(i);
144 xyz[2] = xyz[0]/tan(thetamax);
145 AliHLTTPCTransform::Slice2Sector(fSlice,i,sector,row);
146 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
148 fEtaMinTimeBin[i] = (Int_t)xyz[2];
150 if(TMath::Abs(eta[0])<.00001)
151 fEtaMaxTimeBin[i] = 445;
154 Float_t thetamin = 2*atan(exp(-1.*eta[0]));
155 xyz[0] = AliHLTTPCTransform::Row2X(i);
156 xyz[1] = AliHLTTPCTransform::GetMaxY(i);
157 Float_t radii = sqrt(pow(xyz[0],2) + pow(xyz[1],2));
158 xyz[2] = radii/tan(thetamin);
159 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
160 fEtaMaxTimeBin[i] = (Int_t)xyz[2];
166 Bool_t AliHLTTPCMemHandler::SetBinaryInput(char *name)
168 //Set the input binary file.
169 fInBinary = fopen(name,"r");
171 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
172 <<"Error opening file "<<name<<ENDLOG;
178 Bool_t AliHLTTPCMemHandler::SetBinaryInput(FILE *file)
180 //Set the input binary file.
183 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryInput","File Open")
184 <<"Pointer to File = 0x0 "<<ENDLOG;
190 void AliHLTTPCMemHandler::CloseBinaryInput()
192 //Close the input file.
194 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryInput","File Close")
195 <<"Nothing to Close"<<ENDLOG;
202 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(char *name)
204 //Set the binary output file.
205 fOutBinary = fopen(name,"w");
207 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
208 <<"Pointer to File = 0x0 "<<ENDLOG;
214 Bool_t AliHLTTPCMemHandler::SetBinaryOutput(FILE *file)
216 //Set the binary output file.
219 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::SetBinaryOutput","File Open")
220 <<"Pointer to File = 0x0 "<<ENDLOG;
226 void AliHLTTPCMemHandler::CloseBinaryOutput()
230 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CloseBinaryOutPut","File Close")
231 <<"Nothing to Close"<<ENDLOG;
238 UInt_t AliHLTTPCMemHandler::GetFileSize()
240 //Returns the file size in bytes of the input file.
242 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetFileSize","File")
243 <<"No Input File"<<ENDLOG;
246 fseek(fInBinary,0,SEEK_END);
247 long size=ftell(fInBinary);
249 if (size<0) return 0;
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::DigitizePoint(Int_t row, Int_t pad,
376 Int_t time,Int_t charge)
378 //Making one single random cluster.
379 for(Int_t j=-1;j<2;j++){
380 for(Int_t k=-1;k<2;k++){
381 Int_t dcharge = charge;
384 if(dcharge<10) continue;
385 Int_t dpad = j + pad;
386 Int_t dtime = k + time;
388 if(dpad<0||dpad>=AliHLTTPCTransform::GetNPads(row)) continue;
389 if(dtime<0||dtime>=AliHLTTPCTransform::GetNTimeBins()) continue;
391 fRandomDigits[fNDigits].fCharge = dcharge;
392 fRandomDigits[fNDigits].fRow = row;
393 fRandomDigits[fNDigits].fPad = dpad;
394 fRandomDigits[fNDigits].fTime = dtime;
395 fDPt[fNDigits] = &fRandomDigits[fNDigits];
401 ///////////////////////////////////////// Digit IO
402 Bool_t AliHLTTPCMemHandler::Memory2BinaryFile(UInt_t nrow,AliHLTTPCDigitRowData *data)
404 //Write data to the outputfile as is. No run-length encoding is done.
407 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
408 <<"No Output File"<<ENDLOG;
412 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
413 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
417 AliHLTTPCDigitRowData *rowPt = data;
419 for(UInt_t i=0;i<nrow;i++){
420 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit
421 + sizeof(AliHLTTPCDigitRowData);
423 fwrite(rowPt,size,1,fOutBinary);
424 Byte_t *bytePt =(Byte_t *) rowPt;
426 rowPt = (AliHLTTPCDigitRowData *) bytePt;
428 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","Memory")
429 <<AliHLTTPCLog::kDec<<"Wrote "<<outsize<<" Bytes to Memory ("
430 <<nrow<<" Rows)"<<ENDLOG;
434 void AliHLTTPCMemHandler::AddData(AliHLTTPCDigitData *data,UInt_t & ndata,
435 UInt_t /*row*/,UShort_t pad,UShort_t time,UShort_t charge) const
438 data[ndata].fPad = pad;
439 data[ndata].fTime = time;
440 data[ndata].fCharge = charge;
444 void AliHLTTPCMemHandler::AddRandom(AliHLTTPCDigitData *data, UInt_t & ndata)
446 //add some random data
447 data[ndata].fPad = fDPt[fNUsed]->fPad;
448 data[ndata].fTime = fDPt[fNUsed]->fTime;
449 data[ndata].fCharge = fDPt[fNUsed]->fCharge;
454 void AliHLTTPCMemHandler::MergeDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
455 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
458 data[ndata].fPad = pad;
459 data[ndata].fTime = time;
460 data[ndata].fCharge = charge;
461 while(ComparePoints(row,pad,time)==0){
462 Int_t ch = data[ndata].fCharge + fDPt[fNUsed]->fCharge;
463 if(charge>=AliHLTTPCTransform::GetADCSat()) ch = AliHLTTPCTransform::GetADCSat();
464 data[ndata].fCharge = ch;
470 void AliHLTTPCMemHandler::AddDataRandom(AliHLTTPCDigitData *data, UInt_t & ndata,
471 UInt_t row, UShort_t pad, UShort_t time, UShort_t charge)
475 while((action=ComparePoints(row,pad,time))==1){
476 AddRandom(data,ndata);
479 MergeDataRandom(data,ndata,row,pad,time,charge);
482 AddData(data,ndata,row,pad,time,charge);
486 void AliHLTTPCMemHandler::Write(UInt_t *comp, UInt_t & index,
487 UInt_t & subindex, UShort_t value) const
489 //write compressed data
490 UInt_t shift[3] = {0,10,20};
491 if(subindex==0) comp[index] =0; //clean up memory
492 comp[index] |= (value&0x03ff)<<shift[subindex];
500 UShort_t AliHLTTPCMemHandler::Read(UInt_t *comp, UInt_t & index, UInt_t & subindex) const
502 //read compressed data
503 UInt_t shift[3] = {0,10,20};
504 UShort_t value = (comp[index]>>shift[subindex])&0x03ff;
514 UShort_t AliHLTTPCMemHandler::Test(const UInt_t *comp,
515 UInt_t index, UInt_t subindex) const
518 UInt_t shift[3] = {0,10,20};
519 return (comp[index]>>shift[subindex])&0x03ff;
522 Int_t AliHLTTPCMemHandler::Memory2CompMemory(UInt_t nrow,
523 AliHLTTPCDigitRowData *data,UInt_t *comp)
525 //Performs run-length encoding on data stored in memory pointed to by data.
526 //The compressed data is written to comp.
528 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
529 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
533 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2CompMemory","Memory")
534 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
537 AliHLTTPCDigitRowData *rowPt = data;
541 for(UInt_t i=0;i<nrow;i++){
542 UShort_t value = rowPt->fRow;
543 Write(comp,index,subindex,value);
547 for(Int_t d=0;d<200;d++) ddd[d]=0;
548 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
549 if(rowPt->fDigitData[dig].fPad <200){
550 ddd[rowPt->fDigitData[dig].fPad]++;
553 for(Int_t d=0;d<200;d++){
559 Write(comp,index,subindex,npad);
561 for(UShort_t pad=0;pad <= maxpad;pad++){
562 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
564 Write(comp,index,subindex,pad);
565 // write zero if time != 0
566 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
567 if(rowPt->fDigitData[digit].fTime>0){
568 Write(comp,index,subindex,0);
569 Write(comp,index,subindex,rowPt->fDigitData[digit].fTime);
572 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
573 UShort_t charge = rowPt->fDigitData[digit].fCharge;
577 Write(comp,index,subindex,charge);
578 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
579 if(rowPt->fDigitData[digit].fTime +1 !=
580 rowPt->fDigitData[digit+1].fTime){
581 Write(comp,index,subindex,0);
582 UShort_t nzero = rowPt->fDigitData[digit+1].fTime -
583 (rowPt->fDigitData[digit].fTime +1);
584 Write(comp,index,subindex,nzero);
589 Write(comp,index,subindex,0);
590 Write(comp,index,subindex,0);
593 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
594 sizeof(AliHLTTPCDigitRowData);
595 Byte_t *bytePt =(Byte_t *) rowPt;
597 rowPt = (AliHLTTPCDigitRowData *) bytePt;
600 Write(comp,index,subindex,0);
601 return index * sizeof(UInt_t);
604 UInt_t AliHLTTPCMemHandler::GetCompMemorySize(UInt_t nrow,AliHLTTPCDigitRowData *data) const
606 //Return the size of RLE data, after compressing data.
609 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetCompMemorySize","Memory")
610 <<"Pointer to AliHLTTPCDigitRowData = 0x0 "<<ENDLOG;
613 AliHLTTPCDigitRowData *rowPt = data;
616 for(UInt_t i=0;i<nrow;i++){
621 for(Int_t d=0;d<200;d++) ddd[d]=0;
622 for(UInt_t dig=0;dig<rowPt->fNDigit;dig++){
623 if(rowPt->fDigitData[dig].fPad <200){
624 ddd[rowPt->fDigitData[dig].fPad]++;
627 for(Int_t d=0;d<200;d++){
635 for(UShort_t pad=0;pad <= maxpad;pad++){
636 if(digit>=rowPt->fNDigit || rowPt->fDigitData[digit].fPad != pad)
639 // write zero if time != 0
640 if(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
641 if(rowPt->fDigitData[digit].fTime>0){
646 while(digit<rowPt->fNDigit && rowPt->fDigitData[digit].fPad == pad){
648 if(digit+1<rowPt->fNDigit&&rowPt->fDigitData[digit+1].fPad == pad){
649 if(rowPt->fDigitData[digit].fTime +1 !=
650 rowPt->fDigitData[digit+1].fTime){
661 Int_t size = sizeof(AliHLTTPCDigitData) * rowPt->fNDigit+
662 sizeof(AliHLTTPCDigitRowData);
663 Byte_t *bytePt =(Byte_t *) rowPt;
665 rowPt = (AliHLTTPCDigitRowData *) bytePt;
669 return (index/3) * sizeof(UInt_t);
672 UInt_t AliHLTTPCMemHandler::GetMemorySize(UInt_t nrow,UInt_t *comp) const
676 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetMemorySize","Memory")
677 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
685 for(UInt_t i=0;i<nrow;i++){
687 Read(comp,index,subindex);
688 UShort_t npad = Read(comp,index,subindex);
689 for(UShort_t p=0;p<npad;p++){
690 Read(comp,index,subindex);
691 if(Test(comp,index,subindex)==0){
692 Read(comp,index,subindex);
693 if(Read(comp,index,subindex)== 0) continue;
696 while(Read(comp,index,subindex)!=0) ndigit++;
697 if(Read(comp,index,subindex)==0) break;
700 Int_t size = sizeof(AliHLTTPCDigitData) * ndigit+
701 sizeof(AliHLTTPCDigitRowData);
708 UInt_t AliHLTTPCMemHandler::GetNRow(UInt_t *comp,UInt_t size)
712 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::GetNRow","Memory")
713 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
720 while(index<size-1){ //don't start with last word
723 Read(comp,index,subindex);
724 UShort_t npad = Read(comp,index,subindex);
725 for(UShort_t p=0;p<npad;p++){
726 Read(comp,index,subindex);
727 if(Test(comp,index,subindex)==0){
728 Read(comp,index,subindex);
729 if(Read(comp,index,subindex)==0)continue;
732 while(Read(comp,index,subindex)!=0) ndigit++;
733 if(Read(comp,index,subindex)==0) break;
737 if(index==size-1){ //last word
739 if(Read(comp,index,subindex)!=0) nrow++;
745 Bool_t AliHLTTPCMemHandler::CompMemory2CompBinary(UInt_t nrow,UInt_t *comp,
748 //Write the RLE data in comp to the output file.
751 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","File")
752 <<"No Output File"<<ENDLOG;
756 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
757 <<"Pointer to compressed data = 0x0 "<<ENDLOG;
761 size=GetMemorySize(nrow,comp);
763 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::CompMemory2CompBinary","Memory")
764 <<"Memory size = 0 "<<ENDLOG;
767 UInt_t length = size/sizeof(UInt_t);
768 fwrite(&length,sizeof(UInt_t),1,fOutBinary);
769 fwrite(comp,size,1,fOutBinary);
774 Bool_t AliHLTTPCMemHandler::Memory2CompBinary(UInt_t nrow,AliHLTTPCDigitRowData *data)
776 //Perform RLE on the data, and write it to the output file.
778 AliHLTTPCMemHandler * handler = new AliHLTTPCMemHandler();
779 UInt_t size = GetCompMemorySize(nrow,data);
780 UInt_t *comp =(UInt_t *)handler->Allocate(size);
781 Memory2CompMemory(nrow,data,comp);
782 CompMemory2CompBinary(nrow,comp,size);
789 ///////////////////////////////////////// Point IO
790 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t npoint,AliHLTTPCSpacePointData *data)
792 //Writing spacepoints stored in data to the outputfile.
794 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
795 <<"No Output File"<<ENDLOG;
799 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
800 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
803 UInt_t size = npoint*sizeof(AliHLTTPCSpacePointData);
804 fwrite(data,size,1,fOutBinary);
809 Bool_t AliHLTTPCMemHandler::Transform(UInt_t npoint,AliHLTTPCSpacePointData *data,Int_t slice)
811 //Transform the space points in data, to global coordinates in slice.
813 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Transform","Memory")
814 <<"Pointer to AliHLTTPCSpacePointData = 0x0 "<<ENDLOG;
818 for(UInt_t i=0;i<npoint;i++){
823 AliHLTTPCTransform::Local2Global(xyz,slice);
831 ///////////////////////////////////////// Track IO
832 Bool_t AliHLTTPCMemHandler::Memory2Binary(UInt_t ntrack,AliHLTTPCTrackSegmentData *data)
834 //Write the tracks stored in data, to outputfile.
836 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","File")
837 <<"No Output File"<<ENDLOG;
841 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2Binary","Memory")
842 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
845 AliHLTTPCTrackSegmentData *trackPt = data;
846 for(UInt_t i=0;i<ntrack;i++){
847 Int_t size=sizeof(AliHLTTPCTrackSegmentData)+trackPt->fNPoints*sizeof(UInt_t);
848 fwrite(trackPt,size,1,fOutBinary);
849 Byte_t *bytePt = (Byte_t*) trackPt;
851 trackPt = (AliHLTTPCTrackSegmentData*) bytePt;
853 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCMemHandler::Memory2Binary","File")
854 <<AliHLTTPCLog::kDec<<"Wrote "<<ntrack<<" Tracks to File"<<ENDLOG;
859 Bool_t AliHLTTPCMemHandler::TrackArray2Binary(AliHLTTPCTrackArray *array)
861 //Write the trackarray to the outputfile.
863 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","File")
864 <<"No Output File"<<ENDLOG;
868 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Binary","Memory")
869 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
872 AliHLTTPCTrackSegmentData *data = (AliHLTTPCTrackSegmentData *)Allocate(array);
875 TrackArray2Memory(ntrack,data,array);
876 Memory2Binary(ntrack,data);
881 Bool_t AliHLTTPCMemHandler::TrackArray2Memory(UInt_t & ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
883 //Fill the trackarray into the AliTrackSegmentData structures before writing to outputfile.
885 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
886 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
890 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::TrackArray2Memory","Memory")
891 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
895 array->WriteTracks(ntrack,data);
899 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array) const
901 //Fill the tracks in data into trackarray.
904 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
905 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
909 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
910 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
913 array->FillTracks(ntrack,data);
917 Bool_t AliHLTTPCMemHandler::Memory2TrackArray(UInt_t ntrack,AliHLTTPCTrackSegmentData *data,AliHLTTPCTrackArray *array,Int_t slice) const
919 //Fill the tracks in data into trackarray, and rotate the tracks to global coordinates.
922 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
923 <<"Pointer to AliHLTTPCTrackSegmentData = 0x0 "<<ENDLOG;
927 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMemHandler::Memory2TrackArray","Memory")
928 <<"Pointer to AliHLTTPCTrackArray = 0x0 "<<ENDLOG;
931 array->FillTracks(ntrack,data,slice);
935 void AliHLTTPCMemHandler::UpdateRowPointer(AliHLTTPCDigitRowData *&tempPt)
937 //Update the data pointer to the next padrow in memory.
939 Byte_t *tmp = (Byte_t*)tempPt;
940 Int_t size = sizeof(AliHLTTPCDigitRowData) + tempPt->fNDigit*sizeof(AliHLTTPCDigitData);
942 tempPt = (AliHLTTPCDigitRowData*)tmp;
945 Int_t AliHLTTPCMemHandler::ComparePoints(UInt_t /*row*/,UShort_t pad,UShort_t time) const
948 if(fNUsed>=fNDigits) return -2;
950 if(pad==fDPt[fNUsed]->fPad&&time==fDPt[fNUsed]->fTime) return 0;
952 if(pad<fDPt[fNUsed]->fPad) return -1;
953 if(pad==fDPt[fNUsed]->fPad&&time<fDPt[fNUsed]->fTime) return -1;
958 Int_t AliHLTTPCMemHandler::CompareDigits(const AliHLTTPCRandomDigitData *a,const AliHLTTPCRandomDigitData *b) const
961 if(a->fPad==b->fPad && a->fTime == b->fTime) return 0;
963 if(a->fPad<b->fPad) return -1;
964 if(a->fPad==b->fPad && a->fTime<b->fTime) return -1;