36 double vBx,vBy,vBz,effectiveField;
46 totP.
Px=0.;totP.
Py=0.;totP.
Pz=0.;totP.
E=0.;
47 for(it=0; it<NTRK; it++){
56 if( target_trk ==
nullptr ) {
57 std::cout<<
" ERROR in CASCADE STRUCTURE"<<
'\n';
60 double Pt=sqrt(totP.
Px*totP.
Px + totP.
Py*totP.
Py);
62 if(Pt > std::abs(totP.
Pz)){
63 Mass = sqrt( (totP.
E-Pt)*(totP.
E+Pt) - totP.
Pz*totP.
Pz);
65 Mass = sqrt( (totP.
E-totP.
Pz)*(totP.
E+totP.
Pz) - Pt*Pt);
74 for(
int it=0; it<(int)vk->
TrackList.size(); it++) tCharge += vk->
TrackList[it]->Charge;
79 double cnstRemnants=0.;
80 for(
int iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
115 bool existPointingCnst=
false;
124 if(IERR)
return IERR;
125 if(vk->
Chi2 > 1.e4)
return -1;
149 if( target_trk ==
nullptr )
return -12;
152 if(Charge!=0) Charge=std::copysign(1,Charge);
153 target_trk->
Charge=Charge;
155 double dptot[4],VrtMomCov[21];
156 double parV0[5],covParV0[15],tmpCov[15],fittedVrt[3];
169 if (IERR)
return -13;
181 if(existPointingCnst){
184 VrtMomCov[0] *= 1000.;
185 VrtMomCov[2] *= 1000.;
186 VrtMomCov[5] *= 1000.;
187 VrtMomCov[9] *= 1000.;
188 VrtMomCov[14] *= 1000.;
189 VrtMomCov[20] *= 1000.;
196 double lPhi = atan2(dptot[1], dptot[0]);
197 double lTheta = acos(dptot[2] / sqrt(dptot[0]*dptot[0]+dptot[1]*dptot[1]+dptot[2]*dptot[2]));
199 combinedTrack( Charge, dptot, VrtMomCov, effectiveField, parV0, covParV0);
200 covParV0[0]=std::abs(covParV0[0]); covParV0[2]=std::abs(covParV0[2]); covParV0[5]=std::abs(covParV0[5]);
201 covParV0[9]=std::abs(covParV0[9]); covParV0[14]=std::abs(covParV0[14]);
208 if( target_trk->
fitP[2] == 0.){
213 target_trk->
iniP[0]=target_trk->
cnstP[0]=target_trk->
fitP[0];
214 target_trk->
iniP[1]=target_trk->
cnstP[1]=target_trk->
fitP[1];
215 target_trk->
iniP[2]=target_trk->
cnstP[2]=target_trk->
fitP[2];
217 target_trk->
iniP[0]=target_trk->
cnstP[0]=(target_trk->
fitP[0]+target_trk->
Perig[2])/2.;
218 target_trk->
iniP[1]=target_trk->
cnstP[1]=(target_trk->
fitP[1]+target_trk->
Perig[3])/2.;
219 target_trk->
iniP[2]=target_trk->
cnstP[2]=(target_trk->
fitP[2]+target_trk->
Perig[4])/2.;
221 if(tmpCov[0]>1.e12 || tmpCov[2]>1.e12)
return -18;
222 if(Pointing){tmpCov[0] += target_trk->
Perig[0]*target_trk->
Perig[0]; tmpCov[2] += target_trk->
Perig[1]*target_trk->
Perig[1];}
223 tmpCov[0] += 0.0001*0.0001; tmpCov[2] += 0.0002*0.0002;
226 if (IERR)
return -15;
235 double dptot[4],VrtMomCov[21];
237 if (IERR)
return -13;
256 long int Iter, IERR, iv, i;
262 for(iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
272 double Chi2Old=0.,Chi2Cur=0.;
273 for(Iter=0; Iter<100; Iter++){
275 for(iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
293 if(Chi2Cur>1.e6)
return -1;
298 if(std::abs(Chi2Cur-Chi2Old)<0.01)
break;
299 if(Iter>10 && (Chi2Cur-Chi2Old)>0.)
break;
305 if( cnstRemnants > 10000.e0)
return -2;
306 if(cnstRemnants==0. && Chi2Cur>3000. )
return -1;
307 if( Chi2Cur>50000.)
return -1;
312 for(iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
320 if (fullNPar<0)
return -1;
321 double * fullMatrix =
new double[fullNPar*fullNPar];
322 double * iniCovMatrix =
new double[fullNPar*fullNPar];
for(
int ss=0;
ss<fullNPar*fullNPar;
ss++) iniCovMatrix[
ss]=0.;
323 double * fullLSide =
new double[fullNPar];
324 double * tmpLSide =
new double[fullNPar];
326 std::vector<VKVertex> listVCopy(cascadeEvent_.
cascadeNV);
331 long int NParCur, NStart;
336 int NFitIterationMax=100;
337 int badStepCountMax=5;
339 cnstRemnants=100000.;
double cnstProgr=1.;
double minCnstRemnants=100000.;
342 for(Iter=0; Iter<=NFitIterationMax; Iter++){
345 for( iv=0; iv<fullNPar*fullNPar; iv++)fullMatrix[iv]=0.;
346 for( iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
369 copyFullMtx( vk->
ader, NParCur, NParCur, fullMatrix, NStart, fullNPar);
373 if(Iter==NFitIterationMax || fullSTOP || badStepCount>=badStepCountMax)
377 for(i=0; i<NParCur; i++) fullLSide[i+NStart] = tmpLSide[i];
382 if( (Chi2Cur>1.e8 && Iter>0) || IERR){
383 delete[] fullMatrix;
delete[] fullLSide;
delete[] tmpLSide;
delete[] iniCovMatrix;
384 if(Chi2Cur>1.e8)
return -1;
390 if( Iter>3 && cnstProgr>4. && getBack<5 && fullSTOP==0 ) {
393 if(IERR){
delete[] fullMatrix;
delete[] fullLSide;
delete[] tmpLSide;
delete[] iniCovMatrix;
return IERR;}
394 cnstRemnants=100000.; Chi2Old+=10000;
395 if(Iter==NFitIterationMax )Iter-=2;
396 if(Iter==NFitIterationMax-1)Iter-=1;
397 getBack++; badStepCount=0;
401 if(cnstRemnants<minCnstRemnants)minCnstRemnants=cnstRemnants;
402 if(minCnstRemnants==cnstRemnants){
403 for( iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
418 int tstRet=
fixPseudoTrackPt(fullNPar, fullMatrix, fullLSide, cascadeEvent_ );
419 if( tstRet ){
delete[] fullMatrix;
delete[] fullLSide;
delete[] tmpLSide;
delete[] iniCovMatrix;
return -1; }
423 if( Iter<NFitIterationMax && fullSTOP==0 && badStepCount<badStepCountMax){
424 IERR =
vkMSolve(fullMatrix, fullLSide, fullNPar);
425 if(IERR){
delete[] fullMatrix;
delete[] fullLSide;
delete[] tmpLSide;
delete[] iniCovMatrix;
return IERR;}
427 cascadeEvent_.
fullCovMatrix.reset(
new double[fullNPar*fullNPar] );
429 if(IERR){
delete[] fullMatrix;
delete[] fullLSide;
delete[] tmpLSide;
delete[] iniCovMatrix;
432 std::unique_ptr<double[]> newCov(
new double[fullNPar*fullNPar]);
444 for(iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
446 for(
int it=0; it<(int)vk->
TrackList.size(); it++){
451 Chi2Full += signift*signift;
454 Chi2Diff=Chi2Old-Chi2Full;
455 if(Chi2Diff<0. && cnstProgr>0.99) badStepCount++;
456 if(cnstRemnants==minCnstRemnants || cnstProgr<0.9) badStepCount=0;
459 bool badFullStep=
false;
460 if( Iter>5 && Chi2Full/Chi2Cur>1.2) badFullStep=
true;
461 if( Iter==NFitIterationMax || fullSTOP ) badFullStep=
false;
467 if(IERR){
delete[] fullMatrix;
delete[] fullLSide;
delete[] tmpLSide;
delete[] iniCovMatrix;
return IERR;}
469 for(iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
480 if(cnstRemnants>1.e4&&Iter>10)
481 {
delete[] fullMatrix;
delete[] fullLSide;
delete[] tmpLSide;
delete[] iniCovMatrix;
return -2;}
483 if( Iter<NFitIterationMax && Iter>2){
484 if(std::abs(Chi2Diff)<0.001 && cnstRemnants/minCnstRemnants<10.){
485 NFitIterationMax=Iter+1;
489 if ( Iter>NFitIterationMax+50 )
break;
490 if(badStepCount>badStepCountMax)
break;
498 delete[] fullMatrix;
delete[] fullLSide;
delete[] tmpLSide;
delete[] iniCovMatrix;
502 if( cnstRemnants > 1.e0)
return -2;
512 double aermd[6],tmpd[6];
527 int IERR=
cfdinv(tmpd, aermd, -3);
if (IERR) { IERR = -4;
return IERR; }
544 std::copy(primVrt, primVrt+3, vk->
FVC.
vrt);
545 std::copy(primVrtCov, primVrtCov+6, vk->
FVC.
covvrt);
570 double vShift, tmpPer[5], tmpWgt[15], tmpCov[15], targetVertex[3];
574 for( iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
580 vShift = sqrt( (vk->
refV[0]-targetVertex[0])*(vk->
refV[0]-targetVertex[0])
581 +(vk->
refV[1]-targetVertex[1])*(vk->
refV[1]-targetVertex[1])
582 +(vk->
refV[2]-targetVertex[2])*(vk->
refV[2]-targetVertex[2]) );
584 double dirMom=(pvx->refIterV[0]-targetVertex[0])*pvx->fitMom[0]+
585 (pvx->refIterV[1]-targetVertex[1])*pvx->fitMom[1]+
586 (pvx->refIterV[2]-targetVertex[2])*pvx->fitMom[2];
587 if(dirMom<0.)
cfdcopy(pvx->refIterV,targetVertex,3);
589 bool insideGoodVolume=
false;
593 if(!insideGoodVolume) {
return -16; }
594 for(it=0; it<NTRK; it++){
605 if(eig5<1.e-15 || tmpCov[0]>1.e7) {
608 tmpCov[1]=0.;tmpCov[3]=0.;tmpCov[6]=0.;tmpCov[10]=0.;
609 tmpCov[4]=0.;tmpCov[7]=0.;tmpCov[11]=0.;
610 tmpCov[8]=0.;tmpCov[12]=0.;
612 tmpCov[0]=std::abs(tmpCov[0]); tmpCov[2]=std::abs(tmpCov[2]);tmpCov[5]=std::abs(tmpCov[5]);
613 tmpCov[9]=std::abs(tmpCov[9]); tmpCov[14]=std::abs(tmpCov[14]);
616 if(tmpCov[0]>1.e7){ IERR=-7;
return IERR; }
617 IERR=
cfInv5(tmpCov, tmpWgt);
if (IERR) IERR=
cfdinv(tmpCov, tmpWgt, 5);
if(IERR)
return -8;
619 if ( vShift > 100. ) trk->
setReference( tmpPer, tmpCov );
622 if ( vShift > 100. )vk->
setRefV(targetVertex);
626 for(it=0; it<NTRK; it++){
652 for( iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
664 for(it=0; it<NTRK; it++){
681 for(iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
693 std::vector< Vect3DF > & cVertices,
694 std::vector< std::vector<double> > & covVertices,
695 std::vector< std::vector< VectMOM> > & fittedParticles,
696 std::vector< std::vector<double> > & cascadeCovar,
697 std::vector<double> & particleChi2,
698 std::vector<double> & fullCovar)
702 fittedParticles.clear();
703 particleChi2.clear();
707 std::vector< std::vector<double> > cascadeCovarFit;
710 double vBx,vBy,vBz,pp2,pt,invR,effectiveField;
711 int iv,it,jt, NTRK, pnt;
715 double **DPhys =
new double*[PDIM];
for(it=0; it<PDIM; it++) DPhys[it] =
new double[ADIM];
716 for(it=0;it<PDIM;it++)
for(jt=0;jt<ADIM;jt++)DPhys[it][jt]=0.;
722 std::vector<VectMOM> momCollector;
723 std::vector<double> tmpCov(6);
726 for( iv=0; iv<cascadeEvent_.
cascadeNV; iv++){
731 cVertices.push_back(vrtPos);
733 momCollector.clear();
735 double **Deriv =
new double*[DIM];
for(it=0; it<DIM; it++) Deriv[it] =
new double[DIM];
736 for(it=0;it<DIM;it++)
for(jt=0;jt<DIM;jt++)Deriv[it][jt]=0.;
737 Deriv[0][0]=1.;Deriv[1][1]=1.;Deriv[2][2]=1.;
738 DPhys[pntPhys+0][cascadeEvent_.
matrixPnt[iv]+0]=1.;
739 DPhys[pntPhys+1][cascadeEvent_.
matrixPnt[iv]+1]=1.;
740 DPhys[pntPhys+2][cascadeEvent_.
matrixPnt[iv]+2]=1.;
743 for(it=0; it<NTRK; it++){
746 prtMom.
Px=pp[0]; prtMom.
Py=pp[1]; prtMom.
Pz=pp[2]; prtMom.
E=pp[3];
747 momCollector.push_back( prtMom );
749 pp2 = pp[0]*pp[0] + pp[1]*pp[1] +pp[2]*pp[2];
750 pt = sqrt(pp[0]*pp[0] + pp[1]*pp[1]);
754 DPhys[pntPhys+pnt+0][cascadeEvent_.
matrixPnt[iv]+pnt+0]= Deriv[pnt+0][pnt+0]= 0 ;
755 DPhys[pntPhys+pnt+0][cascadeEvent_.
matrixPnt[iv]+pnt+1]= Deriv[pnt+0][pnt+1]= -pp[1];
756 DPhys[pntPhys+pnt+0][cascadeEvent_.
matrixPnt[iv]+pnt+2]= Deriv[pnt+0][pnt+2]= -pp[0]/invR;
758 DPhys[pntPhys+pnt+1][cascadeEvent_.
matrixPnt[iv]+pnt+0]= Deriv[pnt+1][pnt+0]= 0 ;
759 DPhys[pntPhys+pnt+1][cascadeEvent_.
matrixPnt[iv]+pnt+1]= Deriv[pnt+1][pnt+1]= pp[0];
760 DPhys[pntPhys+pnt+1][cascadeEvent_.
matrixPnt[iv]+pnt+2]= Deriv[pnt+1][pnt+2]= -pp[1]/invR;
762 DPhys[pntPhys+pnt+2][cascadeEvent_.
matrixPnt[iv]+pnt+0]= Deriv[pnt+2][pnt+0]= -pp2/pt;
763 DPhys[pntPhys+pnt+2][cascadeEvent_.
matrixPnt[iv]+pnt+1]= Deriv[pnt+2][pnt+1]= 0 ;
764 DPhys[pntPhys+pnt+2][cascadeEvent_.
matrixPnt[iv]+pnt+2]= Deriv[pnt+2][pnt+2]= -pp[2]/invR;
767 fittedParticles.push_back(momCollector);
768 cascadeCovar.push_back(
transformCovar(DIM, Deriv, cascadeCovarFit[iv] ) );
769 for(
int kk=0; kk<6; kk++) tmpCov[kk]=cascadeCovar[iv][kk];
770 covVertices.push_back(tmpCov);
771 for(it=0; it<DIM; it++)
delete[]Deriv[it];
777 fullCovar.resize(PDIM*(PDIM+1)/2);
778 for(it=0; it<PDIM; it++){
779 for(jt=0; jt<=it; jt++){
781 for(itn=0; itn<ADIM; itn++)
for(jtn=0; jtn<ADIM; jtn++) tmp += DPhys[it][itn]*DPhys[jt][jtn]*cascadeEvent_.
fullCovMatrix[itn*ADIM+jtn];
782 fullCovar[it*(it+1)/2+jt]=tmp;
785 for(it=0; it<PDIM; it++)
delete[]DPhys[it];
double getAccuracyConstraint() const
std::vector< int > matrixPnt
std::unique_ptr< double[]> fullCovMatrix
std::vector< std::unique_ptr< VKVertex > > cascadeVertexList
void setTargetVertex(double VRT[3])
void setReference(const double[], const double[])
void setCurrent(const double[], const double[])
void setRefIterV(double v[]) noexcept
std::vector< VKVertex * > includedVrt
std::vector< std::unique_ptr< VKTrack > > TrackList
double ader[(3 *vkalNTrkM+3) *(3 *vkalNTrkM+3)]
std::vector< std::unique_ptr< VKConstraintBase > > ConstraintList
void setRefV(double v[3]) noexcept
VKVertex * nextCascadeVrt
std::unique_ptr< VKalVrtControl > vk_fitterControl
static void getMagFld(const double, const double, const double, double &, double &, double &, const VKalVrtControlBase *)
static double getEffField(double bx, double by, double bz, double phi, double theta)
static bool checkTarget(double *RefEnd)
static void Propagate(long int TrkID, long int Charge, double *ParOld, double *CovOld, double *RefStart, double *RefEnd, double *ParNew, double *CovNew, VKalVrtControlBase *FitControl=0)
Ensure that the ATLAS eigen extensions are properly loaded.
void vpderiv(bool UseTrackErr, long int Charge, const double *pari0, double *covi, double *vrtref, double *covvrtref, double *drdpar, double *dwgt, double *rv0, VKalVrtControl *FitCONTROL)
void cfdcopy(double *source, double *target, int n)
void FullMTXfill(VKVertex *vk, double *ader)
void getNewCov(const double *OldCov, const double *Der, double *Cov, long int DIM) noexcept
int translateToFittedPos(CascadeEvent &cascadeEvent_, double Step)
void setFittedParameters(const double *result, std::vector< int > &matrixPnt, CascadeEvent &cascadeEvent_)
void getFittedCascade(CascadeEvent &cascadeEvent_, std::vector< Vect3DF > &cVertices, std::vector< std::vector< double > > &covVertices, std::vector< std::vector< VectMOM > > &fittedParticles, std::vector< std::vector< double > > &cascadeCovar, std::vector< double > &particleChi2, std::vector< double > &fullCovar)
int fixPseudoTrackPt(long int NPar, double *fullMtx, double *LSide, CascadeEvent &cascadeEvent_)
int cfInv5(double *cov, double *wgt)
int processCascade(CascadeEvent &cascadeEvent_)
double cascadeCnstRemnants(CascadeEvent &cascadeEvent_)
int cfdinv(double *cov, double *wgt, long int NI)
void copyFullMtx(const double *Input, long int IPar, long int IDIM, double *Target, long int TStart, long int TDIM)
int setVTrackMass(VKVertex *vk)
void setFittedMatrices(const double *COVFIT, long int MATRIXSIZE, std::vector< int > &matrixPnt, std::vector< std::vector< double > > &covarCascade, CascadeEvent &cascadeEvent_)
int getCascadeNPar(CascadeEvent &cascadeEvent_, int Type)
int afterFitWithIniPar(VKVertex *vk, double *ader, double *dcv, double *ptot, double *VrtMomCov, const VKalVrtControlBase *CONTROL)
void combinedTrack(long int ICH, double *pv0, double *covi, double effectiveBMAG, double *par, double *covo)
VKTrack * getCombinedVTrack(VKVertex *vk)
int FullMCNSTfill(VKVertex *vk, double *ader, double *LSide)
void addCrossVertexDeriv(CascadeEvent &cascadeEvent_, double *ader, long int MATRIXSIZE, const std::vector< int > &matrixPnt)
int fitVertexCascade(VKVertex *vk, int Pointing)
std::vector< double > transformCovar(int NPar, double **Deriv, const std::vector< double > &covarI)
long int getVertexCharge(VKVertex *vk)
int restorePreviousPos(CascadeEvent &cascadeEvent_, std::vector< VKVertex > &SV)
double cfVrtDstSig(VKVertex *vk, bool UseTrkErr)
std::array< double, 4 > getFitParticleMom(const VKTrack *trk, const VKVertex *vk)
void applyConstraints(VKVertex *vk)
void robtest(VKVertex *vk, int ifl, int nIteration)
int processCascadePV(CascadeEvent &cascadeEvent_, const double *primVrt, const double *primVrtCov)
int vkMSolve(double *a, double *b, long int n, double *ainv)
int afterFit(VKVertex *vk, double *ader, double *dcv, double *ptot, double *VrtMomCov, const VKalVrtControlBase *CONTROL)
double cfSmallEigenvalue(double *cov, long int n)
double dcv[6 *(vkalNTrkM *3+3)]