
    ;iu                    .   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
mZ d dlZd dlZd dlZd dlZ ej        d           g dZg dZd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d)dZ%d*dZ&d+d Z'd,d#Z(d-d.d'Z)d,d(Z*dS )/    )annotationsN)DictAnyListTupleignore)GDGRGGUAG5DG5RG5G3DG3RG3GNDGNRGN)	KK+NaNANa+SrSRSr+Sr2+c                &   d                     |          }d                     |          }d                     |          }d                     |          }d                     |          }d                     |          }d                     |          }d                     |          }	|                     |          j                                        }
|                     |          j                                        }|                     |          j                                        }|                     |          j                                        }|                     |          j                                        }|                     |          j                                        }|                     |          j                                        }|                     |	          j                                        }|
|||||||fS )	Nz(nucleicbase and resid {} and not name H*zresid {} and name N9zresid {} and name C1'zresid {} and name O6zresid {} and name N7zresid {} and name N2zresid {} and name N1zresid {} and name O4'formatselect_atoms	positions	transpose)coordinatesresidselection_baseselection_N9selection_C1pselection_O6selection_N7selection_N2selection_N1selection_O4pdata_matrixN9data_matrixC1pdata_matrixO6data_matrixN7data_matrixN2data_matrixN1data_matrixO4pdata_matrixs                     0/srv/www/vhosts/g4struct/public_html/analysis.pyget_selected_coords_mdar8      s   ?FFuMMN)0077L+22599M)0077L)0077L)0077L)0077L+22599M**>::DNNPPK,,\::DNNPPM --m<<FPPRRN,,\::DNNPPM,,\::DNNPPM,,\::DNNPPM,,\::DNNPPM --m<<FPPRRN~}mUbdq  tB  B  B    c                    d                     |          }|                     |          j                                        }|S )Nz
resname {}r    )r%   resnameselection_ionsr/   s       r7   get_simple_coords_mdar=   (   s=    !((11N**>::DNNPPKr9   c                    t          j        | dd          }| |z
  }t           j                            |          }|d         }|d         }|d d df         }|d         }||||fS )N   Taxiskeepdimsr   )npmeanlinalgsvd)r/   comdata_comrG   leftsingularnormal_vectornormal_singulars           r7   calc_svdrN   .   sp    
'+A
5
5
5CS H
)--
!
!Cq6D1vHBKMrlO-88r9   c                :    |t          j        || z            z  }|S N)rD   sign)
ref_vectorvectororientedvectors      r7   	orientaterU   :   s!    bgfz&9:::Nr9   c                N   t          j        | d                   }| |z  }d|d         z   }t          j        |d         dz  |d         dz  |d         dz   dz  g          }t          j        d|z            |z  }g }g }g }	|                                D ]y}
dt          j        |
|          z  |z  |
z
  }|                    |d                     |                    |d          |z             |	                    |d         |z             zt          j        |||	g          }|S N   r?   r   )rD   rQ   arraysqrtr$   dotappend)oriented_normal_vectordata_matrix_com	flip_condonormal_vectorz_shiftavg_vectrot_vectxcoordrmycoordrmzcoordrmcolumnout_vect
rot_matrixs                r7   standardrotationrj   ?   s=   .q122I+i7N.##Gx*Q.q0AA0EWXHY\]H]abGbcddHwqG}%%0HHHH!++-- 1 1rvfh///(:VC!%%%!y0111i/00008Xx899Jr9   c                    | d         | d                                          z  }t          j        |t          | d                   z            }|S NrX   )r$   rD   rZ   len)ri   total_zdist_sq	planaritys      r7   planarity_zrp   Q   sF    ]Z]%<%<%>%>>N#jm*<*<<==Ir9   c                \    t          | d                   t          | d                   z  }|S rl   )sumrm   )ri   zdispls     r7   displacement_zrt   W   s)    A#jm"4"44FMr9   c                    t          j        | d         |d         z  |d         | d         z  z
  | d         |d         z  | d         |d         z  z             }|S )Nr?   r   )rD   arctan2)vector1vector2angles      r7   angle_vectors_planerz   \   s]    J
WQZ/'!*wqz2II
WQZ/'!*wqz2IIL LELr9   c           	     X   || z
  }||z
  }||z
  }t          j        ||          }t          j        ||          }|t           j                            |          z  }	t          j        t          j        |	t          j        ||                    t          j        ||                    }
|
S rP   )rD   crossrF   normrv   r[   )point1point2point3point4b1b2b3n1n2b2_unittorsions              r7   torsion_angler   c   s    	&B	&B	&B	"b		B	"b		B29>>"%%%Gj"b)9)9::BF2rNNKKGNr9   c                2   | t          j        | d                   z  }t          j        |d                   }t          j        |d         |d         z  |d         |d         z  z
  |d         |d         z  |d         |d         z  z             }||d         fS rW   )rD   rQ   arccosrv   )rL   rH   r`   declination	ascensions        r7   declin_ascen_zr   p   s    "RW]1-=%>%>>N)N1-..K
N1-A6Q.QRBS9SS*1-A69JSQRV9SSV VI	!$$r9   c                   t          |           }t          j        d|dz   f          }t          j        |dz             }t          |          D ]}|d|dz   |z  f         |d||z  f         z
  }|d|dz   |z  f         |d||z  f         z
  }|d|dz   |z  |z   f         |d||z  |z   f         z
  }|d|dz   |z  |z   f         |d||z  |z   f         z
  }	||	z  ||z  z
  |d|dz   f<   ||z  ||	z  z   |d|dz   f<   |dxx         |d|dz   f         z  cc<   |dxx         |d|dz   f         z  cc<   t          j        |d|dz   f         |d|dz   f                   ||dz   <   t          j        |d         |d                   |d<   |S )NrX   r?   r   )r   r   )r?   r   )rm   rD   zerosrangerv   )
arrangementr/   ltwist_yxtwistix1y1x2y2s
             r7   r   r   x   s   KAxAE
##HHQUOOE1XX 	J 	JQUaK(;q!a%x+@@QUaK(;q!a%x+@@QUaK!O+,{1a!eai</HHQUaK!O+,{1a!eai</HH"WrBw.AE"WrBw.AE(1a!e8,,(1a!e8,,z(1a!e8"4hq!a%x6HIIa!ez(4.(4.99E!HLr9   c                   t          |           }|dk    rnt          j                            |d d df         |d d df         z
            t          j                            |d d df         |d d df         z
            z  }nd}|S )N   rX   r      r?   )rm   rD   rF   r}   )r   r/   r   excentrs       r7   excentricityr      s    KAAvv9>>+aaad"3k!!!Q$6G"GHH29>>1AAAqD 11L3 L3 3 Nr9   c           	     
   t          ||           }d}d}g }|D ]}g g g g}||z   }	|d d ||	f         }
t          |
          \  }}}}t          t          j        t          j        ||                    |z  |          \  }}t          |          }|                    t          |d                     |                    t          |dz  d                     |                    t          |dz  d                     |	}|S )Nr      r   gyܥL@)	rj   rN   r   rD   rQ   r[   rt   r\   round)data_com_refplanenormal_vector_refplanelist_of_basesrotated_coordsnatoms
output_row
nucleotidecoordsnlast	nucl_datarH   rI   rL   rM   declinascenrs   s                     r7   
bases_datar      s    %&<>OPPN	AEJ#  
b"E	"111ag:.	8@8K8K5X}o&rwrv6Lm/\/\']']`m'morss$$%**+++% 1155666% 0!44555r9   c                    || |z
  z  }t          t          j        |                    }t          j        |t	          | d                   z  t          j                            |          z            }|S )Nr   )rr   rD   squarerZ   rm   rF   r}   )coords_matrixref_normal_vectorref_com	pointdisttotal_dist_sqoffpls         r7   offplanarityr      sb    !]W%<=I	),,--MGMCa(8$9$99BINNK\<]<]]^^ELr9   c                $    t          d           d S )Nhello)print)com1normal_vector1com2normal_vector2s       r7   horizontal_slider      s    	'NNNNNr9   trajmda.Universec           	     v  KLM d}| j         D ]}||_        |dz  }|                     dd                    t                    z             j         }t          t                              d |D                                 }t          |          }g g g g}g g g g}g g g g}g g g g}	g g g g}
g g g g}g g g g}g g g g}g g g g}g g g g}|D ]2}t          | |          \  }}}}}}}}t          j        ||f          }t          j        ||f          }t          j        ||f          }t          j        |	|f          }	t          j        |
|f          }
t          j        ||f          }t          j        ||f          }t          j        ||f          }t          |          \  }}}}t          j        ||f          }t          j        |t          j        |                              dd          f          }4g g gKt          |          D ]}t          |          D ]}|d d |f         |d d |f         z
  }t          j                            |          } |
d d |f         |d d |f         z
  }!t          j                            |!          }"| dk     r|"dk     r|d d |f         }#t          j        |#|| z            }$t          j        |#|!|"z            }%|$dz  d	k     rC|%dz  d	k     r:t          j        ||         g||         gg          }&t          j        K|&f          K	g }'t          |          D ]}(t          |(dz   |          D ]{})t          j                            |d d |(f         |d d |)f         z
            }*|*d
k     r=|'                    t)          ||(                   t)          ||)                   f           |t+          j                    }+|+                    |'           g },t+          j        |+          D ]}-|+                    |-          }.d |.                                D             }/|/r|/d         nt          |-          d         }0|,                    t          t+          j        |.|0                               g }1|,D ]'}2Kfd|2D             }3|3r|1                    |3           (g }4K                                }5t          |5          dk    r!|5d         j        dk    rt)          |5d         d                   }6t)          |5d         d                   }7|6|7g}8dg}9|7|6k    r{t          j        |5d         |7k              d         d         }:|9                    |:           t)          |5d         |:                   }7|7|6k    r|8                    |7           |7|6k    {t          j        |5|9d          }5|4                    |8           t          |5          dk    r|5d         j        dk    g };|1}<t          |<          rtA          d |<D                       L|!                    L          }=tE          |d d |=f         |	d d |=f         |d d |=f         |d d |=f                   }>d|>cxk     rdk     rn ndnd}?tG          LfdtI          |4          D                       }@|4|@         }A|A!                    L          }B|A|Bd          |Ad |B         z   }C|?dk    r)|C}D|Dd dd         }C|C%                    d|Dd                    |Cg}Eg }Fg M|Ed         D ]}GtI          |<          D ]{\  }H}I|G|Id         k    r+|F                    |I           M                    |H           <|G|Id         k    r3|F                    |Id d d                    M                    |H           |MfdtI          |<          D             }<t          j        |F          &                                '                                }J|;                    |J           t          |<          |;S )Nr?   zresname  c              3  $   K   | ]}|j         V  d S rP   )r&   ).0ress     r7   	<genexpr>z"detect_g4_units.<locals>.<genexpr>   s$      'N'Nc	'N'N'N'N'N'Nr9   r   g      @g@rX   g      ?   c                $    g | ]\  }}|d k    |S )r?    )r   r   ds      r7   
<listcomp>z#detect_g4_units.<locals>.<listcomp>  s!    666daqAvvvvvr9   r   c                0    g | ]}|d ddf         v |S r   Nr   )r   xbondss     r7   r   z#detect_g4_units.<locals>.<listcomp>  s/    :::1eAqqqDk)9)9Q)9)9)9r9   )rA   c              3  &   K   | ]}|d          V  dS r   r   )r   fcs     r7   r   z"detect_g4_units.<locals>.<genexpr>)  s&      <<r!u<<<<<<r9   gGzֿgQ?c              3  *   K   | ]\  }}|v 	|V  d S rP   r   )r   r   qinitialGs      r7   r   z"detect_g4_units.<locals>.<genexpr>5  s+      MM1x1}}!}}}}MMr9   rC   c                "    g | ]\  }}|v	|S r   r   )r   r   r   used_chain_ids      r7   r   z#detect_g4_units.<locals>.<listcomp>M  s2      
  
  
!Q%% %%%r9   )(residuesr&   r"   joinguanine_resnameslistdictfromkeysrm   r8   rD   hstackrN   rY   reshaper   rF   r}   r[   r\   intnxGraphadd_edges_fromconnected_componentssubgraphdegreedfs_preorder_nodescopysizewheredeleteminindexr   next	enumerateinsertr$   tolist)Nr   	new_residr   guanine_residuesguanine_residsNGs	coords_qwN9coords_qwN7coords_qwC1pcoords_qwO6coords_qwN2coords_qwN1coords_qwO4pcoords_qwcomsnormal_vectors	gua_residr   N9nucl_dataC1pnucl_dataO6nucl_dataN7nucl_dataN2nucl_dataN1nucl_dataO4pnucl_datarH   rI   rL   rM   iN7iN2	dist_vec1dist1	dist_vec2dist2nvec
angle_cos1
angle_cos2pairadjacentghdist
conn_graphchains	componentsubGendsstartfiltered_chainschain	new_chainquartets
bonds_leftfirstG
base_donorr   	cols_usedcolG4sfiltered_chains_leftinitialG_idchi_initialanti
quartet_id	initial_qidxinitial_q_reorderedtmpconnectivity_helperconnectivityGresidfc_idfilchainqsr   r   r   sN                                                                              @@@r7   detect_g4_unitsr8     sC	   I}  	Q		((SXX.///   $--'N'N=M'N'N'NNNOON
n

CRIr2,Kr2,KB<Lr2,Kr2,Kr2,KB<LB<D"b\N# L L	 $D)44		
 Iy)455	ik :;;ik :;;y,!=>>ik :;;ik :;;ik :;;y,!=>>8@8K8K5X}oy$%%N$&H]$;$;$C$CAq$I$I$K L L HESzz 5 5:: 	5 	5C#AAAsF+k!!!S&.AAIINN9--E#AAAsF+k!!!S&.AAIINN9--Es{{us{{ &aaaf-VD)e*;<<
VD)e*;<<
?S((Z1_s-B-B8',-',-%  D Iudm44E!	5$ H3ZZ : :q1uc"" 	: 	:A9>>$qqq!t*tAAAqDz"9::Daxx^A%6!7!7!$^A%6!7!7!9 : : :	: Jh'''F,Z88 @ @	""9--66dkkmm6667QT)__Q%7d20u==>>???? O . .:::::::	 	.""9--- HJ
j//A

*Q-"4q"8"8Z]1%&&Aq)**
Z C	F""(:a=J677:1=CS!!!Z]3/00JV##$$$ F"" Yz91===
 j//A

*Q-"4q"8"8 C*
"
#
# +<<';<<<<<$**844 $K(K(;';'	
 
 k1111E11111qqMMMM	((;(;MMMMM
Z(	ooh'''o	$3$? 199%C"%eqe*&&q#a&11123)!, 	0 	0F#,-A#B#B 0 0xXa[(( ''111!((////x|++ ''2777!((///0 
  
  
  
#$899 
  
  

 Xl##--//6688

2W "
#
# +Z Jr9   r7  List[List[int]]returnDict[str, Any]c                -   t          |          }t          j        |          }t          t          |t                               }t          j        dd|f          }g }g }g }g }	t          j        d||f          }
t          j        d||f          }t          j        d||f          }t          j        dd|f          }t          j        dd|f          }t          j        dd|f          }t	          |          D ]}t          ||                   ||<   g g g g}g g g g}g g g g}g g g g}||         D ]s}t          | |          \  }}}}}}}}t          j        ||f          }t          j        ||f          }t          j        ||f          }t          j        ||f          }tt          |          \  |dddd|f<   }|dddd|f<   |dddd|f<   |                    |           |                    |           |                    |           |	                    |           ||
dddd|f<   ||dddd|f<   ||dddd|f<   |dddd|f         t          j	        t          |d                             z  |dddd|f<   t          j
        |          }t          j
        |          }
t          j
        |          }t          j
        |	          }t          j        dd|f          } t          j        dd|f          }!t          j        dd|dz
  f          }"t          j        |          }#d|#d<   t          j        d|dz   dz  |f          }$t          j        dd|f          }%t          j        dd|f          }&t          j        dd|f          }'t          j        d|dz   |f          }(t          j        d|dz   |f          })|dk    rEt          |dddddf         |dddddf         z
  |dddddf                   | dddddf<   n|dddddf         | dddddf<   t	          d|          D ]}t          |dddd|f         |dddd|dz
  f         z
  |dddd|f                   | dddd|f<   | dddd|dz
  f         | dddd|f         z   t          j                            | dddd|dz
  f         | dddd|f         z             z  |!dddd|dz
  f<   |!dddd|dz
  f         |dddd|f         |dddd|dz
  f         z
  z  |"dddd|dz
  f<   t          j                            |dddd|f         |dddd|dz
  f         z
            |#|<   t          | dddd|dz
  f         d         t          j        |
|dz
  dddf                             dd          |dddd|dz
  f         z
  | dddd|f                                         |dddd|f         |dddd|dz
  f         z
  f                    |%dddd|dz
  f<   t          j                            |%ddd|dz
  f                   |'ddd|dz
  f<   t#          |%ddd|dz
  f         |%ddd|dz
  f                   |'ddd|dz
  f<   t          j        |%dd|dz
  f                   |&ddd|dz
  f<   t#          |%ddd|dz
  f         |%ddd|dz
  f                   |&ddd|dz
  f<   t          |!dddd|dz
  f         d         t          j        |
|dz
  ddddf         |
|ddddf         | dddd|dz
  f                                         | dddd|f                                         |dddd|dz
  f         |dddd|f         f          |dddd|dz
  f         |dddd|f         z   dz  z
            |$dddd|dz
  f<   t'          ||dz
           |$dddd|dz
  f                   |(dddd|dz
  f<   t'          ||dz
           t          |!dddd|dz
  f         d         t          j        ||dz
  ddddf         ||ddddf         |dddd|dz
  f         |dddd|f         f          |dddd|dz
  f         |dddd|f         z   dz  z
                      |)dddd|dz
  f<   t          j        d|dz  |f          }*t          j        dd|f          }+t          j        dd|f          },t          j        dd|f          }-t          j        dd|f          }.t)          |d         |
dddddf                   |-dddddf<   t)          |d         |dddddf                   |.dddddf<   g }/t	          |          D ]}t+          ||ddddf         | dddd|f         d         ||                   |*dddd|f<   t          j        ||ddddf         dd	
          |+dddd|f<   | dddd|f         |+dddd|f         |dddd|f         z
  z  |,dddd|f<   t)          ||         |
|ddddf                   |-dddd|f<   t)          ||         ||ddddf                   |.dddd|f<   |/                    d                    |dz   d                    t3          t4          t          j                            t          j        |*dddd|f         d                                                             |ddddt=          j        |dz            dz
  f         }0t=          j        |dz   dz            dz  }1d}2|dz
  }3| dddd|2f         | dddd|3f         z   t          j                            | dddd|2f         | dddd|3f         z             z  |!dddd|dz
  f<   t          | dddddf         d         t          j        |
ddddf                             dd          |dddddf         z
  | dddd|dz
  f                                         |dddd|dz
  f         |dddddf         z
  f                    |%dddd|dz
  f<   t          j                            |%ddd|dz
  f                   |'ddd|dz
  f<   t#          |%ddd|dz
  f         |%ddd|dz
  f                   |'ddd|dz
  f<   t          j        |%dd|dz
  f                   |&ddd|dz
  f<   t#          |%ddd|dz
  f         |%ddd|dz
  f                   |&ddd|dz
  f<   t          |!dddd|dz
  f         d         t          j        |
|2ddddf         |
|3ddddf         | dddd|2f                                         | dddd|3f                                         |dddd|2f         |dddd|3f         f          |dddd|2f         |dddd|3f         z   dz  z
            |$dddd|dz
  f<   t'          ||2         |$dddd|dz
  f                   |(dddd|dz
  f<   t'          ||2         t          |!dddd|dz
  f         d         t          j        ||2ddddf         ||3ddddf         |dddd|2f         |dddd|3f         f          |dddd|2f         |dddd|3f         z   dz  z
                      |)dddd|dz
  f<   t          j        t          j        |(ddddddf         d          dz  d          }4t          j        t          j        |)ddddddf         d          dz  d          }5|/                    dd                    t3          t4          t          j                            |4                              z              |/                    dd                    t3          t4          t          j                            |5                              z              |/                    dd                    t3          t4          t          j        |'dddddf         d         d                              z   dz   d                    t3          t4          t          j        |'dddddf         d         dz  d                              z   dz   d                    t3          t4          t          j        |&dddddf         d         dz  d                              z   dz   d                    t3          t4          t          j        |&dddddf         d         dz  d                              z              |/                    dd                    t3          t4          t          j        |d         d         d                              z   dz   d                    t3          t4          t          j        |"d         d         d                              z   dz   d                    t3          t4          t          j        |(dddddf         d         dz  d                              z   dz   d                    t3          t4          t          j        |)dddddf         d         dz  d                              z   dz   d                    t3          t4          t          j        |,d         d         d                              z   dz   d                    t3          t4          t          j        |-d         d         d                              z   dz   d                    t3          t4          t          j        |.d         d         d                              z              g }6t@          D ]q}7tC          | |7          }8|8j"        dk    rt          j        t          |8d                             }9t	          t          |8d                             D ]}:|8dd|:f         ddt          j#        f         };t          j                            |;|0z
            }<|<|1k    rd|9|:<   Qd}||k     rL|9|:         dk    r?|;|dddd|f         z
  }=| dddd|f         |=z  }>|>dk     rt          j                            |=          |#|         k     r||dk    r|dz   |>d         d         dz  z   |9|:<   n|=                                |dddd|dz
  f         |dddd|f         z
  z  |#|         dz  z  }?|dz   |?d         d         z
  |9|:<   nXd|9|:<   nR||dz
  k    rIt          j                            |=          |#d         k     r|dz   |>d         d         dz  z   |9|:<   nd|9|:<   |dz  }||k     r|9|:         dk    ?|9j"        dk    rV|7dv rd}@n|7dv rd}@n	|7dv rd}@n|7}@|@dz   d                    t3          d |9                    z   }A|6                    |A           s|6D ]}B|/                    d|Bz              ||4$                                |5$                                |6|/dS )u   
    Vypočte metriky (Qps, Ntws, Ctws, Ions, G4ps, ...) pro jednu G4 jednotku (= jeden qs blok).
    Vrací dict s čísly + textový log.
    )keyr   r?   Nr   g333333@rX   rC   Tr@   z	Q{}ps: {}r   r   )rX   r?   r   r   zNtws: zCtws: zIntQ: zG4ps: )r   r   r   )r   r   r   r   )r   r   r   r   r   c                <    t          t          | d                    S )Nr   )strr   )r   s    r7   <lambda>z(analyze_single_subunit.<locals>.<lambda>  s    c%1++.. r9   zIons: )planesNtws_degCtws_degion_reports	log_lines)%rm   rD   r   maxr   r8   r   rN   r\   rZ   rY   rU   rF   r}   rj   r   r$   rz   r   r   r   r   rE   r!   r   mapr?  ndarrayflattenr   mathceilion_type_candidatesr=   r   newaxisr   )Cr   r7  rA  qlsmax_units_in_planer  data_coms_listNcoords_qs_listCcoords_qs_listO6coords_qs_list
Ncoords_qs
Ccoords_qsO6coords_qsr  normal_singularsplanaritiesplaner   
Ncoords_qw
Ccoords_qwr   r   r   r0   r1   r  r  r  r	  r
  	data_comw	data_comsonormal_vectorsavg_normal_vectors	distances	dist_comsrotated_Ncoordsrotated_Ncoords_localquartet_tilt_localcom_displacementNtwsCtwsbases_outputscomO6s	zdisplO6sNexcentricityO6excentricityrE  midcomlimitfirstlastrB  rC  rD  ion_speccoords_ionsion_posion_id	ion_coorddistmidion_coord_s	direction
projectionion_oution_desclinesC                                                                      r7   analyze_single_subunitr}  X  s   
 WWF
(F

CS---..8Q6N##DNOO10&9::J10&9::J(A16:;;KXq!Vn--NxAv//(Aq&>**Kv ^ ^E^^E
RL	"b\
"b\
2rlU) 	@ 	@J 5T:FFY	9i"899IJ#>??JJ#?@@J)[+$>??KKcklucvcv`QQQ5[9nQQQ5[&ACSTUTUTUWXWXWXZ_T_C`i(((z***z***,,,",
111aaa;",
111aaa;#.AAAqqq%K #3AAAqqq%K#@273yYZ|K\K\C]C]#]AAAqqq%K  ((I/**J/**J(+,,Kh1f~..O1a.11!Q
+,,I&""IIaLh$6$:a#?HIIOHaF^441a.11xAv//8Q*Q.788D8Q*Q.788D zz#,AAAqMDAAAqM)111aaa7#$
 $
111a   $2!!!QQQ'#:111a  q&!! D
 D
'0AAAuQQQ519_ 55111aaa;'(
 (
111e$ 7FaaaETUIo6VYhijijijlmlmlmotitYu6u24)..AAAqqq%!)O,qqq!!!U{/KK3
 3
/
111aaa?+ &8111eai%HQQQ5[!DAAAuqy$99&
	!!!QQQ	/" 9>>AAAuQQQ519_ 55
 
	% 2BAAAqqq%!)O,Q/IEAIqqq!O,44R;;d111aaaQR?>SS111e,6688QQQ5[!DAAAuqy$99  2
 2
aaaEAIo. -/INN!!A#r519"45-
 -
AAAuqy) -@!!!!R"23!!!!Q	/2-
 -
AAAuqy)
 /1i!!Q	/2/
 /
1aaa?+ /B!!!!Q	/2!!!!Q	/2/
 /
1aaa?+
 ,<qqq!!!UQY/2I519aaa?+5!!!QQQ;'111eai0::<<111e,6688QQQ519_%QQQ5[!   qqq!!!UQY'$qqq!!!U{*;;q@A
,
 
,
111eai( !&bm_QQQ5ST9_5U V VQQQ519_ %uqyM"111aaa?3A6	uqy!!!QQQ/uaaa{+AAAuqy)AAAu%	  
 111aaa?+d111aaa;.??1DE !
 !
QQQ519_ Ha!3a!7@AAMXq!Vn%%F!Q((IHaF^,,MXq!Vn--N)"Q%Aqqq!!!G1DEEM!!!QQQ'*2a5+aAAAg2FGGN111aaa7Iv 
 
%/eQQQk"AAAqqq%K(+uI&
 &
aaaEk"
 !gk%AAA+&>QQUVVVqqq!!!U{!0AAAu!=qqq!!!U{#d111aaa;&77"
	!!!QQQ+ &2uIz%AAA+.&
 &
aaaEk" '3uI{5!!!QQQ;/'
 '
qqq!!!U{#
 		SZ//!#-111e*Da!H!H       		
 		
 		
 		
 !!!QQQ	&1*--112FIvzQ&''!+EEA:D 4C111aaa;3ORabcbcbcefefefhlblRm3m/1y~~111e$qqq!!!Tz'BB0 0,qqq!!!VaZ'( /?111a #
	111a ((Q//$qqq!!!Qw-?AAAqqq&1*,-7799AAAvz!"T!!!QQQ']2
 	 	/ /!!!QQQ
*+ *,ac2vz12* *Q6A:%& *=aaaVaZ/0aaaFQJ./* *Q6A:%&
 ,.9aFQJ./, ,q!!!VaZ'( ,?aaaFQJ./aaaFQJ./, ,q!!!VaZ'(
 )9111aaa!+,Q/
	uaaa{#tQQQz"AAAqqq%K(2244AAAqqq$J'1133AAAuAAAt
 	 	 111aaa;$qqq!!!Tz"22a7	8
) 
)OAAAqqq&1*$% #2e9oaaaFQJ>N.OPPDAAAvz	"
5	qqq!!!VaZ/03I5!!!QQQ;'4AAA:&QQQ5[!QQQ4Z 	  
 qqq!!!U{#d111aaa:&66!;<	
 	
 DAAAvz	 x
T!!!QRR(^Y//(:	 H x
T!!!QRR(^Y//(:	 H
 388C "
 2 28 < <" " # # 	#  
 388C "
 2 28 < <" " # # 	#   S"(#3Aqqq!!!G#<Q#?CCDDEE	FHK	LS"(#3Aqqq!!!G#<Q#?(#JANNOOPP	QSV	W 	S"(#5aAAAg#>q#AH#LaPPQQRR	S VY	Y 	S"(#5aAAAg#>q#AH#LaPPQQRR		S   S"(;q>!#4a8899::	;=@	AS"(9Q<?A667788	9;>	? 	S"(41aaa=#3h#>BBCCDD	E HK	K 	S"(41aaa=#3h#>BBCCDD		E HK		K
 	S"(9Q<?A667788	9
 <?	? 	S"(=#3A#6::;;<<	= @C	C 	S"(>!#4Q#7;;<<==	>	 	 	 K' 0) 0)+D(;;q  (CA//11CA//00 	 	F$QQQY/BJ?IinnY%788G"$fnnA)=)="+d111aaa;.?"?K /111e <{ JI 1}}9>>+6659III$zz27!)il1oPS>S2S *5)>)>)@)@DAAAuWXyDY\`abababdededeglal\mDm)n+4U+;q+@)B !+ 38!)jmA>N2N.0GFOO&1*,,9>>+661EE.3ai)A,q/C:O.OGFOO.0GFOQJE) fnnA)=)=, <!;&&000888 "}sxx..88( ( H x((( * *D)))) OO%%OO%%"  r9   pdb_pathr?  c                   t          j                    }t          j        |          5  t	          j        | d          }t          |          }g }t          |d          D ]4\  }}t          ||          }||d<   ||d<   |	                    |           5|
                                }ddd           n# 1 swxY w Y   g }	|D ]D}
|		                    d|
d          d	|
d                     |	                    |
d
                    E|                                r*|		                    d           |		                    |           d|d                    |	          dS )u  
    Tohle je hlavní funkce, která odpovídá tomu,
    co původní skript dělal pro jeden soubor.
    - načte Universe
    - sestaví G4s (detekce qs bloků)
    - pro každou podjednotku spočítá metriky
    - vrátí všechno jako dict + text log
    T	in_memoryr?   r  subunit_indexr7  Nz	#subunit z qs=rE  --- raw stdout ---
)oksubunitstext)ioStringIO
contextlibredirect_stdoutmdaUniverser8  r   r}  r\   getvalueextendstripr   )r~  bufr   r(  results_subunitssub_idxr7  sub_rescaptured_stdoutfull_text_linessubs              r7   run_analysisr    s    +--C		#C	(	( ) )|H555 d##$S222 	- 	-KGR,T266G'.GO$GDM##G,,,,,,..) ) ) ) ) ) ) ) ) ) ) ) ) ) ) O 1 1P3+?PPSYPPQQQs;/0000 03444/// $		/**  s   BB66B:=B:
parm7_pathxtc_pathc                   t          j                    }t          j        |          5  t	          j        | |d          }g }|j        D ]}t          |          }g }t          |d          D ]4\  }}	t          ||	          }
||
d<   |	|
d<   |
                    |
           5|
                    t          |j                  t          t          |dd                    |d	           |                                }d
d
d
           n# 1 swxY w Y   g }|D ]w}|
                    d|d          d|d          d           |d         D ]D}|
                    d|d          d|d                     |                    |d                    Ex|                                r*|
                    d           |
                    |           d|d                    |          dS )u   
    Analyzuje trajektorii pomocí MDAnalysis:
    - vytvoří Universe(parm7, xtc)
    - projde všechny framy
    - detekuje G4
    - vypíše log
    Fr  r?   r  r  r7  timer   )frametime_psr  Nz
### frame r  z time=r  z psr  z
# subunit z  qs=rE  r  Tr  )r  framesr  )r  r  r  r  r  r  
trajectoryr8  r   r}  r\   r   r  floatgetattrr  r  r  r   )r  r  r  u
all_framestsr(  frame_resultsr/  r7  q_resr  linesfrr  s                  r7   run_analysis_trajectoryr    sj    +--C		#C	(	( ) )LX???
, 	 	B!!$$CM$S222 , ,R.q"55),o& d$$U++++RX VQ!7!788)      ,,..+) ) ) ) ) ) ) ) ) ) ) ) ) ) )0 E + +G"W+GGR	]GGGHHHj> 	+ 	+CLLLc/&:LLTLLMMMLL[)****	+  &)***_%%% 		%    s   CD

DDpdbstructure_textfmtc                   |                                 dk    rdnd}t          j        d|          5 }|                    |                     dd                     |j        }d	d	d	           n# 1 swxY w Y   	 t          |          }d
|t          j        	                    |          |d	 t          j
        |           S # t          $ r Y S w xY w# 	 t          j
        |           w # t          $ r Y w w xY wxY w)u   
    Tohle volá Flask route.
    - vezme string PDB/CIF od uživatele
    - uloží ho do dočasného souboru
    - pustí run_analysis()
    - smaže dočasný soubor
    cifz.cifz.pdbF)r   suffixzutf-8r   )errorsNT)r  r!   tmp_pathresult)lowertempfileNamedTemporaryFilewriteencodenamer  ospathbasenameremoveOSError)r  r  r  r1  r  analysis_results         r7   analyze_structure_textr  #  s_    yy{{e++VVF		$E&	A	A	A S		.'''AABBB8              &x00((22%	
 
	Ih 	 	 	D		Ih 	 	 	D	sS   2A11A58A5=2C 0C
CCC<C,+C<,
C96C<8C99C<c                .    t          | |          }dd|dS )NTr  )r  r!   r  )r  )r  r  r  s      r7   analyze_trajectory_filesr  @  s!    $Z::F,&AAAr9   )r   r   )r   r   r7  r9  r:  r;  )r~  r?  r:  r;  )r  r?  r  r?  r:  r;  )r  )r  r?  r  r?  r:  r;  )+
__future__r   r  r  rJ  r  r  typingr   r   r   r   numpyrD   
MDAnalysisr  networkxr   warningsfilterwarningsr   rL  r8   r=   rN   rU   rj   rp   rt   rz   r   r   r   r   r   r   r   r8  r}  r  r  r  r  r   r9   r7   <module>r     sU   " " " " " " ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )                ! ! !   
 POO B B B*  	9 	9 	9  
  $    
  
 
 
% % %  $    *    a a a aHk k k k\% % % %P0 0 0 0j    :B B B B B Br9   