;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- I -- Initialization And Input Verification -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--I.1-- Fine-tune Processing ----------------------------------------------------------------; genEph = 0 ;-force ephemerides generation doEuclid = 1 doGaia = 1 doLSST = 1 uncGaia = 0.001 uncEuclid = 0.01 uncLSST = 0.01 debug = {ephem:0} seedGaia = 1 seedEuclid = 12345 seedLSST = 31045 MJD_to_JD = 2400000.5D ;--I.2-- Directories -------------------------------------------------------------------------; ;--I.2.1-- Root Directory spawn, 'hostname', host case strTrim(host) of 'hyperion': dirEuclid = '/data/euclid/' 'endymion': dirEuclid = '/home/bcarry/work/data/euclid/' else: stop endcase ;--I.2.2-- Sub-Directories dirSimu = dirEuclid+'lc/simulation/' dirEph= dirSimu+'ephem/' dirXM = dirSimu+'xmatch/' dirLC = dirSimu+'lc/' dirRS = dirEuclid+'rs/' dirLSST = dirEuclid+'lsst/' dirDAMIT= '/astrodata/Catalog/physical_models/Asteroid/' ;--I.2.3-- BASH Scripts xmatch='/home/bcarry/Documents/softs/idl/mining/euclid/xmatch.sh' mergeXM='/home/bcarry/Documents/softs/idl/mining/euclid/mergeXM.sh' mergeLC='/home/bcarry/Documents/softs/idl/mining/euclid/mergeLC.sh' ;--I.3-- Gaia Observations from F. Mignard ---------------------------------------------------; if doGaia eq 1 then begin readcol, dirSimu+'SSO_Transits_24092014_22052019_Euclid.txt', /Silent, $ trash,gNum,gName,fov,trash,trash,trash,trash,trash,trash,trash,trash,trash,utc,trash,trash,ra,dec, $ format='(F,I,A,I,F,F,I,I,F,F,F,F,A,A,F,F,F,F)' nbGaia = n_elements(ra) gaiaObs=replicate({num:0L,name:'',fov:0,utc:'',jd:0.d,ra:0.,dec:0.},nbGaia) gaiaObs.num=gNum gaiaObs.name=strTrim(gName,2) gaiaObs.utc=strTrim(utc,2) endif ;--I.4-- Instrument Characteristics ----------------------------------------------------------; ;--I.4.1-- Euclid Field of View ecFOV = 0.57 ecDiag = sqrt(ecFOV/2) ecSide = sqrt(ecFOV) ecDist = ecSide/2 ;--I.4.2-- LSST Field of View lsstFOV = 9.6 lsstDiag = sqrt(lsstFOV/2) lsstSide = sqrt(lsstFOV) lsstDist = lsstSide/2 ;--I.4.2-- Observing Sequence readcol, dirSimu+'time.def', delimiter=',', /Silent, $ filtId, obsStart, obsDIT, format='(A,F,F)' nbSeq=n_elements(filtId) ecSeq=replicate({filt:'',start:0.,dit:0., mid:0.d},nbSeq) ecSeq.filt =strTrim(filtId,2) ecSeq.start=obsStart ;- sec ecSeq.dit =obsDIT ;- sec ecSeq.mid = (ecSeq.start+ecSeq.dit/2.) / 86400.D ;- JD ;--I.4.3-- Euclid Surveys if debug.ephem eq 1 then begin if not keyword_Set(ecWide) then ecWide = euclidReadRS( dirRS+'wide.csv') if not keyword_Set(ecCal ) then ecCal = euclidReadRS( dirRS+'calib.csv') endif ;--I.5-- General Parameters for Ephemerides --------------------------------------------------; ephEuc ={ep:'2020-06-15', nbd:3850, step:'0.5d', obs:'earth@L2'} ephLSST={ep:'2022-01-01', nbd:7300, step:'0.5d', obs:'I11'} ephGaia={obs:'earth@L2'} ; ep='2020-06-15' ; nbd=3850 ; step='0.5d' ; obs='earth@L2' ;--I.6-- List Asteroids with Shape Model from DAMIT ------------------------------------------; ; readcol, dirSimu+'damit.txt', num, name, format='(I6,A44)', /Silent readfmt, dirSimu+'damit.txt', 'I6,1x,A40', num, name, /Silent name=strTrim(name,2) ; num=5738 ; name='Billpickering' ; ; num=2001 ; name='Einstein' ; ; num=[2001,5738] ; name=['Einstein','Billpickering'] ; num=532 ; name='Herculina' nbSSO = n_elements(num) ssoINFO=replicate({num:0L, name:'', gaia:0.d, euclid:0.d,lsst:0.d},nbSSO) ssoINFO.num=num ssoINFO.name=name for kSSO=21, nbSSO-1 do begin ;--I.7-- Setup Filenames -------------------------------------------------------------------; sufXML = '.xml' sufCSV = '.csv' NameNoSpace=strTrim(name[kSSO],2) space=strPos(NameNoSpace,' ') if space[0] ne -1 then strPut, NameNoSpace, "_", space[0] nameEphL2 =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-@L2'+sufXML nameEphI11=strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-I11'+sufXML ;--I.7.1-- Related to Wide Survey nameXMW =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-wide'+sufCSV nameFineW =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-wide-fine'+sufXML nameFineXW=strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-wide-xm'+sufCSV ;--I.7.2-- Related to Calibrations nameXMC =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-calib'+sufCSV nameFineC =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-calib-fine'+sufXML nameFineXC=strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-calib-xm'+sufCSV ;--I.7.3-- Related to Deep Survey nameXMD =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-deep'+sufCSV nameFineD =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-deep-fine'+sufXML nameFineXD=strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-deep-xm'+sufCSV ;--I.7.4-- Euclid in General nameEucAll=strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-euclid-xm'+sufCSV nameEucSel=strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-euclid-sel'+sufCSV ;--I.7.5-- Related to LSST nameXML =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-lsst'+sufCSV nameFineL =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-lsst-fine'+sufXML nameFineXL =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-lsst-xm'+sufCSV nameLsstSel =strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-lsst-sel'+sufCSV nameLsstList=strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-lsst-listLC.dat' ;--I.7.6-- Lightcurves nameEucGeo = strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-euclid.geo' nameEucLC = strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-euclid.lc' nameGaiaGeo= strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-gaia.geo' nameGaiaLC = strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-gaia.lc' nameLsstGeo= strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-lsst.geo' nameLsstLC = strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-lsst.lc' nameAllList= strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'-LC-list.dat' nameAllLC = strTrim(string(num[kSSO],format='(I)'),2)+'-'+NameNoSpace+'.lc' ;--I.7.7-- Shape Model dir3d = dirDAMIT+NameNoSpace+'/1/' nameSpin ='spin.dat' nameShape='shape.dat' print, string(kSSO+1,format='(I3)')+'/'+string(nbSSO,format='(I3)')+' -- '+$ string(num[kSSO],format='(I6)')+' '+name[kSSO] openW, idAll, dirLC+nameAllList, /Get_Lun ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- II -- Generate Geometry and Lightcurve From Euclid -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; if doEuclid eq 1 then begin print, ' Euclid' ssoINFO[kSSO].euclid = -SysTime(/JULIAN, /UTC) ;--II.1-- Generation of L2-centric Ephemerides ---------------------------------------------; if not file_test(dirEph+nameEphL2,/Read) or genEph eq 1 then begin coords = voMiriade_callEphemcc( num[kSSO], ephEuc.ep, nbd=ephEuc.nbd, step=ephEuc.step, $ obs=ephEuc.obs, dump=dirEph+nameEphL2, mime='votable', /Web ) endif else $ coords = voMiriade_readEphemcc( dirEph+nameEphL2, mime='votable' ) if debug.ephem eq 1 then begin window, 2, title='EC coordinates' cgPlot, ecWide.lon, ecWide.lat, psym=3, xRange=[0,360], yRange=[-90,90] cgPlot, /OverPlot, coords.lon.dec, coords.lat.dec, psym=4, color='red' endif ;--II.2-- Cross-Match with Euclid Wide Survey ----------------------------------------------; ;--II.2.1-- Rough Cross-Match spawn, xmatch+' -t -e '+dirEph+nameEphL2+$ ' -s '+dirRS+'wide.xml'+$ ' -o '+dirXM+nameXMW, res, err ;--II.2.2-- Read Cross-Match Output readcol, dirXM+nameXMW, /Silent, Delimiter=',', $ trash,trash,trash,trash,trash,trash,utcXMW, $ format='(I,I,I,I,A,D,A)' nbXMW = n_elements(utcXMW) ;--II.2.3-- Generate Ephemerides at Potential Cross-match Times if nbXMW gt 0 then begin tmpEuclid='/tmp/jd4euclid.dat' forprint, utcXMW, format='(A)', /Silent, textout=tmpEuclid, /NoComment coords = voMiriade_callEphemcc( num[kSSO], tmpEuclid, /DateList, obs=ephEuc.obs, dump=dirEph+nameFineW, mime='votable', /Web ) ;--II.2.4-- Fine Cross-Match spawn, xmatch+' -e '+dirEph+nameFineW+$ ' -s '+dirRS+'wide.xml'+$ ' -o '+dirXM+nameFineXW, res, err spawn, 'wc -l '+dirXM+nameFineXW+" |awk '{print $1}'", res, err if strCmp(res[0],'1') then begin spawn, 'rm '+dirXM+nameFineXW nbXMW=0 endif endif ;--II.3-- Cross-Match with Euclid Calibrations ---------------------------------------------; ;--II.3.1-- Rough Cross-Match spawn, xmatch+' -t -e '+dirEph+nameEphL2+$ ' -s '+dirRS+'calib.xml'+$ ' -o '+dirXM+nameXMC, res, err ;--II.3.2-- Read Cross-Match Output readcol, dirXM+nameXMC, /Silent, Delimiter=',', $ trash,trash,trash,trash,trash,trash,utcXMC, $ format='(I,I,I,I,A,D,A)' nbXMC = n_elements(utcXMC) ;--II.3.3-- Generate Ephemerides at Potential Cross-match Times if nbXMC gt 0 then begin tmpEuclid='/tmp/jd4euclid.dat' forprint, utcXMC, format='(A)', /Silent, textout=tmpEuclid, /NoComment coords = voMiriade_callEphemcc( num[kSSO], tmpEuclid, /DateList, obs=ephEuc.obs, dump=dirEph+nameFineC, mime='votable', /Web ) ;--II.3.4-- Fine Cross-Match spawn, xmatch+' -e '+dirEph+nameFineC+$ ' -s '+dirRS+'calib.xml'+$ ' -o '+dirXM+nameFineXC, res, err spawn, 'wc -l '+dirXM+nameFineXC+" |awk '{print $1}'", res, err if strCmp(res[0],'1') then begin spawn, 'rm '+dirXM+nameFineXC nbXMC=0 endif endif ;--II.4-- Cross-Match with Euclid Deep Survey ----------------------------------------------; ;--II.4.1-- Rough Cross-Match spawn, xmatch+' -t -e '+dirEph+nameEphL2+$ ' -s '+dirRS+'deep.xml'+$ ' -o '+dirXM+nameXMD, res, err ;--II.4.2-- Read Cross-Match Output readcol, dirXM+nameXMD, /Silent, Delimiter=',', $ trash,trash,trash,trash,trash,trash,utcXMD, $ format='(I,I,I,I,A,D,A)' nbXMD = n_elements(utcXMD) ;--II.4.3-- Generate Ephemerides at Potential Cross-match Times if nbXMD gt 0 then begin tmpEuclid='/tmp/jd4euclid.dat' forprint, utcXMD, format='(A)', /Silent, textout=tmpEuclid, /NoComment coords = voMiriade_callEphemcc( num[kSSO], tmpEuclid, /DateList, obs=ephEuc.obs, dump=dirEph+nameFineD, mime='votable', /Web ) ;--II.4.4-- Fine Cross-Match spawn, xmatch+' -e '+dirEph+nameFineD+$ ' -s '+dirRS+'deep.xml'+$ ' -o '+dirXM+nameFineXD, res, err spawn, 'wc -l '+dirXM+nameFineXD+" |awk '{print $1}'", res, err if strCmp(res[0],'1') then begin spawn, 'rm '+dirXM+nameFineXD nbXMD=0 endif endif ;--II.5-- Final Selection from FoV Geometry ------------------------------------------------; nbSel=0 if total([nbXMW, nbXMC, nbXMD]) ne 0 then begin ;--II.5.1-- Merge all Cross-Matches spawn, mergeXM+' -w '+dirXM+nameFineXW+$ ' -c '+dirXM+nameFineXC+$ ' -d '+dirXM+nameFineXD+$ ' -o '+dirXM+nameEucAll, res, err ;--II.5.2-- Read all Cross-Matches readcol, dirXM+nameEucAll, delimiter=',',/Silent, $ Id,fieldId,patchId,ditherId,obsType,UTC,$ Long,Lat,RA_1,DEC_1,RAd,DECd,deltaRA,deltaDEC, $ format='(I,I,I,I,A,A,'+$ 'F,F,F,F,F,F,F,F)' ;--II.5.3-- Select Valid Cross-Matches sel = where( deltaRA le ecDist and deltaDEC le ecDist, nbSel ) if nbSel ne 0 then begin forprint, Id,fieldId,patchId,ditherId,obsType,UTC,$ Long,Lat,RA_1,DEC_1,RAd,DECd,deltaRA,deltaDEC, $ format='(I,I,I,I,A,A,F,F,F,F,F,F,F,F)', /Silent, textout=dirXM+nameEucSel, subset=sel, $ comment='Id,fieldId,patchId,ditherId,obsType,UTC,Long,Lat,RA_1,DEC_1,RAd,DECd,deltaRA,deltaDEC' endif endif ;--II.6-- Generate Observing Geometry for VIS+NISP Sequence --------------------------------; if nbSel ne 0 then begin ;--II.6.1-- Build the List of Epochs in JD jdArr = dblarr(nbSel*nbSeq) for kSel=0, nbSel-1 do begin jd = date_conv(UTC[kSel],'JULIAN') jdArr[ kSel*nbSeq + indgen(nbSeq)] = jd + ecSeq.mid endfor ;--II.6.2-- Generate Lightcurve Geometry lc = generateLC(num[kSSO], jdArr, /LTC, dump=dirLC+nameEucGeo, obs=ephEuc.obs) endif ;--II.7-- Generate Photometry --------------------------------------------------------------; if nbSel ne 0 then begin ;--II.7.1-- Generate Clean Lightcurve spawn, 'cat '+dirLC+nameEucGeo+'|do_lcs -o '+dirLC+nameEucLC+$ ' -i '+dir3d+nameSpin+' '+dirSimu+'input_do_lcs '+dir3d+nameShape, res, err ;--II.7.2-- Read Lightcurve lc = koalaReadLC( dirLC+nameEucLC ) noise = randomn(seedEuclid+kSSO,lc.N) * uncEuclid ;--II.7.3-- Normalize and Add Noise to Lightcurve *lc.flux /= mean(*lc.flux) *lc.flux += noise ;--II.7.4-- Write the Lightcurve to Disk head = {filter:'VIS', unc:uncEuclid, src:'simulation'} koalaWriteLC, dirLC+nameEucLC, lc, header=head printf, idAll, dirLC+nameEucLC+' 1' endif ssoINFO[kSSO].euclid += SysTime(/JULIAN, /UTC) endif ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- III -- Generate Geometry and Lightcurve From Gaia -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; if doGaia eq 1 then begin print, ' Gaia' ssoINFO[kSSO].gaia = -SysTime(/JULIAN, /UTC) ;--III.1-- Retrieve Gaia Observing Conditions ----------------------------------------------; sel = where( gaiaObs.num eq num[kSSO], nbSel ) loc=gaiaObs[sel] ;--III.2-- Generate Observing Geometry from Gaia -------------------------------------------; jdArr = dblarr(nbSel) for kSel=0, nbSel-1 do begin loc[kSel].jd = date_conv(loc[kSel].utc,'JULIAN') jdArr[kSel] = loc[kSel].jd endfor lc = generateLC(num[kSSO], jdArr, /LTC, dump=dirLC+nameGaiaGeo, obs=ephGaia.obs) ;--III.3-- Generate Photometry -------------------------------------------------------------; ;--III.3.1-- Generate Clean Lightcurve spawn, 'cat '+dirLC+nameGaiaGeo+'|do_lcs -o '+dirLC+nameGaiaLC+$ ' -i '+dir3d+nameSpin+' '+dirSimu+'input_do_lcs '+dir3d+nameShape, res, err ;--III.3.2-- Read Lightcurve lc = koalaReadLC( dirLC+nameGaiaLC ) noise = randomn(seedGaia+kSSO,lc.N) * uncGaia ;--III.3.3-- Normalize and Add Noise to Lightcurve *lc.flux /= mean(*lc.flux) *lc.flux += noise ;--III.3.4-- Write the Lightcurve to Disk head = {filter:'G', unc:uncGaia, src:'simulation'} koalaWriteLC, dirLC+nameGaiaLC, lc, header=head printf, idAll, dirLC+nameGaiaLC+' 1' ssoINFO[kSSO].gaia += SysTime(/JULIAN, /UTC) endif ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- IV -- Generate Geometry and Lightcurve From LSST -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; if doLSST eq 1 then begin print, ' LSST' ssoINFO[kSSO].lsst = -SysTime(/JULIAN, /UTC) ;--IV.1-- Generation of LSST-centric Ephemerides -------------------------------------------; if not file_test(dirEph+nameEphI11,/Read) or genEph eq 1 then begin coords = voMiriade_callEphemcc( num[kSSO], ephLSST.ep, nbd=ephLSST.nbd, step=ephLSST.step, $ obs=ephLSST.obs, dump=dirEph+nameEphI11, mime='votable', /Web ) endif else $ coords = voMiriade_readEphemcc( dirEph+nameEphI11, mime='votable' ) ;--IV.2-- Cross-Match with Euclid Wide Survey ----------------------------------------------; ;--IV.2.1-- Rough Cross-Match spawn, xmatch+' -L -t -e '+dirEph+nameEphI11+$ ' -s '+dirLSST+'lsst.csv'+$ ' -o '+dirXM+nameXML, res, err ;--IV.2.2-- Read Cross-Match Output readcol, dirXM+nameXML, /Silent, Delimiter=',', $ trash,trash,trash,trash,trash,mjdXML, $ format='(I,I,F,F,A,D)' nbXML = n_elements(mjdXML) ;--IV.2.3-- Generate Ephemerides at Potential Cross-match Times if nbXML gt 0 then begin tmpLSST='/tmp/jd4lsst.dat' forprint, mjdXML+MJD_to_JD, format='(D)', /Silent, textout=tmpLSST, /NoComment coords = voMiriade_callEphemcc( num[kSSO], tmpLSST, /DateList, obs=ephLSST.obs, dump=dirEph+nameFineL, mime='votable', /Web ) ;--IV.2.4-- Fine Cross-Match spawn, xmatch+' -L -e '+dirEph+nameFineL+$ ' -s '+dirLSST+'lsst.csv'+$ ' -o '+dirXM+nameFineXL, res, err endif ;--IV.3-- Final Selection from FoV Geometry ------------------------------------------------; ;--IV.3.1-- Read Fine Cross-Match readcol, dirXM+nameFineXL, delimiter=',',/Silent, $ propID,fieldID,fieldRA,fieldDec,filter,expMJD,$ night,solarElong,airmass,fiveSigmaDepth,RAd_1,DECd_1,Target,Date,$ RA,DEC,Distance,Mv,Phase,Elongation,dRAcosDEC,dDEC,dist_dot,RAd_2,DECd_2, $ format='(I,I,F,F,A,D,'+$ 'I,F,F,F,F,F,A,A,'+$ 'F,F,F,F,F,F,F,F,F,F,F)' ;--IV.3.2-- Select Valid Cross-Matches deltaRA = abs(RAd_2-RAd_1) * cos( DECd_1*!DTOR ) deltaDEC= abs(DECd_2-DECd_1) sel = where( deltaRA le lsstDist and deltaDEC le lsstDist, nbSel ) if nbSel ne 0 then begin forprint, propID,fieldID,fieldRA,fieldDec,filter,expMJD,$ night,solarElong,airmass,fiveSigmaDepth,RAd_1,DECd_1,Target,Date,$ RA,DEC,Distance,Mv,Phase,Elongation,dRAcosDEC,dDEC,dist_dot,RAd_2,DECd_2, $ format='(I,I,F,F,A,D,'+$ 'I,F,F,F,F,F,A,A,'+$ 'F,F,F,F,F,F,F,F,F,F,F)', /Silent, $ textout=dirXM+nameLsstSel, subset=sel, $ comment='propID,fieldID,fieldRA,fieldDec,filter,expMJD,night,solarElong,airmass,fiveSigmaDepth,RAd_1,DECd_1,Target,Date,RA,DEC,Distance,Mv,Phase,Elongation,dRAcosDEC,dDEC,dist_dot,RAd_2,DECd_2' endif ;--IV.4-- Generate Observing Geometry and Photometry for LSST ------------------------------; if nbSel ne 0 then begin ;--IV.4.1-- Identify Filter List lsstJD = expMJD[sel] + MJD_to_JD lsstFilt = filter[sel] uniqFilt = uniq( lsstFilt, sort(lsstFilt) ) nbFilt = n_elements(uniqFilt) ;--IV.4.2-- Loop over Filter openW, idSel, dirLC+nameLsstList, /Get_Lun for kFilt=0, nbFilt-1 do begin ;--IV.4.3-- Generate Lightcurve Geometry cur=where( strCmp(lsstFilt,lsstFilt[uniqFilt[kFilt]]) ) nameCurGeo = nameLsstGeo+'-'+lsstFilt[uniqFilt[kFilt]] nameCurLC = nameLsstLC +'-'+lsstFilt[uniqFilt[kFilt]] lc = generateLC(num[kSSO], lsstJD[cur], /LTC, dump=dirLC+nameCurGeo, obs=ephLSST.obs) ;--IV.4.4-- Generate Clean Lightcurve spawn, 'cat '+dirLC+nameCurGeo+'|do_lcs -o '+dirLC+nameCurLC+$ ' -i '+dir3d+nameSpin+' '+dirSimu+'input_do_lcs '+dir3d+nameShape, res, err ;--IV.4.5-- Read Lightcurve lc = koalaReadLC( dirLC+nameCurLC ) noise = randomn(seedLSST+kSSO,lc.N) * uncLSST ;--IV.4.6-- Normalize and Add Noise to Lightcurve *lc.flux /= mean(*lc.flux) *lc.flux += noise ;--IV.4.7-- Write the Lightcurve to Disk head = {filter:lsstFilt[uniqFilt[kFilt]], unc:uncLSST, src:'simulation'} koalaWriteLC, dirLC+nameCurLC, lc, header=head printf, idSel, dirLC+nameCurLC+' 1' printf, idAll, dirLC+nameCurLC+' 1' endfor free_lun, idSel ;--IV.4.8-- Merge all LSST Lightcurves ; print, mergeLC+' -i '+dirLC+nameLsstList+' -o '+dirLC+nameLsstLC spawn, mergeLC+' -i '+dirLC+nameLsstList+' -o '+dirLC+nameLsstLC,res,err endif ssoINFO[kSSO].lsst += SysTime(/JULIAN, /UTC) endif ;--I.7-- Merge Euclid/Gaia/LSST Lightcurves ------------------------------------------------; free_lun, idAll spawn, mergeLC+' -i '+dirLC+nameAllList+' -o '+dirLC+nameAllLC,res,err endfor forprint, textout=dirSimu+'runtime.csv', $ format='(I6,",",A-22,",",F10.3,",",F10.3,",",F10.3)', /Silent, $ [num,0,0], $ [name,'Total','Average'], $ [ssoINFO.Euclid, total(ssoINFO.Euclid),total(ssoINFO.Euclid)/nbSSO]*86400., $ [ssoINFO.Gaia , total(ssoINFO.Gaia ),total(ssoINFO.Gaia )/nbSSO]*86400., $ [ssoINFO.LSST , total(ssoINFO.LSST ),total(ssoINFO.LSST )/nbSSO]*86400., $ comment='Number, Name, Euclid,Gaia,LSST' end ;; ;;;-----------------------------------------------------------------------------------------------; ;;;-----------------------------------------------------------------------------------------------; ;;;--- TAG --- II -- Generate ephemerides for Euclid for all Targets -----------------------; ;;;-----------------------------------------------------------------------------------------------; ;;;-----------------------------------------------------------------------------------------------; ;; if genEph eq 1 then begin ;; ;;; window, 2, title='EC coordinates' ;;; cgPlot, ecWide.lon, ecWide.lat, psym=3, xRange=[0,360], yRange=[-90,90] ;; ;; ;; ;--II.1-- Generate ephemerides from L2 with Miriade ;; for k=0, nbSSO-1 do begin ;; ;; nameEph=strTrim(string(num[k],format='(I)'),2)+'-'+strTrim(name[k],2)+'.xml' ;; print, nameEph ;; ;; if not file_test(dirSimu+nameEph,/read) or genEph eq 1 then begin ;; coords = voMiriade_callEphemcc( num[k], ep, nbd=nbd, step=step, $ ;; obs='@L2', dump=dirSimu+nameEph, mime='votable', /Web ) ;; endif else coords = voMiriade_readEphemcc( dirSimu+nameEph, mime='votable' ) ;; ;;; cgPlot, /OverPlot, coords.lon.dec, coords.lat.dec, psym=4, color='red' ;;; stop ;; ;; ;; endfor ;; ;; ;--II.2-- Cross-match Ephemerides with Euclid Surveys ;; ;; ;; ;; endif ;; ;; stop ;; ;; ;;;-----------------------------------------------------------------------------------------------; ;;;-----------------------------------------------------------------------------------------------; ;;;--- TAG --- III -- Create LCI file for a specific target -----------------------; ;;;-----------------------------------------------------------------------------------------------; ;;;-----------------------------------------------------------------------------------------------; ;; num=2001 ;-Einstein ;; ;;;curl "http://vo.imcce.fr/webservices/miriade/ephemcc_query.php?-type=aster&-name=5738&-tscale=UTC&-ep=2025-07-17T00:00:00&-nbd=600&-step=10m&-rplane=1&-teph=1&-tcoor=1&-observer=@L2&-mime=votable&-from=IDL" > /data/euclid/lc/simulation/5738-fine.xml ;; ;; ;; ;-- Directories ;; dirSSO = dirLC+'2001-Einstein/' ;; spinFile = strTrim(string(num,format='(I)'),2)+'.spin' ;; shapeFile = strTrim(string(num,format='(I)'),2)+'.ver' ;; ;; ;; ;--- read gaia ;;;-valid t0 = '2015-01-01' ;;;-valid nbEp = 200 ;;;-valid jdArr= dblarr(nbEp) ;;;-valid for k=0,nbEp-1 do jdArr[k] = date_conv( t0, 'JULIAN' )+8.*k ;;;-valid forprint, jdArr, randomn(1,nbEp)+1,randomn(1,nbEp)+0.1, format='(D16.8,2x,F5.2,2x,F5.2)', $ ;;;-valid textout=dirSSO+'gaia.jd', /NoComment, /Silent ;; ;; ;; readcol, dirSSO+'gaia.iso', iso, format='(A)',/silent ;; nbEp = n_elements( iso ) ;; jdArr= dblarr(nbEp) ;; for k=0,nbEp-1 do jdArr[k] = date_conv( iso[k], 'JULIAN' ) ;; forprint, jdArr, randomn(1,nbEp)+1,randomn(1,nbEp)+0.1, format='(D16.8,2x,F5.2,2x,F5.2)', $ ;; textout=dirSSO+'gaia.jd', /NoComment, /Silent ;; ;; ;; ;- convert gaia to LCI ;; koalaConvLC, num, dirSSO+'gaia.jd', dirSSO+'gaia.lci', /SIMPLE, src='Predictor', iau=obs ;; spawn, 'cat '+dirSSO+'gaia.lci | lc_convex '+dirSSO+spinFile+' '+dirSSO+shapeFile+' '+dirSSO+'out.gaia.model' ;; ;; ;; lc = koalaReadLC( dirSSO+'gaia.lci' ) ;; readcol, dirSSO+'out.gaia.model', predFlux, format='(F)',/Silent ;; predFlux /= mean( predFlux ) ;; *lc.flux = predFlux ;; ;; spawn, 'rm '+dirSSO+'out.gaia.model '+dirSSO+'gaia.jd' ;; ;; ;;; ;-- add noise ;; noise = randomn(1,lc.N)*uncGaia ;; *lc.flux += noise ;; ;; ;; ;; ;-- compute phase function for gaia ;; pf = shapePhaseFunction( lc, readSpin( dirSSO+spinFile )) ;;; *lc.flux *= *pf.value ;; ;;;-visu window, 0 ;;;-visu cgPlot, *lc.jd, *lc.flux, psym='Filled circle' ;;;-visu cgPlot, /OverPlot, *lc.jd, *lc.flux+noise, psym='Filled circle', color='cornflower blue' ;;;-visu ;;;-visu window, 2 ;;;-visu cgPlot, *pf.phase, *lc.flux, psym='Filled circle' ;;;-visu cgPlot, /OverPlot, *pf.phase, *lc.flux+noise, psym='Filled circle', color='cornflower blue' ;;;-visu cgPlot, *pf.phase, *pf.value, /OverPlot ;; ;; ;; head = {filter:'G', unc:uncGaia, src:'Simu'} ;; koalaWriteLC, dirSSO+'gaia.lci', lc, header=head ;; ;;stop ;; ;;jj: ;; ;--- find Euclid sighting ;; readcol, dirSimu+'2001-Einstein-match.csv', delimiter=',', $ ;; Id,fieldId,patchId,ditherId,obsType,MJD2000,UTC,Long,Lat,$ ;; Orientation,Qx,Qy,Qz,Qw,Dur,Slew,SPAA,SAA,Alpha,Beta,Slez,$ ;; XChange,Xrotation,Yrotation,Zrotation,$ ;; RA_1,DEC_1,MJD_1,Target,Date,RA_2,DEC_2,Distance,$ ;; Mv,Phase,Elongation,dRAcosDEC,dDEC,dist_dot,RAd,DECd,MJD_2, $ ;; format='(L,I,L,I,A,D,A,F,F,'+$ ;; 'F,F,F,F,F,I,I,F,F,F,F,F,'+$ ;; 'I,I,I,I,'+$ ;; 'F,F,D,A,A,A,A,F,'+$ ;; 'F,F,F,F,F,F,F,D)', /Silent ;; dMJD = abs(mjd_1 - mjd_2) ;; minJD = min( dMJD, pMin ) ;; ;; jd = mjd_1[pMin] + 2400000.5d ;; iso= date_conv( jd, 'FITS' ) ;; ;; DIT = [565., 121, 116, 81] ;; pre = [10.,40,20,20] ;; jit = 75. ;; ;; nbBlock = 4 ;; nbFilter = 4 ;; ;; nbEp = 16 ;; jdE = dblarr(nbEp) + jd ;; ;; kD=0 ;; for kC=0, nbBlock-1 do begin ;; for kF=0, nbFilter-1 do begin ;; ;; if kF eq 0 then begin ;; before = kC*(jit+total(pre+DIT)) + pre[0] ;; after = kC*(jit+total(pre+DIT)) + pre[0] + DIT[0] ;; endif else begin ;; before = kC*(jit+total(pre+DIT)) + total(pre[0:kF]) + total(DIT[0:kF-1]) ;; after = kC*(jit+total(pre+DIT)) + total(pre[0:kF]) + total(DIT[0:kF]) ;; endelse ;; ;; mid = (before+after)/2. ;; print, kC,kF, before, after, mid ;; ;; jdE[kD] += mid/86400.d ;; ;; kD++ ;; endfor ;; endfor ;; ;; ;;; cgplot, jdE, /yNoZero, psym=4 ;; ;; ;; forprint, jdE, randomn(1,nbEp)+1,randomn(1,nbEp)+0.1, format='(D16.8,2x,F5.2,2x,F5.2)', $ ;; textout=dirSSO+'euclid.jd', /NoComment, /Silent ;; ;; ;; ;- convert euclid to LCI ;; koalaConvLC, num, dirSSO+'euclid.jd', dirSSO+'euclid.lci', /SIMPLE, src='Simu', iau='@L2' ;; spawn, 'cat '+dirSSO+'euclid.lci | lc_convex '+dirSSO+spinFile+' '+dirSSO+shapeFile+' '+dirSSO+'out.euclid.model' ;; ;; ;; lc = koalaReadLC( dirSSO+'euclid.lci' ) ;; readcol, dirSSO+'out.euclid.model', predFlux, format='(F)',/Silent ;; predFlux /= mean( predFlux ) ;; *lc.flux = predFlux ;; ;; spawn, 'rm '+dirSSO+'out.euclid.model '+dirSSO+'euclid.jd' ;; ;; ;; ;-- add noise ;; noise = randomn(1,lc.N)*uncEuclid ;; ;; *lc.flux += noise ;; head = {filter:'VIS', unc:uncEuclid, src:'Simu'} ;; koalaWriteLC, dirSSO+'euclid.lci', lc, header=head ;; ;; cgPlot, *lc.jd, *lc.flux ;; ;; ;;end