o
    i                      @   s  d dl 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    )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   `/home/ubuntu/.local/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CACB.N)   .)rcrestype_order
atom_ordertorchwhereexpandlenshape)r	   r
   r   is_glyca_idxcb_idxpseudo_betapseudo_beta_maskr   r   r   r   %   s    

 

atom14batchc                 C   s6   t | |d dt| jd d d}||d d  }|S )Nresidx_atom37_to_atom14)dimno_batch_dimsatom37_atom_existsr   )r   r   r    )r&   r'   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_aatypetemplate_torsion_angles_sin_cos#template_alt_torsion_angles_sin_costemplate_torsion_angles_mask   r)      r   r*   )r   catr   
functionalone_hotreshaper    )r/   r0   torsion_angles_sin_cosalt_torsion_angles_sin_costorsion_angles_mask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 )Ntemplate_pseudo_beta_maskr   .template_pseudo_beta   r   T)r*   keepdim)devicer   r6   r0   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   Ctemplate_all_atom_positions)n_xyzca_xyzc_xyzrF   template_all_atom_maskg        )r   sumlinspacerL   r7   
new_tensortypedtyper   r8   r9   r   restype_numr    appendr   r   make_transform_from_reference	get_transinvert_applyrsqrtextendunbind)r'   rB   rC   rD   rE   rF   rG   template_masktemplate_mask_2dtpbdgramlowerupper	to_concataatype_one_hotn_resncacrigidspoints	rigid_vecinv_distance_scalar
t_aa_masksunit_vectoractr   r   r   build_template_pair_featY   sJ   	:"@:$"rw   c                 C   s>   t j| d d}|| d d| d dg}tj|ddS )N	extra_msa   extra_has_deletionr   extra_deletion_valuer6   )r   r8   r9   	unsqueezer   r7   )r'   msa_1hotmsa_featr   r   r   build_extra_msa_feat   s   r   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   rJ   r   ).r   r)   r6   ).r   r   ).r   r   ).r   ).r   rJ   )rot_mats).   ).   ).   ).   r   r   )from_tensor_4x4	new_zerosr   r    r   r7   r   get_rotsget_rot_matscomposer   r   r|   )r   r   r	   r   default_4x4	default_rbb_rotall_rots
all_frameschi2_frame_to_framechi3_frame_to_framechi4_frame_to_framechi1_frame_to_bbchi2_frame_to_bbchi3_frame_to_bbchi4_frame_to_bball_frames_to_bball_frames_to_globalr   r   r   torsion_angles_to_frames   s8   
&0



r   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.)num_classesc                 S   s   t j| ddS )Nr   r6   )r   rW   )xr   r   r   <lambda>   s    z?frames_and_literature_positions_to_atom14_pos.<locals>.<lambda>r   )r   r8   r9   r    map_tensor_fnr|   apply)
r   r	   r   r   r   r   
group_maskgroup_mask_one_hott_atoms_to_globalpred_positionsr   r   r   -frames_and_literature_positions_to_atom14_pos   s   	
r   )Fr@   rA   )typingr   r   torch.typesr    r   r   rigid_utilsr   r   tensor_utilsr   Tensorr   tupledictstrr.   r?   typesNumberintboolfloatrw   r   r   r   r   r   r   r   <module>   s   "$
=

>