;+ ; Contains the make_ephem_file procedure ; ; :Author: ; Baptiste Cecconi ; ; :History: ; 2008/07/17: Created ; ; 2010/04/04: Last Edit ;- ; ;+ ; Produce the data_qeph and data_veph structure file in ; $NAS_RPWS/dataN/rpws/YYYY_DDB_DDE/ephem/ can be run interactively or called ; with keywords set ; ; Output is a set of files named aaaajjj.qXXX and aaaajjj.vYYY containing ; binary data defined with the data_qeph__define.pro and ; data_veph__define.pro subroutines respectively ; ; The corresponding .eph and .att files will be downloaded in the ; $ROOT_RPWS/ephatt/ directory and deleted at the end except if /nodelete ; is set ; ; :Uses: ; make_dir_tab, make_qeph_data, make_veph_data, write_data_binary ; ; :Keywords: ; aaaajjj: in, required, type=long ; long int containing the day of year used for ephemeris ; source: in, required, type=string ; string containing the source name used for ephemeris ; [the 2 lowercase letter code must be provided here] ; nodelete: in, required, type=byte ; don't delete temporary eph and att files at the end ; reload: in, required, type=byte ; reload ephemeris from RPWS server (even if it already exist). ; dt: in, required, type=sometype ; defines the time interval while retrieving data (sec) ; quiet: in, required, type=byte ; for automatic treatment: default answer automatically chosen ;- PRO make_ephem_file, AAAAJJJ=AAAAJJJ, PERIOD=PERIOD, SOURCE=SOURCE, $ NODELETE=NODELETE, RELOAD=RELOAD, $ DT=DT, QUIET=QUIET, NODB=NODB ; ,CHECK_SIMUL=CHECK_SIMUL ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; reading local paths ; ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ path_root_rpws = getenv('ROOT_RPWS') path_data_rpws = getenv('NAS_RPWS') ; loading quaternion routine set quaternion ; defining variable containing the list of temp files to be deleted in the end files_to_delete = [''] ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; setting initial parameters if keywords not set ; ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if not keyword_set(quiet) then quiet=0b else quiet=1b ; --------------------------------------------------------------------------- ; Selecting AAAAJJJ and PERIOD ; --------------------------------------------------------------------------- if not keyword_set(aaaajjj) then begin print,'Please provide day of year [YYYYDDD] :' str_aaaajjj= '' read,str_aaaajjj aaaajjj = long(str_aaaajjj) endif str_aaaajjj = string(format='(I7)',long(aaaajjj)) yy = long(aaaajjj)/1000l dd = long(aaaajjj) mod 1000l print,format='(A,I4,A,I3.3)','Year: ',yy,' - Day: ',dd ptr_dir = make_dir_tab(yy,dd,yy,dd) if ptr_valid(ptr_dir) then begin path_data_ephem = path_data_rpws + (*ptr_dir)(0) + '/' ptr_free,ptr_dir print,'Writing output files in ' + path_data_ephem endif else begin print,'The selected time does not correspond to Cassini/RPWS data...' print,'Aborting...' return endelse ; --------------------------------------------------------------------------- ; SOURCE parameter ; --------------------------------------------------------------------------- read_data_src_list,src_list n_src = n_elements(src_list) if not keyword_set(SOURCE) then begin print,"Please enter the selected source : " stype=0b print," Avaliable Sources :" for i=0,n_src-1 do print,format='(" -",I2,": ",a)', $ i+1,src_list(i).full_name read,stype stype= stype -1 endif else begin stype = where(src_list.df_name eq strlowcase(source)) & stype=stype(0) if stype eq -1 then begin print,format='(A,10(A,:,"/"))',"The source code must be one of "+ $ "the following : ",src_list.df_name print,'Read src_list.txt file or documentation for additionnal help' print,"ABORTING..." return endif endelse ; --------------------------------------------------------------------------- ; DT parameter ; --------------------------------------------------------------------------- if not keyword_set(DT) then dt = 60 else dt = fix(dt) ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; Computing Quaternions QEPH data ; ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print print,'+-------------------------------------------------------------------+' print,'| Qeph Computations |' print,'+-------------------------------------------------------------------+' ; --------------------------------------------------------------------------- ; Checking if .qeph files already exists ; --------------------------------------------------------------------------- ;stop p_flist = make_file_list(aaaajjj,0,aaaajjj,24,level='ephem', ephem_type=src_list(stype).qeph) if (ptr_valid(p_flist) ne 0) and not keyword_set(reload) then begin print,*p_flist+" : file already exists." rep='' & if not quiet then read,"Do you want to recompute it ? (y)/[n] ",rep if rep ne 'y' then begin print,format='(a,I7,a)',"Skipping ",aaaajjj,"."+src_list(stype).qeph+ $ " computation..." load_qeph = 0b endif else load_qeph = 1b endif else load_qeph = 1b ptr_free,p_flist ; --------------------------------------------------------------------------- ; If required, download files ; --------------------------------------------------------------------------- if load_qeph then begin ; --------------------------------------------------------------------------- ; Preparing file download ; --------------------------------------------------------------------------- print,format='(a,I7,a)','Buiding ',aaaajjj,'.'+src_list(stype).qeph+ $ ' file.' uxse = src_list(stype).uxse ; --------------------------------------------------------------------------- ; Downloading file from Iowa servers via HTTP (using curl) ; --------------------------------------------------------------------------- print,"Downloading attitude data from RPWS servers..." yybtmp = yy ddbtmp = dd yyetmp = yy ddetmp = ddbtmp+1 if ddetmp eq 366 + ((yy mod 4) eq 0) then begin ddetmp = 1 yyetmp = yyetmp+1 endif file_att = strcompress(path_root_rpws+'ephatt/'+ $ string(format='(i7)',aaaajjj)+'-'+uxse+'.att',/remove_all) test = file_search(file_att, count=fcnt) if fcnt eq 1 and not keyword_set(reload) then print,file_att+ $ ": file exists, skipping..." else begin dl_tmp = string(format='("curl -d ''entry1=",I4,"//",I3.3,'+ $ '" 00:00:00&entry2=",I4,"//",I3.3," 00:00:00&entry3=",I4.4,'+ $ '"&entry4=",A,"'' -o ''",A,"'''+ $ ' http://www-pw.physics.uiowa.edu/cgi-tfa/nph-getatt")',yybtmp, $ ddbtmp,yyetmp,ddetmp,dt,uxse,file_att) print, dl_tmp spawn, dl_tmp files_to_delete = [files_to_delete, file_att] endelse openu,lun,file_att,/get_lun s = fstat(lun) if s.size eq 37b then qeph_data_exist = 0b else qeph_data_exist = 1b close,lun free_lun,lun ; --------------------------------------------------------------------------- ; Building and writing qeph data ; --------------------------------------------------------------------------- qeph_file = path_data_rpws+period+'/ephem/'+str_aaaajjj+'.'+ $ src_list(stype).qeph if qeph_data_exist then begin make_qeph_data,file_att,qeph print,'Writing '+qeph_file write_data_binary,qeph_file,qeph endif else begin print,'No attitude data for this day.' print,'Writing '+qeph_file+' with /null' write_data_binary,qeph_file,/null endelse endif ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; Computing Position VEPH data ; ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print print,'+-------------------------------------------------------------------+' print,'| Veph Computations |' print,'+-------------------------------------------------------------------+' ; --------------------------------------------------------------------------- ; Checking if .qeph data exist and load it ; --------------------------------------------------------------------------- p_flist = make_file_list(aaaajjj,0,aaaajjj,24,level='ephem', $ ephem_type=src_list(stype).qeph) print,'Reading '+*p_flist+' data' read_data_binary,*p_flist,qeph,qeph_data_exist,level='qeph' if qeph_data_exist then begin ; --------------------------------------------------------------------------- ; Checking if .veph(s) files already exists ; --------------------------------------------------------------------------- p_flist = make_file_list(aaaajjj,0,aaaajjj,24,level='ephem', $ ephem_type=src_list(stype).veph) if (ptr_valid(p_flist) ne 0) and not keyword_set(reload) then begin print,*p_flist+" : file already exists." rep='' & if not quiet then read,"Do you want to recompute it ? (y)/[n] ",rep if rep ne 'y' then begin print,format='(a,I7,a)',"Skipping ",aaaajjj,"."+src_list(stype).veph+ $ " computation..." load_veph = 0b endif else load_veph = 1b endif else load_veph = 1b ptr_free, p_flist if src_list(stype).need ne '--' then begin p_flist = make_file_list(aaaajjj,0,aaaajjj,24,level='ephem', $ ephem_type=src_list(where(src_list.df_name eq src_list(stype).need)).veph) if (ptr_valid(p_flist) ne 0) and not keyword_set(reload) then begin print,*p_flist+" : file already exists." rep='' & if not quiet then read,"Do you want to recompute it ? (y)/[n] ",rep if rep ne 'y' then begin print,format='(a,I7,a)',"Skipping ",aaaajjj,"."+ $ src_list(stype).need+" computation..." load_need = 0b endif else load_need = 1b endif else load_need = 1b endif else load_need = 0b ptr_free, p_flist ; --------------------------------------------------------------------------- ; If required, download .need files ; --------------------------------------------------------------------------- if load_need then begin ; --------------------------------------------------------------------------- ; Preparing file download ; --------------------------------------------------------------------------- src_need = src_list(stype).need stype_need = where(src_list.df_name eq src_need) orig = src_list(stype_need).orig coor = src_list(stype_need).coor origName = src_list(stype_need).body_rad_name origRad = src_list(stype_need).body_rad_value message,string(format='(a,I7,a)','Info : ',aaaajjj,'.'+src_list(stype_need).veph+' file needed !'),/info message,string(format='(a,I7,a)','Buiding ',aaaajjj,'.'+src_list(stype_need).veph+' file.'),/info ; --------------------------------------------------------------------------- ; Downloading file from Iowa servers via HTTP (using curl) ; --------------------------------------------------------------------------- print,"Downloading attitude data from RPWS servers..." yybtmp = yy ddbtmp = dd yyetmp = yy ddetmp = ddbtmp+1 if ddetmp eq 366 + ((yy mod 4) eq 0) then begin ddetmp = 1 yyetmp = yyetmp+1 endif file_eph = strcompress(path_root_rpws+'ephatt/'+string(format='(i7)',aaaajjj)+'-'+orig+'-'+coor+'.eph',/remove_all) test = file_search(file_eph, count=fcnt) if fcnt eq 1 and not keyword_set(reload) then print,file_eph+ $ ": file exists, skipping..." else begin dl_tmp = string(format='("curl -d ''StTime=",I4,"//",I3.3,'+ $ '" 00:00:00&SpTime=",I4,"//",I3.3," 00:00:00&TimeInterval=",I4.4,'+ $ '"&origin=",A,"&observer=cass&coordinates=",A,"&OriginName=",A,'+ $ '"&OriginRadius=",A,"'' -o ''",A,"'' '+ $ 'http://www-pw.physics.uiowa.edu/das/casephem")',yybtmp,ddbtmp, $ yyetmp,ddetmp,dt,orig,coor,origName,origRad,file_eph) print, dl_tmp spawn, dl_tmp files_to_delete = [files_to_delete, file_eph] endelse ; --------------------------------------------------------------------------- ; Building and writing veph data ; --------------------------------------------------------------------------- make_veph_data,file_eph,veph,/km ; Loading qeph data vephtmp = veph nn = n_elements(qeph) veph = replicate({data_veph},nn) veph.time = qeph.time veph.r(0) = interpol(vephtmp.r(0),vephtmp.time,qeph.time) veph.r(1) = interpol(vephtmp.r(1),vephtmp.time,qeph.time) veph.r(2) = interpol(vephtmp.r(2),vephtmp.time,qeph.time) veph.r = veph.r + $ rebin(reform(src_list(stype).src_position*src_list(stype).body_rad_value,3,1),3,nn) qv = q_vmake(veph.r) qv1 = q_rot(q_conj(qeph.q),qv) veph.r = qv1(1:3,*) veph_file = path_data_rpws+period+'/ephem/'+str_aaaajjj+'.'+ $ src_list(stype_need).veph print,'Writing '+veph_file write_data_binary,veph_file,veph endif ; --------------------------------------------------------------------------- ; If required, download .veph files ; --------------------------------------------------------------------------- if load_veph then begin ; --------------------------------------------------------------------------- ; Preparing file download ; --------------------------------------------------------------------------- src_veph = src_list(stype).veph print,format='(a,I7,a)','Buiding ',aaaajjj,'.'+src_veph+' file.' orig = src_list(stype).orig coor = src_list(stype).coor origName = src_list(stype).body_rad_name origRad = src_list(stype).body_rad_value ; --------------------------------------------------------------------------- ; Downloading file from Iowa servers via HTTP (using curl) ; --------------------------------------------------------------------------- print,"Downloading attitude data from RPWS servers..." yybtmp = yy ddbtmp = dd yyetmp = yy ddetmp = ddbtmp+1 if ddetmp eq 366 + ((yy mod 4) eq 0) then begin ddetmp = 1 yyetmp = yyetmp+1 endif file_eph = strcompress(path_root_rpws+'ephatt/'+string(format='(i7)',aaaajjj)+'-'+orig+'-'+coor+'.eph',/remove_all) test = file_search(file_eph, count=fcnt) if fcnt eq 1 and not keyword_set(reload) then print,file_eph+ $ ": file exists, skipping..." else begin if src_list(stype).need eq '--' then begin obse = 'cass' endif else begin obse = orig stype2 = where(src_list.df_name eq src_list(stype).need) orig = src_list(stype2).orig origRad = src_list(stype2).body_rad_value origName = src_list(stype2).body_rad_name endelse dl_tmp = string(format='("curl -d ''StTime=",I4,"//",I3.3,'+ $ '" 00:00:00&SpTime=",I4,"//",I3.3," 00:00:00&TimeInterval=",I4.4,'+ $ '"&origin=",A,"&observer=",A,"&coordinates=",A,"&OriginName=",A,'+ $ '"&OriginRadius=",A,"'' -o ''",A,"'' '+ $ 'http://www-pw.physics.uiowa.edu/das/casephem")',yybtmp,ddbtmp, $ yyetmp,ddetmp,dt,orig,obse,coor,origName,origRad,file_eph) print, dl_tmp spawn, dl_tmp files_to_delete = [files_to_delete, file_eph] endelse ; --------------------------------------------------------------------------- ; Building and writing veph data ; --------------------------------------------------------------------------- print,'Reading '+file_eph+' data' make_veph_data,file_eph,veph,/km ; Loading veph_need data if needed if src_list(stype).need ne '--' then begin p_flist = make_file_list(aaaajjj,0,aaaajjj,24,level='ephem', $ ephem_type=src_list(where(src_list.df_name eq src_list(stype).need)).veph) print,'Reading '+*p_flist+' data' read_data_binary,*p_flist,veph_need,level='veph' endif vephtmp = veph nn = n_elements(qeph) veph = replicate({data_veph},nn) veph.time = qeph.time veph.r(0) = interpol(vephtmp.r(0),vephtmp.time,qeph.time) veph.r(1) = interpol(vephtmp.r(1),vephtmp.time,qeph.time) veph.r(2) = interpol(vephtmp.r(2),vephtmp.time,qeph.time) veph.r = veph.r + $ rebin(reform(src_list(stype).src_position*src_list(stype).body_rad_value,3,1),3,nn) qv = q_vmake(veph.r) qv1 = q_rot(q_conj(qeph.q),qv) veph.r = qv1(1:3,*) if src_list(stype).need ne '--'then veph.r = veph_need.r - veph.r veph_file = path_data_rpws+period+'/ephem/'+str_aaaajjj+'.'+ $ src_list(stype).veph print,'Writing '+veph_file write_data_binary,veph_file,veph endif endif else begin veph_file = path_data_rpws+period+'/ephem/'+str_aaaajjj+'.'+ $ src_list(stype).veph print,'No qeph data, skipping all veph computations...' print,'Writing '+veph_file+' with /null' write_data_binary,veph_file,/null endelse ; Erasing temporary .eph and .att files if ~ keyword_set(nodelete) then begin nftmp = n_elements(files_to_delete)-1 if nftmp gt 0 then begin for i=1,nftmp do begin print,'deleting '+files_to_delete(i) spawn,'/bin/rm -f '''+files_to_delete(i)+'''' endfor endif endif else print,'/nodelete keyword set : no ephatt files erased. ' ; Update the Kronos Database with the new files spawn, [getenv('ROOT_RPWS') + '/pro/kronosdb/upsert.sh', '-l', 'ephem', string(format='(I7)', aaaajjj), string(format='(I7)', aaaajjj)], /NOSHELL ; Update the Kronos Database with the new files if ~keyword_set(nodb) then begin upsert_args = getenv('ROOT_RPWS') + '/pro/kronosdb/upsert.sh' if keyword_set(verbose) then upsert_args = [upsert_args, '-v'] upsert_args = [upsert_args, '-f', output_file] spawn, /NOSHELL, upsert_args end end