Two patches for correcting mistakes from copying ZFITTER code into Gfitter/GSM code
and
A comment on the accuracy of Gfitter

Webpage under construction

This is a private webpage, created 28 Oct 2011, based on publicly available information. Responsible for the content is the webmaster. Corrections are welcome.

See also the return address
http://zfitter.com
and
  1. zfitter-code-in-gfitter.html - Samples of the `integration' of ZFITTER software in Gfitter/GSM software.
  2. gfitter-gsm-patches.html - Patches of misprints arising from the `integrations'.
  3. gfitter-publications.html - Informations on publications of Gfitter where the use of [next word was misprinted until 24 Oct 2011] ZFITTER software is not quoted.
  4. zfitter-text-in-gfitter-publications.html - Samples of [latex source] text, found in the main Gfitter publication and also in a diploma thesis, taken from latex source files written by ZFITTER authors.
and the http://www.cern.ch/Gfitter, official Gfitter webpage, and http://gfitter.desy.de, kind of mirror at DESY
webmaster 2011
Foto: Copyright (2011) tordriemann@googlemail.com
The webmaster: "Wo ZFITTER drin ist, soll auch ZFITTER draufstehen!"


Wo ZFITTER drin ist, soll auch ZFITTER draufstehen

google translator:
Where there is ZFITTER, should also stand upon ZFITTER



On many occasions Gfitter authors express that they found excellent agreement with ZFITTER [where they may compare].
Examples:
see gfitter-publications.html .
In fact, this never has not been proven to the public.
Gfitter 'adapted' complete subroutines from ZFITTER [Fortran] into Gfitter/GSM [C++].
This is documented and commented in zfitter-code-in-gfitter.html .

As far as we know from the Gfitter authors, they never checked that the corresponding subroutines have identical output when they have identical input.
But this is the only way to get a safe "excellent agreement".
ZFITTER checked this permanently, in order to hold the many ZFITTER versions over more than 20 years in a stable, backward-compatible chain.
See: http://zfitter.com



In fact, when digging for samples of copy-paste-change by Gfitter, we were basically looking for equivalences of the two software packages.
We found besides the many agreements also few, one may even say: very few, disagreements.

It is the purpose of this webpage to make the software typos public so that potential users of Gfitter/GSM may implement corrections, or at least may check out systematically in which circumstances they might become numerically influencial.


Fortran function: ZFITTER/bkqcdl5_14.f/XRMQCD(AMZ2,AMW2,AMT2,S)
and
C++ function: Gfitter/GSM/ZFitterQCDCorrections.cxx/rmqcd


In file bkqcdl5_14.f we find the Fortran function XRMQCD, which is authored by ZFITTER:
      FUNCTION XRMQCD(AMZ2,AMW2,AMT2,S)
 ...
        XRMQCD=1D0/(12D0*SW2)
     &        *(3D0/4D0/CW2*(1D0+VB2)
     &        +AMT2/4D0/AMW2*(VT2*(XDVFTZ/ALTZ-XPVFTZ)
     &        +XDAFTZ/ALTZ-XPAFTZ)
     &        -AMT2/AMW2*(3D0*D2+105D0/8D0))
      ELSE
        XRMQCD=1D0/4D0/SW2/CW2
     &        *(AMT2/AMZ2*((1D0-4D0*QTM*SW2)**2*XV1r+XA1r)
     &        +AMT2/(AMZ2-S)*((1-4*QTM*SW2)**2*(XV1rs-XV1r)+XA1rs-XA1r)
     &        +2D0*AMT2/AMZ2*(-23D0/8D0+D2+3D0*D3)
     &    -1D0/4D0*(1D0+(1D0-4D0*QBM*SW2)**2)*S/(AMZ2-S)*LOG(S/AMZ2))
...
This has to be compared to function rmqcd in ZFitterQCDCorrections.cxx
...
   else {
      complex XCR   = MZ2/(4.0*mt2);
      complex XCS   = S/(4.0*mt2);
      complex XV1r  = CV1(XCR);
      complex XA1r  = CA1(XCR);
      complex XV1rs = CV1(XCS);
      complex XA1rs = CA1(XCS);
      
      rmqcd = 1.0/(4.0*SW2*CW2)*( mt2/MZ2*(VT2*XV1r + XA1r)
                                  + mt2/(MZ2-S)*(VT2*(XV1rs - XV1r) + XA1rs - XA1r)
                                  + 2.0*mt2/MZ2*(-23.0/8.0*D2+3.0*D3)
                                  - 1.0/4.0*(1.0 + QBM)*S/(MZ2-S)*TMath::Log(S/MZ2) );
   }
...
One may observe two mistakes in rmqcd:
   &        +2D0*AMT2/AMZ2*(-23D0/8D0+D2+3D0*D3)
   &    -1D0/4D0*   (1D0+   (1D0-4D0*QBM*SW2)**2)    *S/(AMZ2-S)           *LOG(S/AMZ2))    
compared to:
  + 2.0*mt2/MZ2*(-23.0/8.0 * D2+3.0*D3)
- 1.0/4.0*  (1.0 +   QBM)   *S/(MZ2-S)             *TMath::Log(S/MZ2) );




Fortran function: ZFITTER/dizet6_42.f/XDI3
and
C++ function: Gfitter/GSM/GSMMath.cxx/di3


The Fortran function XDI3 is calculated in ZFITTER/dizet6_42.f:
      FUNCTION XDI3(Q2,AMV2,AM12,AM22)
*
      IMPLICIT REAL*8(A-H,O-W,Y-Z)
      IMPLICIT COMPLEX*16(X)
      COMMON/CDZWSM/AMW2,AMZ2,R,R1,R12,R2,AMH2,RW,RW1,RW12,RW2,RZ,RZ1,
     *      RZ12,RZ2,ALR,ALRW,ALRZ,SW2M,CW2M,AKSX,R1W,R1W2
      DATA EPS/1.D-4/
*
      IF(AM22.LT.1.D-10) GO TO 1
      AL12=LOG(AM12/AM22)
      DM12=(AM12-AM22)/Q2
      SM12=(AM12+AM22)/Q2
      AQ=Q2/AMV2
      SMV1=1.D0-AQ
      SMV2=1.D0-AQ+AQ*AQ
      XDI3=SM12/3.D0+DM12**2/3.D0*SMV1
     *    +(SM12*DM12/4.D0*SMV1+DM12**3/6.D0*SMV2)*AL12
     *    +(0.5D0-SM12/2.D0*SMV1-DM12**2*SMV2)/6.D0/Q2*XL(Q2,AM12,AM22)
     *    -(0.5D0+0.5D0*(AM12+AM22)/AMV2
     *    -((AM12-AM22)/AMV2)**2)/6.D0*XDL(Q2,-AMV2,AM12,AM22)
      RETURN
* CHAIN1 WILL BE USED ONLY FOR W-WIDTH
1     QV=(Q2+AMV2)/AMV2
      IF(ABS(QV).LT.EPS) GO TO 2
      XDI3=(XI3(AMW2,Q2,AM12,AM22)-XI3(AMW2,-AMV2,AM12,AM22))/QV
      RETURN
2     R1V=AM12/AMV2
      VQ=AMV2/Q2
      VQ2=1.D0-VQ+VQ**2
      AQ=AM12/Q2
      RDI3=-1.D0/6.D0+(VQ-0.5D0)/3.D0*R1V+VQ2/3.D0*R1V**2
     *    -QV*(0.5D0+R1V)/6.D0-VQ*R1V**2*((VQ-1.D0)/2.D0
     *    +VQ2/3.D0*R1V)*LOG(ABS(1.D0+1.D0/AQ))
      XDI3=DCMPLX(RDI3,0.D0)
*
      END
This has to be compared to function di3 in Gfitter/GSM/GSMMath.cxx
// Delta I3
std::complex GSM::GSMMath::DI3( const Double_t& Q2, const Double_t& MV2, const Double_t&
m12, 
                                          const Double_t& m22, const Double_t& MW2 )
{    
   std::complex di3(0,0);
    
   if (m22 < 1e-10) {
      Double_t QV = (Q2 + MV2)/MV2;
      if (TMath::Abs(QV) < 1e-4) {
         Double_t R1V = m12/MV2;
         Double_t VQ  = MV2/Q2;
         Double_t VQ2 = 1.0 - VQ + VQ*VQ;
         Double_t AQ  = m12/Q2;
         di3 = ( -1.0/6.0 + (VQ-0.5)/3.0*R1V + VQ2/3.0*R1V*R1V
                 -QV*(0.5+R1V)/6.0 - VQ*R1V*R1V*((VQ-1.0)/2.0 +
VQ2/3.0*R1V)*TMath::Log(TMath::Abs(1.0+1.0/AQ)) );
      }
      else di3 = (I3(MW2,Q2,m12,m22) - I1(MW2,-MV2,m12,m22))/QV;
   }
   else {
      Double_t AL12 = TMath::Log(m12/m22);
      Double_t Dm12 = (m12-m22)/Q2;
      Double_t Sm12 = (m12+m22)/Q2;
      Double_t AQ   = Q2/MV2;
      Double_t SMV1 = 1.0 - AQ;
      Double_t SMV2 = 1.0 - AQ + AQ*AQ;
      di3 = ( Sm12/3.0 + Dm12*Dm12/3.0*SMV1
              + (Sm12*Dm12/4.0*SMV1 + Gfitter::GMath::IPow(Dm12,3)/6.0*SMV2)*AL12
              + (0.5 - Sm12/2.0*SMV1 - Dm12*Dm12*SMV2)/(6.0*Q2)*L(Q2,m12,m22)
              - (0.5 + 0.5*(m12+m22)/MV2
                 - Gfitter::GMath::IPow((m12-m22)/MV2,2))/6.0*DL(Q2,-MV2,m12,m22) ); 
   }
   return di3;
}

The point is: the difference
IF(ABS(QV).LT.EPS) GO TO 2
      XDI3=(XI3(AMW2,Q2,AM12,AM22)-XI3(AMW2,-AMV2,AM12,AM22))/QV
became another difference
else di3 = (I3(MW2,Q2,m12,m22) - I1(MW2,-MV2,m12,m22))/QV;
The functions XDI3, di3 are related to renormalization, and the functions XI3(AMW2,Q2,AM12,AM22), di3 get a subtraction at Q2 = -AMV2.




1270 zeta(5) versus 127 zeta(5)

Finally, we observed one difference between all the write-ups, containing 127 zeta(5), and the two software versions ZFITTER and Gfitter/GSM, containing 1270 zeta(5).
The software.
In the Fortran program ZFITTER/dizet6_42.f:
     COEFA3=-4544045D0/864+   1340*D2+118915D0/36*D3  -1270D0*D5
     &      +(71621D0/162  -209D0/2*D2   -216D0*D3+5D0*D4+55D0*D5)*ANF
     &      +(-13171D0/1944+ 16D0/9*D2  +26D0/9*D3            )*ANF**2
*
Here, the D5=zeta(5).
The same functional dependence appears in Gfitter/GSM/RadiatorFunctions.cxx:
  m_CA3   = ( - 4544045/864.0 + 1340*zeta2 + 118915/36.0*zeta3 - 1270*zeta5
               + (71621/162.0 - 209/2.0*zeta2 - 216*zeta3 + 5*zeta4 + 55*zeta5)*m_nf1
               + (-13171/1944.0 + 16/9.0*zeta2 + 26/9.0*zeta3)*m_nf1*m_nf1 );
Here, the zeta5=zeta(5).
So, the two software packages agree with each other, and this is to be expected if one has been copied from the other.

Now we look into the publications.
To begin with:

D. Bardin, G. Passarino, the book "The Standard Model in the Making", eq. (12.39):
C^A_{23} = − 4544045/864 ... − 127 zeta(5) + [71621/162 − ...] +...

In the diploma thesis of M. Goebel, eq. (B.14):
C_23^A = ... -127 zeta(5)

In EPJC 60 (2009) 543, eq. (A.46):
C_23^A = ... -127 zeta(5)

This is consistent under the assumption that the diploma and the article in EPJC60 have been written following the book.
Then there remains the question for the origin of the deviation to the programming.
Was the programming in ZFITTER wrong, or is the latex text in the book due to a typo?

Finally, in October 2011 we determined yet another article version of the term 127 zeta(5), and this was the key to understand what was going on:

Look into D. Bardin et al., Comp. Phys. Commun. 133 (2001) 229, eq. (3.132):
C^A_23 = COEFA3 = ... -127 \zeta(5)

The latex of the article in CPC133 is publicly available, see the discussion in zfitter-text-in-gfitter- publications.html .
This same latex was also, before, used for writing the book, and the latter was quoted several times by Gfitter in EPJC60.
Since the latex of CPC133 was [illegally] recycled by Gfitter authors, the typo in both the book and the article in CPC133 was of one origin and found its way also into the diploma and the article in EPJC60.
We finally discussed whether the equations in the book and in the article in CPC133 were corrections or typos.
Here a quote from an email by G. Passarino, 20 Oct 2011, on this point:
Dear Tord, I'll try to answer your question about the coefficient of zeta(5) in Eq.(12.38) of our
book.

There are
Book, dated 1999 [DB,GP]
CPC 2001, submitted 1999 [DB et al.]
In this time ordering

I think it is absolutely true that the latex of both Book and CPC 2001 contain the same typo, taking
from the Fortran code a coefficient 1270 and loosing the '0' in latexing the formulas.
... I think again about dates I also remember that latexing of CPC2001 was done after latexing the
book and this will confirm that the equation was latexed by Dima, otherwise I would have been asked 
for my OK and I don't remember Dima ever did it.

I am confident, no recalculation was performed at that time, I do not remember, at all, 
discussing coefficients of zeta(5), so for sure we didn't figure out that 1270 zeta_5 was wrong.

I apologize if this is not as precise as it is needed but, after 12 years .......

Best regards

                  Giampiero



A bit history, to set the stage

The first comparison of one-loop electroweak calculations with "excellent agreement" between different research groups was performed in the early nineties, by D. Bardin [ZFITTER group] and B. Kniehl [ZPOLE package].
They agreed in a blind comparison for the famous function Delta-R with at least 8 digits, in single Fortran precision.
This means that the codes really do the same job.
Later, this accuracy became a standard.
For details, see e.g. "Hunting the Hidden Standard Higgs", A. Akhundov, D. Bardin, T. Riemann, JINR preprint JINR E2-85-454 (1985), in Phys. Letters B166 (1986) 111; this was the first attempt to show how to derive from precision electroweak data and loop corrections estimates for top quark or Higgs boson masses.
An early review on the topics is e.g. "Δ r beyond one loop", F. Halzen, B.A. Kniehl, MAD-PH-588 (1990), published in Nucl.Phys. B353 (1991) 567-590.
Now, the LEPEWWG took over the job.
For loop corrected electroweak differential Bhabha cross-sections we [ZFITTER] agreed in 1990 within 3 digits with W. Hollik [unpublished code], see: "Bhabha scattering with higher order weak loop corrections", Zeitschrift für Physik C Particles and Fields Volume 49, Number 3, 485-490, DOI: 10.1007/BF01549702, ZfPC49(1991) , KEK scan .
Later, in 2003, similar comparisons gave even 11 digits agreements for several cross-sections using aItalc and FeynCalc, see e.g. hep-ph/0307132 .

What is meant when we call the numerical agreement of two codes to be "excellent"?

What Gfitter did is to compare the results of fits to data.
And when these fits agreed, they called the outcome "excellent".
See e.g., the diploma thesis of M. Goebel at /www-atlas.desy.de/theses .
But this is not a hard check, as everybody knows.
And what means "excellent agreement" today?
We would say: at least 7 to 8 digits. This is the guarantied technical accuracy of a single precision Fortran code.
And if one gets 5 - 6 digits agreement?
We would call that "satisfactory agreement", because it is by orders of magnitude worse.
It is certainly satisfactory because the cross-sections are needed with no more than 4 or 5 digits to be absolutely safe when comparing to experiments.
In fact, on 5 Sept 2011, Gfitter produced an internal comparison, NumComparisonGfitterZFITTER.png, where a 5 digits accuracy is claimed.
A bit on precision demands

The Gfitter group likes to stress that they include into their calculations the latest P.A. Baikov et al. QCD corrections,
"Order alpha**4(s) QCD Corrections to Z and tau Decays", Phys.Rev.Lett. 101 (2008) 012002
The numerics is:
m_C04 = -156.61 + 18.77*nf - 0.7974*nf^2 + 0.0215*nf^3
and for nf=5 one gets
m_C04 = -80.0075
and the correction to the total Z decay rate becomes then for alpha_s=0.12
delta = m_C04 *(0.12/3.14)^4 = - 1.71 * 10^(-4)
If Gfitter wants to be sensitive to that number, they have to control the rest of the corrections to about 5*10^(-5) or better.
The Z decay width is experimentally known to be about
Gamma_Z = (2.4952 ± 0.0023) GeV
see K. Nakamura et al. (Particle Data Group), J. Phys. G 37, 075021 (2010), and Z boson,
so that Delta Gamma_Z / Gamma_Z = 0.00092177 = 9 * 10^(-4)
The influence of the alpha_s^4 term from QCD is about 1/4 of the experimental error; it is good to have the Baikov NNNLO term at the disposal, but it should not be too influential.
Further one may conclude that a technical accuracy of Gfitter/GSM of 5 digits is "completely satisfactory", but it is not "excellent".


Another serious question is the following:
What does an "excellent agreement of ZFITTER and Gfitter/GSM" tell us?


It tells us only one tale:
The copying of the relevant subroutines from ZFITTER into Gfitter/GSM was done without any numerically important mistakes.
This is something. Truly.

Copyright © Tord Riemann, zfitter.com, 2011
Die Vervielfältigung, Verbreitung und Veröffentlichung unterliegt der Creative Commons-Lizenz [Namensnennung-Keine kommerzielle Nutzung-Keine Bearbeitung 3.0 Deutschland License, by-nc-nd]
Webmaster: Tord Riemann, zfitter.com
Created: 26 Oct 2011, last modified: 26 Oct 2011
Disclaimer