o
    Rŀg                     @   s&  d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
ZddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) 			d9dede*de*d e*d!e'f
d"d#Z+			d:d$d%d&e,d'e,d(e,d!e'f
d)d*Z-ej.ddfd+e/d,ee	e0df  d-ee	e0df  fd.d/Z1d0d1 Z2d2d3 Z3d4e,d!e,fd5d6Z4ddej.ddfd+e/d,ee	e0df  d-ee	e0df  fd7d8Z5dS );zDPICIO: read and write Protein Internal Coordinate (.pic) data files.    N)date)StringIO)Optional)TextIO)Union)SeqIO)protein_letters_1to3)	as_handle)dihedra_primary_defaults)dihedra_secondary_defaults)dihedra_secondary_xoxt_defaults)hedra_defaults)ic_data_backbone)ic_data_sidechainsAtomKey)Dihedron)Edron)Hedron)IC_Chain)
IC_Residue)_parse_pdb_header_list)PDBException)Residue)	Structure)StructureBuilderFfileverbosequickdefaultsreturnc                    s@  dt jv td}td}td}td}td}td}	td}
t }tg }g d	}|j|j|j|j	g}d
}d
}d
}d
d
}i i i 	i i i t
 g g dtdtffdddtt dtt dd
fdddtdtdtdtdtdtdt dtf 	fdddtdt dd
ffdddtdt dd
ffd d!
dtdtdtd"td#tdt dt
f 
fd$d%dtdt dd
ffd&d'dt dd
ffd(d)dtdt dd
ffd*d+ df	fd,d-}t| d.d/}| D ]}|d0rq|d1rM||}|rA|d2|d3< |d4|d5< |d6|d7< qrKtd8| d9| q|d:rr||}|rf|d; |d<< qrptd8| d=| q|d>r||}|r|d?}|d
u rd@}|dAt|dB|dC|g}||kr|d
dC |d
dC krÈ	i kr|  i i i 	i i i tdDD ]D}|| || kr
|| ||  || ||< |dEkr|| q|dAkrd
 |dB< |dC< q|dBkr
|j}t| |_q||dF|dGt|dH|dI |j}|jdE dJkr/qdB|  krM|j!" D ]}|jsE|} nq;#| n s`D ]}|j qW|gt | }|_|_$t|jdA |jdB dJkrd
n|jdB |j%f}j&#| D ]}|j'dEdC |kr||_(|j)*| qt
t+dKdL qrtd8| dM|  W d
   d
S |dNri||}|s||}|rg|d
u rrtd8| dO|  W d
   d
S |j,|dFks|jdA t|dHkr"rtd8| dP|j,t|jdQ|  W d
   d
S t-.t/|dRt/|dSt/|dTfdU}|0|dV |t/|dWt/|dX|dY|dVt|dZ|d[  g q|d\r|	|}|r|1 D ]}|d
ur|
|}t/|dB|dA< q{qt2j3|}|r|d
ur|d" d
u rň|d |d |d |d] |d^ |d_ |j q|d |d |d |d" |d` |j q|rtda| db|  W d
   d
S | rrtdc| dd|de  W d
   d
S qW d
   n	1 sw   Y  |  |4 S )gaD  Load Protein Internal Coordinate (.pic) data from file.

    PIC file format:
        - comment lines start with #
        - (optional) PDB HEADER record
           - idcode and deposition date recommended but optional
           - deposition date in PDB format or as changed by Biopython
        - (optional) PDB TITLE record
        - repeat:
           - Biopython Residue Full ID - sets residue IDs of returned structure
           - (optional) PDB N, CA, C ATOM records for chain start
           - (optional) PIC Hedra records for residue
           - (optional) PIC Dihedra records for residue
           - (optional) BFAC records listing AtomKeys and b-factors

    An improvement would define relative positions for HOH (water) entries.

    Defaults will be supplied for any value if defaults=True.  Default values
    are supplied in ic_data.py, but structures degrade quickly with any
    deviation from true coordinates.  Experiment with
    :data:`Bio.PDB.internal_coords.IC_Residue.pic_flags` options to
    :func:`write_PIC` to verify this.

    N.B. dihedron (i-1)C-N-CA-CB is ignored in assembly if O exists.

    C-beta is by default placed using O-C-CA-CB, but O is missing
    in some PDB file residues, which means the sidechain cannot be
    placed.  The alternate CB path (i-1)C-N-CA-CB is provided to
    circumvent this, but if this is needed then it must be adjusted in
    conjunction with PHI ((i-1)C-N-CA-C) as they overlap (see :meth:`.bond_set`
    and :meth:`.bond_rotate` to handle this automatically).

    :param Bio.File file: :func:`.as_handle` file name or handle
    :param bool verbose: complain when lines not as expected
    :param bool quick: don't check residues for all dihedra (no default values)
    :param bool defaults: create di/hedra as needed from reference database.
        Amide proton created if 'H' is in IC_Residue.accept_atoms
    :returns: Biopython Structure object, Residues with .internal_coord
        attributes but no coordinates except for chain start N, CA, C atoms if
        supplied, **OR** None on parse fail (silent unless verbose=True)

    Hzm^HEADER\s{4}(?P<cf>.{1,40})(?:\s+(?P<dd>\d\d\d\d-\d\d-\d\d|\d\d-\w\w\w-\d\d))?(?:\s+(?P<id>[0-9A-Z]{4}))?\s*$z^TITLE\s{5}(?P<ttl>.+)\s*$z^\('(?P<pid>[^\s]*)',\s(?P<mdl>\d+),\s'(?P<chn>\s|\w)',\s\('(?P<het>\s|[\w\s-]+)',\s(?P<pos>-?\d+),\s'(?P<icode>\s|\w)'\)\)\s+(?P<res>[\w]{1,3})(\s\[(?P<segid>[a-zA-z\s]+)\])?\s*$a*  ^ATOM\s\s(?:\s*(?P<ser>\d+))\s(?P<atm>[\w\s]{4})(?P<alc>\w|\s)(?P<res>[\w]{3})\s(?P<chn>.)(?P<pos>[\s\-\d]{4})(?P<icode>[A-Za-z\s])\s\s\s(?P<x>[\s\-\d\.]{8})(?P<y>[\s\-\d\.]{8})(?P<z>[\s\-\d\.]{8})(?P<occ>[\s\d\.]{6})(?P<tfac>[\s\d\.]{6})\s{6}(?P<segid>[a-zA-z\s]{4})(?P<elm>.{2})(?P<chg>.{2})?\s*$a-  ^ATOM\s\s(?:\s*(?P<ser>\d+))\s(?P<atm>[\w\s]{4})(?P<alc>\w|\s)(?P<res>[\w]{3})\s(?P<chn>.)(?P<pos>[\s\-\d]{4})(?P<icode>[A-Za-z\s])\s\s\s(?P<x>[\s\-\d\.]{10})(?P<y>[\s\-\d\.]{10})(?P<z>[\s\-\d\.]{10})(?P<occ>[\s\d\.]{7})(?P<tfac>[\s\d\.]{6})\s{6}(?P<segid>[a-zA-z\s]{4})(?P<elm>.{2})(?P<chg>.{2})?\s*$z|^BFAC:\s([^\s]+\s+[\-\d\.]+)\s*([^\s]+\s+[\-\d\.]+)?\s*([^\s]+\s+[\-\d\.]+)?\s*([^\s]+\s+[\-\d\.]+)?\s*([^\s]+\s+[\-\d\.]+)?z([^\s]+)\s+([\-\d\.]+))NNNNNakstrr    c                    s2   z |  W S  t y   t|  } | < | Y S w )zAMaintain dictionary of AtomKeys seen while reading this PIC file.)KeyErrorr   )r"   ak)akc A/var/www/html/myenv/lib/python3.10/site-packages/Bio/PDB/PICIO.pyakcache   s   
zread_PIC.<locals>.akcachepprprc                 S   sl   |D ]1}|j }| D ])}|j }|jd dkr ||jvr |j| |jd dkr2||jvr2|j| q	qdS )z5Set next and prev links between i-1 and i-2 residues.r    N)internal_coordidrnextappendrprev)r)   r*   p_rpricp_p_rppricr&   r&   r'   link_residues   s   

zread_PIC.<locals>.link_residuesa1a2a3l12angl23ricc                    s   | ||ft jjtj t fddtdD s#dS t|< t|< t|< t j	<  |j	< }|_
| S )z6Create Hedron on current (sbcic) Chain.internal_coord.c                 3   "    | ]}| j   v V  qd S Nakl.0iacceptatmNdxekr&   r'   	<genexpr>        z3read_PIC.<locals>.process_hedron.<locals>.<genexpr>   N)r   fieldsatmr   accept_atomsallrangefloatr   hedracic)r6   r7   r8   r9   r:   r;   r<   h)ak_addr(   hahl12hl23sbcicrD   r'   process_hedron   s   

z read_PIC.<locals>.process_hedronrG   c           	         s  g d}t jj t jjt jj}fddtdD t fddtdD }d  }d | d | ksM|dksM|tv sM|d	vr|t| v r} fd
dtdD }zt	d
| d }W np ty   d | d | kr fddtdD }d
|d d    }n fddtddD }dd    d
| }t	| d }Y n w ddd } fddtdddD }t	d
| d }t|d t|d t|d |d |d |d | rtd  dS dS )zCreate Hedron based on same re_class hedra in ref database.

        Adds Hedron to current Chain.internal_coord, see ic_data for default
        values and reference database source.
        Nc                    s   g | ]} | j qS r&   r?   rA   )rG   r&   r'   
<listcomp>       z4read_PIC.<locals>.default_hedron.<locals>.<listcomp>rJ   c                    s   g | ]}|   qS r&   r&   rA   )rF   atomkeysr&   r'   rZ      s    r      )NCAC)AGc                    $   g | ]}|  |    qS r&   r&   rA   rF   r\   resNdxr&   r'   rZ         $     c                    rc   r&   r&   rA   rd   r&   r'   rZ      rf   Xc                    rc   r&   r&   rA   rd   r&   r'   rZ      s    c                    rc   r&   r&   rA   rd   r&   r'   rZ      rf    default for )r   rK   rL   resnameresposrO   tupler   r   r   joinr#   strprint)	rG   r<   hkeyresPosatplresrhcldfltsrhc)rY   r   )rF   r\   rG   re   r'   default_hedron   sV   





z read_PIC.<locals>.default_hedrondkc                    s   | dd j vr&| ddd j vr&r | dd | nt|  d | dd j vrO| ddd j vrQrF | dd | dS t|  d	 dS dS dS )
z@Confirm both hedra present for dihedron key, use default if set.r   rJ   r]   Nrj   z missing h1rh      z missing h2)rQ   rq   )rz   r<   )ry   r   rX   r&   r'   hedra_check  s   &&zread_PIC.<locals>.hedra_checka4danglec                    s   | |||ft jjtj t fddtdD s&dS t|}|dkr0|n|d }|dkr:|n|d }t|< t j	<  |j	< }|_
s\| | S )z0Create Dihedron on current Chain.internal_coord.c                 3   r=   r>   r?   rA   rD   r&   r'   rH   %  rI   z5read_PIC.<locals>.process_dihedron.<locals>.<genexpr>r{   Ng     f@g     v@g     f)r   rK   rL   r   rM   rN   rO   rP   r   dihedrarR   )r6   r7   r8   r}   r~   r<   d)rT   r(   dar|   r   rX   rD   r'   process_dihedron  s&   

z"read_PIC.<locals>.process_dihedronc              
      s   t jj}t jj}t jj}d}d}| D ]}||j| 7 }||j| |j|  7 }q|dkr5|dd d }n|dkrBd|dd	  }n|d
krNd|dd	  }|tv r|t| d t| d t| d t| d t| d | rztd|   d	S d	S |t	v rt	| \ }| d j| t
| d j| d	}	 dkr| d jjg krԇ fddtdD }	| d jj}
|	t |
d jd d	|
d jd dd	d	f t|	}	nB dkr
jd | jd |  fddtdD }	|	 fddtddD  t|	}	ntfdd D }	|	v rL|	 t	| d  }t| d t| d t| d t| d || rJtd|   d	S d	S |tv r dkrjd | jd | t d	 d d	d	g}	|	 fddtddD  t|	}	n"t| \ }| d j| t
| d j| tfdd D }	|	v rڈ|	 | }t| d t| d t| d t| d || rtd|   d	S d	S td|	 d   d!  d | 	 d	S d	S td"|  d#| d$| d% d	S )&zCreate Dihedron based on same residue class dihedra in ref database.

        Adds Dihedron to current Chain.internal_coord, see ic_data for default
        values and reference database source.
        rg   NCACNr      XNCACNCAXCAXC   NCNCACXCr]   rh   rJ   rk   )r^   r_   r`   r^   c              	      $   g | ]}t d  | d d fqS r>   r   rB   x	primAnglernamernumr&   r'   rZ   Z      z6read_PIC.<locals>.default_dihedron.<locals>.<listcomp>r^   )r_   r`   r^   r_   c              	      s"   g | ]}t d  | d d qS r>   r   r   )r   prnameprnumr&   r'   rZ   o  s    c              	      r   r>   r   r   r   r&   r'   rZ   t  r   r{   c                 3   $    | ]}t d  |d d fV  qd S r>   r   rB   rL   r   r   r&   r'   rH   {  s    
z5read_PIC.<locals>.default_dihedron.<locals>.<genexpr>z secondary default for )r`   r^   r_   r`   c              	      r   r>   r   r   r   r&   r'   rZ     r   c                 3   r   r>   r   r   r   r&   r'   rH     s
    
z oxt default for zmissing primary angle r+   z to generate zmissing z -> z (z,) not found in primary or secondary defaults)r   rK   rL   rl   rm   r@   r
   rp   rq   r   intr<   r.   rO   r/   rbasern   addr   )rG   r<   rF   re   rs   rdclassdclassr$   offsetpaKeyr.   angl)r   r*   r   r   )r   r   r   r   r   r'   default_dihedron2  s   




	








	







	+z"read_PIC.<locals>.default_dihedronc                    s~  dt dt f fdd dt dt f fdd}g }tdtd	td
}}}tdtdtd}}}jg krrjD ].}	t|	dt|	d	t|	d
}
}}|||||
f ||||
|f |||
||f qBn||||tdf d}	|||||f jdkr|||||f jdkr||||f jg krjdkrr|||||f z+tj D ]#}t|dkrtdd |D rfdd|dd D }|| qW n	 t	y   Y nw ||}tj
j|D ]D}t|jv rq||v r	qtfdd|D r;r+t|dkr%| q| qr:t d|	 d|  q	 qdS )z?Look for required dihedra in residue, generate defaults if set.akListr    c                    s   | d }t | dkr-g }|D ]}| dd } |}|D ]}|d| || qq|S t |dkr8t|gS dd |D }|S )z%Build combinatorics of AtomKey lists.r   rh   Nc                 S   s   g | ]}|gqS r&   r&   )rB   r$   r&   r&   r'   rZ     s    zHread_PIC.<locals>.dihedra_check.<locals>.ake_recurse.<locals>.<listcomp>)leninsertr/   list)r   carretListr$   cdrrsltrake_recurser&   r'   r     s   
z4read_PIC.<locals>.dihedra_check.<locals>.ake_recurseeLstc                    sx   g }| D ]5}g }|D ] }|j |g}dd |D }|g kr$|| q
||g q
 |}|D ]}|| q1q|S )z4Expand AtomKey list with altlocs, all combinatorics.c                 S   s   g | ]}|d  qS )r   r&   )rB   r   r&   r&   r'   rZ     s    zFread_PIC.<locals>.dihedra_check.<locals>.ak_expand.<locals>.<listcomp>)r<   	split_aklr/   )r   r   edronnewListr$   r   rlstr   r   r&   r'   	ak_expand  s   z2read_PIC.<locals>.dihedra_check.<locals>.ak_expandr^   r_   r`   OCBr!   OXTz
(no rnext)rb   ra   PrJ   c                 s   s    | ]	}|d  dkV  qdS )r   r!   Nr&   r   r&   r&   r'   rH     s    z2read_PIC.<locals>.dihedra_check.<locals>.<genexpr>c                    s   g | ]}t  |qS r&   r   r   r<   r&   r'   rZ     r[   z3read_PIC.<locals>.dihedra_check.<locals>.<listcomp>r   r{   c                 3   s    | ]
}|j   d u V  qd S r>   r?   r   )
altloc_ndxr&   r'   rH     s    -z	 missing N)r   r   r.   r/   lcr0   r   r   rN   r#   rK   altlocrn   r   rq   )r<   r   chkLstsNsCAsCsOsCBsHrnnNnCAnCr   r@   rz   )r   ry   r   protonr   )r   r   r<   r'   dihedra_check  sh   ""






zread_PIC.<locals>.dihedra_checkc                    s   |j }t|jd |jd dkrdn|jd |jf}| D ]%}|jdu rAj| |jdd |kr<||_|j| q | qdS )ax  Allocate edron key AtomKeys to current residue as appropriate.

        A hedron or dihedron may span a backbone amide bond, this routine
        allocates atoms in the (h/di)edron to the ric residue or saves them
        for a residue yet to be processed.

        :param set ek: AtomKeys in edron
        :param IC_Residue ric: current residue to assign AtomKeys to
        rh   r]   r+   Nr   rJ   )	residuerp   r-   r   r<   aksetr   r@   ak_set)rG   r<   ru   resklr$   )
orphan_aksrX   r&   r'   rT   "  s   


zread_PIC.<locals>.ak_addc                     s   
 sD ]} | j  q	
D ]} | j  qi krVfddtD }fddtD }fddtD }fddtD }	||||  dS dS )z7Do last rnext, rprev links and process chain edra data.c                       i | ]}| | qS r&   r&   rB   k)rU   r&   r'   
<dictcomp>F  r[   z2read_PIC.<locals>.finish_chain.<locals>.<dictcomp>c                    r   r&   r&   r   )rV   r&   r'   r   G  r[   c                    r   r&   r&   r   )rW   r&   r'   r   H  r[   c                    r   r&   r&   r   )r   r&   r'   r   J  r[   N)r,   sorted_hedraDict2chain)r   shashl12shl23sda)bfacsr   r   rU   rV   rW   r5   r*   r   rX   trr&   r'   finish_chain;  s   
zread_PIC.<locals>.finish_chainr   )mode#zHEADER cfheadr-   idcodedddeposition_datezReading pic filezHEADER parse fail: zTITLE ttlnamezTITLE parse fail:, (	   z    rh   r]   rJ   r{   r   ru   hetposicoder+   c                 S   s
   | j d u S r>   r   )r$   r&   r&   r'   <lambda>  s   
 zread_PIC.<locals>.<lambda>zresidue ID parse fail: zATOM z"ATOM without residue configured:, z ATOM not in configured residue (z):r   yzfrL   tfacoccalcserelmzBFAC: len12anglelen23dihedralz
PIC file: z4 error: no residue info before reading (di/h)edron: zReading PIC filezparse fail on: ..)r    N)5r   rM   recompiler   r   init_structure
init_model
init_chaininit_segsetrp   r   r   r   rn   r	   	readlines
startswithmatchgrouprq   stripr   rO   
set_headerchainr   r,   init_residuer   r-   is_disordered
child_dictvaluesr/   rR   r   ordered_aa_ic_listr@   r<   r   r   filterrl   nparrayrP   	init_atomgroupsr   edron_reget_structure)r   r   r   r   
pdb_hdr_re
pdb_ttl_re
biop_id_re
pdb_atm_repdbx_atm_rebfac_rebfac2_restruct_builderheader_dict	curr_SMCS	SMCS_initsb_resrklsb_chainsbricr   handlelinemsegid	this_SMCSrC   r   r$   coord	bfac_pairm2r&   )rT   r%   r(   r   r   r   ry   r   r   rU   r|   rV   rW   r5   r   r*   r   rY   r   r   rX   r   r   r'   read_PIC)   sF  
0



	9  e"





$




v


  	  



	  
S  S  _r'  seqReczSeqIO.SeqRecordpdbidtitler  c                 C   sT  d\}}}| j dur| j }| jdur| j| dd}d|v r'|d\}}|du r3|dur1|nd}|du rJ|dur=|nd| j durF| j nd }|du rV|durT|nd}t }|d	 }d
dd| d| d}	|	d| dd7 }	d}
| jD ]}|	d| d| d|
 dt	|  d	7 }	|
d7 }
q}t
 }||	 |d t|ddS )zERead :class:`.SeqRecord` into Structure with default internal coords.NNNNr+   rg   :ra   zsequence input 0PDBz%d-%b-%yz
HEADER    zGENERATED STRUCTURE40z   

TITLE     69rh   z('z', 0, 'z	', (' ', z, ' ')) r   T)r   )r-   descriptionreplacesplitr   todaystrftimeupperseqr   r   writeseekr'  )r(  r)  r*  r  
read_pdbid
read_title
read_chainr5  datestroutputndxr   spr&   r&   r'   read_PIC_seq2  s<   



 


rB  picFlagshCutpCutc           	   	   C   sj   | j r+|r|s| j}|s|j}|s|jj}|jd}|| j j|||||d d S |t|  d S )Nr   rC  rD  rE  )	r,   parentr-   headergetr9  
_write_PICr   _residue_string)	entityfpr)  chainidrC  rD  rE  r  structr&   r&   r'   _wpr_  s   	
rP  c                 C   s   d}|   D ]}|  } |rHd}|  D ]3}d| kr7|j D ]}| D ]}|| |d7 }q)q#q| D ]}|| |d7 }q;qd S d S )NFrh   r]   )	get_atomsget_serial_numberget_residuesr  r  r  get_unpacked_listset_serial_number)rL  needrL   anumru   r   r&   r&   r'   _enumerate_entity_atomsz  s(   




rX  c                 C   sD   |   r|   } |   sd| jkr| D ]}t| qdS t|  dS )z2Ensure all atoms in entity have serial_number set.SN)
get_parentlevelrX  )rL  mdlr&   r&   r'   enumerate_atoms  s   

r]  r>  c                 C   sV   | r)t d| }|r)g dt|d }|dd | d |ddd  } | S )	z'Convert yyyy-mm-dd date to dd-month-yy.z(\d{4})-(\d{2})-(\d{2}))XXXJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECr]   rJ   r   rh   N)r   r   r   r   )r>  r!  mor&   r&   r'   pdb_date  s   (rm  c                 C   s  t |  t|d}zd| jkrtdd| jkr?d|  kr3| j D ]}t|||||||d q$nt| ||||||d nd| jkrZ|sI| j}| D ]}	t	|	||||||d qKntd| jkrp| D ]}
t	|
||||||d qan^d	| jkr|s~| j
d
d}| j
dd}t| j
dd}|r|d| |pd|pd | j
dd}|r|d|  d  | D ]}t	|||||||d qn	tdt| j W n ty   tdt|  w W d   dS 1 sw   Y  dS )aa  Write Protein Internal Coordinates (PIC) to file.

    See :func:`read_PIC` for file format.
    See :data:`IC_Residue.pic_accuracy` to vary numeric accuracy.
    Recurses to lower entity levels (M, C, R).

    :param Entity entity: Biopython PDB Entity object: S, M, C or R
    :param Bio.File file: :func:`.as_handle` file name or handle
    :param str pdbid: PDB idcode, read from entity if not supplied
    :param char chainid: PDB Chain ID, set from C level entity.id if needed
    :param int picFlags: boolean flags controlling output, defined in
        :data:`Bio.PDB.internal_coords.IC_Residue.pic_flags`

        * "psi",
        * "omg",
        * "phi",
        * "tau",  # tau hedron (N-Ca-C)
        * "chi1",
        * "chi2",
        * "chi3",
        * "chi4",
        * "chi5",
        * "pomg",  # proline omega
        * "chi",   # chi1 through chi5
        * "classic_b",  # psi | phi | tau | pomg
        * "classic",    # classic_b | chi
        * "hedra",      # all hedra including bond lengths
        * "primary",    # all primary dihedra
        * "secondary",  # all secondary dihedra (fixed angle from primary dihedra)
        * "all",        # hedra | primary | secondary
        * "initAtoms",  # XYZ coordinates of initial Tau (N-Ca-C)
        * "bFactors"

        default is everything::

            picFlagsDefault = (
                pic_flags.all | pic_flags.initAtoms | pic_flags.bFactors
            )

        Usage in your code::

            # just primary dihedra and all hedra
            picFlags = (
                IC_Residue.pic_flags.primary | IC_Residue.pic_flags.hedra
            )

            # no B-factors:
            picFlags = IC_Residue.picFlagsDefault
            picFlags &= ~IC_Residue.pic_flags.bFactors

        :func:`read_PIC` with `(defaults=True)` will use default values for
        anything left out

    :param float hCut: default None
        only write hedra with ref db angle std dev greater than this value
    :param float pCut: default None
        only write primary dihedra with ref db angle std dev greater than this
        value

    **Default values**:

    Data averaged from Sep 2019 Dunbrack cullpdb_pc20_res2.2_R1.0.

    Please see

    `PISCES: A Protein Sequence Culling Server <https://dunbrack.fccc.edu/pisces/>`_

    'G. Wang and R. L. Dunbrack, Jr. PISCES: a protein sequence culling
    server. Bioinformatics, 19:1589-1591, 2003.'

    'primary' and 'secondary' dihedra are defined in ic_data.py.  Specifically,
    secondary dihedra can be determined as a fixed rotation from another known
    angle, for example N-Ca-C-O can be estimated from N-Ca-C-N (psi).

    Standard deviations are listed in
    <biopython distribution>/Bio/PDB/ic_data.py for default values, and can be
    used to limit which hedra and dihedra are defaulted vs. output exact
    measurements from structure (see hCut and pCut above).  Default values for
    primary dihedra (psi, phi, omega, chi1, etc.) are chosen as the most common
    integer value, not an average.

    :raises PDBException: if entity level is A (Atom)
    :raises Exception: if entity does not have .level attribute
    wra   zNo PIC output at Atom levelRr]   rF  r`   MrY  r   Nr   r   zHEADER    {:40}{:8}   {:4}
rg   r   r0  r/  zCannot identify level: z2write_PIC: argument is not a Biopython PDB Entity )r]  r	   r[  r   r  r  r  rP  r-   	write_PICrH  rI  rm  r9  formatr7  rp   r#   	Exception)rL  r   r)  rN  rC  rD  rE  rM  r   ru   chnhdrr   r   r\  r&   r&   r'   rq    s   ]


	




"rq  )FFFr+  )6__doc__r   datetimer   ior   typingr   r   r   numpyr
  Bior   Bio.Data.PDBDatar   Bio.Filer	   Bio.PDB.ic_datar
   r   r   r   r   r   Bio.PDB.internal_coordsr   r   r   r   r   r   Bio.PDB.parse_pdb_headerr   Bio.PDB.PDBExceptionsr   Bio.PDB.Residuer   Bio.PDB.Structurer   Bio.PDB.StructureBuilderr   boolr'  rp   rB  picFlagsDefaultr   rP   rP  rX  r]  rm  rq  r&   r&   r&   r'   <module>   s   
      
2
