
    i_                     F   d Z 	 d ZddlmZ ddlmZ ddlZddlmZ ddl	Z	ddl
mZ ddlZg dZg dZg d	Zg d
Zg dZg dZg dZg dZg dZg dZg 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 Z#d Z$e%dk(  r  e#       Z&e&jO                         Z( e$e(       yy) a1  
The MIT License (MIT)

Copyright (c) 2014 VUIIS

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
c                     | |kD  | |k  z
  S )N )abs     JC:\Projects\mas-dev\.venv\Lib\site-packages\../../Scripts/sessionmirror.pycmpr      s    Ea!e        )zip)strN)cElementTree)zxnat:projectData/namezxnat:projectData/descriptionzxnat:projectData/keywords)zxnat:subjectData/groupzxnat:subjectData/srcz'xnat:subjectData/investigator/firstnamez&xnat:subjectData/investigator/lastnamezAxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/dobzAxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/yobzAxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/agezDxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/genderzHxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/handednesszAxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/seszGxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/educationzKxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/educationDesczBxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/racezGxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/ethnicityzDxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/weightzDxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/heightzMxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/gestational_agezPxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/post_menstrual_agezJxnat:subjectData/demographics[@xsi:type=xnat:demographicData]/birth_weight)xnat:experimentData/datexnat:experimentData/visit_idxnat:experimentData/timexnat:experimentData/note*xnat:experimentData/investigator/firstname)xnat:experimentData/investigator/lastname*xnat:imageSessionData/scanner/manufacturer#xnat:imageSessionData/scanner/modelxnat:imageSessionData/operator(xnat:imageSessionData/dcmAccessionNumber"xnat:imageSessionData/dcmPatientId$xnat:imageSessionData/dcmPatientName"xnat:imageSessionData/session_typexnat:imageSessionData/modalityxnat:imageSessionData/UIDzxnat:mrSessionData/coilz xnat:mrSessionData/fieldStrengthzxnat:mrSessionData/markerz xnat:mrSessionData/stabilization)xnat:imageScanData/typexnat:imageScanData/UIDxnat:imageScanData/notexnat:imageScanData/qualityxnat:imageScanData/condition%xnat:imageScanData/series_description xnat:imageScanData/documentationxnat:imageScanData/framesxnat:imageScanData/startTime'xnat:imageScanData/scanner/manufacturer xnat:imageScanData/scanner/model)#r   r   r   r   r    r!   r"   r#   r$   r%   r&   zxnat:mrScanData/parameters/flipz&xnat:mrScanData/parameters/orientationzxnat:mrScanData/parameters/trzxnat:mrScanData/parameters/tixnat:mrScanData/parameters/tez#xnat:mrScanData/parameters/sequencez$xnat:mrScanData/parameters/imageTypez'xnat:mrScanData/parameters/scanSequencez%xnat:mrScanData/parameters/seqVariantz&xnat:mrScanData/parameters/scanOptionsz"xnat:mrScanData/parameters/acqTypez)xnat:mrScanData/parameters/pixelBandwidthz%xnat:mrScanData/parameters/voxelRes/xz%xnat:mrScanData/parameters/voxelRes/yz%xnat:mrScanData/parameters/voxelRes/zz xnat:mrScanData/parameters/fov/xz xnat:mrScanData/parameters/fov/yz#xnat:mrScanData/parameters/matrix/xz#xnat:mrScanData/parameters/matrix/yz%xnat:mrScanData/parameters/partitionszxnat:mrScanData/fieldStrengthzxnat:mrScanData/markerzxnat:mrScanData/stabilizationzxnat:mrScanData/coil)
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   zxnat:petSessionData/studyTypezxnat:petSessionData/patientIDzxnat:petSessionData/patientNamez!xnat:petSessionData/stabilizationz#xnat:petSessionData/start_time_scanz(xnat:petSessionData/start_time_injectionzxnat:petSessionData/tracer/namez$xnat:petSessionData/tracer/startTimezxnat:petSessionData/tracer/dosez+xnat:petSessionData/tracer/specificActivityz$xnat:petSessionData/tracer/totalMassz'xnat:petSessionData/tracer/intermediatez"xnat:petSessionData/tracer/isotopez,xnat:petSessionData/tracer/isotope/half-lifez(xnat:petSessionData/tracer/transmissionsz2xnat:petSessionData/tracer/transmissions_starttime)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$   z'xnat:petScanData/parameters/orientationz,xnat:petScanData/parameters/originalFileNamez&xnat:petScanData/parameters/systemTypez$xnat:petScanData/parameters/fileTypez)xnat:petScanData/parameters/transaxialFOVz#xnat:petScanData/parameters/acqTypez$xnat:petScanData/parameters/facilityz%xnat:petScanData/parameters/numPlanesz,xnat:petScanData/parameters/frames/numFramesz$xnat:petScanData/parameters/numGatesz+xnat:petScanData/parameters/planeSeparationz#xnat:petScanData/parameters/binSizez$xnat:petScanData/parameters/dataType)z"proc:genProcData/validation/statuszproc:genProcData/procstatuszproc:genProcData/proctypezproc:genProcData/procversionzproc:genProcData/walltimeusedzproc:genProcData/memusedc                     | j                   j                  |      }t        t        t	        ||                  }d}||v r| j                   j                  |      ||<   |j                   j                  |       y)z5 Copies list of attributes form source to destinationr'   r	   )attrsmgetdictlistr
   getmset)src_objdest_obj	attr_list	src_attrssrc_listte_keys         r   
copy_attrsr5     si    ""9-IDY	234H -F"==,,V4NN!r   c                     | j                         }t        t        t        t        t
        t        t        t        t        t        t        d}	 t        | |||          y# t        $ r t        d|z          Y yw xY w)z Copy attributes from src to dest)zxnat:projectDatazxnat:subjectDatazxnat:mrSessionDatazxnat:petSessionDatazxnat:ctSessionDatazxnat:mrScanDatazxnat:petScanDatazxnat:ctScanDatazxnat:scScanDatazproc:genProcDataxnat:otherDicomScanDataz3ERROR:cannot copy attributes, unsupported datatype:N)datatype
PROJ_ATTRS
SUBJ_ATTRSMR_EXP_ATTRSPET_EXP_ATTRSCT_EXP_ATTRSMR_SCAN_ATTRSPET_SCAN_ATTRSCT_SCAN_ATTRSSC_SCAN_ATTRS
PROC_ATTRSOTHER_DICOM_SCAN_ATTRSr5   KeyErrorprint)r/   r0   src_typetypess       r   copy_attributesrH     sn    !H!+!+#/$1#/ -!/ - -!+(>
@EP7HeHo6 PChNOPs   A A76A7c                 R    t        | j                         |j                               S )zCompare sort of items)r   label)item1item2s     r   subj_comparerM   ,  s    u{{}ekkm,,r   c                 R   | j                         }|dz   |z   }t        j                  |      }t        j                  |      st	        j
                  |       	 t        j                  |      du r| j                  |       | j                         }|j                  d      }|j                  d      }|j                  d      }	|r'|r%|	s#|j                  |      j                  |||       nq|r&|s$|	s"|j                  |      j                  ||       nI|r'|r%|	r#|j                  |      j                  |||       n |j                  |      j                  |       t	        j                  |       y	# t        $ r) t        d|dt        j                         d          Y y	w xY w)
zc
    Copy file from XNAT file source to XNAT resource destination,
    using local cache in between/Ffile_contentfile_format	file_tagszERROR:failed to copy file:z, error=r	   N)rJ   opdirnameexistsosmakedirsr-   
attributesfileputremove	ExceptionrE   sysexc_info)
src_fdest_rcache_df_labelloc_floc_d
f_in_attrs	f_contentf_formatf_tagss
             r   	copy_fileri   1  sX    kkmGcMG#E JJuE99U
E.99Uu$IIe %%'
NN>2	>>-0, 	&KK $$UHi@iKK $$UH5)KK $$UHi@KK $$U+ 			% .#,,.+- 	..s   DE4 4/F&%F&c                    	 t        d       | j                  |d      }t        d       |j                  |d       t        j                  |       y	# t
        $ r( t        ddt        j                         d           w xY w)
z_
    Copy a resource from XNAT source to XNAT destination using local cache
    in between
    z#INFO:Downloading resource as zip...F)extractz!INFO:Uploading resource as zip...TzERROR:failed to copy::r	   N)rE   r-   put_ziprV   r[   
IndexErrorr]   r^   )src_rr`   ra   cache_zs       r   copy_res_ziprq   Y  su    
34))GU)3 	12w- 			' gs||~a7HIJs   AA 1Bc                 l    d}| j                         j                  d      D ]  }|dz  } |dk(  S  |dk(  S )z$Check if resource contains any filesr	   obj   )filesfetchall)_resf_countf_ins      r   is_empty_resourcerz   o  sD    G

%%e,1a<	 - a<r   c                 p   t        d       t        j                  |      st        j                  |       | j                         }t        j                  |d      }t        ||       | j                         }|j                  |       t        | |       | j                         j                  d      D ]T  }|j                         }t        d|z         |j                  |      }t        j                  ||      }	t        |||	       V | j!                         D ]   }
|
j                         }t        d|z         " | j#                         j                  d      D ]V  }|j                         }t        d|z         |j%                  |      }t        j                  ||      }t'        |||d	       X y
)z,Copy XNAT session from source to destinationz(INFO:uploading session attributes as xmlzsess.xml)experimentsrs   zINFO:Processing scan:%s...zINFO:Processing assessor:%s:...INFO:Processing resource:%s...Tuse_zipN)rE   rS   rU   rV   rW   r-   join	write_xmlr8   createrH   scansrv   rJ   scan	copy_scan	assessors	resourcesresourcecopy_res)src_sessdst_sesssess_cache_dirsess_xmlxml_path	sess_typesrc_scan
scan_labeldst_scanscan_cache_dirsrc_assr
assr_labelsrc_res	res_labeldst_resres_cache_dirs                   r   copy_sessionr     sh    

4599^$
N#||~Hww~z2Hh!!!#IOO	O*Hh' NN$--e4^^%
*Z78==,<(Hn5 5 &&(^^%
/*<= ) %%'007MMO	.:;##I.	:'=$? 8r   c                    | j                         }|dk(  rd}|j                  |       t        | |       | j                         j	                  d      D ]i  }|j                         }t        d|z         |j                  |      }t        j                  ||      }|dk(  rt        |||       [t        |||d       k y	)
z.Copy scan from source XNAT to destination XNAT r7   )r   rs   r}   	SNAPSHOTSTr~   N)r8   r   rH   r   rv   rJ   rE   r   rS   r   r   )r   r   r   	scan_typer   r   r   r   s           r   r   r     s     !!#IB-	OO)O$Hh' %%'007MMO	.:;##I.	:#Wg}5Wg}dC 8r   c                    t        j                  |      st        j                  |       d}t	        |j
                         |j                         s|j                          d}nt        |      rd}t        |       rt	        d       y|r|r+	 t	        d| j                         z         t        | ||       yd}| j                         D ]0  }t	        d	|j                         z         |d
z  }t        |||       2 t	        d|z         yy# t        $ rK 	 t	        d| j                         z         t        | ||       Y y# t        $ r d}t	        |       Y nw xY wY w xY w)z2Copy resource from source XNAT to destination XNATFTz$WARN:empty resource, nothing to copyNz#INFO:Copying resource as zip: %s...z3INFO: second attempt to copy resource as zip: %s...zEERROR:failed twice to copy resource as zip, willcopy individual filesr	   zINFO:Copying file: %s...rt   z/INFO:Finished copying resource, %d files copied)rS   rU   rV   rW   rE   _urir   rz   rJ   rq   r\   ru   ri   )r   r   r   r   is_emptymsg
copy_countfs           r   r   r     sN    99]#
M" H	',,>>	7	# !45;gmmoMNWg}= 
A,qwwy89!OJa-0 ! 	?*LM/   	O#MMO, - '=A  0C#J 	s0   )D 	E!)EEE!EE! E!c           	         t        j                  |       }|rd|j                  v r|j                  d= d}|j                  |      D ]  }|j	                  |        |j                  d      D ]  }|j	                  |        n d}|j                  |      D ]  }|j	                  |        |j                  d      D ]  }|j	                  |        d}|j                  |      D ]  }|j	                  |        |j                  d      D ]  }|j	                  |        n |j                  d      D ]  }|j	                  |        n |j                  d	      D ]  }|j	                  |        n |j                  d
      D ]  }|j	                  |        n 	 t        j
                  dd       t        j
                  dd       t        j
                  dd       t        j
                  dd       t        j                  |      j                  |       y# t        $ r.}t        dj                  |t        |                   Y d}~yd}~ww xY w)zWriting XML.IDz"{http://nrg.wustl.edu/xnat}sharingz{http://nrg.wustl.edu/xnat}outz*{http://nrg.wustl.edu/xnat}imageSession_IDz%{http://nrg.wustl.edu/xnat}subject_IDz+{http://nrg.wustl.edu/xnat}image_session_IDz {http://nrg.wustl.edu/xnat}scansz${http://nrg.wustl.edu/xnat}assessorsz${http://nrg.wustl.edu/xnat}resourcesz&{http://nrg.wustl.edu/xnat}experimentsxnatzhttp://nrg.wustl.edu/xnatproczhttp://nrg.wustl.edu/procprovzhttp://www.nbirn.net/provfszhttp://nrg.wustl.edu/fszERROR:writing xml file: {}: {}N)ET
fromstringattribfindallr[   register_namespaceElementTreewriteIOErrorrE   formatr   )xml_str	file_path
clean_tagsroottagchilderrors          r   r   r   I  s   ==!D 4;;D! 3\\#&EKK ' \\"BCEKK D
 ;\\#&EKK ' \\"IJEKK K <\\#&EKK ' \\"DEEKK F
 \\"HIEKK J
 \\"HIEKK J
 \\"JKEKK LN
f&AB
f&AB
f&AB
d$=>
t""9- N.55iULMMNs   A<H 	I%$IIc            	      (   dd l } 	 | j                  d| j                        }|j                  ddddd	       |j                  d
dddd       |j                  dddd       |j                  ddddd       |j                  ddddddd       |S )Nr	   zDownloads a given experiment/session from an XNAT instance and uploads it to an independent one. Only DICOM resources will be imported.)descriptionformatter_classz--h1z--source_configsource_configzSource XNAT configuration fileT)desthelprequiredz--h2z--dest_configdest_configz#Destination XNAT configuration file)r   r   r   z-ez--experiment_idz4Which resource to download? (Entity name/identifier))r   r   z-pz--project_id
project_idz&Which project to store the resource inz-vz	--verboseverbose
store_trueFz'Display verbosal information (optional))r   actiondefaultr   r   )argparseArgumentParserRawTextHelpFormatteradd_argument)r   
arg_parsers     r   create_parserr     s    &((( !55	 ) 7J
 !-  > md2  4 $C  E n<$5  7 k	,6  H r   c                 p   t        j                  | j                        }t        j                  | j                        }ddg}|j                  j                  | j                  |      j                  d   }|j                  j                  | j                        }|j                  |d         }|j                         s|j                          |j                  |d         }|j                  j                  |d         j                  |d         j                  |d         }|}	t        ||	d	       y )
N)configsubject_labelrJ   )experiment_idcolumnsr	   project
subject_IDr   z/tmp)pyxnat	Interfacer   r   arrayr|   r   dataselectr   r   subjectrU   r   
experimentr   )
argsx1x2r   e1pser   r   s
             r   mainr     s   			!3!3	4B			!1!1	2B(G			D,>,>&- 
 
//3tA
7B
		$//*A			"_%&A88:	
	R[!Ayy  I/77<8HITTUWX\U]^HH8V,r   __main__)F)T))__doc__r   builtinsr
   r   rV   os.pathpathrS   r]   	xml.etreer   r   r   r9   r:   r;   rC   r>   rA   r<   r=   r?   r@   rB   r5   rH   rM   ri   rq   rz   r   r   r   r   r   r   __name__parser
parse_args	argumentsr   r   r   <module>r      s   0   	  
 ( 

4, $L D$6
P*-
%.P,P)@XD0+N\>NB6-& z_F!!#IO r   