o
    Zh                      @   s  d dl mZmZmZ d dlZd dlZd dlmZ ddlmZ	 ddl
mZmZ ddlmZ edejd	ejd
ddejfddZedejd	ejd
ejdeejejf fddZdd Zdejdeeejf dejfddZdeeejf dejfddZ			d/deeejf dejjdejjdededededejfd d!Zdeeejf dejfd"d#Zd$ed%ejdejd&ejdef
d'd(Zd$edejd)ejd*ejd+ejd,ejdejfd-d.ZdS )0    )DictTupleoverloadN)nn   )residue_constants)RigidRotation)batched_gatheraatypeall_atom_positionsall_atom_masksreturnc                 C      d S N r   r   r   r   r   [/var/www/auris/lib/python3.10/site-packages/transformers/models/esm/openfold_utils/feats.pypseudo_beta_fn   s   r   c                 C   r   r   r   r   r   r   r   r      s   c              	   C   s   | t jd k}t jd }t jd }t|d jg dt|j dR  |d|d d f |d|d d f }|d urLt||d|f |d|f }||fS |S )NGCAZCB.N)   .)rcZrestype_order
atom_ordertorchwhereexpandlenshape)r   r   r   Zis_glyZca_idxZcb_idxZpseudo_betaZpseudo_beta_maskr   r   r   r   %   s    

 

atom14batchc                 C   s6   t | |d dt| jd d d}||d d  }|S )NZresidx_atom37_to_atom14)dimZno_batch_dimsZatom37_atom_existsr   )r
   r   r    )r!   r"   Zatom37_datar   r   r   atom14_to_atom37:   s   r%   template_featsc                 C   sx   | d }| d }| d }| d }t jtj|d|jg |jd d dR  |jg |jd d dR  |gdd	}|S )
Ntemplate_aatypeZtemplate_torsion_angles_sin_cosZ#template_alt_torsion_angles_sin_cosZtemplate_torsion_angles_mask   r#      r   r$   )r   catr   
functionalone_hotZreshaper    )r&   r'   Ztorsion_angles_sin_cosZalt_torsion_angles_sin_cosZtorsion_angles_maskZtemplate_angle_featr   r   r   build_template_angle_featG   s   
r.   F#B;    חAmin_binmax_binno_binsuse_unit_vectorepsinfc                 C   s  | d }|d |dd d d f  }| d }	t j|	dd d d f |	dd d d d d f  d ddd}
t j||||	jd	d }t j|d
d  ||ggdd}|
|k|
|k  |
j}
|
|d g}tj	
| d tjd }| d jd }||dd d d d d f jg |jd d |ddR   ||dd d d f jg |jd d d|dR   dd dD \}}}tj| d d|d d f | d d|d d f | d d|d d f |d}| dd d d d d f }|d |}t |t j|d dd }| d }|d|f |d|f  |d|f  }|d |dd d d f  }|| }||d  }|s6|d }|t j|dd d d f dd ||d  t j|dd}||d  }|S )NZtemplate_pseudo_beta_maskr   .Ztemplate_pseudo_beta   r   T)r$   Zkeepdim)devicer   r*   r'   r#   c                 S   s   g | ]}t j| qS r   )r   r   ).0ar   r   r   
<listcomp>w   s    z,build_template_pair_feat.<locals>.<listcomp>)Nr   CZtemplate_all_atom_positions)Zn_xyzZca_xyzZc_xyzr5   Ztemplate_all_atom_maskg        )r   sumZlinspacer8   r+   Z
new_tensortypeZdtyper   r,   r-   r   Zrestype_numr    appendr   r   Zmake_transform_from_referenceZ	get_transZinvert_applyZrsqrtextendZunbind)r"   r1   r2   r3   r4   r5   r6   Ztemplate_maskZtemplate_mask_2dZtpbZdgramlowerupperZ	to_concatZaatype_one_hotZn_resncacZrigidsZpointsZ	rigid_vecZinv_distance_scalarZ
t_aa_masksZunit_vectorZactr   r   r   build_template_pair_featY   sJ   	:"@:$"rG   c                 C   s>   t j| d d}|| d d| d dg}tj|ddS )NZ	extra_msa   Zextra_has_deletionr   Zextra_deletion_valuer*   )r   r,   r-   	unsqueezer   r+   )r"   Zmsa_1hotZmsa_featr   r   r   build_extra_msa_feat   s   rJ   ralpharrgdfc                 C   sV  ||df }|  |}|g dt|jd d  dR }d|d< tj|jg |jd d ddR  |gdd}||  j}d|d	< |d |d
< |d  |d< ||dddd f< |	t
t|dd }|d }	|d }
|d }|d }|	|	}|	|
}|	|}t
j|dd df |d|d|dgdd}| d 	|}|S )N.)r   r   r7   r   ).r   r#   r*   ).r   r   ).r   r   ).r   ).r   r7   )Zrot_mats).   ).   ).   ).   rN   r   )Zfrom_tensor_4x4Z	new_zerosr   r    r   r+   r   Zget_rotsZget_rot_matsZcomposer   r	   rI   )rK   rL   r   rM   Zdefault_4x4Z	default_rZbb_rotZall_rotsZ
all_framesZchi2_frame_to_frameZchi3_frame_to_frameZchi4_frame_to_frameZchi1_frame_to_bbZchi2_frame_to_bbZchi3_frame_to_bbZchi4_frame_to_bbZall_frames_to_bbZall_frames_to_globalr   r   r   torsion_angles_to_frames   s8   
&0



rR   default_frames	group_idx	atom_masklit_positionsc           
      C   sz   ||df }t jj||jd d}| dd d d f | }|dd }||df d}||df }||}	|	| }	|	S )N.)Znum_classesc                 S   s   t j| ddS )Nr   r*   )r   r>   )xr   r   r   <lambda>   s    z?frames_and_literature_positions_to_atom14_pos.<locals>.<lambda>r   )r   r,   r-   r    Zmap_tensor_fnrI   apply)
rK   r   rS   rT   rU   rV   Z
group_maskZgroup_mask_one_hotZt_atoms_to_globalZpred_positionsr   r   r   -frames_and_literature_positions_to_atom14_pos   s   	
r[   )Fr/   r0   )typingr   r   r   r   Ztorch.typesr    r   r   Zrigid_utilsr   r	   Ztensor_utilsr
   ZTensorr   strr%   r.   typesNumberintboolfloatrG   rJ   rR   r[   r   r   r   r   <module>   s   "$
=

>