U
    bb                     @   sz  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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  mZ d dlZd dlmZ d dlmZ d dlmZ d dlZd dlZe Zdvd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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,d- Z0d.d/ Z1dwd1d2Z2d3d4 Z3d5d6 Z4d7d8 Z5d9d: Z6d;d< Z7d=d> Z8d?d@ Z9dAdB Z:dCdD Z;dEdF Z<dGdH Z=dIdJ Z>dKdL Z?dMdN Z@dOdP ZAdQdR ZBdSdT ZCdUdV ZDdWdX ZEdYdZ ZFd[d\ ZGd]d^ ZHd_d` ZIdadb ZJdcdd ZKdxdfdgZLdhdi ZMdjdk ZNdldm ZOdndo ZPdpdq ZQdrds ZRdtdu ZSdS )y    )print_functionN)Path)	natsorted)Template)PathFind)	Sentinel1c                 C   s   t jdd}t|}|dkr$t|}|dkr4t|}|dkrDt|}|dkrTt|}|dkrdt|}|dkrtt|}|d	krt	|}|d
ks|dks|dkrt
|}|j| d}t|}|S )zCommand line parser.zMinSAR scripts parser)descriptiondownload_rsmasZcreate_runfilesZ	dem_rsmasZexecute_runfilesZexport_amplitude_tifZemail_resultsZgenerate_chunk_template_filesZsmallbaseline_wrapperZingest_insarmapsZminopy_wrapper)args)argparseArgumentParseradd_common_parseradd_download_dataadd_create_runfilesadd_download_demadd_execute_runfilesadd_export_amplitudeadd_email_args&add_generate_chunk_template_files_argsadd_notification
parse_argscreate_or_update_template)iargsscriptparserinps r   E/home/centos/operations/rsmas_insar/minsar/utils/process_utilities.pycmd_line_parse#   s*    r   c                 C   s   |  d}|jdddd |jdddd	d
 |jddddd |jddddd |jddddd |jddtddd |jdddd d | S )!NzGeneral options:custom_template_file?z&custom template with option settings.
)nargshelpz-vz	--versionversionz%(prog)s 0.1)actionr#   z--submitsubmit_flag
store_truezsubmits jobdestr$   r"   z
--walltime	wall_timezWALLTIME (HH:MM)z+walltime for submitting the script as a jobr(   metavarr"   z--queueZqueueZQUEUEzName of queue to submit job toz--reserveNodeZreserve_node   znumber of nodes to reserver(   typedefaultr"   z--remoraZremoraz!use remora to get job informationadd_argument_groupadd_argumentint)r   Zcommonpr   r   r   r   @   s    

r   c                 C   sX   |  d}|jdddddd |jddd	d
d |jddddd |jddddd | S )Nz"create run files and jobs options:z--tmpcopy_to_tmpr&   Tz?writes job files to run on /tmp rather than /scratch [default].r(   r$   r/   r"   z--no_tmpstore_falsez5writes job files to run on /scratch rather than /tmp.r'   z
--jobfilesZ
write_jobsz*writes the jobs corresponding to run filesz--ignore_stackZignore_stackzVignores existing stack by temporay renaming /coreg_secondarys to /tmp_coreg_secondarysr1   r2   r   Z
run_parserr   r   r   r   P   s    



r   c                 C   sj   |  d}|jdddtdd |jddtd	d
 |jddtdd
 |jddtdd
 |jddtdd
 | S )NzDownload data options:z--delta_lat	delta_latz0.0z?delta to add to latitude from boundingBox field, default is 0.0r(   r/   r.   r"   z--seasonalStartDateZseasonalStartDatezseasonal start date to specify download dates within start and end dates, example: a seasonsal start date of January 1 would be added as --seasonalEndDate 0101r(   r.   r"   z--seasonalEndDateZseasonalEndDatezseasonal end date to specify download dates within start and end dates, example: a seasonsal end date of December 31 would be added as --seasonalEndDate 1231z
--parallelparallelz@determines whether a parallel download is required with a yes/noz--processesZ	processeszspecifies number of processes for the parallel download, if no value is provided then the number of processors from os.cpu_count() is used)r1   r2   floatstrr3   r   Zflag_parserr   r   r   r   ]   s"    




r   c                 C   sJ   |  d}|jdddddd |jdd	ddd
d |jdddddd | S )NzDownload DEM flags:z--ssaraZ
flag_ssarar&   FzVrun ssara_federated_query w/ grd output file, set as default [option for dem_rsmas.py]r5   z--boundingBoxZflag_boundingBoxzYrun dem.py from isce using boundingBox as lat/long bounding box [option for dem_rsmas.py]z--ssara_kmlZflag_ssara_kmlz?get boundingBox from ssara_*.kml file [option for dem_rsmas.py]r7   r?   r   r   r   r   l   s(    
r   c                 C   s^   |  d}|jdddtdd |jdddtd	d |jd
dtddd |jddtddd | S )NzSteps of ISCE run files--startZ	start_runr   z(starting run file number (default = 1).
r:   --stopZend_runzstopping run file number.
--dostepstepSTEPz!run processing at the # step only)r(   r.   r+   r"   z--numBurstsZ
num_burstsznumber of burstsz&number of bursts to calculate walltimer0   r8   r   r   r   r      s    
r   c                 C   s   |  d}|jdddtdd |jddd	td
dd |jdddtddd |jdddtdd |jdddtdd |jdddtddd |jdd d!td"d#d |jd$d%d&d'd( | S ))Nz2Options for exporting geo/ortho-rectified productsz-fz--fileZ
input_filez	Input SLCr;   z-lz--latZlat_filez
lat.rdr.mlz!latitude file in radar coordinater-   z-Lz--lonZlon_filez
lon.rdr.mlz"longitude file in radar coordinatez-y	--latSteplat_stepz(output pixel size in degree in latitude.z-xz	--lonStepZlon_stepz)output pixel size in degree in longitude.z-rz--resamplingMethodZresampling_methodZnearz.Resampling method (gdalwarp resamplin methods)-tz--typeZim_typeZorthoz
ortho, geoz--outDirout_dirZimage_productszoutput directory.r(   r/   r"   )r1   r2   r>   r=   )r   Zproductsr   r   r   r      s0    
  r   c                 C   sJ   |  d}|jdddddd |jddd	dd
d |jdddddd | S )Nz%Option for emailing insarmaps result.z--mintpyr&   Zemail_mintpy_flagFzEmail mintpy resultsr$   r(   r/   r"   z--minopyZemail_minopy_flagzEmail minopy resultsz--insarmapsZemail_insarmaps_flagzEmail insarmaps resultsr7   )r   Zemr   r   r   r      s    
r   c                 C   s   |  d}|jddddd |jddtd	d
d |jddtddd |jddddd |jddddd |jddddd |jddtddd | S )Nz-Options for generating  template file chunks.z--scriptZbash_scriptzminsarApp.bashzZbash script for command creation [minsarApp.bash|run_workflow_bash] (default: %(default)s)rI   rE   rF   g      ?z1chunk size in latitude [degrees] (default = 1.0)
r-   z--latMarginZ
lat_marging?z,margin to latStep [degrees] (default = 0.1)
r@   
start_steprD   z9start processing at the named step (default: %(default)s)r*   z--endend_stepz7end processing at the named step (default: %(default)s)rB   Zdo_step%run processing at the named step onlyz--wait	wait_time   z?wait time between job submission [secs] (default: %(default)s)
)r1   r2   r=   r3   )r   argr   r   r   r      s.    




r   c                 C   s"   |  d}|jdddddd | S )NzFlags for emailing results.z--emailr&   ZemailFzopt to email resultsrJ   r7   )r   ZNOr   r   r   r      s
    
r   c              	   C   s   t  \}}| d|}|jddddd |jdddd	d |jd
dd|d d|d d |jddd|d d|d d |jddddd | S )Nz!steps processing (start/end/step)z-HZprint_templater&   z)print the default template file and exit.r'   z--removeProjectDirZremove_project_dirz'remove directory before download startsr@   rK   rD   r   z/start processing at the named step, default: {})r(   r+   r/   r"   rA   rL   z-end processing at the named step, default: {}rB   rC   rM   r*   )pathObjZprocess_rsmas_helpr1   r2   format)r   Z	STEP_LISTZ	STEP_HELPZprsr   r   r   add_process_rsmas   s$    


rT   c                 C   s$   | D ]}t j|rt| qdS )z% Removes given existing directories. N)ospathisdirshutilrmtree)Zdirectories_to_delete	directoryr   r   r   remove_directories   s    r[   c                 C   s$   d}| r t jt j| d }|S )z2 Restores project name from custom template file. Nr   )rU   rV   splitextbasename)r   project_namer   r   r   get_project_name   s    
r_   c                 C   s>   t d| \}}d| krd}nd| kr,d}ntd|||fS )zT splits project name into location name, satellite and direction, and track number. zSenAT|SenDTZSenATZSenDTz.ERROR project name must contain SenDT or SenAT)resplit	Exception)r^   Zlocation_nameZ	sat_trackZsat_directionr   r   r   split_project_name   s    rc   c                 C   s>   | s.dt jkr&|r&t dd | } nt  } t j| } | S )z0 Sets the working directory under project name. Z
SCRATCHDIR/)rU   environgetenvgetcwdrV   abspath)work_dirr^   r   r   r   get_work_directory  s    rj   c                 C   st   | }t d t d|j t|j|_t d|j td|j|_t d|j tj|jshtj	|jdd t
|}|S )z] Creates a default template file and/or updates it.
        returns the values in 'inps'
    z2
*************** Template Options ****************zCustom Template File: zProject Name: Nz
Work Dir: Texist_ok)printr   r_   r^   rj   ri   rU   rV   existsmakedirscreate_default_template)	inps_dictr   r   r   r   r     s    r   c              
   C   s  | }t j|j|_t j|jt j|j|_t|j}d|j	krTt
d d|_n|j	d |_t|j}|D ]}||j	krptd|qpttj}tdd}| D ]p}||D ]`\}}	|jdkr|dp|jdko|d}
|
r|j	| q|j	|t j|	di qq|j	|_t| |j	 D ]2\}}|d	kr8|j|t j|di q8t j|jst|j|j nt|j| t||_ |j	t!|j	 |" |_#|S )
zh
    :param temp_inps: input parsed arguments
    :return Updated template file added to temp_inps.
    acquisition_modez`WARNING: "acquisition_mode" is not given --> default: tops   (available options: tops, stripmap)topszERROR: {0} is requiredzminsar_template_defaults.cfg)config_fileZstripmap')Nauto)$rU   rV   rh   r   joinri   r]   template_filer   optionsrm   prefixrR   Zrequired_template_optionsrb   rS   Zauto_templateget_config_defaultssectionsitems
startswithpopupdate
expandvarsstriptemplateZset_isce_defaultsrn   rX   copyfileupdate_template_fileZgrab_cropboxZcropboxcorrect_for_ssara_date_formatgenerate_ssaraopt_stringssaraopt)Z	temp_inpsr   Zcustom_tempObjZrequired_template_keysZtemplate_keyZdefault_tempObjZconfig_templateZeach_sectionZeach_keyZeach_valstatuskeyvaluer   r   r   rp   4  sD    




"

"
rp   c              	   C   s   t | }d}|j D ].\}}||jks6|j| |kr||j|< d}q|rtd d}|j D ]0\}}|d| dd|d d	 }q`t| d
}|| W 5 Q R X ntd|  dS )z
    updates final template file in project directory based on custom template file
    :param TEMP_FILE: file to be updated
    :param custom_templateObj: custom template having extra or new options
    :return: updated file text
    FTUpdating template filez&#####################################
{:<38}{:<15}= {}ru   
wz$template file exists: {}, no updatesN)r   ry   r}   rm   rS   r   open
writelines)	TEMP_FILEZcustom_templateObjtempObjZupdate_statusr   r   fileTextfiler   r   r   r   u  s    
*r   c              	   C   sl   t d d}|j D ]0\}}|d| dd|d d }qt| d}|| W 5 Q R X d	S )
z
    writes template file in project directory based on custom template file
    :param TEMP_FILE: file to be writtem
    :param tempObj:  template to be written
    :return: written file text
    r   (#######################################
r   r   r   ru   r   r   N)rm   ry   r}   rS   r   r   r   )r   r   r   r   r   r   r   r   r   write_template_file  s    *r   c                 C   s   t | d}| }dddg}ddddg}d}d}|D ]<}|}|t|k r4||| krf||d |}q4|d }q<q4t | d	}|| d
S )z0
    adds lines with ##### to template file
    rr   	topsStackZmintpyZstripmapStackr   r   r,   r   N)r   	readlinesleninsertr   )r   flinesZdelimiter_listiZi_last_insertitemr   r   r   beautify_template_file  s"    



r   job_defaults.cfgc           	   	   C   s  t j}tj|| } tj| s.td| tj| dkrddddddd	d
g}t	| d}|
 }W 5 Q R X t }|D ]n}|ds||drq|| }t|dkr|||d  tdt|D ]"}||d || ||d   qq|ntjdd}t|_||  |S )z. Sets an optimized memory value for each job. z+job config file NOT found, it should be: {})r   
c_walltime
s_walltimeextra_secondsc_memorys_memoryZnum_threadsr4   Zio_loadr   #z----   r   r,   =)Z
delimiters)rR   Z
defaultdirrU   rV   rw   isfile
ValueErrorrS   r]   r   r   configparserZRawConfigParserr~   ra   r   Zadd_sectionrangesetZConfigParserr>   Zoptionxformread)	rt   Z
config_dirfieldsr   r   Zconfigliner|   tr   r   r   r{     s*    $
r{   c                 C   s(   t j| r t | t jr$dS ndS dS )z, Checks if the custom template file exists. runskipN)rU   rV   r   accessR_OK)r   r   r   r   run_or_skip  s    r   c                 C   sL  ddl m} |}d}t| |\}}t|dkr2dS t|}t|d }t|d }	t|dd}
t|
 t|	 |D ]}t	
|dd qrt|  t	j| d	 t	j|  }t	||d
  t|  |
|_t	jt	j||_t	j||_||}|j|d |j|d}t|d t|d t|t	jt	j| d t| dS )zUFind files that exited because walltime exceeed and run again with twice the walltimer   )
JOB_SUBMITzExited with exit code 140.N   )factorz.o*z.e*/stdout_Z
_pre_rerun)Z
batch_file)run_file)r   ri   )minsar.job_submissionr   *find_completed_jobs_matching_search_stringr   create_rerun_run_fileextract_walltime_from_job_fileextract_memory_from_job_filemultiply_walltimerm   rU   removereplacemove_out_job_files_to_stdoutrV   dirnamer]   rename remove_last_job_running_productsr)   ri   rH   Zwrite_batch_jobsZsubmit_batch_jobs&remove_zero_size_or_length_error_filesraise_exception_if_job_exitedconcatenate_error_files)r   rq   r   r   search_stringfiles	job_files
rerun_filer)   memorynew_wall_timer   Z
stdout_dirjob_objZjobsr   r   r   rerun_job_if_exit_code_140  s8    

r   c              
   C   sv   | d d }zt | W n tk
r.   Y nX t| }| D ]4}t|}t| t|d}|| W 5 Q R X q<|S )z+Write job file commands into rerun run filer   Z_rerunza+)rU   r   OSErrorr   get_line_before_lastrm   r   write)r   r   r   r   Zcommand_liner   r   r   r   r   *  s    r   c              	   C   s.   t | d}t|j}|| }W 5 Q R X |S )z
    extract attribute from an HDF5 file
    :param file: hdf file name
    :param attr: attribut to extracted
    :return Updated template file added to temp_inps.
    r   )h5pyZFiledictattrs)r   Z	attributer   ZmetadataZextracted_attributer   r   r   extract_attribute_from_hdf_fileC  s    
r   c              
   C   s   t | |}| }|D ]h}d|krL|dd }| }|  W  5 Q R  S d|kr|dd }| }|  W  5 Q R  S qW 5 Q R X dS )z3 Extracts the walltime from an LSF (BSUB) job file z#BSUB -Wz-Wr,   
#SBATCH -trG   N)r   r   ra   r   )r   frr   r   Zwalltimer   r   r   r   U  s    
r   c              
   C   sb   t | P}| }|D ]<}d|kr|dd }|dd }|  W  5 Q R  S qW 5 Q R X dS )z1 Extracts the memory from an LSF (BSUB) job file zBSUB -R rusage[mem=zmem=r,   ]r   N)r   r   ra   )r   r   r   r   r   r   r   r   r   e  s    
r   c                 C   s   t j| dd } | dd}|dd  rLd|ddd }|dd  rvd|ddd }|dd  rd|ddd }|S )	z+ Extracts the step name from a stdout name z.or   run_ _rQ   Nr,   )rU   rV   r]   ra   r   isdigitrw   )job_nameZ	step_namer   r   r   "extract_step_name_from_stdout_nameq  s    r   c                 C   s2   z|  dd  dd }W n   d}Y nX |S )z1 Extracts the config filename from a task string zconfigs/r,   r   r   r   ra   )Ztaskrt   r   r   r   $extract_config_file_from_task_string  s
    
r   c                 C   sR   |  dd }z|  dd }W n   d}Y nX d}| rF|d }|| }|S )zZ Extracts the date string from config_file_name (last string if it does not contain date) r   rQ   r   )ra   r   )Zconfig_file_nameZdate_or_string1Zdate_or_string0Zdate_stringr   r   r   )extract_date_string_from_config_file_name  s    
r   c              	   C   s(   t | }| }W 5 Q R X |d }|S )z$get the line before last from a filer   N)r   r   )r   r   r   Zline_before_lastr   r   r   r     s
    
r   c           
   
   C   s   t  | d }g }t|}|D ]<}t|*}| }|D ]}||kr8|| q8W 5 Q R X qt|}g }|D ]*}d|ddd d }	||	 ql||fS )zKreturns names of files that match seasrch strings (*.e files in run_files).*.o*r   r   rQ   .job)globr   r   r   appendrw   ra   )
r   r   r   Z	file_listr   r   r   r   Zjob_file_listjob_filer   r   r   r     s    
r   c              
   C   sf   t  | d }d}t|}|D ]B}t|0}| }|D ]}||kr8td||q8W 5 Q R X qdS )ERemoves files with zero size or zero length (*.e files in run_files).r   zExited with exit codez ERROR: {0} exited; contains: {1}N)r   r   r   r   rb   rS   )r   r   r   r   r   r   r   r   r   r   r     s    
r   c                 C   s  t j|d | dd  d }t j|r8t | t j| d | dd  d }t| d }t|}t	|dkst
|dX}|D ]L}|d |d	| d
  |d t
|}||  W 5 Q R X qW 5 Q R X t|  tt j|t j| dS )z
    Concatenate error files to one file (*.e files in run_files).
    :param directory: str
    :param out_name: str
    :return: None
    z/out_rd   rQ   z.e*.e*r   zw+z#########################
z#### z 
N)rU   rV   rh   ra   r   r   r   r   r   r   r   r   r   r   touchrX   copy)r   ri   out_fileZout_nameerror_filesZoutfilefnameinfiler   r   r   r     s"    "
"


$r   c              
   C   s.   t | d}t| W  5 Q R  S Q R X dS )z(Calculate the number of lines in a file.r   N)r   r   r   )r   r   r   r   r   file_len  s    r   c                 C   sd   t  | d t  | d  }t|}|D ]6}tj|dkrHt| q(t|dkr(t| q(dS )r   r   r   r   N)r   r   rU   rV   getsizer   r   )r   r   r   r   r   r   r     s    r   c                    s   t  | d }t|}|D ]z}g }t|d}| }|D ]$ t fdddD s8|  q8|  t|d}|d| |  t	|
  qdS )	z=Removes launcher message from *.e files produced by launcher r   r   c                 3   s   | ]}| kV  qd S Nr   .0r   r   r   r   	<genexpr>%  s     z:remove_launcher_message_from_error_file.<locals>.<genexpr>)zusing /tmp/launcherzstarting job on r   r   Nr   r   r   r   anyr   closer   rw   r   r   r   r   r   	new_linesr   r   r   r   r   'remove_launcher_message_from_error_file  s    

r  c                    s   t  | d }t|}|D ]z}g }t|d}| }|D ]$ t fdddD s8|  q8|  t|d}|d| |  t	|
  qdS )	z9Removes warning message from *.e files when invoking ssh r   r   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r   <  s     z=remove_ssh_warning_message_from_error_file.<locals>.<genexpr>)zWarning: Permanently addedr   r   Nr   r  r   r   r   *remove_ssh_warning_message_from_error_file1  s    

r  c                 C   s^   t  | d }t|}|D ]>}g }t|d}| }|D ]}d|kr8t| q8|  qdS )z(Removes error files from timed out jobs r   r   zDUE TO TIME LIMIT ***N)r   r   r   r   rU   r   r  )r   r   r   r  r   r   r   r   r   r   remove_timeout_error_filesI  s    

r  c                 C   st   t  | d }t|}|D ]T}t|d}| }d|kr|dd}tdd|}|  t|d}|| qdS )	zLRemoves lines with e.g. 'line:   398' from *.e files (filter_coherence step)r   r   z
line: r   z
\nline:\d+r   N)	r   r   r   r   r   r`   subr  r   )r   r   r   r   r   Ztmp_liner  r   r   r   *remove_line_counter_lines_from_error_files]  s    

r	  c                 C   sZ   t  | d }t  | d }t  | d }|| | }t|dksV|D ]}t| qFd S )Nr   z*.jobr   r   )r   r   rU   r   )r   r   r   r   Z
list_filesr   r   r   r   r   r  s    r   c                 C   s   t  | d }t|dkrdS tj| }|d tj|  }tj|sZtj|dd nt	| tj|dd t|dkr|D ]}t
|| qdS )z0move the stdout file into stdout_files directoryz*.or   Nr   Trk   r,   )r   r   rU   rV   r   r]   rn   ro   rX   rY   move)r   Zstdout_filesZdir_nameZ
out_folderr   r   r   r   r     s    
r   c                 C   s4   t  tj| tjd }tdd |}t|}|S )z- exports run files to a list: run_file_list. z/run_*c                 S   s   |  dd dkS )N.rQ   )eoZjobr   )xr   r   r   <lambda>      zmake_run_list.<locals>.<lambda>)r   rU   rV   rw   rR   Zrundirfilterr   )ri   Zrun_listr   r   r   make_run_list  s    r  c              	   C   sb   t j| d}g }t|d}| }W 5 Q R X |D ](}|| d |dd dd   q4|S )z reads from run_file_list. Zrun_files_listr   z/run_files/rd   rQ   N)rU   rV   rw   r   r   r   ra   )ri   ZrunfilesZrun_file_listr   new_fr   r   r   r   read_run_list  s    &r  c                 C   s   t | }| }d}d}|d}|D ]}|ddkr(|d}q(|d}|D ]4}|ddkrT|D ]}|ddkrj|d}qjqT|jdkrd	}	nd
}	|j|	d}
|
S )z% Reads attributes from isce xml file NZ	componentnameZmissionr   )Zburst1Zburst2Zburst3passdirectionZ
DESCENDINGZDescZAsc)Zmissionnamer  )ETparseZgetrootfindgettext)filenameZtreerootZvalue_node_spacecraftZvalue_node_passdirZnode_componentnodeZnode_burstspropertyr  Zattrdictr   r   r   xmlread  s&    



r   c                 C   s  t d}tjt jt dd ddlm}m} zt	
| }g }|D ]L}|dkrt|| dkr|d| g }qL|| d	k	rL|d| g || g }qL||}||\}}	}
}||	 j}|jd	krd
ddg}ndd |j D }d}|D ]}t }|  | |_||_t j|jdd||_d	|_d	|_|j|_|j|_|j|_|jd	k	rpdd |j D |_|t jd< z|  ||j j! }W q t"k
r } zt#| W 5 d	}~X Y qX qW n   d
}Y nX t#d| |S )zd calculates the number of bursts based on boundingBox and returns an adjusting factor for walltimes PATHZ
ISCE_STACKr   r   )cmdLineParse	get_dates)ZuseGPUZrmFilterTruez--Nr,   r      c                 S   s   g | ]}t |qS r   r3   )r   r   r   r   r   
<listcomp>  s     z(get_number_of_bursts.<locals>.<listcomp>Z	referencezIW{0}c                 S   s   g | ]}t |qS r   )r=   )r   r  r   r   r   r'    s     znumber of bursts: {})$rU   rf   sysrV   r   rw   ZstackSentinelr"  r#  rR   Z"correct_for_isce_naming_conventionZ	safe_fileZ	swath_numra   r   Z	configureZsafeZswathNumberri   rS   outputZ	orbitFileZauxFileZorbit_dirnameZorbitDirZaux_dirnameZauxDirZpolarizationZbboxZregionOfInterestre   r  productZnumberOfBurstsrb   rm   )rq   Zsystem_pathZ	stack_cmdr#  ZtopsStack_templateZcommand_optionsr   r   ZdateListZreference_dateZsecondaryListZ	safe_dictr   Zswathsnumber_of_burstsZswathobjr  r   r   r   get_number_of_bursts  sT    





 
r-  SLURMc                 C   s  |dksNzt |d}W n   t |d}Y nX tj|j|j|jd }nd}|dkszt |d}W n   t |d}Y nX tj|j|j|jd }	nd}	t|	t| t|  | }
|
|9 }
t	|
d\}}t	|d\}}|dkrd||f }nd	|||f }|S )
zv
    scales default walltime by number of bursts
    scaled_walltime = c_walltime + number_of_bursts * s_walltime
    0z%H:%M:%Sz%H:%M)hoursminutessecondsr   <   )ZLSFz%d:%02dz%d:%02d:%02d)
timestrptimedatetime	timedeltatm_hourtm_mintm_sectotal_secondsr=   divmod)r+  Zwalltime_factorr   r   r   Z	schedulerZs_time_splitZs_time_secondsZc_time_splitZc_time_secondsZtime_secondsminZsechourZscaled_timer   r   r   scale_walltime  s8    r?  c                 C   s0   |dks"t |t | t |  }n
td}|S )zn
    scales default memory by number of bursts
    scaled_memory = c_memory + number_of_bursts * s_memory
    allZMAX_MEMORY_PER_NODE)r=   rU   rf   )r+  r   r   Zscaled_memoryr   r   r   scale_memory@  s    
rA  c                 C   s0   dd |  dD }|d d |d  d }|S )Nc                 S   s   g | ]}t |qS r   r&  r   sr   r   r   r'  Q  s     z!pause_seconds.<locals>.<listcomp>:r   r3  r,   r   )rN   Z
wait_partsZwait_secondsr   r   r   pause_secondsP  s    rE  c           	      C   s   dd |  dD }|d }|d }z|d }W n   d}Y nX ||d  |d  }|| }t|d }t||d  d }t||d  |d  }d	|||}t|dkrd
||}nd	|||}|S )z9 multiply walltime in HH:MM or HH:MM:SS format by factor c                 S   s   g | ]}t |qS r   r&  rB  r   r   r   r'  ]  s     z%multiply_walltime.<locals>.<listcomp>rD  r   r,   r   r3    {:02d}:{:02d}:{:02d}{:02d}:{:02d})ra   mathfloorrS   r   )	r)   r   Zwall_time_partsr0  r1  r2  seconds_totalZseconds_newr   r   r   r   r   Z  s"    
r   c              	   C   s   g }t | L}| }|D ]8}d|krH|dd }| }|||}|| qW 5 Q R X |  t | d}|| W 5 Q R X dS )z- replaces the walltime from a SLURM job file r   rG   r,   r   N)r   r   ra   r   r   r   r  r   )r   r   r  r   r   r   r)   r   r   r   r   replace_walltime_in_job_filex  s    
rL  c           
         s  g }t  | d }t|}td|D ](}dt|d   fdd|D }q$|D ]}t|}|| krt|~}| }g }|D ]}	||	kr||	 q|	  t|d}|
| W 5 Q R X tj|dkrt| t|d	  W 5 Q R X W 5 Q R X qRd
S )z removes dates from run_files z/run_*_*[0-9]r,   r   r   c                    s   g | ]} |kr|qS r   r   )r   r   stringr   r   r'    s      z2run_remove_date_from_run_files.<locals>.<listcomp>r   r   r   N)r   r   r   r>   zfillr   r   r   r   r  r   rU   rV   r   r   )
Zrun_files_dirdateZstart_run_fileZ	run_filesr   r   r   r   r  r   r   rM  r   run_remove_date_from_run_files  s,    


$rQ  c           
      C   s  | rd}| D ]}| d}z*|d  d\}}t|d t| }W n   t|d }Y nX t|d }zt|d }W n   d}Y nX ||d  |d  }|| }qt|d }t||d  d }t||d  |d  }t|dkrd	||}	nd
|||}	nd}	|	S )z* sum time in D-HH:MM or D-HH:MM:SS format r   rD  -   r,   r   r3  rF  rH  rG  z00:00:00)ra   r3   rI  rJ  r   rS   )
Ztime_str_listZseconds_sumr   Z
item_partsdaysr0  r1  r2  rK  Znew_time_strr   r   r   sum_time  s0    


rU  c                 C   sb   t  | d }t  | d }t  | d }t||}t||}t|dks^td| d S )Nz/worker*z	/worker*oz	/worker*er   zchmod -R 0755 {})r   npZ	setdiff1dr   rU   systemrS   )rZ   ZworkersZworkers_outZworkers_errr   r   r   set_permission_dask_files  s    rX  )NN)r   )r   r.  )T
__future__r   rU   r(  r   r   r   ZnumpyrV  r   rI  r`   pathlibr   Znatsortr   Zxml.etree.ElementTreeZetreeZElementTreer  rX   minsar.objects.dataset_templater   minsar.objects.auto_defaultsr   Zisceobj.Sensor.TOPS.Sentinel1r   r4  r6  rR   r   r   r   r   r   r   r   r   r   r   rT   r[   r_   rc   rj   r   rp   r   r   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r	  r   r   r  r  r   r-  r?  rA  rE  r   rL  rQ  rU  rX  r   r   r   r   <module>
   s   

A  
"3& :
0
"'