25 std::unique_ptr<double[]> DerivC(
new double[NPar] );
26 std::unique_ptr<double[]> DerivP(
new double[NPar] );
27 std::unique_ptr<double[]> DerivT(
new double[NPar] );
29 std::vector<double> vMagFld;
double vBx,vBy,vBz;
30 for( iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
33 vMagFld.push_back(vBz);
36 for( iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
44 if(ivnext<0){
return -1;};
48 for(it=0; it<NV; it++)
54 posCombTrk =cascadeEvent_.
matrixPnt[ivnext]+3+3*indCombTrk;
56 if(posCombTrk==0 || iniPosTrk==0) {
return -1;}
59 for(
int ivt=0; ivt<NPar; ivt++)DerivC[ivt]=DerivP[ivt]=DerivT[ivt]=0.;
60 DerivC[posCombTrk+2]=-1.;
61 DerivT[posCombTrk+0]=-1.;
62 DerivP[posCombTrk+1]=-1.;
65 double ptsum=sqrt(ppsum[0]*ppsum[0] + ppsum[1]*ppsum[1]);
66 double sinth2sum=(ppsum[0]*ppsum[0] + ppsum[1]*ppsum[1])/(ppsum[0]*ppsum[0] + ppsum[1]*ppsum[1] + ppsum[2]*ppsum[2]);
70 for(it=0; it<(int)vk->
TrackList.size(); it++){
73 double pt=sqrt(pp[0]*pp[0] + pp[1]*pp[1]);
75 double sinth2=(pp[0]*pp[0] + pp[1]*pp[1])/(pp[0]*pp[0] + pp[1]*pp[1] + pp[2]*pp[2]);
76 DerivC[iniPosTrk+it*3+1] = csum/ptsum/ptsum*(ppsum[0]*pp[1]-ppsum[1]*pp[0]);
77 DerivC[iniPosTrk+it*3+2] = csum/ptsum/ptsum*(ppsum[0]*pp[0]+ppsum[1]*pp[1])/curv;
78 DerivP[iniPosTrk+it*3+1] = (ppsum[0]*pp[0]+ppsum[1]*pp[1])/ptsum/ptsum;
79 DerivP[iniPosTrk+it*3+2] = (ppsum[1]*pp[0]-ppsum[0]*pp[1])/ptsum/ptsum/curv;
80 DerivT[iniPosTrk+it*3+0] = (sinth2sum*pt)/(sinth2*ptsum);
81 DerivT[iniPosTrk+it*3+2] = (sinth2sum*pt*cth)/(curv*ptsum);
94 for(it=0; it<NPar; it++) fullMtx[ (NPar-3*(cascadeEvent_.
cascadeNV-1)+3*iv )*NPar + it] = DerivT[it];
95 for(it=0; it<NPar; it++) fullMtx[ (NPar-3*(cascadeEvent_.
cascadeNV-1)+3*iv+1)*NPar + it] = DerivP[it];
96 for(it=0; it<NPar; it++) fullMtx[ (NPar-3*(cascadeEvent_.
cascadeNV-1)+3*iv+2)*NPar + it] = DerivC[it];
97 for(it=0; it<NPar; it++) fullMtx[ (NPar-3*(cascadeEvent_.
cascadeNV-1)+3*iv ) + it*NPar] = DerivT[it];
98 for(it=0; it<NPar; it++) fullMtx[ (NPar-3*(cascadeEvent_.
cascadeNV-1)+3*iv+1) + it*NPar] = DerivP[it];
99 for(it=0; it<NPar; it++) fullMtx[ (NPar-3*(cascadeEvent_.
cascadeNV-1)+3*iv+2) + it*NPar] = DerivC[it];
171 std::vector<int> & matrixPnt,
172 std::vector< std::vector<double> > & covarCascade,
175 int iv, Pnt, ic,
ir, vrtMtxSize,
count;
176 for( iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
180 std::vector<double> Res(vrtMtxSize*(vrtMtxSize+1)/2);
182 for (
int col=0; col<vrtMtxSize; col++){
183 for (
int row=0; row<=col; row++){
184 ic=Pnt+col;
ir=Pnt+row;
188 covarCascade.emplace_back(std::move(Res));
194std::vector<double>
transformCovar(
int NPar,
double **Deriv,
const std::vector<double> &covarI)
196 std::vector<double> covarO(NPar * (NPar + 1) / 2, 0.0);
199 for (
int oi = 0; oi < NPar; ++oi) {
200 const double* der_oi = Deriv[oi];
202 for (
int oj = 0; oj <= oi; ++oj) {
203 const double* der_oj = Deriv[oj];
206 for (
int ii = 0; ii < NPar; ++ii) {
207 const double der_oi_ii = der_oi[ii];
210 int indexI = ii * (ii + 1) / 2;
211 for (
int ij = 0; ij <= ii; ++ij) {
212 sum += der_oi_ii * covarI[indexI++] * der_oj[ij];
218 for (
int ij = ii + 1; ij < NPar; ++ij) {
219 sum += der_oi_ii * covarI[indexI] * der_oj[ij];
225 covarO[indexO++] = sum;
237 for( iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
240 for( ivn=iv; ivn<cascadeEvent_.
cascadeNV; ivn++){
243 if( ivn == cascadeEvent_.
cascadeNV )
continue;
246 int From=matrixPnt[iv];
247 int Next=matrixPnt[iv+1];
248 int Into=matrixPnt[ivn];
251 ader[(0+Into) + (Next-1)*MATRIXSIZE] = - ader[(0+From) + (Next-1)*MATRIXSIZE];
252 ader[(1+Into) + (Next-1)*MATRIXSIZE] = - ader[(1+From) + (Next-1)*MATRIXSIZE];
253 ader[(2+Into) + (Next-1)*MATRIXSIZE] = - ader[(2+From) + (Next-1)*MATRIXSIZE];
254 ader[(0+Into) + (Next-2)*MATRIXSIZE] = - ader[(0+From) + (Next-2)*MATRIXSIZE];
255 ader[(1+Into) + (Next-2)*MATRIXSIZE] = - ader[(1+From) + (Next-2)*MATRIXSIZE];
256 ader[(2+Into) + (Next-2)*MATRIXSIZE] = - ader[(2+From) + (Next-2)*MATRIXSIZE];
257 ader[(0+Into)*MATRIXSIZE + (Next-1)] = - ader[(0+From) + (Next-1)*MATRIXSIZE];
258 ader[(1+Into)*MATRIXSIZE + (Next-1)] = - ader[(1+From) + (Next-1)*MATRIXSIZE];
259 ader[(2+Into)*MATRIXSIZE + (Next-1)] = - ader[(2+From) + (Next-1)*MATRIXSIZE];
260 ader[(0+Into)*MATRIXSIZE + (Next-2)] = - ader[(0+From) + (Next-2)*MATRIXSIZE];
261 ader[(1+Into)*MATRIXSIZE + (Next-2)] = - ader[(1+From) + (Next-2)*MATRIXSIZE];
262 ader[(2+Into)*MATRIXSIZE + (Next-2)] = - ader[(2+From) + (Next-2)*MATRIXSIZE];
static void getMagFld(const double, const double, const double, double &, double &, double &, const VKalVrtControlBase *)
void setFittedMatrices(const double *COVFIT, long int MATRIXSIZE, std::vector< int > &matrixPnt, std::vector< std::vector< double > > &covarCascade, CascadeEvent &cascadeEvent_)
void copyFullMtx(const double *Input, long int IPar, long int IDIM, double *VKAL_RESTRICT Target, long int TStart, long int TDIM) noexcept