Пример #1
0
def test01(ntest, prefix='fig-v01') :
    """Test for radial 1-d binning of entire image.
    """
    from time import time
    import algos.graph.GlobalGraphics as gg
    from PSCalib.GeometryAccess import img_from_pixel_arrays

    arr, geo = data_geo(ntest)

    t0_sec = time()
    iX, iY = geo.get_pixel_coord_indexes()
    X, Y, Z = geo.get_pixel_coords()
    mask = geo.get_pixel_mask(mbits=0377).flatten() 
    print 'Time to retrieve geometry %.3f sec' % (time()-t0_sec)

    t0_sec = time()
    hp = HPolar(X, Y, mask, nradbins=500, nphibins=1) # v1
    print 'HPolar initialization time %.3f sec' % (time()-t0_sec)

    t0_sec = time()
    nda, title = arr, None
    if   ntest == 1 : nda, title = arr,                   'averaged data'
    elif ntest == 2 : nda, title = hp.pixel_rad(),        'pixel radius value'
    elif ntest == 3 : nda, title = hp.pixel_phi(),        'pixel phi value'
    elif ntest == 4 : nda, title = hp.pixel_irad() + 2,   'pixel radial bin index' 
    elif ntest == 5 : nda, title = hp.pixel_iphi() + 2,   'pixel phi bin index'
    elif ntest == 6 : nda, title = hp.pixel_iseq() + 2,   'pixel sequential (rad and phi) bin index'
    elif ntest == 7 : nda, title = mask,                  'mask'
    elif ntest == 8 : nda, title = hp.pixel_avrg(nda),    'averaged radial intensity'
    elif ntest == 9 : nda, title = hp.pixel_avrg_interpol(arr) * mask , 'interpolated radial intensity'
    else :
        print 'Test %d is not implemented' % ntest 
        return
        
    print 'Get %s n-d array time %.3f sec' % (title, time()-t0_sec)

    img = img_from_pixel_arrays(iX, iY, nda) if not ntest in (21,) else nda[100:300,:]

    da, ds = None, None
    colmap = 'jet' # 'cubehelix' 'cool' 'summer' 'jet' 'winter'
    if ntest in (2,3,4,5,6,7) :
        da = ds = (nda.min()-1., nda.max()+1.)

    else :
        ave, rms = nda.mean(), nda.std()
        da = ds = (ave-2*rms, ave+3*rms)

    gg.plotImageLarge(img, amp_range=da, figsize=(14,12), title=title, cmap=colmap)
    gg.save('%s-%02d-img.png' % (prefix, ntest))

    gg.hist1d(nda, bins=None, amp_range=ds, weights=None, color=None, show_stat=True, log=False, \
           figsize=(6,5), axwin=(0.18, 0.12, 0.78, 0.80), \
           title=None, xlabel='Pixel value', ylabel='Number of pixels', titwin=title)
    gg.save('%s-%02d-his.png' % (prefix, ntest))

    gg.show()

    print 'End of test for %s' % title    
Пример #2
0
def test03(ntest, prefix='fig-v01') :
    """Test for 2-d binning of the restricted rad-phi range of entire image
    """
    from time import time
    import algos.graph.GlobalGraphics as gg
    from PSCalib.GeometryAccess import img_from_pixel_arrays

    arr, geo = data_geo(ntest)

    iX, iY = geo.get_pixel_coord_indexes()
    X, Y, Z = geo.get_pixel_coords()
    mask = geo.get_pixel_mask(mbits=0377).flatten() 

    t0_sec = time()

    #hp = HPolar(X, Y, mask, nradbins=5, nphibins=8, phiedges=(-20, 240), radedges=(10000,80000))
    hp = HPolar(X, Y, mask, nradbins=3, nphibins=8, phiedges=(240, -20), radedges=(80000,10000)) # v3

    print 'HPolar initialization time %.3f sec' % (time()-t0_sec)

    #print 'bin_number_of_pixels:',   hp.bin_number_of_pixels()
    #print 'bin_intensity:', hp.bin_intensity(arr)
    #print 'bin_avrg:',   hp.bin_avrg(arr)

    t0_sec = time()
    nda, title = arr, None
    if   ntest == 41 : nda, title = arr,                   'averaged data'
    elif ntest == 44 : nda, title = hp.pixel_irad() + 2,   'pixel radial bin index' 
    elif ntest == 45 : nda, title = hp.pixel_iphi() + 2,   'pixel phi bin index'
    elif ntest == 46 : nda, title = hp.pixel_iseq() + 2,   'pixel sequential (rad and phi) bin index'
    #elif ntest == 47 : nda, title = mask,                  'mask'
    elif ntest == 48 : nda, title = hp.pixel_avrg(nda),    'averaged radial intensity'
    elif ntest == 49 : nda, title = hp.pixel_avrg_interpol(nda), 'averaged radial interpolated intensity'
    elif ntest == 50 : nda, title = hp.bin_avrg_rad_phi(nda),'r-phi'
    else :
        print 'Test %d is not implemented' % ntest 
        return

    print 'Get %s n-d array time %.3f sec' % (title, time()-t0_sec)

    img = img_from_pixel_arrays(iX, iY, nda) if not ntest in (50,) else nda # [100:300,:]

    colmap = 'jet' # 'cubehelix' 'cool' 'summer' 'jet' 'winter' 'gray'

    da = (nda.min()-1, nda.max()+1)
    ds = da

    if ntest in (41,48,49,50) :
        ave, rms = nda.mean(), nda.std()
        da = ds = (ave-2*rms, ave+3*rms)

    gg.plotImageLarge(img, amp_range=da, figsize=(14,12), title=title, cmap=colmap)
    gg.save('%s-%02d-img.png' % (prefix, ntest))

    gg.hist1d(nda, bins=None, amp_range=ds, weights=None, color=None, show_stat=True, log=False, \
           figsize=(6,5), axwin=(0.18, 0.12, 0.78, 0.80), \
           title=None, xlabel='Pixel value', ylabel='Number of pixels', titwin=title)
    gg.save('%s-%02d-his.png' % (prefix, ntest))

    gg.show()

    print 'End of test for %s' % title    
Пример #3
0
def test03(ntest, prefix='fig-v01'):
    """Test for 2-d binning of the restricted rad-phi range of entire image
    """
    from time import time
    import algos.graph.GlobalGraphics as gg
    from PSCalib.GeometryAccess import img_from_pixel_arrays

    arr, geo = data_geo(ntest)

    iX, iY = geo.get_pixel_coord_indexes()
    X, Y, Z = geo.get_pixel_coords()
    mask = geo.get_pixel_mask(mbits=0377).flatten()

    t0_sec = time()

    #hp = HPolar(X, Y, mask, nradbins=5, nphibins=8, phiedges=(-20, 240), radedges=(10000,80000))
    hp = HPolar(X,
                Y,
                mask,
                nradbins=3,
                nphibins=8,
                phiedges=(240, -20),
                radedges=(80000, 10000))  # v3

    print 'HPolar initialization time %.3f sec' % (time() - t0_sec)

    #print 'bin_number_of_pixels:',   hp.bin_number_of_pixels()
    #print 'bin_intensity:', hp.bin_intensity(arr)
    #print 'bin_avrg:',   hp.bin_avrg(arr)

    t0_sec = time()
    nda, title = arr, None
    if ntest == 41: nda, title = arr, 'averaged data'
    elif ntest == 44:
        nda, title = hp.pixel_irad() + 2, 'pixel radial bin index'
    elif ntest == 45:
        nda, title = hp.pixel_iphi() + 2, 'pixel phi bin index'
    elif ntest == 46:
        nda, title = hp.pixel_iseq(
        ) + 2, 'pixel sequential (rad and phi) bin index'
        #elif ntest == 47 : nda, title = mask,                  'mask'
    elif ntest == 48:
        nda, title = hp.pixel_avrg(nda), 'averaged radial intensity'
    elif ntest == 49:
        nda, title = hp.pixel_avrg_interpol(
            nda), 'averaged radial interpolated intensity'
    elif ntest == 50:
        nda, title = hp.bin_avrg_rad_phi(nda), 'r-phi'
    else:
        print 'Test %d is not implemented' % ntest
        return

    print 'Get %s n-d array time %.3f sec' % (title, time() - t0_sec)

    img = img_from_pixel_arrays(
        iX, iY, nda) if not ntest in (50, ) else nda  # [100:300,:]

    colmap = 'jet'  # 'cubehelix' 'cool' 'summer' 'jet' 'winter' 'gray'

    da = (nda.min() - 1, nda.max() + 1)
    ds = da

    if ntest in (41, 48, 49, 50):
        ave, rms = nda.mean(), nda.std()
        da = ds = (ave - 2 * rms, ave + 3 * rms)

    gg.plotImageLarge(img,
                      amp_range=da,
                      figsize=(14, 12),
                      title=title,
                      cmap=colmap)
    gg.save('%s-%02d-img.png' % (prefix, ntest))

    gg.hist1d(nda, bins=None, amp_range=ds, weights=None, color=None, show_stat=True, log=False, \
           figsize=(6,5), axwin=(0.18, 0.12, 0.78, 0.80), \
           title=None, xlabel='Pixel value', ylabel='Number of pixels', titwin=title)
    gg.save('%s-%02d-his.png' % (prefix, ntest))

    gg.show()

    print 'End of test for %s' % title
Пример #4
0
def test01(ntest, prefix='fig-v01'):
    """Test for radial 1-d binning of entire image.
    """
    from time import time
    import algos.graph.GlobalGraphics as gg
    from PSCalib.GeometryAccess import img_from_pixel_arrays

    arr, geo = data_geo(ntest)

    t0_sec = time()
    iX, iY = geo.get_pixel_coord_indexes()
    X, Y, Z = geo.get_pixel_coords()
    mask = geo.get_pixel_mask(mbits=0377).flatten()
    print 'Time to retrieve geometry %.3f sec' % (time() - t0_sec)

    t0_sec = time()
    hp = HPolar(X, Y, mask, nradbins=500, nphibins=1)  # v1
    print 'HPolar initialization time %.3f sec' % (time() - t0_sec)

    t0_sec = time()
    nda, title = arr, None
    if ntest == 1: nda, title = arr, 'averaged data'
    elif ntest == 2: nda, title = hp.pixel_rad(), 'pixel radius value'
    elif ntest == 3: nda, title = hp.pixel_phi(), 'pixel phi value'
    elif ntest == 4: nda, title = hp.pixel_irad() + 2, 'pixel radial bin index'
    elif ntest == 5: nda, title = hp.pixel_iphi() + 2, 'pixel phi bin index'
    elif ntest == 6:
        nda, title = hp.pixel_iseq(
        ) + 2, 'pixel sequential (rad and phi) bin index'
    elif ntest == 7:
        nda, title = mask, 'mask'
    elif ntest == 8:
        nda, title = hp.pixel_avrg(nda), 'averaged radial intensity'
    elif ntest == 9:
        nda, title = hp.pixel_avrg_interpol(
            arr) * mask, 'interpolated radial intensity'
    else:
        print 'Test %d is not implemented' % ntest
        return

    print 'Get %s n-d array time %.3f sec' % (title, time() - t0_sec)

    img = img_from_pixel_arrays(
        iX, iY, nda) if not ntest in (21, ) else nda[100:300, :]

    da, ds = None, None
    colmap = 'jet'  # 'cubehelix' 'cool' 'summer' 'jet' 'winter'
    if ntest in (2, 3, 4, 5, 6, 7):
        da = ds = (nda.min() - 1., nda.max() + 1.)

    else:
        ave, rms = nda.mean(), nda.std()
        da = ds = (ave - 2 * rms, ave + 3 * rms)

    gg.plotImageLarge(img,
                      amp_range=da,
                      figsize=(14, 12),
                      title=title,
                      cmap=colmap)
    gg.save('%s-%02d-img.png' % (prefix, ntest))

    gg.hist1d(nda, bins=None, amp_range=ds, weights=None, color=None, show_stat=True, log=False, \
           figsize=(6,5), axwin=(0.18, 0.12, 0.78, 0.80), \
           title=None, xlabel='Pixel value', ylabel='Number of pixels', titwin=title)
    gg.save('%s-%02d-his.png' % (prefix, ntest))

    gg.show()

    print 'End of test for %s' % title
Пример #5
0
def test02(ntest, prefix='fig-v01') :
    """Test for 2-d (default) binning of the rad-phi range of entire image
    """
    #from Detector.GlobalUtils import print_ndarr
    from time import time
    import algos.graph.GlobalGraphics as gg
    from PSCalib.GeometryAccess import img_from_pixel_arrays

    arr, geo = data_geo(ntest)

    iX, iY = geo.get_pixel_coord_indexes()
    X, Y, Z = geo.get_pixel_coords()
    mask = geo.get_pixel_mask(mbits=0377).flatten() 

    t0_sec = time()
    rb = RadialBkgd(X, Y, mask) # v0
    #rb = RadialBkgd(X, Y, mask, nradbins=500) # , nphibins=8, phiedges=(-20, 240), radedges=(10000,80000))
    print 'RadialBkgd initialization time %.3f sec' % (time()-t0_sec)

    #print 'npixels_per_bin:',   rb.npixels_per_bin()
    #print 'intensity_per_bin:', rb.intensity_per_bin(arr)
    #print 'average_per_bin:',   rb.average_per_bin(arr)

    t0_sec = time()
    nda, title = arr, None
    if   ntest == 21 : nda, title = arr,                   'averaged data'
    elif ntest == 22 : nda, title = rb.pixel_rad(),        'pixel radius value'
    elif ntest == 23 : nda, title = rb.pixel_phi(),        'pixel phi value'
    elif ntest == 24 : nda, title = rb.pixel_irad() + 2,   'pixel radial bin index' 
    elif ntest == 25 : nda, title = rb.pixel_iphi() + 2,   'pixel phi bin index'
    elif ntest == 26 : nda, title = rb.pixel_iseq() + 2,   'pixel sequential (rad and phi) bin index'
    elif ntest == 27 : nda, title = mask,                  'mask'
    elif ntest == 28 : nda, title = rb.pixel_avrg(nda),      'averaged radial background'
    elif ntest == 29 : nda, title = rb.subtract_bkgd(nda) * mask, 'background-subtracted data'
    elif ntest == 30 : nda, title = rb.bin_avrg_rad_phi(nda),'r-phi'
    elif ntest == 31 : nda, title = rb.pixel_avrg_interpol(nda), 'averaged radial interpolated background'
    elif ntest == 32 : nda, title = rb.subtract_bkgd_interpol(nda, method='linear', verb=True) * mask, 'interpol-background-subtracted data'
    else :
        print 'Test %d is not implemented' % ntest 
        return

    print 'Get %s n-d array time %.3f sec' % (title, time()-t0_sec)

    img = img_from_pixel_arrays(iX, iY, nda) if not ntest in (30,) else nda # [100:300,:]

    colmap = 'jet' # 'cubehelix' 'cool' 'summer' 'jet' 'winter' 'gray'

    da = (nda.min()-1, nda.max()+1)
    ds = da

    if ntest in (21,28,29,30,31) :
        ave, rms = nda.mean(), nda.std()
        da = ds = (ave-2*rms, ave+3*rms)

    elif ntest in (32,) : 
        colmap = 'gray'
        ds = da = (-20, 20)

    gg.plotImageLarge(img, amp_range=da, figsize=(14,12), title=title, cmap=colmap)
    gg.save('%s-%02d-img.png' % (prefix, ntest))

    gg.hist1d(nda, bins=None, amp_range=ds, weights=None, color=None, show_stat=True, log=False, \
           figsize=(6,5), axwin=(0.18, 0.12, 0.78, 0.80), \
           title=None, xlabel='Pixel value', ylabel='Number of pixels', titwin=title)
    gg.save('%s-%02d-his.png' % (prefix, ntest))

    gg.show()

    print 'End of test for %s' % title    
Пример #6
0
def make_index_table(prefix='./v01-') :

    from algos.core.GlobalUtils import str_tstamp
    fname = '%s**t-cxif5315-r0169-%s.txt' % (prefix, str_tstamp())
    fout = open(fname,'w')
    fout.write('# file name: %s\n' % fname)

    #------------------------------
    # Photon energy
    Egamma_eV  = 6003.1936                               # eV SIOC:SYS0:ML00:AO541
    wavelen_nm = wavelength_nm_from_energy_ev(Egamma_eV) # nm
    evald_rad  = wave_vector_value(Egamma_eV)            # 1/A
    #-------
    sigma_ql   = 0.002 * evald_rad
    sigma_qt   = 0.002 * evald_rad
    #-------
    rec  = '\n# photon energy = %.4f eV' % (Egamma_eV)\
         + '\n# wavelength = %.4f A' % (wavelen_nm*10)\
         + '\n# wave number/Evald radius k = 1/lambda = %.6f 1/A' % (evald_rad)\
         + '\n# sigma_ql = %.6f 1/A (approximately = k * <pixel size>/' % (sigma_ql)\
         + '\n# sigma_qt = %.6f 1/A (approximately = k * <pixel size>/' % (sigma_qt)\
         + '<sample-to-detector distance> = k*100um/100mm)'\
         + '\n# 3*sigma_ql = %.6f 1/A\n' % (3*sigma_ql)\
         + '\n# 3*sigma_qt = %.6f 1/A\n' % (3*sigma_qt)
    print rec
    fout.write(rec)

    #------------------------------
    # Lattice parameters
    # from previous analysis note:
    #a, b, c = 18.36, 26.65, 4.81        # Angstrom
    #alpha, beta, gamma = 90, 90, 77.17  # 180 - 102.83 degree
    a= 18.55 # Angstrom
    b, c = 1.466*a, 0.262*a              # Angstrom
    alpha, beta, gamma = 90, 90, 78.47   # 180 - 101.53 degree
    hmax, kmax, lmax = 4, 6, 0           # size of lattice to consider

    a1, a2, a3 = triclinic_primitive_vectors(a, b, c, alpha, beta, gamma)
    b1, b2, b3 = reciprocal_from_bravias(a1, a2, a3)

    msg1 = '\n# Triclinic crystal cell parameters:'\
         + '\n#   a = %.2f A\n#   b = %.2f A\n#   c = %.2f A' % (a, b, c)\
         + '\n#   alpha = %.2f deg\n#   beta  = %.2f deg\n#   gamma = %.2f deg' % (alpha, beta, gamma)

    msg2 = '\n# 3-d space primitive vectors:\n#   a1 = %s\n#   a2 = %s\n#   a3 = %s' %\
           (str(a1), str(a2), str(a3))

    msg3 = '\n# reciprocal space primitive vectors:\n#   b1 = %s\n#   b2 = %s\n#   b3 = %s' %\
           (str(b1), str(b2), str(b3))

    rec = '%s\n%s\n%s\n' % (msg1, msg2, msg3)
    print rec
    fout.write(rec)

    fout.write('\n# %s\n\n' % (89*'_'))

    #for line in triclinic_primitive_vectors.__doc__.split('\n') : fout.write('\n# %s' % line)

    test_lattice       (b1, b2, b3, hmax, kmax, lmax, cdtype=np.float32)
    lattice_node_radius(b1, b2, b3, hmax, kmax, lmax, cdtype=np.float32)
    lattice_node_radius(b1, b2, b3, hmax, kmax, 1,    cdtype=np.float32)

    #------------------------------
    #return

    #------------------------------
    # binning for look-up table and plots

    # bin parameters for q in units of k = Evald's sphere radius [1/A]
    bpq = BinPars((-0.25, 0.25), 1000, vtype=np.float32, endpoint=False)

    # bin parameters for omega [degree] - fiber rotation angle around axis
    bpomega = BinPars((0.,  180.), 360, vtype=np.float32, endpoint=False)
    
    # bin parameters for beta [degree] - fiber axis tilt angle
    #bpbeta = BinPars((15.,  195.),  2, vtype=np.float32, endpoint=True)
    #bpbeta = BinPars((15.,   15.),  1, vtype=np.float32, endpoint=False)
    #bpbeta = BinPars((5.,    25.),  2, vtype=np.float32, endpoint=True)
    bpbeta  = BinPars((0.,    50.), 11, vtype=np.float32, endpoint=True)
    bpbeta2 = BinPars((180., 230.), 11, vtype=np.float32, endpoint=True)
    str_beta = 'for-beta:%s' % (bpbeta.strrange)
     
    print '\n%s\nIndexing lookup table\n' % (91*'_')
    lut  = make_lookup_table(b1, b2, b3, hmax, kmax, lmax, np.float32, evald_rad, sigma_ql, sigma_qt, fout, bpq, bpomega, bpbeta)
    lut2 = make_lookup_table(b1, b2, b3, hmax, kmax, lmax, np.float32, evald_rad, sigma_ql, sigma_qt, fout, bpq, bpomega, bpbeta2)

    fout.close()
    print '\nIndexing lookup table is saved in the file: %s' % fname

    #------------------------------
    # produce and save plots
    import algos.graph.GlobalGraphics as gg

    img = lut # or lut2
    img = lut + lut2

    img_range = (bpq.vmin, bpq.vmax, bpomega.vmax, bpomega.vmin) 
    axim = gg.plotImageLarge(lut, img_range=img_range, amp_range=None, figsize=(15,13),\
                      title='Non-symmetrized for beta', origin='upper', window=(0.05,  0.06, 0.94, 0.94))
    axim.set_xlabel('$q_{H}$ ($1/\AA$)', fontsize=18)
    axim.set_ylabel('$\omega$ (degree)', fontsize=18)
    gg.save('%splot-img-prob-omega-vs-qh-%s.png' % (prefix, str_beta), pbits=1)

    axim = gg.plotImageLarge(img, img_range=img_range, amp_range=None, figsize=(15,13),\
                      title='Symmetrized for beta (beta, beta+pi)', origin='upper', window=(0.05,  0.06, 0.94, 0.94))
    axim.set_xlabel('$q_{H}$ ($1/\AA$)', fontsize=18)
    axim.set_ylabel('$\omega$ (degree)', fontsize=18)
    gg.save('%splot-img-prob-omega-vs-qh-sym-%s.png' % (prefix, str_beta), pbits=1)

    arrhi = np.sum(img,0)    
    fighi, axhi, hi = gg.hist1d(bpq.binedges, bins=bpq.nbins-1, amp_range=(bpq.vmin, bpq.vmax), weights=arrhi,\
                                color='b', show_stat=True, log=False,\
                                figsize=(15,5), axwin=(0.05, 0.12, 0.85, 0.80),\
                                title=None, xlabel='$q_{H}$ ($1/\AA$)', ylabel='Intensity', titwin=None)
    gg.show()

    gg.save_fig(fighi, '%splot-his-prob-vs-qh-%s.png' % (prefix, str_beta), pbits=1)

    qh_weight = zip(bpq.bincenters, arrhi)
    fname = '%sarr-qh-weight-%s.npy' % (prefix, str_beta)
    print 'Save qh:weigt array in file %s' % fname
    np.save(fname, qh_weight)
Пример #7
0
def make_index_table(prefix='./v01-'):

    from algos.core.GlobalUtils import str_tstamp
    fname = '%s**t-cxif5315-r0169-%s.txt' % (prefix, str_tstamp())
    fout = open(fname, 'w')
    fout.write('# file name: %s\n' % fname)

    #------------------------------
    # Photon energy
    Egamma_eV = 6003.1936  # eV SIOC:SYS0:ML00:AO541
    wavelen_nm = wavelength_nm_from_energy_ev(Egamma_eV)  # nm
    evald_rad = wave_vector_value(Egamma_eV)  # 1/A
    #-------
    sigma_ql = 0.002 * evald_rad
    sigma_qt = 0.002 * evald_rad
    #-------
    rec  = '\n# photon energy = %.4f eV' % (Egamma_eV)\
         + '\n# wavelength = %.4f A' % (wavelen_nm*10)\
         + '\n# wave number/Evald radius k = 1/lambda = %.6f 1/A' % (evald_rad)\
         + '\n# sigma_ql = %.6f 1/A (approximately = k * <pixel size>/' % (sigma_ql)\
         + '\n# sigma_qt = %.6f 1/A (approximately = k * <pixel size>/' % (sigma_qt)\
         + '<sample-to-detector distance> = k*100um/100mm)'\
         + '\n# 3*sigma_ql = %.6f 1/A\n' % (3*sigma_ql)\
         + '\n# 3*sigma_qt = %.6f 1/A\n' % (3*sigma_qt)
    print rec
    fout.write(rec)

    #------------------------------
    # Lattice parameters
    # from previous analysis note:
    #a, b, c = 18.36, 26.65, 4.81        # Angstrom
    #alpha, beta, gamma = 90, 90, 77.17  # 180 - 102.83 degree
    a = 18.55  # Angstrom
    b, c = 1.466 * a, 0.262 * a  # Angstrom
    alpha, beta, gamma = 90, 90, 78.47  # 180 - 101.53 degree
    hmax, kmax, lmax = 4, 6, 0  # size of lattice to consider

    a1, a2, a3 = triclinic_primitive_vectors(a, b, c, alpha, beta, gamma)
    b1, b2, b3 = reciprocal_from_bravias(a1, a2, a3)

    msg1 = '\n# Triclinic crystal cell parameters:'\
         + '\n#   a = %.2f A\n#   b = %.2f A\n#   c = %.2f A' % (a, b, c)\
         + '\n#   alpha = %.2f deg\n#   beta  = %.2f deg\n#   gamma = %.2f deg' % (alpha, beta, gamma)

    msg2 = '\n# 3-d space primitive vectors:\n#   a1 = %s\n#   a2 = %s\n#   a3 = %s' %\
           (str(a1), str(a2), str(a3))

    msg3 = '\n# reciprocal space primitive vectors:\n#   b1 = %s\n#   b2 = %s\n#   b3 = %s' %\
           (str(b1), str(b2), str(b3))

    rec = '%s\n%s\n%s\n' % (msg1, msg2, msg3)
    print rec
    fout.write(rec)

    fout.write('\n# %s\n\n' % (89 * '_'))

    #for line in triclinic_primitive_vectors.__doc__.split('\n') : fout.write('\n# %s' % line)

    test_lattice(b1, b2, b3, hmax, kmax, lmax, cdtype=np.float32)
    lattice_node_radius(b1, b2, b3, hmax, kmax, lmax, cdtype=np.float32)
    lattice_node_radius(b1, b2, b3, hmax, kmax, 1, cdtype=np.float32)

    #------------------------------
    #return

    #------------------------------
    # binning for look-up table and plots

    # bin parameters for q in units of k = Evald's sphere radius [1/A]
    bpq = BinPars((-0.25, 0.25), 1000, vtype=np.float32, endpoint=False)

    # bin parameters for omega [degree] - fiber rotation angle around axis
    bpomega = BinPars((0., 180.), 360, vtype=np.float32, endpoint=False)

    # bin parameters for beta [degree] - fiber axis tilt angle
    #bpbeta = BinPars((15.,  195.),  2, vtype=np.float32, endpoint=True)
    #bpbeta = BinPars((15.,   15.),  1, vtype=np.float32, endpoint=False)
    #bpbeta = BinPars((5.,    25.),  2, vtype=np.float32, endpoint=True)
    bpbeta = BinPars((0., 50.), 11, vtype=np.float32, endpoint=True)
    bpbeta2 = BinPars((180., 230.), 11, vtype=np.float32, endpoint=True)
    str_beta = 'for-beta:%s' % (bpbeta.strrange)

    print '\n%s\nIndexing lookup table\n' % (91 * '_')
    lut = make_lookup_table(b1, b2, b3, hmax, kmax, lmax, np.float32,
                            evald_rad, sigma_ql, sigma_qt, fout, bpq, bpomega,
                            bpbeta)
    lut2 = make_lookup_table(b1, b2, b3, hmax, kmax, lmax, np.float32,
                             evald_rad, sigma_ql, sigma_qt, fout, bpq, bpomega,
                             bpbeta2)

    fout.close()
    print '\nIndexing lookup table is saved in the file: %s' % fname

    #------------------------------
    # produce and save plots
    import algos.graph.GlobalGraphics as gg

    img = lut  # or lut2
    img = lut + lut2

    img_range = (bpq.vmin, bpq.vmax, bpomega.vmax, bpomega.vmin)
    axim = gg.plotImageLarge(lut, img_range=img_range, amp_range=None, figsize=(15,13),\
                      title='Non-symmetrized for beta', origin='upper', window=(0.05,  0.06, 0.94, 0.94))
    axim.set_xlabel('$q_{H}$ ($1/\AA$)', fontsize=18)
    axim.set_ylabel('$\omega$ (degree)', fontsize=18)
    gg.save('%splot-img-prob-omega-vs-qh-%s.png' % (prefix, str_beta), pbits=1)

    axim = gg.plotImageLarge(img, img_range=img_range, amp_range=None, figsize=(15,13),\
                      title='Symmetrized for beta (beta, beta+pi)', origin='upper', window=(0.05,  0.06, 0.94, 0.94))
    axim.set_xlabel('$q_{H}$ ($1/\AA$)', fontsize=18)
    axim.set_ylabel('$\omega$ (degree)', fontsize=18)
    gg.save('%splot-img-prob-omega-vs-qh-sym-%s.png' % (prefix, str_beta),
            pbits=1)

    arrhi = np.sum(img, 0)
    fighi, axhi, hi = gg.hist1d(bpq.binedges, bins=bpq.nbins-1, amp_range=(bpq.vmin, bpq.vmax), weights=arrhi,\
                                color='b', show_stat=True, log=False,\
                                figsize=(15,5), axwin=(0.05, 0.12, 0.85, 0.80),\
                                title=None, xlabel='$q_{H}$ ($1/\AA$)', ylabel='Intensity', titwin=None)
    gg.show()

    gg.save_fig(fighi,
                '%splot-his-prob-vs-qh-%s.png' % (prefix, str_beta),
                pbits=1)

    qh_weight = zip(bpq.bincenters, arrhi)
    fname = '%sarr-qh-weight-%s.npy' % (prefix, str_beta)
    print 'Save qh:weigt array in file %s' % fname
    np.save(fname, qh_weight)