Andy, you need to be a bit more fair here!  If Troels can come up with
a proof of the Carver and Richards 1972 equations reducing to the Luz
and Meiboom 1963 equations, I would expect at least a few pints ;)

Regards,

Edward



On 6 May 2014 09:25, Andrew Baldwin <[email protected]> wrote:
> Hiya Troels,
>
> Very commendable tenacity with the fluorescence result :) Good stuff indeed!
>
> 1) Definition of alpha- :
>
> That's a fair point. I agree. Alpha- is later squared so either:
>
> zeta(B14) = 2.0*dw (Delta R2 + k_eg - k_ge)
> zeta(B14) = 2.0*dw (-Delta R2 - k_eg + k_ge)
>
> Will work equally well. Which you use depends on how you choose to
> parametrise the Eigenvalues. h1 can be plus or minus depending on your mood.
> So my mood says keeping the positive deltaR2 makes the equation prettier.
>
> 2) You might need to give a bit more thought to the numerical
> implementation. Notice that I add the factor of R2g back in, during the
> function Numdisp. Turns out you can factor anything out from the diagonal as
> long as you put it back in at the end, hence the form of the matrix in the
> code I sent.
>
> You can prove this by looking at the Eigenvalues, and how they propagate
> when you take things like matrix exponentials. In the same vein, notice that
> In the paper I subtract R2G from both f00 and f11. I add it back in again
> later in the constants out the front. This is following from the lead of
> Nikolai in his reconstructing invisible states paper. Implicitly looking at
> deltaR2s shows clearly where differences in relaxation have effects, so this
> brings out the physics.
>
> So look at the 'error' reported in the outputs. When you made the Troels
> version of the numerical code, the error for the Baldwin formula was 10s-1.
> This is actually the exact value you set R2G to. So while you added in R2G
> in the evolution matrix (which is not wrong to do), you didn't then remove
> it in numdisp, so your solution is out by one unit of R2G.
>
> Looking at the outputs, the code I sent for CR had the carver richard's
> formula set in the wrong 'minus' configuration, added during testing while
> writing the previous email. This was certainly my foobar. However, note that
> the maximum 'error' reported by the code was 4989 s-1 when you ran the code
> for the first time. In my previous email:
>
>
>> with the alpha- sign made consistent with the Carver Richard's paper gives
>> an error of 4989 s-1 in the same test
>
>
> That should have set off alarm bells for you. Setting either:
>
>     zeta=2*dw*(deltaR2+keg-kge)                 #zeta=g1
>     zeta=2*dw*(-deltaR2-keg+kge)                 #zeta=g1
>
> In the CR function as you note (and as you do in relax) is good. If you
> subtract the 'Baldwin error' from the 'CR error' you get 8. 8 s-1 is the
> biggest error incurred using CR in this parameter range (as I stated in the
> last email). So it's fair to call the CR equation an approximation. Fig 1
> speaketh the truth. Calculate it yourself first using your code before
> wielding the accusing stick!
>
> So I'm deducting one half pint from your score for not checking the results
> from your modified numerical code more carefully.
>
> And now for beer counting:
> 1) Appendix 1 – recipe for exact calculation of R2,eff
> is: h1 = 2.0*dw (R2B - R2A + k_BA - k_AB) = - CR72  (But it have no
> influence, but please keep history! Change it back to CR72. :-))
> same for h2.
>
>
> Pint for the typo in keg/kge. That's a genuine foobar in the manu - the
> equations should match code i've written, and I know the code is right
> because i've matched it to simulation. I'll keep my Eigenvalue definitions
> though.
>
>
> 2) zeta typo in eq 70. z=zeta
>
> Agreed! +1.
>
>
> 3) Watch alpha_ in eq 70. Get Delta R straight
>
> See 1. No extra pint here.
>
> 4) Comments in CODE:
> http://svn.gna.org/viewcvs/*checkout*/relax/trunk/lib/dispersion/b14.py?revision=HEAD
> g1=2*dw*(deltaR2+keg-kge)                   #same as carver richards zeta
> That is not true. That is minus Zeta. But it does not matter, since order
> **2.
>
> See 1. No extra pint here either.
>
> 5) Did you actually implement ExchangeMat2x2  wrong??
> If yes, theeeeeen, no wonder figure 1 shows what it does. :-)
> What is up for the deltaOmegas story???
>
>
> -1/2 pint for an over-reached conclusion from your modified code.
>
> So current score = 1.5
>
>
> Meiboom challenge: I'd be interested in a proof for how Carver Richard's
> reduces to Meiboom. I'd pay a pint for that. To get you started, note that
> in the fast exchange limit, E0 and E2 can be simplified using the fast
> exchange limits in supp section 1.
>
> Best,
>
> Andy.
>
>
>
> On 05/05/2014 15:27, Troels Emtekær Linnet wrote:
>
> Hi Andy.
>
> Heh, the funniest part with the fluorescence was to battle with the
> moderators of wikipedia to change 9000 to 9 in R06.
> http://en.wikipedia.org/wiki/F%C3%B6rster_resonance_energy_transfer#Theoretical_basis
> That was a brawl, to convince them that the bible was wrong. But
> referring to the old dusty library book of Forster (Ref 14) made the
> deal.
>
> Back to the beer.
>
> You are swapping two things in your code, according to CR72.
>
> If I write up CR72: (Directly from cr72.py)
> #######
> fact = r20a - r20b - k_BA + k_AB
> zeta = 2.0*dw * fact
>
> So in total:
> %%%%%
> zeta(CR72) = 2.0*dw (R2A - R2B + k_AB - k_BA)
> %%%%
>
>
> Then we take your code:
> #######
> deltaR2=R2e-R2g
> g1=2*dw*(deltaR2+keg-kge)                   #same as carver richards zeta
>
> Change notation, to make it easier to see:
> %%%%%
> zeta(B14) = 2.0*dw (R2B - R2A + k_BA - k_AB)
> %%%%
> But huh, is that not just:
>
> zeta(B14) = - zeta(CR72)
>               = 2.0*dw ( - R2A + R2B - k_AB + k_BA)
>               = 2.0*dw ( R2B - R2A + k_BA - k_AB)
>
> Well, that is interesting.
> So your g1 is the negative of carver richards zeta.
>
> Fortunately we are lucky, that zeta is to the power **2.
> So that leaves it out.
>
> How about psi?
> It boils down to that
> fact(B14) = - fact(CR72) <=>
> alpha_ (B14) = - alpha_ (CR72)
>
> But alpha_ is also to the power **2. Phew...
>
> So what is up.
> If we look at: (compareTroells.py)
> https://gna.org/support/download.php?file_id=20636
>
> ##############
> def CarverRichards(kex,pb,dw,ncyc,Trelax,R2g,R2e,outfile,verb='n'):
>     deltaR2=R2e-R2g
>     keg=(1-pb)*kex
>     kge=pb*kex
>
>     zeta=2*dw*(-deltaR2+keg-kge)                 #zeta=g1
>     psi=(deltaR2+keg-kge)**2.0+4*keg*kge-dw**2  #psi=g2
> #############
>
> Well here we have something !
> zeta = 2.0 * dw ( R2A - R2B - k_AB + k_BA )
>
> So this is not about how you make the difference of ( R2A - R2B )
> it is the swapping of + k_AB - k_BA <<  - k_AB + k_BA
> kex(1 - 2pa) << kex( -1 + 2pa )
>
> You have implemented CR72 wrong ?
>
> Hmmmm. What is up?
>
> You get a difference between CR72, and numerical.
> You cannot get CR72 to work, unless you modify alpha_.
> You invert the signs of forward / backward exchange rate.
>
> You say that numerical is true, so CR72 is wrong.
>
> Lets inspect numerical.
>
> If we look at: (compareTroells.py)
> https://gna.org/support/download.php?file_id=20636
> Now we look up the numerical solution.
> #####
> NumDisp(kex,pb,dw,ncyc,Trelax,R2g,R2e,outfile,verb='n'):
> array=CPMG2x2(dw,(R2e-R2g),kex,pb,Trelax,ncyc)
> CPMG2x2(dOmega,DeltaR2,kex,pb,Trel,ncyc):
> L=ExchangeMat2x2(dOmega,DeltaR2,kex,pb)
> ExchangeMat2x2(dOmega,DeltaR2,kex,pb):
> L = mat(zeros((2, 2),dtype=complex))
> L[1,1] -= DeltaR2
>
> Hmmm.
> According to your paper at equation 3.
>
> R+ =
> [[ -kAB - R2A]  [kBA] ]
>  [ kAB]      [ -kBA - R2B - i dw] ]
>
> But I see that it gets populated like
> R+ =
> [[ -kAB ]  [kBA] ]
>  [ kAB]      [ -kBA - R2B + R2A - i dw] ]
>
> Has this something to do with it:
>
> ????
>
> So I took the liberty to change your code, hoping the Theory is right.
>
> ############# Normal
> Baldwin 1.183188 1.0
> Numerical 58.556647 49.4905687008
> Meiboom 0.391873 0.331200958766
> Carver 0.693676 0.586277075156
> compareTroells_w_Troels_mod.py:260: RuntimeWarning: invalid value
> encountered in log
>   R2eff=(1/Tc)*numpy.log(intensity0/intensity);        # we did not
> factor out (Ka+Kb)/2 here
> Nikolai 3.434938 2.90312105938
> NikolaiLong 585.485493 494.837247335
>
> Maximum error over grid (s-1):
> Meiboom:          93015865.9296
> Baldwin:          1.49539403083e-09
> CarverRichards:   4989.8296812
> Nikolai dougle (9):          204.761587913
> Nikolai long double (23):     2.0692254415912185547869e-7
>
>
> ############ Modifying Meiboom to 4 NCYC
> Maximum error over grid (s-1):
> Meiboom:          22664952.3388
> Baldwin:          1.49539403083e-09
> CarverRichards:   4989.8296812
>
> ########### Modifying ExchangeMat2x2 to your paper version.
> Meiboom:          22664942.3388
> Baldwin:          10.0000000012
> CarverRichards:   4979.8296812
>
> ########## Modify CR72 zeta=2*dw*(-deltaR2-keg+kge)
> Baldwin 1.216869 1.0
> Numerical 60.302727 49.555644034
> Meiboom 0.397395 0.326571718073
> Carver 0.700189 0.575402118059
> compareTroells_w_Troels_mod.py:261: RuntimeWarning: invalid value
> encountered in log
>   R2eff=(1/Tc)*numpy.log(intensity0/intensity);        # we did not
> factor out (Ka+Kb)/2 here
> Nikolai 3.569577 2.93341107383
> NikolaiLong 591.459824 486.050531323
> Maximum error over grid (s-1):
> Meiboom:          22664942.3388
> Baldwin:          10.0000000012
> CarverRichards:   18.2238852463
> Nikolai dougle (9):          214.761587913
> Nikolai long double (23):     10.000000207062814176945
>
> WOOOOOWWWW
>
> The change I made was:
>
> ##############################################
> 37c37
> < def ExchangeMat2x2(dOmega,DeltaR2,kex,pb):
> ---
>
> def ExchangeMat2x2(dOmega,R2e,R2g,kex,pb):
>
> 47c47
> <     L[1,1] -= DeltaR2
> ---
>
>     L[1,1] -= R2e
>
> 49a50
>
>     L[0, 0] -= R2g
>
> 64,65c65,66
> < def CPMG2x2(dOmega,DeltaR2,kex,pb,Trel,ncyc):
> <     L=ExchangeMat2x2(dOmega,DeltaR2,kex,pb)
> ---
>
> def CPMG2x2(dOmega,R2e,R2g,kex,pb,Trel,ncyc):
>     L=ExchangeMat2x2(dOmega,R2e,R2g,kex,pb)
>
> 86,87c87,88
> <     tcp=1/(2*nu_cpmg)
> <
> R2eff=(1-pb)*R2g+pb*R2e+R2Fast*(1.-(2./(kex*tcp))*numpy.tanh(kex*tcp/2.0))
> ---
>
>     tcp=1/(4*nu_cpmg)
>
> R2eff=(1-pb)*R2g+pb*R2e+R2Fast*(1.-(4./(kex*tcp))*numpy.tanh(kex*tcp/4.0))
>
> 112c113
> <     zeta=2*dw*(-deltaR2+keg-kge)                 #zeta=g1
> ---
>
>     zeta=2*dw*(-deltaR2-keg+kge)                 #zeta=g1
>
> 145c146
> <     array=CPMG2x2(dw,(R2e-R2g),kex,pb,Trelax,ncyc)
> ---
>
>     array=CPMG2x2(dw,R2e,R2g,kex,pb,Trelax,ncyc)
>
> 546c547
> <     #tom,jarr=TestDisp(ncyc,Trelax,R2g,'NikolaiLong',tim)
> ---
>
>     tom,jarr=TestDisp(ncyc,Trelax,R2g,'NikolaiLong',tim)
>
> 560c561
> <     print 'Nikolai long double (18):
> ',numpy.max(numpy.abs(narr[:,:,1]-larr[:,:,1]))
> ---
>
>     #print 'Nikolai long double (18):
> ',numpy.max(numpy.abs(narr[:,:,1]-larr[:,:,1]))
>
> [tlinnet@tomat ~/Downloads]$ diff compareTroells.py
> compareTroells_w_Troels_mod.py
> 37c37
> < def ExchangeMat2x2(dOmega,DeltaR2,kex,pb):
> ---
>
> def ExchangeMat2x2(dOmega,R2e,R2g,kex,pb):
>
> 47c47
> <     L[1,1] -= DeltaR2
> ---
>
>     L[1,1] -= R2e
>
> 49a50
>
>     L[0, 0] -= R2g
>
> 64,65c65,66
> < def CPMG2x2(dOmega,DeltaR2,kex,pb,Trel,ncyc):
> <     L=ExchangeMat2x2(dOmega,DeltaR2,kex,pb)
> ---
>
> def CPMG2x2(dOmega,R2e,R2g,kex,pb,Trel,ncyc):
>     L=ExchangeMat2x2(dOmega,R2e,R2g,kex,pb)
>
> 86,87c87,88
> <     tcp=1/(2*nu_cpmg)
> <
> R2eff=(1-pb)*R2g+pb*R2e+R2Fast*(1.-(2./(kex*tcp))*numpy.tanh(kex*tcp/2.0))
> ---
>
>     tcp=1/(4*nu_cpmg)
>
> R2eff=(1-pb)*R2g+pb*R2e+R2Fast*(1.-(4./(kex*tcp))*numpy.tanh(kex*tcp/4.0))
>
> 112c113
> <     zeta=2*dw*(-deltaR2+keg-kge)                 #zeta=g1
> ---
>
>     zeta=2*dw*(-deltaR2-keg+kge)                 #zeta=g1
>
> 145c146
> <     array=CPMG2x2(dw,(R2e-R2g),kex,pb,Trelax,ncyc)
> ---
>
>     array=CPMG2x2(dw,R2e,R2g,kex,pb,Trelax,ncyc)
>
> 546c547
> <     #tom,jarr=TestDisp(ncyc,Trelax,R2g,'NikolaiLong',tim)
> ---
>
>     tom,jarr=TestDisp(ncyc,Trelax,R2g,'NikolaiLong',tim)
>
> 560c561
> <     print 'Nikolai long double (18):
> ',numpy.max(numpy.abs(narr[:,:,1]-larr[:,:,1]))
> ---
>
>     #print 'Nikolai long double (18):
> ',numpy.max(numpy.abs(narr[:,:,1]-larr[:,:,1]))
>
> [tlinnet@tomat ~/Downloads]$ diff compareTroells.py
> compareTroells_w_Troels_mod.py
> 37c37
> < def ExchangeMat2x2(dOmega,DeltaR2,kex,pb):
> ---
>
> def ExchangeMat2x2(dOmega,R2e,R2g,kex,pb):
>
> 47c47
> <     L[1,1] -= DeltaR2
> ---
>
>     L[1,1] -= R2e
>
> 49a50
>
>     L[0, 0] -= R2g
>
> 64,65c65,66
> < def CPMG2x2(dOmega,DeltaR2,kex,pb,Trel,ncyc):
> <     L=ExchangeMat2x2(dOmega,DeltaR2,kex,pb)
> ---
>
> def CPMG2x2(dOmega,R2e,R2g,kex,pb,Trel,ncyc):
>     L=ExchangeMat2x2(dOmega,R2e,R2g,kex,pb)
>
> 86,87c87,88
> <     tcp=1/(2*nu_cpmg)
> <
> R2eff=(1-pb)*R2g+pb*R2e+R2Fast*(1.-(2./(kex*tcp))*numpy.tanh(kex*tcp/2.0))
> ---
>
>     tcp=1/(4*nu_cpmg)
>
> R2eff=(1-pb)*R2g+pb*R2e+R2Fast*(1.-(4./(kex*tcp))*numpy.tanh(kex*tcp/4.0))
>
> 112c113
> <     zeta=2*dw*(-deltaR2+keg-kge)                 #zeta=g1
> ---
>
>     zeta=2*dw*(-deltaR2-keg+kge)                 #zeta=g1
>
> 145c146
> <     array=CPMG2x2(dw,(R2e-R2g),kex,pb,Trelax,ncyc)
> ---
>
>     array=CPMG2x2(dw,R2e,R2g,kex,pb,Trelax,ncyc)
>
> 546c547
> <     #tom,jarr=TestDisp(ncyc,Trelax,R2g,'NikolaiLong',tim)
> ---
>
>     tom,jarr=TestDisp(ncyc,Trelax,R2g,'NikolaiLong',tim)
>
> 560c561
> <     print 'Nikolai long double (18):
> ',numpy.max(numpy.abs(narr[:,:,1]-larr[:,:,1]))
> ---
>
>     #print 'Nikolai long double (18):
> ',numpy.max(numpy.abs(narr[:,:,1]-larr[:,:,1]))
>
> ####################################
>
> File can be downloaded from:
> https://gna.org/support/download.php?file_id=20642
>
>
>
> What have we (maybe) learned?????
>
> 1) Baldwin has created a code, which is as good as the numerical of
> Nicolai. Thanks !!! Wuhuuu !
> 2) CR72 is still valid though. Doing well.
>
> And now for beer counting:
> 1) Appendix 1 – recipe for exact calculation of R2,eff
> is: h1 = 2.0*dw (R2B - R2A + k_BA - k_AB) = - CR72  (But it have no
> influence, but please keep history! Change it back to CR72. :-))
> same for h2.
>
> 2) zeta typo in eq 70. z=zeta
>
> 3) Watch alpha_ in eq 70. Get Delta R straight
>
> 4) Comments in CODE:
> http://svn.gna.org/viewcvs/*checkout*/relax/trunk/lib/dispersion/b14.py?revision=HEAD
> g1=2*dw*(deltaR2+keg-kge)                   #same as carver richards zeta
> That is not true. That is minus Zeta. But it does not matter, since order
> **2.
>
> g2=(deltaR2+keg-kge)**2.0+4*keg*kge-dw**2   #same as carver richards psi
> Not totally correct, but since deltaR2 is swapped, it gets minus
> alpha, and goes to order 2.
>
> 5) Did you actually implement ExchangeMat2x2  wrong??
> If yes, theeeeeen, no wonder figure 1 shows what it does. :-)
> What is up for the deltaOmegas story???
>
> This is my 2 cents. :-)
>
> Let me hear if my hours have been wasted.
>
> Best
> Troels
>
>
> 2014-05-05 11:00 GMT+02:00 Andrew Baldwin <[email protected]>:
>
> I had to struggle long to find out the Forster distance calculation in
>
> Lakowicz was wrong. The bible of fluorescence...
>
>
> Very good stuff :) Most would not take the time to check :) The finest
> biophysics really does demand both first rate biology and first rate
> physics.
>
> I don't think anyone has ever used the CR equation to analyse data outside
> of the limit where R2A=R2B, so it's very unlikely that this has error has
> had any real consequence. Note also that in general, it's actually much
> easier to code up a numerical solution - ie once you've typed up an
> evolution matrix, all you have left to do is write some lines taking matrix
> exponentials. Whereas with an equation, not only are you making implicit
> approximations that aren't necessarily obvious, there are many, many, more
> lines to type, thus increasing the probability of a foobar. So numerical
> solutions for spin dynamics = no mistakes, and also easy to code! This has
> been the approach in the Kay group, arguably cultivated by Dimitri and
> Nikolai, and then pushed hard more recently by Flemming, Pramodh and
> Guillaume.
>
> This paper was truly groundbreaking (in my view):
> Journal of biomolecular NMR. 2000 18(1):49-63
>
> On this note, there are a few suggestions that Flemming and I are putting
> together for another thread sensibly started by Edward a few days ago for
> analysing R1rho and CPMG data. I think that with just a few extra tweaks,
> the backend to your code can be as powerful and as versatile as your front
> end, for millisecond data analysis. I agree that it really is in the
> interests of the field to have people able to perform the experiments and
> get information out of their data as efficiently (and as rigorously) as
> possible.
>
> This means more citations for those that made the experiments, and the
> community can keep showing more examples where Xray people have
> inadvertently missed functionally relevant conformers :)
>
> Best,
>
> Andy.
>
>
>
>
>
>
> On 04/05/2014 23:09, Troels Emtekær Linnet wrote:
>
> Well Andrew.
>
> Your paper popped out of the Mail alerts. :-)
>
> My supervisor Kaare Teilum guided my attention to it, and asked me to
> go through it to check.
>
> I discussed it with a lab colleague, and we were thrived.
>
> The math derivations still kills me, but I thought that the essential
> results was alarming.
> I mean, half of our lab do CPMG or R1rho.
> Any changes to those equations gets our attention.
>
> The "worst" problem we have in our lab, is the ability to analyse data.
> With relax, we now have a GUI, which make sure that at least the
> Bachelor Students still survive.
>
> And what else can I then do than get dirty with your code, to test if
> it is right?
>
> If you suspicion about the CR72 is correct, then I really really
> wonder why not errata article is out there?
>
> This situation reminds me of my master thesis.
> I had to struggle long to find out the Forster distance calculation in
> Lakowicz was wrong. The bible of fluorescence...
>
> Jesus....
>
> but thanks for the beer!
>
> Best
> Your biggest fan. ;-)
>
>
> 2014-05-04 22:59 GMT+02:00 Andrew Baldwin <[email protected]>:
>
> Dear Troels,
>
> The existence of typos is exceedingly probable! The editors have added
> more
> errors in the transcrpition, so it'll be curious to see how accurate the
> final draft will be. Your comments come just in time for alterations.
>
> So I'll pay a pint of beer for every identified error. I didn't use that
> particular supplementary section to directly calculate anything, so this
> is
> the place in the manu where errors are most likely to occur. I do note
> the
> irony that this is probably one of few bits in the article that people
> are
> likely to read.
>
> 1) Yep - that's a typo. alpha- should definitely be KEG-KGE (score 1
> pint).
>
> 2) Yep! zs should be zetas (score 1 pint).
>
> 3) This one is more interesting. Carver and Richard's didn't define a
> deltaR2. To my knowledge, I think Nikolai was the first to do that in his
> 2002 paper on reconstructing invisible states. So here, I think you'll
> find
> that my definition is the correct one. There is a typo in the Carver
> Richard's equation. I've just done a brief lit review, and as far as I
> can
> see, this mistake has propagated into every transcription of the equation
> since. I should note that in the manu in this section. Likely this has
> gone
> un-noticed as differences in R2 are difficult to measure by CPMG, instead
> R2A=R2B being assumed. Though thanks to Flemming, it is now possible to
> break this assumption:
>
> J Am Chem Soc. 2009 Sep 9;131(35):12745-54. doi: 10.1021/ja903897e.
>
> Also, in the Ishima and Torchia paper looking at the effects of
> relaxation
> differences:
>
> Journal of biomolecular NMR. 2006 34(4):209-19
>
> I understand their derivations started from Nikolai's formula, which is
> exact, so the error wouldn't come to light there either, necessarily.
>
> To prove the point try this: numerically evaluate R2,effs over a big grid
> of
> parameters, and compare say Nikolai's formula to your implementation of
> Carver Richard's with a +deltaR2 and a -deltaR2 in the alpha- parameter.
> Which agrees better? You'll see that dR2=R2E-R2G being positive wins.
>
> The attached should also help. It's some test code I used for the paper
> that
> has been briefly sanitised. In it, the numerical result, Carver Richards,
> Meiboom, Nikolai's and my formula are directly compared for speed
> (roughly)
> and precision.
>
> The code added for Nikolai's formula at higher precision was contributed
> by
> Nikolai after the two of us discussed some very odd results that can come
> from his algorithm. Turns out evaluating his algorithm at double
> precision
> (roughly 9 decimal places, default in python and matlab) is
> insuffficient.
> About 23 decimal places is necessary for exactness. This is what is
> discussed in the supplementary info in the recent paper. In short, on my
> laptop:
>
> formula / relative speed / biggest single point error in s-1 over grid
> Mine                                         1       7.2E-10
> Meiboom                                 0.3         9E7
> Carver Richards                       0.53       8
> Nikolai (double precision 9dp)  3.1        204
> Nikolai (long double 18dp)       420       3E-2
> Nikolai (23 dp)                         420       2E-7
> Numerical                                118        0
>
> The error in Carver Richard's with the alpha- sign made consistent with
> the
> Carver Richard's paper gives an error of 4989 s-1 in the same test. Ie,
> it's
> a bad idea.
>
> Note that the precise calculations in python at arbitrary precision are
> slow
> not because of the algorithm, but because of the mpmath module, which
> deals
> with C code via strings. Accurate but slow. This code has a small amount
> of
> additional overhead that shouldn't strictly be included in the time. I've
> no
> doubt also that algorithms here could be sped up further by giving them a
> bit of love. Those prefaces aside, I'm surprised that your benchmarking
> last
> Friday showed Nikolai's to be so much slower than mine? In my hands
> (attached) at double precision, Nikolai's formula is only 3x slower than
> mine using numpy. Though this is not adequate precision for mistake free
> calculations.
>
> Perhaps more physically compelling, to get my equation to reduce to
> Carver
> Richard's, alpha- has to be defined as I show it. Note that the origin of
> this parameter is its role in the Eigenvalue of the 2x2 matrix. This is
> the
> one advantage of a derivation - you can see where the parameters come
> from
> and get a feel for what their meaning is.
>
> So this typo, and the fact that Carver and Richards inadvertently change
> their definition of tau_cpmg half way through the paper, are both errors
> in
> the original manuscript. Though given that proof reading and type-setting
> in
> 1972 would have been very very painful, that there are this few errors is
> still actually quite remarkable. I notice in your CR72 code, you are
> currently using the incorrect definition, so I would suggest you change
> that.
>
> So overall, I think you're still ahead, so I'm calling that 2 pints to
> Troels.
>
> I would actually be very grateful if you can bring up any other
> inconsistencies in the paper! Also from an editorial perspective, please
> feel free to note if there are parts of the paper that were particularly
> unclear when reading. If you let me know, there's still time to improve
> it.
> Thusfar, I think you are the third person to read this paper (the other
> two
> being the reviewers who were forced to read it), and you're precisely its
> target demographic!
>
>
> Best,
>
> Andy.
>
>
>
> On 03/05/2014 13:54, Troels Emtekær Linnet wrote:
>
> Dear Andrew Baldwin.
>
> I am in the process of implementing your code in relax.
>
> I am getting myself into a terrible mess by trying to compare
> equations in papers, code and conversions.
>
> But I hope you maybe have a little time to clear something up?
>
> I am looking at the current version of your paper:
> dx.doi.org/10.1016/j.jmr.2014.02.023
> which still is still "early version of the manuscript. The manuscript
> will undergo copyediting, typesetting, and review of the resulting
> proof before it is published in its final form."
>
> 1) Equations are different ?
> In Appendix 1 – recipe for exact calculation of R2,eff
> h1 = 2 dw (dR2 + kEG - kGE)
>
> But when I compare to:
>
> Supplementary Section 4. Relation to Carver Richards equation. Equation
> 70.
> h1 = zeta = 2 dw alpha_ =  2 dw (dR2 + kGE - kEG)
>
> Is there a typo here? The GE and EG has been swapped.
>
> 2) Missing zeta in equation 70
> There is missing \zeta instead of z in equation 70, which is probably
> a typesetting error.
>
> 3) Definition of " Delta R2" is opposite convention?
> Near equation 10, 11 you define: delta R2 = R2e - R2g
> if we let e=B and g=A, then delta R2 = R2B - R2A
>
> And in equation 70:
> alpha_ =  delta R2 + kGE - kEG
>
> but i CR original work, A8,
> alpha_ =  R2A - R2B + kA - kB = - delta R2 + kGE - kEG
>
> So, that doesn't match?
>
> Sorry if these questions are trivial.
>
> But I hope you can help clear them up for me. :-)
>
> Best
> Troels
>
>
>
>
>
>
> 2014-05-01 10:07 GMT+02:00 Andrew Baldwin <[email protected]>:
>
> The Carver and Richards code in relax is fast enough, though Troels
> might have an interest in squeezing out a little more speed.  Though
> it would require different value checking to avoid NaNs, divide by
> zeros, trig function overflows (which don't occur for math.sqrt), etc.
>   Any changes would have to be heavily documented in the manual, wiki,
> etc.
>
>
> The prove that the two definitions are equivalent is relatively
> straightforward. The trig-to-exp command in the brilliant (and free)
> symbolic program sage might prove helpful in doing that.
>
>
> For the tau_c, tau_cp, tau_cpmg, etc. definitions, comparing the relax
> code to your script will ensure that the correct definition is used.
> That's how I've made sure that all other dispersion models are
> correctly handled - simple comparison to other software.  I'm only
> aware of two definitions though:
>
> tau_cpmg = 1 / (4 nu_cpmg)
> tau_cpmg = 1 / (2 nu_cpmg)
>
>
> tau_cpmg = 1/(nu_cpmg).
>
> Carver and Richard's switch definitions half way through the paper
> somewhere.
>
>
> What is the third?  Internally in relax, the 1 / (4 nu_cpmg)
> definition is used.  But the user inputs nu_cpmg.  This avoids the
> user making this mistake as nu_cpmg only has one definition.
>
>
> I've seen people use nu_cpmg defined as the pulse frequency. It's just an
> error that students make when things aren't clear. I've often seen brave
> student from a lab that has never tried CPMG before do this. Without
> someone
> to tell them that this is wrong, it's not obvious to them that they've
> made
> a mistake. I agree with you that this is solved with good documentation.
>
>
>
> You guys are free to use my code (I don't mind the gnu license) or of
> course
> implement from scratch as needed.
>
> Cheers!  For a valid copyright licensing agreement, you'll need text
> something along the lines of:
>
> "I agree to licence my contributions to the code in the file
> http://gna.org/support/download.php?file_id=20615 attached to
> http://gna.org/support/?3154 under the GNU General Public Licence,
> version three or higher."
>
> Feel free to copy and paste.
>
>
> No problem:
>
> "I agree to licence my contributions to the code in the file
> http://gna.org/support/download.php?file_id=20615 attached to
> http://gna.org/support/?3154 under the GNU General Public Licence,
> version three or higher."
>
>
> I'd like to note again though that anyone using this formula to fit data,
> though exact in the case of 2site exchange/inphase magnetisation,
> evaluated
> at double floating point precision should not be doing so! Neglecting
> scalar
> coupling/off resonance/spin flips/the details of the specific pulse
> sequence
> used will lead to avoidable foobars. I do see value in this, as described
> in
> the paper, as being a feeder for initial conditions for a more fancy
> implemenation. But beyond that, 'tis a bad idea. Ideally this should
> appear
> in big red letters in your (very nice!) gui when used.
>
> In relax, we allow the user to do anything though, via the
> auto-analysis (hence the GUI), we direct the user along the best path.
>   The default is to use the CR72 and 'NS CPMG 2-site expanded' models
> (Carver & Richards, and Martin Tollinger and Nikolai Skrynnikov's
> Maple expansion numeric model).  We use the CR72 model result as the
> starting point for optimisation of the numeric models, allowing a huge
> speed up in the analysis.  The user can also choose to not use the
> CR72 model results for the final model selection - for determining
> dispersion curve significance.
>
>
> Here's the supp from my CPMG formula paper (attached). Look at the last
> figure. Maybe relevant. Nikolai's algorithm blows up sometimes when you
> evaluate to double float point precision (as you will when you have a
> version in python or matlab). The advantage of Nicolai's formula, or mine
> is
> that they won't fail when Pb starts to creep above a per cent or so.
>
> Using the simple formula as a seed for the more complex on is a good
> idea.
> The most recent versions of CATIA have something analogous.
>
>
> As for the scalar coupling and spin flips, I am unaware of any
> dispersion software that handles this.
>
>
> CATIA. Also cpmg_fig I believe. In fact, I think we may have had this
> discussion before?
>
> https://plus.google.com/s/cpmg%20glove
>
> If you consider experimental validation a reasonable justification for
> inclusion of the effects then you might find this interesting:
>
> Spin flips are also quite relevant to NH/N (and in fact any spin system).
> The supplementary section of Flemming and Pramodh go into it here for
> NH/N
> http://www.pnas.org/content/105/33/11766.full.pdf
>
> And this:
> JACS (2010) 132: 10992-5
> Figure 2:
> r2 0.97, rmsd  8.0 ppb (no spin flips)
> r2 0.99, rmsd  5.7 ppb (spin flips).
>
> The improvements are larger than experimental uncertainties.
>
> When we design these experiments and test them, we need to think about
> the
> details. This is in part because Lewis beats us if we don't. You can
> imagine
> that it comes as a surprise then when we see people neglecting this. In
> short, the parameters you extract from fitting data will suffer if the
> details are not there. In the case of spin flips, the bigger the protein,
> the bigger the effect. In your code, you have the opportunity to do
> things
> properly. This leaves the details behind the scenes, so the naive user
> doesn't have to think about them.
>
>
> And only Flemming's CATIA
> handles the CPMG off-resonance effects.  This is all explained in the
> relax manual.  I have asked the authors of most dispersion software
> about this too, just to be sure.  I don't know how much of an effect
> these have though.  But one day they may be implemented in relax as
> well, and then the user can perform the comparison themselves and see
> if all these claims hold.
>
>
> Myint, W. & Ishima, R. Chemical exchange effects during refocusing pulses
> in
> constant-time CPMG relaxation dispersion experiments. J Biomol Nmr 45,
> 207-216, (2009).
>
> also:
>
> Bain, A. D., Kumar Anand, C. & Nie, Z. Exact solution of the CPMG pulse
> sequence with phase variation down the echo train: application to R(2)
> measurements. J Magn Reson 209, 183- 194, (2011).
>
>
> Or just simulate the off-resonance effects yourself to see what happens.
> For
> NH you see the effects clearly for glycines and side chains, if the
> carrier
> is in the centre around 120ppm. The problem generally gets worse the
> higher
> field you go though this of course depends when you bought your probe.
> You
> seem to imply that these effects are almost mythical. I assure you that
> they
> come out happily from the Bloch equations.
>
> Out of curiosity, from a philosophical perspective, I wonder if you'd
> agree
> with this statement:
>
> "the expected deviations due to approximations in a model should be lower
> than the experimental errors on each datapoint."
>
>
>
> Anyway, the warnings about analytic versers numeric are described in
> the manual.  But your new model which adds a new factor to the CR72
> model, just as Dimitry Korzhnev's cpmg_fit software does for his
> multiple quantum extension of the equation (from his 2004 and 2005
> papers), sounds like it removes the major differences between the
> analytic and numeric results anyway.  In any case, I have never seen
> an analytic result which is more than 10% different in parameter
> values (kex specifically) compared to the numeric results.  I am
> constantly on the lookout for a real or synthetic data set to add to
> relax to prove this wrong though.
>
>
> I think there's a misunderstanding in what I mean by numerical modelling.
> For the 2x2 matrix (basis: I+, ground and excited) from the Bloch
> McConnell
> equation, you can manipulate this to get an exact solution. Nikolai's
> approach does this, though his algorithm can trip up sometimes for
> relatively exotic parameters when you use doubles (see attached). My
> formula
> also does this. I agree with you entirely that in this instance,
> numerically
> solving the equations via many matrix exponentials is irrelevant as
> you'll
> get an identical result to using a formula.
>
> My central thesis here though is that to get an accurate picture of the
> experiment you need more physics. This means a bigger basis. To have off
> resonance effects, you need a minimum 6x6 (Ix,Iy,Iz, ground and excited).
> To
> include scalar coupling and off resonance, you need a 12x12
> (Ix,Iy,Iz,IxHz,IyHz,IzHz, ground and excited). Including R1 means another
> element and so on. The methyl group, for example, means you need 24.
>
> So when we use the term numerical treatment, we generally mean a
> calculation
> in a larger basis, as is necessary to take into account the appropriate
> spin
> physics. There aren't formulas to deal with these situations. In the 6x6
> case for example, you need 6 Eigenvalues, which is going to make life
> very
> rough for someone brave enough to attempt a close form solution. The
> Palmer
> and Trott trick used in 2002 for R1rho is a smart way of ducking the
> problem
> of having 6 Eigenvalues, but for CPMG unfortunately you need several
> Eigenvalues, not just the smallest.
>
> The 2x2 matrix that Nikolai and Martin, Carver Richard's and I analyse
> does
> not include scalar coupling, as magnetisation is held in-phase (in
> addition
> to neglecting all the other stuff detailed above). So it is a good
> representation for describing the continuous wave in-phase experiments
> introduced here (neglecting relaxation effects and off resonance):
>
> Vallurupalli, P.; Hansen, D. F.; Stollar, E. J.; Meirovitch, E.; Kay, L.
> E.
> Proc. Natl. Acad. Sci. U.S.A. 2007, 104, 18473–18477.
>
> and here:
>
> Baldwin, A. J.; Hansen, D. F.; Vallurupalli, P.; Kay, L. E. J. Am. Chem.
> Soc. 2009, 131, 11939–48.
>
> But I think are the only two where this formula is directly applicable.
> Only
> if you have explicit decoupling during the CPMG period do you satisfy
> this
> condition. So this is not the case for all other experiments and
> certainly
> not true for those used most commonly.
>
> Anyhow. Best of luck with the software. I would recommend that you
> consider
> implementing these effects and have a look at some of the references. The
> physics are fairly complex, but the implementations are relatively
> straightforward and amount to taking many matrix exponentials. If you do
> this, I think you'd end up with a solution that really is world-leading.
>
> As it stands though, in your position, I would worry that on occasion,
> users
> will end up getting slightly wrong parameters out from your code by
> neglecting these effects. If a user trusts this code then, in turn, they
> might lead themselves to dodgy biological conclusions. For the time
> being,
> I'll stick to forcing my students to code things up themselves.
>
> All best wishes,
>
> Andy.
>
>
>
>
>

_______________________________________________
relax (http://www.nmr-relax.com)

This is the relax-devel mailing list
[email protected]

To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-devel

Reply via email to