;---------------------------------------------------------; ;---------------------------------------------------------; ;--- I --- General Settings -------------------------; ;---------------------------------------------------------; ;---------------------------------------------------------; branch = 'WAC' if branch eq 'NAC' then begin focLen = 0.700 pixSize = 3.83 / 3600.D endif else begin focLen = 0.140 pixSize = 20.5 / 3600.D endelse ;--I.1-- General INFO root = '/observ/rosetta/' dirINFO= root+'info/' dirPDS = root+'PDS/' dirFIT = root+'fits/' sufPDS = 'IMG' suFITS = 'fits' ;--I.2-- Read file list readcol, dirPDS+'repositery_'+branch+'.list', pdsList, format='(A)', /SILENT pdsList = strtrim(pdsList,2) nbPDS = n_elements(pdsList) ;--I.3-- Read MK information file readcol, dirINFO+branch+'.csv', $ pathPDS, namePDS, $ beginPDS, ditPDS, filterPDS, $ raPDS, decPDS, paPDS, $ radxPDS, radyPDS, magPDS, $ format='(A,A,A,F,I,F,F,F,F,F,F)', $ delim = ',', /silent ; nbPDS = n_elements(pathPDS) namePDS = strmid(namePDS,0,27)+strmid(namePDS,44,4) ;--I.4-- User-defined quantities fluxConst = 1e10 idLength = 31 ;--I.5-- PDS Header Parser tagXY = ['FIRST_LINE_SAMPLE', 'FIRST_LINE' ] ;-0,1 tagSIZE = ['LINE_SAMPLES', 'LINES' ] ;-2,3 tagCOORD = ['RIGHT_ASCENSION', $ ;-4 'DECLINATION', $ ;-5 'NORTH_AZIMUTH' ] ;-6 tagPIX = ['PIXEL_SIZE_X', 'PIXEL_SIZE_Y'] ;-7,8,9 nbInfo= n_elements(tagXY) + $ n_elements(tagSIZE) + $ n_elements(tagCOORD) + $ n_elements(tagPIX) info = {tag: [tagXY, tagSIZE, tagCOORD, tagPIX], $ val: fltarr(nbInfo) } ;---------------------------------------------------------; ;---------------------------------------------------------; ;--- II --- File Convertion -------------------------; ;---------------------------------------------------------; ;---------------------------------------------------------; for kPDS=0, nbPDS-1 do begin ;----------------------------------------------------------------------------------- ;--II.1-- I/O settings ----------------------------------------------------------- ;--II.1.1-- File association split = strsplit( pdsList(kPDS), '/', count=nbField, length=len ) cameraID = strmid( pdsList(kPDS), split(nbField-1), 3 ) fileID = strmid( pdsList(kPDS), split(nbField-1), idLength ) rawID = strmid( pdsList(kPDS), split(nbField-1), idLength ) fileID = branch+'_'+$ strmid(rawID,1,4)+'-'+$ strmid(rawID,5,2)+'-'+$ strmid(rawID,7,2)+'T'+$ strmid(rawID,10,2)+'.'+$ strmid(rawID,12,2)+'.'+$ strmid(rawID,14,2)+'.'+$ strmid(rawID,16,3)+'_'+$ strmid(rawID,23,3) ;--II.1.2-- File names nameIn = dirPDS+pdsList(kPDS) nameEx = dirFIT+strmid( pdsList(kPDS), 0, strlen(pdsList(kPDS))-3)+suFITS pathEx = dirFIT + strmid( pdsList(kPDS), 0, split(nbField-1) ) ;----------------------------------------------------------------------------------- ;--II.2-- Read the PDS file and Header ------------------------------------------- ;--II.2.1-- Read Files pdsIM = readpds( nameIn, /SILENT ) head = headpds( nameIn, /SILENT ) dimIM = size(pdsIM.image) if dimIM(dimIM(0)+1) eq 8 then begin image = reverse(pdsIM.image.image, 2) * fluxConst endif else begin image = reverse(pdsIM.image, 2) * fluxConst endelse ;--II.2.2-- Extract Information from Header target ='n.a.' ;-Default filter ='n.a.' ;-Default binArr = [-9,-9] ;-Default ;-II.2.2.1-- Organize PDS Header nbLine = n_elements( head ) config = {tag: replicate( ' ', nbLine), $ val: replicate( ' ', nbLine ) } for kL=0, nbLine-1 do begin splitted = strsplit( head(kL), '=', /extract, count=nbField ) if nbField gt 1 then begin config.tag(kL) = strtrim( splitted(0), 2) config.val(kL) = strtrim( splitted(1), 2) endif endfor ;-II.2.2.2-- Numerical keywords: FOV size, etc etc for kI=0, nbInfo-1 do begin p = where( info.tag(kI) eq config.tag ) if p(0) ne -1 then $ info.val(kI) = config.val(p(0)) endfor ;-Switch from PDS 1-based to IDL 0-based INDEX info.val(0:1)-- ;-II.2.2.3-- String keywords: Target, filter... p = where( config.tag eq 'ACTIVITY_NAME' ) if p(0) ne -1 then begin target = strsplit( strtrim(config.val(p(0)),0), '"', /EXTRACT) target = target(0) endif p = where( config.tag eq 'ROSETTA:FILTER_NAME' ) if p(0) ne -1 then begin filter = strsplit( strtrim(config.val(p(0)),0), '"', /EXTRACT) filter = filter(0) endif p = where( config.tag eq 'ROSETTA:HARDWARE_BINNING_ID' ) if p(0) ne -1 then begin bins = strsplit( strtrim(config.val(p(0)),0), "'", /EXTRACT) bins = bins(0) binArr = [ round(float(strmid(bins,0,1))), $ round(float(strmid(bins,2,1))) ] endif ;----------------------------------------------------------------------------------- ;--II.3-- FITS File Creation ----------------------------------------------------- ;--II.3.1-- Creation of a Basic Header & Keywords mkhdr, header, image ;--II.3.1.1-- OSIRIS Fixed Parameters sxaddpar, header, 'TELESCOP', 'OSI'+branch sxaddpar, header, 'FOCLEN', focLen, ' Focal length of the telescope (m)' sxaddpar, header, 'PIXSIZE1', 13.5, ' Pixel size in axis1 (micron)' sxaddpar, header, 'PIXSIZE2', 13.5, ' Pixel size in axis2 (micron)' ;--II.3.1.2-- PDS/OSIRIS Current Parameters sxaddpar, header, 'OBJECT', target, ' Target' sxaddpar, header, 'FILTER', filter, ' Filter' sxaddpar, header, 'BIN1', binArr(0), ' Hardware binning along X axis' sxaddpar, header, 'BIN2', binArr(1), ' Hardware binning along Y axis' ;--II.3.2-- Retrieve Information from MK SPICE computation pp = where( strmid( namePDS, 0, 31 ) eq fileID) if pp(0) ne -1 then begin ;--II.3.2.1-- Observation Date & Exposure Time jdOBS = date_conv( beginPDS(pp(0)), 'JULIAN') + (0.5*ditPDS(pp(0))) /24.D/3600.D isoOBS = date_conv( jdObs, 'FITS') sxaddpar, header, 'DATE-OBS', isoOBs, ' Mid-exposure date (ISO)' sxaddpar, header, 'EXPOSURE', ditPDS(pp(0)), ' Exposure time (s)' ;--II.3.2.2-- FOV: RA/DEC ;--II.3.2.2a-- Reference pixel pixMidX = sxpar( header, 'NAXIS1') /2. pixMidY = sxpar( header, 'NAXIS2') /2. sxaddpar, header, 'CRPIX1', pixMidX, ' Given by Michael Kueppers' sxaddpar, header, 'CRPIX2', pixMidY, ' Given by Michael Kueppers' ; sxaddpar, header, 'CRPIX1', 1011, ' OSIRIS SIS' ; sxaddpar, header, 'CRPIX2', 1047, ' OSIRIS SIS' ;--II.3.2.2b-- RA/DEC of the Reference pixel info.val(4) = raPDS(pp(0)) info.val(5) = decPDS(pp(0)) sxaddpar, header, 'EQUINOX', '2000.0', ' A mano!' sxaddpar, header, 'CRVAL1', float(info.val(4)), ' From PDS header' sxaddpar, header, 'CRVAL2', float(info.val(5)), ' From PDS header' ;--II.3.2.2c-- RA/DEC of the image sxaddpar, header, 'RA', float(info.val(4)), ' Right ascension' sxaddpar, header, 'DEC', float(info.val(5)), ' Declination' ;--II.3.2.2d-- Misc. -- FITS standard sxaddpar, header, 'CTYPE1' , 'RA---TAN', ' A mano!' sxaddpar, header, 'CTYPE2' , 'DEC--TAN', ' A mano!' sxaddpar, header, 'RADECSYS' , 'FK5' , ' A mano!' ;--II.3.2.3-- Pixel size info.val(7:8) = pixSize ;--II.3.2.4-- Image Orientation wrt North PA = paPDS(pp(0))*!DTOR PA += !PI/2. ;--II.3.2.5-- CD Matrix for Image Orientation CD11= info.val(7)*cos(PA) CD12= info.val(8)*sin(PA) CD21= info.val(7)*sin(PA) CD22=-info.val(8)*cos(PA) sxaddpar, header, 'CD1_1', CD11, ' Computed from MK Info' sxaddpar, header, 'CD1_2', CD12, ' Computed from MK Info' sxaddpar, header, 'CD2_1', CD21, ' Computed from MK Info' sxaddpar, header, 'CD2_2', CD22, ' Computed from MK Info' ;--II.3.3-- Write the File on Disk if not file_exist( pathEx ) then file_mkdir, pathEx writefits, nameEx, image, header print, string(kPDS,format='(I5)')+'/'+string(nbPDS,format='(I5)')+' ('+$ string(pixMidY*2.,format='(I4)')+'x'+string(pixMidY*2.,format='(I4)')+'): '+nameEx endif endfor end ;HIERARCH BDDIMAGES VERSION = 1 / Compatibility version for bddimages ;HIERARCH BDDIMAGES STATE = 'CORR' / [ ] RAW | CORR | CATA | ? ;HIERARCH BDDIMAGES TYPE = 'IMG' / [ ] IMG | FLAT | DARK | OFFSET | ? ;HIERARCH BDDIMAGES WCS = '?' / Y | N | ? (WCS performed) ;HIERARCH BDDIMAGES NAMECATA = '?' / Name file of the cata file ;HIERARCH BDDIMAGES DATECATA = '?' / Date iso when the cata file was modif ;HIERARCH BDDIMAGES ASTROID = '?' / ASTROID performed ;HIERARCH BDDIMAGES ASTROMETRY = '?' / Astrometry performed ;HIERARCH BDDIMAGES CATAASTROM = '?' / Catalog used for astrometry ;HIERARCH BDDIMAGES PHOTOMETRY = '?' / Photometry performed ;HIERARCH BDDIMAGES CATAPHOTOM = '?' / Catalog used for photometry