B
    d!6                 @   s  d dl mZmZmZ d dlmZ d dlmZ d dlZd dlZd:ddZ	G dd de
Zd;d	d
Zd<ddZdd Zdd Zdd Zdd ZddddddZG dd de
Zyde  ZW n ek
r   dZY nX G d d! d!eZd"d# ZG d$d% d%eZead=d&d'ZG d(d) d)e
ZG d*d+ d+e
Zd,d- Zed.krd/d0 Z e dddd1ksZt!teksht!e"d2ed3d4 tek	st!e tkst!e #  d gd5 Z$e %  [$e j#d6d7 e #  e&e 'd8d kst!e"d9 dS )>    )absolute_importdivisionprint_function)Auto)
group_argsNc             C   s    t | d j}|jd |j S )N   )sys	_getframef_codeco_varnamesco_argcount)frames_backr
    r   s/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/libtbx/introspection.pyvarnames   s    r   c               @   s   e Zd ZdddZdd ZdS )caller_locationr   c             C   s$   t |d }|jj| _|j| _d S )Nr   )r   r	   r
   co_filename	file_namef_linenoline_number)selfr   fr   r   r   __init__   s    
zcaller_location.__init__c             C   s   d| j | jf S )Nz%s(%d))r   r   )r   r   r   r   __str__   s    zcaller_location.__str__N)r   )__name__
__module____qualname__r   r   r   r   r   r   r      s   
r   c             C   s    t t| d d tj  d S )Nr   )r   )printr   r   stdoutflush)r   r   r   r   check_point   s    r    F c             C   s   |d krt j}g }yVxP| d k	r(|| kr(P t |d }||d||jj|j|jjf   |d7 }qW W n tk
r|   Y nX |r|	  |dkr|S x|D ]}t
||d qW d S )Nr   zshow_stack(%d): %s(%d) %sZreturn_lines)file)r   r   r	   appendr
   r   r   co_name
ValueErrorreverser   )Zmax_frames_backr   r&   outprefixlinesr   liner   r   r   
show_stack   s&      
r+   c               C   s&   t j  tt jdd t j  d S )Nr   )r'   r   )r   
__stdout__r   r+   
__stderr__r   r   r   r   show_stack_true_stderr1   s    
r.   c             C   s6   |dkr2t j  td| jj| jf  t j  tS )Nr*   z%s(%d))	r   stderrr   r   r
   r   r   r   print_trace)frameeventargr   r   r   r0   6   s
    

r0   c              C   sn   dt jkr`ddlm}  |  }t|d x8|  D ](}|ddkr4|dr4t	d d S q4W t 
t d S )Npydocr   )	cStringIO)r'   zpydoc.pyz clizJlibtbx.introspection.start_print_trace(): pydoc.cli() detected: no tracing)r   modules	six.movesr5   r+   getvalue
splitlinesfindendswithr   settracer0   )StringIOsr*   r   r   r   start_print_trace=   s    

r?   c               C   s   t d  d S )N)r   r<   r   r   r   r   stop_print_traceI   s    r@   r               )ZKBZMBZGBZTBZPBc               @   s   e Zd Zdd ZdS )proc_file_readerc             C   s   | j d krd S y| j |}W n tk
r2   d S X | j |d  d d}t|dk rZd S t|d  }yt|d }W n tk
r   d S X |d|  S )NrB   rA   r   i   )	proc_statusindexr%   splitlenkb_exponentsgetupperint)r   Zvm_keyifldsexponentnumr   r   r   	get_bytesU   s    
zproc_file_reader.get_bytesN)r   r   r   rR   r   r   r   r   rE   S   s   rE   z/proc/%d/statusc               @   sp   e Zd ZdZdZdZdZdd Zdd Zdd Z	d	d
 Z
dd Zdd ZdddZdddZdd Zdd ZdS )virtual_memory_infoFr   c          	   C   sB   y"t t}| | _W d Q R X W n tk
r<   d | _Y nX d S )N)open_proc_statusreadrF   IOError)r   r   r   r   r   r   r   s
    
zvirtual_memory_info.__init__c             C   s*   |  d}|d k	r&dt_ttj|t_|S )NzVmPeak:T)rR   rS   have_vmpeakmaxmax_virtual_memory_size)r   resultr   r   r   virtual_memory_peak_sizey   s    
z,virtual_memory_info.virtual_memory_peak_sizec             C   s$   |  d}|d k	r ttj|t_|S )NzVmSize:)rR   rY   rS   rZ   )r   r[   r   r   r   virtual_memory_size   s
    
z'virtual_memory_info.virtual_memory_sizec             C   s$   |  d}|d k	r ttj|t_|S )NzVmRSS:)rR   rY   rS   max_resident_set_size)r   r[   r   r   r   resident_set_size   s
    
z%virtual_memory_info.resident_set_sizec             C   s$   |  d}|d k	r ttj|t_|S )NzVmStk:)rR   rY   rS   max_stack_size)r   r[   r   r   r   
stack_size   s
    
zvirtual_memory_info.stack_sizec             C   s.   | j d k	r*|   |   |   |   d S )N)rF   r\   r]   r_   ra   )r   r   r   r   
update_max   s
    
zvirtual_memory_info.update_maxNr!   c             C   sX  |d krt j}ddlm} ||  }||  }||  }dtt|t|t| }|d }	|d }
|d }|st	|	|| |d t	|
|| |d t	||| |d n| 
  t}||j}||j}||j}dtt|t|t| }|jrd}nd	}t	|	|| ||| |d t	|
|| d	|| |d t	||| d	|| |d d S )
Nr   )size_as_string_with_commasz%%%dszVirtual memory size:zResident set size:  zStack size:         )r"   z    exact max:z  approx. max:)r   r   libtbx.str_utilsrc   r]   r_   ra   rY   rI   r   r\   rS   rZ   r^   r`   rX   )r   r'   r(   show_maxrc   ZvmsZrssstsfmtZlvmsZlrssZlstsZvmiZmax_vmsZmax_rssZmax_stsZmax_fmtZvms_what_maxr   r   r   show   s4     


zvirtual_memory_info.showc             C   s   | j d k	r| j|||d d S )N)r'   r(   re   )rF   rh   )r   r'   r(   re   r   r   r   show_if_available   s    
z%virtual_memory_info.show_if_availablec             C   s   dS )N)zVirtual memoryzResident setZStackr   )r   r   r   r   current_max_sizes_legend   s    z,virtual_memory_info.current_max_sizes_legendc             C   s   t | j| j| jdS )N)virtual_memoryZresident_setstack)r   rZ   r^   r`   )r   r   r   r   current_max_sizes   s    z%virtual_memory_info.current_max_sizes)Nr!   F)Nr!   F)r   r   r   rX   rZ   r^   r`   r   r\   r]   r_   ra   rb   rh   ri   rj   rm   r   r   r   r   rS   k   s   

rS   c           	   C   s   d} t j| sd S ddlm} x|j| d djD ]}| }|dsLq4|	 }t
|dkrbq4yt|d }W n tk
r   w4Y nX |dkrq4t|d	  }|d krq4|d
|  S W d S )Nz/usr/sbin/system_profilerr   )easy_runz SPHardwareDataType)commandzMemory:rB   r   rA   i   )ospathisfilelibtbxrn   fully_bufferedstdout_linesstrip
startswithrH   rI   rM   r%   rJ   rK   rL   )cmdrn   r*   rO   rQ   rP   r   r   r   get_mac_os_x_memory_total   s.    
ry   c               @   s.   e Zd Zdd Zdd Zdd Zdd	d
ZdS )machine_memory_infoc          	   C   sj   d | _ t| _t| _tjdrXy"td}| | _ W d Q R X W qf t	k
rT   Y qfX nt
 | _d | _d S )Nz/proc/meminfo)rF   r   _memory_total_memory_freerp   rq   rr   rT   rV   rW   ry   )r   fhr   r   r   r      s    
zmachine_memory_info.__init__c             C   s"   | j }|tkr| d }| _ |S )Nz	MemTotal:)r{   r   rR   )r   r[   r   r   r   memory_total   s    z machine_memory_info.memory_totalc             C   s"   | j }|tkr| d }| _ |S )NzMemFree:)r|   r   rR   )r   r[   r   r   r   memory_free   s    zmachine_memory_info.memory_freeNr!   c             C   sx   |d krt j}ddlm} ||  }||  }dtt|t| }t|d || |d t|d || |d d S )Nr   )rc   z%%%dszMemory total: )r"   zMemory free:  )	r   r   rd   rc   r~   r   rY   rI   r   )r   r'   r(   rc   mtZmfrg   r   r   r   rh      s     zmachine_memory_info.show)Nr!   )r   r   r   r   r~   r   rh   r   r   r   r   rz      s   rz   c          
   C   s   t tkrd a ydd l}W n tk
r.   Y n(X y| }W n tk
rP   Y nX |a t d krydd lm  m} W n tk
r   Y nX |j	
 }|dkr|a t d kr6d}tj|r6d}t|Z}xR|  D ]B}|dsq|dd  dddd}|dsq|d	7 }qW W d Q R X |dkr6|a t d kr4d
}tj|r4dddg}d gt| }	ddlm}
 x|
j|d djD ]}| }xvt|D ]j\}}||ryt|t|d  }W n tk
r   wY nX |dkr|	| d kr||	|< qW qW x|	D ]}|d k	r|a P qW t d kr|tjd}|d k	r|yt|}W n tk
rv   Y nX |a t d krd}tj|rddlm}
 xh|
j|djD ]V}|dryt|dd	d }W n tk
r   wY nX |dkr|a P qW t d k	rt S | S )Nr   z/proc/cpuinfo	processor	    r!   	:r   z/usr/sbin/system_profilerzTotal Number Of Cores: zNumber Of CPUs: zNumber Of Processors: )rn   z SPHardwareDataType)ro   ZNUMBER_OF_PROCESSORSz
/sbin/hinvz Processors) _number_of_processorsr   multiprocessingImportError	cpu_countNotImplementedErrorboost_adaptbx.boost.pythonboostpythonextnumber_of_processorsrp   rq   rr   rT   rV   r9   rw   replacerI   rs   rn   rt   ru   rv   	enumeraterM   r%   environrK   r;   rH   )return_value_if_unknownr   nbpcpuinfor}   r*   rx   keysnsrn   rN   keyr   r   r   r     s    
      



  

  




  
  


r   c               @   s    e Zd ZdZdd Zdd ZdS )method_debug_loga  For Python 2.4 or greater.  Use an instance of this class as a
  decorator for class methods, and it will print the call signature and
  call location before the method is executed.

  Example:
  debug = libtbx.introspection.method_debug_log()
  class a(object):
    @debug
    def foo(self, x):
      print x

  def main():
    my_object = a()
    a.foo(1)
  main()

  Running this results in the following output when LIBTBX_DEBUG_LOG is set:
a.foo(1) @ test.py(13) main
1
  c             C   s    d| _ tjdd k	rd| _ d S )NFZLIBTBX_DEBUG_LOGT)debugrp   r   rK   )r   r   r   r   r   e  s    zmethod_debug_log.__init__c                s    fdd}|S )Nc       	         s   j rt|}t|}ddd |D }ddd | D }g }|dkrX|| |dkrj|| td}td| j	j
 j
d||jj|j|jjf  tj   | f||S )Nz, c             S   s   g | ]}t |qS r   )str).0r3   r   r   r   
<listcomp>o  s    zBmethod_debug_log.__call__.<locals>.log_wrapper.<locals>.<listcomp>c             S   s    g | ]\}}d |t |f qS )z%s=%s)r   )r   Zkwdvalr   r   r   r   p  s   r!   r   z%s.%s(%s) @ %s(%d) %s)r   listdictjoinitemsr#   r   r	   r   	__class__r   r
   r   r   r$   r   r   )	Oargskwds_argsZ_kwdsZstr_argsZstr_kwdsZcall_signatureZcaller)r   r   r   r   log_wrapperk  s"    
 
 


z.method_debug_log.__call__.<locals>.log_wrapperr   )r   r   r   r   )r   r   r   __call__j  s    zmethod_debug_log.__call__N)r   r   r   __doc__r   r   r   r   r   r   r   P  s   r   c               @   s4   e Zd ZdZeeedZdd Zdd Zdd Z	d	S )
current_process_statusaa  
  An interface to the *NIX utility 'ps' to get info on the current process
  (only tested on MacOS X till further notice, so beware dragons)

  SYNOPSIS:
    ps = current_process_status() # <1>
    .....
    print ps['RSS'] # resident size at the time of <1>
    .....
    ps.refresh() # <2>
    .....
    print ps['%CPU'] # % CPU at the time of <2>
  )ZRSSZVSZz%CPUc             C   s   t t | _|   d S )N)r   rp   getpididrefresh)r   r   r   r   r     s    zcurrent_process_status.__init__c                s   dd l }|jddg|j|jd}tdd t|j  D }|d }x*|jD ]}|   | | j	krPP qPW d S t fdd|
 D | _x*| j
 D ]\}}|| j| | j|< qW d S )	Nr   z/bin/psZcux)r   r/   r   c             S   s   g | ]\}}||fqS r   r   )r   rN   fieldr   r   r   r     s    z2current_process_status.refresh.<locals>.<listcomp>ZPIDc                s   g | ]\}}| | fqS r   r   )r   namei_col)r   r   r   r     s    )
subprocessPopenSTDOUTPIPEr   r   r   readlinerH   r   r   r   conversions)r   r   psZcolsZi_pidlir   convr   )r   r   r     s"    
 zcurrent_process_status.refreshc             C   s
   | j | S )N)r   )r   
field_namer   r   r   __getitem__  s    z"current_process_status.__getitem__N)
r   r   r   r   rM   floatr   r   r   r   r   r   r   r   r   ~  s   r   c             C   s.   ddl }tjd dkr || S || S dS )z*
  Wrapper for importing getfullargspec
  r   NrB   )inspectr   version_infogetfullargspec
getargspec)functionr   r   r   r   r     s    
r   __main__c             C   s
   d}t  S )Nr   )r   )abcdr   r   r   exercise_varnames  s    r   )r   r   r   znumber of processors:unknown)r   i@B T)re   introspectionOK)r   )r   )Nr   FNr!   )N)(
__future__r   r   r   rs   r   r   rp   r   r   objectr   r    r+   r.   r0   r?   r@   rJ   rE   r   rU   AttributeErrorrS   ry   rz   r   r   r   r   r   r   r   AssertionErrorr   rh   bufferrb   r   r:   r   r   r   r   <module>   sd   


    

\%
I..






