//-*- Mode: C++ -*- // ************************************************************************ // This file is property of and copyright by the ALICE HLT Project * // ALICE Experiment at CERN, All rights reserved. * // See cxx source for full Copyright notice * // * //************************************************************************* #ifndef ALIHLTTPCCAMERGER_H #define ALIHLTTPCCAMERGER_H #include "AliHLTTPCCADef.h" #include "AliHLTTPCCAParam.h" #include "AliHLTTPCCATrackParam.h" #include "AliHLTTPCCASliceTrack.h" #include #if !defined(HLTCA_GPUCODE) #include #endif class AliHLTTPCCATrackParamVector; class AliHLTTPCCASliceTrack; class AliHLTTPCCASliceOutput; class AliHLTTPCCAMergedTrack; class AliHLTTPCCAMergerOutput; /** * @class AliHLTTPCCAMerger * */ class AliHLTTPCCAClusterInfo; class AliHLTTPCCAMerger { // public: // class AliHLTTPCCAClusterInfo; private: // struct AliHLTTPCCATrackMemory; // struct AliHLTTPCCAHitMemory; class AliHLTTPCCASliceTrackInfo; class AliHLTTPCCABorderTrack { public: int TrackID() const { return fTrackID; } float b() const{ return fb; } float bErr2() const{ return fbErr2; } float p() const{ return fp; } float pErr2() const{ return fpErr2; } unsigned short InnerRow() const {return fInnerRow;} unsigned short OuterRow() const {return fOuterRow;} void SetInnerRow(unsigned short v) {fInnerRow = v;} void SetOuterRow(unsigned short v) {fOuterRow = v;} void SetTrackID ( int v ) { fTrackID = v; } void Setb (float v) { fb = v; } void SetbErr2 (float v) { fbErr2 = v; } void Setp (float v) { fp = v; } void SetpErr2 (float v) { fpErr2 = v; } private: float fb; float fbErr2; float fp; float fpErr2; int fTrackID; // track index unsigned short fInnerRow; unsigned short fOuterRow; }; public: AliHLTTPCCAMerger(); ~AliHLTTPCCAMerger(); void SetSliceParam( const AliHLTTPCCAParam &v ) { fSliceParam = v; } void Clear(); void SetSliceData( int index, const AliHLTTPCCASliceOutput *SliceData ); void Reconstruct(); const AliHLTTPCCAMergerOutput * Output() const { return fOutput; } // bool FitTrack( AliHLTTPCCATrackParam &T, float &Alpha, // AliHLTTPCCATrackParam t0, float Alpha0, int hits[], int &NHits, bool dir = 0 ); void SetSlices ( int i, AliHLTTPCCATracker *sl ); int NTimers() { return fNTimers; } float Timer( int i ) { return fTimers[i]; }; private: void ConvertTrackParamToVector( AliHLTTPCCATrackParam t0[ushort_v::Size], AliHLTTPCCATrackParamVector &t, int &nTracksV); sfloat_m FitTrack( AliHLTTPCCATrackParamVector &t, sfloat_v &Alpha0V, int hits[1000][ushort_v::Size], ushort_v &firstHits, ushort_v::Memory &NTrackHits, int &nTracksV, sfloat_m active0 = sfloat_m(true), bool dir = 1 ); AliHLTTPCCAMerger( const AliHLTTPCCAMerger& ); const AliHLTTPCCAMerger &operator=( const AliHLTTPCCAMerger& ) const; void InvertCholetsky(float a[15]); void MultiplySS(float const C[15], float const V[15], float K[5][5]); void MultiplyMS(float const C[5][5], float const V[15], float K[15]); void MultiplySR(float const C[15], float const r_in[5], float r_out[5]); void FilterTracks(float const r[5], float const C[15], float const m[5], float const V[15], float R[5], float W[15], float &chi2); void InvertCholetsky(sfloat_v a[15]); void MultiplySS(sfloat_v const C[15], sfloat_v const V[15], sfloat_v K[5][5]); void MultiplyMS(sfloat_v const C[5][5], sfloat_v const V[15], sfloat_v K[15]); void MultiplySR(sfloat_v const C[15], sfloat_v const r_in[5], sfloat_v r_out[5]); void FilterTracks(sfloat_v const r[5], sfloat_v const C[15], sfloat_v const m[5], sfloat_v const V[15], sfloat_v R[5], sfloat_v W[15], sfloat_v &chi2, const sfloat_m &mask = sfloat_m( true )); static bool CompareInnerRow (const AliHLTTPCCABorderTrack &b1, const AliHLTTPCCABorderTrack &b2) { return (b1.InnerRow() > b2.InnerRow()) || ( (b1.InnerRow() == b2.InnerRow()) && (b1.b() > b2.b()) ) ; } static bool CompareOuterRow (const AliHLTTPCCABorderTrack &b1, const AliHLTTPCCABorderTrack &b2) { return (b1.OuterRow() < b2.OuterRow())/* || ( (b1.OuterRow() == b2.OuterRow()) && (b1.b() > b2.b()) )*/ ; } void UnpackSlices(); void Merging(int number=0); void MakeBorderTracks(AliHLTTPCCABorderTrack B[], unsigned short &nB, unsigned char &iSlice ); void MergeBorderTracks( AliHLTTPCCABorderTrack B1[], int N1, int iSlice1, AliHLTTPCCABorderTrack B2[], int N2, int iSlice2, int number, unsigned short FirstTrIR[], unsigned short LastTrIR[]); static const int fgkNSlices = AliHLTTPCCAParameters::NumberOfSlices; //* N slices AliHLTTPCCAParam fSliceParam; //* slice parameters (geometry, calibr, etc.) const AliHLTTPCCASliceOutput *fkSlices[fgkNSlices]; //* array of input slice tracks AliHLTTPCCATracker *slices[fgkNSlices]; //* array of input slice tracks int fMaxClusterInfos; //* booked size of fClusterInfos array AliHLTTPCCAClusterInfo *fClusterInfos; //* information about track clusters int fMaxTrackInfos; //* booked size of fTrackInfos array AliHLTTPCCASliceTrackInfo *fTrackInfos; //* additional information for slice tracks int fSliceTrackInfoStart[fgkNSlices]; //* slice starting index in fTrackInfos array; int fSliceNTrackInfos[fgkNSlices]; //* N of slice track infos in fTrackInfos array; AliHLTTPCCAMergerOutput *fOutput; //* array of output merged tracks static const int fNTimers = 8; float fTimers[fNTimers]; // AliHLTTPCCAHitMemory fHitMemory; }; #include "AliHLTTPCCATrackParamVector.h" inline void AliHLTTPCCAMerger::ConvertTrackParamToVector( AliHLTTPCCATrackParam t0[ushort_v::Size], AliHLTTPCCATrackParamVector &t, int &nTracksV) { sfloat_v tmpVec; short_v tmpVecShort; sfloat_v::Memory tmpFloat; short_v::Memory tmpShort; for(int iV=0; iV < nTracksV; iV++) tmpFloat[iV] = t0[iV].X(); tmpVec.load( tmpFloat ); t.SetX(tmpVec); for(int iV=0; iV < nTracksV; iV++) tmpFloat[iV] = t0[iV].SignCosPhi(); tmpVec.load( tmpFloat ); t.SetSignCosPhi(tmpVec); for(int iP=0; iP<5; iP++) { for(int iV=0; iV < nTracksV; iV++) tmpFloat[iV] = t0[iV].Par()[iP]; tmpVec.load( tmpFloat ); t.SetPar(iP,tmpVec); } for(int iC=0; iC<15; iC++) { for(int iV=0; iV < nTracksV; iV++) tmpFloat[iV] = t0[iV].Cov()[iC]; tmpVec.load( tmpFloat ); t.SetCov(iC,tmpVec); } for(int iV=0; iV < nTracksV; iV++) tmpFloat[iV] = t0[iV].Chi2(); tmpVec.load( tmpFloat ); t.SetChi2(tmpVec); for(int iV=0; iV < nTracksV; iV++) tmpShort[iV] = t0[iV].NDF(); tmpVecShort.load( tmpShort ); t.SetNDF(tmpVecShort); } inline void AliHLTTPCCAMerger::InvertCholetsky(sfloat_v a[15]) { sfloat_v d[5], uud, u[5][5]; for(int i=0; i<5; i++) { d[i]=0.f; for(int j=0; j<5; j++) u[i][j]=0.; } for(int i=0; i<5; i++) { uud=0.; for(int j=0; j