]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/transform/AliHLTTPCSpline2D3D.cxx
Bug fixes in HLT cluster transformation:
[u/mrichter/AliRoot.git] / HLT / TPCLib / transform / AliHLTTPCSpline2D3D.cxx
CommitLineData
dc9f7928 1//**************************************************************************
2//* This file is property of and copyright by the ALICE HLT Project *
3//* ALICE Experiment at CERN, All rights reserved. *
4//* *
5//* Primary Authors: Sergey Gorbunov <sergey.gorbunov@cern.ch> *
6//* for The ALICE HLT Project. *
7//* *
8//* Permission to use, copy, modify and distribute this software and its *
9//* documentation strictly for non-commercial purposes is hereby granted *
10//* without fee, provided that the above copyright notice appears in all *
11//* copies and that both the copyright notice and this permission notice *
12//* appear in the supporting documentation. The authors make no claims *
13//* about the suitability of this software for any purpose. It is *
14//* provided "as is" without express or implied warranty. *
15//**************************************************************************
16
17/** @file AliHLTTPCSpline2D3D.cxx
18 @author Sergey Gorbubnov
19 @date
20 @brief
21*/
22
23
24#include "AliHLTTPCFastTransform.h"
25#include "AliTPCTransform.h"
26#include "AliTPCParam.h"
27#include "AliTPCcalibDB.h"
10801676 28#include "Vc/Vc"
29
dc9f7928 30#include <iostream>
31#include <iomanip>
32
33using namespace std;
34
35
36
dc9f7928 37void AliHLTTPCSpline2D3D::Init(Float_t minA,Float_t maxA, Int_t nBinsA, Float_t minB,Float_t maxB, Int_t nBinsB)
38{
39 //
40 // Initialisation
41 //
42
43 if( maxA<= minA ) maxA = minA+1;
44 if( maxB<= minB ) maxB = minB+1;
10801676 45 if( nBinsA <4 ) nBinsA = 4;
46 if( nBinsB <4 ) nBinsB = 4;
dc9f7928 47
48 fNA = nBinsA;
49 fNB = nBinsB;
50 fN = fNA*fNB;
51 fMinA = minA;
52 fMinB = minB;
53
54 fStepA = (maxA-minA)/(nBinsA-1);
55 fStepB = (maxB-minB)/(nBinsB-1);
56 fScaleA = 1./fStepA;
57 fScaleB = 1./fStepB;
58
ff03d6ea 59 Vc::free( fXYZ );
60 fXYZ = Vc::malloc< float, Vc::AlignOnCacheline>( 4*fN );
10801676 61 memset ( fXYZ, 0, fN*4*sizeof(Float_t) );
dc9f7928 62}
63
ff03d6ea 64AliHLTTPCSpline2D3D::~AliHLTTPCSpline2D3D()
65{
66 Vc::free( fXYZ );
67}
10801676 68
69void AliHLTTPCSpline2D3D::Consolidate()
dc9f7928 70{
71 //
10801676 72 // Consolidate the map
dc9f7928 73 //
10801676 74
75 Float_t *m = fXYZ;
76 for( int iXYZ=0; iXYZ<3; iXYZ++ ){
77 for( int iA=0; iA<fNA; iA++){
78 {
79 int i0 = 4*iA*fNB + iXYZ;
80 int i1 = i0+4;
81 int i2 = i0+4*2;
82 int i3 = i0+4*3;
83 m[i0] = 0.5*( m[i3]+m[i0]+3*(m[i1]-m[i2]) );
84 }
85 {
86 int i0 = 4*(iA*fNB+fNB-4) + iXYZ;
87 int i1 = i0+4;
88 int i2 = i0+4*2;
89 int i3 = i0+4*3;
90 m[i3] = 0.5*( m[i0]+m[i3]+3*(m[i2]-m[i1]) );
91 }
92 }
93 for( int iB=0; iB<fNB; iB++){
94 {
95 int i0 = 4*(0*fNB +iB) +iXYZ;
96 int i1 = i0+4*fNB;
97 int i2 = i1+4*fNB;
98 int i3 = i2+4*fNB;
99 m[i0] = 0.5*( m[i3]+m[i0]+3*(m[i1]-m[i2]) );
100 }
101 {
102 int i0 = 4*((fNA-4)*fNB +iB) +iXYZ;
103 int i1 = i0+4*fNB;
104 int i2 = i1+4*fNB;
105 int i3 = i2+4*fNB;
106 m[i3] = 0.5*( m[i0]+m[i3]+3*(m[i2]-m[i1]) );
107 }
108 }
dc9f7928 109 }
10801676 110 }
dc9f7928 111
112
113
10801676 114inline Vc::float_v GetSpline3Vc(Vc::float_v v0, Vc::float_v v1, Vc::float_v v2, Vc::float_v v3,
115 Vc::float_v x, Vc::float_v x2)
116{
117 Vc::float_v dv = v2-v1;
118 Vc::float_v z0 = 0.5f*(v2-v0);
119 Vc::float_v z1 = 0.5f*(v3-v1);
120 return x2*( (z1-dv + z0-dv)*(x-1) - (z0-dv) ) + z0*x + v1;
121}
dc9f7928 122
123void AliHLTTPCSpline2D3D::GetValue(Float_t A, Float_t B, Float_t XYZ[] ) const
124{
125 //
126 // Get Interpolated value at A,B
127 //
128
10801676 129 Float_t lA = (A-fMinA)*fScaleA-1.f;
130 Int_t iA = (int) lA;
131 if( lA<0 ) iA=0;
132 else if( iA>fNA-4 ) iA = fNA-4;
133
134 Float_t lB = (B-fMinB)*fScaleB -1.f;
135 Int_t iB = (int) lB;
136 if( lB<0 ) iB=0;
137 else if( iB>fNB-4 ) iB = fNB-4;
138
139 if( Vc::float_v::Size==4 ){
140 Vc::float_v da = lA-iA;
141 Vc::float_v db = lB-iB;
142 Vc::float_v db2=db*db;
143
144 Vc::float_v v[4];
145 Int_t ind = iA*fNB + iB;
146 const Vc::float_v *m = reinterpret_cast< const Vc::float_v *>(fXYZ);
147
148 for( Int_t i=0; i<4; i++ ){
149 v[i] = GetSpline3Vc(m[ind+0],m[ind+1],m[ind+2],m[ind+3],db,db2);
150 ind+=fNB;
dc9f7928 151 }
10801676 152 Vc::float_v res=GetSpline3Vc(v[0],v[1],v[2],v[3],da,da*da);
153 XYZ[0] = res[0];
154 XYZ[1] = res[1];
155 XYZ[2] = res[2];
dc9f7928 156 } else {
10801676 157 Float_t da = lA-iA;
158 Float_t db = lB-iB;
159
160 Float_t vx[4];
161 Float_t vy[4];
162 Float_t vz[4];
163 Int_t ind = iA*fNB + iB;
164 for( Int_t i=0; i<4; i++ ){
165 int ind4 = ind*4;
166 vx[i] = GetSpline3(fXYZ[ind4+0],fXYZ[ind4+4],fXYZ[ind4 +8],fXYZ[ind4+12],db);
167 vy[i] = GetSpline3(fXYZ[ind4+1],fXYZ[ind4+5],fXYZ[ind4 +9],fXYZ[ind4+13],db);
168 vz[i] = GetSpline3(fXYZ[ind4+2],fXYZ[ind4+6],fXYZ[ind4+10],fXYZ[ind4+14],db);
169 ind+=fNB;
170 }
171 XYZ[0] = GetSpline3(vx,da);
172 XYZ[1] = GetSpline3(vy,da);
173 XYZ[2] = GetSpline3(vz,da);
dc9f7928 174 }
175}