Large HFC splitting in garlic() function

A place to report and discuss potential bugs
Post Reply
katarkon
Local Expert
Posts: 182
Joined: Mon Jan 12, 2015 4:01 am

Large HFC splitting in garlic() function

Post by katarkon »

I found that garlic threats equivalent nuclei and separate nuclei with equal constants in different manner if HFC constants are large. I.e. if two nuclei with spin 1/2 are defined as equivalent the simulated spectrum is quartet 1:1:1:1 as expected. But if they defined as two separate nuclei with equal constants the triplet 1:2:1 occurs unexpectively. For small constants both definitions give a triplet 1:2:1 as expected. Is this a bug or certain limitation of garlic function?
Stefan Stoll
EasySpin Creator
Posts: 1041
Joined: Mon Jul 21, 2014 10:11 pm
Location: University of Washington

Re: Large HFC splitting in garlic() function

Post by Stefan Stoll »

Please post a minimal script that shows this.
katarkon
Local Expert
Posts: 182
Joined: Mon Jan 12, 2015 4:01 am

Re: Large HFC splitting in garlic() function

Post by katarkon »

Here is the script demonstrating the problem:

Code: Select all

Sys.g = 2;
Sys.Nucs = '31P,31P';
Sys.n = [1 1];
Sys.lw = 1;
Sys.A = [880 880]; 
Exp.mwFreq = 9.5;
Exp.Range=[300 380];
[x,y1]=pepper(Sys,Exp);
[x,y2]=garlic(Sys,Exp);
y2=y2+max(y2);
Sys.Nucs='1H';
Sys.n=2;
Sys.A=880;
[x,y3]=garlic(Sys,Exp);
y3=y3-max(y3);
y(1,:)=y1;
y(2,:)=y2;
y(3,:)=y3;
plot(x,y);
Another script with two different large constants:

Code: Select all

Sys.g = 2;
Sys.Nucs = '31P,31P';
Sys.n = [1 1];
Sys.lw = 1;
Sys.A = [880 830]; 
Exp.mwFreq = 9.5;
Exp.Range=[300 380];
[x,y1]=pepper(Sys,Exp);
[x,y2]=garlic(Sys,Exp);
y(1,:)=y1;
y(2,:)=y2;
plot(x,y);
UPD: Not surprisingly, the perturbation methods give equal (wrong) results as for garlic as for pepper (triplet 1:2:1 instead of doublet of doublets).
katarkon
Local Expert
Posts: 182
Joined: Mon Jan 12, 2015 4:01 am

Re: Large HFC splitting in garlic() function

Post by katarkon »

It seems I found the reason of the problem. It looks that garlic handles every set of equivalent nuclei indepedently like only one group is present in spin system. So equivalent sets give equal splitting. In such manner the system with only one large constant will be processed correctly.
I suggest that correction of g-factor before each processing should solve the problem.
Briefly the idea is follow. The processing of first set of nuclei gives a set of resonance fields. Each resonance should be converted to g-factor and used for processing of second set of nuclei (each calculated g-factor substitutes initial one). Concatenation of the results should give a set of resonance fields for two group of the nuclei. Third and follows groups may be handled with the same manner.
I still vaguely imagine how to release this idean in the algorythm optimally but I can try if necessary.

Draft demonstrator of the idea.

Code: Select all

Sys.g = 2;
Sys.Nucs = '1H,1H';
Sys.n = [1 1];
Sys.lw = 1;
Sys.A = [880 880]; 
Exp.mwFreq = 9.5;
Exp.Range=[300 380];
Opt.PerturbOrder=2;

%beginning

gList=Sys.g; %starting value
nNucs=numel(Sys.A); %number of set of the nuclei
Nucs=nucstring2list(Sys.Nucs); %list of nuclei
convConst=Exp.mwFreq*1e12*planck/bmagn; %field to g conversion factor

%beginning iterative calculation

for i=1:nNucs
    B=[]; %starting resonance fields list
    Sys1.A=Sys.A(i);
    Sys1.Nucs=Nucs{i};
    %Sys1.n=Sys.n(i); %may be used in future
    for j=1:numel(gList)
        Sys1.g=gList(j);
        B1=resfields_perturb(Sys1,Exp,Opt); %breit-rabi solver should be used here
        B1=B1';
        B=[B B1];
    end
    gList=convConst*ones(1,numel(B))./B; %field to g conversion
end

%display results

disp(B);
UPD.
Unfortunately the idea looks unworking. I don't completely understand why.

Code: Select all

clear

Sys.g = 2;
Sys.Nucs = '31P';
Sys.n = [2];
Sys.lw = 1;
Sys.A = [880]; 
Exp.mwFreq = 9.5;
Exp.Range=[300 380];
[x,y]=garlic(Sys,Exp);

convConst=Exp.mwFreq*1e12*planck/bmagn;
Sys.n=1;
B=resfields(Sys,Exp)';
gList=convConst*ones(1,numel(B))./B

Sys1.g=gList(1);
Sys1.Nucs = '31P';
Sys1.n = [1];
Sys1.lw = 1;
Sys1.A = [880];

Vary1.A=80;
Vary1.g=0.1;

Sys2.g=gList(2);
Sys2.Nucs = '31P';
Sys2.n = [1];
Sys2.lw = 1;
Sys2.A = [880];

Vary2.g=0.1;
Vary2.A=80;

FitOpt.Method = 'simplex fcn';
FitOpt.Scaling = 'maxabs';
esfit('garlic',y,{Sys1,Sys2},{Vary1,Vary2},Exp,[],FitOpt);
Matt Krzyaniak
EasySpin Guru
Posts: 153
Joined: Tue Jul 22, 2014 11:01 am
Location: Northwestern University

Re: Large HFC splitting in garlic() function

Post by Matt Krzyaniak »

This is more of a quirk of how garlic calculates the spectrum when large HFI's are present.
This came up some time ago:
http://www.easyspin.org/forum/viewtopic.php?p=279#p279
Stefan Stoll
EasySpin Creator
Posts: 1041
Joined: Mon Jul 21, 2014 10:11 pm
Location: University of Washington

Re: Large HFC splitting in garlic() function

Post by Stefan Stoll »

As explained in the link that Matt sent, garlic is currently not able to model shifts due to interaction (via the electron) of different groups of equivalent nuclei.

If you don't need motional effects on the linewidths, you can use pepper[c] with an isotropic spin system to simulate a solution spectrum. That will take into account these cross-nuclear effects correctly.
katarkon
Local Expert
Posts: 182
Joined: Mon Jan 12, 2015 4:01 am

Re: Large HFC splitting in garlic() function

Post by katarkon »

Thanks. It was wtitten elsewhere that garlic should issue a warning in situations when crossterms should be taken in account. Really not.
If anyone is interested, it is not extremely hard to introduce fastmotion regime broadening for pepper with some additional code. The broadening may be calculated by fastmotion and used for postconvolution of separate lines (pepper allows such output) with further accumulation. Such solution is quite time-cost of course.
Post Reply