13 #define PI 3.141592654
36 Mvd_DipVar_DipVar_Sum = 0. ;
37 Mvd_IndVar_DipVar_Sum = 0. ;
38 Mvd_IndVar_IndVar_Sum = 0. ;
41 for(i=0;i<nMvdHits; i++){
43 if(!InclusionMvd[i])
continue;
46 Mvd_DipVar_DipVar_Sum += Mvd_DipVar_DipVar[
i] ;
47 Mvd_IndVar_DipVar_Sum += Mvd_IndVar_DipVar[
i];
48 Mvd_IndVar_IndVar_Sum += Mvd_IndVar_IndVar[
i];
80 Stt_DriftRad_IndVar_Sum[0] = 0.;
81 Stt_DriftRad_DipVar_Sum[0] = 0.;
85 for(i=0; i<nSttHits; i++){
86 for(j=0; j<current_number; j++){
88 aux = Stt_DriftRad_IndVar_Sum[
i];
89 Stt_DriftRad_IndVar_Sum[j] += Stt_DriftRad_IndVar[
i] ;
90 Stt_DriftRad_IndVar_Sum[current_number + j] = aux - Stt_DriftRad_IndVar[
i] ;
92 aux = Stt_DriftRad_DipVar_Sum[
i];
93 Stt_DriftRad_DipVar_Sum[j] += Stt_DriftRad_DipVar[
i] ;
94 Stt_DriftRad_DipVar_Sum[current_number + j] = aux - Stt_DriftRad_DipVar[
i] ;
112 Short_t nHitsinTrack,
116 Double_t *ErrorDriftRadiusconformal,
138 cose =
cos(rotationangle),
142 sine =
sin(rotationangle),
169 Alfa = (*pAlfa) + 2.*trajectory_vertex[0];
170 Beta = (*pBeta) + 2.*trajectory_vertex[1];
176 Alfa = Alfa*cose + Beta*sine;
177 Beta = -alfetta*sine + Beta*cose;
185 for(i=0;i<nHitsinTrack; i++){
186 Xp[
i] = Xconformal[
i ] *cose + Yconformal[
i ]*sine;
187 Yp[
i] = -Xconformal[
i ] *sine + Yconformal[
i ]*cose;
197 mm =
sqrt( Alfa*Alfa + Beta*Beta );
205 for(i=0; i<nHitsinTrack; i++){
207 if( DriftRadiusconformal[i]<0){
212 u1 = Xp[
i] - DriftRadiusconformal[
i] * Alfa/
mm;
213 v1 = Yp[
i] - DriftRadiusconformal[
i] * Beta/
mm;
214 u2 = Xp[
i] + DriftRadiusconformal[
i] * Alfa/
mm;
215 v2 = Yp[
i] + DriftRadiusconformal[
i] * Beta/
mm;
217 if(
fabs(Beta*v1+Alfa*u1+1) <
fabs(Beta*v2+Alfa*u2+1) ){
227 sigma2 = ErrorDriftRadiusconformal[
i]*ErrorDriftRadiusconformal[
i];
231 Suv += ui * vi/sigma2;
232 Suu += ui* ui/sigma2;
239 dete = Suu * S1 - Su * Su;
240 if(
fabs(dete) < 1e-10) { *Type =
false;
return -5;}
242 *emme = (Suv * S1 - Su * Sv)/dete;
243 *qu = (Suu * Sv - Su * Suv)/dete;
246 if(
fabs(*qu) < 1.e-9 ) {
256 Alfa = (*emme)/(*qu);
262 Alfa = Alfa*cose - Beta*sine;
263 Beta = alfetta*sine + Beta*cose;
268 *pGamma = trajectory_vertex[0]*trajectory_vertex[0]+
269 trajectory_vertex[1]*trajectory_vertex[1]
270 -Alfa*trajectory_vertex[0]-Beta*trajectory_vertex[1];
273 Alfa -= 2.*trajectory_vertex[0];
274 Beta -= 2.*trajectory_vertex[1];
280 if( abs(Beta)>1e-9) {
302 Short_t nHitsinTrack,
316 cout<<
"from PndTrkChi2Fits::FitSZspace error, n hits to fit = 0, exit(-1).";
334 sttSigma[nHitsinTrack],
346 for(i=0; i<nHitsinTrack; i++){
347 if( DriftRadius[i]<0. )
351 e2 = ErrorDriftRadius[
i]*ErrorDriftRadius[
i];
352 mvdGSum += Z[
i]*(S[
i]-FInot)/e2;
353 mvdUinvSum += (S[
i]-FInot)*(S[i]-FInot)/e2;
354 mvdZqSum += Z[
i]*Z[
i]/e2 ;
359 sttS[nSttHits] = S[
i];
360 sttSigma[nSttHits] = ErrorDriftRadius[
i];
361 sttZ1[nSttHits] = Z[
i] + DriftRadius[
i];
362 sttZ2[nSttHits] = Z[
i] - DriftRadius[
i];
369 if(nSttHits>NMAX) nSttHits=NMAX;
381 Combinations = (int) (pow(2.,nSttHits) + 0.1) ;
385 UinvSum[Combinations],
440 TotalGSum = mvdGSum + GSum[0];
441 TotalUinvSum = mvdUinvSum + UinvSum[0];
442 TotalZqSum = mvdZqSum + ZqSum[0];
444 if(
fabs(TotalGSum)>1e-9)
446 Kappa = TotalUinvSum / TotalGSum;
451 Chi2min = TotalZqSum + TotalUinvSum/Kappa -2.*TotalGSum/Kappa;
456 for(icomb=1; icomb<Combinations; icomb++){
457 TotalGSum = mvdGSum + GSum[icomb];
458 TotalUinvSum = mvdUinvSum + UinvSum[icomb];
459 TotalZqSum = mvdZqSum + ZqSum[icomb];
461 if(
fabs(TotalGSum) > 1.e-8){
462 Kappa = TotalUinvSum / TotalGSum;
464 chi2 = TotalZqSum + TotalUinvSum/Kappa -2.*TotalGSum/Kappa;
466 if( chi2 <Chi2min) *emme = Kappa;
468 if(TotalGSum>0.) Kappa = 1.e8 ;
else Kappa = -1.e8 ;
477 TotalUinvSum = mvdUinvSum;
478 TotalZqSum = mvdZqSum ;
480 if(
fabs(TotalGSum) > 1.e-8){
481 Kappa = TotalUinvSum / TotalGSum;
485 if(TotalGSum>0.) Kappa = 1.e8 ;
else Kappa = -1.e8 ;
504 Short_t nHitsinTrack,
516 InclusionMvd[nHitsinTrack];
537 Mvd_DipVar_DipVar[nHitsinTrack],
538 Mvd_DipVar_DipVar_Sum,
539 Mvd_IndVar_DipVar[nHitsinTrack],
540 Mvd_IndVar_DipVar_Sum,
541 Mvd_IndVar_IndVar[nHitsinTrack],
542 Mvd_IndVar_IndVar_Sum,
548 Stt_DipVar_DipVar_Sum,
549 Stt_DriftRad_DipVar[nHitsinTrack],
550 Stt_DriftRad_DriftRad_Sum,
551 Stt_DriftRad_IndVar[nHitsinTrack],
553 Stt_IndVar_DipVar_Sum,
554 Stt_IndVar_IndVar_Sum;
590 Stt_DipVar_DipVar_Sum = 0. ;
591 Stt_DriftRad_DriftRad_Sum = 0. ;
592 Stt_IndVar_IndVar_Sum = 0. ;
593 Stt_IndVar_DipVar_Sum = 0. ;
595 for(i=0; i<nHitsinTrack; i++){
597 e2 = 1./(ErrorDriftRadius[
i]*ErrorDriftRadius[
i]);
599 if( DriftRadius[i]<0. )
606 Mvd_DipVar_DipVar[nMvdHits] = Z[
i]*Z[
i]*e2;
607 Mvd_IndVar_IndVar[nMvdHits] =(S[
i]-FInot)*(S[i]-FInot)*e2;
608 Mvd_IndVar_DipVar[nMvdHits] =(S[
i]-FInot)*Z[i]*e2;
619 if( nSttHits < NMAX){
622 Stt_DipVar_DipVar_Sum += Z[
i]*Z[
i]*e2;
623 Stt_DriftRad_DriftRad_Sum += DriftRadius[
i]*DriftRadius[
i]*e2;
624 Stt_DriftRad_IndVar[nSttHits] = DriftRadius[
i]*(S[
i]-FInot)*e2;
625 Stt_DriftRad_DipVar[nSttHits] = DriftRadius[
i]*Z[
i]*e2;
627 Stt_IndVar_IndVar_Sum += (S[
i]-FInot)*(S[i]-FInot)*e2;
628 Stt_IndVar_DipVar_Sum += (S[
i]-FInot)*Z[i]*e2;
637 if(nSttHits>NMAX) nSttHits=NMAX;
650 Combinations = (Int_t) (pow(2., (
double) nSttHits) + 0.1) ;
654 Stt_DriftRad_DipVar_Sum[Combinations],
655 Stt_DriftRad_IndVar_Sum[Combinations];
658 Calculations_SkewStt_AllLeftRightCombinations(
663 Stt_DriftRad_DipVar_Sum,
664 Stt_DriftRad_IndVar_Sum
670 memset(InclusionMvd,
true,
sizeof(InclusionMvd));
678 Mvd_DipVar_DipVar_Sum,
679 Mvd_IndVar_DipVar_Sum,
680 Mvd_IndVar_IndVar_Sum
686 chi2_best = 9999999.;
687 A = Mvd_IndVar_DipVar_Sum + Stt_IndVar_DipVar_Sum ;
689 Mvd_DipVar_DipVar_Sum + Stt_DipVar_DipVar_Sum
690 + Stt_DriftRad_DriftRad_Sum;
692 for(i=0;i<Combinations; i++){
693 M = (A + Stt_DriftRad_IndVar_Sum[
i])/(Stt_IndVar_IndVar_Sum + Mvd_IndVar_IndVar_Sum) ;
695 M*M*(Mvd_IndVar_IndVar_Sum + Stt_IndVar_IndVar_Sum)
696 + 2.*Stt_DriftRad_DipVar_Sum[i]
697 - 2.*M*(Mvd_IndVar_DipVar_Sum + Stt_IndVar_DipVar_Sum)
698 - 2.*Stt_DriftRad_IndVar_Sum[
i]*M;
708 if(nSttHits+nMvdHits > 1) { chi2_best = chi2_best/( nSttHits+nMvdHits-1); }
713 if( nSttHits+nMvdHits >1){
723 for( j =0; j<nMvdHits;j++){
724 InclusionMvd[j] =
false;
726 if(j>0) InclusionMvd[j-1] =
true;
736 Mvd_DipVar_DipVar_Sum,
737 Mvd_IndVar_DipVar_Sum,
738 Mvd_IndVar_IndVar_Sum
742 A = Mvd_IndVar_DipVar_Sum + Stt_IndVar_DipVar_Sum ;
743 chi2_fixed = Penalty +
744 Mvd_DipVar_DipVar_Sum + Stt_DipVar_DipVar_Sum
745 + Stt_DriftRad_DriftRad_Sum;
746 for(i=0;i<Combinations; i++){
747 M = (A + Stt_DriftRad_IndVar_Sum[
i])/(Stt_IndVar_IndVar_Sum + Mvd_IndVar_IndVar_Sum) ;
749 M*M*(Mvd_IndVar_IndVar_Sum + Stt_IndVar_IndVar_Sum)
750 + 2.*Stt_DriftRad_DipVar_Sum[i]
751 - 2.*M*(Mvd_IndVar_DipVar_Sum + Stt_IndVar_DipVar_Sum)
752 - 2.*Stt_DriftRad_IndVar_Sum[
i]*M;
757 if( nSttHits+nMvdHits-2 >0) chi2 = chi2/(nSttHits+nMvdHits-2);
775 if(
fabs(*emme) > 1.e-10 ) { *emme = 1./(*emme); }
else { *emme = 1.e10; }
818 Combinations = (int) (pow(2., nHits) + 0.1) ;
819 Combinations2 = (int) (pow(2., nHits-1) + 0.1);
824 outSum[0] = Z1[0]*(S[0]-FInot)/(Sigma[0]*Sigma[0]);
825 outSum[1] = Z2[0]*(S[0]-FInot)/(Sigma[0]*Sigma[0]);
848 for(i=0; i<Combinations2; i++){
849 e2 = Sigma[nHits-1]*Sigma[nHits-1];
850 aux[
i] = outSum[
i] + Z1[nHits-1]*(S[nHits-1]-FInot)/e2;
851 aux[i+Combinations2] = outSum[
i] + Z2[nHits-1]*(S[nHits-1]-FInot)/e2;
855 for(i=0; i<Combinations; i++){
890 Combinations = (int) (pow(2., nHits)+0.1);
891 Combinations2 = (int) (pow(2., nHits-1)+0.1);
896 outSum[0] = (S[0]-FInot)*(S[0]-FInot)/(Sigma[0]*Sigma[0]);
897 outSum[1] = outSum[0];
918 for(i=0; i<Combinations2; i++){
919 e2 = Sigma[nHits-1]*Sigma[nHits-1];
921 aux[
i] = outSum[
i] + (S[nHits-1]-FInot)*(S[nHits-1]-FInot)/e2;
922 aux[i+Combinations2] = aux[
i] ;
926 for(i=0; i<Combinations; i++){
960 Combinations = pow(2., nHits)+0.1;
961 Combinations2 = pow(2., nHits-1)+0.1;
966 outSum[0] = Z1[0]*Z1[0]/(Sigma[0]*Sigma[0]);
967 outSum[1] = Z2[0]*Z2[0]/(Sigma[0]*Sigma[0]);
989 for(i=0; i<Combinations2; i++){
990 e2 = Sigma[nHits-1]*Sigma[nHits-1];
991 aux[
i] = outSum[
i] + Z1[nHits-1]*Z1[nHits-1]/e2;
992 aux[i+Combinations2] = outSum[
i] + Z2[nHits-1]*Z2[nHits-1]/e2;
996 for(i=0; i<Combinations; i++){
friend F32vec4 cos(const F32vec4 &a)
friend F32vec4 sqrt(const F32vec4 &a)
friend F32vec4 sin(const F32vec4 &a)
Short_t FitHelixCylinder(Short_t nHitsinTrack, Double_t *Xconformal, Double_t *Yconformal, Double_t *DriftRadiusconformal, Double_t *ErrorDriftRadiusconformal, Double_t rotationangle, Double_t trajectory_vertex[2], Short_t NMAX, Double_t *m, Double_t *q, Double_t *pAlfa, Double_t *pBeta, Double_t *pGamma, bool *Type, int istampa, int IVOLTE)
Short_t FitSZspace_Chi2_AnnealingtheMvdOnly(Short_t nHitsinTrack, Double_t *S, Double_t *Z, Double_t *DriftRadius, Double_t *ErrorDriftRadius, Double_t FInot, Short_t NMAX, Double_t *emme, int IVOLTE)
void ZqSumCalculation(Double_t *Z1, Double_t *Z2, Double_t *Sigma, Double_t FInot, int nHits, Double_t *outSum)
void Calculations_SkewStt_AllLeftRightCombinations(Short_t nSttHits, Double_t *Stt_DriftRad_DipVar, Double_t *Stt_DriftRad_IndVar, Double_t *Stt_DriftRad_DipVar_Sum, Double_t *Stt_DriftRad_IndVar_Sum)
friend F32vec4 fabs(const F32vec4 &a)
void Calculations_Mvd(bool *InclusionMvd, Double_t *Mvd_DipVar_DipVar, Double_t *Mvd_IndVar_DipVar, Double_t *Mvd_IndVar_IndVar, Short_t nMvdHits, Double_t &Mvd_DipVar_DipVar_Sum, Double_t &Mvd_IndVar_DipVar_Sum, Double_t &Mvd_IndVar_IndVar_Sum)
void GSumCalculation(Double_t *S, Double_t *Z1, Double_t *Z2, Double_t *Sigma, Double_t FInot, int nHits, Double_t *outSum)
Short_t FitSZspace(Short_t nHitsinTrack, Double_t *S, Double_t *Z, Double_t *DriftRadius, Double_t *ErrorDriftRadius, Double_t FInot, Short_t NMAX, Double_t *emme, int IVOLTE)
void UinvSumCalculation(Double_t *S, Double_t *Sigma, Double_t FInot, int nHits, Double_t *outSum)