o
    *j                     @   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CAZCB.N)   .)rcZrestype_order
atom_ordertorchwhereexpandlenshape)ZaatypeZall_atom_positionsZall_atom_masksZis_glyZca_idxZcb_idxZpseudo_betaZpseudo_beta_mask r   x/var/www/html/Deteccion_Ine/venv/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 )NZresidx_atom37_to_atom14)dimZnum_batch_dimsZatom37_atom_existsr
   )r   r   r   )Zatom14batchZ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_aatypeZtemplate_torsion_angles_sin_cosZtemplate_torsion_angles_maskZ#template_alt_torsion_angles_sin_cos   r      r   r   ).   .r   r   r   ).r   )r   catr   Zreshaper   )Ztemplate_featsZ
v2_featurer   Ztorsion_angles_sin_cosZtorsion_angles_maskZalt_torsion_angles_sin_cosZtemplate_angle_featZtemplate_angle_maskZchi_maskZchi_angles_sinZ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_betar   r   Tr   Zkeepdimdevicer   r   r   r   r   )r   sumlinspacer(   r    
new_tensortypedtypennZ
functionalr   r   restype_numr   appendr   Z	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_resZ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 )Nr$   r
   .r%   r   r   Tr&   r'   r   r   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	   CZtemplate_all_atom_positions)Zn_xyzZca_xyzZc_xyzr4   Ztemplate_all_atom_mask)r   r)   r*   r(   r    r+   r,   r-   r   r   r/   r   r0   r   r   Zmake_transform_from_referenceZ	get_transZinvert_applyZrsqrtextendZunbind)r   r1   r2   r3   Zmultichain_mask_2dr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   ncacZrigidsZpointsZ	rigid_vecZinv_distance_scalarZ
t_aa_masksZbackbone_maskZbackbone_mask_2dZunit_vector_datar   r   r   build_template_pair_feat_v2}   s   	0"


"rI   c                 C   s:   t | d d}|| d d| d dg}tj|ddS )NZ	extra_msa   Zextra_msa_has_deletionr   Zextra_msa_deletion_valuer   )r   Z	unsqueezer   r    )r   Zmsa_1hotZmsa_featr   r   r   build_extra_msa_feat   s   rK   )F)r"   r#   )Nr"   r#   )typingr   r   Ztorch.nnr.   Zunicore.utilsr   r   Z&modelscope.models.science.unifold.datar   r   framer   r   r   r!   r?   rI   rK   r   r   r   r   <module>   s"   
)
.
?