a
     ɝh&                     @   s   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 d dl	m
Z
 d dlmZ dd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    N)	Structure)SpacegroupAnalyzer)	CifWriterc                 C   s  t j|st | i }| D ]p}z| d}ddlm} ||}tj	|dd}|
 }t j|jd }	|||	< t|dd}
t j||j}|
| td|	  W q ty } ztd	|j d
t|  z^t j||j}t|d}||  W d   n1 s0    Y  td|j  W n@ tyx } z&td|j d
t|  W Y d}~n
d}~0 0 W Y d}~qd}~0 0 q|tj_|S )a   
    Process and save uploaded files, converting structures to primitive format.

    :param uploaded_files: List of uploaded files
    :param root_dir_path: Root directory path for saving files
    :return: Dictionary with filenames as keys and primitive structure objects as values
    zutf-8r   )StringIOcif)fmtg?)ZsymprecSuccessfully processed Error processing : wbNzSaved original file zError saving original file )ospathexistsmakedirsgetvaluedecodeior   r   Zfrom_strget_primitive_structuresplitextnamer   join
write_fileprint	Exceptionstropenwritestsession_stateprimitive_structures)uploaded_filesroot_dir_pathr   uploaded_filestring_datar   Zstructure_string	structureprimitive_structure	file_namewriterZ	save_pathefZ
save_error r*   3/var/www/html/AI4Kappa/streamlit_scripts/file_op.pyprocess_and_save_uploaded_files   s6    	


.Hr,   c              
   C   sr   z&t | }tdtj|   W dS  tyl } z.tdtj|  dt|  W Y d}~dS d}~0 0 dS )zCheck if CIF file is validzValid CIF file: TzInvalid CIF file r
   NF)r   	from_filer   r   r   basenamer   r   )	file_pathr$   r(   r*   r*   r+   is_valid_cifH   s    
 r0   c              
   C   s   zBi }| j j|d< | j|d< | j|d< tdd | jD |d< |W S  tyz } z tdt|  W Y d}~dS d}~0 0 dS )	zGet crystal structure datazNumber of AtomszDensity (g cm-3)u   Volume (Å3)c                 S   s   g | ]}|j jqS r*   )ZspecieZatomic_mass).0Zsiter*   r*   r+   
<listcomp>Y       z(get_crystalline_data.<locals>.<listcomp>zthe total atomic mass (amu)zError in get_crystalline_data: N)	compositionZ	num_atomsdensityvolumesumZsitesr   r   r   )r$   datar(   r*   r*   r+   get_crystalline_dataR   s    

r9   c                 C   s  zt  tj| d}|s4td|   t W S tdt| d g }g }|D ]}ztjtj	|d }td|  t
tjdr|tjjv rtjj| }nt|}| }t|}|dur|| || td	|  ntd
|  W qT tyB }	 z,td| d|	  W Y d}	~	qTW Y d}	~	qTd}	~	0 0 qT|s^td t W S t|}
||
_tdt|
 d td|
j  |
W S  ty }	 z&tdt|	  t W  Y d}	~	S d}	~	0 0 dS )zGGet crystal data for all structures in directory (primitive structures)z*.cifNo CIF files found in zFound z
 CIF filesr   z
Processing file: r   Nr   zFailed to extract data from r	   r
   zNo valid crystal data foundz%
Successfully created DataFrame with  entrieszDataFrame columns:z#Error in get_dir_crystalline_data: )globr   r   r   r   pd	DataFramelenr   r.   hasattrr   r   r   r   r-   r   r9   appendr   indexcolumnstolistr   )r!   cif_path_list	data_list
file_namescif_pathr&   r%   r$   r8   r(   dfr*   r*   r+   get_dir_crystalline_data_   sH    



$

rJ   c           
      C   s*  zt j| }ttjdr4|tjjv r4tjj| }nt| }t	|}|
 }|j}|j|j|j|j|j|jd}| }d|jj d|d  d|d  d|d	 d
d|d d
d|d d
d|d d
d|d d
d|d d
d}|W S  ty$ }	 z tdt|	  W Y d}	~	dS d}	~	0 0 dS )zGet crystal structure contentr   )_cell_length_a_cell_length_b_cell_length_c_cell_angle_alpha_cell_angle_beta_cell_angle_gammaz7
        <p style='font-size: 18px;'>
        Formula: z<br>
        Space group: r   z (   z!)<br>
        _cell_length_a     rK   z.8fz <br>
        _cell_length_b     rL   z <br>
        _cell_length_c     rM   z <br>
        _cell_angle_alpha  rN   z <br>
        _cell_angle_beta   rO   z <br>
        _cell_angle_gamma  rP   z<br>
        </p>
        z#Error getting crystalline content: Nz6Error: Could not extract crystal structure information)r   r   r.   r@   r   r   r   r   r-   r    get_primitive_standard_structurelatticeabcalphabetagammaZget_space_group_infor4   formular   r   r   )
rH   r&   r%   r$   analyzerrS   Zcell_paramsZspacegroup_infocontentr(   r*   r*   r+   get_crystalline_content   sN    

	
r]   c              
   C   s   zt  tj| d}|s2td|   g g fW S dd |D }|sVtd g g fW S t|dd}tj| d}|j|d	d
 tdt| d ||fW S  t	y } z&tdt
|  g g fW  Y d}~S d}~0 0 dS )z9Create id_prop.csv file and return list of CIF file pathsz*.[cC][iI][fF]r:   c                 S   s$   g | ]}t j|rt j|qS r*   )r   r   r   r.   )r1   r   r*   r*   r+   r2      r3   z"create_id_prop.<locals>.<listcomp>zNo valid CIF files foundr   )r   targetid_prop.csvF)rB   zCreated id_prop.csv with r;   zError creating id_prop.csv: N)r<   r   r   r   r   r=   r>   to_csvr?   r   r   )r!   rE   cif_name_listrI   Zcsv_pathr(   r*   r*   r+   create_id_prop   s"    


rb   c                 C   sR   t | D ]B}t j| |}| dsB|dksB|dksB|dkr
t | q
dS )z&Delete CIF and related temporary filesz.cifr_   zpre-trained.pth.tartest_results.csvN)r   listdirr   r   lowerendswithremove)r   filer/   r*   r*   r+   del_cif_file   s    &ri   c                 C   s(   t j| d}t j|r$t | dS )zDelete temporary filesrc   N)r   r   r   r   rg   )r   Ztest_resultsr*   r*   r+   del_temp_file   s    rj   c              
   C   s~   zFt  tj| dD ],}tj|dkrt| td|  qW n2 tyx } ztd|  W Y d}~n
d}~0 0 dS )z:Clean root_dir directory, keeping only atom_init.json file*zatom_init.jsonz	Removed: zError cleaning root_dir: N)r<   r   r   r   r.   rg   r   r   )r!   r/   r(   r*   r*   r+   clean_root_dir   s    
rl   )r   r   r<   pandasr=   	streamlitr   Zpymatgen.corer   pymatgen.symmetry.analyzerr   Zpymatgen.io.cifr   r,   r0   r9   rJ   r]   rb   ri   rj   rl   r*   r*   r*   r+   <module>   s    9
8-