ó
(™xTc           @   sà   d  d l  m Z d  d l m Z d  d l m Z d  d l Z d  d l Z d  d l Z d Z	 e j
 j d d ƒ Z d „  Z d	 „  Z d
 „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z e d k rÜ e d ƒ n  d S(   iÿÿÿÿ(   t   division(   t	   join_open(   t   write_this_is_auto_generatedNs0   cctbx.source_generators.eltbx.generate_henke_cppt   cctbxs   reference/henke/tablesc         C   s   t  |  t ƒ |  d IJd  S(   NsV   #include <cctbx/eltbx/henke.h>

namespace cctbx { namespace eltbx { namespace henke {
(   R   t   this(   t   f(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   print_header   s    c         C   s   |  d IJd  S(   Ns�  /*
  Henke Tables

  The original data can be found at:
    ftp://grace.lbl.gov/pub/sf/

  From ftp://grace.lbl.gov/pub/sf/read.me:

                Low-Energy X-ray Interaction Coefficients:
                Photoabsorption, Scattering, and Reflection
                        E = 30-30,000 eV, Z = 1-92

                B. L. Henke, E. M. Gullikson, and J. C. Davis
                        Center for X-Ray Optics, 2-400
                        Lawrence Berkeley Laboratory
                        Berkeley, California 94720

  Reference: B. L. Henke, E. M. Gullikson, and J. C. Davis,
  Atomic Data and Nuclear Data Tables Vol. 54 No. 2 (July 1993).
 */
(    (   R   (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   print_ftp_info   s    c    
      C   s¸  g  }  xI t  j t ƒ D]8 } | j ƒ  j ƒ  } | d d k r |  j | ƒ q q Wd g d } x|  D] } t t | d ƒ } | j ƒ  } | j ƒ  } | j	 ƒ  | d d !j
 ƒ  } t | d d	 !ƒ } t | ƒ d k sÞ t ‚ | d t j k s÷ t ‚ | d
 t j k st ‚ | d k r.| t | ƒ k  s4t ‚ | | d k sJt ‚ | j ƒ  } | | f | | <qf W| d j d ƒ d } | | }	 |	 d g t |	 ƒ k sªt ‚ | |  } | S(   Niüÿÿÿs   .nffi    ix   t   ri   i   i   i	   iÿÿÿÿ(   t   ost   listdirt   reference_tables_directoryt   lowert
   capitalizet   appendR   t   readlinet	   readlinest   closet   stript   intt   lent   AssertionErrort   stringt	   lowercaset   index(
   t	   nff_filest   filet   fnt   tablesR   t   headert   tablet   Symbolt   Zt   rest(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   collect_tables-   s2     
$

i    c   	      C   s8  |  d IJ|  J|  d IJ|  J| r/ |  d IJn  xÓ t  | | ƒ D]Â } | | } |  d | d j ƒ  d t | ƒ d IJxm | d D]a } | j ƒ  } t | ƒ d	 k s® t ‚ | rÑ | d d
 k rÑ d | d <n  |  d t | ƒ IJq„ W|  d IJ|  d IJ|  Jq? W| r|  d IJ|  Jn  |  d IJ|  J|  d IJd  S(   Ns   namespace table_data {s   using anomalous::e_fp_fdp;s   #define NOVAL fp_fdp_undefineds	   e_fp_fdp i    s   [] = { /* Z = s    */i   i   s   -9999.00t   NOVALs   {%s, %s, %s},s	   {0, 0, 0}s   };s   #undef NOVALs   } // namespace table_datas$   }}} // namespace cctbx::eltbx::henke(   t   xrangeR   t   strt   splitR   R   t   tuple(	   R   R   t   Z_begint   Z_endt   define_novalR    t   tabt   linet   flds(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   print_table_blockG   s2    

 
& 



c         C   sØ   |  d IJ|  J|  d IJ|  Jx. | d D]" } |  d | d j  ƒ  d IJq' W|  J|  d IJd } xR | d D]F } | d 7} |  d | d d	 t | ƒ d
 | d j  ƒ  d IJql W|  d IJ|  d IJ|  d IJd  S(   Ns   namespace table_data {s   using anomalous::e_fp_fdp;i   s   extern e_fp_fdp i    s   [];s2   static const anomalous::label_z_e_fp_fdp all[] = {s   {"s   ", s   , s   },s	   {0, 0, 0}s   };s<  
  } // namespace table_data

  table::table(
    std::string const& label,
    bool exact,
    bool exception_if_no_match)
  {
    std::string work_label = basic::strip_label(label, exact);
    label_z_e_fp_fdp_ = anomalous::find_entry(
      table_data::all, work_label, exact, exception_if_no_match);
  }

  fp_fdp
  table::at_ev(double energy) const
  {
    fp_fdp raw = anomalous::interpolate(label_z_e_fp_fdp_, energy);
    if (!raw.is_valid_fp()) return raw;
    // subtract the number of electrons
    return fp_fdp(raw.fp() - label_z_e_fp_fdp_->z, raw.fdp());
  }

  table_iterator::table_iterator()
  :
    current_("H", true)
  {}

  table
  table_iterator::next()
  {
    table result = current_;
    if (current_.is_valid()) current_.label_z_e_fp_fdp_++;
    return result;
  }

}}} // namespace cctbx::eltbx::henke(   R   R%   (   R   R   R+   t   i(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   print_henke_cppa   s"    

 

6

#c         C   s2   g  } x% |  D] } | j  | j ƒ  d ƒ q W| S(   Ni    (   R   R&   (   t   linest   pointsR,   (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   collect_points–   s    c         C   s6   g  } x) |  d D] } | j  t | d ƒ ƒ q W| S(   Ni   (   R   R3   (   R   t
   tab_pointsR+   (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   collect_tab_pointsœ   s    c         C   sƒ   t  |  ƒ } xp t t | ƒ d ƒ D]X } xO t | d t | ƒ ƒ D]4 } | | | | k rC d | d | d f GHqC qC Wq# Wd  S(   Ni   s   points %d==%d(   R5   R$   R   (   R   R4   R/   t   j(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   compare_points¢   s
     c         C   sÝ   t  ƒ  } t | ƒ t |  d d ƒ } t | ƒ t | ƒ t | | ƒ | j ƒ  d } x€ t d t | ƒ | ƒ D]f } t	 t | ƒ | | ƒ } t |  d | | d f d ƒ } t | ƒ t
 | | | | ƒ | j ƒ  qo Wd  S(   Ns	   henke.cppt   wi   i   s   henke_tables_%02d_%02d.cpp(   R"   R7   R   R   R   R0   R   R$   R   t   minR.   (   t
   target_dirR   R   t   Z_blockR(   R)   (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   run©   s    	




t   __main__t   .(   t
   __future__R    t   scitbx.source_generators.utilsR   R   t   libtbx.load_envt   libtbxR   R	   R   t   envt
   under_distR   R   R   R"   R.   R0   R3   R5   R7   R<   t   __name__(    (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/source_generators/eltbx/generate_henke_cpp.pyt   <module>   s&   					5				