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

