
    cCi                         S SK Jr  S SKrS SKrS SKJr  SSKJr  SSKJ	r	J
r
  SSKJr  \S\R                  S	\R                  S
SS\R                  4S j5       r\S\R                  S	\R                  S
\R                  S\\R                  \R                  4   4S j5       rS rS\R                  S\\\R                  4   S\R                  4S jrS\\\R                  4   S\R                  4S jr   S%S\\\R                  4   S\R(                  R*                  S\R(                  R*                  S\S\S\S\S\R                  4S jjrS\\\R                  4   S\R                  4S jrS\	S\R                  S\R                  S\R                  S\	4
S jrS\	S\R                  S \R                  S!\R                  S"\R                  S#\R                  S\R                  4S$ jrg)&    )overloadN)nn   )residue_constants)RigidRotation)batched_gatheraatypeall_atom_positionsall_atom_masksreturnc                     g N r
   r   r   s      f/home/james-whalen/.local/lib/python3.13/site-packages/transformers/models/esm/openfold_utils/feats.pypseudo_beta_fnr      s    ru    c                     g r   r   r   s      r   r   r      s     ),r   c           	      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)r
   r   r   is_glyca_idxcb_idxpseudo_betapseudo_beta_masks           r   r   r   %   s    r'',,F]]4 F]]4 F++y  A53v||+<#<AqA3>*3>*K ! ;;3;'3;'

 ,,r   atom14batchc           
      d    [        U US   S[        U R                  S S 5      S9nX!S   S   -  nU$ )Nresidx_atom37_to_atom14)dimno_batch_dimsatom37_atom_existsr   )r	   r#   r$   )r*   r+   atom37_datas      r   atom14_to_atom37r3   :   sI     '(&,,s+,	K &: ;I FFKr   template_featsc           
         U S   nU S   nU S   nU S   n[         R                  " [        R                  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$ )
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$   )r4   r6   torsion_angles_sin_cosalt_torsion_angles_sin_costorsion_angles_masktemplate_angle_feats         r   build_template_angle_featrE   G   s    $%67O+,MN!/0U!V()GH))MM!!/26"**R,B,H,H",MRrR&..Z0J0P0PQTRT0UZWYZ		
  r   min_binmax_binno_binsuse_unit_vectorepsinfc           	         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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[        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        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   USS S S 24   -  nUU-  nUUS   -  nU(       d  US-  nUR-                  [         R.                  " USS S S 24   SS95        UR                  US   5        [         R                  " USS9nUUS   -  nU$ s  snf )Ntemplate_pseudo_beta_maskr   .template_pseudo_beta   r   T)r/   keepdim)devicer   r<   r6   r.   )Nr   Ctemplate_all_atom_positions)n_xyzca_xyzc_xyzrJ   template_all_atom_maskg        )r    sumlinspacerQ   r=   
new_tensortypedtyper   r>   r?   r   restype_numr$   appendr"   r   r   make_transform_from_reference	get_transinvert_applyrsqrtextendunbind)r+   rF   rG   rH   rI   rJ   rK   template_masktemplate_mask_2dtpbdgramlowerupper	to_concataatype_one_hotn_resancacrigidspoints	rigid_vecinv_distance_scalar
t_aa_masksunit_vectoracts                              r   build_template_pair_featrz   Y   sM    56M$Y/-T12MM &
'CIIs3a<(3sD!Q+??AE2W[\ENN7WZZHAMEIIuQRy%"2"2C5"9:CEm.44U[[AE34I')}}'<'< 
(N
 #$**2.E^Cq!O4;;f^=Q=QRUSU=VfX]f_afcefg^CqL188c.:N:NsPR:ScUWcY^c`b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#q&?QQM$Y/-T12MM-0@@1)<<K!C'U\\+c4l";DE%i01
))I2
&C
 +
+CJ9 <s   K!c                     [         R                  R                  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_has_deletionr   extra_deletion_valuer<   )r   r>   r?   	unsqueezer    r=   )r+   msa_1hotmsa_feats      r   build_extra_msa_featr      sb    !#!6!6u[7I2!NH"#--b1$%//3H
 99X2&&r   ralpharrgdfc           	      L   X2S4   nU R                  U5      nUR                  / S[        UR                  S S 5      -  QSP75      nSUS'   [        R
                  " UR                  " / UR                  S S QSPSP76 U/SS9nUR                  UR                  5       R                  5       R                  5      nSUS	'   US   US
'   US   * US'   XSSSS 24'   UR                  [        [        US9S 5      5      nUS   n	US   n
US   nUS   nUR                  U	5      nUR                  U
5      nUR                  U5      n[        R
                  " USS S24   UR                  S5      UR                  S5      UR                  S5      /SS9nU S   R                  U5      nU$ )N.)r   r   rO   r   ).r   r.   r<   ).r   r   ).r   r   ).r   ).r   rO   )rot_mats).   ).   ).   ).   r   r   )from_tensor_4x4	new_zerosr#   r$   r    r=   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_globals                     r   torsion_angles_to_framesr      s    $K
 !!+.I__As5;;s+;'< <AqABFF6N IIv}}?ekk#2&6??B?GRPE y113@@BHHIHHY-HY =.HY S!QRZ""58)Dd#KLJ$V,$V,$V,!&)'//0CD'//0CD'//0CDyysBQBw&&r*&&r*&&r*		
  Y<//0@Ar   default_frames	group_idx	atom_masklit_positionsc                    X1S4   n[         R                  R                  UUR                  S   S9nU SS S S 24   U-  nUR	                  S 5      nXAS4   R                  S5      nXQS4   nUR                  U5      n	X-  n	U	$ )N.)num_classesc                 ,    [         R                  " U SS9$ )Nr   r<   )r    rY   )xs    r   <lambda>?frames_and_literature_positions_to_atom14_pos.<locals>.<lambda>   s    %))ASUBVr   r   )r   r>   r?   r$   map_tensor_fnr   apply)
r   r
   r   r   r   r   
group_maskgroup_mask_one_hott_atoms_to_globalpred_positionss
             r   -frames_and_literature_positions_to_atom14_posr      s     3;'J ,.==+@+@"((, ,A , #tQ,*<< *778VW #+&004I "#+.M&,,];N#/Nr   )Fg#B;g    חA)typingr   r    torch.typesr    r   r   rigid_utilsr   r   tensor_utilsr	   Tensorr   tupledictstrr3   rE   typesNumberintboolfloatrz   r   r   r   r   r   r   <module>r      sC        % ( ( 
 u5<< uU\\ u[_ udidpdp u 
 u 
,LL,.3ll,LQLL,
5<<%&, 
,
*
U\\ 
$sELL7H2I 
ell 
d33D.E %,, . ":U\\!":[[: [[: 	:
 : 
: 
: \\:z'S%,,%6 7 'ELL '; ; <<;  LL;  <<	; 
 ; |LL LL ||	
 || << \\r   