Here is a different one, based on the ZCW  (Zaremba, Conroy,  
Wolfsberg) algorithm used for powder spectra to equally distribute  
points over a sphere surface:
This paper gives an nice overview (I think I took the actual algorithm  
from there):

Computer simulations in solid-state NMR. III. Powder averaging
M. Edén
Concepts in Magnetic Resonance Part A  18A  24-55  (2003)
http://dx.doi.org/10.1002/cmr.a.10065



############# Fibonacci number generator ##################     
def fib(n):
        """
        From http://en.literateprograms.org/Fibonacci_numbers_(Python)
        Returns (n+2)-th and n-th fibonacci number
        """
        if n > 90:
                raise ValueError,"Can't represent higher numbers!"
        start = N.array([[1,1],[1,0]],dtype='int64')
        temp = start[:]
        for i in xrange(n):
                temp = N.dot(start,temp)
        return temp[0,0],temp[0,1],temp[1,1]
                


############# ZCW Angles ##########
def zcw_angles(m):
        """
        Getting N=fibonacchi(m) numbers of ZCW angles
        
        """

        samples, fib_1, fib_2 = fib(m)
        #fib_2 = fib_1
        print "Using %i Samples"%samples
        
        js = N.arange(samples, dtype='Float64')/samples
        
        c_full = (1.,2.,1.)
        c_hemi = (-1.,1.,1.)
        c_oct  = (2.,1.,8.)

        c = c_full
        
        j_samples = fib_2*js
        # alpha
        phi = 2*N.pi/c[2] * N.mod(j_samples,1.0)
        # beta
        theta = N.arccos(c[0]*(c[1]*N.mod(js,1.0) - 1))
        # weights
        weight = N.ones(samples)/samples
        return phi,theta,weight



Here is a interesting one, REPULSION:

REPULSION, A Novel Approach to Efficient Powder Averaging in Solid- 
State NMR
M. Bak and N. C. Nielsen
Journal of Magnetic Resonance  125  132--139  (1997)
http://www.sciencedirect.com/science/article/B6WJX-45N4XS2-J/1/58bb5f6971e8a76ab01a17e2794f98b7
A novel approach to efficient powder averaging in magnetic resonance  
is presented. The method relies on a simple numerical procedure which  
based on a random set of crystallite orientations through simulation  
of fictive intercrystallite repulsive forces iteratively determines a  
set of orientations uniformly distributed over the unit sphere. The so- 
called REPULSION partition scheme is compared to earlier methods with  
respect to the distribution of crystallite orientations, solid angles,  
and powder averaging efficiency. It is demonstrated that powder  
averaging using REPULSION converges faster than previous methods with  
respect to the number of crystallite orientations involved in the  
averaging. This feature renders REPULSION particularly attractive for  
calculation of magic-angle-spinning solid-state NMR spectra using a  
minimum of crystallite orientations. For numerical simulation of  
powder spectra, the reduced number of required crystallite  
orientations translates into shorter computation times and simulations  
less prone to systematic errors induced by finite sets of nonuniformly  
distributed crystallite orientations.


--
"A program that produces incorrect results twice as fast is infinitely  
slower." -- John Osterhout

_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to