o
    ॵi                     @   s   d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z
 ddlmZ dd Zd	d
 ZdddZ		dddZ			dddZdd ZdS )    )DictN)batched_gatherone_hot)residue_constants   )Framec              	   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)aatypeall_atom_positionsall_atom_masksis_glyca_idxcb_idxpseudo_betapseudo_beta_mask r   k/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/science/unifold/modules/featurization.pypseudo_beta_fn   s    

 

r    c                 C   s6   t | |d dt| jd d d}||d d  }|S )Nresidx_atom37_to_atom14)dimnum_batch_dimsatom37_atom_existsr   )r   r   r   )atom14batchatom37_datar   r   r   atom14_to_atom37#   s   r)   Fc                 C   s   | d }| d }| d }|sB| d }t jt|d|jg |jd d dR  |jg |jd d dR  |gdd	}|d
 }||fS |ddd f }|ddd df | }	|ddd df | }
t jt|d|	|
|gdd	}|d }||fS )Ntemplate_aatypetemplate_torsion_angles_sin_costemplate_torsion_angles_mask#template_alt_torsion_angles_sin_cos   r"      r   r#   ).   .r   r   r   ).r   )r   catr   reshaper   )template_feats
v2_featurer*   torsion_angles_sin_costorsion_angles_maskalt_torsion_angles_sin_costemplate_angle_feattemplate_angle_maskchi_maskchi_angles_sinchi_angles_cosr   r   r   build_template_angle_feat0   sL   	r>   #B;    חAc                 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   ||jg |jdR   ||d  t j|dd}||d  }|S )Ntemplate_pseudo_beta_maskr   .template_pseudo_betar1   r   Tr#   keepdimdevicer   r0   r*   r"   r   )r   sumlinspacerF   r2   
new_tensortypedtypenn
functionalr   r   restype_numr   appendr   	new_zeros)r'   min_binmax_binnum_binsepsinftemplate_masktemplate_mask_2dtpbdgramlowerupper	to_concataatype_one_hotn_resactr   r   r   build_template_pair_featT   sT   0"

r`   c                 C   s  | d }|d |dd d d f  }|d ur||9 }| 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 9 }
|
|d g}t| 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 f |dd d d f  }|d ur?||9 }|| }||d  }|t j|dd d d f dd ||d  |S )NrA   r   .rB   r1   r   TrC   rE   r   r0   r*   r"   c                 S   s   g | ]}t j| qS r   )r   r   ).0ar   r   r   
<listcomp>   s    z/build_template_pair_feat_v2.<locals>.<listcomp>)Nr	   Ctemplate_all_atom_positions)n_xyzca_xyzc_xyzrT   template_all_atom_mask)r   rG   rH   rF   r2   rI   rJ   rK   r   r   rN   r   rO   r   r   make_transform_from_reference	get_transinvert_applyrsqrtextendunbind)r'   rQ   rR   rS   multichain_mask_2drT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   ncacrigidspoints	rigid_vecinv_distance_scalar
t_aa_masksbackbone_maskbackbone_mask_2dunit_vector_datar   r   r   build_template_pair_feat_v2}   s   	0"


"r}   c                 C   s:   t | d d}|| d d| d dg}tj|ddS )N	extra_msa   extra_msa_has_deletionr   extra_msa_deletion_valuer0   )r   	unsqueezer   r2   )r'   msa_1hotmsa_featr   r   r   build_extra_msa_feat   s   r   )F)r?   r@   )Nr?   r@   )typingr   r   torch.nnrL   unicore.utilsr   r   &modelscope.models.science.unifold.datar   r   framer   r    r)   r>   r`   r}   r   r   r   r   r   <module>   s"   
)
.
?