Open felixhekhorn opened 4 years ago
We forgot to specify that the issue is related only to the quarks' channels, but it is not present for the gluon channel.
@felixhekhorn @AleCandido could you please be more specific as to where the missing factor 2 should be? Also, from the banner I see that when the evolution is initialised you have:
muR / muF = 1.0000
but then when the DIS module is initialised you have:
muR / Q = 1.0000
muF / Q = 0.5000
which are clearly incompatible. This suggests that you are somehow misusing the code because that ratio is automatically adjusted when the code is used correctly (incidentally, this may explain the discontinuity at the bottom mass). As a matter of fact, this very simple code:
#include "APFEL/APFEL.h"
int main()
{
APFEL::SetMassScheme("FONLL-A");
APFEL::SetProcessDIS("CC");
APFEL::SetFacQRatio(0.5);
APFEL::InitializeAPFEL_DIS();
return 0;
}
produces the following banner:
QCD evolution
Space-like evolution (PDFs)
Unpolarized evolution
Evolution scheme: VFNS at N1LO
Solution of the DGLAP equation: 'exactalpha' with maximum 6 active flavours
Solution of the coupling equations: 'exact' with maximum 6 active flavours
Coupling reference value:
- AlphaQCD( 1.4142 GeV) = 0.350000
Pole heavy quark masses:
- Mc = 1.4142 GeV
- Mb = 4.5000 GeV
- Mt = 175.0000 GeV
The matching thresholds coincide with the physical masses
muR / muF = 2.0000
Allowed evolution range [ 1.0000 : 10000.0000 ] GeV
The internal subgrids will be locked
Fast evolution enabled
Initialization of the evolution completed in 0.870 s
Report of the electroweak parameters:
Mass of the Z = 91.188 GeV
Mass of the W = 80.385 GeV
Mass of the proton = 0.9383 GeV
sin^2(thetaW) = 0.2313
GFermi = 1.16638E-05
| 0.9743 0.2254 0.0036 |
CKM = | 0.2252 0.9734 0.0414 |
| 0.0089 0.0405 0.9991 |
Z propagator correction = 0.00000
Report of the DIS parameters:
Computation in the FONLL-A mass scheme
Charged Current (CC) process
Scattering electron - proton
muR / Q = 1.0000
muF / Q = 0.5000
Target Mass corrections disabled
FONLL damping factor for charm enabled with suppression power = 2
FONLL damping factor for bottom enabled with suppression power = 2
FONLL damping factor for top enabled with suppression power = 2
Intrinsic charm disabled
where you can see that the ratio muR / muF
is adjusted to 2 as appropriate.
Can you share the code you are using to produce these predictions?
The missing factor of two is just the one detected from the numbers (see the diff spoiler in @felixhekhorn OP), there is no place in APFEL's code in which we could put it to fix the code itself, because instead we believe the scale variation to be missing for the MassiveZero charged current coefficient functions, as @felixhekhorn said.
Where actually they are missing for us it's hard to tell, also because there is not an actual place where the quark channel, cc, massive-zero coefficient functions are implemented, being the same of the neutral current zero-mass. I'm sorry we are not so familiar with the way APFEL has been designed, so we mainly use it as external users and only occasionally dive into the code, so if you are able to point us where the mentioned coefficient function should be placed and how the relative scale variations should be implemented we would be grateful.
The code used to produce the numbers is freely available in yadism
repo, currently using the develop
branch. The section involved in particular with APFEL loading, and even more in details with the Scale Variations settings, is this one that has been realized mirroring the loader provided in ccwrap
(sorry for the actual runcard missing, if needed @felixhekhorn will be able to provide it asap).
However if the first part of the banner it's really related to the evolution I would not care so much, and also this may be the reason why the value is actually inconsistent: we are taking care of deactivating the evolution, indeed being yadism
a pure DIS code we would like to test it against only the DIS part of APFEL.
To conclude we are pretty sure on the statement that the mentioned scale variations are somehow missing in APFEL implementation, indeed we used the very same code for APFEL's call and modified our code deactivating the scale variations we are speaking about, and the results coincide perfectly, and we this setup we would have the very same discontinuity that we displayed in APFEL's numbers in the OP.
@AleCandido The file src/DIS/IncludeScaleVariation.f
takes care of including scale variation terms. Around line 304 the scale variation terms are included according to Eq. (3.17) of this document. I don't know why you don't get them right.
Sorry @vbertone while I have nothing against 3.17, I really believe we are doing the same thing, (even if still at NLO), instead I'm not sure about the implementation, because to me it's quite hard to understand completely what's going on inside APFEL in details.
For this reason I tried to understand the content of the file you kindly pointed, and I made this sketch:
prDIS
), that I would call zero-mass only, since independently on the scheme is affecting the zm
coefficient functions
P0P0
, C12P0
, C1LP0
, C13P0
(I don't know what they are, even if I suppose them to be the ingredients of 3.17 RHS NNLO ingredients)SP
at this point, I guess)massive
ones
FONLL-B
), if FFNS
or FONLL
has been chosen for the NC
some bits are added
NC
have no NLO scale variations for the massive
caseCC
is not available at NNLOCC
onlymassive-zero
coefficient functions
NC
NNLOCC
NLOmassive
and massive-zero
contributions for the NC
are computedSince what we are interested in is not zero-mass
(part 1, as you said around line 304), but massive-zero
(part 3, lines 586-601), and in particular the quark part, is it possible that something in there it is not correctly implemented?
On the other hand I think you can admit that the bump we pointed out it's quite a strange behavior, and it's really strange that it happens actually at the charm threshold (note: we are reporting values for Q2
, but for FONLL threshold the relevant information is instead the value of muF
, and this is consistent all over the place also in APFEL).
So: are you able to compute that quantity with APFEL (the points we reported) for CC
, FONLL-A
, muF = Q/2
(i.e. xiF = 0.5
), F2charm
, without having any bump?
(notice that in the values we are displaying it is stressed by having used an sbaronly
PDF scale independent, so I would suggest at least to use toyLH
, otherwise we can give you the lhapdf
files for our sbaronly
PDF).
Of course for having sbar -> cbar
you also need to use an incoming electron/antineutrino
, but as said if you would like to use the exact same configuration we will provide you the runcard (but probably the information I'm giving here are enough).
Hi @AleCandido. Your understanding of the ZM sector of IncludeScaleVariation.f
is correct. Just as a remark P0P0
, C12P0
, C1LP0
, C13P0
are (numerical) convolutions between splitting functions and NLO coefficient functions relevant to NNLO scale variations. Also your understanding of the massive sectors is correct and I guess you agree with what is done. If not I can explain it.
It is surely possible that there is something that is not correctly implementend but the bump that you observe (that to my understanding is at the bottom threshold) has a possible explanation related to the fact that in APFEL, when you change the factorisation scale w.r.t. Q, you are also implicitly moving the heavy quark thresholds and this introduces a discontinuity at the threshold also at NLO, which does not automatically means a bug. Of course, if this is the issue there are ways to avoid it.
If you agree, I would do a benchmark using the toyLH set that is implemented in APFEL. I'll send you the numbers asap.
@AleCandido while working on this I realised that, since you don't want to consider the evolution, using the toyLH
set and doing the evolution internally with APFEL is probably not a good idea. I will use the CT18NLO
LHAPDF set instead.
@vbertone first of all: thank you for your help in the investigation.
Then, keeping the foces on the massive-zero
:
(that to my understanding is at the bottom threshold) of course there are more thresholds around. But since we are speaking about the
massive-zero
the threshold we are mostly interested in is where FONLL kicks in, and this happens not when a specific value inQ2
is crossed, but rather a specific value inmuF2
is crossed. Considering this, a value ofQ2=16.
, with axiF=0.5
, correspond to a value ofmuF2=4.
, i.e.muF=2.
, and so the charm threshold, that is the first point in which FONLL is different from ZM-VFNS and everything else ("kics in"), in other words is the first point in which themassive-zero
itself is active.
I agree with you that a bump is not a bug itself, but it is a quite clear clue that something is happening, and I would call it a bug if no one is able to explain that behaviour (and maybe you are, so let's keep going).
@AleCandido while working on this I realised that, since you don't want to consider the evolution, using the toyLH set and doing the evolution internally with APFEL is probably not a good idea. I will use the CT18NLO LHAPDF set instead.
For this investigation a Q2 independent PDF would be really better, so please manually install the LHAPDF file that I'm attaching (it is an sbar-only version of toyLH, in the LHAPDF format). You can load it simply specifying toy-sbaronly
to LHAPDF.
(in case you ever need it, even if I don't think so, the yadmark
package of yadism
project has an almost intuitive LHAPDF-PDFsets generator, for extracting specific flavors; even if the package is not deployed on PyPI it's still freely available on the repo and easily installable)
@AleCandido here is a plot for F2charm as a function of Q at x = 10^{-3} using the toy-sbaronly.zip
set (I'm really not sure why you are using this weird set with only sbar
and without evolution, especially when doing scale variations). As you can see there is no discontinuity. Personally, I don't share the attitude of defining a bug something that you don't understand.
Hi @vbertone, thank you for the plot you produced.
I'm really not sure why you are using this weird set with only sbar and without evolution, especially when doing scale variations I don't think it is weird at all, it is just the suitable object for making this test:
- it is isolating a single contribution, decoupling the quark channel from everything else (maybe it would be clearer for you if it was a single PDF in the evolution basis, but we are mainly working in the flavour basis, and at the end of the day the main thing to decouple from it's the gluon)
- it is not
Q2
dependent because in this way we are not affected by the different evaluation point, beingQ2
ormuF != Q2
, in this way only the new bit added to the coefficient it's relevant, again decoupling anything elsePersonally, I don't share the attitude of defining a bug something that you don't understand.
It's not that we simply noticed something weird we didn't understand and we just claimed a bug. We worked for a full day on it, checking the implementation in yadism
, and then, when everything from our side was explored and settled, we also took care of diving in the other side, and we tried to understand.
The problem we faced it's that a huge code written by someone else, with a not so familiar design, may be difficult to occasionally explore, so we tried to find the bug (or inconsistency) ourselves, we failed, and we simply reported that the numbers produced by APFEL are consistent with a wrong implementation of yadism
, that we have under control.
If possible we would be pleased to find the bug in APFEL, because of two reasons:
yadism
it's correctly implemented, or telling us what we should fix (hopefully), and we can not be 100% sure of our implementation until the source of difference it's not completely understoodSo if not calling it "a bug" let's call it "a problem". Of course, I will never be sure of what it's right, but there is also a confidence level for the SM itself...
There is also another thing I didn't consider in my previous comment: perspective.
From our perspective it's rather easy to change our code and silence a channel, but not being so familiar with APFEL this is not true for the other side. This is why we are using an uncommon PDF, in order to select some information without having to touch the code.
Looking at the mirror: probably for you it would be easier to be sure not to use the gluon channel running yadism
with that PDF instead of diving in it and deactivating some channels from the code.
Dear @AleCandido, I fully understand all you wrote and I would be glad to help you understand the reason of the discrepancy taking your perspective as much as possible. As a matter of fact, I did use the PDF set you provided me with for producing the plot I shared with you, which effectively turns off the gluon channel. Unfortunately, though, I cannot see any bug in APFEL related to factorisation-scale variations in CC F2c, as you claim. I'm not sure there is much more I can do on my side.
I see your point @vbertone, and it's perfectly true that you did your best with the information we provided.
It's evident from your plot that you're not experiencing any discontinuity while we are, so it's undeniable that we are doing two different things. At this point it's our responsibility to provide more information to fully reproduce the run. If you would like to keep participating I would ask you just two things:
Actually doing the second should be sufficient, because we should be able to run it on our own, with your current setup and with the other one, but a further couple of eyes not conditioned by our experience it's valuable.
Hi @AleCandido, here is the code I've used for the plot:
#include <APFEL/APFEL.h>
#include <LHAPDF/LHAPDF.h>
#include <vector>
#include <fstream>
int main()
{
LHAPDF::PDF* pdfs = LHAPDF::mkPDF("toy-sbaronly");
APFEL::SetMassScheme("FONLL-A");
APFEL::SetProcessDIS("CC");
APFEL::EnableDampingFONLL(false);
APFEL::SetPDFSet("toy-sbaronly");
APFEL::SetPoleMasses(pdfs->quarkThreshold(4), pdfs->quarkThreshold(5), pdfs->quarkThreshold(6));
const double x = 0.001;
const std::vector<double> kren = {1, 0.5};
const int nQ = 100;
const double Qmin = 2;
const double Qmax = 30;
const double Qstp = exp( log( Qmax/ Qmin ) / ( nQ - 1 ) );
std::ofstream fout("F2charm.dat");
for (double k : kren)
{
APFEL::SetFacQRatio(k);
APFEL::InitializeAPFEL_DIS();
for (double Q = Qmin; Q <= Qmax; Q *= Qstp)
{
APFEL::SetAlphaQCDRef(pdfs->alphasQ(Q), Q);
APFEL::ComputeStructureFunctionsAPFEL(k * Q, Q);
fout << std::scientific << x << "\t" << Q << "\t" << APFEL::F2charm(x) << "\t" << pdfs->xfxQ(-3, x, k * Q) << "\t" << pdfs->alphasQ(Q) << std::endl;
}
fout << std::endl;
}
fout.close();
return 0;
}
Let me know if you find any problem.
Sorry not to reply soon (and not to be replying still).
We are still interested in the investigation, and at a first sight your code it's actually reproducing the scenario we described, but right now we need some more time for doing something else, so we will come back soon on this issue.
The only difference I spotted it's that you are correctly using the masses of the PDF I gave you, the only ones you had available, but instead we are actually using different values for the masses:
'mc': 2,
'Qmc': 2,
'kcThr': 1.0,
'mb': 4,
'Qmb': 4,
'kbThr': 1.0,
'mt': 173.07,
'Qmt': 173.07,
'ktThr': 1.0,
so this shift the thresholds, e.g.: you are using a value of mc = 1.3
, so our Q2=16
jump should be placed at Q2=6.76
in your run, but it would be still in scope.
I'm still not giving you the full runcard only because the run was not on my machine and I need to retrieve it, maybe I could also reproduce from the runner we are always using, but before adding further entropy I would prefer to wait a little more (the excerpt I gave you belongs to the part we never change so I'm sure, but the most relevant information belongs of course to the other part).
@AleCandido I think this explains the discontinuity that is the genuine FONLL discontinuity at the charm threshold that is usually tamed by introducing the damping factor (that is off here). The reason is simply that F2charm (as well as FLcharm and F3charm) in the ZM-VFN scheme is by assumption set to zero below the charm threshold and switches on right above it (according to the definition of ZM-VFNS given by Collins, Wilczek, and Zee (CWZ)). Since the scale at which PDFs are computed is muF
, if you vary muF
w.r.t. Q
by a factor 0.5
the structure function will cross the threshold at Q = 2 mc
(that with your parameter choice, unfortunately, coincides with the bottom mass, i.e. 4 GeV) and there the ZM components kicks in giving rise to the discontinuity. To conclude, APFEL seems to be behaving in the correct way, or at least in the way I planned it to behave, and thus I continue to see no bug in APFEL.
I know that the choice of charm and bottom masses it's not the best one, we set it before start working on scale variations, and as soon as we started working on them intensively we realized it and thought to switch. For the moment we are keeping them not to break some tests, but I'm sorry for the confusion they generate.
Instead I don't understand the part on F2charm
(e.g.): following the FONLL paper F2charm
is defined as the heavy contribution all over the place plus a difference term.
This last term is designed to be the difference between the F2light
with one more light flavor (i.e. charm being light) and the massless limit of the heavy (massive-zero
coefficient), in which all the power like occurrences of the mass are really set to 0 and only the log
behavior is kept.
Of course the log
becomes unreliable below threshold, and that's the reason why you can not keep the term all over the place, but at threshold the log
is exactly 0, being log(Q2/m2)
, so at this point the massive-zero
coefficient should be equal to the light + 1, making the difference null, at least at NLO
Note that in the FONLL scheme continuity does not play a role in the matching conditions: at NLO continuity ensues accidentally from the matching conditions, but at higher orders subleading discontinuities may arise.
So I still don't see where the discontinuities should come from in FONLL-A.
Actually I produced the same picture of you just changing the masses:
APFEL::SetPoleMasses(2., 4., 173.07);
And here is the picture:
Notice the discontinuity is only in the scale varied one, but also the other it's crossing all the thresholds (charm and bottom of course, not top).
I think that the misunderstanding is araising from confusing the charm mass (mc
) with the charm threshold. If Q = muF
you are correct in saying that at NLO the log of mc / Q
, that is the only term that does not cancel between zero-mass
and massive-zero
(btw this is an accident of NLO, beyond that there will also be constant non-power-suppressed terms that do not cancel), provides a natural damping at the threshold, where muF = Q = mc
, reason why the curve with muF = Q
is continuous at Q = 2 GeV. However, in general if you take muF / Q = k
you will have that the ZM contribution, present in difference term of the FONLL structure function, will kick in at Q = mc / k
(for the reason explained in my previous message) and there the log is no longer zero (it will be log(k)
) and therefore you get a discontinuity. Notice that the fact that F2charm in FONLL at NLO with PDF and alpha_s matching at the charm mass and muF = Q
is continuous at Q = mc
is more of an accident than a rule. If you go to NNLO or simply displace the charm threshold the discontinuity will be there for any choice of muF
and to get rid of that discontinuity you will need to introduce a damping factor.
Probably you are right and having experienced only the NLO I'm relying too much on the continuity, even if I'm aware of that being an accident and not a rule, as you can deduce from previous FONLL paper citation.
But in this particular context (NLO CC F2/3 quark channel) the massive-zero
it's not dependent at all on the log
, making it continuous for both the non-scale-varied and the scale-varied bits (since the massive-zero
coefficient is essentially the same as the NLO).
Maybe I'm still making an error somewhere, and this may explain the discrepancy, but if what I said it's correct the discontinuity in APFEL it's not explained.
As I said, it is the zero-mass
(ZM) (not the massive-zero
) to be discontinuous at muF = k Q = mc
and the discontinuity at NLO is entirely driven by log(k)
, which explains the continuity for k = 1
.
As I said before, it happens that for this particular case, since the log
is missing, the massive-zero
and the zero-mass
are actually the same thing.
So I don't see how it is possible to be the same thing and being continuous and discontinuous. Am I still missing something?
In particular we realized that for the quark channel at NLO DIS FONLL it's trivial:
log
for this channel FONLL it's the same scheme of FFNS3 as wellIf you try to run the two options you will obtain different numbers, but the discrepancy it's only due to the different value of as
(because of the FNS affecting as
evolution). If you trick the program to use the same value of as
in any way you will obtain the very same numbers.
@vbertone can you point us where the Kf
bits of Eq. (1.63) of DIS.pdf
in the APFEL docs are implemented?
Looks like they should be the FONLL-A massive-zero
quark-channel scale variations. And it should be the same one of the zero-mass
.
Same thing for massive SC3mm, but the massive-zero
should be the same of the zero-mass
, not of the massive
.
Sorry, I'm try to catch up. What do you mean by "Is it regular that SC2 is evaluated at a different point than SC3?"
If you go to the pointed lines you will see:
SC2m0CC(igrid,jxi,3,1,beta,alpha) =
and
SC3m0CC(igrid,Nf_FF,3,1,beta,alpha) =
You see that the second argument it's not the same, and being the second argument Nf_FF
it's a pretty isolated case, common only with the massive
one.
I see, I don't remember this by heart. I need to check.
FONLL-A
scheme (i.e. NLO) forxiF!=0
there is the scale variations for the massive-zero coefficient missingnon-scale variated
scale variated
diff
APFEL banner