
    9i                         S SK Jr  S SKrS SKJr  S SKJrJr  S SKJ	r
  SSKJr  S rS rSS	 jr  SS
 jr   SS jrS rg)    )DictN)batched_gatherone_hot)residue_constants   )Framec           	      t   U [         R                  S   :H  n[         R                  S   n[         R                  S   n[        R                  " US   R
                  " / S[        UR                  5      -  QSP76 USUS S 24   USUS S 24   5      nUb%  [        R                  " UUSU4   USU4   5      nXg4$ U$ )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_masks           w/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/models/science/unifold/modules/featurization.pypseudo_beta_fnr!      s    r'',,F]]4 F]]4 F++y  B6C,=#=BB3>*3>*K ! ;;3;'3;'

 ,,    c           
      d    [        U US   S[        U R                  S S 5      S9nX!S   S   -  nU$ )Nresidx_atom37_to_atom14)dimnum_batch_dimsatom37_atom_existsr   )r   r   r   )atom14batchatom37_datas      r    atom14_to_atom37r,   #   sI     '(6<<,-	K &: ;I FFKr"   c           
         U S   nU S   nU S   nU(       dn  U S   n[         R                  " [        US5      UR                  " / UR                  S S QSP76 UR                  " / UR                  S S QSP76 U/SS	9nUS
   nXg4$ USSS 24   nUSSS 2S4   U-  n	USSS 2S4   U-  n
[         R                  " [        US5      U	U
U/SS	9nUS   nXg4$ )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_coss              r    build_template_angle_featrB   0   sO   $%67O+,MN()GH%31&3"#ii,&.. <+11#26<8:<*22 @/55cr:@<>@# 

 2&9 33 'sABw//QR
;hF/QR
;hF#ii,	 
 'v.33r"   c           	         U S   nUS   USS S S 24   -  nU S   n[         R                  " USS S S 24   USS S S 2S S 24   -
  S-  SSS9n	[         R                  " XX8R                  S	9S-  n
[         R                  " U
S
S  U
R                  U/5      /SS9nX:  X:  -  R                  U	R                  5      n	XS   /n[        R                  R                  U S   [        R                  S-   5      nU S   R                  S   nUR                  USS S S 2S S 24   R                  " / UR                  S S QUPSPSP76 5        UR                  USS S S 24   R                  " / UR                  S S QSPUPSP76 5        UR                  UR                   " / UR                  QSP76 5        UR                  US   5        [         R                  " USS9nXS   -  nU$ )Ntemplate_pseudo_beta_maskr   .template_pseudo_betar5   r   Tr&   keepdimdevicer   r4   r.   r%   r   )r   sumlinspacerI   r6   
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acts                   r    build_template_pair_featrc   T   s2    56M$Y/-T12MM
&
'CII	S$\	SdAq1	1A52tMENN7XjjI1LEIIuQRy%"2"2C5"9:CEm.44U[[AE34I]]** 
N
 #$**2.E^Cq!O4;; 3			cr	"3$)3+-3/13 4^C$(!%, --3V4 C5C5I5I#25NC46C8=C?AC D %//K1A1G1GKKL%i01
))I2
&C
+
+CJr"   c           	         U S   nUS   USS S S 24   -  nUb  X-  nU S   n	[         R                  " U	SS S S 24   U	SS S S 2S S 24   -
  S-  SSS9n
[         R                  " XX9R                  S	9S-  n[         R                  " US
S  UR                  U/5      /SS9nX:  X:  -  R                  U
R                  5      n
XS   -  n
XS   /n[        U S   [        R                  S-   5      nU S   R                  S   nUR                  USS S S 2S S 24   R                  " / UR                  S S QUPSPSP76 5        UR                  USS S S 24   R                  " / UR                  S S QSPUPSP76 5        S Vs/ s H  n[        R                  U   PM     snu  nnn[        R                   " U S   SUS S 24   U S   SUS S 24   U S   SUS S 24   US9nUR#                  5       SS S S 2S S 24   nUS   R%                  U5      n[         R&                  " U[         R                  " US-  SS9-   5      nU S   nUSU4   USU4   -  USU4   -  nUSS S 2S 4   USS S S 24   -  nUb  UU-  nUU-  nUUS   -  nUR)                  [         R*                  " USS S S 24   SS95        UR                  US   5        U$ s  snf )NrD   r   .rE   r5   r   TrF   rH   r   r4   r.   r%   )Nr   Ctemplate_all_atom_positions)n_xyzca_xyzc_xyzrW   template_all_atom_mask)r   rJ   rK   rI   r6   rL   rM   rN   r   r   rQ   r   rR   r   r   r   make_transform_from_reference	get_transinvert_applyrsqrtextendunbind)r*   rT   rU   rV   multichain_mask_2drW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   ancacrigidspoints	rigid_vecinv_distance_scalar
t_aa_masksbackbone_maskbackbone_mask_2dunit_vector_datas                               r    build_template_pair_feat_v2r   }   s    56M$Y/-T12MM%.
&
'CII	S$\	SdAq1	1A52tMENN7XjjI1LEIIuQRy%"2"2C5"9:CEm.44U[[AE	i((E34I 
N
 #$**2.E^Cq!O4;; 3			cr	"3$)3+-3/13 4^C$(!%, --3V4 C5C5I5I#25NC46C8=C?AC D +;;*:Qa *:;HAr10012319=23CQJ?12319=	F T1a0Fy!..v6I++cEIIil,K&KL/0JsAv&CG)<<z#JKKL @M MM$S!T\2]3CGDK 6L L%..-0@@ #6y#AAU\\"23a<"@bIJ%i013 <s   =J?c                     [        U S   S5      nUU S   R                  S5      U S   R                  S5      /n[        R                  " USS9$ )N	extra_msa   extra_msa_has_deletionr   extra_msa_deletion_valuer4   )r   	unsqueezer   r6   )r*   msa_1hotmsa_feats      r    build_extra_msa_featr      sX    u[)2.H&'11"5()33B7H
 99X2&&r"   )F)#B;    חA)Nr   r   )typingr   r   torch.nnrO   unicore.utilsr   r   &modelscope.models.science.unifold.datar   r   framer   r!   r,   rB   rc   r   r    r"   r    <module>r      sM       1 J *
!4R 	&\ <~'r"   