Changeset 29060
- Timestamp:
- Aug 26, 2010, 9:18:39 AM (16 years ago)
- Location:
- branches/sc_branches/trunkTest
- Files:
-
- 1 deleted
- 289 edited
- 42 copied
-
. (modified) (1 prop)
-
Ohana (modified) (1 prop)
-
Ohana/src/addstar/include/addstar.h (modified) (1 diff)
-
Ohana/src/addstar/src/ConfigInit.c (modified) (1 diff)
-
Ohana/src/addstar/src/FilterStars.c (modified) (3 diffs)
-
Ohana/src/addstar/src/LoadData.c (modified) (1 diff)
-
Ohana/src/addstar/src/ReadStarsFITS.c (modified) (7 diffs)
-
Ohana/src/addstar/src/find_matches_refstars.c (modified) (2 diffs)
-
Ohana/src/addstar/test/dvomerge.dvo (modified) (1 diff)
-
Ohana/src/delstar/src/delete_imagename.c (modified) (1 diff)
-
Ohana/src/delstar/src/delete_times.c (modified) (1 diff)
-
Ohana/src/delstar/src/find_image_db.c (modified) (1 diff)
-
Ohana/src/dvomerge/Makefile (modified) (2 diffs)
-
Ohana/src/dvomerge/include/dvomerge.h (modified) (1 diff)
-
Ohana/src/dvomerge/src/SkyTablePopulatedRange.c (modified) (1 diff)
-
Ohana/src/dvomerge/src/args.c (modified) (2 diffs)
-
Ohana/src/dvomerge/src/dvo_image_merge_dbs.c (modified) (2 diffs)
-
Ohana/src/dvomerge/src/dvoconvert.c (modified) (1 diff)
-
Ohana/src/dvomerge/src/dvomergeUpdate.c (modified) (5 diffs)
-
Ohana/src/dvomerge/src/dvosecfilt.c (copied) (copied from trunk/Ohana/src/dvomerge/src/dvosecfilt.c )
-
Ohana/src/dvomerge/src/dvoverify.c (modified) (1 diff)
-
Ohana/src/dvomerge/src/help.c (modified) (3 diffs)
-
Ohana/src/gastro2/src/rfits.c (modified) (1 diff)
-
Ohana/src/getstar/src/dvoImageExtract.c (modified) (1 diff)
-
Ohana/src/getstar/src/dvoImageOverlaps.c (modified) (1 diff)
-
Ohana/src/getstar/src/dvoImagesAtCoords.c (modified) (1 diff)
-
Ohana/src/imregister/src/detsearch.c (modified) (1 diff)
-
Ohana/src/imregister/src/imphotsearch.c (modified) (1 diff)
-
Ohana/src/imregister/src/imregtable.c (modified) (1 diff)
-
Ohana/src/imregister/src/imsearch.c (modified) (1 diff)
-
Ohana/src/imregister/src/imstatreg.c (modified) (2 diffs)
-
Ohana/src/imregister/src/photsearch.c (modified) (1 diff)
-
Ohana/src/imregister/src/spsearch.c (modified) (1 diff)
-
Ohana/src/kapa2/src/DrawFrame.c (modified) (6 diffs)
-
Ohana/src/libautocode/def/AddstarClientOptions.d (modified) (2 diffs)
-
Ohana/src/libautocode/def/autocode.c (modified) (1 diff)
-
Ohana/src/libdvo/include/dvo.h (modified) (2 diffs)
-
Ohana/src/libdvo/src/LoadPhotcodesFITS.c (modified) (8 diffs)
-
Ohana/src/libdvo/src/cmf-ps1-v1-alt.c (modified) (1 diff)
-
Ohana/src/libdvo/src/coordops.c (modified) (12 diffs)
-
Ohana/src/libdvo/src/dvo_catalog_mef.c (modified) (1 diff)
-
Ohana/src/libdvo/src/dvo_catalog_split.c (modified) (2 diffs)
-
Ohana/src/libdvo/src/dvo_convert.c (modified) (9 diffs)
-
Ohana/src/libdvo/src/skyregion_io.c (modified) (1 diff)
-
Ohana/src/markstar/src/find_images.c (modified) (1 diff)
-
Ohana/src/mosastro/src/rfits.c (modified) (1 diff)
-
Ohana/src/opihi/cmd.astro/cgrid.c (modified) (1 diff)
-
Ohana/src/opihi/cmd.data/Makefile (modified) (2 diffs)
-
Ohana/src/opihi/cmd.data/applyfit2d.c (modified) (1 diff)
-
Ohana/src/opihi/cmd.data/applyfit3d.c (copied) (copied from trunk/Ohana/src/opihi/cmd.data/applyfit3d.c )
-
Ohana/src/opihi/cmd.data/fit2d.c (modified) (2 diffs)
-
Ohana/src/opihi/cmd.data/fit3d.c (copied) (copied from trunk/Ohana/src/opihi/cmd.data/fit3d.c )
-
Ohana/src/opihi/cmd.data/init.c (modified) (4 diffs)
-
Ohana/src/opihi/cmd.data/vgauss.c (modified) (1 diff)
-
Ohana/src/opihi/dvo/ImageSelection.c (modified) (2 diffs)
-
Ohana/src/opihi/dvo/LoadImages.c (modified) (3 diffs)
-
Ohana/src/opihi/dvo/cmpReadFile.c (modified) (1 diff)
-
Ohana/src/opihi/dvo/gimages.c (modified) (1 diff)
-
Ohana/src/opihi/dvo/images.c (modified) (1 diff)
-
Ohana/src/opihi/dvo/imdense.c (modified) (1 diff)
-
Ohana/src/opihi/dvo/imextract.c (modified) (1 diff)
-
Ohana/src/opihi/include/dvoshell.h (modified) (1 diff)
-
Ohana/src/photdbc/src/copy_images.c (modified) (1 diff)
-
Ohana/src/photdbc/src/find_images.c (modified) (2 diffs)
-
Ohana/src/photdbc/src/flag_measures.c (modified) (1 diff)
-
Ohana/src/relastro/Makefile (modified) (1 diff)
-
Ohana/src/relastro/doc/notes.txt (modified) (1 diff)
-
Ohana/src/relastro/include/relastro.h (modified) (7 diffs)
-
Ohana/src/relastro/src/ConfigInit.c (modified) (1 diff)
-
Ohana/src/relastro/src/FitChip.c (modified) (10 diffs)
-
Ohana/src/relastro/src/FitMosaic.c (modified) (1 diff)
-
Ohana/src/relastro/src/FitSimple.c (modified) (1 diff)
-
Ohana/src/relastro/src/ImageOps.c (modified) (5 diffs)
-
Ohana/src/relastro/src/StarMaps.c (copied) (copied from trunk/Ohana/src/relastro/src/StarMaps.c )
-
Ohana/src/relastro/src/UpdateChips.c (modified) (1 diff)
-
Ohana/src/relastro/src/UpdateMeasures.c (modified) (2 diffs)
-
Ohana/src/relastro/src/bcatalog.c (modified) (2 diffs)
-
Ohana/src/relastro/src/fitpoly.c (modified) (5 diffs)
-
Ohana/src/relastro/src/initialize.c (modified) (1 diff)
-
Ohana/src/relastro/src/load_catalogs.c (modified) (2 diffs)
-
Ohana/src/relastro/src/load_images.c (modified) (2 diffs)
-
Ohana/src/relastro/src/mkpolyterm.c (modified) (1 diff)
-
Ohana/src/relastro/src/relastro.c (modified) (4 diffs)
-
Ohana/src/relastro/src/select_images.c (modified) (3 diffs)
-
Ohana/src/relphot/src/ImageOps.c (modified) (4 diffs)
-
Ohana/src/relphot/src/MosaicOps.c (modified) (5 diffs)
-
Ohana/src/relphot/src/StarOps.c (modified) (5 diffs)
-
Ohana/src/relphot/src/initialize.c (modified) (1 diff)
-
Ohana/src/relphot/src/load_images.c (modified) (1 diff)
-
Ohana/src/relphot/src/select_images.c (modified) (1 diff)
-
Ohana/src/relphot/src/setMrelFinal.c (modified) (1 diff)
-
Ohana/src/uniphot/src/find_image_sgroups.c (modified) (3 diffs)
-
Ohana/src/uniphot/src/find_image_tgroups.c (modified) (2 diffs)
-
Ohana/src/uniphot/src/initialize.c (modified) (1 diff)
-
Ohana/src/uniphot/src/load_images.c (modified) (1 diff)
-
Ohana/src/uniphot/src/match_zpts_to_images.c (modified) (1 diff)
-
Ohana/src/uniphot/src/subset_images.c (modified) (3 diffs)
-
Ohana/src/uniphot/src/update.c (modified) (1 diff)
-
PS-IPP-PStamp/lib/PS/IPP/PStamp/Job.pm (modified) (1 diff)
-
ippMonitor/Makefile.in (modified) (8 diffs)
-
ippMonitor/def/failedCamProcessedExp.d (copied) (copied from trunk/ippMonitor/def/failedCamProcessedExp.d )
-
ippMonitor/def/failedChipProcessedImfile.d (copied) (copied from trunk/ippMonitor/def/failedChipProcessedImfile.d )
-
ippMonitor/def/failedDiffSkyfile.d (copied) (copied from trunk/ippMonitor/def/failedDiffSkyfile.d )
-
ippMonitor/def/failedFakeProcessedImfile.d (copied) (copied from trunk/ippMonitor/def/failedFakeProcessedImfile.d )
-
ippMonitor/def/failedMagicMasks.d (copied) (copied from trunk/ippMonitor/def/failedMagicMasks.d )
-
ippMonitor/def/failedMagicNodes.d (copied) (copied from trunk/ippMonitor/def/failedMagicNodes.d )
-
ippMonitor/def/failedMagicTrees.d (copied) (copied from trunk/ippMonitor/def/failedMagicTrees.d )
-
ippMonitor/def/failedStackSkyfile.d (copied) (copied from trunk/ippMonitor/def/failedStackSkyfile.d )
-
ippMonitor/def/failedWarpSkyfiles.d (copied) (copied from trunk/ippMonitor/def/failedWarpSkyfiles.d )
-
ippMonitor/raw/czartool_labels.php (modified) (15 diffs)
-
ippMonitor/raw/diskUsage.php (copied) (copied from trunk/ippMonitor/raw/diskUsage.php )
-
ippMonitor/raw/ipp.imfiles.dat (modified) (1 diff)
-
ippMonitor/scripts/generate (modified) (2 diffs)
-
ippScripts/scripts/addstar_run.pl (modified) (1 diff)
-
ippScripts/scripts/automate_stacks.pl (modified) (22 diffs)
-
ippScripts/scripts/dist_advancerun.pl (modified) (2 diffs)
-
ippScripts/scripts/dist_bundle.pl (modified) (3 diffs)
-
ippScripts/scripts/dist_make_fileset.pl (modified) (1 diff)
-
ippScripts/scripts/staticsky.pl (modified) (2 diffs)
-
ippTasks/nightly_stacks.pro (modified) (9 diffs)
-
ippToPsps/perl/checkOdmStatus.pl (modified) (2 diffs)
-
ippToPsps/src/ippToPspsBatchDetection.c (modified) (1 diff)
-
ippTools/share/Makefile.am (modified) (3 diffs)
-
ippTools/share/disttool_definebyquery_sky.sql (copied) (copied from trunk/ippTools/share/disttool_definebyquery_sky.sql )
-
ippTools/share/disttool_pending_sky.sql (copied) (copied from trunk/ippTools/share/disttool_pending_sky.sql )
-
ippTools/share/disttool_toadvance.sql (modified) (1 diff)
-
ippTools/share/staticskytool_export_input.sql (copied) (copied from trunk/ippTools/share/staticskytool_export_input.sql )
-
ippTools/share/staticskytool_export_result.sql (copied) (copied from trunk/ippTools/share/staticskytool_export_result.sql )
-
ippTools/share/staticskytool_export_run.sql (copied) (copied from trunk/ippTools/share/staticskytool_export_run.sql )
-
ippTools/share/staticskytool_result.sql (modified) (1 diff)
-
ippTools/src/disttool.c (modified) (1 diff)
-
ippTools/src/staticskytool.c (modified) (5 diffs)
-
ippconfig/gpc1/ppMerge.config (modified) (1 diff)
-
ippconfig/recipes (modified) (1 prop)
-
ippconfig/recipes/filerules-split.mdc (modified) (1 diff)
-
ippconfig/recipes/fitstypes.mdc (modified) (1 diff)
-
ippconfig/recipes/nightly_science.config (modified) (1 diff)
-
ippconfig/recipes/ppSim.config (modified) (1 diff)
-
ippconfig/recipes/ppSub.config (modified) (3 diffs)
-
ippconfig/recipes/psphot.config (modified) (9 diffs)
-
ippconfig/simtest/format.config (modified) (1 diff)
-
ppSim/src/ppSimArguments.c (modified) (2 diffs)
-
ppSim/src/ppSimCreate.c (modified) (1 diff)
-
ppSim/src/ppSimInsertGalaxies.c (modified) (5 diffs)
-
ppSim/src/ppSimInsertStars.c (modified) (2 diffs)
-
ppSim/src/ppSimMakeGalaxies.c (modified) (5 diffs)
-
ppSim/src/ppSimPhotomReadout.c (modified) (1 diff)
-
ppSim/src/ppSimPhotomReadoutFake.c (modified) (2 diffs)
-
ppSim/src/ppSimPhotomReadoutForce.c (modified) (1 diff)
-
ppSim/src/ppSimSmoothReadout.c (modified) (2 diffs)
-
ppSub/src/Makefile.am (modified) (1 diff)
-
ppSub/src/ppSub.h (modified) (1 diff)
-
ppSub/src/ppSubBackground.c (modified) (1 diff)
-
ppSub/src/ppSubFlagNeighbors.c (copied) (copied from trunk/ppSub/src/ppSubFlagNeighbors.c )
-
ppSub/src/ppSubLoop.c (modified) (8 diffs)
-
ppSub/src/ppSubReadoutPhotometry.c (modified) (1 diff)
-
ppSub/src/ppSubReadoutSubtract.c (modified) (1 diff)
-
psLib/src/fft/psImageFFT.c (modified) (2 diffs)
-
psLib/src/fft/psImageFFT.h (modified) (2 diffs)
-
psLib/src/jpeg/psImageJpeg.c (modified) (2 diffs)
-
psLib/src/math/psMinimizeLMM.c (modified) (9 diffs)
-
psLib/src/math/psMinimizeLMM.h (modified) (3 diffs)
-
psLib/src/math/psMinimizePowell.c (modified) (4 diffs)
-
psLib/src/math/psStats.c (modified) (1 diff)
-
psLib/test/math/Makefile.am (modified) (1 diff)
-
psLib/test/math/data/polyMD.dat (copied) (copied from trunk/psLib/test/math/data/polyMD.dat )
-
psLib/test/math/data/polyMD.pro (copied) (copied from trunk/psLib/test/math/data/polyMD.pro )
-
psLib/test/math/tap_psPolynomialMD_sampleDark.c (copied) (copied from trunk/psLib/test/math/tap_psPolynomialMD_sampleDark.c )
-
psModules (modified) (1 prop)
-
psModules/src/camera/pmFPAfileIO.c (modified) (1 diff)
-
psModules/src/camera/pmReadoutFake.c (modified) (1 diff)
-
psModules/src/camera/pmReadoutFake.h (modified) (1 diff)
-
psModules/src/config/pmConfig.c (modified) (2 diffs)
-
psModules/src/detrend/pmMaskStats.c (modified) (2 diffs)
-
psModules/src/detrend/pmShutterCorrection.c (modified) (1 diff)
-
psModules/src/extras/Makefile.am (modified) (2 diffs)
-
psModules/src/extras/pmVisual.c (modified) (3 diffs)
-
psModules/src/extras/pmVisualUtils.c (copied) (copied from trunk/psModules/src/extras/pmVisualUtils.c )
-
psModules/src/extras/pmVisualUtils.h (copied) (copied from trunk/psModules/src/extras/pmVisualUtils.h )
-
psModules/src/imcombine/pmPSFEnvelope.c (modified) (2 diffs)
-
psModules/src/imcombine/pmSubtraction.c (modified) (5 diffs)
-
psModules/src/imcombine/pmSubtraction.h (modified) (2 diffs)
-
psModules/src/imcombine/pmSubtractionEquation.c (modified) (18 diffs)
-
psModules/src/imcombine/pmSubtractionEquation.h (modified) (2 diffs)
-
psModules/src/imcombine/pmSubtractionKernels.c (modified) (19 diffs)
-
psModules/src/imcombine/pmSubtractionKernels.h (modified) (2 diffs)
-
psModules/src/imcombine/pmSubtractionMatch.c (modified) (1 diff)
-
psModules/src/imcombine/pmSubtractionMatch.h (modified) (1 diff)
-
psModules/src/imcombine/pmSubtractionStamps.c (modified) (11 diffs)
-
psModules/src/imcombine/pmSubtractionStamps.h (modified) (2 diffs)
-
psModules/src/imcombine/pmSubtractionVisual.c (modified) (11 diffs)
-
psModules/src/objects/Makefile.am (modified) (6 diffs)
-
psModules/src/objects/models/pmModel_DEV.c (copied) (copied from trunk/psModules/src/objects/models/pmModel_DEV.c )
-
psModules/src/objects/models/pmModel_DEV.h (copied) (copied from trunk/psModules/src/objects/models/pmModel_DEV.h )
-
psModules/src/objects/models/pmModel_EXP.c (copied) (copied from trunk/psModules/src/objects/models/pmModel_EXP.c )
-
psModules/src/objects/models/pmModel_EXP.h (copied) (copied from trunk/psModules/src/objects/models/pmModel_EXP.h )
-
psModules/src/objects/models/pmModel_GAUSS.c (modified) (5 diffs)
-
psModules/src/objects/models/pmModel_PGAUSS.c (modified) (3 diffs)
-
psModules/src/objects/models/pmModel_PS1_V1.c (modified) (4 diffs)
-
psModules/src/objects/models/pmModel_QGAUSS.c (modified) (3 diffs)
-
psModules/src/objects/models/pmModel_RGAUSS.c (modified) (4 diffs)
-
psModules/src/objects/models/pmModel_SERSIC.c (modified) (13 diffs)
-
psModules/src/objects/pmDetEff.c (modified) (1 diff)
-
psModules/src/objects/pmDetEff.h (modified) (1 diff)
-
psModules/src/objects/pmFootprint.c (modified) (1 diff)
-
psModules/src/objects/pmFootprint.h (modified) (1 diff)
-
psModules/src/objects/pmFootprintArrayGrow.c (modified) (1 diff)
-
psModules/src/objects/pmFootprintArraysMerge.c (modified) (1 diff)
-
psModules/src/objects/pmFootprintAssignPeaks.c (modified) (1 diff)
-
psModules/src/objects/pmFootprintCullPeaks.c (modified) (1 diff)
-
psModules/src/objects/pmFootprintFind.c (modified) (1 diff)
-
psModules/src/objects/pmFootprintFindAtPoint.c (modified) (1 diff)
-
psModules/src/objects/pmFootprintIDs.c (modified) (1 diff)
-
psModules/src/objects/pmFootprintSpans.c (modified) (1 diff)
-
psModules/src/objects/pmFootprintSpans.h (modified) (1 diff)
-
psModules/src/objects/pmGrowthCurve.c (modified) (1 diff)
-
psModules/src/objects/pmGrowthCurveGenerate.c (modified) (1 diff)
-
psModules/src/objects/pmModel.c (modified) (2 diffs)
-
psModules/src/objects/pmModel.h (modified) (3 diffs)
-
psModules/src/objects/pmModelClass.c (modified) (3 diffs)
-
psModules/src/objects/pmModelClass.h (modified) (1 diff)
-
psModules/src/objects/pmModelFuncs.h (copied) (copied from trunk/psModules/src/objects/pmModelFuncs.h )
-
psModules/src/objects/pmModelUtils.c (modified) (1 diff)
-
psModules/src/objects/pmMoments.c (modified) (1 diff)
-
psModules/src/objects/pmMoments.h (modified) (2 diffs)
-
psModules/src/objects/pmPCM_MinimizeChisq.c (copied) (copied from trunk/psModules/src/objects/pmPCM_MinimizeChisq.c )
-
psModules/src/objects/pmPCMdata.c (copied) (copied from trunk/psModules/src/objects/pmPCMdata.c )
-
psModules/src/objects/pmPCMdata.h (copied) (copied from trunk/psModules/src/objects/pmPCMdata.h )
-
psModules/src/objects/pmPSF.c (modified) (3 diffs)
-
psModules/src/objects/pmPSF.h (modified) (4 diffs)
-
psModules/src/objects/pmPSF_IO.c (modified) (1 diff)
-
psModules/src/objects/pmPSFtry.c (modified) (1 diff)
-
psModules/src/objects/pmPSFtryFitEXT.c (modified) (3 diffs)
-
psModules/src/objects/pmPSFtryFitPSF.c (modified) (4 diffs)
-
psModules/src/objects/pmPSFtryMakePSF.c (modified) (1 diff)
-
psModules/src/objects/pmPSFtryMetric.c (modified) (1 diff)
-
psModules/src/objects/pmPSFtryModel.c (modified) (2 diffs)
-
psModules/src/objects/pmPeaks.c (modified) (1 diff)
-
psModules/src/objects/pmPeaks.h (modified) (1 diff)
-
psModules/src/objects/pmPhotObj.c (modified) (2 diffs)
-
psModules/src/objects/pmPhotObj.h (modified) (2 diffs)
-
psModules/src/objects/pmSource.c (modified) (11 diffs)
-
psModules/src/objects/pmSource.h (modified) (6 diffs)
-
psModules/src/objects/pmSourceContour.c (modified) (1 diff)
-
psModules/src/objects/pmSourceDiffStats.c (modified) (1 diff)
-
psModules/src/objects/pmSourceDiffStats.h (modified) (1 diff)
-
psModules/src/objects/pmSourceFitModel.c (modified) (10 diffs)
-
psModules/src/objects/pmSourceFitModel.h (modified) (2 diffs)
-
psModules/src/objects/pmSourceFitPCM.c (copied) (copied from trunk/psModules/src/objects/pmSourceFitPCM.c )
-
psModules/src/objects/pmSourceFitSet.c (modified) (5 diffs)
-
psModules/src/objects/pmSourceFitSet.h (modified) (1 diff)
-
psModules/src/objects/pmSourceGroup.h (deleted)
-
psModules/src/objects/pmSourceGroups.c (modified) (1 diff)
-
psModules/src/objects/pmSourceGroups.h (modified) (1 diff)
-
psModules/src/objects/pmSourceIO.c (modified) (5 diffs)
-
psModules/src/objects/pmSourceIO.h (modified) (2 diffs)
-
psModules/src/objects/pmSourceIO_CMF_PS1_DV1.c (modified) (6 diffs)
-
psModules/src/objects/pmSourceIO_CMF_PS1_DV2.c (copied) (copied from trunk/psModules/src/objects/pmSourceIO_CMF_PS1_DV2.c )
-
psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c (modified) (14 diffs)
-
psModules/src/objects/pmSourceIO_CMF_PS1_V1.c (modified) (6 diffs)
-
psModules/src/objects/pmSourceIO_CMF_PS1_V2.c (modified) (6 diffs)
-
psModules/src/objects/pmSourceIO_CMF_PS1_V3.c (copied) (copied from trunk/psModules/src/objects/pmSourceIO_CMF_PS1_V3.c )
-
psModules/src/objects/pmSourceIO_CMP.c (modified) (1 diff)
-
psModules/src/objects/pmSourceIO_MatchedRefs.c (modified) (1 diff)
-
psModules/src/objects/pmSourceIO_OBJ.c (modified) (1 diff)
-
psModules/src/objects/pmSourceIO_PS1_CAL_0.c (modified) (5 diffs)
-
psModules/src/objects/pmSourceIO_PS1_DEV_0.c (modified) (5 diffs)
-
psModules/src/objects/pmSourceIO_PS1_DEV_1.c (modified) (7 diffs)
-
psModules/src/objects/pmSourceIO_RAW.c (modified) (3 diffs)
-
psModules/src/objects/pmSourceIO_SMPDATA.c (modified) (5 diffs)
-
psModules/src/objects/pmSourceIO_SX.c (modified) (1 diff)
-
psModules/src/objects/pmSourceMasks.h (modified) (1 diff)
-
psModules/src/objects/pmSourceMatch.c (modified) (1 diff)
-
psModules/src/objects/pmSourceMatch.h (modified) (1 diff)
-
psModules/src/objects/pmSourceMoments.c (modified) (11 diffs)
-
psModules/src/objects/pmSourcePhotometry.c (modified) (13 diffs)
-
psModules/src/objects/pmSourcePhotometry.h (modified) (1 diff)
-
psModules/src/objects/pmSourcePlotApResid.c (modified) (1 diff)
-
psModules/src/objects/pmSourcePlotMoments.c (modified) (1 diff)
-
psModules/src/objects/pmSourcePlotPSFModel.c (modified) (1 diff)
-
psModules/src/objects/pmSourceSky.c (modified) (1 diff)
-
psModules/src/objects/pmSourceUtils.c (modified) (1 diff)
-
psModules/src/objects/pmSourceVisual.c (modified) (7 diffs)
-
psModules/src/objects/pmSpan.h (modified) (1 diff)
-
psModules/src/objects/pmTrend2D.h (modified) (1 diff)
-
psModules/src/psmodules.h (modified) (4 diffs)
-
psastro/src/psastroModelFitBoresite.c (modified) (1 diff)
-
psphot (modified) (1 prop)
-
psphot/doc/notes.20100715.txt (copied) (copied from trunk/psphot/doc/notes.20100715.txt )
-
psphot/doc/psf.load.txt (copied) (copied from trunk/psphot/doc/psf.load.txt )
-
psphot/doc/visual.txt (copied) (copied from trunk/psphot/doc/visual.txt )
-
psphot/src/Makefile.am (modified) (1 diff)
-
psphot/src/psphot.h (modified) (8 diffs)
-
psphot/src/psphotAddNoise.c (modified) (3 diffs)
-
psphot/src/psphotApResid.c (modified) (1 diff)
-
psphot/src/psphotArguments.c (modified) (1 diff)
-
psphot/src/psphotBlendFit.c (modified) (12 diffs)
-
psphot/src/psphotChoosePSF.c (modified) (4 diffs)
-
psphot/src/psphotEllipticalContour.c (modified) (1 diff)
-
psphot/src/psphotExtendedSourceAnalysis.c (modified) (3 diffs)
-
psphot/src/psphotExtendedSourceFits.c (modified) (9 diffs)
-
psphot/src/psphotFindDetections.c (modified) (1 diff)
-
psphot/src/psphotFitSet.c (modified) (1 diff)
-
psphot/src/psphotFitSourcesLinear.c (modified) (2 diffs)
-
psphot/src/psphotFitSourcesLinearStack.c (modified) (1 diff)
-
psphot/src/psphotGuessModels.c (modified) (1 diff)
-
psphot/src/psphotLoadSRCTEXT.c (modified) (1 diff)
-
psphot/src/psphotMagnitudes.c (modified) (5 diffs)
-
psphot/src/psphotModelWithPSF.c (modified) (2 diffs)
-
psphot/src/psphotPSFConvModel.c (modified) (2 diffs)
-
psphot/src/psphotPetrosianVisual.c (modified) (5 diffs)
-
psphot/src/psphotRadiusChecks.c (modified) (9 diffs)
-
psphot/src/psphotReadout.c (modified) (1 diff)
-
psphot/src/psphotSetThreads.c (modified) (2 diffs)
-
psphot/src/psphotSignificanceImage.c (modified) (1 diff)
-
psphot/src/psphotSourceFits.c (modified) (23 diffs)
-
psphot/src/psphotSourceSize.c (modified) (8 diffs)
-
psphot/src/psphotSourceStats.c (modified) (4 diffs)
-
psphot/src/psphotStack.c (modified) (1 diff)
-
psphot/src/psphotStackMatchPSFsUtils.c (modified) (2 diffs)
-
psphot/src/psphotVisual.c (modified) (46 diffs)
-
pstamp/scripts/detectability_respond.pl (modified) (6 diffs)
-
pstamp/scripts/pstamp_checkdependent.pl (modified) (2 diffs)
-
pswarp/src/pswarpTransformSources.c (modified) (1 diff)
-
tools/czarclean.pl (copied) (copied from trunk/tools/czarclean.pl )
-
tools/czarplot.pl (modified) (5 diffs)
-
tools/czartool/Burntool.pm (copied) (copied from trunk/tools/czartool/Burntool.pm )
-
tools/czartool/CzarDb.pm (modified) (6 diffs)
-
tools/czartool/Czarplot.pm (modified) (5 diffs)
-
tools/czartool/MySQLDb.pm (modified) (1 diff)
-
tools/neb-grep (copied) (copied from trunk/tools/neb-grep )
-
tools/roboczar.pl (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/sc_branches/trunkTest
- Property svn:mergeinfo changed
-
branches/sc_branches/trunkTest/Ohana
- Property svn:mergeinfo deleted
-
branches/sc_branches/trunkTest/Ohana/src/addstar/include/addstar.h
r27435 r29060 209 209 Stars *ReadStarsSDSS PROTO((FILE *f, char *name, Header *header, Header *in_theader, Image *images, off_t *nimages, unsigned int *nstars)); 210 210 int ReadImageHeader PROTO((Header *header, Image *image, int photcode)); 211 Stars *FilterStars PROTO((Stars *instars, Image *image, unsigned int imageID ));211 Stars *FilterStars PROTO((Stars *instars, Image *image, unsigned int imageID, const AddstarClientOptions *options)); 212 212 Stars *MergeStars PROTO((Stars *stars, unsigned int *Nstars, Stars *instars, unsigned int Ninstars)); 213 213 double scat_subpix PROTO((double x, double y)); -
branches/sc_branches/trunkTest/Ohana/src/addstar/src/ConfigInit.c
r28214 r29060 212 212 } 213 213 214 /* get detection filtering mask */ 215 if(!ScanConfig (config, "DETECTIONFILTER", "%d", 0, &options.detectionFilter)) { 216 options.detectionFilter = 0; 217 fprintf (stderr, "Could not find 'DETECTIONFILTER' in config, using '%x'\n", options.detectionFilter); 218 } 219 214 220 free (config); 215 221 free (file); -
branches/sc_branches/trunkTest/Ohana/src/addstar/src/FilterStars.c
r28214 r29060 10 10 // the imageID supplied here is the sequence **within this set** 11 11 // this value is updated based on the image table later 12 Stars *FilterStars (Stars *instars, Image *image, unsigned int imageID ) {12 Stars *FilterStars (Stars *instars, Image *image, unsigned int imageID, const AddstarClientOptions *options) { 13 13 14 14 int j, N; … … 28 28 ALLOCATE (stars, Stars, image[0].nstar); 29 29 for (N = j = 0; j < image[0].nstar; j++) { 30 31 if (instars[j].measure.photFlags & options->detectionFilter) continue; 30 32 31 33 /* allow for some dynamic filtering of star list */ … … 100 102 N ++; 101 103 } 104 105 // DEBUG printf("N stars orig = %d after filter = %d\n", image[0].nstar, N); 106 102 107 image[0].nstar = N; 103 108 REALLOCATE (stars, Stars, image[0].nstar); -
branches/sc_branches/trunkTest/Ohana/src/addstar/src/LoadData.c
r27435 r29060 80 80 81 81 inStars = ReadStarsFITS (f, headers[Nhead], headers[Ndata], &images[0][Nvalid].nstar); 82 inStars = FilterStars (inStars, &images[0][Nvalid], Nvalid); 82 if (!inStars) { 83 // XXX need to free the data here or in ReadStarsFITS on error 84 continue; 85 } 86 inStars = FilterStars (inStars, &images[0][Nvalid], Nvalid, options); 83 87 *stars = MergeStars (*stars, Nstars, inStars, images[0][Nvalid].nstar); 84 88 Nvalid++; -
branches/sc_branches/trunkTest/Ohana/src/addstar/src/ReadStarsFITS.c
r27435 r29060 49 49 if (stars == NULL) { 50 50 fprintf (stderr, "ERROR: invalid table type %s\n", type); 51 exit (1);51 return (NULL); 52 52 } 53 53 // Nstars is not necessarily == *nstars (The former is the number of detections, the … … 69 69 swapped = FALSE; 70 70 smpdata = gfits_table_get_SMPData (table, &Nstars, &swapped); 71 if (!smpdata) { 72 fprintf (stderr, "skipping inconsistent entry\n"); 73 return (NULL); 74 } 71 75 ZeroPt = GetZeroPoint(); 72 76 … … 108 112 109 113 ps1data = gfits_table_get_PS1_DEV_0 (table, &Nstars, NULL); 114 if (!ps1data) { 115 fprintf (stderr, "skipping inconsistent entry\n"); 116 return (NULL); 117 } 110 118 ZeroPt = GetZeroPoint(); 111 119 … … 153 161 154 162 ps1data = gfits_table_get_PS1_DEV_1 (table, &Nstars, NULL); 163 if (!ps1data) { 164 fprintf (stderr, "skipping inconsistent entry\n"); 165 return (NULL); 166 } 155 167 ZeroPt = GetZeroPoint(); 156 168 … … 212 224 213 225 ps1data = gfits_table_get_CMF_PS1_V1 (table, &Nstars, NULL); 226 if (!ps1data) { 227 fprintf (stderr, "skipping inconsistent entry\n"); 228 return (NULL); 229 } 214 230 ZeroPt = GetZeroPoint(); 215 231 … … 284 300 285 301 ps1data = gfits_table_get_CMF_PS1_V1_Alt (table, &Nstars, NULL); 302 if (!ps1data) { 303 fprintf (stderr, "skipping inconsistent entry\n"); 304 return (NULL); 305 } 286 306 ZeroPt = GetZeroPoint(); 287 307 … … 348 368 349 369 ps1data = gfits_table_get_CMF_PS1_V2 (table, &Nstars, NULL); 370 if (!ps1data) { 371 fprintf (stderr, "skipping inconsistent entry\n"); 372 return (NULL); 373 } 350 374 ZeroPt = GetZeroPoint(); 351 375 -
branches/sc_branches/trunkTest/Ohana/src/addstar/src/find_matches_refstars.c
r28241 r29060 218 218 } 219 219 220 N = N1[i];220 N = i; 221 221 if (stars[N][0].found > -1) continue; 222 222 if (!IN_REGION (stars[N][0].average.R, stars[N][0].average.D)) continue; … … 286 286 287 287 for (j = 0; j < NREFSTAR_GROUP; j++) { 288 N = N1[i + j];288 N = i + j; 289 289 290 290 catalog[0].measure[Nmeas] = stars[N][0].measure; -
branches/sc_branches/trunkTest/Ohana/src/addstar/test/dvomerge.dvo
r28368 r29060 95 95 subset T = t if (id == imageID[$i]) 96 96 set dT = T - time[$i] 97 vstat -qdT97 vstat dT 98 98 tapOK {abs($MEAN) < 0.00001} "time for measure ID $i (MEAN)" 99 99 tapOK {abs($SIGMA) < 0.00001} "time for measure ID $i (SIGMA)" -
branches/sc_branches/trunkTest/Ohana/src/delstar/src/delete_imagename.c
r28241 r29060 19 19 20 20 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 21 if (!image) { 22 fprintf (stderr, "ERROR: failed to read images\n"); 23 exit (2); 24 } 21 25 22 26 /* find image in db by name */ -
branches/sc_branches/trunkTest/Ohana/src/delstar/src/delete_times.c
r27435 r29060 26 26 27 27 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 28 if (!image) { 29 fprintf (stderr, "ERROR: failed to read images\n"); 30 exit (2); 31 } 28 32 29 33 /* find images for time range, delete each image */ -
branches/sc_branches/trunkTest/Ohana/src/delstar/src/find_image_db.c
r27435 r29060 17 17 18 18 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 19 if (!image) { 20 fprintf (stderr, "ERROR: failed to read images\n"); 21 exit (2); 22 } 19 23 20 24 Nlist = 0; -
branches/sc_branches/trunkTest/Ohana/src/dvomerge/Makefile
r27583 r29060 20 20 dvomerge : $(BIN)/dvoconvert.$(ARCH) 21 21 22 all: dvomerge dvoconvert 22 all: dvomerge dvoconvert dvosecfilt 23 23 24 24 DVOMERGE = \ … … 58 58 $(BIN)/dvoconvert.$(ARCH) : $(DVOCONVERT) 59 59 60 INSTALL = dvomerge dvoconvert 60 DVOSECFILT = \ 61 $(SRC)/dvosecfilt.$(ARCH).o \ 62 $(SRC)/SetSignals.$(ARCH).o \ 63 $(SRC)/ConfigInit.$(ARCH).o \ 64 $(SRC)/Shutdown.$(ARCH).o \ 65 $(SRC)/help.$(ARCH).o \ 66 $(SRC)/args.$(ARCH).o 67 68 $(DVOSECFILT) : $(INC)/dvomerge.h 69 70 $(BIN)/dvosecfilt.$(ARCH) : $(DVOSECFILT) 71 72 INSTALL = dvomerge dvoconvert dvosecfilt 61 73 62 74 # dependancy rules for binary code ######################### -
branches/sc_branches/trunkTest/Ohana/src/dvomerge/include/dvomerge.h
r28855 r29060 55 55 int dvoconvert_args PROTO((int *argc, char **argv)); 56 56 57 void dvosecfilt_usage PROTO((void)); 58 void dvosecfilt_help PROTO((int argc, char **argv)); 59 int dvosecfilt_args PROTO((int *argc, char **argv)); 60 57 61 int SkyTablePopulatedRange PROTO((off_t *ns, off_t *ne, SkyTable *sky, off_t Nstart)); 62 int SkyListPopulatedRange PROTO((off_t *ns, off_t *ne, SkyList *sky, off_t Nstart)); 58 63 59 64 SkyList *SkyTablePopulatedList PROTO((SkyTable *sky)); -
branches/sc_branches/trunkTest/Ohana/src/dvomerge/src/SkyTablePopulatedRange.c
r27435 r29060 12 12 Ns = sky[0].regions[Nstart].childS; 13 13 Ne = sky[0].regions[Nstart].childE; 14 if (Ns == 0) { 15 fprintf (stderr, "no populated tables at an appropriate depth\n"); 16 exit (1); 17 } 18 Nstart = Ns; 19 } 20 21 *ns = Ns; 22 *ne = Ne; 23 return (TRUE); 24 } 25 26 int SkyListPopulatedRange (off_t *ns, off_t *ne, SkyList *sky, off_t Nstart) { 27 28 off_t Ns, Ne; 29 30 // given the starting sky region, find the populated range at or below this region 31 32 Ns = Nstart; 33 Ne = Nstart + 1; 34 while (!sky[0].regions[Nstart][0].table) { 35 Ns = sky[0].regions[Nstart][0].childS; 36 Ne = sky[0].regions[Nstart][0].childE; 14 37 if (Ns == 0) { 15 38 fprintf (stderr, "no populated tables at an appropriate depth\n"); -
branches/sc_branches/trunkTest/Ohana/src/dvomerge/src/args.c
r28855 r29060 15 15 remove_argument (N, argc, argv); 16 16 ALTERNATE_PHOTCODE_FILE = strdup(argv[N]); 17 remove_argument (N, argc, argv); 18 } 19 20 /*** provide additional data ***/ 21 /* restrict to a portion of the sky? */ 22 UserPatch.Rmin = 0; 23 UserPatch.Rmax= 360; 24 UserPatch.Dmin = -90; 25 UserPatch.Dmax = +90; 26 if ((N = get_argument (*argc, argv, "-region"))) { 27 remove_argument (N, argc, argv); 28 UserPatch.Rmin = atof (argv[N]); 29 remove_argument (N, argc, argv); 30 UserPatch.Rmax = atof (argv[N]); 31 remove_argument (N, argc, argv); 32 UserPatch.Dmin = atof (argv[N]); 33 remove_argument (N, argc, argv); 34 UserPatch.Dmax = atof (argv[N]); 17 35 remove_argument (N, argc, argv); 18 36 } … … 37 55 return TRUE; 38 56 } 57 58 /*** check for command line options ***/ 59 int dvosecfilt_args (int *argc, char **argv) { 60 61 int N; 62 63 /* extra error messages */ 64 VERBOSE = FALSE; 65 if ((N = get_argument (*argc, argv, "-v"))) { 66 VERBOSE = TRUE; 67 remove_argument (N, argc, argv); 68 } 69 70 if (*argc != 3) dvosecfilt_usage(); 71 return TRUE; 72 } -
branches/sc_branches/trunkTest/Ohana/src/dvomerge/src/dvo_image_merge_dbs.c
r28354 r29060 13 13 14 14 images = gfits_table_get_Image (&in[0].ftable, &Nimages, &in[0].swapped); 15 if (!images) { 16 fprintf (stderr, "ERROR: failed to read images\n"); 17 exit (2); 18 } 19 15 20 ALLOCATE (IDmap->old, off_t, Nimages); 16 21 ALLOCATE (IDmap->new, off_t, Nimages); … … 59 64 60 65 off_t Nlo, Nhi, N; 66 67 if (!IDmap->Nmap) return 0; 61 68 62 69 // find the a close entry below desired ID -
branches/sc_branches/trunkTest/Ohana/src/dvomerge/src/dvoconvert.c
r28855 r29060 148 148 // convert the raw image table to Image type (byteswap if needed) 149 149 images = gfits_table_get_Image (&inDB.ftable, &Nimages, &inDB.swapped); 150 if (!images) { 151 fprintf (stderr, "ERROR: failed to read images\n"); 152 exit (2); 153 } 150 154 151 155 // update additional metadata -
branches/sc_branches/trunkTest/Ohana/src/dvomerge/src/dvomergeUpdate.c
r28857 r29060 6 6 off_t i, j, Ns, Ne; 7 7 SkyTable *outsky, *insky; 8 SkyList * inlist;8 SkyList *outlist, *inlist; 9 9 Catalog incatalog, outcatalog; 10 10 char filename[256], *input, *output; … … 70 70 SkyTableSetFilenames (insky, input, "cpt"); 71 71 72 // XXX apply this...generate the subset matching the user-selected region 73 inlist = SkyListByPatch (insky, -1, &UserPatch); 74 72 75 // generate an output table populated at the desired depth 73 76 outsky = SkyTableLoadOptimal (output, NULL, GSCFILE, TRUE, SKY_DEPTH, VERBOSE); … … 79 82 // loop over the populatable output tables; check for data in input in the corresponding regions 80 83 81 Sky TablePopulatedRange (&Ns, &Ne, insky, 0);82 depth = in sky[0].regions[Ns].depth;84 SkyListPopulatedRange (&Ns, &Ne, inlist, 0); 85 depth = inlist[0].regions[Ns][0].depth; 83 86 84 // loop over the populat able output regions85 for (i = 0; i < outsky[0].Nregions; i++) {86 if (! outsky[0].regions[i].table) continue;87 if (VERBOSE) fprintf (stderr, " output: %s\n", outsky[0].regions[i].name);87 // loop over the populated input regions 88 for (i = 0; i < inlist[0].Nregions; i++) { 89 if (!inlist[0].regions[i][0].table) continue; 90 if (VERBOSE) fprintf (stderr, "input: %s\n", inlist[0].regions[i][0].name); 88 91 89 SetPhotcodeTable( outputPhotcodes);92 SetPhotcodeTable(inputPhotcodes); 90 93 // load / create output catalog (if catalog does not exist, it will be created) 91 LoadCatalog (&outcatalog, &outsky[0].regions[i], outsky[0].filename[i], "w"); 94 LoadCatalog (&incatalog, &inlist[0].regions[i][0], inlist[0].filename[i], "r"); 95 // skip empty input catalogs 96 if (!incatalog.Naves_disk) { 97 dvo_catalog_unlock (&incatalog); 98 dvo_catalog_free (&incatalog); 99 continue; 100 } 92 101 93 102 // combine only tables at equal or larger depth … … 97 106 // compare to a slightly reduced footprint 98 107 float dPos = 2.0/3600.0; 99 inlist = SkyListByBounds (insky, depth, outsky[0].regions[i].Rmin + dPos, outsky[0].regions[i].Rmax - dPos, outsky[0].regions[i].Dmin + dPos, outsky[0].regions[i].Dmax - dPos);100 for (j = 0; j < inlist[0].Nregions; j++) {101 if (VERBOSE) fprintf (stderr, " input : %s\n", inlist[0].regions[j][0].name);108 outlist = SkyListByBounds (outsky, depth, inlist[0].regions[i][0].Rmin + dPos, inlist[0].regions[i][0].Rmax - dPos, inlist[0].regions[i][0].Dmin + dPos, inlist[0].regions[i][0].Dmax - dPos); 109 for (j = 0; j < outlist[0].Nregions; j++) { 110 if (VERBOSE) fprintf (stderr, "output : %s\n", outlist[0].regions[j][0].name); 102 111 103 112 // load input catalog 104 SetPhotcodeTable( inputPhotcodes);105 LoadCatalog (& incatalog, inlist[0].regions[j], inlist[0].filename[j], "r");113 SetPhotcodeTable(outputPhotcodes); 114 LoadCatalog (&outcatalog, outlist[0].regions[j], outlist[0].filename[j], "w"); 106 115 107 // skip empty input catalogs108 if (!incatalog.Naves_disk) {109 dvo_catalog_unlock (&incatalog);110 dvo_catalog_free (&incatalog);111 continue;112 }113 116 dvo_update_image_IDs (&IDmap, &incatalog); 114 merge_catalogs_old (&outsky[0].regions[i], &outcatalog, &incatalog, RADIUS, secfiltMap); 115 dvo_catalog_unlock (&incatalog); 116 dvo_catalog_free (&incatalog); 117 merge_catalogs_old (&outsky[0].regions[j], &outcatalog, &incatalog, RADIUS, secfiltMap); 117 118 118 fprintf (stderr, "merged %s into %s\n", outsky[0].regions[i].name, inlist[0].regions[j][0].name); 119 outcatalog.catflags = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF; 120 121 // if we receive a signal which would cause us to exit, wait until the full catalog is written 122 SetProtect (TRUE); 123 dvo_catalog_save (&outcatalog, VERBOSE); 124 SetProtect (FALSE); 125 126 dvo_catalog_unlock (&outcatalog); 127 dvo_catalog_free (&outcatalog); 128 129 fprintf (stderr, "merged %s into %s\n", inlist[0].regions[i][0].name, outlist[0].regions[j][0].name); 119 130 } 120 SkyListFree ( inlist);131 SkyListFree (outlist); 121 132 122 outcatalog.catflags = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF; 123 dvo_catalog_save (&outcatalog, VERBOSE); 124 dvo_catalog_unlock (&outcatalog); 125 dvo_catalog_free (&outcatalog); 133 dvo_catalog_unlock (&incatalog); 134 dvo_catalog_free (&incatalog); 126 135 } 127 136 … … 153 162 // load the image table 154 163 if (inDB.dbstate == LCK_EMPTY) { 155 Shutdown ("can't find input image catalog %s", inDB.filename); 164 // Shutdown ("can't find input image catalog %s", inDB.filename); 165 IDmap->Nmap = 0; 166 return TRUE; 156 167 } 157 168 if (!dvo_image_load (&inDB, VERBOSE, TRUE)) { -
branches/sc_branches/trunkTest/Ohana/src/dvomerge/src/dvoverify.c
r28268 r29060 154 154 // convert the raw image table to Image type (byteswap if needed) 155 155 images = gfits_table_get_Image (&inDB.ftable, &Nimages, &inDB.swapped); 156 if (!images) { 157 fprintf (stderr, "ERROR: failed to read images\n"); 158 exit (2); 159 } 156 160 157 161 // update additional metadata -
branches/sc_branches/trunkTest/Ohana/src/dvomerge/src/help.c
r27583 r29060 4 4 fprintf (stderr, "USAGE: dvomerge (input1) and (input2) to (output)\n"); 5 5 fprintf (stderr, " OR: dvomerge (input) into (output)\n"); 6 fprintf (stderr, " [-region Rmin Rmax Dmin Dmax]\n"); 6 7 exit (2); 7 8 } … … 10 11 11 12 fprintf (stderr, "USAGE: dvoconvert (input) to (output)\n"); 13 14 exit (2); 15 } 16 17 void dvosecfilt_usage(void) { 18 19 fprintf (stderr, "USAGE: dvosecfilt (input) -photcodes (photcodes.txt)\n"); 12 20 13 21 exit (2); … … 57 65 } 58 66 67 void dvosecfilt_help (int argc, char **argv) { 68 69 /* check for help request */ 70 if (get_argument (argc, argv, "-help")) goto show_help; 71 if (get_argument (argc, argv, "-h")) goto show_help; 72 return; 73 74 show_help: 75 76 fprintf (stderr, "USAGE\n"); 77 fprintf (stderr, " dvosecfilt (input) (Nsecfilt)\n\n"); 78 79 fprintf (stderr, " change number of secfilt entries in photcode table (updates secfilt tables only)\n"); 80 81 fprintf (stderr, " optional flags:\n"); 82 fprintf (stderr, " -v : verbose mode\n"); 83 fprintf (stderr, " -help : this list\n"); 84 fprintf (stderr, " -h : this list\n\n"); 85 exit (2); 86 } 87 -
branches/sc_branches/trunkTest/Ohana/src/gastro2/src/rfits.c
r27435 r29060 15 15 16 16 stars = gfits_table_get_SMPData (&table, &Nstars, NULL); 17 if (!stars) { 18 fprintf (stderr, "ERROR: failed to read stars\n"); 19 exit (2); 20 } 17 21 18 22 ALLOCATE (stardata, StarData, Nstars); -
branches/sc_branches/trunkTest/Ohana/src/getstar/src/dvoImageExtract.c
r27435 r29060 32 32 // convert database table to internal structure 33 33 images = gfits_table_get_Image (&db.ftable, &Nimages, &db.swapped); 34 if (!images) { 35 fprintf (stderr, "ERROR: failed to read images\n"); 36 exit (2); 37 } 34 38 35 39 matches = SelectImages (argv[1], images, Nimages, &Nmatches); -
branches/sc_branches/trunkTest/Ohana/src/getstar/src/dvoImageOverlaps.c
r27435 r29060 35 35 // convert database table to internal structure 36 36 dbImages = gfits_table_get_Image (&db.ftable, &NdbImages, &db.swapped); 37 if (!dbImages) { 38 fprintf (stderr, "ERROR: failed to read images\n"); 39 exit (2); 40 } 37 41 38 42 // for (i = 1; i < 2; i++) { -
branches/sc_branches/trunkTest/Ohana/src/getstar/src/dvoImagesAtCoords.c
r27435 r29060 55 55 // convert database table to internal structure 56 56 dbImages = gfits_table_get_Image (&db.ftable, &NdbImages, &db.swapped); 57 if (!dbImages) { 58 fprintf (stderr, "ERROR: failed to read images\n"); 59 exit (2); 60 } 57 61 } 58 62 -
branches/sc_branches/trunkTest/Ohana/src/imregister/src/detsearch.c
r27435 r29060 36 36 if (!output.Modify && !output.Delete && !output.Altpath) gfits_db_close (&db); 37 37 detrend = gfits_table_get_DetReg (&db.ftable, &Ndetrend, &db.swapped); 38 if (!detrend) { 39 fprintf (stderr, "ERROR: failed to read detrend info\n"); 40 exit (2); 41 } 38 42 39 43 match = MatchCriteria (detrend, Ndetrend, &Nmatch); /* match basic criteria */ -
branches/sc_branches/trunkTest/Ohana/src/imregister/src/imphotsearch.c
r27435 r29060 33 33 34 34 image = gfits_table_get_Image (&db.ftable, &Nimage, &db.swapped); 35 if (!image) { 36 fprintf (stderr, "ERROR: failed to read images\n"); 37 exit (2); 38 } 35 39 36 40 match = subset (image, Nimage, &Nmatch); -
branches/sc_branches/trunkTest/Ohana/src/imregister/src/imregtable.c
r27435 r29060 34 34 35 35 image = gfits_table_get_RegImage (&ftable, &Nimage, NULL); 36 if (!image) { 37 fprintf (stderr, "ERROR: failed to read images\n"); 38 exit (2); 39 } 36 40 37 41 /* load database table */ -
branches/sc_branches/trunkTest/Ohana/src/imregister/src/imsearch.c
r27435 r29060 30 30 31 31 image = gfits_table_get_RegImage (&db.ftable, &Nimage, &db.swapped); 32 if (!image) { 33 fprintf (stderr, "ERROR: failed to read images\n"); 34 exit (2); 35 } 32 36 33 37 match = match_criteria (image, Nimage, &Nmatch); -
branches/sc_branches/trunkTest/Ohana/src/imregister/src/imstatreg.c
r27611 r29060 67 67 } 68 68 subset = gfits_table_get_RegImage (&temp_db.ftable, &Nsubset, &temp_db.swapped); 69 if (!subset) { 70 fprintf (stderr, "ERROR: failed to read images\n"); 71 exit (2); 72 } 69 73 fprintf (stderr, "temporary database read\n"); 70 74 … … 93 97 } 94 98 image = gfits_table_get_RegImage (&image_db.ftable, &Nimage, &image_db.swapped); 99 if (!image) { 100 fprintf (stderr, "ERROR: failed to read images\n"); 101 exit (2); 102 } 95 103 fprintf (stderr, "main database read\n"); 96 104 -
branches/sc_branches/trunkTest/Ohana/src/imregister/src/photsearch.c
r27435 r29060 42 42 if (output.convert) { 43 43 photpars_old = gfits_table_get_PhotParsOld (&db.ftable, &Nphotpars, &db.swapped); 44 if (!photpars_old) { 45 fprintf (stderr, "ERROR: failed to read photometry parameters\n"); 46 exit (2); 47 } 44 48 photpars = PhotParsOld_to_PhotPars (photpars_old, Nphotpars); 45 49 } else { 46 50 photpars = gfits_table_get_PhotPars (&db.ftable, &Nphotpars, &db.swapped); 51 if (!photpars) { 52 fprintf (stderr, "ERROR: failed to read photometry parameters\n"); 53 exit (2); 54 } 47 55 } 48 56 -
branches/sc_branches/trunkTest/Ohana/src/imregister/src/spsearch.c
r27435 r29060 30 30 31 31 spectrum = gfits_table_get_Spectrum (&db.ftable, &Nspectrum, &db.swapped); 32 if (!spectrum) { 33 fprintf (stderr, "ERROR: failed to read spectrum\n"); 34 exit (2); 35 } 32 36 33 37 match = match_criteria (spectrum, Nspectrum, &Nmatch); -
branches/sc_branches/trunkTest/Ohana/src/kapa2/src/DrawFrame.c
r27796 r29060 134 134 *minor = 0.1 * power; 135 135 if (axis[0].areticks == 1) { 136 *major = 1.0* power;137 *minor = 0. 2* power;136 *major = 0.25 * power; 137 *minor = 0.05 * power; 138 138 } 139 139 } … … 142 142 *minor = 0.2 * power; 143 143 if (axis[0].areticks == 1) { 144 *major = 2.0* power;145 *minor = 0. 5* power;144 *major = 0.5 * power; 145 *minor = 0.1 * power; 146 146 } 147 147 } … … 150 150 *minor = 0.5 * power; 151 151 if (axis[0].areticks == 1) { 152 *major = 2.0 * power;153 *minor = 0. 5* power;152 *major = 1.0 * power; 153 *minor = 0.2 * power; 154 154 } 155 155 } … … 158 158 *minor = 0.5 * power; 159 159 if (axis[0].areticks == 1) { 160 *major = 2.5* power;160 *major = 1.0 * power; 161 161 *minor = 0.5 * power; 162 162 } … … 166 166 *minor = 0.5 * power; 167 167 if (axis[0].areticks == 1) { 168 *major = 5.0 * power;169 *minor = 1.0* power;168 *major = 2.0 * power; 169 *minor = 0.5 * power; 170 170 } 171 171 } … … 215 215 // } 216 216 // } 217 218 // XXX need to fix first and last value for printing label: currently prints first label 219 // too early & fails to do last label if too close 217 220 218 221 // loop to find the ticks -
branches/sc_branches/trunkTest/Ohana/src/libautocode/def/AddstarClientOptions.d
r16810 r29060 2 2 EXTNAME OPTIONS 3 3 TYPE BINTABLE 4 SIZE 8 04 SIZE 84 5 5 6 6 FIELD Nsigma, NSIGMA, double, match radius in terms of astrometric error … … 22 22 FIELD timeref, TIMEREF, e_time, time/date of input data (REFLIST only?) 23 23 FIELD imageID, IMAGE_ID, unsigned int, reference to image 24 FIELD detectionFilter, DETECTIONFILTER, unsigned int, filter mask for detections from smf file -
branches/sc_branches/trunkTest/Ohana/src/libautocode/def/autocode.c
r28277 r29060 66 66 if (Ncols != $SIZE) { 67 67 fprintf (stderr, "ERROR: mis-match in table size: width is %d but should be %d bytes\n", Ncols, $SIZE); 68 exit (1);68 return NULL; 69 69 } 70 70 -
branches/sc_branches/trunkTest/Ohana/src/libdvo/include/dvo.h
r28855 r29060 85 85 # define PHOT_MAG 0x06 /* generic magnitude; never stored */ 86 86 87 /* Image.code values. these are codes to note bad images */ 88 # define ID_IMAGE_NEW 0x0000 /* no nrphot attempted */ 89 # define ID_IMAGE_NOCAL 0x0001 /* used within nrphot to mean "don't apply fit" */ 90 # define ID_IMAGE_POOR 0x0002 /* relphot says image is bad */ 91 # define ID_IMAGE_SKIP 0x0004 /* external information image is bad */ 92 # define ID_IMAGE_FEW 0x0008 /* currently too few measurements for good value */ 87 /* Image.code values -- these values are 32 bit (as of PS1_V1) */ 88 typedef enum { 89 ID_IMAGE_NEW = 0x00000000, /* no calibrations yet attempted */ 90 ID_IMAGE_PHOTOM_NOCAL = 0x00000001, /* user-set value used within relphot: ignore */ 91 ID_IMAGE_PHOTOM_POOR = 0x00000002, /* relphot says image is bad (dMcal > limit) */ 92 ID_IMAGE_PHOTOM_SKIP = 0x00000004, /* user-set value: assert that this image has bad photometry */ 93 ID_IMAGE_PHOTOM_FEW = 0x00000008, /* currently too few measurements for photometry */ 94 ID_IMAGE_ASTROM_NOCAL = 0x00000010, /* user-set value used within relastro: ignore */ 95 ID_IMAGE_ASTROM_POOR = 0x00000020, /* relastro says image is bad (dR,dD > limit) */ 96 ID_IMAGE_ASTROM_FAIL = 0x00000040, /* relastro fit diverged, fit not applied */ 97 ID_IMAGE_ASTROM_SKIP = 0x00000080, /* user-set value: assert that this image has bad astrometry */ 98 ID_IMAGE_ASTROM_FEW = 0x00000100, /* currently too few measurements for astrometry */ 99 } DVOImageFlags; 93 100 94 101 /* Measure.flags values -- these values are 32 bit (as of PS1_V1) */ 95 102 typedef enum { 96 ID_MEAS_NOCAL = 0x000 1, // detection ignored for this analysis (photcode, time range) -- internal only97 ID_MEAS_POOR_PHOTOM = 0x000 2, // detection is photometry outlier98 ID_MEAS_SKIP_PHOTOM = 0x000 4, // detection was ignored for photometry measurement99 ID_MEAS_AREA = 0x000 8, // detection near image edge100 ID_MEAS_POOR_ASTROM = 0x00 10, // detection is astrometry outlier101 ID_MEAS_SKIP_ASTROM = 0x00 20, // detection was ignored for astrometry measurement102 ID_MEAS_USED_OBJ = 0x00 40, // detection was used during opdate objects103 ID_MEAS_USED_CHIP = 0x00 80, // detection was used during update chips104 ID_MEAS_BLEND_MEAS = 0x0 100, // detection is within radius of multiple objects105 ID_MEAS_BLEND_OBJ = 0x0 200, // multiple detections within radius of object106 ID_MEAS_UNDEF_3 = 0x0 400, // unused107 ID_MEAS_UNDEF_4 = 0x0 800, // unused108 ID_MEAS_BLEND_MEAS_X = 0x 1000, // detection is within radius of multiple objects across catalogs109 ID_MEAS_ARTIFACT = 0x 2000, // detection is thought to be non-astronomical110 ID_MEAS_UNDEF_5 = 0x 4000, // unused111 ID_MEAS_UNDEF_6 = 0x 8000, // unused103 ID_MEAS_NOCAL = 0x00000001, // detection ignored for this analysis (photcode, time range) -- internal only 104 ID_MEAS_POOR_PHOTOM = 0x00000002, // detection is photometry outlier 105 ID_MEAS_SKIP_PHOTOM = 0x00000004, // detection was ignored for photometry measurement 106 ID_MEAS_AREA = 0x00000008, // detection near image edge 107 ID_MEAS_POOR_ASTROM = 0x00000010, // detection is astrometry outlier 108 ID_MEAS_SKIP_ASTROM = 0x00000020, // detection was ignored for astrometry measurement 109 ID_MEAS_USED_OBJ = 0x00000040, // detection was used during opdate objects 110 ID_MEAS_USED_CHIP = 0x00000080, // detection was used during update chips 111 ID_MEAS_BLEND_MEAS = 0x00000100, // detection is within radius of multiple objects 112 ID_MEAS_BLEND_OBJ = 0x00000200, // multiple detections within radius of object 113 ID_MEAS_UNDEF_3 = 0x00000400, // unused 114 ID_MEAS_UNDEF_4 = 0x00000800, // unused 115 ID_MEAS_BLEND_MEAS_X = 0x00001000, // detection is within radius of multiple objects across catalogs 116 ID_MEAS_ARTIFACT = 0x00002000, // detection is thought to be non-astronomical 117 ID_MEAS_UNDEF_5 = 0x00004000, // unused 118 ID_MEAS_UNDEF_6 = 0x00008000, // unused 112 119 } DVOMeasureFlags; 113 120 … … 147 154 ID_STAR_USE_PM = 0x00100000, // proper motion used (not AVE or PAR) 148 155 ID_STAR_USE_PAR = 0x00200000, // parallax used (not AVE or PM) 156 ID_OBJ_EXT = 0x01000000, // extended in our data (eg, PS) 157 ID_OBJ_EXT_ALT = 0x02000000, // extended in external data (eg, 2MASS) 158 ID_OBJ_GOOD = 0x04000000, // good-quality measurement in our data (eg, PS) 159 ID_OBJ_GOOD_ALT = 0x08000000, // good-quality measurement in external data (eg, 2MASS) 149 160 } DVOAverageFlags; 150 161 -
branches/sc_branches/trunkTest/Ohana/src/libdvo/src/LoadPhotcodesFITS.c
r27580 r29060 43 43 if (!strcmp (extname, "DVO_PHOTCODE")) { 44 44 PhotCode_Elixir *photcode_elixir = gfits_table_get_PhotCode_Elixir (&db.ftable, &Ncode, &db.swapped); 45 if (!photcode_elixir) { 46 fprintf (stderr, "ERROR: failed to read photcodes\n"); 47 exit (2); 48 } 45 49 photcode = PhotCode_Elixir_To_Internal (photcode_elixir, Ncode); 46 50 free (photcode_elixir); … … 49 53 if (!strcmp (extname, "DVO_PHOTCODE_ELIXIR")) { 50 54 PhotCode_Elixir *photcode_elixir = gfits_table_get_PhotCode_Elixir (&db.ftable, &Ncode, &db.swapped); 55 if (!photcode_elixir) { 56 fprintf (stderr, "ERROR: failed to read photcodes\n"); 57 exit (2); 58 } 51 59 photcode = PhotCode_Elixir_To_Internal (photcode_elixir, Ncode); 52 60 free (photcode_elixir); … … 55 63 if (!strcmp (extname, "DVO_PHOTCODE_PS1_DEV_1")) { 56 64 PhotCode_PS1_DEV_1 *photcode_ps1_dev_1 = gfits_table_get_PhotCode_PS1_DEV_1 (&db.ftable, &Ncode, &db.swapped); 65 if (!photcode_ps1_dev_1) { 66 fprintf (stderr, "ERROR: failed to read photcodes\n"); 67 exit (2); 68 } 57 69 photcode = PhotCode_PS1_DEV_1_To_Internal (photcode_ps1_dev_1, Ncode); 58 70 free (photcode_ps1_dev_1); … … 61 73 if (!strcmp (extname, "DVO_PHOTCODE_PS1_DEV_2")) { 62 74 PhotCode_PS1_DEV_2 *photcode_ps1_dev_2 = gfits_table_get_PhotCode_PS1_DEV_2 (&db.ftable, &Ncode, &db.swapped); 75 if (!photcode_ps1_dev_2) { 76 fprintf (stderr, "ERROR: failed to read photcodes\n"); 77 exit (2); 78 } 63 79 photcode = PhotCode_PS1_DEV_2_To_Internal (photcode_ps1_dev_2, Ncode); 64 80 free (photcode_ps1_dev_2); … … 67 83 if (!strcmp (extname, "DVO_PHOTCODE_PS1_DEV_3")) { 68 84 PhotCode_PS1_DEV_3 *photcode_ps1_dev_3 = gfits_table_get_PhotCode_PS1_DEV_3 (&db.ftable, &Ncode, &db.swapped); 85 if (!photcode_ps1_dev_3) { 86 fprintf (stderr, "ERROR: failed to read photcodes\n"); 87 exit (2); 88 } 69 89 photcode = PhotCode_PS1_DEV_3_To_Internal (photcode_ps1_dev_3, Ncode); 70 90 free (photcode_ps1_dev_3); … … 73 93 if (!strcmp (extname, "DVO_PHOTCODE_PS1_V1")) { 74 94 PhotCode_PS1_V1 *photcode_ps1_v1 = gfits_table_get_PhotCode_PS1_V1 (&db.ftable, &Ncode, &db.swapped); 95 if (!photcode_ps1_v1) { 96 fprintf (stderr, "ERROR: failed to read photcodes\n"); 97 exit (2); 98 } 75 99 photcode = PhotCode_PS1_V1_To_Internal (photcode_ps1_v1, Ncode); 76 100 free (photcode_ps1_v1); … … 79 103 if (!strcmp (extname, "DVO_PHOTCODE_PS1_V2")) { 80 104 PhotCode_PS1_V2 *photcode_ps1_v2 = gfits_table_get_PhotCode_PS1_V2 (&db.ftable, &Ncode, &db.swapped); 105 if (!photcode_ps1_v2) { 106 fprintf (stderr, "ERROR: failed to read photcodes\n"); 107 exit (2); 108 } 81 109 photcode = PhotCode_PS1_V2_To_Internal (photcode_ps1_v2, Ncode); 82 110 free (photcode_ps1_v2); … … 85 113 if (!strcmp (extname, "DVO_PHOTCODE_PS1_REF")) { 86 114 PhotCode_PS1_REF *photcode_ps1_ref = gfits_table_get_PhotCode_PS1_REF (&db.ftable, &Ncode, &db.swapped); 115 if (!photcode_ps1_ref) { 116 fprintf (stderr, "ERROR: failed to read photcodes\n"); 117 exit (2); 118 } 87 119 photcode = PhotCode_PS1_REF_To_Internal (photcode_ps1_ref, Ncode); 88 120 free (photcode_ps1_ref); -
branches/sc_branches/trunkTest/Ohana/src/libdvo/src/cmf-ps1-v1-alt.c
r28241 r29060 14 14 if (ftable[0].header[0].Naxis[0] != 136) { 15 15 fprintf (stderr, "ERROR: wrong format for CMF_PS1_V1_Alt: "OFF_T_FMT" vs %d\n", ftable[0].header[0].Naxis[0], 136); 16 exit (2);16 return (NULL); 17 17 } 18 18 -
branches/sc_branches/trunkTest/Ohana/src/libdvo/src/coordops.c
r28837 r29060 20 20 int XY_to_LM (double *L, double *M, double x, double y, Coords *coords) { 21 21 22 OhanaProjection proj; 23 OhanaProjectionMode mode; 22 24 double X, Y, X2, XY, Y2, X3, Y3; 25 26 proj = GetProjection (coords[0].ctype); 27 mode = GetProjectionMode (proj); 23 28 24 29 /** convert pixel coordinates to cartesian system **/ … … 45 50 } 46 51 52 if (mode == PROJ_MODE_CARTESIAN) { 53 *L += coords[0].crval1; 54 *M += coords[0].crval2; 55 } 56 47 57 return (TRUE); 48 58 } … … 64 74 /** Locally Cartesian Projections **/ 65 75 if (mode == PROJ_MODE_CARTESIAN) { 66 *ra = L + coords[0].crval1;67 *dec = M + coords[0].crval2;68 69 76 /* mosaic astrometry : WRP is chip astrometry; apply mosaic (DIS) term */ 70 77 if (proj == PROJ_WRP) { 71 78 if (!gotMosaic) return (FALSE); 72 XY_to_RD (ra, dec, *ra, *dec, &mosaic);79 XY_to_RD (ra, dec, L, M, &mosaic); 73 80 } 74 81 return (TRUE); … … 183 190 184 191 double phi, theta; 185 double Lo, Mo;186 192 double sphi, cphi, stht, ctht; 187 193 double salp, calp, sdel, cdel, sdp, cdp; … … 201 207 if (proj == PROJ_WRP) { 202 208 if (!gotMosaic) return (FALSE); 203 RD_to_XY (&Lo, &Mo, ra, dec, &mosaic); 204 *L = (Lo - coords[0].crval1); 205 *M = (Mo - coords[0].crval2); 209 RD_to_XY (L, M, ra, dec, &mosaic); 206 210 return (TRUE); 207 211 } 208 *L = (ra - coords[0].crval1);209 *M = (dec - coords[0].crval2);212 *L = ra; 213 *M = dec; 210 214 return (TRUE); 211 215 } … … 310 314 double dX, dY, Lo, Mo, dL, dM; 311 315 double dLdX, dLdY, dMdX, dMdY, Do; 316 OhanaProjection proj; 317 OhanaProjectionMode mode; 318 319 proj = GetProjection (coords[0].ctype); 320 mode = GetProjectionMode (proj); 312 321 313 322 *x = 0; 314 323 *y = 0; 324 325 if (mode == PROJ_MODE_CARTESIAN) { 326 L -= coords[0].crval1; 327 M -= coords[0].crval2; 328 } 315 329 316 330 /* start with linear solution for X,Y */ … … 422 436 } 423 437 438 enum {COORD_TYPE_NONE, COORD_TYPE_PC, COORD_TYPE_ROT, COORD_TYPE_CD, COORD_TYPE_LIN}; 439 424 440 int GetCoords (Coords *coords, Header *header) { 425 441 … … 428 444 double equinox; 429 445 char *ctype; 446 int mode; 430 447 431 448 rotate = 0.0; … … 437 454 strcpy (coords[0].ctype, "NONE"); 438 455 439 status = FALSE; 440 if (gfits_scan (header, "CTYPE2", "%s", 1, coords[0].ctype)) { 441 status = gfits_scan (header, "CRVAL1", "%lf", 1, &coords[0].crval1); 442 status &= gfits_scan (header, "CRPIX1", "%f", 1, &coords[0].crpix1); 443 status &= gfits_scan (header, "CRVAL2", "%lf", 1, &coords[0].crval2); 444 status &= gfits_scan (header, "CRPIX2", "%f", 1, &coords[0].crpix2); 445 446 if (gfits_scan (header, "CDELT1", "%f", 1, &coords[0].cdelt1)) { 447 status &= gfits_scan (header, "CDELT2", "%f", 1, &coords[0].cdelt2); 448 if (gfits_scan (header, "CROTA2", "%lf", 1, &rotate)) { 449 Lambda = coords[0].cdelt2 / coords[0].cdelt1; 450 coords[0].pc1_1 = cos(rotate*RAD_DEG); 451 coords[0].pc1_2 = -sin(rotate*RAD_DEG) * Lambda; 452 coords[0].pc2_1 = sin(rotate*RAD_DEG) / Lambda; 453 coords[0].pc2_2 = cos(rotate*RAD_DEG); 454 } 455 if (gfits_scan (header, "PC001001", "%f", 1, &coords[0].pc1_1)) { 456 status &= gfits_scan (header, "PC001002", "%f", 1, &coords[0].pc1_2); 457 status &= gfits_scan (header, "PC002001", "%f", 1, &coords[0].pc2_1); 458 status &= gfits_scan (header, "PC002002", "%f", 1, &coords[0].pc2_2); 459 } 456 mode = COORD_TYPE_NONE; 457 { 458 int haveCTYPE, haveCDELT, haveCROTA, haveCDij, havePCij, haveRAo; 459 float tmp; 460 char stmp[80]; 461 462 // there are a few different representations for scale and rotation. choose an appropriate 463 // set: (CDELTi + CROTAi), (CDELTi + PCij), (CDij), 464 465 haveCTYPE = gfits_scan (header, "CTYPE2", "%s", 1, stmp); 466 haveCDELT = gfits_scan (header, "CDELT1", "%f", 1, &tmp); 467 haveCROTA = gfits_scan (header, "CROTA1", "%f", 1, &tmp); 468 haveCDij = gfits_scan (header, "CD1_1", "%f", 1, &tmp); 469 havePCij = gfits_scan (header, "PC001001", "%f", 1, &tmp); 470 haveRAo = gfits_scan (header, "RA_O", "%f", 1, &tmp); 471 472 if (haveCTYPE && havePCij && haveCDELT) { mode = COORD_TYPE_PC; goto gotit; } 473 if (haveCTYPE && haveCROTA && haveCDELT) { mode = COORD_TYPE_ROT; goto gotit; } 474 if (haveCTYPE && haveCDij) { mode = COORD_TYPE_CD; goto gotit; } 475 if (haveRAo) { mode = COORD_TYPE_LIN; goto gotit; } 476 // fprintf (stderr, "no valid WCS keywords\n"); 477 return (FALSE); 478 } 479 480 gotit: 481 482 status = TRUE; 483 switch (mode) { 484 case COORD_TYPE_PC: 485 status &= gfits_scan (header, "CTYPE2", "%s", 1, coords[0].ctype); 486 status &= gfits_scan (header, "CRVAL1", "%lf", 1, &coords[0].crval1); 487 status &= gfits_scan (header, "CRPIX1", "%f", 1, &coords[0].crpix1); 488 status &= gfits_scan (header, "CRVAL2", "%lf", 1, &coords[0].crval2); 489 status &= gfits_scan (header, "CRPIX2", "%f", 1, &coords[0].crpix2); 490 491 status &= gfits_scan (header, "CDELT1", "%f", 1, &coords[0].cdelt1); 492 status &= gfits_scan (header, "CDELT2", "%f", 1, &coords[0].cdelt2); 493 status &= gfits_scan (header, "PC001001", "%f", 1, &coords[0].pc1_1); 494 status &= gfits_scan (header, "PC001002", "%f", 1, &coords[0].pc1_2); 495 status &= gfits_scan (header, "PC002001", "%f", 1, &coords[0].pc2_1); 496 status &= gfits_scan (header, "PC002002", "%f", 1, &coords[0].pc2_2); 460 497 461 498 /* set NPLYTERM based on header. if NPLYTERM is missing, it should have a … … 491 528 break; 492 529 } 493 } else { 494 if (gfits_scan (header, "CD1_1", "%f", 1, &coords[0].pc1_1)) { 495 status &= gfits_scan (header, "CD1_2", "%f", 1, &coords[0].pc1_2); 496 status &= gfits_scan (header, "CD2_1", "%f", 1, &coords[0].pc2_1); 497 status &= gfits_scan (header, "CD2_2", "%f", 1, &coords[0].pc2_2); 498 /* renormalize */ 499 scale = hypot (coords[0].pc1_1, coords[0].pc1_2); 500 coords[0].cdelt1 = coords[0].cdelt2 = scale; 501 coords[0].pc1_1 /= scale; 502 coords[0].pc1_2 /= scale; 503 coords[0].pc2_1 /= scale; 504 coords[0].pc2_2 /= scale; 505 } else { 506 status = FALSE; 507 } 508 } 509 } else { 510 /* some of my thesis data uses this simple linear model - convert on read? */ 511 if (gfits_scan (header, "RA_O", "%lf", 1, &coords[0].crval1)) { 512 status = gfits_scan (header, "RA_X", "%f", 1, &coords[0].pc1_1); 530 break; 531 532 case COORD_TYPE_ROT: 533 status &= gfits_scan (header, "CTYPE2", "%s", 1, coords[0].ctype); 534 status &= gfits_scan (header, "CRVAL1", "%lf", 1, &coords[0].crval1); 535 status &= gfits_scan (header, "CRPIX1", "%f", 1, &coords[0].crpix1); 536 status &= gfits_scan (header, "CRVAL2", "%lf", 1, &coords[0].crval2); 537 status &= gfits_scan (header, "CRPIX2", "%f", 1, &coords[0].crpix2); 538 539 status &= gfits_scan (header, "CDELT1", "%f", 1, &coords[0].cdelt1); 540 status &= gfits_scan (header, "CDELT2", "%f", 1, &coords[0].cdelt2); 541 542 status &= gfits_scan (header, "CROTA2", "%lf", 1, &rotate); 543 Lambda = coords[0].cdelt2 / coords[0].cdelt1; 544 coords[0].pc1_1 = cos(rotate*RAD_DEG); 545 coords[0].pc1_2 = -sin(rotate*RAD_DEG) * Lambda; 546 coords[0].pc2_1 = sin(rotate*RAD_DEG) / Lambda; 547 coords[0].pc2_2 = cos(rotate*RAD_DEG); 548 break; 549 550 case COORD_TYPE_CD: 551 status &= gfits_scan (header, "CTYPE2", "%s", 1, coords[0].ctype); 552 status &= gfits_scan (header, "CRVAL1", "%lf", 1, &coords[0].crval1); 553 status &= gfits_scan (header, "CRPIX1", "%f", 1, &coords[0].crpix1); 554 status &= gfits_scan (header, "CRVAL2", "%lf", 1, &coords[0].crval2); 555 status &= gfits_scan (header, "CRPIX2", "%f", 1, &coords[0].crpix2); 556 557 status &= gfits_scan (header, "CD1_1", "%f", 1, &coords[0].pc1_1); 558 status &= gfits_scan (header, "CD1_2", "%f", 1, &coords[0].pc1_2); 559 status &= gfits_scan (header, "CD2_1", "%f", 1, &coords[0].pc2_1); 560 status &= gfits_scan (header, "CD2_2", "%f", 1, &coords[0].pc2_2); 561 /* renormalize */ 562 scale = hypot (coords[0].pc1_1, coords[0].pc1_2); 563 coords[0].cdelt1 = coords[0].cdelt2 = scale; 564 coords[0].pc1_1 /= scale; 565 coords[0].pc1_2 /= scale; 566 coords[0].pc2_1 /= scale; 567 coords[0].pc2_2 /= scale; 568 break; 569 570 case COORD_TYPE_LIN: 571 /* some of my thesis data uses this simple linear model - convert on read? */ 572 status &= gfits_scan (header, "RA_O", "%lf", 1, &coords[0].crval1); 573 status &= gfits_scan (header, "RA_X", "%f", 1, &coords[0].pc1_1); 513 574 status &= gfits_scan (header, "RA_Y", "%f", 1, &coords[0].pc1_2); 514 575 status &= gfits_scan (header, "DEC_O", "%lf", 1, &coords[0].crval2); … … 518 579 coords[0].cdelt1 = coords[0].cdelt2 = 1.0; 519 580 strcpy (coords[0].ctype, "GENE"); 520 } 521 } 581 break; 582 } 583 522 584 if (status) { 523 585 if (!gfits_scan (header, "EQUINOX", "%lf", 1, &equinox)) { … … 530 592 } 531 593 } 594 532 595 if (!status) { 533 fprintf (stderr, "error getting all elements for coordinate mode %s\n", coords[0].ctype);596 // fprintf (stderr, "error getting all elements for coordinate mode %s\n", coords[0].ctype); 534 597 coords[0].crval1 = coords[0].crpix1 = coords[0].cdelt1 = 0.0; 535 598 coords[0].crval2 = coords[0].crpix2 = coords[0].cdelt2 = 0.0; -
branches/sc_branches/trunkTest/Ohana/src/libdvo/src/dvo_catalog_mef.c
r28241 r29060 125 125 /* no conversions currently defined */ 126 126 catalog[0].missing = gfits_table_get_Missing (&ftable, &catalog[0].Nmissing, NULL); 127 if (!catalog[0].missing) { 128 fprintf (stderr, "ERROR: failed to read missing\n"); 129 exit (2); 130 } 127 131 if (Nmissing != catalog[0].Nmiss_disk) { 128 132 fprintf (stderr, "Warning: mismatch between Nmissing in PHU and Table headers ("OFF_T_FMT" vs "OFF_T_FMT")\n", Nmissing, catalog[0].Nmiss_disk); -
branches/sc_branches/trunkTest/Ohana/src/libdvo/src/dvo_catalog_split.c
r28241 r29060 285 285 /* no conversions currently defined : this just does the byte swap */ 286 286 catalog[0].missing = gfits_table_get_Missing (&ftable, &Nmissing, NULL); 287 if (!catalog[0].missing) { 288 fprintf (stderr, "ERROR: failed to read missing\n"); 289 exit (2); 290 } 287 291 if (Nmissing != catalog[0].Nmiss_disk) { 288 292 fprintf (stderr, "Warning: mismatch between Nmissing in PHU and Table headers ("OFF_T_FMT" vs "OFF_T_FMT")\n", Nmissing, catalog[0].Nmiss_disk); … … 473 477 /* no conversions currently defined : this just does the byte swap */ 474 478 catalog[0].missing = gfits_table_get_Missing (&ftable, &Nmissing, NULL); 479 if (!catalog[0].missing) { 480 fprintf (stderr, "ERROR: failed to read missing\n"); 481 exit (2); 482 } 475 483 if (Nmissing != Nrows) { 476 484 fprintf (stderr, "Warning: mismatch between Nmissing in PHU and Table headers ("OFF_T_FMT" vs "OFF_T_FMT")\n", Nmissing, Nrows); -
branches/sc_branches/trunkTest/Ohana/src/libdvo/src/dvo_convert.c
r28241 r29060 32 32 Average_##TYPE *tmpAverage; \ 33 33 tmpAverage = gfits_table_get_Average_##TYPE (ftable, Naverage, NULL); \ 34 if (!tmpAverage) { \ 35 fprintf (stderr, "ERROR: failed to read averages\n"); \ 36 exit (2); \ 37 } \ 34 38 average = Average_##TYPE##_ToInternal (tmpAverage, *Naverage, primary); \ 35 39 free (tmpAverage); \ … … 39 43 if (!strcmp (extname, "DVO_AVERAGE")) { 40 44 average = gfits_table_get_Average (ftable, Naverage, NULL); 45 if (!average) { 46 fprintf (stderr, "ERROR: failed to read averages\n"); 47 exit (2); 48 } 41 49 *format = DVO_FORMAT_INTERNAL; 42 50 return (average); … … 111 119 Measure_##TYPE *tmpMeasure; \ 112 120 tmpMeasure = gfits_table_get_Measure_##TYPE (ftable, Nmeasure, NULL); \ 121 if (!tmpMeasure) { \ 122 fprintf (stderr, "ERROR: failed to read measures\n"); \ 123 exit (2); \ 124 } \ 113 125 measure = Measure_##TYPE##_ToInternal (tmpMeasure, *Nmeasure); \ 114 126 free (tmpMeasure); \ … … 118 130 if (!strcmp (extname, "DVO_MEASURE")) { 119 131 measure = gfits_table_get_Measure (ftable, Nmeasure, NULL); 132 if (!measure) { 133 fprintf (stderr, "ERROR: failed to read measures\n"); 134 exit (2); 135 } 120 136 *format = DVO_FORMAT_INTERNAL; 121 137 return (measure); … … 190 206 SecFilt_##TYPE *tmpSecFilt; \ 191 207 tmpSecFilt = gfits_table_get_SecFilt_##TYPE (ftable, Nsecfilt, NULL); \ 208 if (!tmpSecFilt) { \ 209 fprintf (stderr, "ERROR: failed to read secfilts\n"); \ 210 exit (2); \ 211 } \ 192 212 secfilt = SecFilt_##TYPE##_ToInternal (tmpSecFilt, *Nsecfilt); \ 193 213 free (tmpSecFilt); \ … … 197 217 if (!strcmp (extname, "DVO_SECFILT")) { 198 218 secfilt = gfits_table_get_SecFilt (ftable, Nsecfilt, NULL); 219 if (!secfilt) { 220 fprintf (stderr, "ERROR: failed to read secfilts\n"); 221 exit (2); 222 } 199 223 *format = DVO_FORMAT_INTERNAL; 200 224 return (secfilt); … … 263 287 Image_Elixir *tmpimage; 264 288 tmpimage = gfits_table_get_Image_Elixir (ftable, &Nimage, NULL); 289 if (!tmpimage) { 290 fprintf (stderr, "ERROR: failed to read images\n"); 291 exit (2); 292 } 265 293 ftable[0].buffer = (char *) Image_Elixir_ToInternal (tmpimage, Nimage); 266 294 free (tmpimage); … … 284 312 *format = DVO_FORMAT_##FORMAT; \ 285 313 tmpimage = gfits_table_get_Image_##TYPE (ftable, &Nimage, NULL); \ 314 if (!tmpimage) { \ 315 fprintf (stderr, "ERROR: failed to read images\n"); \ 316 exit (2); \ 317 } \ 286 318 ftable[0].buffer = (char *) Image_##TYPE##_ToInternal (tmpimage, Nimage); \ 287 319 free (tmpimage); \ … … 296 328 Image *image; 297 329 image = gfits_table_get_Image (ftable, &Nimage, NULL); 330 if (!image) { 331 fprintf (stderr, "ERROR: failed to read images\n"); 332 exit (2); 333 } 298 334 *format = DVO_FORMAT_INTERNAL; 299 335 return (TRUE); -
branches/sc_branches/trunkTest/Ohana/src/libdvo/src/skyregion_io.c
r27435 r29060 40 40 ALLOCATE (skytable, SkyTable, 1); 41 41 skytable[0].regions = gfits_table_get_SkyRegion (&ftable, &skytable[0].Nregions, NULL); 42 if (!skytable[0].regions) { 43 fprintf (stderr, "ERROR: failed to read sky regions\n"); 44 exit (2); 45 } 46 42 47 ALLOCATE (skytable[0].filename, char *, skytable[0].Nregions); 43 48 for (i = 0; i < skytable[0].Nregions; i++) { -
branches/sc_branches/trunkTest/Ohana/src/markstar/src/find_images.c
r7080 r29060 26 26 27 27 timage = gfits_table_get_Image (&db[0].ftable, &Ntimage, &db[0].swapped); 28 if (!timage) { 29 fprintf (stderr, "ERROR: failed to read images\n"); 30 exit (2); 31 } 28 32 29 33 /* set up buffers for images, temporary storage */ -
branches/sc_branches/trunkTest/Ohana/src/mosastro/src/rfits.c
r27435 r29060 32 32 off_t Nstars; 33 33 stars = gfits_table_get_SMPData (&table, &Nstars, NULL); 34 if (!stars) { 35 fprintf (stderr, "ERROR: failed to read stars\n"); 36 exit (2); 37 } 38 34 39 mychip[0].Nstars = Nstars; 35 40 gfits_scan (table.header, "NAXIS1", "%d", 1, &Nx); -
branches/sc_branches/trunkTest/Ohana/src/opihi/cmd.astro/cgrid.c
r26258 r29060 153 153 SetVector (&Yvec, OPIHI_FLT, NELEMENTS); 154 154 155 { // sanity check 156 float Nelem; 157 Nelem = 180.0 / minorRA; 158 if (!isfinite(Nelem) || (fabs(Nelem) > 10000)) { fprintf (stderr, "absurd cgrid spacing %f\n", minorRA); return FALSE; } 159 Nelem = 180.0 / minorDEC; 160 if (!isfinite(Nelem) || (fabs(Nelem) > 10000)) { fprintf (stderr, "absurd cgrid spacing %f\n", minorDEC); return FALSE; } 161 } 162 155 163 /*** do consecutive RA lines, first increasing **/ 156 164 OnPic = TRUE; -
branches/sc_branches/trunkTest/Ohana/src/opihi/cmd.data/Makefile
r27817 r29060 19 19 $(SRC)/init.$(ARCH).o \ 20 20 $(SRC)/accum.$(ARCH).o \ 21 $(SRC)/applyfit1d.$(ARCH).o \ 21 22 $(SRC)/applyfit2d.$(ARCH).o \ 22 $(SRC)/applyfit 1d.$(ARCH).o \23 $(SRC)/applyfit3d.$(ARCH).o \ 23 24 $(SRC)/box.$(ARCH).o \ 24 25 $(SRC)/book.$(ARCH).o \ … … 46 47 $(SRC)/fit1d.$(ARCH).o \ 47 48 $(SRC)/fit2d.$(ARCH).o \ 49 $(SRC)/fit3d.$(ARCH).o \ 48 50 $(SRC)/gaussj.$(ARCH).o \ 49 51 $(SRC)/gaussdeviate.$(ARCH).o \ -
branches/sc_branches/trunkTest/Ohana/src/opihi/cmd.data/applyfit2d.c
r20936 r29060 10 10 11 11 if (argc != 4) { 12 gprint (GP_ERR, "USAGE: applyfit x y z\n");12 gprint (GP_ERR, "USAGE: applyfit2d x y z\n"); 13 13 return (FALSE); 14 14 } -
branches/sc_branches/trunkTest/Ohana/src/opihi/cmd.data/fit2d.c
r27817 r29060 168 168 } 169 169 170 /** test print **/ 171 if (VERBOSE) { 172 for (i = 0; i < wterm; i++) { 173 for (j = 0; j < wterm; j++) { 174 gprint (GP_ERR, "%g ", c[i][j]); 175 } 176 gprint (GP_ERR, "\n"); 177 } 178 gprint (GP_ERR, "-----\n"); 179 } 180 170 181 dgaussjordan (c, b, wterm, 1); 171 182 … … 176 187 gprint (GP_ERR, "x^%d y^%d: %g\n", nx, ny, b[i][0]); 177 188 } 189 } 190 } 191 192 /** test print **/ 193 if (VERBOSE) { 194 for (i = 0; i < wterm; i++) { 195 for (j = 0; j < wterm; j++) { 196 gprint (GP_ERR, "%g ", c[i][j]); 197 } 198 gprint (GP_ERR, "\n"); 178 199 } 179 200 } -
branches/sc_branches/trunkTest/Ohana/src/opihi/cmd.data/init.c
r27817 r29060 5 5 int applyfit1d PROTO((int, char **)); 6 6 int applyfit2d PROTO((int, char **)); 7 int applyfit3d PROTO((int, char **)); 7 8 int box PROTO((int, char **)); 8 9 int book_command PROTO((int, char **)); … … 34 35 int fit1d PROTO((int, char **)); 35 36 int fit2d PROTO((int, char **)); 37 int fit3d PROTO((int, char **)); 36 38 int gaussjordan PROTO((int, char **)); 37 39 int gaussdeviate PROTO((int, char **)); … … 138 140 {1, "applyfit1d", applyfit1d, "apply 1-d fit to new vector"}, 139 141 {1, "applyfit2d", applyfit2d, "apply 2-d fit to new vector"}, 142 {1, "applyfit3d", applyfit3d, "apply 3-d fit to new vector"}, 140 143 {1, "book", book_command, "commands to manipulate book/page/word data"}, 141 144 {1, "box", box, "draw a box on the plot"}, … … 168 171 {1, "fit1d", fit1d, "fit polynomial to vector pair"}, 169 172 {1, "fit2d", fit2d, "fit 2-d polynomial to vector triplet"}, 173 {1, "fit3d", fit3d, "fit 3-d polynomial to vector quad"}, 170 174 {1, "gaussdev", gaussdeviate, "generate a gaussian deviate vector"}, 171 175 {1, "gaussint", gaussintegral, "return the integrated gaussian vector"}, -
branches/sc_branches/trunkTest/Ohana/src/opihi/cmd.data/vgauss.c
r20936 r29060 42 42 if ((ovec = SelectVector (argv[4], ANYVECTOR, TRUE)) == NULL) return (FALSE); 43 43 44 REQUIRE_VECTOR_FLT (xvec, FALSE);45 REQUIRE_VECTOR_FLT (yvec, FALSE);46 REQUIRE_VECTOR_FLT (svec, FALSE);44 CastVector (xvec, OPIHI_FLT); 45 CastVector (yvec, OPIHI_FLT); 46 CastVector (svec, OPIHI_FLT); 47 47 48 48 Npts = xvec[0].Nelements; -
branches/sc_branches/trunkTest/Ohana/src/opihi/dvo/ImageSelection.c
r28955 r29060 38 38 /* free loaded images */ 39 39 void FreeImageSelection () { 40 if (image != NULL) free(image);40 if (image != NULL) FreeImages(image); 41 41 if (subset != NULL) free (subset); 42 42 image = NULL; … … 47 47 Image *MatchImage (unsigned int time, short int source, unsigned int imageID) { 48 48 49 int m ;49 int m = -1; 50 50 51 51 if ((imageID != 0) && (imageID < Nimage)) { 52 m = (int) imageID - 1; 53 } else { 52 // imageID is in range for the array of images. If the table is still in order and 53 // no images have been deleted the index of the image we are looking for will be imageID - 1 54 // If this is the case, we have it. Otherwise we'll have to go search for it below 55 int guess = (int) imageID - 1; 56 if (image[guess].imageID == imageID) { 57 m = guess; 58 } 59 } 60 if (m == -1) { 54 61 m = match_image_subset (image, subset, Nsubset, time, source); 55 62 } -
branches/sc_branches/trunkTest/Ohana/src/opihi/dvo/LoadImages.c
r27435 r29060 1 1 # include "dvoshell.h" 2 3 // XXX: Maybe make this a command line option 4 int dvoUseImageCache = 1; 5 6 static char *lastFilename = NULL; 7 static time_t lastModified = 0; 8 static Image *imageCache = NULL; 9 static off_t cacheNimage = 0; 10 11 static time_t getLastModified(char *filename); 2 12 3 13 Image *LoadImages (off_t *Nimage) { … … 12 22 catdir = GetCATDIR (); 13 23 sprintf (filename, "%s/Images.dat", catdir); 24 25 if (lastFilename) { 26 if (dvoUseImageCache && !strcmp(lastFilename, filename)) { 27 // Make sure the file hasn't changed since we loaded it 28 if (getLastModified(filename) == lastModified) { 29 *Nimage = cacheNimage; 30 return imageCache; 31 } 32 } 33 free(lastFilename); 34 lastFilename = NULL; 35 free(imageCache); 36 imageCache = NULL; 37 cacheNimage = 0; 38 lastModified = 0; 39 } 40 14 41 15 42 gfits_db_init (&db); … … 38 65 39 66 image = gfits_table_get_Image (&db.ftable, Nimage, &db.swapped); 67 if (!image) { 68 fprintf (stderr, "ERROR: failed to read images\n"); 69 return (NULL); 70 } 71 if (dvoUseImageCache && image) { 72 cacheNimage = *Nimage; 73 imageCache = image; 74 lastFilename = strdup(filename); 75 lastModified = getLastModified(filename); 76 } 40 77 return (image); 41 78 } 79 80 static time_t getLastModified(char *filename) { 81 struct stat statbuf; 82 if (!stat(filename, &statbuf)) { 83 return statbuf.st_mtime; 84 } else { 85 return 0; 86 } 87 } 88 89 void FreeImages(Image *images) { 90 if (!dvoUseImageCache && (images != NULL)) { 91 free(images); 92 } else { 93 // defer free until next LoadImages with a different or modified Images.dat 94 } 95 } 96 -
branches/sc_branches/trunkTest/Ohana/src/opihi/dvo/cmpReadFile.c
r27435 r29060 20 20 21 21 smpdata = gfits_table_get_SMPData (&table, &Nstars, NULL); 22 if (!smpdata) { 23 fprintf (stderr, "ERROR: failed to read stars\n"); 24 exit (2); 25 } 22 26 23 27 ALLOCATE (stars, CMPstars, Nstars); -
branches/sc_branches/trunkTest/Ohana/src/opihi/dvo/gimages.c
r28872 r29060 247 247 set_int_variable ("IMAGEphotcode:n", Nfound); 248 248 249 free(image);249 FreeImages (image); 250 250 free (subset); 251 251 -
branches/sc_branches/trunkTest/Ohana/src/opihi/dvo/images.c
r27530 r29060 319 319 free (Xvec.elements.Flt); 320 320 free (Yvec.elements.Flt); 321 free(image);321 FreeImages (image); 322 322 return (TRUE); 323 323 -
branches/sc_branches/trunkTest/Ohana/src/opihi/dvo/imdense.c
r27435 r29060 70 70 free (Xvec.elements.Flt); 71 71 free (Yvec.elements.Flt); 72 free(image);72 FreeImages (image); 73 73 return (TRUE); 74 74 -
branches/sc_branches/trunkTest/Ohana/src/opihi/dvo/imextract.c
r27587 r29060 137 137 138 138 // free (subset); 139 free(image);139 FreeImages (image); 140 140 141 141 if (vec) free (vec); -
branches/sc_branches/trunkTest/Ohana/src/opihi/include/dvoshell.h
r28955 r29060 302 302 int InitPhotcodes PROTO((void)); 303 303 Image *LoadImages PROTO((off_t *Nimage)); 304 void FreeImages PROTO((Image *images)); 304 305 Image *MatchImage PROTO((unsigned int time, short int source, unsigned int imageID)); 305 306 Coords *MatchMosaic PROTO((unsigned int time, short int source)); -
branches/sc_branches/trunkTest/Ohana/src/photdbc/src/copy_images.c
r28331 r29060 46 46 47 47 image = gfits_table_get_Image (&in.ftable, &Nimage, &in.swapped); 48 if (!image) { 49 fprintf (stderr, "ERROR: failed to read images\n"); 50 exit (2); 51 } 48 52 dvo_image_addrows (&out, image, Nimage); 49 53 -
branches/sc_branches/trunkTest/Ohana/src/photdbc/src/find_images.c
r12332 r29060 28 28 29 29 timage = gfits_table_get_Image (&db[0].ftable, &Ntimage, &db[0].swapped); 30 if (!timage) { 31 fprintf (stderr, "ERROR: failed to read images\n"); 32 exit (2); 33 } 30 34 31 35 nimage = 0; … … 97 101 if (found) { 98 102 image[nimage] = timage[i]; 99 if (image[nimage].code == ID_IMAGE_ NOCAL) {100 image[nimage].code &= ~ID_IMAGE_ NOCAL;103 if (image[nimage].code == ID_IMAGE_PHOTOM_NOCAL) { 104 image[nimage].code &= ~ID_IMAGE_PHOTOM_NOCAL; 101 105 } 102 106 line_number[nimage] = i; -
branches/sc_branches/trunkTest/Ohana/src/photdbc/src/flag_measures.c
r12332 r29060 16 16 17 17 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 18 if (!image) { 19 fprintf (stderr, "ERROR: failed to read images\n"); 20 exit (2); 21 } 18 22 19 23 PhotNsec = GetPhotcodeNsecfilt (); -
branches/sc_branches/trunkTest/Ohana/src/relastro/Makefile
r28184 r29060 58 58 $(SRC)/CoordOps.$(ARCH).o \ 59 59 $(SRC)/FixProblemImages.$(ARCH).o \ 60 $(SRC)/StarMaps.$(ARCH).o \ 60 61 $(SRC)/high_speed_catalogs.$(ARCH).o \ 61 62 $(SRC)/high_speed_objects.$(ARCH).o \ -
branches/sc_branches/trunkTest/Ohana/src/relastro/doc/notes.txt
r27435 r29060 1 2 2010.07.15 3 4 Some issues: 5 6 * when I apply the fitted image parameters (UpdateObjectOffsets), I 7 currently check for good/bad fits and warn if the image is bad. 8 But the correction requires multiple re-loads of the catalog 9 tables. 10 11 * I would like to check for bad fits by defining a grid of test 12 points and seeing how much they move. However, for some chips, 13 the region of valid data is much smaller than the regino with any 14 data. 15 16 * I would like to define a grid (say, Nx * Ny with Nx >> polynomial 17 order) and only use those grid regions in testing the solution 18 19 * This means knowing which detections belong on a specific image. 20 I'm not sure if there is a good way to do this. at the moment, it 21 is easy to do detection -> image, but not so easy to do 22 image->detection. 23 24 * That might argue for generating the grid for each image, then 25 running through all detections and, as detections are examined, 26 populate the grid elements for their own image. 1 27 2 28 2010.03.24 -
branches/sc_branches/trunkTest/Ohana/src/relastro/include/relastro.h
r28184 r29060 3 3 # include <kapa.h> 4 4 # include <signal.h> 5 # include <assert.h> 5 6 6 7 typedef enum { … … 76 77 int Nmeas; 77 78 } StatType; 79 80 # define MARKTIME(MSG,...) { \ 81 float dtime; \ 82 gettimeofday (&stop, (void *) NULL); \ 83 dtime = DTIME (stop, start); \ 84 fprintf (stderr, MSG, __VA_ARGS__); } 78 85 79 86 /* global variables set in parameter file */ … … 145 152 int DoUpdateChips; 146 153 int DoUpdateMosaics; 154 155 // StarMap parameters: 156 int NX_MAP; 157 int NY_MAP; 158 double DPOS_MAX; 159 double ADDSTAR_RADIUS; 147 160 148 161 /*** relphot prototypes ***/ … … 207 220 void create_image_db (FITS_DB *db); 208 221 void save_catalogs (Catalog *catalog, int Ncatalog); 222 223 int reload_images (FITS_DB *db); 209 224 210 225 int main PROTO((int argc, char **argv)); … … 267 282 double **poly2d_copy (double **poly, int Nx, int Ny); 268 283 double poly2d_eval (double **poly, int Nx, int Ny, double x, double y); 269 int fit_apply_coords (CoordFit *fit, Coords *coords );284 int fit_apply_coords (CoordFit *fit, Coords *coords, int keepRef); 270 285 int CoordsGetCenter (CoordFit *fit, double tol, double *xo, double *yo); 271 286 CoordFit *CoordsSetCenter (CoordFit *input, double Xo, double Yo); 272 int FitChip (StarData *raw, StarData *ref, int Nmatch, Coords *coords);287 int FitChip (StarData *raw, StarData *ref, int Nmatch, Image *image); 273 288 void FitMosaic (StarData *raw, StarData *ref, int Nmatch, Coords *coords); 274 289 void FitSimple (StarData *raw, StarData *ref, int Nmatch, Coords *coords); … … 293 308 StarData *getImageRef (Catalog *catalog, int Ncatalog, off_t im, off_t *Nstars, CoordMode mode); 294 309 StarData *getImageRaw (Catalog *catalog, int Ncatalog, off_t im, off_t *Nstars, CoordMode mode); 310 off_t getImageByID (off_t ID); 295 311 296 312 Mosaic *getmosaics (off_t *N); … … 331 347 int high_speed_objects (SkyRegion *region, Catalog *catalog); 332 348 int MeasMatchesPhotcode(Measure *measure, PhotCode **photcodeSet, int Nset); 349 350 int initStarMaps (); 351 int updateStarMaps(Catalog *catalog); 352 int createStarMapPoints(); 353 int checkStarMap(int N); -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/ConfigInit.c
r25757 r29060 32 32 GetConfig (config, "PM_TOOFEW", "%d", 0, &PM_TOOFEW); 33 33 GetConfig (config, "POS_TOOFEW", "%d", 0, &POS_TOOFEW); 34 35 GetConfig (config, "RELASTRO_MAP_NX", "%d", 0, &NX_MAP); 36 GetConfig (config, "RELASTRO_MAP_NY", "%d", 0, &NY_MAP); 37 GetConfig (config, "RELASTRO_DPOS_MAX", "%lf", 0, &DPOS_MAX); 38 GetConfig (config, "ADDSTAR_RADIUS", "%lf", 0, &ADDSTAR_RADIUS); 34 39 35 40 GetConfig (config, "GSCFILE", "%s", 0, GSCFILE); -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/FitChip.c
r27581 r29060 3 3 4 4 // XXX make these user parameters 5 # define FIT_CHIP_MAX_ERROR 0.056 5 # define FIT_CHIP_NITER 3 7 6 # define FIT_CHIP_NSIGMA 3.0 8 9 10 // XXX we should test if the fit is sufficiently constrained across the chip, or if the11 // new positions deviate too much from the old positions12 13 // XXX add visualization tools: per chip residual plots14 7 15 8 // XXX save the fit[0].Npts value in the image table? … … 17 10 // XXX save measurements of the fit quality (scatter, chisq) in the image table 18 11 19 int FitChip (StarData *raw, StarData *ref, int Nmatch, Coords *coords) {12 int FitChip (StarData *raw, StarData *ref, int Nmatch, Image *image) { 20 13 21 14 int i, Nscatter, Niter, skip; … … 29 22 for (i = Nscatter = 0; i < Nmatch; i++) { 30 23 if (raw[i].mask) continue; 31 if (isnan(raw[i].dMag) || raw[i].dMag > FIT_CHIP_MAX_ERROR) continue;24 if (isnan(raw[i].dMag) || raw[i].dMag > SIGMA_LIM) continue; 32 25 33 26 dL = raw[i].L - ref[i].L; … … 39 32 } 40 33 41 // for a 2D Gaussian, 40% of the points are within 1 sigma; dRmax is ~ 3 sigma 42 dsort (values, Nscatter); 43 dRmax = FIT_CHIP_NSIGMA*values[(int)(0.40*Nscatter)]; 44 relastroVisualPlotScatter(values, dRmax, Nscatter); 45 relastroVisualPlotRawRef(raw, ref, dRmax, Nmatch); 34 if (Nscatter > 5) { 35 // for a 2D Gaussian, 40% of the points are within 1 sigma; dRmax is ~ 3 sigma 36 // XXX this test is not sensible for Nscatter < XXX (5?) 37 dsort (values, Nscatter); 38 dRmax = FIT_CHIP_NSIGMA*values[(int)(0.40*Nscatter)]; 39 relastroVisualPlotScatter(values, dRmax, Nscatter); 40 relastroVisualPlotRawRef(raw, ref, dRmax, Nmatch); 41 } else { 42 dRmax = 0; 43 } 46 44 47 45 // fit the requested order polynomial 48 46 if (CHIPORDER > 0) { 49 coords[0].Npolyterms = CHIPORDER;47 image[0].coords.Npolyterms = CHIPORDER; 50 48 } 51 fit = fit_init ( coords[0].Npolyterms);49 fit = fit_init (image[0].coords.Npolyterms); 52 50 53 51 // generate the fit matches … … 56 54 continue; 57 55 } 58 if (isnan(raw[i].dMag) || raw[i].dMag > FIT_CHIP_MAX_ERROR) {56 if (isnan(raw[i].dMag) || raw[i].dMag > SIGMA_LIM) { 59 57 continue; 60 58 } … … 64 62 dM = raw[i].M - ref[i].M; 65 63 dR = hypot (dL, dM); 66 if (dR > dRmax) continue; 64 65 // fprintf (stderr, "fit %f %f -> %f %f : %f %f (%f vs %f) wt: %f\n", raw[i].X, raw[i].Y, ref[i].L, ref[i].M, raw[i].L, raw[i].M, dR, dRmax, raw[i].dPos); 66 67 if ((dRmax > 0.0) && (dR > dRmax)) continue; 67 68 68 69 fit_add (fit, raw[i].X, raw[i].Y, ref[i].L, ref[i].M, raw[i].dPos); … … 71 72 // check if the fit has enough data points for the polynomial order 72 73 skip = FALSE; 73 switch ( coords[0].Npolyterms) {74 switch (image[0].coords.Npolyterms) { 74 75 case 0: 75 76 case 1: … … 83 84 break; 84 85 default: 85 fprintf (stderr, "invalid chip order %d\n", coords[0].Npolyterms);86 fprintf (stderr, "invalid chip order %d\n", image[0].coords.Npolyterms); 86 87 skip = TRUE; 87 88 } 88 89 if (skip) { 89 fprintf (stderr, "insufficient measurements (%d) for requested order (%d)\n", fit[0].Npts, coords[0].Npolyterms);90 if (VERBOSE) fprintf (stderr, "insufficient measurements (%d) for requested order (%d)\n", fit[0].Npts, image[0].coords.Npolyterms); 90 91 fit_free (fit); 91 92 free (values); 93 image[0].flags |= ID_IMAGE_ASTROM_FEW; 92 94 return FALSE; 93 95 } … … 98 100 if (!fit_eval (fit)) { 99 101 fprintf (stderr, "failed to fit new model\n"); 102 image[0].flags |= ID_IMAGE_ASTROM_FAIL; 100 103 return FALSE; 101 104 } 102 105 103 if (!fit_apply_coords (fit, coords)) {106 if (!fit_apply_coords (fit, &image[0].coords, FALSE)) { 104 107 fprintf (stderr, "failed to fit new model\n"); 108 image[0].flags |= ID_IMAGE_ASTROM_FAIL; 105 109 return FALSE; 106 110 } … … 109 113 110 114 for (i = 0; i < Nmatch; i++) { 111 XY_to_LM (&raw[i].L, &raw[i].M, raw[i].X, raw[i].Y, coords);115 XY_to_LM (&raw[i].L, &raw[i].M, raw[i].X, raw[i].Y, &image[0].coords); 112 116 } 113 117 -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/FitMosaic.c
r16810 r29060 26 26 } 27 27 fit_eval (fit); 28 fit_apply_coords (fit, coords );28 fit_apply_coords (fit, coords, TRUE); 29 29 fit_free (fit); 30 30 -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/FitSimple.c
r27435 r29060 26 26 } 27 27 fit_eval (fit); 28 fit_apply_coords (fit, coords );28 fit_apply_coords (fit, coords, TRUE); 29 29 fit_free (fit); 30 30 -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/ImageOps.c
r28241 r29060 319 319 } 320 320 321 void dump_measures(Average *average, Measure *measure) { 322 323 off_t j, off; 324 325 for (j = 0; j < average[0].Nmeasure; j++) { 326 off = average[0].measureOffset + j; 327 fprintf (stderr, "%f, %f\n", measure[off].dR, measure[off].dD); 328 } 329 return; 330 } 331 321 332 // return StarData values for detections in the specified image, converting coordinates from the 322 333 // chip positions: X,Y -> L,M -> P,Q -> R,D … … 325 336 off_t i, m, c, n, nPos; 326 337 double X, Y, L, M, P, Q, R, D, dR, dD; 327 double dPos ;338 double dPos, DPOS_MAX_ASEC; 328 339 329 340 Mosaic *mosaic; … … 341 352 } 342 353 imcoords = &image[im].coords; 354 355 if (moscoords) { 356 DPOS_MAX_ASEC = 3600.0*DPOS_MAX*hypot(moscoords[0].cdelt1, moscoords[0].cdelt2); 357 } else { 358 DPOS_MAX_ASEC = 3600.0*DPOS_MAX*hypot(imcoords[0].cdelt1, imcoords[0].cdelt2); 359 } 343 360 344 361 // accumulate the rms position offsets. if this value, or any specific entry, is too … … 372 389 373 390 // complain if the new location is far from the average location 374 if (fabs(dR) > 2.0) { 375 fprintf (stderr, "!"); 376 setBadCoords (im); // report a failure for this image 377 return; 378 } 379 if (fabs(dD) > 2.0) { 380 fprintf (stderr, "*"); 381 setBadCoords (im); // report a failure for this image 382 return; 391 // NOTE: This should never happen, or our StarMap tests are not working 392 if (fabs(dR) > 1.5*ADDSTAR_RADIUS) { 393 fprintf (stderr, "measurement is far from average location (R): %f %f (%f %f)\n", catalog[c].average[n].R, catalog[c].average[n].D, dR, dD); 394 dump_measures (&catalog[c].average[n], catalog[c].measure); 395 // abort (); 396 } 397 if (fabs(dD) > 1.5*ADDSTAR_RADIUS) { 398 fprintf (stderr, "measurement is far from average location (D): %f %f (%f %f)\n", catalog[c].average[n].R, catalog[c].average[n].D, dR, dD); 399 dump_measures (&catalog[c].average[n], catalog[c].measure); 400 // abort (); 383 401 } 384 402 385 403 // complain if the new location is far from the old location 386 if (fabs(catalog[c].measure[m].dR - dR) > 2.0) {387 fprintf (stderr, " @");388 setBadCoords (im); // report a failure for this image389 return;390 } 391 if (fabs(catalog[c].measure[m].dD - dD) > 2.0) {392 fprintf (stderr, " #");393 setBadCoords (im); // report a failure for this image394 return;404 if (fabs(catalog[c].measure[m].dR - dR) > DPOS_MAX_ASEC) { 405 fprintf (stderr, "measurement is far from original location (R): %f %f (%f %f)\n", catalog[c].average[n].R, catalog[c].average[n].D, dR, dD); 406 dump_measures (&catalog[c].average[n], catalog[c].measure); 407 // abort(); 408 } 409 if (fabs(catalog[c].measure[m].dD - dD) > DPOS_MAX_ASEC) { 410 fprintf (stderr, "measurement is far from original location (D): %f %f (%f %f)\n", catalog[c].average[n].R, catalog[c].average[n].D, dR, dD); 411 dump_measures (&catalog[c].average[n], catalog[c].measure); 412 // abort(); 395 413 } 396 414 … … 414 432 415 433 saveOffsets (dPos, nPos, im); 434 435 // XXX this function should probably update the average positions as well. 416 436 417 437 return; -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/UpdateChips.c
r28241 r29060 31 31 // FitChip does iterative, clipped fitting 32 32 // fprintf (stderr, "image "OFF_T_FMT" : Nstars: "OFF_T_FMT"\n", i, Nraw); 33 if (!FitChip (raw, ref, Nraw, &image[i] .coords)) {34 fprintf (stderr, "reject fit for image %s ("OFF_T_FMT") : Nstars: "OFF_T_FMT"\n", image[i].name, i, Nraw);33 if (!FitChip (raw, ref, Nraw, &image[i])) { 34 if (VERBOSE) fprintf (stderr, "reject fit for image %s ("OFF_T_FMT") : Nstars: "OFF_T_FMT"\n", image[i].name, i, Nraw); 35 35 oldCoords = getCoords (i); 36 36 memcpy (&image[i].coords, oldCoords, sizeof(Coords)); 37 free (raw); 38 free (ref); 39 continue; 40 } 41 42 if (!checkStarMap (i)) { 43 if (VERBOSE) fprintf (stderr, "fit diverges too much for image %s ("OFF_T_FMT") : Nstars: "OFF_T_FMT"\n", image[i].name, i, Nraw); 44 oldCoords = getCoords (i); 45 memcpy (&image[i].coords, oldCoords, sizeof(Coords)); 46 image[i].flags |= ID_IMAGE_ASTROM_POOR; 37 47 } 38 48 -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/UpdateMeasures.c
r27435 r29060 5 5 off_t i, Nimage; 6 6 Image *image; 7 8 int badImage = 9 ID_IMAGE_ASTROM_NOCAL | 10 ID_IMAGE_ASTROM_POOR | 11 ID_IMAGE_ASTROM_FAIL | 12 ID_IMAGE_ASTROM_SKIP | 13 ID_IMAGE_ASTROM_FEW; 7 14 8 15 image = getimages (&Nimage); … … 13 20 if (!strcmp(&image[i].coords.ctype[4], "-DIS")) continue; 14 21 22 // skip images that have failed solutions (divergent or otherwise) 23 if (image[i].flags & badImage) continue; 24 15 25 /* convert measure coordinates to raw entries */ 16 26 fixImageRaw (catalog, Ncatalog, i); -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/bcatalog.c
r28241 r29060 45 45 offset = catalog[0].average[i].measureOffset + j; 46 46 47 // filter objects based on user supplied criteria47 // filter objects based on user supplied criteria 48 48 if (!MeasFilterTest(&catalog[0].measure[offset])) { 49 49 catalog[0].measure[offset].dbFlags &= ~ID_MEAS_USED_CHIP; … … 51 51 } 52 52 53 // filter out outliers53 // filter out outliers 54 54 if (FlagOutlier && (catalog[0].measure[offset].dbFlags & ID_MEAS_POOR_ASTROM)) { 55 55 catalog[0].measure[offset].dbFlags &= ~ID_MEAS_USED_CHIP; -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/fitpoly.c
r27581 r29060 110 110 if (fit[0].Npts == 0) { 111 111 fprintf (stderr, "warning: no valid pts\n"); 112 return (FALSE); 112 113 } 113 114 … … 140 141 } 141 142 142 for (i = 0; i < fit[0].Nelems; i++) {143 for (i = 0; FALSE && (i < fit[0].Nelems); i++) { 143 144 ix = i % fit[0].Nterms; 144 145 iy = i / fit[0].Nterms; 145 //fprintf (stderr, "x2 : x^%dy^%d: %10.4g y2 : x^%dy^%d: %10.4g \n",146 //ix, iy, vector[i][0], ix, iy, vector[i][1]);146 fprintf (stderr, "x2 : x^%dy^%d: %10.4g y2 : x^%dy^%d: %10.4g \n", 147 ix, iy, vector[i][0], ix, iy, vector[i][1]); 147 148 } 148 149 … … 151 152 } 152 153 153 for (i = 0; i < fit[0].Nelems; i++) {154 for (i = 0; FALSE && i < fit[0].Nelems; i++) { 154 155 ix = i % fit[0].Nterms; 155 156 iy = i / fit[0].Nterms; 156 //fprintf (stderr, "x2 : x^%dy^%d: %10.4g y2 : x^%dy^%d: %10.4g \n",157 //ix, iy, vector[i][0], ix, iy, vector[i][1]);157 fprintf (stderr, "x2 : x^%dy^%d: %10.4g y2 : x^%dy^%d: %10.4g \n", 158 ix, iy, vector[i][0], ix, iy, vector[i][1]); 158 159 } 159 160 … … 274 275 /* this should only apply to the polynomial, not the projection terms */ 275 276 /* compare with psastro supporting code */ 276 int fit_apply_coords (CoordFit *fit, Coords *coords ) {277 int fit_apply_coords (CoordFit *fit, Coords *coords, int keepRef) { 277 278 278 279 double Xo, Yo, R1, R2; 279 280 CoordFit *modfit; 280 281 281 /* I have L,M = fit(X,Y). set corresponding terms for coords */ 282 283 // L = a[0][0] + a[1][0]x^1 y^0 + a[0][1] x^0 y^1 + ... 284 // L = pc1_1*cd1*(x - cp1) + pc1_2*cd2*(y - cp2) + ... 285 286 if (!CoordsGetCenter (fit, 0.001, &Xo, &Yo)) { 287 fprintf (stderr, "failed to modify model\n"); 288 return (FALSE); 289 } 290 coords[0].crpix1 = Xo; 291 coords[0].crpix2 = Yo; 292 293 // resulting fit should have zero constant terms 294 modfit = CoordsSetCenter (fit, Xo, Yo); 295 296 /* we do not modify crval1,2: these are kept at the default values */ 282 if (keepRef) { 283 // adjust crpix1,2 as needed: 284 // L = a[0][0] + a[1][0]x^1 y^0 + a[0][1] x^0 y^1 + ... 285 // L = pc1_1*cd1*(x - cp1) + pc1_2*cd2*(y - cp2) + ... 286 287 if (!CoordsGetCenter (fit, 0.001, &Xo, &Yo)) { 288 fprintf (stderr, "failed to modify model\n"); 289 return (FALSE); 290 } 291 coords[0].crpix1 = Xo; 292 coords[0].crpix2 = Yo; 293 /* we do not modify crval1,2: these are kept at the default values */ 294 295 // resulting fit should have zero constant terms 296 modfit = CoordsSetCenter (fit, Xo, Yo); 297 } else { 298 // L = a[0][0] + a[1][0]x^1 y^0 + a[0][1] x^0 y^1 + ... 299 // P = cd1*x, Q = cd2*y 300 // L = pc1_1*P + pc1_2*Q + ... 301 302 /* modify crval1,2: these are kept at the default values */ 303 304 coords[0].crpix1 = 0.0; 305 coords[0].crpix2 = 0.0; 306 modfit = fit; 307 } 297 308 298 309 // set cdelt1, cdelt2 … … 331 342 coords[0].polyterms[6][1] = modfit[0].yfit[0][3]*R2*R2*R2; 332 343 } 333 334 fit_free (modfit); 344 345 if (keepRef) { 346 fit_free (modfit); 347 } else { 348 fit_apply (fit, &coords[0].crval1, &coords[0].crval2, coords[0].crpix1, coords[0].crpix2); 349 } 335 350 /* keep the order and type from initial values */ 336 351 -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/initialize.c
r28184 r29060 100 100 initstats (STATMODE); 101 101 102 // IMAGE_BAD = ID_IMAGE_ POOR | ID_IMAGE_FEW | ID_IMAGE_SKIP;102 // IMAGE_BAD = ID_IMAGE_ASTROM_POOR | ID_IMAGE_ASTROM_FEW | ID_IMAGE_ASTROM_SKIP; 103 103 // STAR_BAD = ID_STAR_POOR | ID_STAR_FEW; 104 104 // MEAS_BAD = ID_MEAS_NOCAL | ID_MEAS_POOR_ASTROM | ID_MEAS_SKIP_ASTROM | ID_MEAS_AREA; -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/load_catalogs.c
r24308 r29060 9 9 10 10 ALLOCATE (catalog, Catalog, skylist[0].Nregions); 11 12 initStarMaps(); 11 13 12 14 // load data from each region file, only use bright stars … … 34 36 FlagOutliers(&tcatalog); 35 37 } 38 39 updateStarMaps (&tcatalog); 36 40 37 41 // select only the brighter stars -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/load_images.c
r27581 r29060 33 33 // convert database table to internal structure 34 34 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 35 if (!image) { 36 fprintf (stderr, "ERROR: failed to read images\n"); 37 exit (2); 38 } 39 35 40 MARKTIME(" convert image table: %f sec\n", dtime); 36 41 … … 52 57 return (skylist); 53 58 } 59 60 int reload_images (FITS_DB *db) { 61 62 Image *image; 63 off_t Nimage, Nx, i; 64 VTable *vtable; 65 66 image = getimages (&Nimage); 67 68 vtable = &db[0].vtable; 69 70 gfits_scan (vtable[0].header, "NAXIS1", OFF_T_FMT, 1, &Nx); 71 for (i = 0; i < Nimage; i++) { 72 memcpy (vtable[0].buffer[i], &image[i], Nx); 73 } 74 return (TRUE); 75 } -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/mkpolyterm.c
r27581 r29060 66 66 Xo -= beta[0][0]; 67 67 Yo -= beta[1][0]; 68 68 69 dPos = hypot(beta[0][0], beta[1][0]); 69 70 if (i == 0) { -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/relastro.c
r28184 r29060 1 1 # include "relastro.h" 2 3 # define MARKTIME(MSG,...) { \4 float dtime; \5 gettimeofday (&stop, (void *) NULL); \6 dtime = DTIME (stop, start); \7 fprintf (stderr, MSG, __VA_ARGS__); }8 2 9 3 int main (int argc, char **argv) { … … 49 43 50 44 /* load catalog data from region files : subselect high-quality measurements */ 45 // XXX pass in the image table 46 // XXX who carries the image grid? 51 47 catalog = load_catalogs (skylist, &Ncatalog, TRUE); 52 48 MARKTIME("load catalog data: %f sec\n", dtime); … … 63 59 // plot_mosaic_fields (catalog); 64 60 } 61 62 // set test points based on the starmap 63 createStarMapPoints(); 65 64 66 65 /* major modes */ … … 98 97 freeImageBins (1); 99 98 99 reload_images (&db); 100 100 101 // iterate over catalogs to make detection coordinates consistant 101 102 UpdateObjectOffsets (skylist); 102 103 103 104 // iterate over catalogs to make detection coordinates consistant 104 FixProblemImages (skylist);105 // FixProblemImages (skylist); 105 106 106 107 // save the updated image parameters -
branches/sc_branches/trunkTest/Ohana/src/relastro/src/select_images.c
r28241 r29060 28 28 double *RmaxSky; 29 29 off_t *index; 30 31 int badImage = 32 ID_IMAGE_ASTROM_POOR | 33 ID_IMAGE_ASTROM_FAIL | 34 ID_IMAGE_ASTROM_FEW; 30 35 31 36 if (skylist[0].Nregions < 1) { … … 171 176 image[nimage] = timage[i]; 172 177 /* always allow 'few' images to succeed, if possible */ 173 if (image[nimage].flags & ID_IMAGE_ FEW) {174 image[nimage].flags &= ~ (ID_IMAGE_FEW | ID_IMAGE_POOR);178 if (image[nimage].flags & ID_IMAGE_ASTROM_FEW) { 179 image[nimage].flags &= ~ID_IMAGE_ASTROM_FEW; 175 180 } 176 181 if (RESET) { … … 178 183 assignMcal (&image[nimage], (double *) NULL, -1); 179 184 image[nimage].dMcal = NAN; 180 image[nimage].flags &= ~ ID_IMAGE_POOR;185 image[nimage].flags &= ~badImage; 181 186 } 182 187 line_number[nimage] = i; -
branches/sc_branches/trunkTest/Ohana/src/relphot/src/ImageOps.c
r28241 r29060 323 323 /* on PoorImages run, skip good images */ 324 324 if (PoorImages) { 325 bad = image[i].flags & (ID_IMAGE_ FEW | ID_IMAGE_POOR | ID_IMAGE_SKIP);325 bad = image[i].flags & (ID_IMAGE_PHOTOM_FEW | ID_IMAGE_PHOTOM_POOR | ID_IMAGE_PHOTOM_SKIP); 326 326 if (!bad) continue; 327 327 } … … 369 369 mark = (N < IMAGE_TOOFEW) || (N < IMAGE_GOOD_FRACTION*Nlist[i]); 370 370 if (mark) { 371 image[i].flags |= ID_IMAGE_ FEW;371 image[i].flags |= ID_IMAGE_PHOTOM_FEW; 372 372 Nfew ++; 373 373 } else { 374 image[i].flags &= ~ID_IMAGE_ FEW;374 image[i].flags &= ~ID_IMAGE_PHOTOM_FEW; 375 375 } 376 376 } … … 387 387 388 388 if (PoorImages) { 389 IMAGE_BAD = ID_IMAGE_P OOR | ID_IMAGE_FEW | ID_IMAGE_SKIP;389 IMAGE_BAD = ID_IMAGE_PHOTOM_POOR | ID_IMAGE_PHOTOM_FEW | ID_IMAGE_PHOTOM_SKIP; 390 390 STAR_BAD = ID_STAR_POOR | ID_STAR_FEW; 391 391 MEAS_BAD = ID_MEAS_NOCAL | ID_MEAS_POOR_PHOTOM | ID_MEAS_SKIP_PHOTOM | ID_MEAS_AREA; … … 429 429 for (i = 0; i < Nimage; i++) { 430 430 mark = FALSE; 431 image[i].flags &= ~ID_IMAGE_P OOR;431 image[i].flags &= ~ID_IMAGE_PHOTOM_POOR; 432 432 mark = (image[i].dMcal > MaxScatter) || (fabs(image[i].Mcal - MedOffset) > MaxOffset); 433 433 if (mark) { 434 434 Nmark ++; 435 image[i].flags |= ID_IMAGE_P OOR;435 image[i].flags |= ID_IMAGE_PHOTOM_POOR; 436 436 } else { 437 image[i].flags &= ~ID_IMAGE_P OOR;437 image[i].flags &= ~ID_IMAGE_PHOTOM_POOR; 438 438 } 439 439 } -
branches/sc_branches/trunkTest/Ohana/src/relphot/src/MosaicOps.c
r28241 r29060 189 189 image[im].dMcal = mosaic[i].dMcal; 190 190 image[im].Xm = mosaic[i].Xm; 191 image[im].flags |= (mosaic[i].flags & ID_IMAGE_ FEW);192 image[im].flags |= (mosaic[i].flags & ID_IMAGE_P OOR);191 image[im].flags |= (mosaic[i].flags & ID_IMAGE_PHOTOM_FEW); 192 image[im].flags |= (mosaic[i].flags & ID_IMAGE_PHOTOM_POOR); 193 193 } 194 194 } … … 351 351 /* on PoorImages run, skip good images */ 352 352 if (PoorImages) { 353 bad = mosaic[i].flags & (ID_IMAGE_ FEW | ID_IMAGE_POOR | ID_IMAGE_SKIP);353 bad = mosaic[i].flags & (ID_IMAGE_PHOTOM_FEW | ID_IMAGE_PHOTOM_POOR | ID_IMAGE_PHOTOM_SKIP); 354 354 if (!bad) continue; 355 355 } … … 401 401 if (mark) { 402 402 fprintf (stderr, "marked mosaic %s ("OFF_T_FMT"), ("OFF_T_FMT" < %d) || ("OFF_T_FMT" < %f*"OFF_T_FMT")\n", image[imlist[i][0]].name, i, N, IMAGE_TOOFEW, N, IMAGE_GOOD_FRACTION, Nlist[i]); 403 mosaic[i].flags |= ID_IMAGE_ FEW;403 mosaic[i].flags |= ID_IMAGE_PHOTOM_FEW; 404 404 Nfew ++; 405 405 } else { 406 mosaic[i].flags &= ~ID_IMAGE_ FEW;406 mosaic[i].flags &= ~ID_IMAGE_PHOTOM_FEW; 407 407 } 408 408 } … … 421 421 422 422 if (PoorImages) { 423 IMAGE_BAD = ID_IMAGE_P OOR | ID_IMAGE_FEW | ID_IMAGE_SKIP;423 IMAGE_BAD = ID_IMAGE_PHOTOM_POOR | ID_IMAGE_PHOTOM_FEW | ID_IMAGE_PHOTOM_SKIP; 424 424 STAR_BAD = ID_STAR_POOR | ID_STAR_FEW; 425 425 MEAS_BAD = ID_MEAS_NOCAL | ID_MEAS_POOR_PHOTOM | ID_MEAS_SKIP_PHOTOM | ID_MEAS_AREA; … … 593 593 if (mark) { 594 594 Nmark ++; 595 mosaic[i].flags |= ID_IMAGE_P OOR;595 mosaic[i].flags |= ID_IMAGE_PHOTOM_POOR; 596 596 } else { 597 mosaic[i].flags &= ~ID_IMAGE_P OOR;597 mosaic[i].flags &= ~ID_IMAGE_PHOTOM_POOR; 598 598 } 599 599 } -
branches/sc_branches/trunkTest/Ohana/src/relphot/src/StarOps.c
r28241 r29060 188 188 StatType stats; 189 189 PhotCode *code; 190 DVOAverageFlags flagBits; 191 192 flagBits = ID_OBJ_EXT | ID_OBJ_EXT_ALT | ID_OBJ_GOOD | ID_OBJ_GOOD_ALT; 190 193 191 194 // pre-allocate a list for stats purposes … … 281 284 } 282 285 286 // we attempt to set a few flags here; reset those bits before trying: 287 catalog[i].average[j].flags &= ~flagBits; 288 283 289 if (nEXT && (nEXT > nPSF)) { 284 catalog[i].average[j].flags |= 0x00010000;290 catalog[i].average[j].flags |= ID_OBJ_EXT; 285 291 } 286 292 if (goodPS1) { 287 catalog[i].average[j].flags |= 0x00020000;293 catalog[i].average[j].flags |= ID_OBJ_GOOD; 288 294 } 289 295 if (Galaxy2MASS) { 290 catalog[i].average[j].flags |= 0x00040000;296 catalog[i].average[j].flags |= ID_OBJ_EXT_ALT; 291 297 } 292 298 if (good2MASS) { 293 catalog[i].average[j].flags |= 0x00080000;299 catalog[i].average[j].flags |= ID_OBJ_GOOD_ALT; 294 300 } 295 301 } … … 302 308 } 303 309 304 /* set measure.Mcal for all measures except ID_MEAS_NOCAL and ID_IMAGE_ NOCAL */310 /* set measure.Mcal for all measures except ID_MEAS_NOCAL and ID_IMAGE_PHOTOM_NOCAL */ 305 311 int setMcalOutput (Catalog *catalog, int Ncatalog) { 306 312 … … 310 316 311 317 MEAS_BAD = ID_MEAS_NOCAL; 312 IMAGE_BAD = ID_IMAGE_ NOCAL;318 IMAGE_BAD = ID_IMAGE_PHOTOM_NOCAL; 313 319 314 320 for (i = 0; i < Ncatalog; i++) { … … 470 476 /* apply to list of all relevant measurements, including IMAGE_POOR & IMAGE_FEW */ 471 477 image_bad = IMAGE_BAD; 472 IMAGE_BAD = ID_IMAGE_ NOCAL;478 IMAGE_BAD = ID_IMAGE_PHOTOM_NOCAL; 473 479 m = catalog[i].average[j].measureOffset; 474 480 N = 0; -
branches/sc_branches/trunkTest/Ohana/src/relphot/src/initialize.c
r17242 r29060 27 27 initstats (STATMODE); 28 28 29 IMAGE_BAD = ID_IMAGE_P OOR | ID_IMAGE_FEW | ID_IMAGE_SKIP;29 IMAGE_BAD = ID_IMAGE_PHOTOM_POOR | ID_IMAGE_PHOTOM_FEW | ID_IMAGE_PHOTOM_SKIP; 30 30 STAR_BAD = ID_STAR_POOR | ID_STAR_FEW; 31 31 MEAS_BAD = ID_MEAS_NOCAL | ID_MEAS_POOR_PHOTOM | ID_MEAS_SKIP_PHOTOM | ID_MEAS_AREA; -
branches/sc_branches/trunkTest/Ohana/src/relphot/src/load_images.c
r28241 r29060 25 25 // convert database table to internal structure 26 26 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 27 if (!image) { 28 fprintf (stderr, "ERROR: failed to read images\n"); 29 exit (2); 30 } 27 31 28 32 // select the images which overlap the selected sky regions -
branches/sc_branches/trunkTest/Ohana/src/relphot/src/select_images.c
r28241 r29060 157 157 image[nimage] = timage[i]; 158 158 /* always allow 'few' images to succeed, if possible */ 159 if (image[nimage].flags & ID_IMAGE_ FEW) {160 image[nimage].flags &= ~(ID_IMAGE_ FEW | ID_IMAGE_POOR);159 if (image[nimage].flags & ID_IMAGE_PHOTOM_FEW) { 160 image[nimage].flags &= ~(ID_IMAGE_PHOTOM_FEW | ID_IMAGE_PHOTOM_POOR); 161 161 } 162 162 if (RESET) { 163 163 assignMcal (&image[nimage], (double *) NULL, -1); 164 164 image[nimage].dMcal = NAN; 165 image[nimage].flags &= ~ID_IMAGE_P OOR;165 image[nimage].flags &= ~ID_IMAGE_PHOTOM_POOR; 166 166 } 167 167 line_number[nimage] = i; -
branches/sc_branches/trunkTest/Ohana/src/relphot/src/setMrelFinal.c
r28241 r29060 75 75 76 76 /* allow measures from images marked POOR and FEW */ 77 if (pass >= 3) IMAGE_BAD = ID_IMAGE_ NOCAL;77 if (pass >= 3) IMAGE_BAD = ID_IMAGE_PHOTOM_NOCAL; 78 78 79 79 /* allow measures marked as outliers (POOR) and off image region (AREA) */ -
branches/sc_branches/trunkTest/Ohana/src/uniphot/src/find_image_sgroups.c
r27435 r29060 13 13 imlink = *Imlink; 14 14 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 15 if (!image) { 16 fprintf (stderr, "ERROR: failed to read images\n"); 17 exit (2); 18 } 15 19 16 20 coords.crpix1 = coords.crpix2 = 0.0; … … 28 32 for (i = 0; i < Nimage; i++) { 29 33 if (imlink[i].sgroup != NULL) continue; 30 if (image[i].flags & ID_IMAGE_ NOCAL) continue;34 if (image[i].flags & ID_IMAGE_PHOTOM_NOCAL) continue; 31 35 32 36 /* new sgroup, set ref coords */ … … 53 57 54 58 for (j = 0; j < Nimage; j++) { 55 if (image[j].flags & ID_IMAGE_ NOCAL) continue;59 if (image[j].flags & ID_IMAGE_PHOTOM_NOCAL) continue; 56 60 if (imlink[j].sgroup != NULL) continue; 57 61 -
branches/sc_branches/trunkTest/Ohana/src/uniphot/src/find_image_tgroups.c
r27435 r29060 12 12 13 13 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 14 if (!image) { 15 fprintf (stderr, "ERROR: failed to read images\n"); 16 exit (2); 17 } 18 14 19 ALLOCATE (imlink, ImageLink, Nimage); 15 20 … … 64 69 if (image[j].tzero < tmin[i]) continue; 65 70 if (image[j].tzero > tmax[i]) continue; 66 if (image[j].flags & ID_IMAGE_ NOCAL) continue;71 if (image[j].flags & ID_IMAGE_PHOTOM_NOCAL) continue; 67 72 68 73 group[i].image[Nentry] = &image[j]; -
branches/sc_branches/trunkTest/Ohana/src/uniphot/src/initialize.c
r27790 r29060 16 16 } 17 17 18 IMAGE_BAD = ID_IMAGE_ NOCAL | ID_IMAGE_POOR | ID_IMAGE_SKIP | ID_IMAGE_FEW;18 IMAGE_BAD = ID_IMAGE_PHOTOM_NOCAL | ID_IMAGE_PHOTOM_POOR | ID_IMAGE_PHOTOM_SKIP | ID_IMAGE_PHOTOM_FEW; 19 19 20 20 initstats (STATMODE); -
branches/sc_branches/trunkTest/Ohana/src/uniphot/src/load_images.c
r28241 r29060 22 22 /* use a vtable to keep the images to be calibrated */ 23 23 image = gfits_table_get_Image (&db[0].ftable, Nimage, &db[0].swapped); 24 if (!image) { 25 fprintf (stderr, "ERROR: failed to read images\n"); 26 exit (2); 27 } 24 28 25 29 fprintf (stderr, "loaded "OFF_T_FMT" images\n", *Nimage); -
branches/sc_branches/trunkTest/Ohana/src/uniphot/src/match_zpts_to_images.c
r28717 r29060 71 71 image[Ni].Mcal = SCALE*code[0].C - zpts[Nz].zpt; 72 72 image[Ni].dMcal = zpts[Nz].zpt_err; 73 image[Ni].flags &= ~ID_IMAGE_ NOCAL; // clear the NOCAL flag73 image[Ni].flags &= ~ID_IMAGE_PHOTOM_NOCAL; // clear the NOCAL flag 74 74 zpts[Nz].found = TRUE; 75 75 NImatch ++; -
branches/sc_branches/trunkTest/Ohana/src/uniphot/src/subset_images.c
r27435 r29060 9 9 /* use a vtable to keep the images to be calibrated */ 10 10 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 11 if (!image) { 12 fprintf (stderr, "ERROR: failed to read images\n"); 13 exit (2); 14 } 11 15 12 16 Nkeep = 0; … … 16 20 for (i = 0; i < Nimage; i++) { 17 21 18 image[i].flags |= ID_IMAGE_ NOCAL;22 image[i].flags |= ID_IMAGE_PHOTOM_NOCAL; 19 23 20 24 /* select images by photcode */ … … 27 31 if (image[i].tzero > TSTOP) continue; 28 32 } 29 image[i].flags &= ~ID_IMAGE_ NOCAL;33 image[i].flags &= ~ID_IMAGE_PHOTOM_NOCAL; 30 34 keep[Nkeep] = i; 31 35 Nkeep ++; -
branches/sc_branches/trunkTest/Ohana/src/uniphot/src/update.c
r27435 r29060 14 14 15 15 image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped); 16 if (!image) { 17 fprintf (stderr, "ERROR: failed to read images\n"); 18 exit (2); 19 } 16 20 17 21 /* clear the NOCAL flags */ 18 22 for (i = 0; i < Nimage; i++) { 19 image[i].flags &= ~ID_IMAGE_ NOCAL;23 image[i].flags &= ~ID_IMAGE_PHOTOM_NOCAL; 20 24 } 21 25 -
branches/sc_branches/trunkTest/PS-IPP-PStamp/lib/PS/IPP/PStamp/Job.pm
r28562 r29060 1130 1130 } 1131 1131 $cam_path_base = $run->{cam_path_base}; 1132 $astrom_file = $run->{astrom _file};1132 $astrom_file = $run->{astrom}; 1133 1133 } 1134 1134 my $astrom_file_resolved = $ipprc->file_resolve($astrom_file); -
branches/sc_branches/trunkTest/ippMonitor/Makefile.in
r28724 r29060 61 61 $(DESTWWW)/cleanTmpDirectory.php \ 62 62 $(DESTWWW)/warpProcessedExp_Images.php \ 63 $(DESTWWW)/warpProcessedExp.php 63 $(DESTWWW)/warpProcessedExp.php \ 64 $(DESTWWW)/diskUsage.php 64 65 65 66 DEFSRC = \ … … 103 104 $(DESTWWW)/chipProcessedImfile.php \ 104 105 $(DESTWWW)/chipProcessedImfile_failure.php \ 106 $(DESTWWW)/failedChipProcessedImfile.php \ 105 107 $(DESTWWW)/camSummary.php \ 106 108 $(DESTWWW)/camStageExp.php \ … … 109 111 $(DESTWWW)/camProcessedExp_Images.php \ 110 112 $(DESTWWW)/camProcessedExp_failure.php \ 113 $(DESTWWW)/failedCamProcessedExp.php \ 111 114 $(DESTWWW)/camIQstats.php \ 112 115 $(DESTWWW)/camProcessedImfile.php \ … … 118 121 $(DESTWWW)/fakeProcessedImfile.php \ 119 122 $(DESTWWW)/fakeProcessedImfile_failure.php \ 123 $(DESTWWW)/failedFakeProcessedImfile.php \ 120 124 $(DESTWWW)/pzPendingExp.php \ 121 125 $(DESTWWW)/pzPendingImfile.php \ … … 142 146 $(DESTWWW)/warpProcessedSkyfiles.php \ 143 147 $(DESTWWW)/warpFailedSkyfiles.php \ 148 $(DESTWWW)/failedWarpSkyfiles.php \ 144 149 $(DESTWWW)/diffSummary.php \ 145 150 $(DESTWWW)/diffSummary_Images.php \ … … 148 153 $(DESTWWW)/diffProcessedSkyfile.php \ 149 154 $(DESTWWW)/diffProcessedSkyfile_Images.php \ 150 $(DESTWWW)/ diffFailedSkyfile.php \155 $(DESTWWW)/failedDiffSkyfile.php \ 151 156 $(DESTWWW)/stackRun.php \ 152 157 $(DESTWWW)/stackSummary.php \ … … 156 161 $(DESTWWW)/stackProcessedSkyfile_Images.php \ 157 162 $(DESTWWW)/stackFailedSkyfile.php \ 163 $(DESTWWW)/failedStackSkyfile.php \ 158 164 $(DESTWWW)/staticskyRun.php \ 159 165 $(DESTWWW)/staticskySummary.php \ … … 168 174 $(DESTWWW)/magicProcessedMasks_Images.php \ 169 175 $(DESTWWW)/magicFailedTrees.php \ 176 $(DESTWWW)/failedMagicTrees.php \ 170 177 $(DESTWWW)/magicFailedNodes.php \ 178 $(DESTWWW)/failedMagicNodes.php \ 171 179 $(DESTWWW)/magicFailedMasks.php \ 180 $(DESTWWW)/failedMagicMasks.php \ 172 181 $(DESTWWW)/distSummary.php \ 173 182 $(DESTWWW)/distTarget.php \ -
branches/sc_branches/trunkTest/ippMonitor/raw/czartool_labels.php
r28861 r29060 10 10 //$db = dbconnect($ID['proj']); 11 11 $czardb = dbconnect("czardb"); // HACK to connect to czarDb 12 $lastUpdateTime = getLastUpdateTime($czardb); 13 12 14 $gpc1db = dbconnect($ID['proj']); 13 15 … … 22 24 else {$myMenu = "ipp.imfiles.dat";} 23 25 24 menu($myMenu, 'Czartool ', 'ipp.css', $ID['link'], $ID['proj']);26 menu($myMenu, 'Czartool on '.$lastUpdateTime, 'ipp.css', $ID['link'], $ID['proj']); 25 27 26 28 $pass = $ID['pass']; … … 34 36 $selectedRevertMode = $_GET[revertmode]; 35 37 36 if ($selectedLabel == "") $selectedLabel = "all_labels"; 37 if ($selectedStage == "") $selectedStage = "all_stages"; 38 if ($selectedLabel == "") { $selectedLabel = "all_stdscience_labels"; } 39 if ($selectedStage == "") { $selectedStage = "all_stages"; } 40 41 echo "<p align=\"center\"> Current status of the IPP as of $lastUpdateTime (faults are shown in parentheses). <br>Documentation can be found <a href=\"http://svn.pan-starrs.ifa.hawaii.edu/trac/ipp/wiki/Processing\">here</a> and cluster load monitored <a href=\"http://ganglia.pan-starrs.ifa.hawaii.edu/?r=hour&s=descending&c=IPP%2520Production\">here</a></p>"; 38 42 39 43 // deal with reverts: turn on or off if requested and pass current revert state for this stage onto labels table later … … 52 56 $distLabels = getLabels($czardb, "distribution"); 53 57 $pubLabels = getLabels($czardb, "publishing"); 58 $updateLabels = getLabels($czardb, "update"); 54 59 55 60 if ($debug) { … … 61 66 62 67 $states=array("full","new","drop","wait"); 63 $stages=array(" chip","cam","fake","warp","stack","diff","magic","magicDS","dist");68 $stages=array("burntool", "chip","cam","fake","warp","stack","diff","magic","magicDS","dist"); 64 69 $servers=array( 65 70 "addstar", … … 82 87 echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n"; 83 88 echo "</form>\n"; 84 $lastUpdateTime = getLastUpdateTime($czardb);85 echo "<p align=\"center\"> Current status of IPP (any faults are shown in parentheses). NOTE: This data is good as of: $lastUpdateTime </p>";86 89 87 90 echo "<table>\n"; … … 92 95 93 96 echo "<td> \n"; 94 createLabelsTable($pass, $proj, $czardb, $stdsLabels, $distLabels, $pubLabels, $stages, $states, "new", $selectedLabel, $selectedStage); 97 createLabelsTable($pass, $proj, $czardb, "stdscience", $stdsLabels, $distLabels, $pubLabels, $stages, $states, "new", $selectedLabel, $selectedStage); 98 echo "</td>\n"; 99 echo "</tr>\n"; 100 101 echo "<tr>\n"; 102 echo "<td>\n"; 103 echo "<img src=\"czartool_getplot.php?type=h&label=$selectedLabel&stage=$selectedStage\"><br>"; 104 echo "</td>\n"; 105 106 echo "<td> \n"; 107 createLabelsTable($pass, $proj, $czardb, "update", $updateLabels, $distLabels, $pubLabels, $stages, $states, "new", $selectedLabel, $selectedStage); 95 108 echo "</td>\n"; 96 109 echo "</tr>\n"; … … 100 113 echo "<tr valign=top>\n"; 101 114 echo "<td> \n"; 102 echo "<img src=\"czartool_getplot.php?type= h&label=$selectedLabel&stage=$selectedStage\"><br>";115 echo "<img src=\"czartool_getplot.php?type=s\"><br>"; 103 116 echo "</td>\n"; 104 117 echo "<td>\n"; … … 116 129 echo "<tr valign=top>\n"; 117 130 echo "<td> \n"; 118 echo "<img src=\"czartool_getplot.php?type=s\"><br>";119 131 echo "</td>\n"; 120 132 echo "<td>\n"; … … 211 223 # 212 224 ########################################################################### 213 function createLabelsTable($pass, $proj, $db, $s tdsLabels, $distLabels, $pubLabels, $stages, $states, $selectedState, $selectedLabel, $selectedStage) {225 function createLabelsTable($pass, $proj, $db, $server, $labels, $distLabels, $pubLabels, $stages, $states, $selectedState, $selectedLabel, $selectedStage) { 214 226 215 227 // set up table columns … … 218 230 echo "<tr><td></td>\n"; 219 231 232 echo "<p align=\"center\"> Current labels for $server server (D=distributing, P=publishing)</p>"; 233 220 234 write_header_cell($class, ""); 221 235 write_header_cell($class, ""); … … 223 237 foreach ($stages as &$stage) { 224 238 239 if ($stage == "burntool") continue; 225 240 $reverting = getRevertStatus($db, $stage); 226 241 $link = "czartool_labels.php?pass=" . $pass . "&proj=" . $proj . "&label=" . $selectedLabel . "&stage=" . $selectedStage . "&revertstage=" . $stage . "&revertmode="; … … 234 249 echo "</tr>\n"; 235 250 echo "<tr><td></td>\n"; 251 write_header_cell($class, " "); 236 252 write_header_cell($class, "Label (in order of priority)"); 237 write_header_cell($class, "Distributing?");238 write_header_cell($class, "Publishing?");239 253 foreach ($stages as &$stage) { 240 254 … … 254 268 255 269 // write rows 256 foreach ($ stdsLabels as &$stdsLabel) {270 foreach ($labels as &$thisLabel) { 257 271 258 272 $distributing = false; … … 260 274 foreach ($distLabels as &$distLabel) { 261 275 262 if ($ stdsLabel == $distLabel) { $distributing = true; break;}276 if ($thisLabel == $distLabel) { $distributing = true; break;} 263 277 } 264 278 foreach ($pubLabels as &$pubLabel) { 265 279 266 if ($ stdsLabel == $pubLabel) { $publishing = true; break;}280 if ($thisLabel == $pubLabel) { $publishing = true; break;} 267 281 } 268 282 269 283 // create link to label summary page for each label 270 if ($ stdsLabel == $selectedLabel) $link = "";271 else $link = "czartool_labels.php?pass=" . $pass . "&proj=" . $proj . "&label=" . $ stdsLabel . "&stage=" . $selectedStage;284 if ($thisLabel == $selectedLabel) $link = ""; 285 else $link = "czartool_labels.php?pass=" . $pass . "&proj=" . $proj . "&label=" . $thisLabel . "&stage=" . $selectedStage; 272 286 273 287 echo "<tr><td></td>\n"; 274 write_table_cell($class, '%s', $link, $stdsLabel); 275 write_table_cell($class, '%s', "", $distributing ? "yes" : "NO"); 276 write_table_cell($class, '%s', "", $publishing ? "yes" : "NO"); 288 $distPub = " "; 289 if ($distributing) $distPub = "D"; 290 if ($publishing) $distPub = $distPub . "P"; 291 write_table_cell($class, '%s', "", $distPub); 292 293 write_table_cell($class, '%s', $link, $thisLabel); 277 294 278 295 $str = ""; 279 296 $anyFaults = false; 280 297 281 $link = "chipProcessedImfile_failure.php?pass=" . $pass . "&proj=" . $proj . "&chipRun.label=" . $stdsLabel . "&chipRun.state=new";282 getStateAndFaults($db, $ stdsLabel, $selectedState, "chip", $str, $anyFaults);298 $link = $defaultlink; 299 getStateAndFaults($db, $thisLabel, $selectedState, "burntool", $str, $anyFaults); 283 300 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 284 301 285 $link = "camProcessedExp_failure.php?pass=" . $pass . "&proj=" . $proj . "&camRun.label=" . $stdsLabel . "&camRun.state=new"; 286 getStateAndFaults($db, $stdsLabel, $selectedState, "cam", $str, $anyFaults); 302 $link = "failedChipProcessedImfile.php?pass=" . $pass . "&proj=" . $proj . "&chipRun.label=" . $thisLabel . "&chipRun.state=new"; 303 getStateAndFaults($db, $thisLabel, $selectedState, "chip", $str, $anyFaults); 304 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 305 306 $link = "failedCamProcessedExp.php?pass=" . $pass . "&proj=" . $proj . "&camRun.label=" . $thisLabel . "&camRun.state=new"; 307 getStateAndFaults($db, $thisLabel, $selectedState, "cam", $str, $anyFaults); 287 308 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 288 309 310 $link = "failedFakeProcessedImfile.php?pass=" . $pass . "&proj=" . $proj . "&fakeRun.label=" . $thisLabel . "&fakeRun.state=new"; 311 getStateAndFaults($db, $thisLabel, $selectedState, "fake", $str, $anyFaults); 312 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 313 314 $link = "failedWarpSkyfiles.php?pass=" . $pass . "&proj=" . $proj . "&warpRun.label=" . $thisLabel . "&warpRun.state=new"; 315 getStateAndFaults($db, $thisLabel, $selectedState, "warp", $str, $anyFaults); 316 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 317 318 $link = "failedStackSkyfile.php?pass=" . $pass . "&proj=" . $proj . "&stackRun.label=" . $thisLabel . "&stackRun.state=new"; 319 getStateAndFaults($db, $thisLabel, $selectedState, "stack", $str, $anyFaults); 320 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 321 322 $link = "failedDiffSkyfile.php?pass=" . $pass . "&proj=" . $proj . "&diffRun.label=" . $thisLabel . "&diffRun.state=new"; 323 getStateAndFaults($db, $thisLabel, $selectedState, "diff", $str, $anyFaults); 324 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 325 289 326 $link = $defaultlink; 290 getStateAndFaults($db, $ stdsLabel, $selectedState, "fake", $str, $anyFaults);327 getStateAndFaults($db, $thisLabel, $selectedState, "magic", $str, $anyFaults); 291 328 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 292 329 293 $link = "warpFailedSkyfiles.php?pass=" . $pass . "&proj=" . $proj . "&warpRun.label=" . $stdsLabel . "&warpRun.state=new"; 294 getStateAndFaults($db, $stdsLabel, $selectedState, "warp", $str, $anyFaults); 295 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 296 297 $link = "stackFailedSkyfile.php?pass=" . $pass . "&proj=" . $proj . "&stackRun.label=" . $stdsLabel . "&stackRun.state=new"; 298 getStateAndFaults($db, $stdsLabel, $selectedState, "stack", $str, $anyFaults); 330 $link = $defaultlink; 331 getStateAndFaults($db, $thisLabel, $selectedState, "magicDS", $str, $anyFaults); 299 332 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 300 333 301 $link = "diffFailedSkyfile.php?pass=" . $pass . "&proj=" . $proj . "&diffRun.label=" . $stdsLabel . "&diffRun.state=new";302 getStateAndFaults($db, $stdsLabel, $selectedState, "diff", $str, $anyFaults);303 write_table_cell($class, '%s', $anyFaults ? $link : "", $str);304 305 334 $link = $defaultlink; 306 getStateAndFaults($db, $ stdsLabel, $selectedState, "magic", $str, $anyFaults);335 getStateAndFaults($db, $thisLabel, $selectedState, "dist", $str, $anyFaults); 307 336 write_table_cell($class, '%s', $anyFaults ? $link : "", $str); 308 337 309 $link = $defaultlink;310 getStateAndFaults($db, $stdsLabel, $selectedState, "magicDS", $str, $anyFaults);311 write_table_cell($class, '%s', $anyFaults ? $link : "", $str);312 313 $link = $defaultlink;314 getStateAndFaults($db, $stdsLabel, $selectedState, "dist", $str, $anyFaults);315 write_table_cell($class, '%s', $anyFaults ? $link : "", $str);316 317 338 echo "</tr>\n"; 318 339 } 319 340 320 if ($selectedLabel == "all_ labels") $link = "";321 else $link = "czartool_labels.php?pass=" . $pass . "&proj=" . $proj . "&label=all_ labels&stage=".$selectedStage;341 if ($selectedLabel == "all_".$server."_labels") $link = ""; 342 else $link = "czartool_labels.php?pass=" . $pass . "&proj=" . $proj . "&label=all_".$server."_labels&stage=".$selectedStage; 322 343 323 344 echo "<tr><td></td>\n"; 324 write_table_cell($class, '%s', $link, "All labels"); 345 write_table_cell($class, '%s', "", " "); 346 write_table_cell($class, '%s', $link, "All $server labels"); 325 347 326 348 echo "</tr>\n"; -
branches/sc_branches/trunkTest/ippMonitor/raw/ipp.imfiles.dat
r28608 r29060 25 25 26 26 menutop | menutop | plain | | 27 menutop | menutop | link | New failed chip | failedChipProcessedImfile.php 28 menutop | menutop | link | New failed cam | failedCamProcessedExp.php 29 menutop | menutop | link | New failed fake | failedFakeProcessedImfile.php 30 menutop | menutop | link | New failed warp | failedWarpSkyfiles.php 31 menutop | menutop | link | New failed stack | failedStackSkyfile.php 32 menutop | menutop | link | New failed diff | failedDiffSkyfile.php 33 menutop | menutop | link | New failed magic tree | failedMagicTrees.php 34 menutop | menutop | link | New failed magic node | failedMagicNodes.php 35 menutop | menutop | link | New failed magic mask | failedMagicMasks.php 36 37 menutop | menutop | plain | | 27 38 menulink | menuselect | link | Tables columns | columns_in_db.php 28 39 menulink | menuselect | link | Clean /tmp directory | cleanTmpDirectory.php 40 menutop | menutop | link | disk usage | diskUsage.php -
branches/sc_branches/trunkTest/ippMonitor/scripts/generate
r28654 r29060 648 648 foreach $word (@words) { 649 649 $fword = &parse_fieldname ($word); 650 #print "field: $word -> $fword\n";650 # print "field: $word -> $fword\n"; 651 651 push @outwords, $fword; 652 652 if ($word =~ m|^\$|) { … … 660 660 $opf{$name} = $outline; 661 661 662 #print "ops: $name : $ops{$name}\n";663 #print "opf: $name : $opf{$name}\n";662 # print "ops: $name : $ops{$name}\n"; 663 # print "opf: $name : $opf{$name}\n"; 664 664 665 665 return 1; -
branches/sc_branches/trunkTest/ippScripts/scripts/addstar_run.pl
r28298 r29060 147 147 148 148 } 149 else { 150 151 $minidvodb_path = $dvodbReal; 152 } 153 149 154 unless ($no_op) { 150 155 print $dvodbReal; -
branches/sc_branches/trunkTest/ippScripts/scripts/automate_stacks.pl
r28916 r29060 46 46 my ( $check_stacks, $queue_stacks, $check_sweetspot, $queue_sweetspot, $check_diffs, $queue_diffs, $clean_old); 47 47 my ( $check_detrends, $queue_detrends, $check_dqstats, $queue_dqstats); 48 my ( $confirm_stacks, $check_confirm_stacks ); 48 49 49 50 GetOptions( … … 70 71 'check_stacks' => \$check_stacks, 71 72 'queue_stacks' => \$queue_stacks, 73 'confirm_stacks' => \$confirm_stacks, 74 'check_confirm_stacks' => \$check_confirm_stacks, 72 75 'check_sweetspot' => \$check_sweetspot, 73 76 'queue_sweetspot' => \$queue_sweetspot, … … 120 123 defined $queue_chips or defined $queue_stacks or $queue_sweetspot or $queue_detrends or $queue_dqstats or 121 124 defined $check_chips or defined $check_stacks or $check_sweetspot or $check_detrends or $check_dqstats or 122 defined $test_mode or defined $clean_old or defined $check_mode; 125 defined $test_mode or defined $clean_old or defined $check_mode or 126 defined $confirm_stacks; 123 127 124 128 # Configurable parameters from our config file. … … 132 136 my %stackable_list = (); 133 137 my %reduction_class = (); 138 my %macro_formats = (); 134 139 my @unrecoverable_quality = (); 135 140 my @detrend_list = (); … … 181 186 elsif (${ $entry }{name} eq 'UNRECOVERABLE_QUALITY') { 182 187 push @unrecoverable_quality, ${ $entry }{value}; 188 } 189 elsif (${ $entry }{name} eq 'MACRO_DEFINITIONS') { 190 my @macro_data = @{ ${ $entry }{value} }; 191 my $this_mode = ''; 192 foreach my $mentry (@macro_data) { 193 if (${ $mentry }{name} eq 'PROC_MODE') { 194 $this_mode = ${ $mentry }{value}; 195 } 196 elsif (${ $mentry }{name} eq 'MACRO') { 197 $macro_formats{$this_mode} = ${ $mentry }{value}; 198 } 199 } 183 200 } 184 201 elsif (${ $entry }{name} eq 'TARGETS') { … … 306 323 print "CLEAN: $z $clean_commands{$z} $clean_retention{$z}\n"; 307 324 } 325 foreach $z (keys (%macro_formats)) { 326 print "MACROS: $z $macro_formats{$z}\n"; 327 } 308 328 309 329 } … … 385 405 $metadata_out{nsState} = 'STACKING_POSSIBLE_ERROR'; 386 406 } 407 return_metadata($date); 408 exit(0); 409 } 410 411 if (defined($check_confirm_stacks) || defined($test_mode) || defined($check_mode)) { 412 $metadata_out{nsState} = 'CONFIRM_STACKING'; 413 &confirm_stacks($date,"pretend"); 414 return_metadata($date); 415 unless (defined($test_mode) || defined($check_mode)) { exit(0); } 416 } 417 if (defined($confirm_stacks)) { 418 $metadata_out{nsState} = 'CONFIRM_STACKING'; 419 &confirm_stacks($date); 387 420 return_metadata($date); 388 421 exit(0); … … 582 615 $metadata_out{btN} = $N - 1; 583 616 $metadata_out{btNCounter} = 0; 584 617 add_to_macro_list('define_burntool',1,$date); 585 618 return(0); 586 619 } … … 589 622 # Chips 590 623 ################################################################################ 624 591 625 592 626 sub construct_chiptool_cmd { … … 680 714 } 681 715 $metadata_out{nsState} = 'TOWARP'; 716 682 717 return(0); 683 718 } … … 696 731 if ($Nexposures == 0) { 697 732 print STDERR "execute_chips: Target $target on $date had no exposures.\n"; 698 next;733 # next; 699 734 } 700 735 if ($Nalready != 0) { 701 736 print STDERR "execute_chips: Not queueing $target on $date due to already existing exposures.\n"; 702 next;737 # next; 703 738 } 704 739 if ($Nimfiles != $Nburntooled) { … … 712 747 chip_queue($date,$target); 713 748 } 749 if (defined($pretend)) { 750 add_to_macro_list('check_chips',$stackable_list{$target},$date,$target); 751 } 752 else { 753 add_to_macro_list('queue_chips',$stackable_list{$target},$date,$target); 754 } 755 714 756 } 715 757 if ($exposures == 0) { … … 717 759 } 718 760 } 761 719 762 720 763 # … … 742 785 my $date = shift; 743 786 744 # my $db = init_gpc_db();745 # my $trunc_date = $date; $trunc_date =~ s/-//g;746 747 # my $where = " label LIKE '%.nightlyscience' AND data_group' ";748 # my $chip_sth = "SELECT * from chipRun WHERE (state = 'full' OR state = 'new' OR state = 'cleaned') AND $where ";749 # my $cam_sth = "SELECT * from camRun WHERE state = 'full' AND $where ";750 751 # my $chip_ref = $db->selectall_arrayref( $chip_sth );752 # my $cam_ref = $db->selectall_arrayref( $cam_sth );753 754 787 my $command = construct_dqstats_cmd($date) . ' -pretend '; 755 788 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = … … 762 795 my @input_exposures = split /\n/, (join '', @$stdout_buf); 763 796 764 return($#input_exposures + 1,1,1); # $#{ $chip_ref } + 1, $#{ $cam_ref } + 1);797 return($#input_exposures + 1,1,1); 765 798 } 766 799 … … 791 824 unless(defined($pretend)) { 792 825 dqstats_queue($date); 826 } 827 if (defined($pretend)) { 828 add_to_macro_list('check_dqstats',1,$date); 829 } 830 else { 831 add_to_macro_list('queue_dqstats',1,$date); 793 832 } 794 833 } … … 887 926 detrend_queue($date,$target); 888 927 } 928 if (defined($pretend)) { 929 add_to_macro_list('check_detrends',1,$date,$target,"dettool"); 930 } 931 else { 932 add_to_macro_list('queue_detrends',1,$date,$target,"dettool"); 933 } 889 934 } 890 935 if ($exposures == 0) { … … 1023 1068 $metadata_out{nsState} = 'SS_DONE'; 1024 1069 sweetspot_queue($date); 1070 } 1071 if (defined($pretend)) { 1072 add_to_macro_list('check_sweetspot',1,$date); 1073 } 1074 else { 1075 add_to_macro_list('queue_sweetspot',1,$date); 1025 1076 } 1026 1077 } … … 1173 1224 stack_queue($date,$target,$filter); 1174 1225 } 1226 if (defined($pretend)) { 1227 add_to_macro_list('check_stacks',$stackable_list{$target},$date,$target,$filter); 1228 } 1229 else { 1230 add_to_macro_list('queue_stacks',$stackable_list{$target},$date,$target,$filter); 1231 } 1175 1232 } 1176 1233 } … … 1181 1238 1182 1239 } 1240 1241 sub post_stack_queue { 1242 my $date = shift; 1243 my $target = shift; 1244 1245 my ($label,$workdir,$obs_mode,$object,$comment,$tess_id,$dist_group,$data_group,$reduction) = get_tool_parameters($date,$target); 1246 # check warp stage == chip stage 1247 my $db = init_gpc_db(); 1248 1249 my $trunc_date = $date; $trunc_date =~ s/-//g; 1250 1251 my $where = " label = '$label' AND data_group = '$data_group' "; 1252 1253 my $stack_full_sth = "SELECT * from stackRun where $where "; 1254 my $stack_done_sth = "SELECT * from stackRun LEFT JOIN stackSumSkyfile USING(stack_id) WHERE $where "; 1255 $stack_done_sth .= " AND ((state = 'full') OR (state = 'new' && fault != 0)) "; 1256 1257 my $stack_full_ref = $db->selectall_arrayref( $stack_full_sth ); 1258 my $stack_done_ref = $db->selectall_arrayref( $stack_done_sth ); 1259 1260 return($#{ $stack_full_ref } + 1, $#{ $stack_done_ref } + 1); 1261 } 1262 1263 sub confirm_stacks { 1264 my $date = shift; 1265 my $pretend = shift; 1266 1267 foreach my $target (@target_list) { 1268 if ($stackable_list{$target} == 1) { 1269 my ($Nstacks, $Nattempted) = post_stack_queue($date,$target); 1270 if ($Nstacks != $Nattempted) { 1271 if ($debug == 1) { 1272 print STDERR "confirm_stacks: Target $target on $date is not done stacking. $Nstacks $Nattempted\n" 1273 } 1274 if ($metadata_out{nsState} eq 'CONFIRM_STACKING') { 1275 $metadata_out{nsState} = 'STACKING'; 1276 } 1277 1278 next; 1279 } 1280 if ($metadata_out{nsState} eq 'CONFIRM_STACKING') { 1281 if (defined($pretend)) { 1282 add_to_macro_list('check_confirm_stacks',$stackable_list{$target},$date,$target); 1283 } 1284 else { 1285 add_to_macro_list('confirm_stacks',$stackable_list{$target},$date,$target); 1286 } 1287 } 1288 } 1289 } 1290 } 1183 1291 1184 1292 # … … 1233 1341 1234 1342 foreach my $mode (@mode_list) { 1235 # if ((exists($clean_alternate{$mode})) && ($clean_alternate{$mode} eq 'A')) { 1236 # my ($cleaning_date,$command) = construct_cleantool_args($date,"",$mode); 1237 # if ($cleaning_date eq 'no clean') { 1238 # next; 1239 # } 1240 # print STDERR "$command\n"; 1241 # if (!(defined($pretend) || $debug == 1)) { 1242 # # print STDERR "BEAR IS DRIVING!?\n"; 1243 # my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 1244 # run ( command => $command, verbose => $verbose ); 1245 # unless ($success) { 1246 # $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 1247 # &my_die("Unable to perform cleantool ($command): $error_code", 0,0,$date, $PS_EXIT_SYS_ERROR); 1248 # } 1249 # } 1250 # } 1251 # else { 1252 foreach my $target (@target_list) { 1253 if (exists($noclean_list{$target})) { 1254 next; 1343 foreach my $target (@target_list) { 1344 if (exists($noclean_list{$target})) { 1345 next; 1346 } 1347 my ($cleaning_date,$command) = construct_cleantool_args($date,$target,$mode); 1348 if ($cleaning_date eq 'no clean') { 1349 next; 1350 } 1351 print STDERR "$command\n"; 1352 if (!(defined($pretend) || $debug == 1)) { 1353 # print STDERR "BEAR IS DRIVING!?\n"; 1354 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 1355 run ( command => $command, verbose => $verbose ); 1356 unless ($success) { 1357 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 1358 &my_die("Unable to perform cleantool ($command): $error_code", 0,0,$date, $PS_EXIT_SYS_ERROR); 1255 1359 } 1256 my ($cleaning_date,$command) = construct_cleantool_args($date,$target,$mode); 1257 if ($cleaning_date eq 'no clean') { 1258 next; 1259 } 1260 print STDERR "$command\n"; 1261 if (!(defined($pretend) || $debug == 1)) { 1262 # print STDERR "BEAR IS DRIVING!?\n"; 1263 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 1264 run ( command => $command, verbose => $verbose ); 1265 unless ($success) { 1266 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 1267 &my_die("Unable to perform cleantool ($command): $error_code", 0,0,$date, $PS_EXIT_SYS_ERROR); 1268 } 1269 } 1270 } 1271 # } 1360 add_to_macro_list('clean_old',1,$date,$target,$mode); 1361 } 1362 } 1272 1363 } 1273 1364 return(0); 1274 1365 } 1275 1276 1277 1278 1366 1279 1367 # … … 1324 1412 my $workdir = 'neb://@HOST@.0/' . $dbname . "/detverify.nt/${workdir_date}/${lc_type}${internal_filter}"; 1325 1413 return($label,$workdir,$det_filter,$exp_type,$det_type,$ref_det_id,$ref_iter,$maxN); 1414 } 1415 1416 sub add_to_macro_list { 1417 my $proc_mode = shift; 1418 my $do_or_do_not = shift; 1419 my $date = shift; 1420 my $target = shift; 1421 my $mode = shift; 1422 1423 if ((defined($macro_formats{$proc_mode}))&&($do_or_do_not)) { 1424 unless (defined($metadata_out{N_MACROS})) { 1425 $metadata_out{N_MACROS} = 0; 1426 } 1427 my $N = $metadata_out{N_MACROS}; 1428 $metadata_out{"ns${N}Macro"} = $macro_formats{$proc_mode}; 1429 print STDERR "WORKING ON A MACRO: ns${N}Macro $proc_mode $macro_formats{$proc_mode}\n"; 1430 if (defined($date)&&(defined($target))) { 1431 1432 my ($label,$workdir,$obs_mode,$object,$comment,$tess_id,$dist_group,$data_group,$reduction) 1433 = get_tool_parameters($date,$target); 1434 $metadata_out{"ns${N}Macro"} =~ s/\@LABEL\@/$label/; 1435 $metadata_out{"ns${N}Macro"} =~ s/\@WORKDIR\@/$workdir/; 1436 $metadata_out{"ns${N}Macro"} =~ s/\@OBS_MODE\@/$obs_mode/; 1437 $metadata_out{"ns${N}Macro"} =~ s/\@OBJECT\@/$object/; 1438 $metadata_out{"ns${N}Macro"} =~ s/\@COMMENT\@/$comment/; 1439 $metadata_out{"ns${N}Macro"} =~ s/\@TESS_ID\@/$tess_id/; 1440 $metadata_out{"ns${N}Macro"} =~ s/\@DIST_GROUP\@/$dist_group/; 1441 $metadata_out{"ns${N}Macro"} =~ s/\@DATA_GROUP\@/$data_group/; 1442 $metadata_out{"ns${N}Macro"} =~ s/\@REDUCTION\@/$reduction/; 1443 } 1444 if (defined($mode)) { 1445 $metadata_out{"ns${N}Macro"} =~ s/\@EXTRA\@/$mode/; 1446 } 1447 if (defined($date)) { 1448 $metadata_out{"ns${N}Macro"} =~ s/\@DATE\@/$date/; 1449 } 1450 $metadata_out{N_MACROS} ++; 1451 } 1326 1452 } 1327 1453 -
branches/sc_branches/trunkTest/ippScripts/scripts/dist_advancerun.pl
r28735 r29060 67 67 my $stacktool = can_run('stacktool') or (warn "Can't find stacktool" and $missing_tools = 1); 68 68 my $bgtool = can_run('bgtool') or (warn "Can't find bgtool" and $missing_tools = 1); 69 my $staticskytool = can_run('staticskytool') or (warn "Can't find staticskytool" and $missing_tools = 1); 69 70 if ($missing_tools) { 70 71 &my_die("Can't find required tools.", $dist_id, $PS_EXIT_CONFIG_ERROR); … … 108 109 $list_mode = "-sumskyfile"; 109 110 $component_key = "skycell_id"; 111 } elsif ($stage eq "sky") { 112 $tool_cmd = "$staticskytool -sky_id"; 113 $list_mode = "-result"; 114 $component_key = ""; 110 115 } elsif ($stage eq "diff") { 111 116 $tool_cmd = "$difftool -diff_id"; -
branches/sc_branches/trunkTest/ippScripts/scripts/dist_bundle.pl
r28942 r29060 53 53 'PPSTACK.OUTPUT.MASK' => 'mask', 54 54 'PPSTACK.OUTPUT.VARIANCE' => 'variance' ); 55 my %sky_cleaned = ( 'PSPHOT.STACK.OUTPUT.IMAGE' => 'image', 56 'PSPHOT.STACK.OUTPUT.MASK' => 'mask', 57 'PSPHOT.STACK.OUTPUT.VARIANCE' => 'variance' ); 55 58 56 59 … … 420 423 } elsif ($stage eq "stack") { 421 424 $type = $stack_cleaned{$rule}; 425 } elsif ($stage eq "sky") { 426 $type = $sky_cleaned{$rule}; 422 427 } else { 423 428 &my_die("$stage is not a valid stage", $component, $PS_EXIT_CONFIG_ERROR); … … 500 505 } elsif ($stage eq "stack") { 501 506 $config_file_rule = "PPSTACK.CONFIG"; 507 } elsif ($stage eq "sky") { 508 $config_file_rule = "PSPHOT.STACK.CONFIG"; 502 509 } else { 503 510 &my_die("$stage is not a valid stage", $component, $PS_EXIT_CONFIG_ERROR); -
branches/sc_branches/trunkTest/ippScripts/scripts/dist_make_fileset.pl
r28536 r29060 223 223 my $dbname = shift; 224 224 225 if (($stage eq 'stack') or ($stage eq 'diff') or ($stage eq 'SSdiff') ) {225 if (($stage eq 'stack') or ($stage eq 'diff') or ($stage eq 'SSdiff') or $stage eq 'sky') { 226 226 return ""; 227 227 } -
branches/sc_branches/trunkTest/ippScripts/scripts/staticsky.pl
r28154 r29060 99 99 my $nInputs = @$files; 100 100 101 my $configuration = $ipprc->filename("PSPHOT.STACK.CONFIG", $outroot); 102 101 103 foreach my $file (@$files) { 102 104 print $listFile "INPUT METADATA\n"; … … 161 163 $command .= " -threads $threads" if defined $threads; 162 164 $command .= " -recipe PSPHOT $recipe_psphot"; 163 #$command .= " -dumpconfig $configuration";165 $command .= " -dumpconfig $configuration"; 164 166 # $command .= " -tracedest $traceDest -log $logDest"; 165 167 # $command .= " -dbname $dbname" if defined $dbname; -
branches/sc_branches/trunkTest/ippTasks/nightly_stacks.pro
r28887 r29060 88 88 active true 89 89 end 90 task ns.stacks.confirm 91 active true 92 end 90 93 end 91 94 … … 155 158 $ns_stackPAGE = 0 156 159 $ns_RstackPAGE = 0 160 $ns_CstackPAGE = 0 157 161 158 162 book init nsData … … 431 435 end 432 436 437 book getword nsData $options:0 nsNmacros -var ns_Nmacros 438 for i 0 $ns_Nmacros 439 sprintf macroName "ns%dMacro" $i 440 book getword nsData $options:0 $macroName -var macroCmd 441 $macroCmd 442 end 443 433 444 if ($VERBOSE > 2) 434 445 book listbook nsData … … 486 497 ipptool2book stdout nsData -uniq -key date 487 498 499 book getword nsData $options:0 nsNmacros -var ns_Nmacros 500 for i 0 $ns_Nmacros 501 sprintf macroName "ns%dMacro" $i 502 book getword nsData $options:0 $macroName -var macroCmd 503 $macroCmd 504 end 505 488 506 if ($VERBOSE > 2) 489 507 book listbook nsData … … 541 559 ipptool2book stdout nsData -uniq -key date 542 560 561 book getword nsData $options:0 nsNmacros -var ns_Nmacros 562 for i 0 $ns_Nmacros 563 sprintf macroName "ns%dMacro" $i 564 book getword nsData $options:0 $macroName -var macroCmd 565 $macroCmd 566 end 567 543 568 if ($VERBOSE > 2) 544 569 book listbook nsData … … 562 587 # Check to see if the warps are finished and so we can make stacks. 563 588 # 589 564 590 task ns.stacks.run 565 591 host local … … 595 621 # We've queued up stacking. We're done with this date, so don't reload the page. 596 622 ipptool2book stdout nsData -uniq -key date 623 624 book getword nsData $options:0 nsNmacros -var ns_Nmacros 625 for i 0 $ns_Nmacros 626 sprintf macroName "ns%dMacro" $i 627 book getword nsData $options:0 $macroName -var macroCmd 628 $macroCmd 629 end 630 631 if ($VERBOSE > 2) 632 book listbook nsData 633 end 634 end 635 636 # locked list 637 task.exit default 638 showcommand failure 639 end 640 task.exit crash 641 showcommand crash 642 end 643 #operation times out? 644 task.exit timeout 645 showcommand timeout 646 end 647 end 648 649 # 650 # Confirm that all the stacks that can be built have been built, or at least attempted. 651 # 652 task ns.stacks.confirm 653 host local 654 periods -poll $LOADPOLL 655 periods -exec $LOADEXEC 656 periods -timeout 120 657 npending 1 658 659 task.exec 660 stdout NULL 661 stderr $LOGDIR/ns.stacks.log 662 663 book getpage nsData $ns_CstackPAGE -var date 664 book getword nsData $date nsState -var ns_STATE 665 book npages nsData -var Npages 666 667 if ($VERBOSE > 5) 668 echo "ns.stacks.confirm: " $ns_CstackPAGE $date $ns_STATE $Npages 669 end 670 671 $ns_CstackPAGE ++ 672 if ($ns_CstackPAGE >= $Npages) set ns_CstackPAGE = 0 673 option $date 674 675 if ("$ns_STATE" != "STACKING") break 676 $run = automate_stacks.pl --confirm_stacks --date $date 677 command $run 678 end 679 # success 680 task.exit 0 681 # convert 'stdout' to book format 682 book delpage nsData $options:0 683 ipptool2book stdout nsData -uniq -key date 684 685 book getword nsData $options:0 nsNmacros -var ns_Nmacros 686 for i 0 $ns_Nmacros 687 sprintf macroName "ns%dMacro" $i 688 book getword nsData $options:0 $macroName -var macroCmd 689 $macroCmd 690 end 691 597 692 if ($VERBOSE > 2) 598 693 book listbook nsData … … 650 745 ipptool2book stdout nsBurntool -uniq -key date 651 746 book setword nsData $options:0 nsState "QUEUEBURNING" 747 748 book getword nsData $options:0 nsNmacros -var ns_Nmacros 749 for i 0 $ns_Nmacros 750 sprintf macroName "ns%dMacro" $i 751 book getword nsData $options:0 $macroName -var macroCmd 752 $macroCmd 753 end 652 754 653 755 if ($VERBOSE > 2) … … 766 868 # Set the job state for success. 767 869 book setword nsBurntool $options:0 $options:2 FINISHED 870 871 book getword nsData $options:0 nsNmacros -var ns_Nmacros 872 for i 0 $ns_Nmacros 873 sprintf macroName "ns%dMacro" $i 874 book getword nsData $options:0 $macroName -var macroCmd 875 $macroCmd 876 end 877 768 878 if ($VERBOSE > 2) 769 879 book listbook nsData -
branches/sc_branches/trunkTest/ippToPsps/perl/checkOdmStatus.pl
r28954 r29060 32 32 } 33 33 if (!defined $singleBatch) { 34 print "* OPTIONAL: a single batch -b (default = none)\n";34 print "* OPTIONAL: a single batch -b <batchNum> (default = none)\n"; 35 35 } 36 36 if (!defined $fromTime) { 37 37 $fromTime = "2010-01-01"; 38 print "* OPTIONAL: from time -f (default = $fromTime)\n";38 print "* OPTIONAL: from time -f <dateTime> (default = $fromTime)\n"; 39 39 } 40 40 if (!defined $toTime) { 41 41 $toTime = "2099-12-31"; 42 print "* OPTIONAL: to time -t (default = $toTime)\n";42 print "* OPTIONAL: to time -t <dateTime> (default = $toTime)\n"; 43 43 } 44 44 if (!defined $verbose) { … … 110 110 111 111 my $response = $ua->post($odmUrl, 112 [batchNameFilter => $batchFilter,112 [batchNameFilter => "%".$batchFilter, 113 113 statusFilter => $statusFilter, 114 114 fromFilter => "2010-01-01", -
branches/sc_branches/trunkTest/ippToPsps/src/ippToPspsBatchDetection.c
r28701 r29060 326 326 fits_write_col(this->fitsOut, TLONG, IMAGEMETA_NDETECT, 1, 1, 1, &numDetectionsOut, &status); 327 327 328 // detections 329 ippToPspsConfig_writeTable(this->config, fitsIn, this->fitsOut, nDet, "Detection", false); 330 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_OBJID, 1, 1, nDet, objID, &status); 331 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_DETECTID, 1, 1, nDet, detectID, &status); 332 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_IPPOBJID, 1, 1, nDet, ippObjID, &status); 333 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_IPPDETECTID, 1, 1, nDet, ippDetectID, &status); 334 fits_write_col(this->fitsOut, TBYTE, DETECTION_FILTERID, 1, 1, nDet, filterIDs, &status); 335 fits_write_col(this->fitsOut, TBYTE, DETECTION_SURVEYID, 1, 1, nDet, surveyIDs, &status); 336 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_IMAGEID, 1, 1, nDet, imageID, &status); 337 fits_write_col(this->fitsOut, TDOUBLE, DETECTION_OBSTIME, 1, 1, nDet, obsTimes, &status); 338 fits_write_col(this->fitsOut, TFLOAT, DETECTION_INSTFLUX, 1, 1, nDet, instFlux, &status); 339 fits_write_col(this->fitsOut, TFLOAT, DETECTION_INSTFLUXERR, 1, 1, nDet, instFluxErr, &status); 340 fits_write_col(this->fitsOut, TFLOAT, DETECTION_PEAKADU, 1, 1, nDet, peakFlux, &status); 341 fits_write_col(this->fitsOut, TSTRING, DETECTION_ASSOCDATE, 1, 1, nDet, assocDate, &status); 342 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_INFOFLAG, 1, 1, nDet, flags, &status); 343 if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status); 344 345 // skinny object 346 ippToPspsConfig_writeTable(this->config, fitsIn, this->fitsOut, nDet, "SkinnyObject", false); 347 fits_write_col(this->fitsOut, TLONGLONG, SKINNYOBJECT_OBJID, 1, 1, nDet, objID, &status); 348 fits_write_col(this->fitsOut, TLONGLONG, SKINNYOBJECT_IPPOBJID, 1, 1, nDet, ippObjID, &status); 349 fits_write_col(this->fitsOut, TBYTE, SKINNYOBJECT_SURVEYID, 1, 1, nDet, surveyIDs, &status); 350 if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status); 351 352 // object calibration color 353 ippToPspsConfig_writeTable(this->config, fitsIn, this->fitsOut, nDet, "ObjectCalColor", false); 354 fits_write_col(this->fitsOut, TLONGLONG, OBJECTCALCOLOR_OBJID, 1, 1, nDet, objID, &status); 355 fits_write_col(this->fitsOut, TLONGLONG, OBJECTCALCOLOR_IPPOBJID, 1, 1, nDet, ippObjID, &status); 356 fits_write_col(this->fitsOut, TBYTE, OBJECTCALCOLOR_FILTERID, 1, 1, nDet, filterIDs, &status); 357 if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status); 328 // avoid writing out an empty table of detections 329 if (numDetectionsOut > 0) { 330 331 // detections 332 ippToPspsConfig_writeTable(this->config, fitsIn, this->fitsOut, nDet, "Detection", false); 333 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_OBJID, 1, 1, nDet, objID, &status); 334 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_DETECTID, 1, 1, nDet, detectID, &status); 335 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_IPPOBJID, 1, 1, nDet, ippObjID, &status); 336 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_IPPDETECTID, 1, 1, nDet, ippDetectID, &status); 337 fits_write_col(this->fitsOut, TBYTE, DETECTION_FILTERID, 1, 1, nDet, filterIDs, &status); 338 fits_write_col(this->fitsOut, TBYTE, DETECTION_SURVEYID, 1, 1, nDet, surveyIDs, &status); 339 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_IMAGEID, 1, 1, nDet, imageID, &status); 340 fits_write_col(this->fitsOut, TDOUBLE, DETECTION_OBSTIME, 1, 1, nDet, obsTimes, &status); 341 fits_write_col(this->fitsOut, TFLOAT, DETECTION_INSTFLUX, 1, 1, nDet, instFlux, &status); 342 fits_write_col(this->fitsOut, TFLOAT, DETECTION_INSTFLUXERR, 1, 1, nDet, instFluxErr, &status); 343 fits_write_col(this->fitsOut, TFLOAT, DETECTION_PEAKADU, 1, 1, nDet, peakFlux, &status); 344 fits_write_col(this->fitsOut, TSTRING, DETECTION_ASSOCDATE, 1, 1, nDet, assocDate, &status); 345 fits_write_col(this->fitsOut, TLONGLONG, DETECTION_INFOFLAG, 1, 1, nDet, flags, &status); 346 if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status); 347 348 // skinny object 349 ippToPspsConfig_writeTable(this->config, fitsIn, this->fitsOut, nDet, "SkinnyObject", false); 350 fits_write_col(this->fitsOut, TLONGLONG, SKINNYOBJECT_OBJID, 1, 1, nDet, objID, &status); 351 fits_write_col(this->fitsOut, TLONGLONG, SKINNYOBJECT_IPPOBJID, 1, 1, nDet, ippObjID, &status); 352 fits_write_col(this->fitsOut, TBYTE, SKINNYOBJECT_SURVEYID, 1, 1, nDet, surveyIDs, &status); 353 if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status); 354 355 // object calibration color 356 ippToPspsConfig_writeTable(this->config, fitsIn, this->fitsOut, nDet, "ObjectCalColor", false); 357 fits_write_col(this->fitsOut, TLONGLONG, OBJECTCALCOLOR_OBJID, 1, 1, nDet, objID, &status); 358 fits_write_col(this->fitsOut, TLONGLONG, OBJECTCALCOLOR_IPPOBJID, 1, 1, nDet, ippObjID, &status); 359 fits_write_col(this->fitsOut, TBYTE, OBJECTCALCOLOR_FILTERID, 1, 1, nDet, filterIDs, &status); 360 if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status); 361 } 358 362 359 363 psLogMsg("ippToPsps", PS_LOG_INFO, -
branches/sc_branches/trunkTest/ippTools/share/Makefile.am
r28941 r29060 153 153 disttool_definebyquery_fake.sql \ 154 154 disttool_definebyquery_raw.sql \ 155 disttool_definebyquery_sky.sql \ 155 156 disttool_definebyquery_stack.sql \ 156 157 disttool_definebyquery_warp.sql \ … … 166 167 disttool_pending_fake.sql \ 167 168 disttool_pending_raw.sql \ 169 disttool_pending_sky.sql \ 168 170 disttool_pending_stack.sql \ 169 171 disttool_pending_warp.sql \ … … 328 330 staticskytool_definebyquery_select.sql \ 329 331 staticskytool_definebyquery_inputs.sql \ 332 staticskytool_export_run.sql \ 333 staticskytool_export_input.sql \ 334 staticskytool_export_result.sql \ 330 335 staticskytool_inputs.sql \ 331 336 staticskytool_todo.sql \ -
branches/sc_branches/trunkTest/ippTools/share/disttool_toadvance.sql
r28733 r29060 240 240 AND distComponent.fault = 0 241 241 UNION 242 -- staticsky stage 243 -- NOTE this assumes that there is only one component per staticskyRun 244 -- (one skycell) 245 SELECT 246 distRun.dist_id, 247 stage, 248 stage_id, 249 outroot, 250 label, 251 clean 252 FROM distRun 253 JOIN staticskyResult on stage_id = sky_id 254 LEFT JOIN distComponent 255 ON distRun.dist_id = distComponent.dist_id 256 WHERE 257 distRun.state = 'new' 258 AND distRun.fault = 0 259 AND distRun.stage = 'sky' 260 AND distComponent.component IS NOT NULL 261 AND distComponent.fault = 0 262 UNION 242 263 -- SSdiff stage 243 264 SELECT -
branches/sc_branches/trunkTest/ippTools/share/staticskytool_result.sql
r28091 r29060 1 SELECT 1 SELECT DISTINCT 2 2 staticskyResult.*, 3 3 staticskyRun.state, 4 staticskyRun.tess_id,5 staticskyRun.skycell_id,6 staticskyRun.filter,7 4 staticskyRun.workdir, 8 5 staticskyRun.label, 6 stackRun.tess_id, 7 stackRun.skycell_id, 8 stackRun.filter 9 9 FROM staticskyRun 10 JOIN staticskyResult 11 USING(stack_id) 10 JOIN staticskyResult USING(sky_id) 11 JOIN staticskyInput USING(sky_id) 12 JOIN stackRun using(stack_id) -
branches/sc_branches/trunkTest/ippTools/src/disttool.c
r28938 r29060 329 329 // stack stage doesn't require magic 330 330 no_magic = true; 331 } else if (!strcmp(stage, "sky")) { 332 magicRunType = "staticskyRun"; 333 query = pxDataGet("disttool_definebyquery_sky.sql"); 334 if (!query) { 335 psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement"); 336 psFree(where); 337 return false; 338 } 339 340 if (label) { 341 psStringAppend(&query, " AND (staticskyRun.label = '%s')", label); 342 } 343 if (dist_group) { 344 psStringAppend(&query, " AND (sticskyRun.dist_group = '%s')", dist_group); 345 } 346 // (static)sky stage doesn't require magic 347 no_magic = true; 331 348 } else if (!strcmp(stage, "SSdiff")) { 332 349 magicRunType = "diffRun"; -
branches/sc_branches/trunkTest/ippTools/src/staticskytool.c
r28154 r29060 727 727 bool exportrunMode(pxConfig *config) 728 728 { 729 # if (0)730 729 typedef struct ExportTable { 731 730 char tableName[80]; … … 737 736 PS_ASSERT_PTR_NON_NULL(config, NULL); 738 737 739 PXOPT_LOOKUP_S64(det_id, config->args, "-s tack_id", true, false);738 PXOPT_LOOKUP_S64(det_id, config->args, "-sky_id", true, false); 740 739 PXOPT_LOOKUP_STR(outfile, config->args, "-outfile", true, false); 741 740 PXOPT_LOOKUP_BOOL(clean, config->args, "-clean", false); … … 753 752 } 754 753 psMetadata *where = psMetadataAlloc(); 755 PXOPT_COPY_S64(config->args, where, "-s tack_id", "stack_id", "==");754 PXOPT_COPY_S64(config->args, where, "-sky_id", "sky_id", "=="); 756 755 757 756 ExportTable tables [] = { 758 {"sta ckRun", "staticskytool_export_run.sql"},759 {"sta ckInputSkyfile", "staticskytool_export_input_skyfile.sql"},760 {"sta ckSumSkyfile", "staticskytool_export_sum_skyfile.sql"},757 {"staticskyRun", "staticskytool_export_run.sql"}, 758 {"staticskyInput", "staticskytool_export_input.sql"}, 759 {"staticskyResult", "staticskytool_export_result.sql"}, 761 760 }; 762 761 … … 800 799 801 800 if (clean) { 802 if (!strcmp(tables[i].tableName, "sta ckRun")) {803 if (!pxSetStateCleaned("sta ckRun", "state", output)) {801 if (!strcmp(tables[i].tableName, "staticskyRun")) { 802 if (!pxSetStateCleaned("staticskyRun", "state", output)) { 804 803 psFree(output); 805 804 psError(PS_ERR_UNKNOWN, false, "pxSetStateClean failed for table %s", tables[i].tableName); … … 821 820 fclose (f); 822 821 823 # endif824 822 return true; 825 823 } -
branches/sc_branches/trunkTest/ippconfig/gpc1/ppMerge.config
r28596 r29060 60 60 # END 61 61 62 # DARK.ORDINATES METADATA 63 # TEMP METADATA 64 # ORDER S32 1 65 # RULE STR CHIP.TEMP 66 # END 67 # TEMP2 METADATA 68 # ORDER S32 1 69 # RULE STR CHIP.TEMP * CHIP.TEMP 70 # END 71 # END 72 62 73 # Ordinates for fitting dark current as function of darktime and fpa temp: 63 74 # Counts = C0 + (CT0 + CT1*Temp)*exptime -
branches/sc_branches/trunkTest/ippconfig/recipes
- Property svn:mergeinfo deleted
-
branches/sc_branches/trunkTest/ippconfig/recipes/filerules-split.mdc
r28619 r29060 209 209 PSPHOT.STACK.OUTPUT.VARIANCE OUTPUT {OUTPUT}.{FILE.ID}.wt.fits VARIANCE NONE FPA TRUE NONE 210 210 PSPHOT.STACK.OUTPUT OUTPUT {OUTPUT}.{FILE.ID}.cmf CMF NONE FPA TRUE NONE 211 PSPHOT.STACK.CONFIG OUTPUT {OUTPUT}.psphotStack.mdc TEXT NONE FPA TRUE NONE 211 212 212 213 SOURCE.PLOT.RAW.MOMENTS OUTPUT {OUTPUT}.{CHIP.NAME}.mnt.png KAPA NONE CHIP TRUE NONE -
branches/sc_branches/trunkTest/ippconfig/recipes/fitstypes.mdc
r27417 r29060 107 107 BSCALE F32 0.1 # Disk is stored as 1/10th sec 108 108 BZERO F32 3276.8 # Store unsigned zero as zero 109 # switch to NONE to work around ticket 1411 110 #COMPRESSION STR NONE 109 111 COMPRESSION STR GZIP 110 112 TILE.X S32 0 -
branches/sc_branches/trunkTest/ippconfig/recipes/nightly_science.config
r28914 r29060 37 37 FILTERS STR z.00000 38 38 FILTERS STR y.00000 39 40 UNRECOVERABLE_QUALITY MULTI 41 UNRECOVERABLE_QUALITY S16 4007 42 43 MACRO_DEFINITIONS MULTI 44 #MACRO_DEFINITIONS METADATA 45 # PROC_MODE STR check_chips 46 # MACRO STR echo survey.del.destreak @LABEL@ 47 #END 48 MACRO_DEFINITIONS METADATA 49 PROC_MODE STR queue_chips 50 MACRO STR survey.del.destreak @LABEL@ 51 END 52 MACRO_DEFINITIONS METADATA 53 PROC_MODE STR confirm_stacks 54 MACRO STR survey.add.destreak @LABEL@ /data/ipp053.0/gpc1_destreak 55 END 56 #MACRO_DEFINITIONS METADATA 57 # PROC_MODE STR check_confirm_stacks 58 # MACRO STR echo survey.add.destreak @LABEL@ /data/ipp053.0/gpc1_destreak 59 #END 60 # MACRO_DEFINITIONS METADATA 61 # PROC_MODE STR clean_old 62 # MACRO STR 63 # END 64 # MACRO_DEFINITIONS METADATA 65 # PROC_MODE STR check_registration 66 # MACRO STR 67 # END 68 # MACRO_DEFINITIONS METADATA 69 # PROC_MODE STR define_burntool 70 # MACRO STR 71 # END 72 # MACRO_DEFINITIONS METADATA 73 # PROC_MODE STR queue_burntool 74 # MACRO STR 75 # END 76 # MACRO_DEFINITIONS METADATA 77 # PROC_MODE STR check_stacks 78 # MACRO STR 79 # END 80 # MACRO_DEFINITIONS METADATA 81 # PROC_MODE STR queue_stacks 82 # MACRO STR 83 # END 84 # MACRO_DEFINITIONS METADATA 85 # PROC_MODE STR check_sweetspot 86 # MACRO STR 87 # END 88 # MACRO_DEFINITIONS METADATA 89 # PROC_MODE STR queue_sweetspot 90 # MACRO STR 91 # END 92 # MACRO_DEFINITIONS METADATA 93 # PROC_MODE STR check_dqstats 94 # MACRO STR 95 # END 96 # MACRO_DEFINITIONS METADATA 97 # PROC_MODE STR queue_dqstats 98 # MACRO STR 99 # END 100 # MACRO_DEFINITIONS METADATA 101 # PROC_MODE STR check_detrends 102 # MACRO STR 103 # END 104 # MACRO_DEFINITIONS METADATA 105 # PROC_MODE STR queue_detrends 106 # MACRO STR 107 # END 39 108 40 109 TARGETS MULTI -
branches/sc_branches/trunkTest/ippconfig/recipes/ppSim.config
r28125 r29060 70 70 71 71 GALAXY.LUM F32 -0.8 # Stellar luminosity function slope 72 GALAXY.MAG F32 1 1.0 # Brightest magnitude for fake stars73 GALAXY.DENSITY F32 6.0 # Galaxy density (per square degree) at the brightest magnitude74 75 GALAXY.RMAJOR.MIN F32 2.0 # Minimum semi-major axis for galaxy models72 GALAXY.MAG F32 15.0 # Brightest magnitude for fake stars 73 GALAXY.DENSITY F32 5.0 # Galaxy density (per square degree) at the brightest magnitude 74 75 GALAXY.RMAJOR.MIN F32 5.0 # Minimum semi-major axis for galaxy models 76 76 GALAXY.RMAJOR.MAX F32 10.0 # Maximum semi-major axis for galaxy models 77 77 78 78 GALAXY.ARATIO.MIN F32 1.0 # Minimum axis ratio for galaxy models 79 GALAXY.ARATIO.MAX F32 0. 2# Maximum axis ratio for galaxy models79 GALAXY.ARATIO.MAX F32 0.5 # Maximum axis ratio for galaxy models 80 80 81 81 GALAXY.INDEX.MIN F32 0.25 # Minimum Sersic index for galaxy models 82 GALAXY.INDEX.MAX F32 0.500 # Maximum Sersic index for galaxy models82 GALAXY.INDEX.MAX F32 1.000 # Maximum Sersic index for galaxy models 83 83 84 84 GALAXY.THETA.MIN F32 0.0 # Minimum position angle for galaxy models 85 85 GALAXY.THETA.MAX F32 3.14 # Maximum position angle for galaxy models 86 86 87 GALAXY.GRID BOOL FALSE # Generate a (regular) grid of galaxy models? 88 GALAXY.GRID.DX S32 200 # Spacing between galaxies in grid in x 89 GALAXY.GRID.DY S32 200 # Spacing between galaxies in grid in y 87 GALAXY.GRID BOOL FALSE # Generate a (regular) grid of galaxy models? 88 GALAXY.GRID.DX S32 100 # Spacing between galaxies in grid in x 89 GALAXY.GRID.DY S32 200 # Spacing between galaxies in grid in y 90 GALAXY.GRID.RANDOM BOOL FALSE # randomize shape parameters in grid (or sequence?) 90 91 91 92 GALAXY.MODEL STR PS_MODEL_GAUSS -
branches/sc_branches/trunkTest/ippconfig/recipes/ppSub.config
r28043 r29060 15 15 SYS.ERR F32 0.1 # Relative systematic error in images 16 16 SKY.ERR F32 0.0 # Relative systematic error in images 17 NORM.FRAC F32 0.0 3# Fraction of window for normalisation window17 NORM.FRAC F32 0.01 # Fraction of window for normalisation window 18 18 COVAR.FRAC F32 0.01 # Fraction of kernel to truncate before calculating covariance 19 19 … … 28 28 MASKSTAT.ADVISORY U32 0x080 29 29 30 INPUT.MATCH.RADIUS F32 20.0 31 INPUT.MATCH.MIN.SN F32 10.0 30 32 31 33 LOW.THRESHOLD F32 4.0 # Mask pixels below this threshold (std dev) … … 57 59 INNER S32 5 # Inner half-size for SPAM and FRIES kernels 58 60 RINGS.ORDER S32 2 # Polynomial order for RINGS kernels 59 PENALTY F32 1 .0 # Penalty for wideness61 PENALTY F32 16.0 # Penalty for wideness 60 62 BIN1 S32 4 # Binning factor for first level 61 63 BIN2 S32 4 # Binning factor for second level -
branches/sc_branches/trunkTest/ippconfig/recipes/psphot.config
r28422 r29060 90 90 91 91 PSF_FIT_ITER S32 50 # Maximum number of fitting iterations for PSF 92 PSF_FIT_TOL F32 0.01 # Fit tolerance for PSF 92 PSF_FIT_MIN_TOL F32 0.01 # Fit tolerance for PSF 93 PSF_FIT_MAX_TOL F32 2.00 # Fit tolerance for PSF 94 95 PSF_FIT_MIN_VALID_FLUX F32 -100000000.0 # minimum allow flux for fitted source 96 PSF_FIT_MAX_VALID_FLUX F32 +100000000.0 # maximum allow flux for fitted source 97 98 # the following is used to require a minimum quality of fit before 99 # stopping based on the tolerance. be careful of using this in 100 # conjunction with non-poisson errors (POISSON.ERRORS.LMM) or with 101 # pooly determined errors 102 PSF_FIT_MAX_CHISQ F32 20.00 # require chisq / DOF to reach this level before giving up 93 103 94 104 # PSF model parameters : choose the PSF model … … 113 123 PSF.FAKE.ALLOW BOOL FALSE # Allow use of fake PSFs when having trouble? 114 124 125 PSF_FIT_RADIUS F32 15.0 # XXX this is now autoscaled 115 126 PSF_REF_RADIUS F32 25.0 # aperture magnitudes are scaled via 116 127 # curve-of-growth to this radius … … 138 149 139 150 # this model is used for approximate subtraction in the main object analysis step 140 EXT_MODEL STR PS_MODEL_ QGAUSS151 EXT_MODEL STR PS_MODEL_SERSIC 141 152 EXT_FIT_NSIGMA F32 1 # significance for pixel included in fit 142 153 EXT_FIT_PADDING F32 5 # extra annulus to use for fit … … 145 156 146 157 EXT_FIT_ITER S32 20 # Maximum number of fitting iterations for EXT 147 EXT_FIT_TOL F32 0.01 # Fit tolerance for EXT 158 EXT_FIT_MIN_TOL F32 0.01 # Fit tolerance for EXT 159 EXT_FIT_MAX_TOL F32 2.00 # Fit tolerance for EXT 160 161 # the following is used to require a minimum quality of fit before 162 # stopping based on the tolerance. be careful of using this in 163 # conjunction with non-poisson errors (POISSON.ERRORS.LMM) or with 164 # pooly determined errors 165 EXT_FIT_MAX_CHISQ F32 20.00 # require chisq / DOF to reach this level before giving up 148 166 149 167 # extended source aperture-like measurements … … 170 188 #PGAUSS_PSF EXTENDED_SOURCE_MODEL PS_MODEL_PGAUSS 20.0 TRUE 171 189 #QGAUSS_PSF EXTENDED_SOURCE_MODEL PS_MODEL_QGAUSS 20.0 TRUE 172 SERSIC_PSF EXTENDED_SOURCE_MODEL PS_MODEL_SERSIC 20.0 TRUE 190 EXP_PCM EXTENDED_SOURCE_MODEL PS_MODEL_EXP 20.0 TRUE 191 DEV_PCM EXTENDED_SOURCE_MODEL PS_MODEL_DEV 20.0 TRUE 192 SER_PCM EXTENDED_SOURCE_MODEL PS_MODEL_SERSIC 20.0 TRUE 173 193 END 174 194 … … 224 244 PCM_BOX_SIZE S32 8 225 245 226 NOISE.FACTOR F32 5.0246 NOISE.FACTOR F32 10.0 227 247 NOISE.SIZE F32 2.0 228 248 … … 307 327 # Extended source fit parameters 308 328 STACKPHOT METADATA 329 EXTENDED_SOURCE_FITS BOOL TRUE # perform any of the aperture-like measurements? 309 330 EXTENDED_SOURCE_ANALYSIS BOOL TRUE # perform any of the aperture-like measurements? 310 331 EXTENDED_SOURCE_SN_LIM F32 20.0 311 332 EXTENDED_SOURCE_PETROSIAN BOOL TRUE 312 EXTENDED_SOURCE_ISOPHOTAL BOOL FALSE313 333 EXTENDED_SOURCE_ANNULI BOOL TRUE 314 EXTENDED_SOURCE_KRON BOOL FALSE315 334 PSPHOT.STACK.MATCH.PSF.SOURCE STR AUTO # which inputs to convolve? (RAW, CNV, AUTO) 316 335 PSPHOT.STACK.TARGET.PSF.AUTO BOOL F # automatically determine target PSF size? … … 319 338 RADIAL_APERTURES_SN_LIM F32 0.0 # S/N limit for radial aperture calculation 320 339 OUTPUT.FORMAT STR PS1_SV1 340 341 EXT_FIT_MAX_RADIUS F32 50.0 342 PSF_MODEL STR PS_MODEL_GAUSS 343 EXT_MODEL STR PS_MODEL_SERSIC 321 344 END 322 345 … … 343 366 DIFF_STATS BOOL TRUE # Calculate diff-specific stats 344 367 OUTPUT.FORMAT STR PS1_DV1 # Format of output file 345 346 368 END 347 369 -
branches/sc_branches/trunkTest/ippconfig/simtest/format.config
r27231 r29060 69 69 CELL.X0 S32 0 70 70 CELL.Y0 S32 0 71 CELL.XSIZE S32 10 2472 CELL.YSIZE S32 10 2471 CELL.XSIZE S32 1000 72 CELL.YSIZE S32 1000 73 73 CELL.XWINDOW S32 0 74 74 CELL.YWINDOW S32 0 -
branches/sc_branches/trunkTest/ppSim/src/ppSimArguments.c
r24807 r29060 55 55 psMetadataAddStr(arguments, PS_LIST_TAIL, "-galmodel", 0, "Type of Galaxy model", NULL); 56 56 psMetadataAddS32(arguments, PS_LIST_TAIL, "-bin", 0, "Binning in x and y", 1); 57 psMetadataAddS32(arguments, PS_LIST_TAIL, "-nx", 0, "cell x-size in pixels", 0); 58 psMetadataAddS32(arguments, PS_LIST_TAIL, "-ny", 0, "cell y-size in pixels", 0); 57 59 psMetadataAddBool(arguments, PS_LIST_TAIL, "+photom", 0, "Perform photometry on fake sources", false); 58 60 … … 197 199 ppSimArgToRecipeS32(&status, options, "BINNING", arguments, "-bin"); 198 200 201 ppSimArgToRecipeS32(&status, config->arguments, "NX.CELL", arguments, "-nx"); 202 ppSimArgToRecipeS32(&status, config->arguments, "NY.CELL", arguments, "-ny"); 203 199 204 if (type == PPSIM_TYPE_OBJECT) { 200 205 // Load values required for adding stars -
branches/sc_branches/trunkTest/ppSim/src/ppSimCreate.c
r27989 r29060 26 26 } 27 27 28 assert (config->camera); 29 30 // int nx = psMetadataLookupS32 (&status, config->arguments, "NX.CELL"); 31 // if (nx) { 32 // psMetadata *defaults = psMetadataLookupPtr(&status, config->camera, "DEFAULTS"); 33 // psMetadataLookupS32 (&status, defaults, "CELL.XSIZE"); 34 // psAssert (status, "CELL.XSIZE should be in DEFAULTS"); 35 // psMetadataAddF32(defaults, PS_LIST_TAIL, "CELL.XSIZE", PS_META_REPLACE, "", nx); 36 // } 37 // int ny = psMetadataLookupS32 (&status, config->arguments, "NY.CELL"); 38 // if (ny) { 39 // psMetadata *defaults = psMetadataLookupPtr(&status, config->camera, "DEFAULTS"); 40 // psMetadataLookupS32 (&status, defaults, "CELL.YSIZE"); 41 // psAssert (status, "CELL.YSIZE should be in DEFAULTS"); 42 // psMetadataAddF32(defaults, PS_LIST_TAIL, "CELL.YSIZE", PS_META_REPLACE, "", ny); 43 // } 44 28 45 // generate the fpa structure used by the output camera (determined from INPUT or specified) 29 assert (config->camera);30 46 fpa = pmFPAConstruct(config->camera, config->cameraName); // FPA to contain the observation 31 47 if (!fpa) { -
branches/sc_branches/trunkTest/ppSim/src/ppSimInsertGalaxies.c
r27657 r29060 1 1 # include "ppSim.h" 2 2 static char *defaultModel = "PS_MODEL_SERSIC"; 3 4 float imageSum (psImage *image) { 5 float sum = 0.0; 6 for (int iy = 0; iy < image->numRows; iy++) { 7 for (int ix = 0; ix < image->numCols; ix++) { 8 sum += image->data.F32[iy][ix]; 9 } 10 } 11 return sum; 12 } 3 13 4 14 bool ppSimInsertGalaxies (pmReadout *readout, psImage *expCorr, psArray *galaxies, pmConfig *config) { … … 84 94 psArray *sources = sources = detections->allSources; 85 95 96 // output filename 97 char outname[1024]; 98 char *outroot = psMetadataLookupStr(&mdok, config->arguments, "OUTPUT"); 99 sprintf (outname, "%s.dat", outroot); 100 101 FILE *outfile = fopen (outname, "a"); 102 86 103 // add sources to the readout image & weight 87 104 for (long i = 0; i < galaxies->n; i++) { … … 131 148 132 149 // XXX let the flux limit be a user-defined number of sky sigmas (not just 1.0) 133 float radius = model->modelRadius (model->params, roughNoise);150 float radius = model->modelRadius (model->params, 0.1*roughNoise); 134 151 radius = PS_MAX (radius, 1.0); 135 152 // XXX the exp(-r^0.25) models can go way out if allowed... 136 radius = PS_MIN (radius, 150.0);153 radius = PS_MIN (radius, 300.0); 137 154 138 155 // construct a source, with model flux pixels set, based on the model 139 156 pmSource *source = pmSourceFromModel (model, readout, radius, PM_SOURCE_TYPE_EXTENDED); 157 158 galaxy->flux = model->modelFlux (model->params); 140 159 141 160 // XXX set the mag & err values (should this be done in pmSourceFromModel?) … … 145 164 source->errMag = sqrt(Area*PS_SQR(roughNoise) + galaxy->flux) / galaxy->flux; 146 165 147 // XXX add the sources to a source array 166 // insert the source flux in the image 167 float sum1 = imageSum(source->pixels); 168 pmSourceAddWithOffset (source, PM_MODEL_OP_FULL, 0xff, dX, dY); 169 float sum2 = imageSum(source->pixels); 170 float flux = sum2 - sum1; 148 171 149 # if (0) 150 if (CONVOLVED_FIT) { 172 // fprintf (stderr, "flux: %f, sum1: %f, sum2: %f, flux2: %f, dflux: %f\n", galaxy->flux, sum1, sum2, sum2 - sum1, galaxy->flux - sum2 + sum1); 151 173 152 // select the PSF (XXX : move out of loop) 153 pmPSF *psfModel = psMetadataLookupPtr (&mdok, chip->analysis, "PSPHOT.PSF"); 154 assert (psf); 155 156 // supply the psf to the source (normalized?) 157 source->modelPSF = pmModelFromPSFforXY (psfModel, xChip, yChip, 1.0); 174 float par8 = (model->params->n == 8) ? model->params->data.F32[7] : 0.0; 175 fprintf (outfile, "%8.3f %8.3f %10.2f %2d %7.3f %5.3f %5.3f %5.3f %5.3f %5.3f\n", galaxy->x, galaxy->y, flux, 1, source->psfMag, source->errMag, axes.major, axes.minor, axes.theta, par8); 158 176 159 // instantiate the psf flux160 pmSourceCachePSF (source, maskVal);161 162 // convert the cached cached psf model for this source to a psKernel163 // XXX for the moment, hard-wire the kernel to be 5x5 (2 pix radius)164 // XXX for the moment, hard-wire the kernel to be 9x9 (4 pix radius)165 psKernel *psf = psphotKernelFromPSF (source, psfSize);166 167 // instantiate the source model flux168 // XXX this may need to handle the offset?169 pmSourceCacheModel (source, maskVal);170 171 // make a storage buffer for the output image172 psImage *buffer = psImageCopy (source->modelFlux, PS_TYPE_F32);173 174 // convolve the psf image with the model image175 psImageConvolveDirect (buffer, source->modelFlux, psf);176 177 // save the result back in the source178 psFree (source->modelFlux);179 source->modelFlux = buffer;180 }181 # endif182 183 // insert the source flux in the image184 pmSourceAddWithOffset (source, PM_MODEL_OP_FULL, 0xff, dX, dY);185 177 psArrayAdd (sources, 100,source); 186 178 } 179 fclose (outfile); 187 180 188 181 // XXX many leaks in here, i think … … 191 184 return true; 192 185 } 193 -
branches/sc_branches/trunkTest/ppSim/src/ppSimInsertStars.c
r28127 r29060 105 105 float flux = star->flux * expCorr->data.F32[(int)yCell][(int)xCell]; 106 106 107 // if psfConvolve is TRUE, we will (elsewhere) convolve the image we a PSF108 // in this case, simply place delta functions in the image109 if (psfConvolve) {110 readout->image->data.F32[(int)(yCell)][(int)(xCell)] += flux;111 continue;112 }113 114 107 // instantiate a model for the PSF at this location, set desired flux 115 108 pmModel *model = pmModelFromPSFforXY (psf, xChip, yChip, 1.0); … … 125 118 // XXX i should be applying the gain and the correct effective area 126 119 psEllipseAxes axes = pmPSF_ModelToAxes (model->params->data.F32, 20.0); 127 psF64Area = 2.0 * M_PI * axes.major * axes.minor;120 float Area = 2.0 * M_PI * axes.major * axes.minor; 128 121 129 // this value is the pure (input) flux, and is saved in the output source cmf files130 122 source->psfMag = -2.5*log10(star->flux); 131 123 source->errMag = sqrt(Area*PS_SQR(roughNoise) + flux) / flux; 124 125 // set the expected model errors 126 model->dparams->data.F32[PM_PAR_I0] = source->errMag * model->params->data.F32[PM_PAR_I0]; 132 127 133 fprintf (outfile, "%8.3f %8.3f %10.2f %7.3f %5.3f\n", star->x, star->y, star->flux, source->psfMag, source->errMag); 128 float par8 = (model->params->n == 8) ? model->params->data.F32[7] : 0.0; 129 fprintf (outfile, "%8.3f %8.3f %10.2f %2d %7.3f %5.3f %5.3f %5.3f %5.3f %5.3f\n", star->x, star->y, star->flux, 0, source->psfMag, source->errMag, axes.major, axes.minor, axes.theta, par8); 134 130 135 // insert the source flux in the image 136 pmSourceAddWithOffset (source, PM_MODEL_OP_FULL, 0xff, dX, dY); 137 138 // insert the source flux in the noise image 139 pmSourceAddWithOffset (source, PM_MODEL_OP_FULL | PM_MODEL_OP_NOISE, 0xff, dX, dY); 140 141 // Blow away the image parts of the source, which makes the memory explode 142 RESET(source->pixels); 143 RESET(source->variance); 144 RESET(source->maskObj); 145 RESET(source->maskView); 146 RESET(source->modelFlux); 147 RESET(source->psfImage); 148 RESET(source->blends); 131 // if psfConvolve is TRUE, we will (elsewhere) convolve the image we a PSF 132 // in this case, simply place delta functions in the image 133 if (psfConvolve) { 134 readout->image->data.F32[(int)(yCell)][(int)(xCell)] += flux; 135 } else { 136 // insert the source flux in the image 137 pmSourceAddWithOffset (source, PM_MODEL_OP_FULL, 0xff, dX, dY); 138 139 // insert the source flux in the noise image 140 pmSourceAddWithOffset (source, PM_MODEL_OP_FULL | PM_MODEL_OP_NOISE, 0xff, dX, dY); 141 142 // Blow away the image parts of the source, which makes the memory explode 143 RESET(source->pixels); 144 RESET(source->variance); 145 RESET(source->maskObj); 146 RESET(source->maskView); 147 RESET(source->modelFlux); 148 RESET(source->psfImage); 149 RESET(source->blends); 150 } 149 151 150 152 // add the sources to the source array -
branches/sc_branches/trunkTest/ppSim/src/ppSimMakeGalaxies.c
r18011 r29060 18 18 int galaxyGridDX = psMetadataLookupS32(&mdok, recipe, "GALAXY.GRID.DX"); // Density of fakes 19 19 int galaxyGridDY = psMetadataLookupS32(&mdok, recipe, "GALAXY.GRID.DY"); // Density of fakes 20 bool galaxyGridRandom = psMetadataLookupBool(&mdok, recipe, "GALAXY.GRID.RANDOM"); // Density of fakes 20 21 21 22 float galaxyRmajorMax = psMetadataLookupF32(&mdok, recipe, "GALAXY.RMAJOR.MAX"); // Density of fakes … … 43 44 44 45 if (galaxyDensity <= 0) return true; 46 47 if (galaxyGridRandom) { 48 long A, B; 49 A = time(NULL); 50 for (B = 0; A == time(NULL); B++); 51 srand48(B); 52 } 45 53 46 54 // Size of FPA … … 81 89 psLogMsg("ppSim", PS_LOG_INFO, "Adding grid of %ld galaxies\n", num); 82 90 83 float galaxyIndexSlope = (galaxyIndexMax - galaxyIndexMin) / num;84 float galaxyThetaSlope = (galaxyThetaMax - galaxyThetaMin) / num;85 float galaxyARatioSlope = (galaxyARatioMax - galaxyARatioMin) / num;86 float galaxyRmajorSlope = (galaxyRmajorMax - galaxyRmajorMin) / num;91 float galaxyIndexSlope = (galaxyIndexMax - galaxyIndexMin); 92 float galaxyThetaSlope = (galaxyThetaMax - galaxyThetaMin); 93 float galaxyARatioSlope = (galaxyARatioMax - galaxyARatioMin); 94 float galaxyRmajorSlope = (galaxyRmajorMax - galaxyRmajorMin); 87 95 88 96 int i = 0; … … 96 104 galaxy->y = iy; 97 105 98 galaxy->peak = 20000;106 galaxy->peak = 1000; 99 107 100 galaxy->index = (galaxyIndexMin + i * galaxyIndexSlope); 101 galaxy->Rmaj = (galaxyRmajorMin + i * galaxyRmajorSlope); 102 galaxy->Rmin = (galaxyARatioMin + i * galaxyARatioSlope) * galaxy->Rmaj; 103 galaxy->theta = (galaxyThetaMin + i * galaxyThetaSlope); 108 // galaxyIndex from user should be for function of this form: exp(-r^(1/n)) 109 // galaxy->index = (1/2n) 110 111 float rndValue; 112 113 rndValue = galaxyGridRandom ? drand48() : i / num; 114 float index = (galaxyIndexMin + rndValue * galaxyIndexSlope); 115 galaxy->index = 0.5/index; // factor of 0.5 because the Sersic model creates exp(-z^n), not exp(-r^n) 116 117 rndValue = galaxyGridRandom ? drand48() : i / num; 118 float scale = (galaxyRmajorMin + rndValue * galaxyRmajorSlope); 119 120 // for a sersic model, 121 float bn = 1.9992*index - 0.3271; 122 float fR = 1.0 / (sqrt(2.0) * pow (bn, index)); 123 float Io = exp(bn); 124 125 galaxy->Rmaj = scale; 126 127 rndValue = galaxyGridRandom ? drand48() : i / num; 128 galaxy->Rmin = (galaxyARatioMin + rndValue * galaxyARatioSlope) * galaxy->Rmaj; 129 130 rndValue = galaxyGridRandom ? drand48() : i / num; 131 galaxy->theta = (galaxyThetaMin + rndValue * galaxyThetaSlope); 132 133 // galaxy->peak *= Io; 134 135 if (0) { 136 fprintf (stderr, "Rmaj: %f, scale: %f, index: %f, bn: %f, Ro: %f, Io: %f\n", galaxy->Rmaj, scale, index, bn, fR, Io); 137 } 104 138 105 139 psArrayAdd (galaxies, 100, galaxy); … … 124 158 galaxy->y = psRandomUniform(rng) * ySize; // y position 125 159 126 galaxy->flux = pow ((double)((i + 1) / norm), (double) (1.0 / galaxyLum)); 160 float index = (sqrt(psRandomUniform(rng)) * galaxyIndexSlope + galaxyIndexMin); 161 galaxy->index = 0.5/index; // factor of 0.5 because the Sersic model creates exp(-z^n), not exp(-r^n) 127 162 128 galaxy->index = (psRandomUniform(rng) * galaxyIndexSlope + galaxyIndexMin); 163 float scale = (psRandomUniform(rng) * galaxyRmajorSlope + galaxyRmajorMin); 164 165 // for a sersic model, 166 float bn = 1.9992*index - 0.3271; 167 float fR = 1.0 / (sqrt(2.0) * pow (bn, index)); 168 float Io = exp(bn); 169 170 galaxy->Rmaj = scale; 171 172 galaxy->Rmin = (PS_SQR(psRandomUniform(rng)) * galaxyARatioSlope + galaxyARatioMin) * galaxy->Rmaj; 173 129 174 galaxy->theta = (psRandomUniform(rng) * galaxyThetaSlope + galaxyThetaMin); 130 galaxy->Rmaj = (psRandomUniform(rng) * galaxyRmajorSlope + galaxyRmajorMin);131 galaxy->Rmin = (psRandomUniform(rng) * galaxyARatioSlope + galaxyARatioMin) * galaxy->Rmaj;132 175 176 // the flux is only approximately correct (scaling of the peak is wrong) 177 // elsewhere (ppSimInsertGalaxies.c) we calculate the true galaxy flux 133 178 galaxy->flux = expf((logf(i + 1) - logf(norm)) / galaxyLum); // Peak flux 134 179 galaxy->peak = galaxy->flux / (2.0*M_PI*PS_SQR(seeing)); 135 // galaxy->peak = 5000; 180 181 if (0) { 182 fprintf (stderr, "Rmaj: %f, scale: %f, index: %f, bn: %f, Ro: %f, Io: %f\n", galaxy->Rmaj, scale, index, bn, fR, Io); 183 } 136 184 137 185 psArrayAdd (galaxies, 100, galaxy); -
branches/sc_branches/trunkTest/ppSim/src/ppSimPhotomReadout.c
r27657 r29060 69 69 psArray *fakeSources = psArrayAlloc (injectedSources->n); 70 70 for (int i = 0; i < injectedSources->n; i++) { 71 fakeSources->data[i] = pmSourceCopy (injectedSources->data[i]);71 fakeSources->data[i] = pmSourceCopyData (injectedSources->data[i]); 72 72 } 73 73 -
branches/sc_branches/trunkTest/ppSim/src/ppSimPhotomReadoutFake.c
r27657 r29060 40 40 psArray *fakeSources = psArrayAlloc (injectedSources->n); 41 41 for (int i = 0; i < injectedSources->n; i++) { 42 fakeSources->data[i] = pmSourceCopy (injectedSources->data[i]);42 fakeSources->data[i] = pmSourceCopyData (injectedSources->data[i]); 43 43 } 44 44 … … 47 47 psArray *realSources = psArrayAlloc (realMeasuredSources->n); 48 48 for (int i = 0; i < realMeasuredSources->n; i++) { 49 realSources->data[i] = pmSourceCopy (realMeasuredSources->data[i]);49 realSources->data[i] = pmSourceCopyData (realMeasuredSources->data[i]); 50 50 } 51 51 -
branches/sc_branches/trunkTest/ppSim/src/ppSimPhotomReadoutForce.c
r27657 r29060 46 46 psArray *realSources = psArrayAlloc (realMeasuredSources->n); 47 47 for (int i = 0; i < realMeasuredSources->n; i++) { 48 realSources->data[i] = pmSourceCopy (realMeasuredSources->data[i]);48 realSources->data[i] = pmSourceCopyData (realMeasuredSources->data[i]); 49 49 } 50 50 -
branches/sc_branches/trunkTest/ppSim/src/ppSimSmoothReadout.c
r28125 r29060 7 7 // XXX use these defaults? 8 8 // float minGauss = 0.1; 9 float nSigma = 3.0;9 float nSigma = 4.0; 10 10 float sigma = psMetadataLookupF32(&status, recipe, "SEEING"); // Seeing SIGMA (pixels) 11 11 … … 28 28 // 4*pi*SIGMA_SMTH^2, but for measurements based on apertures comparable to or larger than the 29 29 // smoothing kernel, the effective per-pixel variance is maintained. 30 31 32 // XXX this only allows for Gaussian PSFs. To extend this, we need to convolve with an image 33 // of the PSF model -
branches/sc_branches/trunkTest/ppSub/src/Makefile.am
r28043 r29060 39 39 ppSubDefineOutput.c \ 40 40 ppSubExtras.c \ 41 ppSubFlagNeighbors.c \ 41 42 ppSubMakePSF.c \ 42 43 ppSubMatchPSFs.c \ -
branches/sc_branches/trunkTest/ppSub/src/ppSub.h
r28121 r29060 175 175 ); 176 176 177 bool ppSubFlagNeighbors(pmConfig *config, pmFPAview *view, psArray *sources, bool matchRef); 178 bool ppSubMatchSources (psArray *objects, psArray *sources, float RADIUS, float MIN_SN); 179 bool ppSubSetSourceImageIDs (psArray *sources, int imageID); 180 177 181 ///@} 178 182 #endif -
branches/sc_branches/trunkTest/ppSub/src/ppSubBackground.c
r26982 r29060 67 67 for (int y = 0; y < numRows; y++) { 68 68 for (int x = 0; x < numCols; x++) { 69 // special case 1: NAN the masked pixels 69 70 if (mask && mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] & maskBad) { 70 image->data.F32[y][x] = 0.0; 71 } else { 72 float value = psImageUnbinPixel(x + 0.5, y + 0.5, modelImage, binning); // Background value 73 if (!isfinite(value)) { 74 image->data.F32[y][x] = NAN; 75 mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= maskBad; 76 } else { 77 image->data.F32[y][x] -= value; 78 } 79 } 71 image->data.F32[y][x] = NAN; 72 continue; 73 } 74 // special case 1: NAN & mask pixels without a valid background model 75 float value = psImageUnbinPixel(x + 0.5, y + 0.5, modelImage, binning); // Background value 76 if (!isfinite(value)) { 77 image->data.F32[y][x] = NAN; 78 mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= maskBad; 79 continue; 80 } 81 image->data.F32[y][x] -= value; 80 82 } 81 83 } -
branches/sc_branches/trunkTest/ppSub/src/ppSubLoop.c
r28121 r29060 17 17 #include <pslib.h> 18 18 #include <psmodules.h> 19 #include <psphot.h> 19 20 20 21 #include "ppSub.h" 22 23 bool dumpout(pmConfig *config, char *name) 24 { 25 pmFPAview *view = ppSubViewReadout(); // View to readout 26 pmReadout *out = pmFPAfileThisReadout(config->files, view, "PPSUB.OUTPUT"); 27 psphotSaveImage (NULL, out->image, name); 28 return true; 29 } 30 21 31 22 32 bool ppSubLoop(ppSubData *data) … … 105 115 return false; 106 116 } 117 // dumpout(config, "diff.1.fits"); 107 118 108 119 // Close convolved files … … 111 122 return false; 112 123 } 124 // dumpout(config, "diff.2a.fits"); 113 125 114 126 // Higher order background subtraction using psphot … … 117 129 return false; 118 130 } 131 // dumpout(config, "diff.2b.fits"); 119 132 120 133 // Perform Variance correction (rescale within a modest range) … … 123 136 return false; 124 137 } 138 // dumpout(config, "diff.2c.fits"); 125 139 126 140 if (data->quality) { … … 138 152 return false; 139 153 } 154 // dumpout(config, "diff.3.fits"); 140 155 141 156 if (!ppSubFilesIterateUp(config, PPSUB_FILES_PHOT_SUB)) { … … 157 172 } 158 173 } 174 // dumpout(config, "diff.4.fits"); 159 175 160 176 // generate the binned image used to write the jpeg … … 204 220 } else { 205 221 // Close subtraction files 222 // dumpout(config, "diff.5.fits"); 206 223 if (!ppSubFilesIterateUp(config, PPSUB_FILES_SUB)) { 207 224 psError(PPSUB_ERR_IO, false, "Unable to close subtraction files."); -
branches/sc_branches/trunkTest/ppSub/src/ppSubReadoutPhotometry.c
r26982 r29060 97 97 psAssert (sources, "missing sources?"); 98 98 99 // a likely source of false positives is poor subtractions. this results in 100 // detections in the wings (or cores) of bright(er) stars found in both images. 101 // flag detections based on their distance from the bright(er) input sources. 102 bool matchRef = !strcasecmp(name, "PPSUB.INVERSE"); 103 ppSubFlagNeighbors (config, view, sources, matchRef); 104 99 105 if (data->stats) { 100 106 bool mdok; -
branches/sc_branches/trunkTest/ppSub/src/ppSubReadoutSubtract.c
r28006 r29060 51 51 outRO->variance = (psImage*)psBinaryOp(outRO->variance, minuend->variance, "+", subtrahend->variance); 52 52 53 // NAN the masked pixels in the diff image (pixels masked in A are not yet NAN'ed in B) 54 psImageMaskType maskVal = pmConfigMaskGet("MASK.VALUE", config) | pmConfigMaskGet("BLANK", config); // Bits to mask in inputs 55 for (int iy = 0; iy < outRO->image->numRows; iy++) { 56 for (int ix = 0; ix < outRO->image->numCols; ix++) { 57 if ((outRO->mask->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix] & maskVal) == 0) continue; 58 outRO->image->data.F32[iy][ix] = NAN; 59 } 60 } 61 53 62 // Measure the variance scales 54 63 psStats *varStats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN); // Statistics for variance images 55 64 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator 56 psImageMaskType maskVal = pmConfigMaskGet("MASK.VALUE", config) |57 pmConfigMaskGet("BLANK", config); // Bits to mask in inputs58 65 psImageBackground(varStats, NULL, minuend->variance, minuend->mask, maskVal, rng); 59 66 float minuendVar = varStats->robustMedian; // Mean variance for minuend -
branches/sc_branches/trunkTest/psLib/src/fft/psImageFFT.c
r21183 r29060 23 23 #include <pthread.h> 24 24 25 #include "psAbort.h" 25 26 #include "psAssert.h" 26 27 #include "psError.h" … … 532 533 return out; 533 534 } 535 536 void psKernelFFTFree(psKernelFFT *kernel) { 537 538 if (!kernel->fft) return; 539 540 bool threaded = psThreadPoolSize(); // Are we running threaded? 541 542 FFTW_LOCK; 543 fftwf_free(kernel->fft); 544 FFTW_UNLOCK; 545 546 return; 547 } 548 549 psKernelFFT *psKernelFFTAlloc(const psKernel *input) { 550 551 psKernelFFT *kernel = psAlloc(sizeof(psKernelFFT)); 552 psMemSetDeallocator(kernel, (psFreeFunc)psKernelFFTFree); 553 554 kernel->fft = NULL; 555 556 kernel->xMin = input->xMin; 557 kernel->xMax = input->xMax; 558 kernel->yMin = input->yMin; 559 kernel->yMax = input->yMax; 560 561 kernel->paddedCols = 0; 562 kernel->paddedRows = 0; 563 564 return kernel; 565 } 566 567 // generate the FFTed kernel image appropriate to be used for convolution of the given input image 568 psKernelFFT *psImageConvolveKernelInit(const psImage *in, const psKernel *kernel) 569 { 570 PS_ASSERT_IMAGE_NON_NULL(in, NULL); 571 PS_ASSERT_IMAGE_TYPE(in, PS_TYPE_F32, NULL); 572 PS_ASSERT_KERNEL_NON_NULL(kernel, NULL); 573 574 bool threaded = psThreadPoolSize(); // Are we running threaded? 575 576 int numCols = in->numCols, numRows = in->numRows; // Size of image 577 int xMin = kernel->xMin, xMax = kernel->xMax, yMin = kernel->yMin, yMax = kernel->yMax; // Kernel sizes 578 579 // Need to pad the kernel (and later the input image) to protect from wrap-around effects 580 if (xMax - xMin > numCols || yMax - yMin > numRows) { 581 // Cannot pad the image if the kernel is larger. 582 psError(PS_ERR_BAD_PARAMETER_SIZE, true, 583 _("Kernel cannot extend further than input image size (%dx%d vs %dx%d)."), 584 xMax, yMax, numCols, numRows); 585 return NULL; 586 } 587 588 int paddedCols = numCols + PS_MAX(-xMin, xMax); // Number of columns in padded image 589 int paddedRows = numRows + PS_MAX(-yMin, yMax); // Number of rows in padded image 590 591 #if CONVOLVE_FFT_BINARY_SIZE 592 // Make the size an integer power of two 593 { 594 int twoCols, twoRows; // Size that is a factor of two 595 for (twoCols = 1; twoCols <= paddedCols && twoCols < INT_MAX - 1; twoCols <<= 1); // No action 596 for (twoRows = 1; twoRows <= paddedRows && twoRows < INT_MAX - 1; twoRows <<= 1); // No action 597 if (paddedCols > twoCols || paddedRows > twoRows) { 598 psError(PS_ERR_BAD_PARAMETER_SIZE, true, "Unable to scale size (%dx%d) up to factor of two", 599 paddedCols, paddedRows); 600 return NULL; 601 } 602 paddedCols = twoCols; 603 paddedRows = twoRows; 604 } 605 #endif 606 607 int numPadded = paddedCols * paddedRows; // Number of pixels in padded image 608 609 // Create data array containing the padded kernel 610 FFTW_LOCK; 611 psF32 *data = fftwf_malloc(numPadded * PSELEMTYPE_SIZEOF(PS_TYPE_F32)); // Data for FFTW 612 FFTW_UNLOCK; 613 614 // Generate the padded kernel image. We could generate the padded kernel image using 615 // memcpy, but by going pixel by pixel we can apply the normalisation that corrects for the 616 // FFT renormalisation. By applying it to the kernel here, we save applying it to the 617 // output image(s). 618 619 // copy kernel into data array 620 psF32 *dataPtr = data; // Pointer into FFTW data 621 float norm = 1.0 / (float)(paddedRows * paddedCols); // Normalisation to correct for FFT 622 623 int xNegMin = PS_MIN(-1, xMin), xNegMax = PS_MIN(-1, xMax); // Min and max for x when negative 624 int xPosMin = PS_MAX(0, xMin), xPosMax = PS_MAX(0, xMax); // Min and max for x when positive 625 int yNegMin = PS_MIN(-1, yMin), yNegMax = PS_MIN(-1, yMax); // Min and max for x when negative 626 int yPosMin = PS_MAX(0, yMin), yPosMax = PS_MAX(0, yMax); // Min and max for x when positive 627 int blankCols = xNegMin + paddedCols - xPosMax - 1; // Number of columns between kernel extrema 628 int blankRows = (yNegMin + paddedRows - yPosMax - 1) * paddedCols; // Rows between kernel extrema 629 size_t blankColBytes = blankCols * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes in blankCols 630 for (int y = yPosMin; y <= yPosMax; y++) { 631 // y is positive 632 for (int x = xPosMin; x <= xPosMax; x++, dataPtr++) { 633 // x is positive 634 *dataPtr = kernel->kernel[y][x] * norm; 635 } 636 // Columns between kernel extrema 637 memset(dataPtr, 0, blankColBytes); 638 dataPtr += blankCols; 639 for (int x = xNegMin; x <= xNegMax; x++, dataPtr++) { 640 // x is negative 641 *dataPtr = kernel->kernel[y][x] * norm; 642 } 643 } 644 // Rows between kernel extrema 645 memset(dataPtr, 0, blankRows * PSELEMTYPE_SIZEOF(PS_TYPE_F32)); 646 dataPtr += blankRows; 647 for (int y = yNegMin; y <= yNegMax; y++) { 648 // y is negative 649 for (int x = xPosMin; x <= xPosMax; x++, dataPtr++) { 650 // x is positive 651 *dataPtr = kernel->kernel[y][x] * norm; 652 } 653 // Columns between kernel extrema 654 memset(dataPtr, 0, blankColBytes); 655 dataPtr += blankCols; 656 for (int x = xNegMin; x <= xNegMax; x++, dataPtr++) { 657 // x is negative 658 *dataPtr = kernel->kernel[y][x] * norm; 659 } 660 } 661 662 #if 0 663 { 664 // Use this for inspecting the result of copying the kernel 665 psImage *test = psImageAlloc(paddedCols, paddedRows, PS_TYPE_F32); 666 psFree(test->p_rawDataBuffer); 667 test->p_rawDataBuffer = data; 668 test->data.V[0] = test->p_rawDataBuffer; 669 for (int y = 1; y < paddedRows; y++) { 670 test->data.V[y] = (psPtr)((int8_t *)test->data.V[y - 1] + paddedCols * PSELEMTYPE_SIZEOF(PS_TYPE_F32)); 671 } 672 // View image here or write to disk 673 test->p_rawDataBuffer = NULL; 674 psFree(test); 675 } 676 #endif 677 678 // Do the forward FFT 679 // Note that the FFT images have different size from the input 680 FFTW_LOCK; 681 fftwf_complex *fft = fftwf_malloc((paddedCols/2 + 1) * paddedRows * sizeof(fftwf_complex)); // FFT 682 FFTW_UNLOCK; 683 684 FFTW_LOCK; 685 fftwf_plan plan = fftwf_plan_dft_r2c_2d(paddedRows, paddedCols, data, fft, FFTW_PLAN_RIGOR); 686 FFTW_UNLOCK; 687 688 fftwf_execute(plan); 689 690 FFTW_LOCK; 691 fftwf_destroy_plan(plan); 692 fftwf_free(data); 693 FFTW_UNLOCK; 694 695 psKernelFFT *output = psKernelFFTAlloc(kernel); 696 output->fft = fft; 697 output->paddedCols = paddedCols; 698 output->paddedRows = paddedRows; 699 700 return output; 701 } 702 703 psImage *psImageConvolveKernel(psImage *out, const psImage *in, const psImage *mask, psImageMaskType maskVal, const psKernelFFT *kernel) 704 { 705 PS_ASSERT_IMAGE_NON_NULL(in, NULL); 706 PS_ASSERT_IMAGE_TYPE(in, PS_TYPE_F32, NULL); 707 PS_ASSERT_PTR_NON_NULL(kernel, NULL); 708 PS_ASSERT_PTR_NON_NULL(kernel->fft, NULL); 709 if (mask) { 710 PS_ASSERT_IMAGE_NON_NULL(mask, NULL); 711 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_IMAGE_MASK, NULL); 712 PS_ASSERT_IMAGES_SIZE_EQUAL(mask, in, NULL); 713 } 714 715 bool threaded = psThreadPoolSize(); // Are we running threaded? 716 717 int numCols = in->numCols, numRows = in->numRows; // Size of image 718 int xMin = kernel->xMin, xMax = kernel->xMax, yMin = kernel->yMin, yMax = kernel->yMax; // Kernel sizes 719 720 // Need to pad the input image to protect from wrap-around effects 721 if (xMax - xMin > numCols || yMax - yMin > numRows) { 722 // Cannot pad the image if the kernel is larger. 723 psError(PS_ERR_BAD_PARAMETER_SIZE, true, _("Kernel cannot extend further than input image size (%dx%d vs %dx%d)."), xMax, yMax, numCols, numRows); 724 return NULL; 725 } 726 727 int paddedCols = numCols + PS_MAX(-xMin, xMax); // Number of columns in padded image 728 int paddedRows = numRows + PS_MAX(-yMin, yMax); // Number of rows in padded image 729 730 #if CONVOLVE_FFT_BINARY_SIZE 731 // Make the size an integer power of two 732 { 733 int twoCols, twoRows; // Size that is a factor of two 734 for (twoCols = 1; twoCols <= paddedCols && twoCols < INT_MAX - 1; twoCols <<= 1); // No action 735 for (twoRows = 1; twoRows <= paddedRows && twoRows < INT_MAX - 1; twoRows <<= 1); // No action 736 if (paddedCols > twoCols || paddedRows > twoRows) { 737 psError(PS_ERR_BAD_PARAMETER_SIZE, true, "Unable to scale size (%dx%d) up to factor of two", 738 paddedCols, paddedRows); 739 return NULL; 740 } 741 paddedCols = twoCols; 742 paddedRows = twoRows; 743 } 744 #endif 745 746 if (paddedCols != kernel->paddedCols) { 747 psAbort(_("Image is inconsistent with allocated kernel")); 748 } 749 if (paddedRows != kernel->paddedRows) { 750 psAbort(_("Image is inconsistent with allocated kernel")); 751 } 752 753 int numPadded = paddedCols * paddedRows; // Number of pixels in padded image 754 755 // Create data array containing the padded image 756 FFTW_LOCK; 757 psF32 *data = fftwf_malloc(numPadded * PSELEMTYPE_SIZEOF(PS_TYPE_F32)); // Data for FFTW 758 FFTW_UNLOCK; 759 psF32 *dataPtr = data; // Pointer into FFTW data 760 psF32 **imageData = in->data.F32; // Pointer into image data 761 762 // Copy image into data array 763 size_t goodBytes = numCols * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes per image row 764 size_t padBytes = (paddedCols - numCols) * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes to pad 765 for (int y = 0; y < numRows; y++, dataPtr += paddedCols, imageData++) { 766 memcpy(dataPtr, *imageData, goodBytes); 767 memset(dataPtr + numCols, 0, padBytes); 768 } 769 memset(dataPtr, 0, (paddedRows - numRows) * paddedCols * PSELEMTYPE_SIZEOF(PS_TYPE_F32)); 770 771 #if 0 772 { 773 // Use this for inspecting the result of copying the image 774 psImage *test = psImageAlloc(paddedCols, paddedRows, PS_TYPE_F32); 775 psFree(test->p_rawDataBuffer); 776 test->p_rawDataBuffer = data; 777 test->data.V[0] = test->p_rawDataBuffer; 778 for (int y = 1; y < paddedRows; y++) { 779 test->data.V[y] = (psPtr)((int8_t *)test->data.V[y - 1] + 780 paddedCols * PSELEMTYPE_SIZEOF(PS_TYPE_F32)); 781 } 782 // View image here 783 test->p_rawDataBuffer = NULL; 784 psFree(test); 785 } 786 #endif 787 788 // Mask bad pixels (which may be NANs), lest they infect everything 789 if (mask && maskVal) { 790 for (int y = 0; y < numRows; y++) { 791 for (int x = 0; x < numCols; x++) { 792 if (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] & maskVal) { 793 data[x + paddedCols * y] = 0; 794 } 795 } 796 } 797 } 798 799 // Do the forward FFT 800 // Note that the FFT images have different size from the input 801 FFTW_LOCK; 802 fftwf_complex *fft = fftwf_malloc((paddedCols/2 + 1) * paddedRows * sizeof(fftwf_complex)); // FFT 803 FFTW_UNLOCK; 804 805 int fftCols = paddedCols/2 + 1, fftRows = paddedRows; // Size of FFT images 806 int fftPixels = fftCols * fftRows; // Number of pixels in FFT image 807 808 FFTW_LOCK; 809 fftwf_plan forward = fftwf_plan_dft_r2c_2d(paddedRows, paddedCols, data, fft, FFTW_PLAN_RIGOR); 810 FFTW_UNLOCK; 811 812 fftwf_execute(forward); 813 814 FFTW_LOCK; 815 fftwf_destroy_plan(forward); 816 FFTW_UNLOCK; 817 818 fftwf_complex *kernelFFT = kernel->fft; 819 820 // Multiply the two transforms 821 for (int i = 0; i < fftPixels; i++) { 822 // (a + bi) * (c + di) = (ac - bd) + (bc + ad)i 823 #if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I) 824 // C99 complex support 825 fft[i] *= kernelFFT[i]; 826 #else 827 // FFTW's backup complex support 828 float imageReal = fft[i][0], imageImag = fft[i][1]; 829 float kernelReal = kernelFFT[i][0], kernelImag = kernelFFT[i][1]; 830 fft[i][0] = imageReal * kernelReal - imageImag * kernelImag; 831 fft[i][1] = imageImag * kernelReal + imageReal * kernelImag; 832 #endif 833 } 834 835 // Do the backward FFT 836 FFTW_LOCK; 837 fftwf_plan backward = fftwf_plan_dft_c2r_2d(paddedRows, paddedCols, fft, data, FFTW_PLAN_RIGOR); 838 FFTW_UNLOCK; 839 840 fftwf_execute(backward); 841 842 FFTW_LOCK; 843 fftwf_destroy_plan(backward); 844 fftwf_free(fft); 845 FFTW_UNLOCK; 846 847 // Copy into the target, without the padding 848 out = psImageRecycle(out, numCols, numRows, PS_TYPE_F32); 849 psF32 **outData = out->data.F32; // Pointer into output 850 dataPtr = data; // Reset to start 851 for (int y = 0; y < numRows; y++, outData++, dataPtr += paddedCols) { 852 memcpy(*outData, dataPtr, goodBytes); 853 } 854 855 FFTW_LOCK; 856 fftwf_free(data); 857 FFTW_UNLOCK; 858 859 return out; 860 } -
branches/sc_branches/trunkTest/psLib/src/fft/psImageFFT.h
r21183 r29060 15 15 #include "psImage.h" 16 16 #include "psImageConvolve.h" 17 18 typedef struct { 19 void *fft; 20 int xMin; ///< Most negative x index 21 int yMin; ///< Most negative y index 22 int xMax; ///< Most positive x index 23 int yMax; ///< Most positive y index 24 int paddedCols; 25 int paddedRows; 26 } psKernelFFT; 17 27 18 28 /// @addtogroup MathOps Mathematical Operations … … 71 81 const psImage *mask, ///< Corresponding mask 72 82 psImageMaskType maskVal, ///< Value to mask 73 const psKernel *kernel ///< kernel to colvolve with 83 const psKernel *kernel ///< kernel to convolve with 84 ); 85 86 /// Allocate an the psKernelFFT structure 87 psKernelFFT *psKernelFFTAlloc( 88 const psKernel *input ///< kernel to convolve with 74 89 ); 90 91 /// Generate an FFT'ed kernel suitable for convolution with the given image 92 psKernelFFT *psImageConvolveKernelInit( 93 const psImage *in, ///< representative image to convolve 94 const psKernel *kernel ///< kernel to convolve with 95 ); 96 97 /// Convolve the given image with the pre-FFT'ed kernel 98 psImage *psImageConvolveKernel( 99 psImage *out, ///< Output image, or NULL 100 const psImage *in, ///< Image to convolve 101 const psImage *mask, ///< Corresponding mask 102 psImageMaskType maskVal, ///< Value to mask 103 const psKernelFFT *kernel ///< kernel to convolve with 104 ); 75 105 76 106 /// @} -
branches/sc_branches/trunkTest/psLib/src/jpeg/psImageJpeg.c
r27145 r29060 7 7 #include <string.h> 8 8 9 #include <kapa.h> 9 10 #include "psMemory.h" 10 11 #include "psImage.h" … … 134 135 return psImageJpegColormapSet (map, "greyscale"); 135 136 } 137 138 // XXX need to fix library references for this (psLib does not depend on libkapa) 139 # if (0) 140 // XXX Add colormap bar with scale (min -> max) 141 // XXX Add option to plot the source overlay (pass in bDrawBuffer populated with points?) 142 // XXX need to update bDraw APIs to pass in/out structure and avoid the local static 143 bool psImageJpegNew(const psImageJpegColormap *map, const psImage *image, const char *filename, 144 float min, float max) 145 { 146 PS_ASSERT_PTR_NON_NULL(map, false); 147 PS_ASSERT_IMAGE_NON_NULL(image, false); 148 PS_ASSERT_IMAGE_TYPE(image, PS_TYPE_F32, false); 149 PS_ASSERT_VECTOR_NON_NULL(map->red, false); 150 PS_ASSERT_VECTOR_NON_NULL(map->green, false); 151 PS_ASSERT_VECTOR_NON_NULL(map->blue, false); 152 PS_ASSERT_PTR_NON_NULL(filename, false); 153 PS_ASSERT_INT_POSITIVE(strlen(filename), false); 154 PS_ASSERT_FLOAT_REAL(min, false); 155 PS_ASSERT_FLOAT_REAL(max, false); 156 157 float zero, scale; 158 struct jpeg_compress_struct cinfo; 159 struct jpeg_error_mgr jerr; 160 161 long pixel; 162 JSAMPLE *jpegLine; // Points to data for current line 163 JSAMPROW jpegLineList[1]; // pointer to JSAMPLE row[s] 164 JSAMPLE *jpegImage; 165 JSAMPLE *outPix; 166 167 /* JPEG init calls */ 168 cinfo.err = jpeg_std_error (&jerr); 169 jpeg_create_compress (&cinfo); 170 171 /* open file, prep for jpeg */ 172 FILE *f = fopen(filename, "w"); 173 if (!f) { 174 psError(PS_ERR_IO, true, "failed to open %s for output\n", filename); 175 return false; 176 } 177 jpeg_stdio_dest(&cinfo, f); 178 179 /* set up color jpeg buffers */ 180 int quality = 75; 181 cinfo.image_width = image->numCols; // image width and height, in pixels 182 cinfo.image_height = image->numRows; 183 cinfo.input_components = 3; 184 cinfo.in_color_space = JCS_RGB; 185 jpeg_set_defaults (&cinfo); 186 jpeg_set_quality (&cinfo, quality, true); // limit to baseline-JPEG values 187 jpeg_start_compress (&cinfo, true); 188 189 psU8 *Rpix = map->red->data.U8; 190 psU8 *Gpix = map->green->data.U8; 191 psU8 *Bpix = map->blue->data.U8; 192 193 if (max == min) { 194 zero = min - 0.1; 195 scale = 256.0/0.2; 196 } else { 197 zero = min; 198 scale = 256.0/(max - min); 199 } 200 201 int dx = image->numCols; 202 int dy = image->numRows; 203 204 // output image buffer and line buffer 205 jpegLine = psAlloc (3*dx*sizeof(JSAMPLE)); 206 jpegImage = psAlloc (3*dx*dy*sizeof(JSAMPLE)); 207 208 // first copy the image data into the output buffer 209 for (int j = 0; j < dy; j++) { 210 psF32 *row = image->data.F32[j]; 211 212 outPix = jpegLine; 213 for (int i = 0; i < dx; i++, outPix += 3) { 214 if (isfinite(row[i])) { 215 pixel = PS_JPEG_SCALEVALUE(row[i],zero,scale); 216 outPix[0] = Rpix[pixel]; 217 outPix[1] = Gpix[pixel]; 218 outPix[2] = Bpix[pixel]; 219 } else { 220 // XXX NAN value should be set per-color map 221 outPix[0] = 0x00; 222 outPix[1] = 0xff; 223 outPix[2] = 0x00; 224 } 225 } 226 memcpy (&jpegImage[j*3*dx], jpegLine, 3*dx); 227 } 228 229 bDrawBuffer *bdbuf = bDrawBufferCreate(dx, dy); 230 bDrawSetBuffer(bdbuf); 231 bDrawColor red = KapaColorByName("red"); 232 bDrawSetStyle (red, 1, 0); 233 bDrawCircle(40.0, 20.0, 3.0); 234 235 { 236 int Npalette; 237 png_color *palette = KapaPNGPalette (&Npalette); 238 bDrawColor white = KapaColorByName ("white"); 239 for (int j = 0; j < dy; j++) { 240 for (int i = 0; i < dx; i++) { 241 bDrawColor color = bdbuf[0].pixels[j][i]; 242 if (color == white) continue; 243 jpegImage[j*3*dx + 3*i + 0] = palette[color].red; 244 jpegImage[j*3*dx + 3*i + 1] = palette[color].green; 245 jpegImage[j*3*dx + 3*i + 2] = palette[color].blue; 246 } 247 } 248 } 249 bDrawBufferFree (bdbuf); 250 251 // write out the image buffer 252 for (int j = 0; j < image->numRows; j++) { 253 jpegLineList[0] = &jpegImage[j*3*dx]; 254 if (jpeg_write_scanlines(&cinfo, jpegLineList, 1) == 0) { 255 psError(PS_ERR_IO, true, "Unable to write line %d to JPEG", j); 256 psFree(jpegLine); 257 psFree(jpegImage); 258 fclose(f); 259 return false; 260 } 261 } 262 263 jpeg_finish_compress(&cinfo); 264 if (fclose(f) == EOF) { 265 psError(PS_ERR_IO, true, "Failed to close %s", filename); 266 psFree(jpegLine); 267 psFree(jpegImage); 268 return false; 269 } 270 jpeg_destroy_compress(&cinfo); 271 272 psFree(jpegLine); 273 psFree(jpegImage); 274 return true; 275 } 276 # endif 136 277 137 278 bool psImageJpeg(const psImageJpegColormap *map, const psImage *image, const char *filename, -
branches/sc_branches/trunkTest/psLib/src/math/psMinimizeLMM.c
r26951 r29060 441 441 } 442 442 443 // number of degrees of freedom for this fit 444 int nDOF = dy->n - params->n; 445 443 446 // calculate initial alpha and beta, set chisq (min->value) 444 447 min->value = psMinLM_SetABX(alpha, beta, params, paramMask, x, y, dy, func); … … 456 459 } 457 460 458 // iterate until the tolerance is reached, or give up 459 while ((min->iter < min->maxIter) && ((min->lastDelta > min->tol) || !isfinite(min->lastDelta))) { 461 // iterate until: (a) nIter = min->iter or (b) (chisq / ndof) < maxChisq and deltaChisq < minTol (but don't stop unless Chisq is finite) 462 bool done = (min->iter >= min->maxIter); 463 while (!done) { 460 464 psTrace("psLib.math", 5, "Iteration number %d. (max iterations is %d).\n", min->iter, min->maxIter); 461 psTrace("psLib.math", 5, "Last delta is %f. Min->tol is %f.\n", min->lastDelta, min->tol);465 psTrace("psLib.math", 5, "Last delta is %f. stop if < %f, accept if < %f\n", min->lastDelta, min->minTol, min->maxTol); 462 466 463 467 // set a new guess for Alpha, Beta, Params 464 468 if (!psMinLM_GuessABP(Alpha, Beta, Params, alpha, beta, params, paramMask, checkLimits, lambda, &dLinear)) { 465 469 min->iter ++; 470 if (min->iter >= min->maxIter) break; 466 471 lambda *= 10.0; 467 472 continue; … … 482 487 if (isnan(Chisq)) { 483 488 min->iter ++; 489 if (min->iter >= min->maxIter) break; 484 490 lambda *= 10.0; 485 491 continue; … … 492 498 psF32 rho = (min->value - Chisq) / dLinear; 493 499 494 psTrace("psLib.math", 5, "last chisq: %f, new chisq %f, delta: %f, dLinear: %f, rho: %f, lambda: %f\n", min->value, 495 Chisq, min->lastDelta, dLinear, rho, lambda); 496 497 psTrace("psLib.math.dLinear", 5, "last chisq: %f, new chisq %f, delta: %f, dLinear: %f, rho: %f, lambda: %f\n", min->value, 498 Chisq, min->lastDelta, dLinear, rho, lambda); 500 psTrace("psLib.math", 5, "last chisq: %f, new chisq %f, delta: %f, dLinear: %f, rho: %f, lambda: %f, nDOF: %d\n", min->value, Chisq, min->lastDelta, dLinear, rho, lambda, nDOF); 501 502 psTrace("psLib.math.dLinear", 5, "last chisq: %f, new chisq %f, delta: %f, dLinear: %f, rho: %f, lambda: %f\n", min->value, Chisq, min->lastDelta, dLinear, rho, lambda); 499 503 500 504 // dump some useful info if trace is defined … … 506 510 /* rho is positive if the new chisq is smaller; allow for some insignificant change (slight negative rho) */ 507 511 if (rho >= -1e-6) { 508 min->lastDelta = (min->value - Chisq) / (dy->n - params->n);512 min->lastDelta = (min->value - Chisq) / nDOF; 509 513 min->value = Chisq; 510 514 alpha = psImageCopy(alpha, Alpha, PS_TYPE_F32); … … 516 520 } 517 521 min->iter++; 522 523 done = (min->iter >= min->maxIter); 524 525 // check for convergence: 526 float chisqDOF = Chisq / nDOF; 527 if (!isfinite(min->maxChisqDOF) || ((chisqDOF < min->maxChisqDOF) && isfinite(min->lastDelta))) { 528 done |= (min->lastDelta < min->minTol); 529 } 518 530 } 519 531 psTrace("psLib.math", 5, "chisq: %f, last delta: %f, Niter: %d\n", min->value, min->lastDelta, min->iter); … … 549 561 psFree(dy); 550 562 } 551 if (min->iter == min->maxIter) { 552 psTrace("psLib.math", 3, "---- end (false) ----\n"); 553 return(false); 554 } 555 psTrace("psLib.math", 3, "---- end (true) ----\n"); 556 return(true); 563 564 // if the last improvement was at least as good as maxTol, accept the fit: 565 if (min->lastDelta <= min->maxTol) { 566 psTrace("psLib.math", 6, "---- end (true) ----\n"); 567 return(true); 568 } 569 psTrace("psLib.math", 6, "---- end (false) ----\n"); 570 return(false); 557 571 } 558 572 … … 588 602 } 589 603 590 psMinimization *psMinimizationAlloc(int maxIter, 591 float tol) 604 psMinimization *psMinimizationAlloc(int maxIter, float minTol, float maxTol) 592 605 { 593 606 PS_ASSERT_INT_NONNEGATIVE(maxIter, NULL); … … 595 608 psMinimization *min = psAlloc(sizeof(psMinimization)); 596 609 psMemSetDeallocator(min, (psFreeFunc)minimizationFree); 610 597 611 P_PSMINIMIZATION_SET_MAXITER(min,maxIter); 598 P_PSMINIMIZATION_SET_TOL(min,tol); 612 P_PSMINIMIZATION_SET_MIN_TOL(min,minTol); 613 P_PSMINIMIZATION_SET_MAX_TOL(min,maxTol); 614 599 615 min->value = 0.0; 600 616 min->iter = 0; 601 617 min->lastDelta = NAN; 618 min->maxChisqDOF = NAN; 602 619 603 620 return(min); -
branches/sc_branches/trunkTest/psLib/src/math/psMinimizeLMM.h
r23486 r29060 33 33 #define PS_MAX_LMM_ITERATIONS 100 34 34 #define PS_MAX_MINIMIZE_ITERATIONS 100 35 #define P_PSMINIMIZATION_SET_MAXITER(m,val) *(int*)&m->maxIter = val 36 #define P_PSMINIMIZATION_SET_TOL(m,val) *(float*)&m->tol = val 35 #define P_PSMINIMIZATION_SET_MAXITER(m,val) { *(int*)&m->maxIter = val; } 36 #define P_PSMINIMIZATION_SET_MIN_TOL(m,val) { *(float*)&m->minTol = val; } 37 #define P_PSMINIMIZATION_SET_MAX_TOL(m,val) { *(float*)&m->maxTol = val; } 37 38 38 39 typedef enum { … … 75 76 typedef struct 76 77 { 77 const int maxIter; ///< Convergence limit 78 const float tol; ///< Error Tolerance 78 const int maxIter; ///< Convergence limit 79 const float minTol; ///< Convergence Tolerance (stop if we reach this value) 80 const float maxTol; ///< Max Tolerance (accept fit if last improvement was this good) 79 81 float value; ///< Value of function at minimum 80 82 int iter; ///< Number of iterations to date 81 83 float lastDelta; ///< The last difference for the fit 84 float maxChisqDOF; ///< for Chisq minimization, require that we reach here before checking tolerance 82 85 } 83 86 psMinimization; … … 102 105 psMinimization *psMinimizationAlloc( 103 106 int maxIter, ///< Number of minimization iterations to perform. 104 float tol ///< Requested error tolerance 107 float minTol, ///< stop if tolerance is less than this 108 float maxTol ///< accept fit if tolerance is less than this 105 109 ) PS_ATTR_MALLOC; 106 110 -
branches/sc_branches/trunkTest/psLib/src/math/psMinimizePowell.c
r28635 r29060 457 457 458 458 mul = bracket->data.F32[1]; 459 if ((fabs(a-b) < min-> tol) && (fabs(b-c) < min->tol)) {459 if ((fabs(a-b) < min->minTol) && (fabs(b-c) < min->minTol)) { 460 460 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, params, mul); 461 461 min->value = func(params, coords); … … 524 524 psTrace("psLib.math", 4, "---- psMinimizePowell() begin ----\n"); 525 525 psTrace("psLib.math", 6, "min->maxIter is %d\n", min->maxIter); 526 psTrace("psLib.math", 6, "min-> tol is %f\n", min->tol);526 psTrace("psLib.math", 6, "min->minTol is %f\n", min->minTol); 527 527 528 528 if (paramMask == NULL) { … … 573 573 for (i=0;i<numDims;i++) { 574 574 if (myParamMask->data.PS_TYPE_VECTOR_MASK_DATA[i] == 0) { 575 575 576 P_PSMINIMIZATION_SET_MAXITER((&dummyMin),PS_MINIMIZE_POWELL_LINEMIN_MAX_ITERATIONS); 576 *(float*)&dummyMin.tol = PS_MINIMIZE_POWELL_LINEMIN_ERROR_TOLERANCE; 577 P_PSMINIMIZATION_SET_MIN_TOL((&dummyMin),PS_MINIMIZE_POWELL_LINEMIN_ERROR_TOLERANCE); 578 577 579 mul = LineMin(&dummyMin, Q, ((psVector *) v->data[i]), 578 580 myParamMask, coords, func); … … 677 679 678 680 // 8: Go to step 3 until the change is less than some tolerance. 679 if (fabs(baseFuncVal - currFuncVal) <= min-> tol) {681 if (fabs(baseFuncVal - currFuncVal) <= min->minTol) { 680 682 psFree(v); 681 683 psFree(pQP); -
branches/sc_branches/trunkTest/psLib/src/math/psStats.c
r27334 r29060 1211 1211 1212 1212 // Fit a Gaussian to the data. 1213 psMinimization *minimizer = psMinimizationAlloc(100, 0.01 ); // The minimizer information1213 psMinimization *minimizer = psMinimizationAlloc(100, 0.01, 1.0); // The minimizer information 1214 1214 psVector *params = psVectorAlloc(2, PS_TYPE_F32); // Parameters for the Gaussian 1215 1215 // Initial guess for the mean (index 0) and var (index 1). -
branches/sc_branches/trunkTest/psLib/test/math/Makefile.am
r24321 r29060 49 49 tap_psMinimizePowell \ 50 50 tap_psSpline1D \ 51 tap_psPolynomialMD 51 tap_psPolynomialMD \ 52 tap_psPolynomialMD_sampleDark 52 53 53 54 # tap_psRandom -
branches/sc_branches/trunkTest/psModules
- Property svn:mergeinfo deleted
-
branches/sc_branches/trunkTest/psModules/src/camera/pmFPAfileIO.c
r28340 r29060 24 24 #include "pmFPAfileFitsIO.h" 25 25 #include "pmFPAfileFringeIO.h" 26 27 #include "pmTrend2D.h" 28 #include "pmResiduals.h" 29 #include "pmGrowthCurve.h" 26 30 #include "pmSpan.h" 31 #include "pmFootprintSpans.h" 27 32 #include "pmFootprint.h" 28 33 #include "pmPeaks.h" 29 34 #include "pmMoments.h" 30 #include "pmResiduals.h" 31 #include "pmGrowthCurve.h" 32 #include "pmTrend2D.h" 35 #include "pmModelFuncs.h" 36 #include "pmModel.h" 37 #include "pmSourceMasks.h" 38 #include "pmSourceExtendedPars.h" 39 #include "pmSourceDiffStats.h" 40 #include "pmSource.h" 41 #include "pmSourceFitModel.h" 33 42 #include "pmPSF.h" 34 #include "pm Model.h"35 #include "pmSource.h" 43 #include "pmPSFtry.h" 44 36 45 #include "pmSourceIO.h" 37 #include "pmResiduals.h"38 46 #include "pmPSF_IO.h" 47 39 48 #include "pmAstrometryModel.h" 40 49 #include "pmAstrometryRefstars.h" -
branches/sc_branches/trunkTest/psModules/src/camera/pmReadoutFake.c
r28405 r29060 10 10 #include "pmFPA.h" 11 11 12 #include "pmMoments.h" 12 13 #include "pmTrend2D.h" 13 14 #include "pmResiduals.h" 14 15 #include "pmGrowthCurve.h" 15 #include "pmTrend2D.h"16 #include "pmPSF.h"17 #include "pmModel.h"18 #include "pmModelClass.h"19 16 #include "pmSpan.h" 17 #include "pmFootprintSpans.h" 20 18 #include "pmFootprint.h" 21 19 #include "pmPeaks.h" 20 #include "pmMoments.h" 21 #include "pmModelFuncs.h" 22 #include "pmModel.h" 23 #include "pmModelUtils.h" 24 #include "pmModelClass.h" 25 #include "pmSourceMasks.h" 26 #include "pmSourceExtendedPars.h" 27 #include "pmSourceDiffStats.h" 22 28 #include "pmSource.h" 23 #include "pmSourceUtils.h" 24 #include "pmModelUtils.h" 29 #include "pmSourceFitModel.h" 30 #include "pmPSF.h" 31 #include "pmPSFtry.h" 32 25 33 #include "pmSourceGroups.h" 26 27 34 #include "pmReadoutFake.h" 28 35 -
branches/sc_branches/trunkTest/psModules/src/camera/pmReadoutFake.h
r26450 r29060 2 2 #define PM_READOUT_FAKE_H 3 3 4 #include <pslib.h>5 #include <pmHDU.h>6 #include <pmFPA.h>7 8 #include <pmMoments.h>9 #include <pmResiduals.h>10 #include <pmGrowthCurve.h>11 #include <pmTrend2D.h>12 #include <pmPSF.h>13 #include <pmSourceMasks.h>4 // #include <pslib.h> 5 // #include <pmHDU.h> 6 // #include <pmFPA.h> 7 // 8 // #include <pmMoments.h> 9 // #include <pmResiduals.h> 10 // #include <pmGrowthCurve.h> 11 // #include <pmTrend2D.h> 12 // #include <pmPSF.h> 13 // #include <pmSourceMasks.h> 14 14 15 15 /// Set threading -
branches/sc_branches/trunkTest/psModules/src/config/pmConfig.c
r28287 r29060 32 32 33 33 #include "pmConfig.h" 34 #include "pmVisualUtils.h" 34 35 35 36 #ifdef HAVE_NEBCLIENT … … 638 639 psArgumentVerbosity(argc, argv); 639 640 // XXX: substitute the string for the default log level for "2". 641 } 642 643 // Set the visualization levels 644 // argument format is: -visual (facil) (level) 645 while ((argNum = psArgumentGet(*argc, argv, "-visual"))) { 646 if ( (*argc < argNum + 3) ) { 647 psError(PS_ERR_IO, true, "-visual switch specified without facility and level."); 648 return NULL; 649 } 650 psArgumentRemove(argNum, argc, argv); 651 pmVisualSetLevel(argv[argNum], atoi(argv[argNum+1])); 652 psArgumentRemove(argNum, argc, argv); 653 psArgumentRemove(argNum, argc, argv); 654 } 655 if ((argNum = psArgumentGet(*argc, argv, "-visual-all"))) { 656 pmVisualSetLevel(".", 10); 657 psArgumentRemove(argNum, argc, argv); 658 } 659 if ((argNum = psArgumentGet(*argc, argv, "-visual-levels"))) { 660 pmVisualPrintLevels(stdout); 661 psArgumentRemove(argNum, argc, argv); 640 662 } 641 663 -
branches/sc_branches/trunkTest/psModules/src/detrend/pmMaskStats.c
r28100 r29060 7 7 8 8 #include <pslib.h> 9 #include <psmodules.h>10 9 11 10 #include "pmHDU.h" … … 16 15 #include "pmFPAAstrometry.h" 17 16 17 #include "pmMaskStats.h" 18 18 19 19 #define ESCAPE { \ -
branches/sc_branches/trunkTest/psModules/src/detrend/pmShutterCorrection.c
r28405 r29060 302 302 PS_ASSERT_PTR_NON_NULL(guess, NULL); 303 303 304 psMinimization *minInfo = psMinimizationAlloc(15, 0.1 ); // Minimization information304 psMinimization *minInfo = psMinimizationAlloc(15, 0.1, 1.0); // Minimization information 305 305 306 306 psVector *params = psVectorAlloc (3, PS_TYPE_F32); // Fitting parameters -
branches/sc_branches/trunkTest/psModules/src/extras/Makefile.am
r27750 r29060 9 9 pmKapaPlots.c \ 10 10 pmVisual.c \ 11 pmVisualUtils.c \ 11 12 ippStages.c 12 13 … … 17 18 pmKapaPlots.h \ 18 19 pmVisual.h \ 20 pmVisualUtils.h \ 19 21 ippDiffMode.h \ 20 22 ippStages.h -
branches/sc_branches/trunkTest/psModules/src/extras/pmVisual.c
r28129 r29060 21 21 #include "pmAstrometryObjects.h" 22 22 #include "pmSubtractionStamps.h" 23 23 24 #include "pmTrend2D.h" 25 #include "pmResiduals.h" 26 #include "pmGrowthCurve.h" 27 #include "pmSpan.h" 28 #include "pmFootprintSpans.h" 29 #include "pmFootprint.h" 30 #include "pmPeaks.h" 31 #include "pmMoments.h" 32 #include "pmModelFuncs.h" 33 #include "pmModel.h" 34 #include "pmSourceMasks.h" 35 #include "pmSourceExtendedPars.h" 36 #include "pmSourceDiffStats.h" 37 #include "pmSource.h" 38 #include "pmSourceFitModel.h" 24 39 #include "pmPSF.h" 25 40 #include "pmPSFtry.h" 26 #include "pmSource.h" 41 27 42 #include "pmFPAExtent.h" 28 29 # if (HAVE_KAPA)30 # include <kapa.h>31 # include "pmVisual.h"32 # include "pmKapaPlots.h"33 # define KAPAX 70034 # define KAPAY 70035 43 36 44 #include "pmAstrometryVisual.h" … … 38 46 #include "pmStackVisual.h" 39 47 #include "pmSourceVisual.h" 48 49 # if (HAVE_KAPA) 50 # include <kapa.h> 51 #include "pmVisual.h" 52 #include "pmKapaPlots.h" 53 54 # define KAPAX 700 55 # define KAPAY 700 40 56 41 57 //#define TESTING … … 102 118 103 119 /* Wait up to 1.0 second for a response, then continue */ 104 timeout.tv_sec = 2;120 timeout.tv_sec = 10; 105 121 timeout.tv_usec = 0; 106 122 -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmPSFEnvelope.c
r28332 r29060 10 10 #include "pmHDU.h" 11 11 #include "pmFPA.h" 12 #include "pmReadoutFake.h" 13 14 #include "pmMoments.h" 12 13 #include "pmTrend2D.h" 15 14 #include "pmResiduals.h" 16 15 #include "pmGrowthCurve.h" 17 #include "pmTrend2D.h"18 #include "pmPSF.h"19 #include "pmModel.h"20 #include "pmModelClass.h"21 #include "pmModelUtils.h"22 16 #include "pmSpan.h" 17 #include "pmFootprintSpans.h" 23 18 #include "pmFootprint.h" 24 19 #include "pmPeaks.h" 20 #include "pmMoments.h" 21 #include "pmModelFuncs.h" 22 #include "pmModel.h" 23 #include "pmModelUtils.h" 24 #include "pmModelClass.h" 25 #include "pmSourceMasks.h" 26 #include "pmSourceExtendedPars.h" 27 #include "pmSourceDiffStats.h" 25 28 #include "pmSource.h" 26 #include "pmSourceUtils.h"27 29 #include "pmSourceFitModel.h" 30 #include "pmPSF.h" 28 31 #include "pmPSFtry.h" 29 32 30 33 #include "pmReadoutFake.h" 31 34 #include "pmPSFEnvelope.h" 32 35 #include "pmStackVisual.h" … … 410 413 options->chiFluxTrend = false; // All sources have similar flux, so fitting a trend often fails 411 414 412 pmSourceFitModelInit(SOURCE_FIT_ITERATIONS, 0.01, VARIANCE_VAL, true); 415 // options which modify the behavior of the model fitting 416 options->fitOptions = pmSourceFitOptionsAlloc(); 417 options->fitOptions->nIter = SOURCE_FIT_ITERATIONS; 418 options->fitOptions->minTol = 0.01; 419 options->fitOptions->maxTol = 1.00; 420 options->fitOptions->poissonErrors = true; 421 options->fitOptions->weight = VARIANCE_VAL; 422 options->fitOptions->mode = PM_SOURCE_FIT_PSF; 423 413 424 pmModelClassSetLimits(PM_MODEL_LIMITS_STRICT); // Important for getting a good stack target PSF 414 425 -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtraction.c
r28667 r29060 33 33 #define USE_KERNEL_ERR // Use kernel error image? 34 34 #define NUM_COVAR_POS 5 // Number of positions for covariance calculation 35 36 // XXX we need to pass these fwhm values elsewhere. These should go on one of the structure, but 37 // things are too confusing to do that now. just save them here. 38 static float FWHM1 = NAN; 39 static float FWHM2 = NAN; 35 40 36 41 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// … … 752 757 753 758 754 bool pmSubtractionConvolveStamp (pmSubtractionStamp *stamp, constpmSubtractionKernels *kernels, int footprint)759 bool pmSubtractionConvolveStamp (pmSubtractionStamp *stamp, pmSubtractionKernels *kernels, int footprint) 755 760 { 756 761 PS_ASSERT_PTR_NON_NULL(stamp, false); … … 774 779 stamp->convolutions1 = convolveStamp(stamp->convolutions1, stamp->image1, kernels, footprint); 775 780 stamp->convolutions2 = convolveStamp(stamp->convolutions2, stamp->image2, kernels, footprint); 781 if (!pmSubtractionKernelPenaltiesStamp(stamp, kernels)) { 782 psAbort("failure in penalties"); 783 } 776 784 break; 777 785 default: … … 1215 1223 bool threaded = pmSubtractionThreaded(); // Running threaded? 1216 1224 1225 // XXX This is no longer used 1217 1226 psImage *convMask = NULL; // Convolved mask image (common to inputs 1 and 2) 1218 1227 if (subMask) { … … 1413 1422 return true; 1414 1423 } 1424 1425 bool pmSubtractionGetFWHMs(float *fwhm1, float *fwhm2) { 1426 1427 *fwhm1 = FWHM1; 1428 *fwhm2 = FWHM2; 1429 return true; 1430 } 1431 1432 bool pmSubtractionSetFWHMs(float fwhm1, float fwhm2) { 1433 1434 FWHM1 = fwhm1; 1435 FWHM2 = fwhm2; 1436 return true; 1437 } -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtraction.h
r26893 r29060 59 59 /// Convolve the reference stamp with the kernel components 60 60 bool pmSubtractionConvolveStamp(pmSubtractionStamp *stamp, ///< Stamp to convolve 61 constpmSubtractionKernels *kernels, ///< Kernel parameters61 pmSubtractionKernels *kernels, ///< Kernel parameters 62 62 int footprint ///< Half-size of region over which to calculate equation 63 63 ); … … 157 157 ); 158 158 159 bool pmSubtractionGetFWHMs(float *fwhm1, float *fwhm2); 160 bool pmSubtractionSetFWHMs(float fwhm1, float fwhm2); 161 159 162 /// @} 160 163 #endif -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtractionEquation.c
r28405 r29060 38 38 const psImage *polyValues, // Spatial polynomial values 39 39 int footprint, // (Half-)Size of stamp 40 int normWindow, // Window (half-)size for normalisation measurement 40 int normWindow1, // Window (half-)size for normalisation measurement 41 int normWindow2, // Window (half-)size for normalisation measurement 41 42 const pmSubtractionEquationCalculationMode mode 42 43 ) … … 184 185 double one = 1.0; 185 186 186 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(normWindow )) {187 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(normWindow1)) { 187 188 normI1 += ref; 189 } 190 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(normWindow2)) { 188 191 normI2 += in; 189 192 } … … 214 217 215 218 *norm = normI2 / normI1; 219 220 fprintf (stderr, "normValue: %f %f %f\n", normI1, normI2, *norm); 216 221 217 222 if (mode & PM_SUBTRACTION_EQUATION_NORM) { … … 262 267 const psImage *polyValues, // Spatial polynomial values 263 268 int footprint, // (Half-)Size of stamp 264 int normWindow, // Window (half-)size for normalisation measurement 269 int normWindow1, // Window (half-)size for normalisation measurement 270 int normWindow2, // Window (half-)size for normalisation measurement 265 271 const pmSubtractionEquationCalculationMode mode 266 272 ) … … 492 498 double i1i2 = i1 * i2; 493 499 494 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(normWindow )) {500 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(normWindow1)) { 495 501 normI1 += i1; 502 } 503 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(normWindow2)) { 496 504 normI2 += i2; 497 505 } … … 522 530 523 531 *norm = normI2 / normI1; 532 fprintf (stderr, "normValue: %f %f %f\n", normI1, normI2, *norm); 524 533 525 534 if (mode & PM_SUBTRACTION_EQUATION_NORM) { … … 559 568 // Add in penalty term to least-squares vector 560 569 bool calculatePenalty(psImage *matrix, // Matrix to which to add in penalty term 561 psVector *vector, // Vector to which to add in penalty term562 const pmSubtractionKernels *kernels, // Kernel parameters563 float norm // Normalisation564 )570 psVector *vector, // Vector to which to add in penalty term 571 const pmSubtractionKernels *kernels, // Kernel parameters 572 float norm // Normalisation 573 ) 565 574 { 566 575 if (kernels->penalty == 0.0) { … … 568 577 } 569 578 570 psVector *penalties = kernels->penalties; // Penalties for each kernel component 579 psVector *penalties1 = kernels->penalties1; // Penalties for each kernel component (input) 580 psVector *penalties2 = kernels->penalties2; // Penalties for each kernel component (ref) 581 571 582 int spatialOrder = kernels->spatialOrder; // Order of spatial variations 572 583 int numKernels = kernels->num; // Number of kernel components … … 588 599 for (int xOrder = 0; xOrder <= spatialOrder - yOrder; xOrder++, index += numKernels) { 589 600 // Contribution to chi^2: a_i^2 P_i 590 psAssert(isfinite(penalties->data.F32[i]), "Invalid penalty"); 591 matrix->data.F64[index][index] += norm * penalties->data.F32[i]; 601 psAssert(isfinite(penalties1->data.F32[i]), "Invalid penalty"); 602 fprintf (stderr, "penalty: %f + %f (%f * %f)\n", matrix->data.F64[index][index], norm * penalties1->data.F32[i], norm, penalties1->data.F32[i]); 603 matrix->data.F64[index][index] += norm * penalties1->data.F32[i]; 592 604 if (kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 593 matrix->data.F64[index + numParams + 2][index + numParams + 2] += norm * penalties->data.F32[i]; 605 fprintf (stderr, "penalty: (x^%d y^%d fwhm %f) : %f + %f (%f * %f)\n", kernels->u->data.S32[index], kernels->v->data.S32[index], kernels->widths->data.F32[index], 606 matrix->data.F64[index + numParams + 2][index + numParams + 2], norm * penalties2->data.F32[i], norm, penalties2->data.F32[i]); 607 matrix->data.F64[index + numParams + 2][index + numParams + 2] += norm * penalties2->data.F32[i]; 594 608 // matrix[i][i] is ~ (k_i * I_1)(k_i * I_1) 595 609 // penalties scale with second moments … … 682 696 683 697 pmSubtractionStampList *stamps = job->args->data[0]; // List of stamps 684 constpmSubtractionKernels *kernels = job->args->data[1]; // Kernels698 pmSubtractionKernels *kernels = job->args->data[1]; // Kernels 685 699 int index = PS_SCALAR_VALUE(job->args->data[2], S32); // Stamp index 686 700 pmSubtractionEquationCalculationMode mode = PS_SCALAR_VALUE(job->args->data[3], S32); // calculation model … … 689 703 } 690 704 691 bool pmSubtractionCalculateEquationStamp(pmSubtractionStampList *stamps, constpmSubtractionKernels *kernels,705 bool pmSubtractionCalculateEquationStamp(pmSubtractionStampList *stamps, pmSubtractionKernels *kernels, 692 706 int index, const pmSubtractionEquationCalculationMode mode) 693 707 { … … 778 792 status = calculateMatrixVector(stamp->matrix, stamp->vector, &stamp->norm, stamp->image2, stamp->image1, 779 793 weight, window, stamp->convolutions1, kernels, 780 polyValues, footprint, stamps->normWindow , mode);794 polyValues, footprint, stamps->normWindow1, stamps->normWindow2, mode); 781 795 break; 782 796 case PM_SUBTRACTION_MODE_2: 783 797 status = calculateMatrixVector(stamp->matrix, stamp->vector, &stamp->norm, stamp->image1, stamp->image2, 784 798 weight, window, stamp->convolutions2, kernels, 785 polyValues, footprint, stamps->normWindow , mode);799 polyValues, footprint, stamps->normWindow2, stamps->normWindow1, mode); 786 800 break; 787 801 case PM_SUBTRACTION_MODE_DUAL: … … 789 803 stamp->image1, stamp->image2, 790 804 weight, window, stamp->convolutions1, stamp->convolutions2, 791 kernels, polyValues, footprint, stamps->normWindow , mode);805 kernels, polyValues, footprint, stamps->normWindow1, stamps->normWindow2, mode); 792 806 break; 793 807 default: … … 830 844 } 831 845 832 bool pmSubtractionCalculateEquation(pmSubtractionStampList *stamps, constpmSubtractionKernels *kernels,846 bool pmSubtractionCalculateEquation(pmSubtractionStampList *stamps, pmSubtractionKernels *kernels, 833 847 const pmSubtractionEquationCalculationMode mode) 834 848 { … … 996 1010 } 997 1011 1012 // double normValue = 1.0; 998 1013 double normValue = stats->robustMedian; 999 1014 // double bgValue = 0.0; … … 1023 1038 } 1024 1039 # endif 1040 1041 #if (1) 1042 for (int i = 0; i < solution->n; i++) { 1043 fprintf(stderr, "Single solution %d: %lf\n", i, solution->data.F64[i]); 1044 } 1045 #endif 1025 1046 1026 1047 if (!kernels->solution1) { … … 1096 1117 1097 1118 int normIndex = PM_SUBTRACTION_INDEX_NORM(kernels); // Index for normalisation 1098 calculatePenalty(sumMatrix, sumVector, kernels, sumMatrix->data.F64[normIndex][normIndex] / 100 0.0);1119 calculatePenalty(sumMatrix, sumVector, kernels, sumMatrix->data.F64[normIndex][normIndex] / 100.0); 1099 1120 #endif 1100 1121 … … 1177 1198 1178 1199 1179 #if def TESTING1200 #if (1) 1180 1201 for (int i = 0; i < solution->n; i++) { 1181 1202 fprintf(stderr, "Dual solution %d: %lf\n", i, solution->data.F64[i]); -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtractionEquation.h
r26893 r29060 19 19 /// Calculate the least-squares equation to match the image quality for a single stamp 20 20 bool pmSubtractionCalculateEquationStamp(pmSubtractionStampList *stamps, ///< Stamps 21 constpmSubtractionKernels *kernels, ///< Kernel parameters21 pmSubtractionKernels *kernels, ///< Kernel parameters 22 22 int index, ///< Index of stamp 23 23 const pmSubtractionEquationCalculationMode mode … … 26 26 /// Calculate the least-squares equation to match the image quality 27 27 bool pmSubtractionCalculateEquation(pmSubtractionStampList *stamps, ///< Stamps 28 constpmSubtractionKernels *kernels, ///< Kernel parameters28 pmSubtractionKernels *kernels, ///< Kernel parameters 29 29 const pmSubtractionEquationCalculationMode mode 30 30 ); -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtractionKernels.c
r27335 r29060 26 26 psFree(kernels->vStop); 27 27 psFree(kernels->preCalc); 28 psFree(kernels->penalties); 28 psFree(kernels->penalties1); 29 psFree(kernels->penalties2); 29 30 psFree(kernels->solution1); 30 31 psFree(kernels->solution2); … … 140 141 kernels->v = psVectorRealloc(kernels->v, start + numNew); 141 142 kernels->preCalc = psArrayRealloc(kernels->preCalc, start + numNew); 142 kernels->penalties = psVectorRealloc(kernels->penalties, start + numNew); 143 144 kernels->penalties1 = psVectorRealloc(kernels->penalties1, start + numNew); 145 kernels->penalties2 = psVectorRealloc(kernels->penalties2, start + numNew); 146 143 147 kernels->inner = start; 144 148 kernels->num += numNew; … … 156 160 kernels->v->data.S32[index] = v; 157 161 kernels->preCalc->data[index] = NULL; 158 kernels->penalties->data.F32[index] = kernels->penalty * PS_SQR(PS_SQR(u) + PS_SQR(v)); 159 psAssert (isfinite(kernels->penalties->data.F32[index]), "invalid penalty"); 162 163 // XXX this needs to be changed to use the *convolved* second moment 164 kernels->penalties1->data.F32[index] = kernels->penalty * PS_SQR(PS_SQR(u) + PS_SQR(v)); 165 psAssert (isfinite(kernels->penalties1->data.F32[index]), "invalid penalty"); 166 167 kernels->penalties2->data.F32[index] = kernels->penalty * PS_SQR(PS_SQR(u) + PS_SQR(v)); 168 psAssert (isfinite(kernels->penalties2->data.F32[index]), "invalid penalty"); 169 160 170 psTrace("psModules.imcombine", 7, "Kernel %d: %d %d\n", index, u, v); 161 171 } … … 166 176 kernels->v->n = start + numNew; 167 177 kernels->preCalc->n = start + numNew; 168 kernels->penalties->n = start + numNew; 178 179 kernels->penalties1->n = start + numNew; 180 kernels->penalties2->n = start + numNew; 169 181 170 182 return true; 171 183 } 172 184 173 bool pmSubtractionKernelPreCalcNormalize(pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc,174 int index, int size, int uOrder, int vOrder, float fwhm,175 bool AlardLuptonStyle, bool forceZeroNull)185 static bool pmSubtractionKernelPreCalcNormalize(pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, 186 int index, int uOrder, int vOrder, float fwhm, 187 bool AlardLuptonStyle, bool forceZeroNull) 176 188 { 177 189 // we have 4 cases here: … … 182 194 183 195 // Calculate moments 184 double penalty = 0.0; // Moment, for penalty185 196 double sum = 0.0, sum2 = 0.0; // Sum of kernel component 186 197 float min = INFINITY, max = -INFINITY; // Minimum and maximum kernel value 187 for (int v = -size; v <= size; v++) { 188 for (int u = -size; u <= size; u++) { 198 199 for (int v = preCalc->kernel->yMin; v <= preCalc->kernel->yMax; v++) { 200 for (int u = preCalc->kernel->xMin; u <= preCalc->kernel->xMax; u++) { 189 201 double value = preCalc->kernel->kernel[v][u]; 190 202 double value2 = PS_SQR(value); 191 203 sum += value; 192 204 sum2 += value2; 193 penalty += value2 * PS_SQR((PS_SQR(u) + PS_SQR(v)));194 205 min = PS_MIN(value, min); 195 206 max = PS_MAX(value, max); … … 198 209 199 210 #if 0 200 fprintf(stderr, "%d raw: %lf, null: %f, min: %lf, max: %lf , moment: %lf\n", index, sum, preCalc->kernel->kernel[0][0], min, max, penalty);211 fprintf(stderr, "%d raw: %lf, null: %f, min: %lf, max: %lf\n", index, sum, preCalc->kernel->kernel[0][0], min, max); 201 212 #endif 202 213 … … 207 218 if (uOrder % 2 == 0 && vOrder % 2 == 0) { 208 219 // Even functions: normalise to unit sum and subtract null pixel so that sum is zero 209 scale2D = 1.0 / fabs(sum); 220 // Re-normalize 221 // scale2D = 1.0 / fabs(sum); 222 scale2D = 1.0 / sqrt(sum2); 210 223 zeroNull = true; 211 224 } else { … … 239 252 240 253 psBinaryOp(preCalc->kernel->image, preCalc->kernel->image, "*", psScalarAlloc(scale2D, PS_TYPE_F32)); 241 penalty *= 1.0 / sum2;242 254 243 255 if (zeroNull) { 244 preCalc->kernel->kernel[0][0] -= 1.0; 245 } 246 247 #if 0 256 // preCalc->kernel->kernel[0][0] -= 1.0; 257 preCalc->kernel->kernel[0][0] -= sum / sqrt (sum2); 258 } 259 260 #if 1 248 261 { 249 double sum = 0.0; // Sum of kernel component 262 double Sum = 0.0; // Sum of kernel component 263 double Sum2 = 0.0; // Sum of kernel component 250 264 float min = INFINITY, max = -INFINITY; // Minimum and maximum kernel value 251 for (int v = -size; v <= size; v++) { 252 for (int u = -size; u <= size; u++) { 253 sum += preCalc->kernel->kernel[v][u]; 265 for (int v = preCalc->kernel->yMin; v <= preCalc->kernel->yMax; v++) { 266 for (int u = preCalc->kernel->xMin; u <= preCalc->kernel->xMax; u++) { 267 double value = preCalc->kernel->kernel[v][u]; 268 Sum += value; 269 Sum2 += PS_SQR(value); 254 270 min = PS_MIN(preCalc->kernel->kernel[v][u], min); 255 271 max = PS_MAX(preCalc->kernel->kernel[v][u], max); 256 272 } 257 273 } 258 fprintf(stderr, "%d mod: %lf, null: %f, min: %lf, max: %lf, scale: %f\n", index, sum, preCalc->kernel->kernel[0][0], min, max, scale2D);274 fprintf(stderr, "%d sum: %lf, sum2: %lf, null: %f, min: %lf, max: %lf, scale: %f\n", index, Sum, Sum2, preCalc->kernel->kernel[0][0], min, max, scale2D); 259 275 } 260 276 #endif … … 267 283 } 268 284 kernels->preCalc->data[index] = preCalc; 269 kernels->penalties->data.F32[index] = kernels->penalty * penalty; 270 psAssert (isfinite(kernels->penalties->data.F32[index]), "invalid penalty"); 271 psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d %f\n", index, fwhm, uOrder, vOrder, penalty); 285 psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d\n", index, fwhm, uOrder, vOrder); 272 286 273 287 return true; … … 321 335 322 336 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_ISIS, uOrder, vOrder, size, sigma); // structure to hold precalculated values 323 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size,uOrder, vOrder, fwhms->data.F32[i], true, false);324 // pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size,uOrder, vOrder, fwhms->data.F32[i], false, false);337 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, uOrder, vOrder, fwhms->data.F32[i], true, false); 338 // pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, uOrder, vOrder, fwhms->data.F32[i], false, false); 325 339 } 326 340 } … … 379 393 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) { 380 394 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_ISIS, uOrder, vOrder, size, sigma); // structure to hold precalculated values 381 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size,uOrder, vOrder, fwhms->data.F32[i], true, false);395 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, uOrder, vOrder, fwhms->data.F32[i], true, false); 382 396 } 383 397 } … … 385 399 // XXX modify size for hermitians to account for sqrt(2) in Hermitian definition (relative to ISIS Gaussian) 386 400 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_ISIS_RADIAL, order, order, size, sigma / sqrt(2.0)); // structure to hold precalculated values 387 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size,order, order, fwhms->data.F32[i], true, true);401 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, order, order, fwhms->data.F32[i], true, true); 388 402 } 389 403 } … … 437 451 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) { 438 452 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_HERM, uOrder, vOrder, size, sigma); // structure to hold precalculated values 439 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size,uOrder, vOrder, fwhms->data.F32[i], true, false);453 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, uOrder, vOrder, fwhms->data.F32[i], true, false); 440 454 } 441 455 } … … 506 520 507 521 // XXX do we use Alard-Lupton normalization (last param true) or not? 508 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size,uOrder, vOrder, fwhms->data.F32[i], true, false);522 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, uOrder, vOrder, fwhms->data.F32[i], true, false); 509 523 510 524 // XXXX test demo that deconvolved kernel is valid … … 572 586 kernels->preCalc = psArrayAlloc(numBasisFunctions); 573 587 kernels->penalty = penalty; 574 kernels->penalties = psVectorAlloc(numBasisFunctions, PS_TYPE_F32); 588 kernels->penalties1 = psVectorAlloc(numBasisFunctions, PS_TYPE_F32); 589 psVectorInit(kernels->penalties1, NAN); 590 kernels->penalties2 = psVectorAlloc(numBasisFunctions, PS_TYPE_F32); 591 psVectorInit(kernels->penalties2, NAN); 592 kernels->havePenalties = false; 575 593 kernels->size = size; 576 594 kernels->inner = 0; … … 771 789 772 790 psWarning("Kernel penalty for dual-convolution is not configured for SPAM kernels."); 773 psVectorInit(kernels->penalties, 0.0); 791 psVectorInit(kernels->penalties1, 0.0); 792 psVectorInit(kernels->penalties2, 0.0); 774 793 775 794 return kernels; … … 866 885 867 886 psWarning("Kernel penalty for dual-convolution is not configured for FRIES kernels."); 868 psVectorInit(kernels->penalties, 0.0); 887 psVectorInit(kernels->penalties1, 0.0); 888 psVectorInit(kernels->penalties2, 0.0); 869 889 870 890 return kernels; … … 1040 1060 kernels->u->data.S32[index] = uOrder; 1041 1061 kernels->v->data.S32[index] = vOrder; 1042 kernels->penalties->data.F32[index] = kernels->penalty * fabsf(moment); 1043 if (!isfinite(kernels->penalties->data.F32[index])) { 1062 1063 // XXX convert to use the convolved 2nd moment 1064 kernels->penalties1->data.F32[index] = kernels->penalty * fabsf(moment); 1065 if (!isfinite(kernels->penalties1->data.F32[index])) { 1066 psAbort ("invalid penalty"); 1067 } 1068 kernels->penalties2->data.F32[index] = kernels->penalty * fabsf(moment); 1069 if (!isfinite(kernels->penalties2->data.F32[index])) { 1044 1070 psAbort ("invalid penalty"); 1045 1071 } … … 1247 1273 out->preCalc = psMemIncrRefCounter(in->preCalc); 1248 1274 out->penalty = in->penalty; 1249 out->penalties = psMemIncrRefCounter(in->penalties); 1275 out->penalties1 = psMemIncrRefCounter(in->penalties1); 1276 out->penalties2 = psMemIncrRefCounter(in->penalties2); 1250 1277 out->uStop = psMemIncrRefCounter(in->uStop); 1251 1278 out->vStop = psMemIncrRefCounter(in->vStop); -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtractionKernels.h
r26893 r29060 39 39 psArray *preCalc; ///< Array of images containing pre-calculated kernel (for ISIS, HERM or DECONV_HERM) 40 40 float penalty; ///< Penalty for wideness 41 psVector *penalties; ///< Penalty for each kernel component 41 psVector *penalties1; ///< Penalty for each kernel component 42 psVector *penalties2; ///< Penalty for each kernel component 43 bool havePenalties; ///< flag to test if we have already calculated the penalties or not. 42 44 int size; ///< The half-size of the kernel 43 45 int inner; ///< The size of an inner region … … 308 310 ); 309 311 310 311 312 #endif -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtractionMatch.c
r28405 r29060 1304 1304 float scale = PS_MAX(fwhm1, fwhm2) / scaleRef; // Scaling factor 1305 1305 1306 // XXX save these values in a static for later use 1307 pmSubtractionSetFWHMs(fwhm1, fwhm2); 1308 1306 1309 if (isfinite(scaleMin) && scale < scaleMin) { 1307 1310 scale = scaleMin; -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtractionMatch.h
r26893 r29060 110 110 ); 111 111 112 113 112 #endif -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtractionStamps.c
r27402 r29060 7 7 #include <pslib.h> 8 8 9 #include "pmErrorCodes.h" 10 #include "pmHDU.h" 11 #include "pmFPA.h" 12 9 13 // All these includes required to get stamps out of an array of pmSources 10 #include "pmMoments.h" 14 #include "pmTrend2D.h" 15 #include "pmResiduals.h" 16 #include "pmGrowthCurve.h" 11 17 #include "pmSpan.h" 18 #include "pmFootprintSpans.h" 12 19 #include "pmFootprint.h" 13 20 #include "pmPeaks.h" 14 #include "pmResiduals.h" 15 #include "pmHDU.h" 16 #include "pmFPA.h" 17 #include "pmGrowthCurve.h" 18 #include "pmTrend2D.h" 19 #include "pmPSF.h" 21 #include "pmMoments.h" 22 #include "pmModelFuncs.h" 20 23 #include "pmModel.h" 24 #include "pmSourceMasks.h" 25 #include "pmSourceExtendedPars.h" 26 #include "pmSourceDiffStats.h" 21 27 #include "pmSource.h" 22 #include "pmErrorCodes.h"23 28 24 29 #include "pmSubtraction.h" … … 46 51 psFree(list->y); 47 52 psFree(list->flux); 48 psFree(list->window); 53 psFree(list->window1); 54 psFree(list->window2); 49 55 } 50 56 … … 225 231 list->y = NULL; 226 232 list->flux = NULL; 227 list->window = NULL;228 233 list->normFrac = normFrac; 229 list->normWindow = 0; 234 list->window1 = NULL; 235 list->window2 = NULL; 236 list->normWindow1 = 0; 237 list->normWindow2 = 0; 230 238 list->footprint = footprint; 231 239 list->sysErr = sysErr; … … 248 256 out->y = NULL; 249 257 out->flux = NULL; 250 out->window = psMemIncrRefCounter(in->window); 258 out->window1 = psMemIncrRefCounter(in->window1); 259 out->window2 = psMemIncrRefCounter(in->window2); 251 260 out->footprint = in->footprint; 252 out->normWindow = in->normWindow; 261 out->normWindow1 = in->normWindow1; 262 out->normWindow2 = in->normWindow2; 253 263 254 264 for (int i = 0; i < num; i++) { … … 638 648 int size = stamps->footprint; // Size of postage stamps 639 649 640 psFree (stamps->window); 641 stamps->window = psKernelAlloc(-size, size, -size, size); 642 psImageInit(stamps->window->image, 0.0); 650 psFree (stamps->window1); 651 stamps->window1 = psKernelAlloc(-size, size, -size, size); 652 psImageInit(stamps->window1->image, 0.0); 653 654 psFree (stamps->window2); 655 stamps->window2 = psKernelAlloc(-size, size, -size, size); 656 psImageInit(stamps->window2->image, 0.0); 643 657 644 658 // generate normalizations for each stamp … … 669 683 670 684 // generate the window pixels 671 double sum = 0.0; // Sum inside the window 672 float maxValue = 0.0; // Maximum value, for normalisation 685 double sum1 = 0.0; // Sum inside the window 686 double sum2 = 0.0; // Sum inside the window 687 float maxValue1 = 0.0; // Maximum value, for normalisation 688 float maxValue2 = 0.0; // Maximum value, for normalisation 673 689 for (int y = -size; y <= size; y++) { 674 690 for (int x = -size; x <= size; x++) { … … 691 707 } 692 708 float f1 = stats->robustMedian; 709 693 710 psStatsInit (stats); 694 711 if (!psVectorStats (stats, flux2, NULL, NULL, 0)) { … … 697 714 float f2 = stats->robustMedian; 698 715 699 stamps->window ->kernel[y][x] = f1 + f2;716 stamps->window1->kernel[y][x] = f1; 700 717 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(size)) { 701 sum += stamps->window->kernel[y][x]; 702 } 703 maxValue = PS_MAX(maxValue, stamps->window->kernel[y][x]); 704 } 705 } 706 707 psTrace("psModules.imcombine", 3, "Window total: %f, threshold: %f\n", 708 sum, (1.0 - stamps->normFrac) * sum); 709 bool done = false; 710 for (int radius = 1; radius <= size && !done; radius++) { 711 double within = 0.0; 718 sum1 += stamps->window1->kernel[y][x]; 719 } 720 maxValue1 = PS_MAX(maxValue1, stamps->window1->kernel[y][x]); 721 722 stamps->window2->kernel[y][x] = f2; 723 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(size)) { 724 sum2 += stamps->window2->kernel[y][x]; 725 } 726 maxValue2 = PS_MAX(maxValue2, stamps->window2->kernel[y][x]); 727 } 728 } 729 730 psTrace("psModules.imcombine", 3, "Window total (1): %f, threshold: %f\n", sum1, (1.0 - stamps->normFrac) * sum1); 731 psTrace("psModules.imcombine", 3, "Window total (2): %f, threshold: %f\n", sum2, (1.0 - stamps->normFrac) * sum2); 732 733 # if (0) 734 // this block attempts to calculate the radius based on the first radial moment 735 bool done1 = false; 736 bool done2 = false; 737 double prior1 = 0.0; 738 double prior2 = 0.0; 739 for (int y = -size; y <= size; y++) { 740 for (int x = -size; x <= size; x++) { 741 float r = hypot(x, y); 742 Sr1 += r * stamps->window1->kernel[y][x]; 743 Sr2 += r * stamps->window2->kernel[y][x]; 744 Sf1 += stamps->window1->kernel[y][x]; 745 Sf2 += stamps->window2->kernel[y][x]; 746 } 747 } 748 749 float R1 = Sr1 / Sf1; 750 float R2 = Sr2 / Sf2; 751 752 stamps->normWindow1 = 2.5*R1; 753 stamps->normWindow1 = 2.5*R2; 754 # else 755 // XXX : this block attempts to calculate the radius by looking at the curve of growth (or something vaguely equivalent). 756 // It did not do very well (though a true curve-of-growth analysis might be better...) 757 bool done1 = false; 758 bool done2 = false; 759 double prior1 = 0.0; 760 double prior2 = 0.0; 761 double delta1o = 1.0; 762 double delta2o = 1.0; 763 for (int radius = 1; radius <= size && !(done1 && done2); radius++) { 764 double within1 = 0.0; 765 double within2 = 0.0; 712 766 for (int y = -radius; y <= radius; y++) { 713 767 for (int x = -radius; x <= radius; x++) { 714 768 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(radius)) { 715 within += stamps->window->kernel[y][x];769 within1 += stamps->window1->kernel[y][x]; 716 770 } 717 } 718 } 719 psTrace("psModules.imcombine", 5, "Radius %d: %f\n", radius, within); 720 if (within > (1.0 - stamps->normFrac) * sum) { 721 stamps->normWindow = radius; 722 done = true; 723 } 724 } 725 726 psTrace("psModules.imcombine", 3, "Normalisation window radius set to %d\n", stamps->normWindow); 727 if (stamps->normWindow == 0 || stamps->normWindow >= size) { 728 psError(PM_ERR_STAMPS, true, "Unable to determine normalisation window size."); 771 if (PS_SQR(x) + PS_SQR(y) <= PS_SQR(radius)) { 772 within2 += stamps->window2->kernel[y][x]; 773 } 774 } 775 } 776 double delta1 = (within1 - prior1) / within1; 777 if (!done1 && (fabs(delta1) < stamps->normFrac)) { 778 // interpolate to the radius at which delta2 is normFrac: 779 stamps->normWindow1 = radius - (stamps->normFrac - delta1) / (delta1o - delta1); 780 fprintf (stderr, "choosing %f (%d) for 1 (%f : %f)\n", stamps->normWindow1, radius, within1, delta1); 781 done1 = true; 782 } 783 double delta2 = (within2 - prior2) / within2; 784 if (!done2 && (fabs(delta2) < stamps->normFrac)) { 785 // interpolate to the radius at which delta2 is normFrac: 786 stamps->normWindow2 = radius - (stamps->normFrac - delta2) / (delta2o - delta2); 787 fprintf (stderr, "choosing %f (%d) for 2 (%f : %f)\n", stamps->normWindow2, radius, within2, delta2); 788 done2 = true; 789 } 790 psTrace("psModules.imcombine", 5, "Radius %d: %f (%f) and %f (%f)\n", radius, within1, delta1, within2, delta2); 791 792 prior1 = within1; 793 prior2 = within2; 794 delta1o = delta1; 795 delta2o = delta2; 796 797 // if (!done1 && (within1 > (1.0 - stamps->normFrac) * sum1)) { 798 // stamps->normWindow1 = radius; 799 // done1 = true; 800 // } 801 // if (!done2 && (within2 > (1.0 - stamps->normFrac) * sum2)) { 802 // stamps->normWindow2 = radius; 803 // done2 = true; 804 // } 805 806 } 807 # endif 808 809 psTrace("psModules.imcombine", 3, "Normalisation window radii set to %f and %f\n", stamps->normWindow1, stamps->normWindow2); 810 if (stamps->normWindow1 == 0 || stamps->normWindow1 >= size) { 811 psError(PM_ERR_STAMPS, true, "Unable to determine normalisation window size (1)."); 812 return false; 813 } 814 if (stamps->normWindow2 == 0 || stamps->normWindow2 >= size) { 815 psError(PM_ERR_STAMPS, true, "Unable to determine normalisation window size (2)."); 729 816 return false; 730 817 } … … 733 820 for (int y = -size; y <= size; y++) { 734 821 for (int x = -size; x <= size; x++) { 735 stamps->window->kernel[y][x] /= maxValue; 822 stamps->window1->kernel[y][x] /= maxValue1; 823 } 824 } 825 // re-normalize so chisquare values are sensible 826 for (int y = -size; y <= size; y++) { 827 for (int x = -size; x <= size; x++) { 828 stamps->window2->kernel[y][x] /= maxValue2; 736 829 } 737 830 } … … 739 832 #if 0 740 833 { 741 psFits *fits = psFitsOpen ("window.fits", "w"); 742 psFitsWriteImage (fits, NULL, stamps->window->image, 0, NULL); 834 psFits *fits = NULL; 835 fits = psFitsOpen ("window1.fits", "w"); 836 psFitsWriteImage (fits, NULL, stamps->window1->image, 0, NULL); 837 psFitsClose (fits); 838 fits = psFitsOpen ("window2.fits", "w"); 839 psFitsWriteImage (fits, NULL, stamps->window2->image, 0, NULL); 743 840 psFitsClose (fits); 744 841 } … … 747 844 psFree (stats); 748 845 psFree (flux1); 749 psFree (flux2);846 psFree (flux2); 750 847 psFree (norm1); 751 848 psFree (norm2); 752 849 return true; 850 } 851 852 static pthread_mutex_t getPenaltiesMutex = PTHREAD_MUTEX_INITIALIZER; 853 854 // kernels->penalty is an overall scaling factor (user-supplied) 855 bool pmSubtractionKernelPenaltiesStamp(pmSubtractionStamp *stamp, pmSubtractionKernels *kernels) 856 { 857 // we only need the penalties if we are doing dual convolution 858 if (kernels->mode != PM_SUBTRACTION_MODE_DUAL) return true; 859 860 // we only calculate the penalties once. 861 if (kernels->havePenalties) return true; 862 863 // in a threaded context, only one thread can calculate the penalties. attempt to grab a 864 // mutex before continuing 865 pthread_mutex_lock(&getPenaltiesMutex); 866 867 // did someone else already get the mutex and do this? 868 if (kernels->havePenalties) { 869 pthread_mutex_unlock(&getPenaltiesMutex); 870 return true; 871 } 872 873 for (int i = 0; i < kernels->num; i++) { 874 pmSubtractionKernelPenalties(stamp, kernels, i); 875 } 876 877 kernels->havePenalties = true; 878 pthread_mutex_unlock(&getPenaltiesMutex); 879 return true; 880 } 881 882 # define EMPIRICAL 0 883 884 // kernels->penalty is an overall scaling factor (user-supplied) 885 bool pmSubtractionKernelPenalties(pmSubtractionStamp *stamp, pmSubtractionKernels *kernels, int index) 886 { 887 float penalty1, penalty2; 888 float fwhm1, fwhm2; 889 890 // XXX this is annoyingly hack-ish 891 pmSubtractionGetFWHMs(&fwhm1, &fwhm2); 892 893 bool zeroNull = false; 894 int uOrder = kernels->u->data.S32[index]; 895 int vOrder = kernels->v->data.S32[index]; 896 if (uOrder % 2 == 0 && vOrder % 2 == 0) zeroNull = true; 897 898 if (EMPIRICAL) { 899 psKernel *convolution1 = stamp->convolutions1->data[index]; 900 penalty1 = pmSubtractionKernelPenaltySingle(convolution1, zeroNull); 901 902 psKernel *convolution2 = stamp->convolutions2->data[index]; 903 penalty2 = pmSubtractionKernelPenaltySingle(convolution2, zeroNull); 904 } else { 905 pmSubtractionKernelPreCalc *kernel = kernels->preCalc->data[index]; 906 float M2 = pmSubtractionKernelPenaltySingle(kernel->kernel, zeroNull); 907 908 penalty1 = M2 + PS_SQR(fwhm1 / 2.35); // rescale the unconvolved second-moment by the image second moment 909 penalty2 = M2 + PS_SQR(fwhm2 / 2.35); // rescale the unconvolved second-moment by the image second moment 910 } 911 kernels->penalties1->data.F32[index] = kernels->penalty * penalty1; 912 psAssert (isfinite(kernels->penalties1->data.F32[index]), "invalid penalty"); 913 914 kernels->penalties2->data.F32[index] = kernels->penalty * penalty2; 915 psAssert (isfinite(kernels->penalties2->data.F32[index]), "invalid penalty"); 916 917 fprintf(stderr, "penalty1: %f, penalty2: %f\n", penalty1, penalty2); 918 919 return true; 920 } 921 922 float pmSubtractionKernelPenaltySingle(psKernel *kernel, bool zeroNull) 923 { 924 // Calculate moments 925 double penalty = 0.0; // Moment, for penalty 926 double sum = 0.0, sum2 = 0.0; // Sum of kernel component 927 float min = INFINITY, max = -INFINITY; // Minimum and maximum kernel value 928 for (int v = kernel->yMin; v <= kernel->yMax; v++) { 929 for (int u = kernel->xMin; u <= kernel->xMax; u++) { 930 double value = kernel->kernel[v][u]; 931 if (false && zeroNull && (u == 0) && (v == 0)) { 932 value += 1.0; 933 } 934 double value2 = PS_SQR(value); 935 sum += value; 936 sum2 += value2; 937 penalty += value2 * PS_SQR((PS_SQR(u) + PS_SQR(v))); 938 min = PS_MIN(value, min); 939 max = PS_MAX(value, max); 940 } 941 } 942 penalty *= 1.0 / sum2; 943 944 if (1) { 945 fprintf(stderr, "min: %lf, max: %lf, moment: %lf, flux^2: %lf\n", min, max, penalty, sum2); 946 // psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d %f\n", index, fwhm, uOrder, vOrder, penalty); 947 } 948 949 return penalty; 753 950 } 754 951 -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtractionStamps.h
r26893 r29060 24 24 psArray *flux; ///< Fluxes for possible stamps (or NULL) 25 25 int footprint; ///< Half-size of stamps 26 psKernel *window; ///< window function generated from ensemble of stamps27 26 float normFrac; ///< Fraction of flux in window for normalisation window 28 int normWindow; ///< Size of window for measuring normalisation 27 psKernel *window1; ///< window function generated from ensemble of stamps (input 1) 28 psKernel *window2; ///< window function generated from ensemble of stamps (input 2) 29 float normWindow1; ///< Size of window for measuring normalisation 30 float normWindow2; ///< Size of window for measuring normalisation 29 31 float sysErr; ///< Systematic error 30 32 float skyErr; ///< increase effective readnoise … … 195 197 bool pmSubtractionStampsResetStatus (pmSubtractionStampList *stamps); 196 198 199 200 bool pmSubtractionKernelPenaltiesStamp(pmSubtractionStamp *stamp, pmSubtractionKernels *kernels); 201 bool pmSubtractionKernelPenalties(pmSubtractionStamp *stamp, pmSubtractionKernels *kernels, int index); 202 float pmSubtractionKernelPenaltySingle(psKernel *kernel, bool zeroNull); 203 197 204 #endif -
branches/sc_branches/trunkTest/psModules/src/imcombine/pmSubtractionVisual.c
r26893 r29060 21 21 22 22 #include "pmVisual.h" 23 #include "pmVisualUtils.h" 23 24 24 25 #include "pmHDU.h" … … 61 62 * @return true for success */ 62 63 bool pmSubtractionVisualPlotConvKernels(psImage *convKernels) { 63 if (!pmVisualIsVisual() || !plotConvKernels) return true; 64 65 if (!pmVisualTestLevel("ppsub.kernels", 1)) return true; 66 67 if (!plotConvKernels) return true; 68 64 69 if (!pmVisualInitWindow(&kapa1, "ppSub:Images")) { 65 70 return false; … … 75 80 @return true for success */ 76 81 bool pmSubtractionVisualPlotStamps(pmSubtractionStampList *stamps, pmReadout *ro) { 77 if (!pmVisualIsVisual() || !plotStamps) return true; 82 83 if (!pmVisualTestLevel("ppsub.stamps", 1)) return true; 84 85 if (!plotStamps) return true; 86 78 87 if (!pmVisualInitWindow (&kapa1, "ppSub:Images")) { 79 88 return false; … … 145 154 bool pmSubtractionVisualPlotLeastSquares (pmSubtractionStampList *stamps, bool dual) { 146 155 147 if (!pmVisualIsVisual() || !plotLeastSquares) return true; 156 if (!pmVisualTestLevel("ppsub.chisq", 1)) return true; 157 158 if (!plotLeastSquares) return true; 159 148 160 if (!pmVisualInitWindow (&kapa1, "PPSub:Images")) { 149 161 return false; … … 204 216 205 217 bool pmSubtractionVisualShowSubtraction(psImage *image, psImage *ref, psImage *sub) { 206 if (!pmVisualIsVisual() || !plotImage) return true; 218 219 if (!pmVisualTestLevel("ppsub.images.sub", 1)) return true; 220 221 if (!plotImage) return true; 222 207 223 if (!pmVisualInitWindow (&kapa1, "PPSub:Images")) { 208 224 return false; … … 218 234 bool pmSubtractionVisualShowKernels(pmSubtractionKernels *kernels) { 219 235 220 if (!pmVisualIsVisual()) return true; 236 if (!pmVisualTestLevel("ppsub.kernels.final", 1)) return true; 237 221 238 if (!pmVisualInitWindow (&kapa1, "PPSub:Images")) { 222 239 return false; … … 264 281 bool pmSubtractionVisualShowBasis(pmSubtractionStampList *stamps) { 265 282 266 if (!pmVisualIsVisual()) return true; 283 if (!pmVisualTestLevel("ppsub.basis", 1)) return true; 284 267 285 if (!pmVisualInitWindow (&kapa2, "ppSub:StampMasterImage")) { 268 286 return false; … … 425 443 bool pmSubtractionVisualShowFitInit(pmSubtractionStampList *stamps) { 426 444 427 if (!pmVisual IsVisual()) return true;445 if (!pmVisualTestLevel("ppsub.fit", 1)) return true; 428 446 429 447 // generate 4 storage images large enough to hold the N stamps: … … 462 480 bool pmSubtractionVisualShowFitAddStamp(psKernel *target, psKernel *source, psKernel *convolution, double background, double norm, int index) { 463 481 464 if (!pmVisual IsVisual()) return true;482 if (!pmVisualTestLevel("ppsub.stamp", 1)) return true; 465 483 466 484 double sum; … … 543 561 } 544 562 545 if (!pmVisualIsVisual()) return true; 563 if (!pmVisualTestLevel("ppsub.fit", 1)) return true; 564 546 565 if (!pmVisualInitWindow(&kapa1, "ppSub:Images")) return false; 547 566 if (!pmVisualInitWindow(&kapa2, "ppSub:Misc")) return false; … … 605 624 Graphdata graphdata; 606 625 607 if (!pmVisualIsVisual()) return true; 626 if (!pmVisualTestLevel("ppsub.fit", 1)) return true; 627 608 628 if (!pmVisualInitWindow(&kapa3, "ppSub:plots")) return false; 609 629 -
branches/sc_branches/trunkTest/psModules/src/objects/Makefile.am
r28013 r29060 43 43 pmSourceIO_CMF_PS1_V1.c \ 44 44 pmSourceIO_CMF_PS1_V2.c \ 45 pmSourceIO_CMF_PS1_V3.c \ 45 46 pmSourceIO_CMF_PS1_SV1.c \ 46 47 pmSourceIO_CMF_PS1_DV1.c \ 48 pmSourceIO_CMF_PS1_DV2.c \ 47 49 pmSourceIO_MatchedRefs.c \ 48 50 pmSourcePlots.c \ … … 60 62 pmPSFtryFitPSF.c \ 61 63 pmPSFtryMetric.c \ 64 pmPCMdata.c \ 65 pmPCM_MinimizeChisq.c \ 66 pmSourceFitPCM.c \ 62 67 pmTrend2D.c \ 63 68 pmGrowthCurveGenerate.c \ … … 71 76 models/pmModel_QGAUSS.c \ 72 77 models/pmModel_RGAUSS.c \ 73 models/pmModel_SERSIC.c 78 models/pmModel_SERSIC.c \ 79 models/pmModel_EXP.c \ 80 models/pmModel_DEV.c 74 81 75 82 pkginclude_HEADERS = \ … … 80 87 pmPeaks.h \ 81 88 pmMoments.h \ 89 pmModelFuncs.h \ 82 90 pmModel.h \ 83 91 pmModelClass.h \ … … 101 109 pmPSF_IO.h \ 102 110 pmPSFtry.h \ 111 pmPCMdata.h \ 103 112 pmTrend2D.h \ 104 113 pmGrowthCurve.h \ … … 111 120 models/pmModel_QGAUSS.h \ 112 121 models/pmModel_RGAUSS.h \ 113 models/pmModel_SERSIC.h 122 models/pmModel_SERSIC.h \ 123 models/pmModel_EXP.h \ 124 models/pmModel_DEV.h 114 125 115 126 CLEANFILES = *~ -
branches/sc_branches/trunkTest/psModules/src/objects/models/pmModel_GAUSS.c
r26916 r29060 21 21 #include <stdio.h> 22 22 #include <pslib.h> 23 23 #include "pmHDU.h" 24 #include "pmFPA.h" 25 26 #include "pmTrend2D.h" 27 #include "pmResiduals.h" 28 #include "pmGrowthCurve.h" 29 #include "pmSpan.h" 30 #include "pmFootprintSpans.h" 31 #include "pmFootprint.h" 32 #include "pmPeaks.h" 24 33 #include "pmMoments.h" 25 #include "pmPeaks.h" 34 #include "pmModelFuncs.h" 35 #include "pmModel.h" 36 #include "pmModelUtils.h" 37 #include "pmModelClass.h" 38 #include "pmSourceMasks.h" 39 #include "pmSourceExtendedPars.h" 40 #include "pmSourceDiffStats.h" 26 41 #include "pmSource.h" 27 #include "pmModel.h" 42 #include "pmSourceFitModel.h" 43 #include "pmPSF.h" 44 #include "pmPSFtry.h" 45 #include "pmDetections.h" 46 28 47 #include "pmModel_GAUSS.h" 29 48 49 # define PM_MODEL_NPARAM 7 30 50 # define PM_MODEL_FUNC pmModelFunc_GAUSS 31 51 # define PM_MODEL_FLUX pmModelFlux_GAUSS … … 83 103 dPAR[PM_PAR_XPOS] = q*(2*px/PAR[PM_PAR_SXX] + Y*PAR[PM_PAR_SXY]); 84 104 dPAR[PM_PAR_YPOS] = q*(2*py/PAR[PM_PAR_SYY] + X*PAR[PM_PAR_SXY]); 105 85 106 // the extra factor of 2 below is needed to avoid excessive swings 86 107 dPAR[PM_PAR_SXX] = +4.0*q*px*px/PAR[PM_PAR_SXX]; … … 102 123 return true; 103 124 } 104 psAssert(nParam >= 0 && nParam < = PM_PAR_7, "Parameter index is out of bounds");125 psAssert(nParam >= 0 && nParam < PM_MODEL_NPARAM, "Parameter index is out of bounds"); 105 126 106 127 // we need to calculate the limits for SXY specially … … 347 368 // this test is invalid if the parameters are derived 348 369 // from the PSF model 370 // XXX how is this used? it prevents forced photometry from ever being 'successful' 349 371 bool PM_MODEL_FIT_STATUS (pmModel *model) 350 372 { … … 394 416 return; 395 417 } 396 397 # undef PM_MODEL_FUNC398 # undef PM_MODEL_FLUX399 # undef PM_MODEL_GUESS400 # undef PM_MODEL_LIMITS401 # undef PM_MODEL_RADIUS402 # undef PM_MODEL_FROM_PSF403 # undef PM_MODEL_PARAMS_FROM_PSF404 # undef PM_MODEL_FIT_STATUS405 # undef PM_MODEL_SET_LIMITS -
branches/sc_branches/trunkTest/psModules/src/objects/models/pmModel_PGAUSS.c
r27565 r29060 21 21 #include <stdio.h> 22 22 #include <pslib.h> 23 23 #include "pmHDU.h" 24 #include "pmFPA.h" 25 26 #include "pmTrend2D.h" 27 #include "pmResiduals.h" 28 #include "pmGrowthCurve.h" 29 #include "pmSpan.h" 30 #include "pmFootprintSpans.h" 31 #include "pmFootprint.h" 32 #include "pmPeaks.h" 24 33 #include "pmMoments.h" 25 #include "pmPeaks.h" 34 #include "pmModelFuncs.h" 35 #include "pmModel.h" 36 #include "pmModelUtils.h" 37 #include "pmModelClass.h" 38 #include "pmSourceMasks.h" 39 #include "pmSourceExtendedPars.h" 40 #include "pmSourceDiffStats.h" 26 41 #include "pmSource.h" 27 #include "pmModel.h" 42 #include "pmSourceFitModel.h" 43 #include "pmPSF.h" 44 #include "pmPSFtry.h" 45 #include "pmDetections.h" 46 28 47 #include "pmModel_PGAUSS.h" 29 48 49 # define PM_MODEL_NPARAM 7 30 50 # define PM_MODEL_FUNC pmModelFunc_PGAUSS 31 51 # define PM_MODEL_FLUX pmModelFlux_PGAUSS … … 103 123 return true; 104 124 } 105 psAssert(nParam >= 0 && nParam < = PM_PAR_7, "Parameter index is out of bounds");125 psAssert(nParam >= 0 && nParam < PM_MODEL_NPARAM, "Parameter index is out of bounds"); 106 126 107 127 // we need to calculate the limits for SXY specially … … 448 468 return; 449 469 } 450 451 # undef PM_MODEL_FUNC452 # undef PM_MODEL_FLUX453 # undef PM_MODEL_GUESS454 # undef PM_MODEL_LIMITS455 # undef PM_MODEL_RADIUS456 # undef PM_MODEL_FROM_PSF457 # undef PM_MODEL_PARAMS_FROM_PSF458 # undef PM_MODEL_FIT_STATUS459 # undef PM_MODEL_SET_LIMITS -
branches/sc_branches/trunkTest/psModules/src/objects/models/pmModel_PS1_V1.c
r27565 r29060 22 22 #include <stdio.h> 23 23 #include <pslib.h> 24 24 #include "pmHDU.h" 25 #include "pmFPA.h" 26 27 #include "pmTrend2D.h" 28 #include "pmResiduals.h" 29 #include "pmGrowthCurve.h" 30 #include "pmSpan.h" 31 #include "pmFootprintSpans.h" 32 #include "pmFootprint.h" 33 #include "pmPeaks.h" 25 34 #include "pmMoments.h" 26 #include "pmPeaks.h" 35 #include "pmModelFuncs.h" 36 #include "pmModel.h" 37 #include "pmModelUtils.h" 38 #include "pmModelClass.h" 39 #include "pmSourceMasks.h" 40 #include "pmSourceExtendedPars.h" 41 #include "pmSourceDiffStats.h" 27 42 #include "pmSource.h" 28 #include "pmModel.h" 43 #include "pmSourceFitModel.h" 44 #include "pmPSF.h" 45 #include "pmPSFtry.h" 46 #include "pmDetections.h" 47 29 48 #include "pmModel_PS1_V1.h" 30 49 50 # define PM_MODEL_NPARAM 8 31 51 # define PM_MODEL_FUNC pmModelFunc_PS1_V1 32 52 # define PM_MODEL_FLUX pmModelFlux_PS1_V1 … … 122 142 return true; 123 143 } 124 psAssert(nParam >= 0 && nParam < = PM_PAR_7, "Parameter index is out of bounds");144 psAssert(nParam >= 0 && nParam < PM_MODEL_NPARAM, "Parameter index is out of bounds"); 125 145 126 146 // we need to calculate the limits for SXY specially … … 222 242 PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*shape.sy); 223 243 PAR[PM_PAR_SXY] = shape.sxy; 224 PAR[PM_PAR_7] = 1.0;244 PAR[PM_PAR_7] = 0.5; 225 245 226 246 return(true); … … 468 488 return; 469 489 } 470 471 # undef PM_MODEL_FUNC472 # undef PM_MODEL_FLUX473 # undef PM_MODEL_GUESS474 # undef PM_MODEL_LIMITS475 # undef PM_MODEL_RADIUS476 # undef PM_MODEL_FROM_PSF477 # undef PM_MODEL_PARAMS_FROM_PSF478 # undef PM_MODEL_FIT_STATUS479 # undef PM_MODEL_SET_LIMITS480 # undef ALPHA481 # undef ALPHA_M -
branches/sc_branches/trunkTest/psModules/src/objects/models/pmModel_QGAUSS.c
r27565 r29060 22 22 #include <stdio.h> 23 23 #include <pslib.h> 24 24 #include "pmHDU.h" 25 #include "pmFPA.h" 26 27 #include "pmTrend2D.h" 28 #include "pmResiduals.h" 29 #include "pmGrowthCurve.h" 30 #include "pmSpan.h" 31 #include "pmFootprintSpans.h" 32 #include "pmFootprint.h" 33 #include "pmPeaks.h" 25 34 #include "pmMoments.h" 26 #include "pmPeaks.h" 35 #include "pmModelFuncs.h" 36 #include "pmModel.h" 37 #include "pmModelUtils.h" 38 #include "pmModelClass.h" 39 #include "pmSourceMasks.h" 40 #include "pmSourceExtendedPars.h" 41 #include "pmSourceDiffStats.h" 27 42 #include "pmSource.h" 28 #include "pmModel.h" 43 #include "pmSourceFitModel.h" 44 #include "pmPSF.h" 45 #include "pmPSFtry.h" 46 #include "pmDetections.h" 47 29 48 #include "pmModel_QGAUSS.h" 30 49 50 # define PM_MODEL_NPARAM 8 31 51 # define PM_MODEL_FUNC pmModelFunc_QGAUSS 32 52 # define PM_MODEL_FLUX pmModelFlux_QGAUSS … … 123 143 return true; 124 144 } 125 psAssert(nParam >= 0 && nParam < = PM_PAR_7, "Parameter index is out of bounds");145 psAssert(nParam >= 0 && nParam < PM_MODEL_NPARAM, "Parameter index is out of bounds"); 126 146 127 147 // we need to calculate the limits for SXY specially … … 469 489 return; 470 490 } 471 472 # undef PM_MODEL_FUNC473 # undef PM_MODEL_FLUX474 # undef PM_MODEL_GUESS475 # undef PM_MODEL_LIMITS476 # undef PM_MODEL_RADIUS477 # undef PM_MODEL_FROM_PSF478 # undef PM_MODEL_PARAMS_FROM_PSF479 # undef PM_MODEL_FIT_STATUS480 # undef PM_MODEL_SET_LIMITS481 # undef ALPHA482 # undef ALPHA_M -
branches/sc_branches/trunkTest/psModules/src/objects/models/pmModel_RGAUSS.c
r27565 r29060 22 22 #include <stdio.h> 23 23 #include <pslib.h> 24 24 #include "pmHDU.h" 25 #include "pmFPA.h" 26 27 #include "pmTrend2D.h" 28 #include "pmResiduals.h" 29 #include "pmGrowthCurve.h" 30 #include "pmSpan.h" 31 #include "pmFootprintSpans.h" 32 #include "pmFootprint.h" 33 #include "pmPeaks.h" 25 34 #include "pmMoments.h" 26 #include "pmPeaks.h" 35 #include "pmModelFuncs.h" 36 #include "pmModel.h" 37 #include "pmModelUtils.h" 38 #include "pmModelClass.h" 39 #include "pmSourceMasks.h" 40 #include "pmSourceExtendedPars.h" 41 #include "pmSourceDiffStats.h" 27 42 #include "pmSource.h" 28 #include "pmModel.h" 43 #include "pmSourceFitModel.h" 44 #include "pmPSF.h" 45 #include "pmPSFtry.h" 46 #include "pmDetections.h" 47 29 48 #include "pmModel_RGAUSS.h" 30 49 50 # define PM_MODEL_NPARAM 8 31 51 # define PM_MODEL_FUNC pmModelFunc_RGAUSS 32 52 # define PM_MODEL_FLUX pmModelFlux_RGAUSS … … 112 132 return true; 113 133 } 114 psAssert(nParam >= 0 && nParam < = PM_PAR_7, "Parameter index is out of bounds");134 psAssert(nParam >= 0 && nParam < PM_MODEL_NPARAM, "Parameter index is out of bounds"); 115 135 116 136 // we need to calculate the limits for SXY specially … … 209 229 PAR[PM_PAR_XPOS] = peak->xf; 210 230 PAR[PM_PAR_YPOS] = peak->yf; 211 PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*shape.sx);212 PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*shape.sy);231 PAR[PM_PAR_SXX] = PS_MAX(0.5, shape.sx); 232 PAR[PM_PAR_SYY] = PS_MAX(0.5, shape.sy); 213 233 PAR[PM_PAR_SXY] = shape.sxy; 214 PAR[PM_PAR_7] = 2.25;234 PAR[PM_PAR_7] = 1.5; 215 235 216 236 return(true); … … 463 483 return; 464 484 } 465 466 # undef PM_MODEL_FUNC467 # undef PM_MODEL_FLUX468 # undef PM_MODEL_GUESS469 # undef PM_MODEL_LIMITS470 # undef PM_MODEL_RADIUS471 # undef PM_MODEL_FROM_PSF472 # undef PM_MODEL_PARAMS_FROM_PSF473 # undef PM_MODEL_FIT_STATUS474 # undef PM_MODEL_SET_LIMITS -
branches/sc_branches/trunkTest/psModules/src/objects/models/pmModel_SERSIC.c
r26916 r29060 18 18 * PM_PAR_7 7 - normalized sersic parameter 19 19 20 note that a standard sersic model uses exp(-K*(z^(1/ n) - 1). the additional elements (K,20 note that a standard sersic model uses exp(-K*(z^(1/2n) - 1). the additional elements (K, 21 21 the -1 offset) are absorbed in this model by the normalization, the exponent, and the 22 22 radial scale. We fit the elements in this form, then re-normalize them on output. … … 25 25 #include <stdio.h> 26 26 #include <pslib.h> 27 27 #include "pmHDU.h" 28 #include "pmFPA.h" 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 35 #include "pmFootprint.h" 36 #include "pmPeaks.h" 28 37 #include "pmMoments.h" 29 #include "pmPeaks.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 30 45 #include "pmSource.h" 31 #include "pmModel.h" 46 #include "pmSourceFitModel.h" 47 #include "pmPSF.h" 48 #include "pmPSFtry.h" 49 #include "pmDetections.h" 50 32 51 #include "pmModel_SERSIC.h" 33 52 53 # define PM_MODEL_NPARAM 8 34 54 # define PM_MODEL_FUNC pmModelFunc_SERSIC 35 55 # define PM_MODEL_FLUX pmModelFlux_SERSIC … … 47 67 48 68 // Lax parameter limits 49 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.0 5, 0.05, -1.0, 0.05 };69 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.001, 0.001, -1.0, 0.05 }; 50 70 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 4.0 }; 51 71 … … 84 104 assert (z >= 0); 85 105 86 psF32 f2 = pow(z,PAR[PM_PAR_7]); 87 psF32 f1 = exp(-f2); 106 float index = 0.5 / PAR[PM_PAR_7]; 107 float bn = 1.9992*index - 0.3271; 108 float Io = exp(bn); 109 110 psF32 f2 = bn*pow(z,PAR[PM_PAR_7]); 111 psF32 f1 = Io*exp(-f2); 88 112 psF32 z0 = PAR[PM_PAR_I0]*f1; 89 113 psF32 f0 = PAR[PM_PAR_SKY] + z0; … … 98 122 99 123 // gradient is infinite for z = 0; saturate at z = 0.01 100 psF32 z1 = (z < 0.01) ? z0* PAR[PM_PAR_7]*pow(0.01,PAR[PM_PAR_7] - 1.0) : z0*PAR[PM_PAR_7]*pow(z,PAR[PM_PAR_7] - 1.0);124 psF32 z1 = (z < 0.01) ? z0*bn*PAR[PM_PAR_7]*pow(0.01,PAR[PM_PAR_7] - 1.0) : z0*bn*PAR[PM_PAR_7]*pow(z,PAR[PM_PAR_7] - 1.0); 101 125 102 126 dPAR[PM_PAR_SKY] = +1.0; 103 127 dPAR[PM_PAR_I0] = +f1; 104 dPAR[PM_PAR_7] = (z == 0.0) ? 0.0 : -z0*f2*log(z); 128 dPAR[PM_PAR_7] = (z < 0.01) ? -z0*pow(0.01,PAR[PM_PAR_7])*log(0.01) : -z0*f2*log(z); 129 dPAR[PM_PAR_7] *= 3.0; 105 130 106 131 assert (isfinite(z1)); … … 109 134 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0*px/PAR[PM_PAR_SXX] + Y*PAR[PM_PAR_SXY]); 110 135 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0*py/PAR[PM_PAR_SYY] + X*PAR[PM_PAR_SXY]); 111 dPAR[PM_PAR_SXX] = +2.0*z1*px*px/PAR[PM_PAR_SXX]; 136 dPAR[PM_PAR_SXX] = +2.0*z1*px*px/PAR[PM_PAR_SXX]; // XXX : increase drag? 112 137 dPAR[PM_PAR_SYY] = +2.0*z1*py*py/PAR[PM_PAR_SYY]; 113 dPAR[PM_PAR_SXY] = -1.0*z1*X*Y;114 138 dPAR[PM_PAR_SXY] = -1.0*z1*X*Y; 115 139 } … … 127 151 return true; 128 152 } 129 psAssert(nParam >= 0 && nParam < = PM_PAR_7, "Parameter index is out of bounds");153 psAssert(nParam >= 0 && nParam < PM_MODEL_NPARAM, "Parameter index is out of bounds"); 130 154 131 155 // we need to calculate the limits for SXY specially … … 201 225 psF32 *PAR = model->params->data.F32; 202 226 227 // the other parameters depend on the guess for PAR_7 228 if (!isfinite(PAR[PM_PAR_7])) { 229 PAR[PM_PAR_7] = 0.25; 230 } 231 float index = 0.5 / PAR[PM_PAR_7]; 232 233 // the scale-length is a function of the moments and the index: 234 // Rmajor_guess = Rmajor_moments * Scale * Zero 235 float Scale = 0.70 + 0.053 * PAR[PM_PAR_7]; 236 float Zero = 1.16 - 0.615 * PAR[PM_PAR_7]; 237 203 238 psEllipseMoments emoments; 204 239 emoments.x2 = moments->Mxx; … … 213 248 if (!isfinite(axes.theta)) return false; 214 249 250 // set a lower limit to avoid absurd solutions.. 251 float Rmajor = PS_MAX(1.0, Scale * axes.major + Zero); 252 float Rminor = Rmajor * (axes.minor / axes.major); 253 254 // fprintf (stderr, "guess index: %f : %f, %f -> %f, %f\n", index, axes.major, axes.minor, Rmajor, Rminor); 255 256 axes.major = Rmajor; 257 axes.minor = Rminor; 215 258 psEllipseShape shape = psEllipseAxesToShape (axes); 216 259 … … 219 262 if (!isfinite(shape.sxy)) return false; 220 263 264 float bn = 1.9992*index - 0.3271; 265 // float fR = 1.0 / (sqrt(2.0) * pow (bn, index)); 266 float Io = exp(0.5*bn); 267 268 // XXX do we need this factor of sqrt(2)? 269 // float Sxx = PS_MAX(0.5, M_SQRT2*shape.sx); 270 // float Syy = PS_MAX(0.5, M_SQRT2*shape.sy); 271 272 float Sxx = PS_MAX(0.5, shape.sx); 273 float Syy = PS_MAX(0.5, shape.sy); 274 221 275 PAR[PM_PAR_SKY] = 0.0; 222 PAR[PM_PAR_I0] = peak->flux ;276 PAR[PM_PAR_I0] = peak->flux / Io; 223 277 PAR[PM_PAR_XPOS] = peak->xf; 224 278 PAR[PM_PAR_YPOS] = peak->yf; 225 PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*shape.sx);226 PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*shape.sy);279 PAR[PM_PAR_SXX] = Sxx; 280 PAR[PM_PAR_SYY] = Syy; 227 281 PAR[PM_PAR_SXY] = shape.sxy; 228 PAR[PM_PAR_7] = 0.5;229 282 230 283 return(true); … … 254 307 float f1, f2; 255 308 for (z = DZ; z < 50; z += DZ) { 256 f1 = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25)); 309 // f1 = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25)); 310 f1 = exp(-pow(z,PAR[PM_PAR_7])); 257 311 z += DZ; 258 f2 = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25));312 f2 = exp(-pow(z,PAR[PM_PAR_7])); 259 313 norm += f0 + 4*f1 + f2; 260 314 f0 = f2; … … 287 341 288 342 psEllipseAxes axes = psEllipseShapeToAxes (shape, 20.0); 289 psF64 sigma = axes.major; 290 291 psF64 limit = flux / PAR[PM_PAR_I0]; 292 293 psF64 z = pow (-log(limit), (1.0 / PAR[PM_PAR_7])); 294 psAssert (isfinite(z), "fix this code: z should not be nan for %f", PAR[PM_PAR_7]); 295 296 psF64 radius = sigma * sqrt (2.0 * z); 297 psAssert (isfinite(radius), "fix this code: radius should not be nan for %f, %f", PAR[PM_PAR_7], sigma); 298 299 if (isnan(radius)) 300 psAbort("error in code: radius is NaN"); 301 343 344 // f = Io exp(-z^n) -> z^n = ln(Io/f) 345 psF64 zn = log(PAR[PM_PAR_I0] / flux); 346 psF64 radius = axes.major * sqrt (2.0) * pow(zn, 0.5 / PAR[PM_PAR_7]); 347 348 // fprintf (stderr, "sersic model %f %f, n %f, radius: %f, zn: %f, f/Io: %f, major: %f\n", PAR[PM_PAR_XPOS], PAR[PM_PAR_YPOS], PAR[PM_PAR_7], radius, zn, flux/PAR[PM_PAR_I0], axes.major); 349 350 psAssert (isfinite(radius), "fix this code: z should not be nan for %f", PAR[PM_PAR_7]); 302 351 return (radius); 303 352 } … … 448 497 return; 449 498 } 450 451 # undef PM_MODEL_FUNC452 # undef PM_MODEL_FLUX453 # undef PM_MODEL_GUESS454 # undef PM_MODEL_LIMITS455 # undef PM_MODEL_RADIUS456 # undef PM_MODEL_FROM_PSF457 # undef PM_MODEL_PARAMS_FROM_PSF458 # undef PM_MODEL_FIT_STATUS459 # undef PM_MODEL_SET_LIMITS -
branches/sc_branches/trunkTest/psModules/src/objects/pmDetEff.c
r25477 r29060 3 3 #endif 4 4 5 #include <string.h> 5 6 #include <pslib.h> 7 #include "pmHDU.h" 8 #include "pmFPA.h" 6 9 10 #include "pmTrend2D.h" 11 #include "pmResiduals.h" 12 #include "pmGrowthCurve.h" 13 #include "pmSpan.h" 14 #include "pmFootprintSpans.h" 15 #include "pmFootprint.h" 16 #include "pmPeaks.h" 17 #include "pmMoments.h" 18 #include "pmModelFuncs.h" 19 #include "pmModel.h" 20 #include "pmModelUtils.h" 21 #include "pmModelClass.h" 22 #include "pmSourceMasks.h" 23 #include "pmSourceExtendedPars.h" 24 #include "pmSourceDiffStats.h" 25 #include "pmSource.h" 26 #include "pmSourceFitModel.h" 27 #include "pmPSF.h" 28 #include "pmPSFtry.h" 29 #include "pmDetections.h" 7 30 #include "pmDetEff.h" 8 9 31 10 32 static void detEffFree(pmDetEff *de) -
branches/sc_branches/trunkTest/psModules/src/objects/pmDetEff.h
r25383 r29060 1 1 #ifndef PM_DET_EFF_H 2 2 #define PM_DET_EFF_H 3 4 #include <pslib.h>5 #include <string.h>6 7 #include "pmFPA.h"8 3 9 4 #define PM_DETEFF_ANALYSIS "DETEFF" // Location of detection efficiency on pmReadout.analysis -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprint.c
r27672 r29060 19 19 #include <pslib.h> 20 20 #include "pmSpan.h" 21 #include "pmFootprintSpans.h" 21 22 #include "pmFootprint.h" 22 23 #include "pmPeaks.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprint.h
r27672 r29060 10 10 #ifndef PM_FOOTPRINT_H 11 11 #define PM_FOOTPRINT_H 12 13 #include <pslib.h>14 #include "pmSpan.h"15 #include "pmFootprintSpans.h"16 12 17 13 typedef struct { -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprintArrayGrow.c
r21183 r29060 18 18 #include <pslib.h> 19 19 #include "pmSpan.h" 20 #include "pmFootprintSpans.h" 20 21 #include "pmFootprint.h" 21 22 #include "pmPeaks.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprintArraysMerge.c
r24274 r29060 18 18 #include <pslib.h> 19 19 #include "pmSpan.h" 20 #include "pmFootprintSpans.h" 20 21 #include "pmFootprint.h" 21 22 #include "pmPeaks.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprintAssignPeaks.c
r20937 r29060 18 18 #include <pslib.h> 19 19 #include "pmSpan.h" 20 #include "pmFootprintSpans.h" 20 21 #include "pmFootprint.h" 21 22 #include "pmPeaks.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprintCullPeaks.c
r27672 r29060 19 19 #include <pslib.h> 20 20 #include "pmSpan.h" 21 #include "pmFootprintSpans.h" 21 22 #include "pmFootprint.h" 22 #include "pmFootprintSpans.h"23 23 #include "pmPeaks.h" 24 24 -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprintFind.c
r20937 r29060 19 19 #include <pslib.h> 20 20 #include "pmSpan.h" 21 #include "pmFootprintSpans.h" 21 22 #include "pmFootprint.h" 22 23 #include "pmPeaks.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprintFindAtPoint.c
r27672 r29060 19 19 #include <pslib.h> 20 20 #include "pmSpan.h" 21 #include "pmFootprintSpans.h" 21 22 #include "pmFootprint.h" 22 23 #include "pmPeaks.h" 23 #include "pmFootprintSpans.h"24 24 25 25 /************************************************************************************************************/ -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprintIDs.c
r27672 r29060 19 19 #include <pslib.h> 20 20 #include "pmSpan.h" 21 #include "pmFootprintSpans.h" 21 22 #include "pmFootprint.h" 22 23 #include "pmPeaks.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprintSpans.c
r27672 r29060 19 19 #include <pslib.h> 20 20 #include "pmSpan.h" 21 #include "pmFootprintSpans.h" 21 22 #include "pmFootprint.h" 22 23 #include "pmPeaks.h" 23 #include "pmFootprintSpans.h"24 24 25 25 static void pmStartSpanFree(pmStartSpan *sspan) { -
branches/sc_branches/trunkTest/psModules/src/objects/pmFootprintSpans.h
r27672 r29060 10 10 #ifndef PM_FOOTPRINT_SPANS_H 11 11 #define PM_FOOTPRINT_SPANS_H 12 13 #include <pslib.h>14 #include "pmSpan.h"15 12 16 13 /* We define two helper structures used in building the pmFootprints: -
branches/sc_branches/trunkTest/psModules/src/objects/pmGrowthCurve.c
r20937 r29060 20 20 #include "pmHDU.h" 21 21 #include "pmFPA.h" 22 23 #include "pmTrend2D.h" 24 #include "pmResiduals.h" 25 #include "pmGrowthCurve.h" 22 26 #include "pmSpan.h" 27 #include "pmFootprintSpans.h" 23 28 #include "pmFootprint.h" 24 29 #include "pmPeaks.h" 25 30 #include "pmMoments.h" 26 #include "pmResiduals.h" 27 #include "pmGrowthCurve.h" 28 #include "pmTrend2D.h" 31 #include "pmModelFuncs.h" 32 #include "pmModel.h" 33 #include "pmModelUtils.h" 34 #include "pmModelClass.h" 35 #include "pmSourceMasks.h" 36 #include "pmSourceExtendedPars.h" 37 #include "pmSourceDiffStats.h" 38 #include "pmSource.h" 39 #include "pmSourceFitModel.h" 29 40 #include "pmPSF.h" 30 #include "pmModel.h" 31 #include "pmSource.h" 41 #include "pmPSFtry.h" 42 #include "pmDetections.h" 43 32 44 #include "psVectorBracket.h" 33 45 -
branches/sc_branches/trunkTest/psModules/src/objects/pmGrowthCurveGenerate.c
r27531 r29060 24 24 #include "pmHDU.h" 25 25 #include "pmFPA.h" 26 #include "pmFPAMaskWeight.h" 27 #include "psVectorBracket.h" 28 #include "pmErrorCodes.h" 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 26 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 27 35 #include "pmFootprint.h" 28 36 #include "pmPeaks.h" 29 37 #include "pmMoments.h" 30 #include "pmResiduals.h" 31 #include "pmGrowthCurve.h" 32 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 33 47 #include "pmPSF.h" 34 #include "pmModel.h" 35 #include "pmSource.h" 36 #include "pmModelClass.h" 37 #include "pmModelUtils.h" 48 #include "pmPSFtry.h" 49 #include "pmDetections.h" 50 38 51 #include "pmSourcePhotometry.h" 39 #include "pmFPAMaskWeight.h"40 #include "psVectorBracket.h"41 #include "pmErrorCodes.h"42 52 43 53 pmGrowthCurve *pmGrowthCurveForPosition (psImage *image, pmPSF *psf, bool ignore, psImageMaskType maskVal, psImageMaskType markVal, float xc, float yc); -
branches/sc_branches/trunkTest/psModules/src/objects/pmModel.c
r25754 r29060 23 23 #include "pmHDU.h" 24 24 #include "pmFPA.h" 25 26 #include "pmTrend2D.h" 25 27 #include "pmResiduals.h" 26 28 #include "pmGrowthCurve.h" 27 #include "pmTrend2D.h" 28 #include "pmPSF.h" 29 #include "pmSpan.h" 30 #include "pmFootprintSpans.h" 31 #include "pmFootprint.h" 32 #include "pmPeaks.h" 33 #include "pmMoments.h" 34 #include "pmModelFuncs.h" 29 35 #include "pmModel.h" 30 36 #include "pmModelClass.h" … … 75 81 76 82 for (psS32 i = 0; i < tmp->params->n; i++) { 77 tmp->params->data.F32[i] = 0.0;78 tmp->dparams->data.F32[i] = 0.0;83 tmp->params->data.F32[i] = NAN; 84 tmp->dparams->data.F32[i] = NAN; 79 85 } 80 86 -
branches/sc_branches/trunkTest/psModules/src/objects/pmModel.h
r26916 r29060 14 14 # define PM_MODEL_H 15 15 16 #include <pslib.h>17 #include "pmPSF.h"18 19 16 /// @addtogroup Objects Object Detection / Analysis Functions 20 17 /// @{ … … 22 19 /* pointers for the functions types below are supplied to each pmModel, and can be used by 23 20 the programmer without needing to know the model class */ 24 25 typedef enum {26 PM_MODEL_STATUS_NONE = 0x00, ///< model fit not yet attempted, no other info27 PM_MODEL_STATUS_FITTED = 0x01, ///< model fit completed28 PM_MODEL_STATUS_NONCONVERGE = 0x02, ///< model fit did not converge29 PM_MODEL_STATUS_OFFIMAGE = 0x04, ///< model fit drove out of range30 PM_MODEL_STATUS_BADARGS = 0x08, ///< model fit called with invalid args31 PM_MODEL_STATUS_LIMITS = 0x10 ///< model parameters hit limits32 } pmModelStatus;33 34 typedef enum {35 PM_MODEL_OP_NONE = 0x00,36 PM_MODEL_OP_FUNC = 0x01,37 PM_MODEL_OP_RES0 = 0x02,38 PM_MODEL_OP_RES1 = 0x04,39 PM_MODEL_OP_FULL = 0x07,40 PM_MODEL_OP_SKY = 0x08,41 PM_MODEL_OP_CENTER = 0x10,42 PM_MODEL_OP_NORM = 0x20,43 PM_MODEL_OP_NOISE = 0x40,44 } pmModelOpMode;45 46 /// Parameter limit types47 typedef enum {48 PM_MODEL_LIMITS_NONE, ///< Apply no limits: suitable for debugging49 PM_MODEL_LIMITS_IGNORE, ///< Ignore all limits: fit can go to town50 PM_MODEL_LIMITS_LAX, ///< Lax limits: attempting to reproduce even bad data51 PM_MODEL_LIMITS_MODERATE, ///< Moderate limits: cope with mildly bad data52 PM_MODEL_LIMITS_STRICT, ///< Strict limits: insist on good quality data53 } pmModelLimitsType;54 55 typedef struct pmModel pmModel;56 typedef struct pmSource pmSource;57 58 // This function is the model chi-square minimization function for this model.59 typedef psMinimizeLMChi2Func pmModelFunc;60 61 // This function sets the parameter limits for this model.62 typedef psMinimizeLMLimitFunc pmModelLimits;63 64 // This function returns the integrated flux for the given model parameters.65 typedef psF64 (*pmModelFlux)(const psVector *params);66 67 // This function returns the radius at which the given model and parameters68 // achieves the given flux.69 typedef psF64 (*pmModelRadius)(const psVector *params, double flux);70 71 // This function provides the model guess parameters based on the details of72 // the given source.73 typedef bool (*pmModelGuessFunc)(pmModel *model, pmSource *source);74 75 // This function constructs the PSF model for the given source based on the76 // supplied psf and the EXT model for the object.77 typedef bool (*pmModelFromPSFFunc)(pmModel *modelPSF, pmModel *modelEXT, const pmPSF *psf);78 79 // This function sets the model parameters based on the PSF for a given coordinate and central80 // intensity81 typedef bool (*pmModelParamsFromPSF)(pmModel *model, const pmPSF *psf, float Xo, float Yo, float Io);82 83 // This function returns the success / failure status of the given model fit84 typedef bool (*pmModelFitStatusFunc)(pmModel *model);85 86 // This function sets the parameter limits for the given model87 typedef bool (*pmModelSetLimitsFunc)(pmModelLimitsType type);88 21 89 22 /** pmModel data structure … … 122 55 pmModelSetLimitsFunc modelSetLimits; 123 56 }; 124 125 /** Symbolic names for the elements of [d]params126 * Note: these are #defines not enums as a given element of [d]params127 * may/will correspond to different parameters in different contexts128 */129 #define PM_PAR_SKY 0 ///< Sky130 #define PM_PAR_I0 1 ///< Central intensity131 #define PM_PAR_XPOS 2 ///< X centre of object132 #define PM_PAR_YPOS 3 ///< Y centre of object133 #define PM_PAR_SXX 4 ///< shape X^2 moment134 #define PM_PAR_SYY 5 ///< shape Y^2 moment135 #define PM_PAR_SXY 6 ///< shape XY moment136 #define PM_PAR_7 7 ///< ??? Unknown parameter137 #define PM_PAR_8 8 ///< ??? Unknown parameter138 57 139 58 /** pmModelAlloc() -
branches/sc_branches/trunkTest/psModules/src/objects/pmModelClass.c
r25754 r29060 23 23 #include "pmHDU.h" 24 24 #include "pmFPA.h" 25 26 #include "pmTrend2D.h" 27 #include "pmResiduals.h" 28 #include "pmGrowthCurve.h" 25 29 #include "pmSpan.h" 30 #include "pmFootprintSpans.h" 26 31 #include "pmFootprint.h" 27 32 #include "pmPeaks.h" 28 33 #include "pmMoments.h" 29 #include "pmResiduals.h" 30 #include "pmGrowthCurve.h" 31 #include "pmTrend2D.h" 32 #include "pmPSF.h" 34 #include "pmModelFuncs.h" 33 35 #include "pmModel.h" 34 #include "pm Source.h"36 #include "pmModelUtils.h" 35 37 #include "pmModelClass.h" 38 36 39 #include "pmErrorCodes.h" 37 40 … … 46 49 # include "models/pmModel_RGAUSS.h" 47 50 # include "models/pmModel_SERSIC.h" 51 # include "models/pmModel_EXP.h" 52 # include "models/pmModel_DEV.h" 48 53 49 54 static pmModelClass defaultModels[] = { … … 53 58 {"PS_MODEL_PS1_V1", 8, (pmModelFunc)pmModelFunc_PS1_V1, (pmModelFlux)pmModelFlux_PS1_V1, (pmModelRadius)pmModelRadius_PS1_V1, (pmModelLimits)pmModelLimits_PS1_V1, (pmModelGuessFunc)pmModelGuess_PS1_V1, (pmModelFromPSFFunc)pmModelFromPSF_PS1_V1, (pmModelParamsFromPSF)pmModelParamsFromPSF_PS1_V1, (pmModelFitStatusFunc)pmModelFitStatus_PS1_V1, (pmModelSetLimitsFunc)pmModelSetLimits_PS1_V1 }, 54 59 {"PS_MODEL_RGAUSS", 8, (pmModelFunc)pmModelFunc_RGAUSS, (pmModelFlux)pmModelFlux_RGAUSS, (pmModelRadius)pmModelRadius_RGAUSS, (pmModelLimits)pmModelLimits_RGAUSS, (pmModelGuessFunc)pmModelGuess_RGAUSS, (pmModelFromPSFFunc)pmModelFromPSF_RGAUSS, (pmModelParamsFromPSF)pmModelParamsFromPSF_RGAUSS, (pmModelFitStatusFunc)pmModelFitStatus_RGAUSS, (pmModelSetLimitsFunc)pmModelSetLimits_RGAUSS }, 55 {"PS_MODEL_SERSIC", 8, (pmModelFunc)pmModelFunc_SERSIC, (pmModelFlux)pmModelFlux_SERSIC, (pmModelRadius)pmModelRadius_SERSIC, (pmModelLimits)pmModelLimits_SERSIC, (pmModelGuessFunc)pmModelGuess_SERSIC, (pmModelFromPSFFunc)pmModelFromPSF_SERSIC, (pmModelParamsFromPSF)pmModelParamsFromPSF_SERSIC, (pmModelFitStatusFunc)pmModelFitStatus_SERSIC, (pmModelSetLimitsFunc)pmModelSetLimits_SERSIC } 60 {"PS_MODEL_SERSIC", 8, (pmModelFunc)pmModelFunc_SERSIC, (pmModelFlux)pmModelFlux_SERSIC, (pmModelRadius)pmModelRadius_SERSIC, (pmModelLimits)pmModelLimits_SERSIC, (pmModelGuessFunc)pmModelGuess_SERSIC, (pmModelFromPSFFunc)pmModelFromPSF_SERSIC, (pmModelParamsFromPSF)pmModelParamsFromPSF_SERSIC, (pmModelFitStatusFunc)pmModelFitStatus_SERSIC, (pmModelSetLimitsFunc)pmModelSetLimits_SERSIC }, 61 {"PS_MODEL_EXP", 7, (pmModelFunc)pmModelFunc_EXP, (pmModelFlux)pmModelFlux_EXP, (pmModelRadius)pmModelRadius_EXP, (pmModelLimits)pmModelLimits_EXP, (pmModelGuessFunc)pmModelGuess_EXP, (pmModelFromPSFFunc)pmModelFromPSF_EXP, (pmModelParamsFromPSF)pmModelParamsFromPSF_EXP, (pmModelFitStatusFunc)pmModelFitStatus_EXP, (pmModelSetLimitsFunc)pmModelSetLimits_EXP }, 62 {"PS_MODEL_DEV", 7, (pmModelFunc)pmModelFunc_DEV, (pmModelFlux)pmModelFlux_DEV, (pmModelRadius)pmModelRadius_DEV, (pmModelLimits)pmModelLimits_DEV, (pmModelGuessFunc)pmModelGuess_DEV, (pmModelFromPSFFunc)pmModelFromPSF_DEV, (pmModelParamsFromPSF)pmModelParamsFromPSF_DEV, (pmModelFitStatusFunc)pmModelFitStatus_DEV, (pmModelSetLimitsFunc)pmModelSetLimits_DEV }, 56 63 }; 57 64 -
branches/sc_branches/trunkTest/psModules/src/objects/pmModelClass.h
r25738 r29060 28 28 # ifndef PM_MODEL_CLASS_H 29 29 # define PM_MODEL_CLASS_H 30 31 #include <pmModel.h>32 30 33 31 /// @addtogroup Objects Object Detection / Analysis Functions -
branches/sc_branches/trunkTest/psModules/src/objects/pmModelUtils.c
r25754 r29060 22 22 #include "pmHDU.h" 23 23 #include "pmFPA.h" 24 25 #include "pmTrend2D.h" 24 26 #include "pmResiduals.h" 25 27 #include "pmGrowthCurve.h" 26 #include "pmTrend2D.h" 28 #include "pmSpan.h" 29 #include "pmFootprintSpans.h" 30 #include "pmFootprint.h" 31 #include "pmPeaks.h" 32 #include "pmMoments.h" 33 #include "pmModelFuncs.h" 34 #include "pmModel.h" 35 #include "pmModelUtils.h" 36 #include "pmModelClass.h" 37 #include "pmSourceMasks.h" 38 #include "pmSourceExtendedPars.h" 39 #include "pmSourceDiffStats.h" 40 #include "pmSource.h" 41 #include "pmSourceFitModel.h" 27 42 #include "pmPSF.h" 28 #include "pmModel.h" 43 29 44 #include "pmErrorCodes.h" 30 #include "pmModelUtils.h"31 45 32 46 /***************************************************************************** -
branches/sc_branches/trunkTest/psModules/src/objects/pmMoments.c
r24498 r29060 29 29 psTrace("psModules.objects", 10, "---- %s() begin ----\n", __func__); 30 30 pmMoments *tmp = (pmMoments *) psAlloc(sizeof(pmMoments)); 31 32 tmp->Mrf = 0.0; 33 tmp->Mrh = 0.0; 34 tmp->KronFlux = 0.0; 35 tmp->KronFluxErr = 0.0; 36 37 tmp->KronFinner = 0.0; 38 tmp->KronFouter = 0.0; 39 31 40 tmp->Mx = 0.0; 32 41 tmp->My = 0.0; -
branches/sc_branches/trunkTest/psModules/src/objects/pmMoments.h
r23487 r29060 24 24 typedef struct 25 25 { 26 float Mrf; ///< radial first moment 27 float Mrh; ///< radial half moment 28 26 29 float Mx; ///< X-coord of centroid. 27 30 float My; ///< Y-coord of centroid. … … 47 50 float SN; ///< approx signal-to-noise 48 51 int nPixels; ///< Number of pixels used. 52 53 float KronFlux; ///< Kron flux (flux in 2.5*Mrf) 54 float KronFluxErr; ///< Kron flux error 55 56 float KronFinner; ///< Kron flux (flux in 2.5*Mrf) 57 float KronFouter; ///< Kron flux (flux in 2.5*Mrf) 58 49 59 } 50 60 pmMoments; -
branches/sc_branches/trunkTest/psModules/src/objects/pmPSF.c
r26893 r29060 25 25 #include "pmHDU.h" 26 26 #include "pmFPA.h" 27 #include "pmFPAMaskWeight.h" 28 #include "psVectorBracket.h" 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 27 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 28 35 #include "pmFootprint.h" 29 36 #include "pmPeaks.h" 30 37 #include "pmMoments.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 33 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 34 47 #include "pmPSF.h" 35 #include "pmModel.h" 36 #include "pmSource.h" 37 #include "pmModelClass.h" 38 #include "pmModelUtils.h" 39 #include "pmSourcePhotometry.h" 40 #include "pmFPAMaskWeight.h" 41 #include "psVectorBracket.h" 48 #include "pmPSFtry.h" 49 #include "pmDetections.h" 50 42 51 #include "pmErrorCodes.h" 43 52 … … 54 63 55 64 psFree (options->stats); 65 psFree (options->fitOptions); 56 66 return; 57 67 } … … 65 75 66 76 options->stats = NULL; 77 options->fitOptions = NULL; // XXX this has to be set before calling pmPSF fit functions 67 78 68 79 options->psfTrendMode = PM_TREND_NONE; -
branches/sc_branches/trunkTest/psModules/src/objects/pmPSF.h
r26893 r29060 14 14 # define PM_PSF_H 15 15 16 #include <pslib.h>17 #include "pmTrend2D.h"18 #include "pmGrowthCurve.h"19 #include "pmResiduals.h"20 #include "pmFPA.h"21 22 16 /// @addtogroup Objects Object Detection / Analysis Functions 23 17 /// @{ 24 25 // type of model carried by the pmModel structure26 typedef int pmModelType;27 18 28 19 /** pmPSF data structure … … 38 29 * 39 30 */ 40 typedef struct{31 struct pmPSF { 41 32 pmModelType type; ///< PSF Model in use 42 33 psArray *params; ///< Model parameters (psPolynomial2D) … … 64 55 pmGrowthCurve *growth; ///< apMag vs Radius 65 56 pmResiduals *residuals; ///< normalized residual image (no spatial variation) 66 } pmPSF;57 }; 67 58 68 59 typedef struct { … … 82 73 float apRadius; 83 74 bool chiFluxTrend; // Fit a trend in Chi2 as a function of flux? 75 pmSourceFitOptions *fitOptions; 84 76 } pmPSFOptions; 85 77 -
branches/sc_branches/trunkTest/psModules/src/objects/pmPSF_IO.c
r28449 r29060 38 38 #include "pmFPAfileFitsIO.h" 39 39 40 #include "pmTrend2D.h" 41 #include "pmResiduals.h" 42 #include "pmGrowthCurve.h" 40 43 #include "pmSpan.h" 44 #include "pmFootprintSpans.h" 41 45 #include "pmFootprint.h" 42 46 #include "pmPeaks.h" 43 47 #include "pmMoments.h" 44 #include "pmGrowthCurve.h" 45 #include "pmResiduals.h" 46 #include "pmTrend2D.h" 48 #include "pmModelFuncs.h" 49 #include "pmModel.h" 50 #include "pmModelUtils.h" 51 #include "pmModelClass.h" 52 #include "pmSourceMasks.h" 53 #include "pmSourceExtendedPars.h" 54 #include "pmSourceDiffStats.h" 55 #include "pmSource.h" 56 #include "pmSourceFitModel.h" 47 57 #include "pmPSF.h" 48 #include "pmModel.h" 58 #include "pmPSFtry.h" 59 #include "pmDetections.h" 60 49 61 #include "pmPSF_IO.h" 50 #include "pmSource.h"51 #include "pmModelClass.h"52 #include "pmModelUtils.h"53 62 #include "pmSourceIO.h" 54 63 -
branches/sc_branches/trunkTest/psModules/src/objects/pmPSFtry.c
r25754 r29060 19 19 #include "pmFPA.h" 20 20 #include "pmFPAMaskWeight.h" 21 22 #include "pmTrend2D.h" 23 #include "pmResiduals.h" 24 #include "pmGrowthCurve.h" 21 25 #include "pmSpan.h" 26 #include "pmFootprintSpans.h" 22 27 #include "pmFootprint.h" 23 28 #include "pmPeaks.h" 24 29 #include "pmMoments.h" 25 #include "pmResiduals.h" 26 #include "pmGrowthCurve.h" 27 #include "pmTrend2D.h" 30 #include "pmModelFuncs.h" 31 #include "pmModel.h" 32 #include "pmModelUtils.h" 33 #include "pmModelClass.h" 34 #include "pmSourceMasks.h" 35 #include "pmSourceExtendedPars.h" 36 #include "pmSourceDiffStats.h" 37 #include "pmSource.h" 38 #include "pmSourceFitModel.h" 28 39 #include "pmPSF.h" 29 #include "pmModel.h"30 #include "pmSource.h"31 #include "pmSourceUtils.h"32 40 #include "pmPSFtry.h" 33 #include "pmModelClass.h" 34 #include "pmModelUtils.h" 35 #include "pmSourceFitModel.h" 41 #include "pmDetections.h" 42 36 43 #include "pmSourcePhotometry.h" 37 44 #include "pmSourceVisual.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmPSFtryFitEXT.c
r25754 r29060 19 19 #include "pmFPA.h" 20 20 #include "pmFPAMaskWeight.h" 21 22 #include "pmTrend2D.h" 23 #include "pmResiduals.h" 24 #include "pmGrowthCurve.h" 21 25 #include "pmSpan.h" 26 #include "pmFootprintSpans.h" 22 27 #include "pmFootprint.h" 23 28 #include "pmPeaks.h" 24 29 #include "pmMoments.h" 25 #include "pmResiduals.h" 26 #include "pmGrowthCurve.h" 27 #include "pmTrend2D.h" 28 #include "pmPSF.h" 30 #include "pmModelFuncs.h" 29 31 #include "pmModel.h" 32 #include "pmModelUtils.h" 33 #include "pmModelClass.h" 34 #include "pmSourceMasks.h" 35 #include "pmSourceExtendedPars.h" 36 #include "pmSourceDiffStats.h" 30 37 #include "pmSource.h" 31 38 #include "pmSourceUtils.h" 39 #include "pmSourceFitModel.h" 40 #include "pmPSF.h" 32 41 #include "pmPSFtry.h" 33 #include "pmModelClass.h" 34 #include "pmModelUtils.h" 35 #include "pmSourceFitModel.h" 42 #include "pmDetections.h" 43 36 44 #include "pmSourcePhotometry.h" 37 45 #include "pmSourceVisual.h" … … 44 52 45 53 psTimerStart ("psf.fit"); 54 55 // in this segment, we are fitting the full PSF model class (shape unconstrained) 56 options->fitOptions->mode = PM_SOURCE_FIT_EXT; 46 57 47 58 // maskVal is used to test for rejected pixels, and must include markVal … … 73 84 74 85 // fit model as EXT, not PSF 75 status = pmSourceFitModel (source, source->modelEXT, PM_SOURCE_FIT_EXT, maskVal);86 status = pmSourceFitModel (source, source->modelEXT, options->fitOptions, maskVal); 76 87 77 88 // clear object mask to define valid pixels -
branches/sc_branches/trunkTest/psModules/src/objects/pmPSFtryFitPSF.c
r26027 r29060 17 17 #include "pmFPA.h" 18 18 #include "pmFPAMaskWeight.h" 19 20 #include "pmTrend2D.h" 21 #include "pmResiduals.h" 22 #include "pmGrowthCurve.h" 19 23 #include "pmSpan.h" 24 #include "pmFootprintSpans.h" 20 25 #include "pmFootprint.h" 21 26 #include "pmPeaks.h" 22 27 #include "pmMoments.h" 23 #include "pmResiduals.h" 24 #include "pmGrowthCurve.h" 25 #include "pmTrend2D.h" 28 #include "pmModelFuncs.h" 29 #include "pmModel.h" 30 #include "pmModelUtils.h" 31 #include "pmModelClass.h" 32 #include "pmSourceMasks.h" 33 #include "pmSourceExtendedPars.h" 34 #include "pmSourceDiffStats.h" 35 #include "pmSource.h" 36 #include "pmSourceFitModel.h" 26 37 #include "pmPSF.h" 27 #include "pmModel.h"28 #include "pmSource.h"29 #include "pmSourceUtils.h"30 38 #include "pmPSFtry.h" 31 #include "pmModelClass.h" 32 #include "pmModelUtils.h" 33 #include "pmSourceFitModel.h" 39 #include "pmDetections.h" 40 34 41 #include "pmSourcePhotometry.h" 35 42 #include "pmSourceVisual.h" … … 42 49 43 50 psTimerStart ("psf.fit"); 51 52 // in this segment, we are fitting the fitted PSF model class (shape constrained) 53 options->fitOptions->mode = PM_SOURCE_FIT_PSF; 44 54 45 55 // maskVal is used to test for rejected pixels, and must include markVal … … 81 91 82 92 // fit the PSF model to the source 83 status = pmSourceFitModel (source, source->modelPSF, PM_SOURCE_FIT_NORM, maskVal);93 status = pmSourceFitModel (source, source->modelPSF, options->fitOptions, maskVal); 84 94 85 95 // skip poor fits … … 98 108 99 109 // This function calculates the psf and aperture magnitudes 100 status = pmSourceMagnitudes (source, psfTry->psf, PM_SOURCE_PHOT_INTERP, maskVal ); // raw PSF mag, AP mag110 status = pmSourceMagnitudes (source, psfTry->psf, PM_SOURCE_PHOT_INTERP, maskVal, markVal); // raw PSF mag, AP mag 101 111 if (!status || isnan(source->apMag)) { 102 112 psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(markVal)); // clear the circular mask -
branches/sc_branches/trunkTest/psModules/src/objects/pmPSFtryMakePSF.c
r25754 r29060 18 18 #include "pmFPA.h" 19 19 #include "pmFPAMaskWeight.h" 20 21 #include "pmTrend2D.h" 22 #include "pmResiduals.h" 23 #include "pmGrowthCurve.h" 20 24 #include "pmSpan.h" 25 #include "pmFootprintSpans.h" 21 26 #include "pmFootprint.h" 22 27 #include "pmPeaks.h" 23 28 #include "pmMoments.h" 24 #include "pmResiduals.h" 25 #include "pmGrowthCurve.h" 26 #include "pmTrend2D.h" 29 #include "pmModelFuncs.h" 30 #include "pmModel.h" 31 #include "pmModelUtils.h" 32 #include "pmModelClass.h" 33 #include "pmSourceMasks.h" 34 #include "pmSourceExtendedPars.h" 35 #include "pmSourceDiffStats.h" 36 #include "pmSource.h" 37 #include "pmSourceFitModel.h" 27 38 #include "pmPSF.h" 28 #include "pmModel.h"29 #include "pmSource.h"30 #include "pmSourceUtils.h"31 39 #include "pmPSFtry.h" 32 #include "pmModelClass.h" 33 #include "pmModelUtils.h" 34 #include "pmSourceFitModel.h" 40 #include "pmDetections.h" 41 35 42 #include "pmSourcePhotometry.h" 36 43 #include "pmSourceVisual.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmPSFtryMetric.c
r26260 r29060 18 18 #include "pmFPA.h" 19 19 #include "pmFPAMaskWeight.h" 20 21 #include "pmTrend2D.h" 22 #include "pmResiduals.h" 23 #include "pmGrowthCurve.h" 20 24 #include "pmSpan.h" 25 #include "pmFootprintSpans.h" 21 26 #include "pmFootprint.h" 22 27 #include "pmPeaks.h" 23 28 #include "pmMoments.h" 24 #include "pmResiduals.h" 25 #include "pmGrowthCurve.h" 26 #include "pmTrend2D.h" 29 #include "pmModelFuncs.h" 30 #include "pmModel.h" 31 #include "pmModelUtils.h" 32 #include "pmModelClass.h" 33 #include "pmSourceMasks.h" 34 #include "pmSourceExtendedPars.h" 35 #include "pmSourceDiffStats.h" 36 #include "pmSource.h" 37 #include "pmSourceFitModel.h" 27 38 #include "pmPSF.h" 28 #include "pmModel.h"29 #include "pmSource.h"30 #include "pmSourceUtils.h"31 39 #include "pmPSFtry.h" 32 #include "pmModelClass.h" 33 #include "pmModelUtils.h" 34 #include "pmSourceFitModel.h" 40 #include "pmDetections.h" 41 35 42 #include "pmSourcePhotometry.h" 36 43 #include "pmSourceVisual.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmPSFtryModel.c
r27818 r29060 19 19 #include "pmFPA.h" 20 20 #include "pmFPAMaskWeight.h" 21 22 #include "pmTrend2D.h" 23 #include "pmResiduals.h" 24 #include "pmGrowthCurve.h" 21 25 #include "pmSpan.h" 26 #include "pmFootprintSpans.h" 22 27 #include "pmFootprint.h" 23 28 #include "pmPeaks.h" 24 29 #include "pmMoments.h" 25 #include "pmResiduals.h" 26 #include "pmGrowthCurve.h" 27 #include "pmTrend2D.h" 30 #include "pmModelFuncs.h" 31 #include "pmModel.h" 32 #include "pmModelUtils.h" 33 #include "pmModelClass.h" 34 #include "pmSourceMasks.h" 35 #include "pmSourceExtendedPars.h" 36 #include "pmSourceDiffStats.h" 37 #include "pmSource.h" 38 #include "pmSourceFitModel.h" 28 39 #include "pmPSF.h" 29 #include "pmModel.h"30 #include "pmSource.h"31 #include "pmSourceUtils.h"32 40 #include "pmPSFtry.h" 33 #include "pmModelClass.h" 34 #include "pmModelUtils.h" 35 #include "pmSourceFitModel.h" 36 #include "pmSourcePhotometry.h" 41 #include "pmDetections.h" 42 37 43 #include "pmSourceVisual.h" 38 44 … … 49 55 pmPSFtry *pmPSFtryModel (const psArray *sources, const char *modelName, pmPSFOptions *options, psImageMaskType maskVal, psImageMaskType markVal) 50 56 { 57 assert (options->fitOptions); 58 51 59 // validate the requested model name 52 60 options->type = pmModelClassGetType (modelName); -
branches/sc_branches/trunkTest/psModules/src/objects/pmPeaks.c
r26893 r29060 22 22 #include <pslib.h> 23 23 #include "pmSpan.h" 24 #include "pmFootprintSpans.h" 24 25 #include "pmFootprint.h" 25 26 #include "pmPeaks.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmPeaks.h
r27657 r29060 17 17 # ifndef PM_PEAKS_H 18 18 # define PM_PEAKS_H 19 20 #include <pslib.h>21 #include "pmFootprint.h"22 19 23 20 /// @addtogroup Objects Object Detection / Analysis Functions -
branches/sc_branches/trunkTest/psModules/src/objects/pmPhotObj.c
r28013 r29060 16 16 #include <string.h> 17 17 #include <pslib.h> 18 19 #include "pmHDU.h" 20 #include "pmFPA.h" 21 22 #include "pmTrend2D.h" 23 #include "pmResiduals.h" 24 #include "pmGrowthCurve.h" 25 #include "pmSpan.h" 26 #include "pmFootprintSpans.h" 27 #include "pmFootprint.h" 28 #include "pmPeaks.h" 29 #include "pmMoments.h" 30 #include "pmModelFuncs.h" 31 #include "pmModel.h" 32 #include "pmModelUtils.h" 33 #include "pmModelClass.h" 34 #include "pmSourceMasks.h" 35 #include "pmSourceExtendedPars.h" 36 #include "pmSourceDiffStats.h" 37 #include "pmSource.h" 38 18 39 #include "pmPhotObj.h" 19 #include "pmSource.h" 40 20 41 21 42 static void pmPhotObjFree (pmPhotObj *tmp) … … 82 103 return (0); 83 104 } 105 106 // sort by X (ascending) 107 int pmPhotObjSortByX (const void **a, const void **b) 108 { 109 pmPhotObj *objA = *(pmPhotObj **)a; 110 pmPhotObj *objB = *(pmPhotObj **)b; 111 112 psF32 fA = objA->x; 113 psF32 fB = objB->x; 114 115 psF32 diff = fA - fB; 116 if (diff > FLT_EPSILON) return (+1); 117 if (diff < FLT_EPSILON) return (-1); 118 return (0); 119 } -
branches/sc_branches/trunkTest/psModules/src/objects/pmPhotObj.h
r28013 r29060 10 10 # ifndef PM_PHOT_OBJ_H 11 11 # define PM_PHOT_OBJ_H 12 13 #include <pslib.h>14 #include "pmPeaks.h"15 #include "pmModel.h"16 #include "pmMoments.h"17 12 18 13 /// @addtogroup Objects Object Detection / Analysis Functions … … 47 42 48 43 int pmPhotObjSortBySN (const void **a, const void **b); 44 int pmPhotObjSortByX (const void **a, const void **b); 49 45 50 46 /// @} -
branches/sc_branches/trunkTest/psModules/src/objects/pmSource.c
r28013 r29060 23 23 #include "pmFPA.h" 24 24 #include "pmFPAMaskWeight.h" 25 26 #include "pmTrend2D.h" 27 #include "pmResiduals.h" 28 #include "pmGrowthCurve.h" 25 29 #include "pmSpan.h" 30 #include "pmFootprintSpans.h" 26 31 #include "pmFootprint.h" 27 32 #include "pmPeaks.h" 28 33 #include "pmMoments.h" 29 #include "pmResiduals.h" 30 #include "pmGrowthCurve.h" 31 #include "pmTrend2D.h" 32 #include "pmPSF.h" 34 #include "pmModelFuncs.h" 33 35 #include "pmModel.h" 36 #include "pmModelUtils.h" 37 #include "pmModelClass.h" 38 #include "pmSourceMasks.h" 39 #include "pmSourceExtendedPars.h" 40 #include "pmSourceDiffStats.h" 34 41 #include "pmSource.h" 35 42 … … 98 105 static int id = 1; 99 106 pmSource *source = (pmSource *) psAlloc(sizeof(pmSource)); 100 *(int *)&source->id = id++; 107 P_PM_SOURCE_SET_ID(source, id++); 108 101 109 source->seq = -1; 102 110 source->peak = NULL; … … 114 122 source->type = PM_SOURCE_TYPE_UNKNOWN; 115 123 source->mode = PM_SOURCE_MODE_DEFAULT; 124 source->mode2 = PM_SOURCE_MODE_DEFAULT; 116 125 source->tmpFlags = 0; 117 126 source->extpars = NULL; … … 131 140 source->sky = NAN; 132 141 source->skyErr = NAN; 133 source->pixWeight = NAN; 142 source->pixWeightNotBad = NAN; 143 source->pixWeightNotPoor = NAN; 134 144 135 145 source->psfChisq = NAN; … … 142 152 143 153 /****************************************************************************** 144 pmSourceCopy(): copy the pmSource structure and contents 145 XXX : are we OK with incrementing the ID? 154 pmSourceCopy(): copy the pmSource, yielding a copy of the source that can be used without 155 affecting the original. This Copy can be used to allow multiple fit attempts on the same 156 object. The pixels, variance, and mask arrays all point to the same original subarrays. The 157 peak and moments point at the original values. 146 158 *****************************************************************************/ 147 159 pmSource *pmSourceCopy(pmSource *in) 160 { 161 if (in == NULL) { 162 return(NULL); 163 } 164 pmSource *source = pmSourceAlloc (); 165 166 // keep the original ID so we can find map back to the original 167 P_PM_SOURCE_SET_ID(source, in->id); 168 169 // peak has the same values as the original 170 if (in->peak != NULL) { 171 source->peak = pmPeakAlloc (in->peak->x, in->peak->y, in->peak->value, in->peak->type); 172 source->peak->xf = in->peak->xf; 173 source->peak->yf = in->peak->yf; 174 source->peak->flux = in->peak->flux; 175 source->peak->SN = in->peak->SN; 176 } 177 178 // copy the values in the moments structure 179 if (in->moments != NULL) { 180 source->moments = pmMomentsAlloc(); 181 *source->moments = *in->moments; 182 } 183 184 // These images are all views to the parent. We want a new view, but pointing at the same 185 // pixels. Modifying these pixels (ie, subtracting the model) will affect the pixels seen 186 // by all copies. 187 source->pixels = psImageCopyView(NULL, in->pixels); 188 source->variance = psImageCopyView(NULL, in->variance); 189 source->maskView = in->maskView ? psImageCopyView(NULL, in->maskView) : NULL; 190 191 // the maskObj is a unique mask array; create a new mask image 192 source->maskObj = in->maskObj ? psImageCopy (NULL, in->maskObj, PS_TYPE_IMAGE_MASK) : NULL; 193 194 source->type = in->type; 195 source->mode = in->mode; 196 source->imageID = in->imageID; 197 198 return(source); 199 } 200 201 /****************************************************************************** 202 pmSourceCopyData(): this creates a new, duplicate source with the same parameters as the 203 original (but is actually a new source at the same location) 204 *****************************************************************************/ 205 pmSource *pmSourceCopyData(pmSource *in) 148 206 { 149 207 if (in == NULL) { … … 482 540 } 483 541 psfClump.X = stats->clippedMean; 484 psfClump.dX = stats->clippedStdev;542 psfClump.dX = hypot(stats->clippedStdev, PSF_CLUMP_GRID_SCALE); 485 543 486 544 if (!psVectorStats (stats, tmpSy, NULL, NULL, 0)) { … … 489 547 } 490 548 psfClump.Y = stats->clippedMean; 491 psfClump.dY = stats->clippedStdev;549 psfClump.dY = hypot(stats->clippedStdev, PSF_CLUMP_GRID_SCALE); 492 550 493 551 psTrace ("psModules.objects", 2, "clump X, Y: %f, %f\n", psfClump.X, psfClump.Y); … … 910 968 bool addNoise = mode & PM_MODEL_OP_NOISE; 911 969 912 if (source->modelFlux) { 970 // require the use of pmModelAddWithOffset if we are adding noise (because the model size and norm are rescaled) 971 if (!addNoise && source->modelFlux) { 913 972 // add in the pixels from the modelFlux image 914 973 int dX = source->modelFlux->col0 - source->pixels->col0; … … 931 990 932 991 psF32 **target = source->pixels->data.F32; 933 if (addNoise) {934 // when adding noise, we assume the shape and Io have been modified935 target = source->variance->data.F32;936 }937 992 938 993 for (int iy = 0; iy < source->modelFlux->numRows; iy++) { … … 949 1004 } 950 1005 } 951 if (!addNoise) { 952 if (add) { 953 source->tmpFlags &= ~PM_SOURCE_TMPF_SUBTRACTED; 954 } else { 955 source->tmpFlags |= PM_SOURCE_TMPF_SUBTRACTED; 956 } 1006 if (add) { 1007 source->tmpFlags &= ~PM_SOURCE_TMPF_SUBTRACTED; 1008 } else { 1009 source->tmpFlags |= PM_SOURCE_TMPF_SUBTRACTED; 957 1010 } 958 1011 return true; … … 973 1026 } 974 1027 } 1028 1029 return true; 1030 } 1031 1032 // should we call pmSourceCacheModel if it does not exist? 1033 bool pmSourceNoiseOp (pmSource *source, pmModelOpMode mode, float FACTOR, float SIZE, bool add, psImageMaskType maskVal, int dx, int dy) 1034 { 1035 assert (mode & PM_MODEL_OP_NOISE); 1036 PS_ASSERT_PTR_NON_NULL(source, false); 1037 PS_ASSERT_PTR_NON_NULL(source->peak, false); 1038 1039 if (add) { 1040 psTrace ("psphot", 3, "adding noise to object at %f,%f\n", source->peak->xf, source->peak->yf); 1041 } else { 1042 psTrace ("psphot", 3, "removing noise from object at %f,%f\n", source->peak->xf, source->peak->yf); 1043 } 1044 1045 pmSourceNoiseOpModel (source->modelPSF, source, mode, FACTOR, SIZE, add, maskVal, dx, dy); 1046 1047 if (source->modelEXT) { 1048 pmSourceNoiseOpModel (source->modelEXT, source, mode, FACTOR, SIZE, add, maskVal, dx, dy); 1049 } 1050 1051 return true; 1052 } 1053 1054 bool pmSourceNoiseOpModel (pmModel *model, pmSource *source, pmModelOpMode mode, float FACTOR, float SIZE, bool add, psImageMaskType maskVal, int dx, int dy) 1055 { 1056 bool status; 1057 psEllipseShape oldshape; 1058 psEllipseShape newshape; 1059 psEllipseAxes axes; 1060 1061 if (add) { 1062 psTrace ("psphot", 4, "adding noise for object at %f,%f\n", model->params->data.F32[PM_PAR_XPOS], model->params->data.F32[PM_PAR_YPOS]); 1063 } else { 1064 psTrace ("psphot", 4, "remove noise for object at %f,%f\n", model->params->data.F32[PM_PAR_XPOS], model->params->data.F32[PM_PAR_YPOS]); 1065 } 1066 1067 psF32 *PAR = model->params->data.F32; 1068 1069 // save original values 1070 float oldI0 = PAR[PM_PAR_I0]; 1071 oldshape.sx = PAR[PM_PAR_SXX]; 1072 oldshape.sy = PAR[PM_PAR_SYY]; 1073 oldshape.sxy = PAR[PM_PAR_SXY]; 1074 1075 // XXX can this be done more intelligently? 1076 if (oldI0 == 0.0) return false; 1077 if (!isfinite(oldI0)) return false; 1078 1079 // increase size and height of source 1080 axes = psEllipseShapeToAxes (oldshape, 20.0); 1081 axes.major *= SIZE; 1082 axes.minor *= SIZE; 1083 newshape = psEllipseAxesToShape (axes); 1084 PAR[PM_PAR_I0] = FACTOR*oldI0; 1085 PAR[PM_PAR_SXX] = newshape.sx; 1086 PAR[PM_PAR_SYY] = newshape.sy; 1087 PAR[PM_PAR_SXY] = newshape.sxy; 1088 1089 psImage *target = source->variance; 1090 1091 if (add) { 1092 status = pmModelAddWithOffset (target, source->maskObj, model, mode, maskVal, dx, dy); 1093 } else { 1094 status = pmModelSubWithOffset (target, source->maskObj, model, mode, maskVal, dx, dy); 1095 } 1096 1097 // restore original values 1098 PAR[PM_PAR_I0] = oldI0; 1099 PAR[PM_PAR_SXX] = oldshape.sx; 1100 PAR[PM_PAR_SYY] = oldshape.sy; 1101 PAR[PM_PAR_SXY] = oldshape.sxy; 975 1102 976 1103 return true; -
branches/sc_branches/trunkTest/psModules/src/objects/pmSource.h
r28013 r29060 11 11 # define PM_SOURCE_H 12 12 13 #include <pslib.h>14 #include "pmPeaks.h"15 #include "pmModel.h"16 #include "pmMoments.h"17 #include "pmSourceExtendedPars.h"18 #include "pmSourceDiffStats.h"19 20 13 /// @addtogroup Objects Object Detection / Analysis Functions 21 14 /// @{ 22 23 #include <pmSourceMasks.h>24 15 25 16 /** pmSourceType enumeration … … 74 65 pmSourceType type; ///< Best identification of object. 75 66 pmSourceMode mode; ///< analysis flags set for object. 67 pmSourceMode2 mode2; ///< analysis flags set for object. 76 68 pmSourceTmpF tmpFlags; ///< internal-only flags 77 69 psArray *blends; ///< collection of sources thought to be confused with object … … 82 74 float errMag; ///< error in psfMag OR extMag (depending on type) 83 75 float apMag; ///< apMag corresponding to psfMag or extMag (depending on type) 84 float pixWeight; ///< model-weighted coverage of valid pixels 76 float apMagRaw; ///< raw mag in given aperture 77 float apRadius; ///< radius for aperture magnitude 78 79 float pixWeightNotBad; ///< PSF-weighted coverage of unmasked (not BAD) pixels 80 float pixWeightNotPoor; ///< PSF-weighted coverage of unmasked (not POOR) pixels 81 85 82 float psfChisq; ///< probability of PSF 86 83 float crNsigma; ///< Nsigma deviation from PSF to CR 87 84 float extNsigma; ///< Nsigma deviation from PSF to EXT 88 85 float sky, skyErr; ///< The sky and its error at the center of the object 89 float apRadius;90 86 psRegion region; ///< area on image covered by selected pixels 91 87 pmSourceExtendedPars *extpars; ///< extended source parameters … … 113 109 pmPSFClump; 114 110 111 // private macro to set the source ID (a const) 112 #define P_PM_SOURCE_SET_ID(S,V) { *(int *)&(S)->id = (V); } 115 113 116 114 /** pmSourceAlloc() … … 126 124 127 125 pmSource *pmSourceCopy(pmSource *source); 126 pmSource *pmSourceCopyData(pmSource *in); 128 127 129 128 // free just the pixels for a source, keeping derived data … … 242 241 bool pmSourceSubWithOffset (pmSource *source, pmModelOpMode mode, psImageMaskType maskVal, int dx, int dy); 243 242 243 bool pmSourceNoiseOpModel (pmModel *model, pmSource *source, pmModelOpMode mode, float FACTOR, float SIZE, bool add, psImageMaskType maskVal, int dx, int dy); 244 bool pmSourceNoiseOp (pmSource *source, pmModelOpMode mode, float FACTOR, float SIZE, bool add, psImageMaskType maskVal, int dx, int dy); 245 244 246 bool pmSourceOp (pmSource *source, pmModelOpMode mode, bool add, psImageMaskType maskVal, int dx, int dy); 245 247 bool pmSourceCacheModel (pmSource *source, psImageMaskType maskVal); -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceContour.c
r24887 r29060 23 23 #include "pmHDU.h" 24 24 #include "pmFPA.h" 25 26 #include "pmTrend2D.h" 27 #include "pmResiduals.h" 28 #include "pmGrowthCurve.h" 25 29 #include "pmSpan.h" 30 #include "pmFootprintSpans.h" 26 31 #include "pmFootprint.h" 27 32 #include "pmPeaks.h" 28 33 #include "pmMoments.h" 29 #include "pmResiduals.h" 30 #include "pmGrowthCurve.h" 31 #include "pmTrend2D.h" 32 #include "pmPSF.h" 34 #include "pmModelFuncs.h" 33 35 #include "pmModel.h" 36 #include "pmModelUtils.h" 37 #include "pmModelClass.h" 38 #include "pmSourceMasks.h" 39 #include "pmSourceExtendedPars.h" 40 #include "pmSourceDiffStats.h" 34 41 #include "pmSource.h" 42 35 43 #include "pmSourceContour.h" 36 44 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceDiffStats.c
r27531 r29060 29 29 diffStats->nRatioAll = NAN; 30 30 diffStats->nGood = 0; 31 32 diffStats->SNp = NAN; 33 diffStats->SNm = NAN; 34 diffStats->Rp = NAN; 35 diffStats->Rm = NAN; 31 36 } 32 37 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceDiffStats.h
r27531 r29060 29 29 float nRatioAll; // = nGood / (nGood + nMask + nBad) 30 30 int nGood; // nGood as defined above 31 float SNp; // S/N of matched source in positive image 32 float SNm; // S/N of matched source in negative image 33 float Rp; // radius of matched source in positive image 34 float Rm; // radius of matched source in negative image 31 35 } pmSourceDiffStats; 32 36 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceFitModel.c
r26070 r29060 23 23 #include "pmHDU.h" 24 24 #include "pmFPA.h" 25 26 #include "pmTrend2D.h" 27 #include "pmResiduals.h" 28 #include "pmGrowthCurve.h" 25 29 #include "pmSpan.h" 30 #include "pmFootprintSpans.h" 26 31 #include "pmFootprint.h" 27 32 #include "pmPeaks.h" 28 33 #include "pmMoments.h" 29 #include "pmGrowthCurve.h" 30 #include "pmResiduals.h" 31 #include "pmTrend2D.h" 32 #include "pmPSF.h" 34 #include "pmModelFuncs.h" 33 35 #include "pmModel.h" 36 #include "pmModelUtils.h" 37 #include "pmModelClass.h" 38 #include "pmSourceMasks.h" 39 #include "pmSourceExtendedPars.h" 40 #include "pmSourceDiffStats.h" 34 41 #include "pmSource.h" 35 #include "pmModelClass.h"36 42 #include "pmSourceFitModel.h" 37 43 38 // save as static values so they may be set externally 39 static psF32 PM_SOURCE_FIT_MODEL_NUM_ITERATIONS = 15; 40 static psF32 PM_SOURCE_FIT_MODEL_TOLERANCE = 0.1; 41 static psF32 PM_SOURCE_FIT_MODEL_WEIGHT = 1.0; 42 static bool PM_SOURCE_FIT_MODEL_PIX_WEIGHTS = true; 43 44 bool pmSourceFitModelInit (float nIter, float tol, float weight, bool poissonErrors) 44 void pmSourceFitOptionsFree(pmSourceFitOptions *opt) 45 45 { 46 47 PM_SOURCE_FIT_MODEL_NUM_ITERATIONS = nIter; 48 PM_SOURCE_FIT_MODEL_TOLERANCE = tol; 49 PM_SOURCE_FIT_MODEL_WEIGHT = weight; 50 PM_SOURCE_FIT_MODEL_PIX_WEIGHTS = poissonErrors; 51 52 return true; 46 return; 47 } 48 49 pmSourceFitOptions *pmSourceFitOptionsAlloc(void) { 50 51 pmSourceFitOptions *opt = (pmSourceFitOptions *) psAlloc(sizeof(pmSourceFitOptions)); 52 psMemSetDeallocator(opt, (psFreeFunc) pmSourceFitOptionsFree); 53 54 opt->mode = PM_SOURCE_FIT_PSF; 55 opt->nIter = 15; 56 opt->minTol = 0.01; 57 opt->maxTol = 1.00; 58 opt->weight = 1.00; 59 opt->maxChisqDOF = NAN; 60 opt->poissonErrors = true; 61 62 return opt; 53 63 } 54 64 55 65 bool pmSourceFitModel (pmSource *source, 56 66 pmModel *model, 57 pmSourceFit Mode mode,67 pmSourceFitOptions *options, 58 68 psImageMaskType maskVal) 59 69 { … … 76 86 psVector *yErr = psVectorAllocEmpty(nPix, PS_TYPE_F32); 77 87 88 // XXX for a test, skip the central pixel in the sersic fit 89 bool skipCenter = false && (model->type == pmModelClassGetType("PS_MODEL_SERSIC")); 90 float Xo = model->params->data.F32[PM_PAR_XPOS]; 91 float Yo = model->params->data.F32[PM_PAR_YPOS]; 92 78 93 // fill in the coordinate and value entries 79 94 nPix = 0; … … 95 110 // skip nan values in image 96 111 if (!isfinite(source->variance->data.F32[i][j])) { 97 fprintf (stderr, "impossible! %x vs %x\n", source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[i][j], maskVal); 98 continue; 99 } 100 101 psVector *coord = psVectorAlloc(2, PS_TYPE_F32); 112 fprintf (stderr, "impossible! %x vs %x\n", source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[i][j], maskVal); 113 continue; 114 } 102 115 103 116 // Convert i/j to image space: 104 117 // 0.5 PIX: the coordinate values must be in pixel coords, not index 105 coord->data.F32[0] = (psF32) (j + 0.5 + source->pixels->col0); 106 coord->data.F32[1] = (psF32) (i + 0.5 + source->pixels->row0); 118 float Xv = (psF32) (j + 0.5 + source->pixels->col0); 119 float Yv = (psF32) (i + 0.5 + source->pixels->row0); 120 121 // XXX possible skip of center pixel: 122 if (skipCenter) { 123 float r = hypot(Xv - Xo, Yv - Yo); 124 if (r < 0.75) { 125 continue; 126 } 127 } 128 129 psVector *coord = psVectorAlloc(2, PS_TYPE_F32); 130 coord->data.F32[0] = Xv; 131 coord->data.F32[1] = Yv; 107 132 x->data[nPix] = (psPtr *) coord; 108 133 y->data.F32[nPix] = source->pixels->data.F32[i][j]; … … 111 136 // as variance to avoid the bias from systematic errors here we would just use the 112 137 // source sky variance 113 if ( PM_SOURCE_FIT_MODEL_PIX_WEIGHTS) {138 if (options->poissonErrors) { 114 139 yErr->data.F32[nPix] = 1.0 / source->variance->data.F32[i][j]; 115 140 } else { 116 yErr->data.F32[nPix] = 1.0 / PM_SOURCE_FIT_MODEL_WEIGHT;141 yErr->data.F32[nPix] = 1.0 / options->weight; 117 142 } 118 143 nPix++; … … 133 158 // set parameter mask based on fitting mode 134 159 int nParams = 0; 135 switch ( mode) {136 case PM_SOURCE_FIT_NORM:160 switch (options->mode) { 161 case PM_SOURCE_FIT_NORM: 137 162 // NORM-only model fits only source normalization (Io) 138 163 nParams = 1; … … 140 165 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 141 166 break; 142 case PM_SOURCE_FIT_PSF:167 case PM_SOURCE_FIT_PSF: 143 168 // PSF model only fits x,y,Io 144 169 nParams = 3; … … 148 173 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_YPOS] = 0; 149 174 break; 150 case PM_SOURCE_FIT_EXT:175 case PM_SOURCE_FIT_EXT: 151 176 // EXT model fits all params (except sky) 152 177 nParams = params->n - 1; … … 154 179 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1; 155 180 break; 156 default: 157 psAbort("invalid fitting mode"); 181 case PM_SOURCE_FIT_INDEX: 182 // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params 183 psVectorInit (constraint->paramMask, 1); 184 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 185 if (params->n == 7) { 186 nParams = 1; 187 } else { 188 nParams = 2; 189 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 0; 190 } 191 break; 192 case PM_SOURCE_FIT_NO_INDEX: 193 // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params 194 psVectorInit (constraint->paramMask, 0); 195 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1; 196 if (params->n == 7) { 197 nParams = params->n - 1; 198 } else { 199 nParams = params->n - 2; 200 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 1; 201 } 202 break; 203 default: 204 psAbort("invalid fitting mode"); 158 205 } 159 206 // force the floating parameters to fall within the contraint ranges 160 207 for (int i = 0; i < params->n; i++) { 161 model->modelLimits (PS_MINIMIZE_PARAM_MIN, i, params->data.F32, NULL);162 model->modelLimits (PS_MINIMIZE_PARAM_MAX, i, params->data.F32, NULL);208 model->modelLimits (PS_MINIMIZE_PARAM_MIN, i, params->data.F32, NULL); 209 model->modelLimits (PS_MINIMIZE_PARAM_MAX, i, params->data.F32, NULL); 163 210 } 164 211 … … 173 220 } 174 221 175 psMinimization *myMin = psMinimizationAlloc ( PM_SOURCE_FIT_MODEL_NUM_ITERATIONS, PM_SOURCE_FIT_MODEL_TOLERANCE);222 psMinimization *myMin = psMinimizationAlloc (options->nIter, options->minTol, options->maxTol); 176 223 177 224 psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32); … … 194 241 model->flags |= PM_MODEL_STATUS_FITTED; 195 242 if (!fitStatus) model->flags |= PM_MODEL_STATUS_NONCONVERGE; 243 if (myMin->lastDelta > myMin->minTol) model->flags |= PM_MODEL_STATUS_WEAK_FIT; 196 244 197 245 // get the Gauss-Newton distance for fixed model parameters -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceFitModel.h
r21183 r29060 19 19 PM_SOURCE_FIT_EXT, 20 20 PM_SOURCE_FIT_PSF_AND_SKY, 21 PM_SOURCE_FIT_EXT_AND_SKY 21 PM_SOURCE_FIT_EXT_AND_SKY, 22 PM_SOURCE_FIT_INDEX, 23 PM_SOURCE_FIT_NO_INDEX, 22 24 } pmSourceFitMode; 23 25 24 bool pmSourceFitModelInit( 25 float nIter, ///< max number of allowed iterations 26 float tol, ///< convergence criterion 27 float weight, ///< use this weight for constant-weight fits 28 bool poissonErrors // use poisson errors for fits? 29 ); 26 typedef struct { 27 pmSourceFitMode mode; ///< optionally fit all or a subset of parameters 28 float nIter; ///< max number of allowed iterations 29 float minTol; ///< convergence criterion 30 float maxTol; ///< convergence criterion 31 float maxChisqDOF; ///< convergence criterion 32 float weight; ///< use this weight for constant-weight fits 33 bool poissonErrors; ///< use poisson errors for fits? 34 } pmSourceFitOptions; 35 36 // the pmSourceFitOptions structure is used to control details of the fitting process 37 pmSourceFitOptions *pmSourceFitOptionsAlloc(void); 38 39 // bool pmSourceFitModelInit( 40 // pmSourceFitMode mode, ///< what parameter set should be fitted? 41 // float nIter, ///< max number of allowed iterations 42 // float tol, ///< convergence criterion 43 // float weight, ///< use this weight for constant-weight fits 44 // bool poissonErrors ///< use poisson errors for fits? 45 // ); 30 46 31 47 /** pmSourceFitModel() … … 38 54 */ 39 55 bool pmSourceFitModel( 40 pmSource *source, ///< The input pmSource41 pmModel *model, ///< model to be fitted42 pmSourceFit Mode mode,///< define parameters to be fitted56 pmSource *source, ///< The input pmSource 57 pmModel *model, ///< model to be fitted 58 pmSourceFitOptions *options, ///< define parameters to be fitted 43 59 psImageMaskType maskVal ///< Value to mask 44 60 ); 45 61 46 47 // initialize data for a group of object models 48 bool pmSourceFitSetInit (pmModelType type); 49 50 // clear data for a group of object models 51 void pmSourceFitSetClear (void); 52 53 // function used to set limits for a group of models 54 bool pmSourceFitSet_CheckLimits (psMinConstraintMode mode, int nParam, float *params, float *betas); 55 56 // function used to fit a group of object models 57 psF32 pmSourceFitSet_Function(psVector *deriv, 58 const psVector *params, 59 const psVector *x); 60 61 /** pmSourceFitSet() 62 * 63 * Fit the requested model to the specified source. The starting guess for the model is given 64 * by the input source.model parameter values. The pixels of interest are specified by the 65 * source.pixels and source.mask entries. This function calls psMinimizeLMChi2() on the image 66 * data. The function returns TRUE on success or FALSE on failure. 67 * 68 */ 69 bool pmSourceFitSet( 70 pmSource *source, ///< The input pmSource 71 psArray *modelSet, ///< model to be fitted 72 pmSourceFitMode mode, ///< define parameters to be fitted 73 psImageMaskType maskVal ///< Vale to mask 74 75 ); 62 // // initialize data for a group of object models 63 // bool pmSourceFitSetInit (pmModelType type); 64 // 65 // // clear data for a group of object models 66 // void pmSourceFitSetClear (void); 67 // 68 // // function used to set limits for a group of models 69 // bool pmSourceFitSet_CheckLimits (psMinConstraintMode mode, int nParam, float *params, float *betas); 70 // 71 // // function used to fit a group of object models 72 // psF32 pmSourceFitSet_Function(psVector *deriv, 73 // const psVector *params, 74 // const psVector *x); 75 // 76 // /** pmSourceFitSet() 77 // * 78 // * Fit the requested model to the specified source. The starting guess for the model is given 79 // * by the input source.model parameter values. The pixels of interest are specified by the 80 // * source.pixels and source.mask entries. This function calls psMinimizeLMChi2() on the image 81 // * data. The function returns TRUE on success or FALSE on failure. 82 // * 83 // */ 84 // bool pmSourceFitSet( 85 // pmSource *source, ///< The input pmSource 86 // psArray *modelSet, ///< model to be fitted 87 // pmSourceFitMode mode, ///< define parameters to be fitted 88 // psImageMaskType maskVal ///< Vale to mask 89 // 90 // ); 76 91 77 92 /// @} -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceFitSet.c
r27903 r29060 22 22 #include "pmHDU.h" 23 23 #include "pmFPA.h" 24 25 #include "pmTrend2D.h" 26 #include "pmResiduals.h" 27 #include "pmGrowthCurve.h" 24 28 #include "pmSpan.h" 29 #include "pmFootprintSpans.h" 25 30 #include "pmFootprint.h" 26 31 #include "pmPeaks.h" 27 32 #include "pmMoments.h" 28 #include "pmGrowthCurve.h" 29 #include "pmResiduals.h" 30 #include "pmTrend2D.h" 31 #include "pmPSF.h" 33 #include "pmModelFuncs.h" 32 34 #include "pmModel.h" 35 #include "pmModelUtils.h" 36 #include "pmModelClass.h" 37 #include "pmSourceMasks.h" 38 #include "pmSourceExtendedPars.h" 39 #include "pmSourceDiffStats.h" 33 40 #include "pmSource.h" 34 #include "pmModelClass.h" 41 35 42 #include "pmSourceFitModel.h" 36 43 #include "pmSourceFitSet.h" 37 44 38 45 // save as static values so they may be set externally 39 static psF32 PM_SOURCE_FIT_MODEL_NUM_ITERATIONS = 15;40 static psF32 PM_SOURCE_FIT_MODEL_TOLERANCE = 0.1;41 static psF32 PM_SOURCE_FIT_MODEL_WEIGHT = 1.0;42 static bool PM_SOURCE_FIT_MODEL_PIX_WEIGHTS = true;46 // static psF32 PM_SOURCE_FIT_MODEL_NUM_ITERATIONS = 15; 47 // static psF32 PM_SOURCE_FIT_MODEL_TOLERANCE = 0.1; 48 // static psF32 PM_SOURCE_FIT_MODEL_WEIGHT = 1.0; 49 // static bool PM_SOURCE_FIT_MODEL_PIX_WEIGHTS = true; 43 50 44 51 /********************* Source Model Set Functions ***************************/ … … 429 436 bool pmSourceFitSet (pmSource *source, 430 437 psArray *modelSet, 431 pmSourceFitMode mode,438 pmSourceFitOptions *options, 432 439 psImageMaskType maskVal) 433 440 { … … 478 485 // as variance to avoid the bias from systematic errors here we would just use the 479 486 // source sky variance 480 if ( PM_SOURCE_FIT_MODEL_PIX_WEIGHTS) {481 yErr->data.F32[nPix] = 1.0 / source->variance->data.F32[i][j];482 } else {483 yErr->data.F32[nPix] = 1.0 / PM_SOURCE_FIT_MODEL_WEIGHT;484 }485 nPix++;486 }487 if (options->poissonErrors) { 488 yErr->data.F32[nPix] = 1.0 / source->variance->data.F32[i][j]; 489 } else { 490 yErr->data.F32[nPix] = 1.0 / options->weight; 491 } 492 nPix++; 493 } 487 494 } 488 495 x->n = nPix; … … 490 497 yErr->n = nPix; 491 498 492 // create the FitSet for this thread and set the initial parameter guesses499 // create the FitSet for this thread and set the initial parameter guesses 493 500 pmSourceFitSetData *thisSet = pmSourceFitSetDataSet(modelSet); 494 501 495 // define param and deriv vectors for complete set of parameters502 // define param and deriv vectors for complete set of parameters 496 503 psVector *params = psVectorAlloc (thisSet->nParamSet, PS_TYPE_F32); 497 504 498 // set the param and deriv vectors based on the curent values505 // set the param and deriv vectors based on the curent values 499 506 pmSourceFitSetJoin (NULL, params, thisSet); 500 507 501 // create the minimization constraints508 // create the minimization constraints 502 509 psMinConstraint *constraint = psMinConstraintAlloc(); 503 510 constraint->paramMask = psVectorAlloc (thisSet->nParamSet, PS_TYPE_VECTOR_MASK); 504 511 constraint->checkLimits = pmSourceFitSetCheckLimits; 505 512 506 pmSourceFitSetMasks (constraint, thisSet, mode);507 508 // force the floating parameters to fall within the contraint ranges513 pmSourceFitSetMasks (constraint, thisSet, options->mode); 514 515 // force the floating parameters to fall within the contraint ranges 509 516 for (int i = 0; i < params->n; i++) { 510 pmSourceFitSetCheckLimits (PS_MINIMIZE_PARAM_MIN, i, params->data.F32, NULL);511 pmSourceFitSetCheckLimits (PS_MINIMIZE_PARAM_MAX, i, params->data.F32, NULL);517 pmSourceFitSetCheckLimits (PS_MINIMIZE_PARAM_MIN, i, params->data.F32, NULL); 518 pmSourceFitSetCheckLimits (PS_MINIMIZE_PARAM_MAX, i, params->data.F32, NULL); 512 519 } 513 520 514 521 if (psTraceGetLevel("psModules.objects") >= 5) { 515 for (int i = 0; i < params->n; i++) {516 fprintf (stderr, "%d %f %d\n", i, params->data.F32[i], constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i]);517 }522 for (int i = 0; i < params->n; i++) { 523 fprintf (stderr, "%d %f %d\n", i, params->data.F32[i], constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i]); 524 } 518 525 } 519 526 520 527 if (nPix < thisSet->nParamSet + 1) { 521 psTrace (__func__, 4, "insufficient valid pixels\n");522 psTrace("psModules.objects", 10, "---- %s() end : fail pixels ----\n", __func__);523 for (int i = 0; i < modelSet->n; i++) {524 pmModel *model = modelSet->data[i];525 model->flags |= PM_MODEL_STATUS_BADARGS;526 }527 psFree (x);528 psFree (y);529 psFree (yErr);530 psFree (params);531 psFree(constraint);532 pmSourceFitSetDataClear(); // frees thisSet and removes if from the array of fitSets533 return(false);534 } 535 536 psMinimization *myMin = psMinimizationAlloc ( PM_SOURCE_FIT_MODEL_NUM_ITERATIONS, PM_SOURCE_FIT_MODEL_TOLERANCE);528 psTrace (__func__, 4, "insufficient valid pixels\n"); 529 psTrace("psModules.objects", 10, "---- %s() end : fail pixels ----\n", __func__); 530 for (int i = 0; i < modelSet->n; i++) { 531 pmModel *model = modelSet->data[i]; 532 model->flags |= PM_MODEL_STATUS_BADARGS; 533 } 534 psFree (x); 535 psFree (y); 536 psFree (yErr); 537 psFree (params); 538 psFree(constraint); 539 pmSourceFitSetDataClear(); // frees thisSet and removes if from the array of fitSets 540 return(false); 541 } 542 543 psMinimization *myMin = psMinimizationAlloc (options->nIter, options->minTol, options->maxTol); 537 544 538 545 psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32); … … 540 547 fitStatus = psMinimizeLMChi2(myMin, covar, params, constraint, x, y, yErr, pmSourceFitSetFunction); 541 548 if (!fitStatus) { 542 psTrace("psModules.objects", 4, "Failed to fit model (%ld components)\n", modelSet->n);543 } 544 545 // parameter errors from the covariance matrix549 psTrace("psModules.objects", 4, "Failed to fit model (%ld components)\n", modelSet->n); 550 } 551 552 // parameter errors from the covariance matrix 546 553 psVector *dparams = psVectorAlloc (thisSet->nParamSet, PS_TYPE_F32); 547 554 for (int i = 0; i < dparams->n; i++) { 548 if ((constraint->paramMask != NULL) && constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i])549 continue;550 dparams->data.F32[i] = sqrt(covar->data.F32[i][i]);551 } 552 553 // get the Gauss-Newton distance for fixed model parameters555 if ((constraint->paramMask != NULL) && constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i]) 556 continue; 557 dparams->data.F32[i] = sqrt(covar->data.F32[i][i]); 558 } 559 560 // get the Gauss-Newton distance for fixed model parameters 554 561 if (constraint->paramMask != NULL) { 555 psVector *delta = psVectorAlloc (params->n, PS_TYPE_F32);556 psVector *altmask = psVectorAlloc (params->n, PS_TYPE_VECTOR_MASK);557 altmask->data.PS_TYPE_VECTOR_MASK_DATA[0] = 1;558 for (int i = 1; i < dparams->n; i++) {559 altmask->data.PS_TYPE_VECTOR_MASK_DATA[i] = (constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i]) ? 0 : 1;560 }561 psMinimizeGaussNewtonDelta(delta, params, altmask, x, y, yErr, pmSourceFitSetFunction);562 563 for (int i = 0; i < dparams->n; i++) {564 if (!constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i])565 continue;566 // note that delta is the value *subtracted* from the parameter567 // to get the new guess. for dparams to represent the direction568 // of motion, we need to take -delta569 dparams->data.F32[i] = -delta->data.F32[i];570 }571 psFree (delta);572 psFree (altmask);562 psVector *delta = psVectorAlloc (params->n, PS_TYPE_F32); 563 psVector *altmask = psVectorAlloc (params->n, PS_TYPE_VECTOR_MASK); 564 altmask->data.PS_TYPE_VECTOR_MASK_DATA[0] = 1; 565 for (int i = 1; i < dparams->n; i++) { 566 altmask->data.PS_TYPE_VECTOR_MASK_DATA[i] = (constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i]) ? 0 : 1; 567 } 568 psMinimizeGaussNewtonDelta(delta, params, altmask, x, y, yErr, pmSourceFitSetFunction); 569 570 for (int i = 0; i < dparams->n; i++) { 571 if (!constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i]) 572 continue; 573 // note that delta is the value *subtracted* from the parameter 574 // to get the new guess. for dparams to represent the direction 575 // of motion, we need to take -delta 576 dparams->data.F32[i] = -delta->data.F32[i]; 577 } 578 psFree (delta); 579 psFree (altmask); 573 580 } 574 581 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceFitSet.h
r23487 r29060 56 56 pmSource *source, ///< The input pmSource 57 57 psArray *modelSet, ///< model to be fitted 58 pmSourceFit Mode mode, ///< define parameters to be fitted58 pmSourceFitOptions *options, ///< define options for fitting process 59 59 psImageMaskType maskVal ///< Vale to mask 60 60 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceGroups.c
r26450 r29060 6 6 #include <pslib.h> 7 7 8 #include "pmHDU.h" 8 9 #include "pmFPA.h" 10 11 #include "pmTrend2D.h" 12 #include "pmResiduals.h" 13 #include "pmGrowthCurve.h" 14 #include "pmSpan.h" 15 #include "pmFootprintSpans.h" 16 #include "pmFootprint.h" 17 #include "pmPeaks.h" 18 #include "pmMoments.h" 19 #include "pmModelFuncs.h" 20 #include "pmModel.h" 21 #include "pmModelUtils.h" 22 #include "pmModelClass.h" 23 #include "pmSourceMasks.h" 24 #include "pmSourceExtendedPars.h" 25 #include "pmSourceDiffStats.h" 9 26 #include "pmSource.h" 27 #include "pmSourceFitModel.h" 28 #include "pmPSF.h" 29 #include "pmPSFtry.h" 30 #include "pmDetections.h" 31 10 32 #include "pmSourceGroups.h" 11 33 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceGroups.h
r26182 r29060 1 1 #ifndef PM_SOURCE_GROUPS_H 2 2 #define PM_SOURCE_GROUPS_H 3 4 #include <pslib.h>5 6 #include "pmFPA.h"7 3 8 4 /// Groups of sources -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO.c
r28013 r29060 31 31 #include "pmConceptsRead.h" 32 32 33 #include "pmTrend2D.h" 34 #include "pmResiduals.h" 35 #include "pmGrowthCurve.h" 33 36 #include "pmSpan.h" 37 #include "pmFootprintSpans.h" 34 38 #include "pmFootprint.h" 35 39 #include "pmPeaks.h" 36 40 #include "pmMoments.h" 37 #include "pmGrowthCurve.h" 38 #include "pmResiduals.h" 39 #include "pmTrend2D.h" 41 #include "pmModelFuncs.h" 42 #include "pmModel.h" 43 #include "pmModelUtils.h" 44 #include "pmModelClass.h" 45 #include "pmSourceMasks.h" 46 #include "pmSourceExtendedPars.h" 47 #include "pmSourceDiffStats.h" 48 #include "pmSource.h" 49 #include "pmSourceFitModel.h" 40 50 #include "pmPSF.h" 41 #include "pmModel.h" 51 #include "pmPSFtry.h" 52 42 53 #include "pmDetections.h" 43 #include "pmSource.h"44 #include "pmModelClass.h"45 54 #include "pmDetEff.h" 46 55 #include "pmSourceIO.h" … … 326 335 } 327 336 337 # define PM_SOURCES_WRITE(NAME,TYPE) \ 338 if (!strcmp (exttype, NAME)) { \ 339 status &= pmSourcesWrite_##TYPE(file->fits, readout, sources, file->header, outhead, dataname, recipe); \ 340 if (xsrcname) { \ 341 status &= pmSourcesWrite_##TYPE##_XSRC(file->fits, readout, sources, file->header, xsrcname, recipe); \ 342 } \ 343 if (xfitname) { \ 344 status &= pmSourcesWrite_##TYPE##_XFIT (file->fits, readout, sources, file->header, xfitname); \ 345 } \ 346 } 347 328 348 // write out all readout-level Objects files for this cell 329 349 bool pmReadoutWriteObjects (pmReadout *readout, const pmFPAview *view, pmFPAfile *file, const pmConfig *config) … … 360 380 } 361 381 382 // the older types (RAW, OBJ, SX, CMP) are for backwards compatibility -- deprecate eventually? 362 383 switch (file->type) { 363 384 case PM_FPA_FILE_RAW: … … 518 539 psMetadataAddStr (outhead, PS_LIST_TAIL, "XFITNAME", PS_META_REPLACE, "name of XFIT table extension", xfitname); 519 540 } 520 521 // XXX these are case-sensitive since the EXTYPE is case-sensitive 541 542 543 // these are case-sensitive since the EXTYPE is case-sensitive 522 544 status = true; 523 if (!strcmp (exttype, "SMPDATA")) { 524 status &= pmSourcesWrite_SMPDATA (file->fits, sources, file->header, outhead, dataname); 525 } 526 if (!strcmp (exttype, "PS1_DEV_0")) { 527 status &= pmSourcesWrite_PS1_DEV_0 (file->fits, sources, file->header, outhead, dataname); 528 } 529 if (!strcmp (exttype, "PS1_DEV_1")) { 530 status &= pmSourcesWrite_PS1_DEV_1 (file->fits, sources, file->header, outhead, dataname); 531 } 532 if (!strcmp (exttype, "PS1_CAL_0")) { 533 status &= pmSourcesWrite_PS1_CAL_0 (file->fits, readout, sources, file->header, outhead, dataname); 534 } 535 if (!strcmp (exttype, "PS1_V1")) { 536 status &= pmSourcesWrite_CMF_PS1_V1 (file->fits, readout, sources, file->header, outhead, dataname); 537 } 538 if (!strcmp (exttype, "PS1_V2")) { 539 status &= pmSourcesWrite_CMF_PS1_V2 (file->fits, readout, sources, file->header, outhead, dataname); 540 } 541 if (!strcmp (exttype, "PS1_SV1")) { 542 status &= pmSourcesWrite_CMF_PS1_SV1 (file->fits, readout, sources, file->header, outhead, dataname, recipe); 543 } 544 if (!strcmp (exttype, "PS1_DV1")) { 545 status &= pmSourcesWrite_CMF_PS1_DV1 (file->fits, readout, sources, file->header, outhead, dataname); 546 } 547 548 if (xsrcname) { 549 if (!strcmp (exttype, "PS1_DEV_1")) { 550 status &= pmSourcesWrite_PS1_DEV_1_XSRC (file->fits, sources, xsrcname, recipe); 551 } 552 if (!strcmp (exttype, "PS1_CAL_0")) { 553 status &= pmSourcesWrite_PS1_CAL_0_XSRC (file->fits, readout, sources, file->header, xsrcname, recipe); 554 } 555 if (!strcmp (exttype, "PS1_V1")) { 556 status &= pmSourcesWrite_CMF_PS1_V1_XSRC (file->fits, readout, sources, file->header, xsrcname, recipe); 557 } 558 if (!strcmp (exttype, "PS1_V2")) { 559 status &= pmSourcesWrite_CMF_PS1_V2_XSRC (file->fits, readout, sources, file->header, xsrcname, recipe); 560 } 561 if (!strcmp (exttype, "PS1_SV1")) { 562 status &= pmSourcesWrite_CMF_PS1_SV1_XSRC (file->fits, readout, sources, file->header, xsrcname, recipe); 563 } 564 if (!strcmp (exttype, "PS1_DV1")) { 565 status &= pmSourcesWrite_CMF_PS1_DV1_XSRC (file->fits, readout, sources, file->header, xsrcname, recipe); 566 } 567 } 568 if (xfitname) { 569 if (!strcmp (exttype, "PS1_DEV_1")) { 570 status &= pmSourcesWrite_PS1_DEV_1_XFIT (file->fits, sources, xfitname); 571 } 572 if (!strcmp (exttype, "PS1_CAL_0")) { 573 status &= pmSourcesWrite_PS1_CAL_0_XFIT (file->fits, readout, sources, file->header, xfitname); 574 } 575 if (!strcmp (exttype, "PS1_V1")) { 576 status &= pmSourcesWrite_CMF_PS1_V1_XFIT (file->fits, readout, sources, xfitname); 577 } 578 if (!strcmp (exttype, "PS1_V2")) { 579 status &= pmSourcesWrite_CMF_PS1_V2_XFIT (file->fits, readout, sources, xfitname); 580 } 581 if (!strcmp (exttype, "PS1_SV1")) { 582 status &= pmSourcesWrite_CMF_PS1_SV1_XFIT (file->fits, readout, sources, xfitname); 583 } 584 if (!strcmp (exttype, "PS1_DV1")) { 585 status &= pmSourcesWrite_CMF_PS1_DV1_XFIT (file->fits, readout, sources, xfitname); 586 } 587 } 545 PM_SOURCES_WRITE("SMPDATA", SMPDATA); 546 PM_SOURCES_WRITE("PS1_DEV_0", PS1_DEV_0); 547 PM_SOURCES_WRITE("PS1_DEV_1", PS1_DEV_1); 548 PM_SOURCES_WRITE("PS1_CAL_0", PS1_CAL_0); 549 PM_SOURCES_WRITE("PS1_V1", CMF_PS1_V1); 550 PM_SOURCES_WRITE("PS1_V2", CMF_PS1_V2); 551 PM_SOURCES_WRITE("PS1_V3", CMF_PS1_V3); 552 PM_SOURCES_WRITE("PS1_SV1", CMF_PS1_SV1); 553 PM_SOURCES_WRITE("PS1_DV1", CMF_PS1_DV1); 554 PM_SOURCES_WRITE("PS1_DV2", CMF_PS1_DV2); 555 588 556 psFree (outhead); 589 557 psFree (exttype); … … 1039 1007 sources = pmSourcesRead_CMF_PS1_DV1 (file->fits, hdu->header); 1040 1008 } 1009 if (!strcmp (exttype, "PS1_DV2")) { 1010 sources = pmSourcesRead_CMF_PS1_DV2 (file->fits, hdu->header); 1011 } 1041 1012 1042 1013 if (!pmReadoutReadDetEff(file->fits, readout, deteffname)) { -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO.h
r28013 r29060 24 24 bool pmSourcesWriteCMP (psArray *sources, char *filename, psMetadata *header); 25 25 26 bool pmSourcesWrite_SMPDATA (psFits *fits, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname); 27 bool pmSourcesWrite_PS1_DEV_0 (psFits *fits, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname); 26 bool pmSource_CMF_WritePHU (const pmFPAview *view, pmFPAfile *file, pmConfig *config); 28 27 29 bool pmSourcesWrite_PS1_DEV_1 (psFits *fits, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname); 30 bool pmSourcesWrite_PS1_DEV_1_XSRC (psFits *fits, psArray *sources, char *extname, psMetadata *recipe); 31 bool pmSourcesWrite_PS1_DEV_1_XFIT (psFits *fits, psArray *sources, char *extname); 28 // All of these functions need to use the same API, even if not all elements are used in a specific case 29 bool pmSourcesWrite_SMPDATA(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 30 bool pmSourcesWrite_SMPDATA_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 31 bool pmSourcesWrite_SMPDATA_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 32 32 33 bool pmSourcesWrite_PS1_ CAL_0 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname);34 bool pmSourcesWrite_PS1_ CAL_0_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe);35 bool pmSourcesWrite_PS1_ CAL_0_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname);33 bool pmSourcesWrite_PS1_DEV_0(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 34 bool pmSourcesWrite_PS1_DEV_0_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 35 bool pmSourcesWrite_PS1_DEV_0_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 36 36 37 bool pmSourcesWrite_ CMF_PS1_V1 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname);38 bool pmSourcesWrite_ CMF_PS1_V1_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe);39 bool pmSourcesWrite_ CMF_PS1_V1_XFIT (psFits *fits, pmReadout *readout, psArray *sources, char *extname);37 bool pmSourcesWrite_PS1_DEV_1(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 38 bool pmSourcesWrite_PS1_DEV_1_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 39 bool pmSourcesWrite_PS1_DEV_1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 40 40 41 bool pmSourcesWrite_ CMF_PS1_V2 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname);42 bool pmSourcesWrite_ CMF_PS1_V2_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe);43 bool pmSourcesWrite_ CMF_PS1_V2_XFIT (psFits *fits, pmReadout *readout, psArray *sources, char *extname);41 bool pmSourcesWrite_PS1_CAL_0(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 42 bool pmSourcesWrite_PS1_CAL_0_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 43 bool pmSourcesWrite_PS1_CAL_0_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 44 44 45 bool pmSourcesWrite_CMF_PS1_ SV1(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe);46 bool pmSourcesWrite_CMF_PS1_ SV1_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe);47 bool pmSourcesWrite_CMF_PS1_ SV1_XFIT (psFits *fits, pmReadout *readout, psArray *sources, char *extname);45 bool pmSourcesWrite_CMF_PS1_V1(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 46 bool pmSourcesWrite_CMF_PS1_V1_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 47 bool pmSourcesWrite_CMF_PS1_V1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 48 48 49 bool pmSourcesWrite_CMF_PS1_ DV1 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname);50 bool pmSourcesWrite_CMF_PS1_ DV1_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe);51 bool pmSourcesWrite_CMF_PS1_ DV1_XFIT (psFits *fits, pmReadout *readout, psArray *sources, char *extname);49 bool pmSourcesWrite_CMF_PS1_V2(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 50 bool pmSourcesWrite_CMF_PS1_V2_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 51 bool pmSourcesWrite_CMF_PS1_V2_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 52 52 53 bool pmSource_CMF_WritePHU (const pmFPAview *view, pmFPAfile *file, pmConfig *config); 53 bool pmSourcesWrite_CMF_PS1_V3(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 54 bool pmSourcesWrite_CMF_PS1_V3_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 55 bool pmSourcesWrite_CMF_PS1_V3_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 56 57 bool pmSourcesWrite_CMF_PS1_SV1(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 58 bool pmSourcesWrite_CMF_PS1_SV1_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 59 bool pmSourcesWrite_CMF_PS1_SV1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 60 61 bool pmSourcesWrite_CMF_PS1_DV1(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 62 bool pmSourcesWrite_CMF_PS1_DV1_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 63 bool pmSourcesWrite_CMF_PS1_DV1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 64 65 bool pmSourcesWrite_CMF_PS1_DV2(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe); 66 bool pmSourcesWrite_CMF_PS1_DV2_XSRC(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe); 67 bool pmSourcesWrite_CMF_PS1_DV2_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname); 54 68 55 69 psArray *pmSourcesReadCMP (char *filename, psMetadata *header); … … 63 77 psArray *pmSourcesRead_CMF_PS1_SV1 (psFits *fits, psMetadata *header); 64 78 psArray *pmSourcesRead_CMF_PS1_DV1 (psFits *fits, psMetadata *header); 79 psArray *pmSourcesRead_CMF_PS1_DV2 (psFits *fits, psMetadata *header); 65 80 66 81 bool pmSourcesWritePSFs (psArray *sources, char *filename); -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_CMF_PS1_DV1.c
r28013 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 … … 47 56 // This version has elements intended for difference images & forced photometry: 48 57 // diffStats entries (good for dipoles); flux + flux error (for insignificant detections) 49 bool pmSourcesWrite_CMF_PS1_DV1 (psFits *fits, pmReadout *readout, psArray *sources, 50 psMetadata *imageHeader, psMetadata *tableHeader, char *extname) 58 bool pmSourcesWrite_CMF_PS1_DV1 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe) 51 59 { 52 60 PS_ASSERT_PTR_NON_NULL(fits, false); … … 194 202 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor); 195 203 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta); 196 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeight );204 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeightNotBad); 197 205 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 198 206 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); … … 324 332 source->peak = pmPeakAlloc(PAR[PM_PAR_XPOS], PAR[PM_PAR_YPOS], peakFlux, PM_PEAK_LONE); 325 333 source->peak->flux = peakFlux; 334 source->peak->xf = PAR[PM_PAR_XPOS]; // more accurate position 335 source->peak->yf = PAR[PM_PAR_YPOS]; // more accurate position 326 336 source->peak->dx = dPAR[PM_PAR_XPOS]; 327 337 source->peak->dy = dPAR[PM_PAR_YPOS]; 328 source->peak->SN = sqrt(source->peak->flux); // XXX a proxy: various functions sort by peak S/N 329 330 source->pixWeight = psMetadataLookupF32 (&status, row, "PSF_QF"); 338 if (isfinite (source->errMag) && (source->errMag > 0.0)) { 339 source->peak->SN = 1.0 / source->errMag; 340 } else { 341 source->peak->SN = sqrt(source->peak->flux); // an alternate proxy: various functions sort by peak S/N 342 } 343 344 source->pixWeightNotBad = psMetadataLookupF32 (&status, row, "PSF_QF"); 331 345 source->crNsigma = psMetadataLookupF32 (&status, row, "CR_NSIGMA"); 332 346 source->extNsigma = psMetadataLookupF32 (&status, row, "EXT_NSIGMA"); … … 536 550 537 551 // XXX this layout is still the same as PS1_DEV_1 538 bool pmSourcesWrite_CMF_PS1_DV1_XFIT (psFits *fits, pmReadout *readout, psArray *sources, char *extname)552 bool pmSourcesWrite_CMF_PS1_DV1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname) 539 553 { 540 554 … … 585 599 assert (model); 586 600 601 // skip models which were not actually fitted 602 if (model->flags & PM_MODEL_STATUS_BADARGS) continue; 603 587 604 PAR = model->params->data.F32; 588 605 dPAR = model->dparams->data.F32; -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c
r28013 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 … … 46 55 47 56 // NOTE: this output function is intended for psphotStack analysis: it includes per-psf radial fluxes 48 // XXX currently inthe 'read' function is NOT consistent with the 'write' function (does not read radial fluxes)57 // XXX currently, the 'read' function is NOT consistent with the 'write' function (does not read radial fluxes) 49 58 50 59 bool pmSourcesWrite_CMF_PS1_SV1 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe) … … 62 71 psF32 errMag, chisq, apRadius; 63 72 psS32 nPix, nDOF; 73 char keyword1[80], keyword2[80]; 64 74 65 75 pmChip *chip = readout->parent->parent; … … 95 105 // we use this just to define the output vectors (which must be present for all objects) 96 106 bool status = false; 107 psVector *radMin = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.LOWER"); 97 108 psVector *radMax = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.UPPER"); 98 109 psAssert (radMax, "this must have been defined and tested earlier!"); 99 110 psAssert (radMax->n, "this must have been defined and tested earlier!"); 111 psAssert (radMin->n == radMax->n, "inconsistent annular bins"); 112 113 // write the radial profile apertures to header 114 for (int i = 0; i < radMax->n; i++) { 115 sprintf (keyword1, "RMIN_%02d", i); 116 sprintf (keyword2, "RMAX_%02d", i); 117 psMetadataAddF32 (imageHeader, PS_LIST_TAIL, keyword1, PS_META_REPLACE, "min radius for SB profile", radMin->data.F32[i]); 118 psMetadataAddF32 (imageHeader, PS_LIST_TAIL, keyword2, PS_META_REPLACE, "min radius for SB profile", radMax->data.F32[i]); 119 } 120 100 121 101 122 // we write out PSF-fits for all sources, regardless of quality. the source flags tell us the state … … 177 198 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_FLUX_SIG",PS_DATA_F32, "Sigma of PSF instrumental flux", source->psfFluxErr); 178 199 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG", PS_DATA_F32, "magnitude in standard aperture", source->apMag); 200 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RAW", PS_DATA_F32, "magnitude in reported aperture", source->apMagRaw); 179 201 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", apRadius); 180 202 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", peakMag); … … 193 215 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor); 194 216 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta); 195 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeight); 217 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor (bad)", source->pixWeightNotBad); 218 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF_PERFECT", PS_DATA_F32, "PSF coverage/quality factor (poor)", source->pixWeightNotPoor); 196 219 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 197 220 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); 198 221 199 222 // distinguish moments measure from window vs S/N > XX ?? 200 float mxx = source->moments ? source->moments->Mxx : NAN; 201 float mxy = source->moments ? source->moments->Mxy : NAN; 202 float myy = source->moments ? source->moments->Myy : NAN; 203 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", mxx); 204 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", mxy); 205 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", myy); 206 207 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS", PS_DATA_U32, "psphot analysis flags", source->mode); 223 float Mxx = source->moments ? source->moments->Mxx : NAN; 224 float Mxy = source->moments ? source->moments->Mxy : NAN; 225 float Myy = source->moments ? source->moments->Myy : NAN; 226 227 float Mrf = source->moments ? source->moments->Mrf : NAN; 228 float Mrh = source->moments ? source->moments->Mrh : NAN; 229 float Krf = source->moments ? source->moments->KronFlux : NAN; 230 float dKrf = source->moments ? source->moments->KronFluxErr : NAN; 231 232 float Kinner = source->moments ? source->moments->KronFinner : NAN; 233 float Kouter = source->moments ? source->moments->KronFouter : NAN; 234 235 float M_c3 = source->moments ? 1.0*source->moments->Mxxx - 3.0*source->moments->Mxyy : NAN; 236 float M_s3 = source->moments ? 3.0*source->moments->Mxxy - 1.0*source->moments->Myyy : NAN; 237 float M_c4 = source->moments ? 1.0*source->moments->Mxxxx - 6.0*source->moments->Mxxyy + 1.0*source->moments->Myyyy : NAN; 238 float M_s4 = source->moments ? 4.0*source->moments->Mxxxy - 4.0*source->moments->Mxyyy : NAN; 239 240 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", Mxx); 241 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", Mxy); 242 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", Myy); 243 244 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3C", PS_DATA_F32, "third momemt cos theta", M_c3); 245 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3S", PS_DATA_F32, "third momemt sin theta", M_s3); 246 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4C", PS_DATA_F32, "fourth momemt cos theta", M_c4); 247 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4S", PS_DATA_F32, "fourth momemt sin theta", M_s4); 248 249 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_R1", PS_DATA_F32, "first radial moment", Mrf); 250 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_RH", PS_DATA_F32, "half radial moment", Mrh); 251 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Krf); 252 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_ERR", PS_DATA_F32, "Kron Flux Error", dKrf); 253 254 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_INNER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Kinner); 255 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_OUTER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Kouter); 256 257 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS", PS_DATA_U32, "psphot analysis flags", source->mode); 258 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS2", PS_DATA_U32, "psphot analysis flags", source->mode2); 208 259 209 260 psVector *radFlux = psVectorAlloc(radMax->n, PS_TYPE_F32); … … 352 403 source->peak = pmPeakAlloc(PAR[PM_PAR_XPOS], PAR[PM_PAR_YPOS], peakFlux, PM_PEAK_LONE); 353 404 source->peak->flux = peakFlux; 405 source->peak->xf = PAR[PM_PAR_XPOS]; // more accurate position 406 source->peak->yf = PAR[PM_PAR_YPOS]; // more accurate position 354 407 source->peak->dx = dPAR[PM_PAR_XPOS]; 355 408 source->peak->dy = dPAR[PM_PAR_YPOS]; 356 source->peak->SN = sqrt(source->peak->flux); // XXX a proxy: various functions sort by peak S/N 357 358 source->pixWeight = psMetadataLookupF32 (&status, row, "PSF_QF"); 409 if (isfinite (source->errMag) && (source->errMag > 0.0)) { 410 source->peak->SN = 1.0 / source->errMag; 411 } else { 412 source->peak->SN = sqrt(source->peak->flux); // an alternate proxy: various functions sort by peak S/N 413 } 414 415 source->pixWeightNotBad = psMetadataLookupF32 (&status, row, "PSF_QF"); 416 source->pixWeightNotPoor = psMetadataLookupF32 (&status, row, "PSF_QF_PERFECT"); 359 417 source->crNsigma = psMetadataLookupF32 (&status, row, "CR_NSIGMA"); 360 418 source->extNsigma = psMetadataLookupF32 (&status, row, "EXT_NSIGMA"); … … 371 429 source->moments->Myy = psMetadataLookupF32 (&status, row, "MOMENTS_YY"); 372 430 431 source->moments->Mrf = psMetadataLookupF32 (&status, row, "MOMENTS_R1"); 432 source->moments->Mrh = psMetadataLookupF32 (&status, row, "MOMENTS_RH"); 433 source->moments->KronFlux = psMetadataLookupF32 (&status, row, "KRON_FLUX"); 434 source->moments->KronFluxErr = psMetadataLookupF32 (&status, row, "KRON_FLUX_ERR"); 435 436 source->moments->KronFinner = psMetadataLookupF32 (&status, row, "KRON_FLUX_INNER"); 437 source->moments->KronFouter = psMetadataLookupF32 (&status, row, "KRON_FLUX_OUTER"); 438 439 // XXX we do not save all of the 3rd and 4th moment parameters. when we load in data, 440 // we are storing enough information so the output will be consistent with the input 441 source->moments->Mxxx = +1.0 * psMetadataLookupF32 (&status, row, "MOMENTS_M3C"); 442 source->moments->Mxxy = 0.0; 443 source->moments->Mxyy = 0.0; 444 source->moments->Myyy = -1.0 * psMetadataLookupF32 (&status, row, "MOMENTS_M3S"); 445 446 source->moments->Mxxxx = +1.00 * psMetadataLookupF32 (&status, row, "MOMENTS_M4C"); 447 source->moments->Mxxxy = 0.0; 448 source->moments->Mxxyy = 0.0; 449 source->moments->Mxyyy = -0.25 * psMetadataLookupF32 (&status, row, "MOMENTS_M4S"); 450 source->moments->Myyyy = 0.0; 451 373 452 source->mode = psMetadataLookupU32 (&status, row, "FLAGS"); 453 source->mode2 = psMetadataLookupU32 (&status, row, "FLAGS2"); 374 454 assert (status); 375 455 … … 391 471 psF32 xErr, yErr; 392 472 int nRow = -1; 473 char keyword1[80], keyword2[80]; 393 474 394 475 // create a header to hold the output data … … 422 503 bool doAnnuli = psMetadataLookupBool (&status, recipe, "EXTENDED_SOURCE_ANNULI"); 423 504 bool doPetrosian = psMetadataLookupBool (&status, recipe, "EXTENDED_SOURCE_PETROSIAN"); 424 // bool doIsophotal = psMetadataLookupBool (&status, recipe, "EXTENDED_SOURCE_ISOPHOTAL");425 // bool doKron = psMetadataLookupBool (&status, recipe, "EXTENDED_SOURCE_KRON");426 505 427 506 psVector *radMin = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.LOWER"); … … 429 508 psAssert (radMin->n == radMax->n, "inconsistent annular bins"); 430 509 431 // int nRadialBins = 0; 432 // if (doAnnuli) { 433 // // get the max count of radial bins 434 // for (int i = 0; i < sources->n; i++) { 435 // pmSource *source = sources->data[i]; 436 // if (!source->extpars) continue; 437 // if (!source->extpars->radProfile ) continue; 438 // if (!source->extpars->radProfile->binSB) continue; 439 // nRadialBins = PS_MAX(nRadialBins, source->extpars->radProfile->binSB->n); 440 // } 441 // } 510 // write the radial profile apertures to header 511 for (int i = 0; i < radMax->n; i++) { 512 sprintf (keyword1, "RMIN_%02d", i); 513 sprintf (keyword2, "RMAX_%02d", i); 514 psMetadataAddF32 (outhead, PS_LIST_TAIL, keyword1, PS_META_REPLACE, "min radius for SB profile", radMin->data.F32[i]); 515 psMetadataAddF32 (outhead, PS_LIST_TAIL, keyword2, PS_META_REPLACE, "min radius for SB profile", radMax->data.F32[i]); 516 } 442 517 443 518 // we write out all sources, regardless of quality. the source flags tell us the state 444 519 for (int i = 0; i < sources->n; i++) { 445 // skip source if it is not a ext sourc446 // XXX we have two places that extended source parameters are measured:447 // psphotExtendedSources, which measures the aperture-like parameters and (potentially) the psf-convolved extended source models,448 // psphotFitEXT, which does the simple extended source model fit (not psf-convolved)449 // should we require both?450 451 520 pmSource *source = sources->data[i]; 452 521 … … 514 583 } 515 584 516 # if (0)517 // Kron measurements518 if (doKron) {519 pmSourceKronValues *kron = source->extpars->kron;520 if (kron) {521 psMetadataAdd (row, PS_LIST_TAIL, "KRON_MAG", PS_DATA_F32, "Kron Magnitude", kron->mag);522 psMetadataAdd (row, PS_LIST_TAIL, "KRON_MAG_ERR", PS_DATA_F32, "Kron Magnitude Error", kron->magErr);523 psMetadataAdd (row, PS_LIST_TAIL, "KRON_RADIUS", PS_DATA_F32, "Kron Radius", kron->rad);524 psMetadataAdd (row, PS_LIST_TAIL, "KRON_RADIUS_ERR", PS_DATA_F32, "Kron Radius Error", kron->radErr);525 } else {526 psMetadataAdd (row, PS_LIST_TAIL, "KRON_MAG", PS_DATA_F32, "Kron Magnitude", NAN);527 psMetadataAdd (row, PS_LIST_TAIL, "KRON_MAG_ERR", PS_DATA_F32, "Kron Magnitude Error", NAN);528 psMetadataAdd (row, PS_LIST_TAIL, "KRON_RADIUS", PS_DATA_F32, "Kron Radius", NAN);529 psMetadataAdd (row, PS_LIST_TAIL, "KRON_RADIUS_ERR", PS_DATA_F32, "Kron Radius Error", NAN);530 }531 }532 533 // Isophot measurements534 // XXX insert header data: isophotal level535 if (doIsophotal) {536 pmSourceIsophotalValues *isophot = source->extpars->isophot;537 if (isophot) {538 psMetadataAdd (row, PS_LIST_TAIL, "ISOPHOT_MAG", PS_DATA_F32, "Isophot Magnitude", isophot->mag);539 psMetadataAdd (row, PS_LIST_TAIL, "ISOPHOT_MAG_ERR", PS_DATA_F32, "Isophot Magnitude Error", isophot->magErr);540 psMetadataAdd (row, PS_LIST_TAIL, "ISOPHOT_RADIUS", PS_DATA_F32, "Isophot Radius", isophot->rad);541 psMetadataAdd (row, PS_LIST_TAIL, "ISOPHOT_RADIUS_ERR", PS_DATA_F32, "Isophot Radius Error", isophot->radErr);542 } else {543 psMetadataAdd (row, PS_LIST_TAIL, "ISOPHOT_MAG", PS_DATA_F32, "Isophot Magnitude", NAN);544 psMetadataAdd (row, PS_LIST_TAIL, "ISOPHOT_MAG_ERR", PS_DATA_F32, "Isophot Magnitude Error", NAN);545 psMetadataAdd (row, PS_LIST_TAIL, "ISOPHOT_RADIUS", PS_DATA_F32, "Isophot Radius", NAN);546 psMetadataAdd (row, PS_LIST_TAIL, "ISOPHOT_RADIUS_ERR", PS_DATA_F32, "Isophot Radius Error", NAN);547 }548 }549 # endif550 551 585 // Flux Annuli (if we have extended source measurements, we have these. only optionally save them) 552 586 if (doAnnuli) { … … 616 650 617 651 // XXX this layout is still the same as PS1_DEV_1 618 bool pmSourcesWrite_CMF_PS1_SV1_XFIT (psFits *fits, pmReadout *readout, psArray *sources, char *extname)652 bool pmSourcesWrite_CMF_PS1_SV1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname) 619 653 { 620 654 … … 665 699 assert (model); 666 700 701 // skip models which were not actually fitted 702 if (model->flags & PM_MODEL_STATUS_BADARGS) continue; 703 667 704 PAR = model->params->data.F32; 668 705 dPAR = model->dparams->data.F32; -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_CMF_PS1_V1.c
r27818 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 … … 45 54 // followed by a zero-size matrix, followed by the table data 46 55 47 bool pmSourcesWrite_CMF_PS1_V1 (psFits *fits, pmReadout *readout, psArray *sources, 48 psMetadata *imageHeader, psMetadata *tableHeader, char *extname) 56 bool pmSourcesWrite_CMF_PS1_V1 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe) 49 57 { 50 58 PS_ASSERT_PTR_NON_NULL(fits, false); … … 184 192 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor); 185 193 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta); 186 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeight );194 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeightNotBad); 187 195 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 188 196 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); … … 310 318 source->peak = pmPeakAlloc(PAR[PM_PAR_XPOS], PAR[PM_PAR_YPOS], peakFlux, PM_PEAK_LONE); 311 319 source->peak->flux = peakFlux; 320 source->peak->xf = PAR[PM_PAR_XPOS]; // more accurate position 321 source->peak->yf = PAR[PM_PAR_YPOS]; // more accurate position 312 322 source->peak->dx = dPAR[PM_PAR_XPOS]; 313 323 source->peak->dy = dPAR[PM_PAR_YPOS]; 314 315 source->pixWeight = psMetadataLookupF32 (&status, row, "PSF_QF"); 324 if (isfinite (source->errMag) && (source->errMag > 0.0)) { 325 source->peak->SN = 1.0 / source->errMag; 326 } else { 327 source->peak->SN = sqrt(source->peak->flux); // an alternate proxy: various functions sort by peak S/N 328 } 329 330 source->pixWeightNotBad = psMetadataLookupF32 (&status, row, "PSF_QF"); 316 331 source->crNsigma = psMetadataLookupF32 (&status, row, "CR_NSIGMA"); 317 332 source->extNsigma = psMetadataLookupF32 (&status, row, "EXT_NSIGMA"); … … 516 531 517 532 // XXX this layout is still the same as PS1_DEV_1 518 bool pmSourcesWrite_CMF_PS1_V1_XFIT (psFits *fits, pmReadout *readout, psArray *sources, char *extname)533 bool pmSourcesWrite_CMF_PS1_V1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname) 519 534 { 520 535 … … 565 580 assert (model); 566 581 582 // skip models which were not actually fitted 583 if (model->flags & PM_MODEL_STATUS_BADARGS) continue; 584 567 585 PAR = model->params->data.F32; 568 586 dPAR = model->dparams->data.F32; -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_CMF_PS1_V2.c
r27818 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 … … 45 54 // followed by a zero-size matrix, followed by the table data 46 55 47 bool pmSourcesWrite_CMF_PS1_V2 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname )56 bool pmSourcesWrite_CMF_PS1_V2 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe) 48 57 { 49 58 PS_ASSERT_PTR_NON_NULL(fits, false); … … 182 191 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor); 183 192 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta); 184 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeight );193 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeightNotBad); 185 194 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 186 195 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); … … 314 323 source->peak = pmPeakAlloc(PAR[PM_PAR_XPOS], PAR[PM_PAR_YPOS], peakFlux, PM_PEAK_LONE); 315 324 source->peak->flux = peakFlux; 325 source->peak->xf = PAR[PM_PAR_XPOS]; // more accurate position 326 source->peak->yf = PAR[PM_PAR_YPOS]; // more accurate position 316 327 source->peak->dx = dPAR[PM_PAR_XPOS]; 317 328 source->peak->dy = dPAR[PM_PAR_YPOS]; 318 source->peak->SN = sqrt(source->peak->flux); // XXX a proxy: various functions sort by peak S/N 319 320 source->pixWeight = psMetadataLookupF32 (&status, row, "PSF_QF"); 329 if (isfinite (source->errMag) && (source->errMag > 0.0)) { 330 source->peak->SN = 1.0 / source->errMag; 331 } else { 332 source->peak->SN = sqrt(source->peak->flux); // an alternate proxy: various functions sort by peak S/N 333 } 334 335 source->pixWeightNotBad = psMetadataLookupF32 (&status, row, "PSF_QF"); 321 336 source->crNsigma = psMetadataLookupF32 (&status, row, "CR_NSIGMA"); 322 337 source->extNsigma = psMetadataLookupF32 (&status, row, "EXT_NSIGMA"); … … 578 593 579 594 // XXX this layout is still the same as PS1_DEV_1 580 bool pmSourcesWrite_CMF_PS1_V2_XFIT (psFits *fits, pmReadout *readout, psArray *sources, char *extname)595 bool pmSourcesWrite_CMF_PS1_V2_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname) 581 596 { 582 597 … … 627 642 assert (model); 628 643 644 // skip models which were not actually fitted 645 if (model->flags & PM_MODEL_STATUS_BADARGS) continue; 646 629 647 PAR = model->params->data.F32; 630 648 dPAR = model->dparams->data.F32; -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_CMP.c
r20937 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_MatchedRefs.c
r27177 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 51 42 52 #include "pmAstrometryObjects.h" 43 53 #include "pmAstrometryWCS.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_OBJ.c
r20937 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_PS1_CAL_0.c
r25979 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 … … 49 58 // XXX how do I generate the source tables which I need to send to PSPS? 50 59 51 bool pmSourcesWrite_PS1_CAL_0 (psFits *fits, pmReadout *readout, psArray *sources, 52 psMetadata *imageHeader, psMetadata *tableHeader, char *extname) 60 bool pmSourcesWrite_PS1_CAL_0 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe) 53 61 { 54 62 PS_ASSERT_PTR_NON_NULL(fits, false); … … 180 188 psMetadataAdd (row, PS_LIST_TAIL, "PSF_WIDTH_Y", PS_DATA_F32, "PSF width in y coordinate", axes.minor); 181 189 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta); 182 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeight );190 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeightNotBad); 183 191 184 192 // XXX not sure how to get this : need to load Nimages with weight? … … 289 297 source->peak->dx = dPAR[PM_PAR_XPOS]; 290 298 source->peak->dy = dPAR[PM_PAR_YPOS]; 291 292 source->pixWeight = psMetadataLookupF32 (&status, row, "PSF_QF"); 299 source->peak->xf = PAR[PM_PAR_XPOS]; // more accurate position 300 source->peak->yf = PAR[PM_PAR_YPOS]; // more accurate position 301 302 source->pixWeightNotBad = psMetadataLookupF32 (&status, row, "PSF_QF"); 293 303 294 304 // note that some older versions used PSF_PROBABILITY: this was not well defined. … … 597 607 assert (model); 598 608 609 // skip models which were not actually fitted 610 if (model->flags & PM_MODEL_STATUS_BADARGS) continue; 611 599 612 PAR = model->params->data.F32; 600 613 dPAR = model->dparams->data.F32; -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_PS1_DEV_0.c
r25979 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 … … 49 58 // XXX how do I generate the source tables which I need to send to PSPS? 50 59 // XXX: input parameter imageHeader is never used. 51 bool pmSourcesWrite_PS1_DEV_0 (psFits *fits, psArray *sources, psMetadata *imageHeader, 52 psMetadata *tableHeader, char *extname) 60 bool pmSourcesWrite_PS1_DEV_0 (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe) 53 61 { 54 62 PS_ASSERT_PTR_NON_NULL(fits, false); … … 117 125 psMetadataAdd (row, PS_LIST_TAIL, "PSF_WIDTH_Y", PS_DATA_F32, "PSF width in y coordinate", axes.minor); 118 126 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta); 119 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeight );127 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeightNotBad); 120 128 // XXX not sure how to get this : need to load Nimages with weight 121 129 psMetadataAdd (row, PS_LIST_TAIL, "N_FRAMES", PS_DATA_U16, "Number of frames overlapping source center", nImageOverlap); … … 215 223 source->peak->dx = dPAR[PM_PAR_XPOS]; 216 224 source->peak->dy = dPAR[PM_PAR_YPOS]; 217 218 source->pixWeight = psMetadataLookupF32 (&status, row, "PSF_QF"); 225 source->peak->xf = PAR[PM_PAR_XPOS]; // more accurate position 226 source->peak->yf = PAR[PM_PAR_YPOS]; // more accurate position 227 228 source->pixWeightNotBad = psMetadataLookupF32 (&status, row, "PSF_QF"); 219 229 220 230 // XXX other values saved but not loaded? … … 228 238 return (sources); 229 239 } 240 241 bool pmSourcesWrite_PS1_DEV_0_XSRC (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe) 242 { 243 return true; 244 } 245 246 bool pmSourcesWrite_PS1_DEV_0_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname) 247 { 248 return true; 249 } -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_PS1_DEV_1.c
r25979 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 … … 47 56 // this output format is valid for psphot analysis of an image, and does not include calibrated 48 57 // values derived in the DVO database. 49 // XXX how do I generate the source tables which I need to send to PSPS? 50 51 bool pmSourcesWrite_PS1_DEV_1 (psFits *fits, psArray *sources, 52 psMetadata *imageHeader, psMetadata *tableHeader, char *extname) 58 59 bool pmSourcesWrite_PS1_DEV_1(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe) 53 60 { 54 61 PS_ASSERT_PTR_NON_NULL(fits, false); … … 142 149 psMetadataAdd (row, PS_LIST_TAIL, "PSF_WIDTH_Y", PS_DATA_F32, "PSF width in y coordinate", axes.minor); 143 150 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta); 144 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeight );151 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeightNotBad); 145 152 146 153 // XXX not sure how to get this : need to load Nimages with weight? … … 259 266 source->peak->dx = dPAR[PM_PAR_XPOS]; 260 267 source->peak->dy = dPAR[PM_PAR_YPOS]; 261 262 source->pixWeight = psMetadataLookupF32 (&status, row, "PSF_QF"); 268 source->peak->xf = PAR[PM_PAR_XPOS]; // more accurate position 269 source->peak->yf = PAR[PM_PAR_YPOS]; // more accurate position 270 271 source->pixWeightNotBad = psMetadataLookupF32 (&status, row, "PSF_QF"); 263 272 264 273 // note that some older versions used PSF_PROBABILITY: this was not well defined. … … 281 290 } 282 291 283 bool pmSourcesWrite_PS1_DEV_1_XSRC (psFits *fits, p sArray *sources, char *extname, psMetadata *recipe)292 bool pmSourcesWrite_PS1_DEV_1_XSRC (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe) 284 293 { 285 294 … … 453 462 } 454 463 455 bool pmSourcesWrite_PS1_DEV_1_XFIT (psFits *fits, psArray *sources, char *extname)464 bool pmSourcesWrite_PS1_DEV_1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname) 456 465 { 457 466 … … 502 511 assert (model); 503 512 513 // skip models which were not actually fitted 514 if (model->flags & PM_MODEL_STATUS_BADARGS) continue; 515 504 516 PAR = model->params->data.F32; 505 517 dPAR = model->dparams->data.F32; -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_RAW.c
r25754 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 41 #include "pmSourcePhotometry.h" 48 #include "pmPSFtry.h" 49 42 50 #include "pmSourceIO.h" 43 51 … … 120 128 source[0].peak->SN, 121 129 source[0].apRadius, 122 source[0].pixWeight ,130 source[0].pixWeightNotBad, 123 131 model[0].nDOF, 124 132 model[0].nIter); … … 182 190 source[0].peak->SN, 183 191 source[0].apRadius, 184 source[0].pixWeight ,192 source[0].pixWeightNotBad, 185 193 model[0].nDOF, 186 194 model[0].nIter); -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_SMPDATA.c
r25979 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmResiduals.h" 35 #include "pmGrowthCurve.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 … … 45 54 // followed by a zero-size matrix, followed by the table data 46 55 // XXX: input parameter imageHeader is never used 47 bool pmSourcesWrite_SMPDATA (psFits *fits, psArray *sources, psMetadata *imageHeader, 48 psMetadata *tableHeader, char *extname) 56 bool pmSourcesWrite_SMPDATA (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, psMetadata *tableHeader, char *extname, psMetadata *recipe) 49 57 { 50 58 PS_ASSERT_PTR_NON_NULL(fits, false); … … 106 114 psMetadataAdd (row, PS_LIST_TAIL, "THETA", PS_DATA_F32, "", axes.theta); 107 115 psMetadataAdd (row, PS_LIST_TAIL, "DOPHOT", PS_DATA_U8, "", type); 108 psMetadataAdd (row, PS_LIST_TAIL, "WEIGHT", PS_DATA_U8, "", PS_MIN (255, PS_MAX(0, 255*source->pixWeight )));116 psMetadataAdd (row, PS_LIST_TAIL, "WEIGHT", PS_DATA_U8, "", PS_MIN (255, PS_MAX(0, 255*source->pixWeightNotBad))); 109 117 psMetadataAdd (row, PS_LIST_TAIL, "DUMMY", PS_DATA_U16, "", 0); 110 118 … … 189 197 source->apMag = psMetadataLookupF32 (&status, row, "MAG_AP") - ZERO_POINT; 190 198 191 source->pixWeight = psMetadataLookupU8 (&status, row, "WEIGHT")/255.0;199 source->pixWeightNotBad = psMetadataLookupU8 (&status, row, "WEIGHT")/255.0; 192 200 int dophot = psMetadataLookupU8 (&status, row, "DOPHOT"); 193 201 pmSourceSetDophotType (source, dophot); … … 204 212 return (sources); 205 213 } 214 215 bool pmSourcesWrite_SMPDATA_XSRC (psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe) 216 { 217 return true; 218 } 219 220 bool pmSourcesWrite_SMPDATA_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname) 221 { 222 return true; 223 } -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceIO_SX.c
r20937 r29060 28 28 #include "pmFPAfile.h" 29 29 30 #include "pmTrend2D.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 30 33 #include "pmSpan.h" 34 #include "pmFootprintSpans.h" 31 35 #include "pmFootprint.h" 32 36 #include "pmPeaks.h" 33 37 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 38 #include "pmModelFuncs.h" 39 #include "pmModel.h" 40 #include "pmModelUtils.h" 41 #include "pmModelClass.h" 42 #include "pmSourceMasks.h" 43 #include "pmSourceExtendedPars.h" 44 #include "pmSourceDiffStats.h" 45 #include "pmSource.h" 46 #include "pmSourceFitModel.h" 37 47 #include "pmPSF.h" 38 #include "pmModel.h" 39 #include "pmSource.h" 40 #include "pmModelClass.h" 48 #include "pmPSFtry.h" 49 41 50 #include "pmSourceIO.h" 42 51 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceMasks.h
r24694 r29060 39 39 } pmSourceMode; 40 40 41 // Bit flags to distinguish analysis results 42 // When adding to or subtracting from this list, please also modify pmSourceMaskHeader 43 typedef enum { 44 PM_SOURCE_MODE2_DEFAULT = 0x00000000, ///< Initial value: resets all bits 45 PM_SOURCE_MODE2_DIFF_WITH_SINGLE = 0x00000001, ///< diff source matched to a single positive detection 46 PM_SOURCE_MODE2_DIFF_WITH_DOUBLE = 0x00000002, ///< diff source matched to positive detections in both images 47 } pmSourceMode2; 41 48 42 49 /// Populate header with mask values -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceMatch.c
r28518 r29060 6 6 #include <string.h> 7 7 #include <pslib.h> 8 8 #include "pmHDU.h" 9 #include "pmFPA.h" 10 11 #include "pmTrend2D.h" 12 #include "pmResiduals.h" 13 #include "pmGrowthCurve.h" 14 #include "pmSpan.h" 15 #include "pmFootprintSpans.h" 16 #include "pmFootprint.h" 17 #include "pmPeaks.h" 18 #include "pmMoments.h" 19 #include "pmModelFuncs.h" 20 #include "pmModel.h" 21 #include "pmModelUtils.h" 22 #include "pmModelClass.h" 23 #include "pmSourceMasks.h" 24 #include "pmSourceExtendedPars.h" 25 #include "pmSourceDiffStats.h" 9 26 #include "pmSource.h" 27 #include "pmSourceFitModel.h" 28 #include "pmPSF.h" 29 #include "pmPSFtry.h" 30 #include "pmDetections.h" 31 10 32 #include "pmErrorCodes.h" 11 33 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceMatch.h
r26076 r29060 1 1 #ifndef PM_SOURCE_MATCH_H 2 2 #define PM_SOURCE_MATCH_H 3 4 #include <pslib.h>5 3 6 4 /// Mask values for matched sources -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceMoments.c
r27531 r29060 22 22 #include <strings.h> 23 23 #include <pslib.h> 24 24 25 #include "pmHDU.h" 25 26 #include "pmFPA.h" 26 #include "pmFPAMaskWeight.h" 27 28 #include "pmTrend2D.h" 29 #include "pmResiduals.h" 30 #include "pmGrowthCurve.h" 27 31 #include "pmSpan.h" 32 #include "pmFootprintSpans.h" 28 33 #include "pmFootprint.h" 29 34 #include "pmPeaks.h" 30 35 #include "pmMoments.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 33 #include "pmTrend2D.h" 34 #include "pmPSF.h" 36 #include "pmModelFuncs.h" 35 37 #include "pmModel.h" 38 #include "pmModelUtils.h" 39 #include "pmModelClass.h" 40 #include "pmSourceMasks.h" 41 #include "pmSourceExtendedPars.h" 42 #include "pmSourceDiffStats.h" 36 43 #include "pmSource.h" 37 44 … … 54 61 # define VALID_RADIUS(X,Y,RAD2) (((RAD2) >= (PS_SQR(X) + PS_SQR(Y))) ? 1 : 0) 55 62 63 static bool beVerbose = false; 64 void pmSourceMomentsSetVerbose(bool state){ beVerbose = state; } 65 56 66 bool pmSourceMoments(pmSource *source, psF32 radius, psF32 sigma, psF32 minSN, psImageMaskType maskVal) 57 67 { … … 61 71 PS_ASSERT_FLOAT_LARGER_THAN(radius, 0.0, false); 62 72 63 // use sky from moments if defined, 0.0 otherwise 73 // use sky from moments if defined, 0.0 otherwise 74 75 // XXX this value comes from the sky model at the source center, and tends to over-estimate 76 // the sky in the vicinity of bright sources. we are better off assuming the model worked 77 // well: 64 78 psF32 sky = 0.0; 65 79 if (source->moments == NULL) { 66 source->moments = pmMomentsAlloc(); 67 } else { 68 sky = source->moments->Sky; 69 } 80 source->moments = pmMomentsAlloc(); 81 } 82 // XXX if (source->moments == NULL) { 83 // XXX source->moments = pmMomentsAlloc(); 84 // XXX } else { 85 // XXX sky = source->moments->Sky; 86 // XXX } 70 87 71 88 // First Pass: calculate the first moments (these are subtracted from the coordinates below) … … 131 148 psF32 wDiff = *vWgt; 132 149 133 // skip pixels below specified significance level. this is allowed, but should be 134 // avoided -- the over-weights the wings of bright stars compared to those of faint 135 // stars. 136 if (PS_SQR(pDiff) < minSN2*wDiff) continue; 137 // if (pDiff < 0) continue; // XXX : MWV says I should include < 0.0 valued points... 150 // skip pixels below specified significance level. for a PSFs, this 151 // over-weights the wings of bright stars compared to those of faint stars. 152 // for the estimator used for extended source analysis (where the window 153 // function is allowed to be arbitrarily large), we need to clip to avoid 154 // negative second moments. 155 if (PS_SQR(pDiff) < minSN2*wDiff) continue; // 156 if ((minSN > 0.0) && (pDiff < 0)) continue; // 138 157 139 158 // Apply a Gaussian window function. Be careful with the window function. S/N … … 197 216 // Xn = SUM (x - xc)^n * (z - sky) 198 217 218 psF32 RF = 0.0; 219 psF32 RH = 0.0; 220 psF32 RS = 0.0; 199 221 psF32 XX = 0.0; 200 222 psF32 XY = 0.0; … … 244 266 if (r > radius) continue; 245 267 246 psF32 pDiff = *vPix - sky; 268 psF32 fDiff = *vPix - sky; 269 psF32 pDiff = fDiff; 247 270 psF32 wDiff = *vWgt; 248 271 … … 257 280 if (sigma > 0.0) { 258 281 // XXX a lot of extra flops; can we do pre-calculate? 259 psF32 z = (PS_SQR(xDiff) + PS_SQR(yDiff))*rsigma2; 282 // XXX we were re-calculating r2 (maybe the compiler caught this?) 283 // psF32 z = (PS_SQR(xDiff) + PS_SQR(yDiff))*rsigma2; 284 psF32 z = r2 * rsigma2; 260 285 assert (z >= 0.0); 261 286 psF32 weight = exp(-z); … … 266 291 267 292 Sum += pDiff; 293 294 # if (1) 295 # if (0) 296 if (fDiff < 0) continue; 297 # endif 298 psF32 rf = r * fDiff; 299 psF32 rh = sqrt(r) * fDiff; 300 psF32 rs = fDiff; 301 # else 302 psF32 rf = r * pDiff; 303 psF32 rh = sqrt(r) * pDiff; 304 psF32 rs = pDiff; 305 # endif 268 306 269 307 psF32 x = xDiff * pDiff; … … 284 322 psF32 xyyy = xDiff * yyy / r2; 285 323 psF32 yyyy = yDiff * yyy / r2; 324 325 RF += rf; 326 RH += rh; 327 RS += rs; 286 328 287 329 XX += xx; … … 302 344 } 303 345 346 source->moments->Mrf = RF/RS; 347 source->moments->Mrh = RH/RS; 348 304 349 source->moments->Mxx = XX/Sum; 305 350 source->moments->Mxy = XY/Sum; … … 317 362 source->moments->Myyyy = YYYY/Sum; 318 363 319 // if (source->moments->Mxx < 0) { 320 // fprintf (stderr, "error: neg second moment??\n"); 321 // } 322 // if (source->moments->Myy < 0) { 323 // fprintf (stderr, "error: neg second moment??\n"); 324 // } 325 326 psTrace ("psModules.objects", 4, "Mxx: %f Mxy: %f Myy: %f Mxxx: %f Mxxy: %f Mxyy: %f Myyy: %f Mxxxx: %f Mxxxy: %f Mxxyy: %f Mxyyy: %f Mxyyy: %f\n", 364 // Calculate the Kron magnitude (make this block optional?) 365 // float radKron = 2.5*source->moments->Mrf; 366 float radKinner = 1.0*source->moments->Mrf; 367 float radKron = 2.5*source->moments->Mrf; 368 float radKouter = 4.0*source->moments->Mrf; 369 370 int nKronPix = 0; 371 Sum = Var = 0.0; 372 float SumInner = 0.0; 373 float SumOuter = 0.0; 374 375 for (psS32 row = 0; row < source->pixels->numRows ; row++) { 376 377 psF32 yDiff = row - yCM; 378 if (fabs(yDiff) > radKron) continue; 379 380 psF32 *vPix = source->pixels->data.F32[row]; 381 psF32 *vWgt = source->variance->data.F32[row]; 382 psImageMaskType *vMsk = (source->maskObj == NULL) ? NULL : source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[row]; 383 384 for (psS32 col = 0; col < source->pixels->numCols ; col++, vPix++, vWgt++) { 385 if (vMsk) { 386 if (*vMsk & maskVal) { 387 vMsk++; 388 continue; 389 } 390 vMsk++; 391 } 392 if (isnan(*vPix)) continue; 393 394 psF32 xDiff = col - xCM; 395 if (fabs(xDiff) > radKron) continue; 396 397 // radKron is just a function of (xDiff, yDiff) 398 psF32 r2 = PS_SQR(xDiff) + PS_SQR(yDiff); 399 psF32 r = sqrt(r2); 400 401 psF32 pDiff = *vPix - sky; 402 psF32 wDiff = *vWgt; 403 404 // skip pixels below specified significance level. this is allowed, but should be 405 // avoided -- the over-weights the wings of bright stars compared to those of faint 406 // stars. 407 if (PS_SQR(pDiff) < minSN2*wDiff) continue; 408 409 if (r < radKron) { 410 Sum += pDiff; 411 Var += wDiff; 412 nKronPix ++; 413 // if (beVerbose) fprintf (stderr, "mome: %d %d %f %f %f\n", col, row, sky, *vPix, Sum); 414 } 415 416 if ((r > radKinner) && (r < radKron)) { 417 SumInner += pDiff; 418 } 419 if ((r > radKron) && (r < radKouter)) { 420 SumOuter += pDiff; 421 } 422 } 423 } 424 source->moments->KronFlux = Sum; 425 source->moments->KronFinner = SumInner; 426 source->moments->KronFouter = SumOuter; 427 source->moments->KronFluxErr = sqrt(Var); 428 429 psTrace ("psModules.objects", 4, "Mrf: %f KronFlux: %f Mxx: %f Mxy: %f Myy: %f Mxxx: %f Mxxy: %f Mxyy: %f Myyy: %f Mxxxx: %f Mxxxy: %f Mxxyy: %f Mxyyy: %f Mxyyy: %f\n", 430 source->moments->Mrf, source->moments->KronFlux, 327 431 source->moments->Mxx, source->moments->Mxy, source->moments->Myy, 328 432 source->moments->Mxxx, source->moments->Mxxy, source->moments->Mxyy, source->moments->Myyy, -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourcePhotometry.c
r28517 r29060 22 22 #include "pmFPA.h" 23 23 #include "pmFPAMaskWeight.h" 24 25 #include "pmTrend2D.h" 26 #include "pmResiduals.h" 27 #include "pmGrowthCurve.h" 24 28 #include "pmSpan.h" 29 #include "pmFootprintSpans.h" 25 30 #include "pmFootprint.h" 26 31 #include "pmPeaks.h" 27 32 #include "pmMoments.h" 28 #include "pmGrowthCurve.h" 29 #include "pmResiduals.h" 30 #include "pmTrend2D.h" 33 #include "pmModelFuncs.h" 34 #include "pmModel.h" 35 #include "pmModelUtils.h" 36 #include "pmModelClass.h" 37 #include "pmSourceMasks.h" 38 #include "pmSourceExtendedPars.h" 39 #include "pmSourceDiffStats.h" 40 #include "pmSource.h" 41 #include "pmSourceFitModel.h" 31 42 #include "pmPSF.h" 32 #include "pmModel.h" 33 #include "pmSource.h" 34 #include "pmModelClass.h" 43 #include "pmPSFtry.h" 44 35 45 #include "pmSourcePhotometry.h" 36 46 … … 66 76 67 77 // XXX masked region should be (optionally) elliptical 68 bool pmSourceMagnitudes (pmSource *source, pmPSF *psf, pmSourcePhotometryMode mode, psImageMaskType maskVal )78 bool pmSourceMagnitudes (pmSource *source, pmPSF *psf, pmSourcePhotometryMode mode, psImageMaskType maskVal, psImageMaskType markVal) 69 79 { 70 80 PS_ASSERT_PTR_NON_NULL(source, false); … … 122 132 for (int i = 0; i < source->modelFits->n; i++) { 123 133 pmModel *model = source->modelFits->data[i]; 134 if (model->flags & PM_MODEL_STATUS_BADARGS) continue; 124 135 status = pmSourcePhotometryModel (&model->mag, NULL, model); 125 136 if (model == source->modelEXT) foundEXT = true; … … 145 156 // measure the contribution of included pixels 146 157 if (mode & PM_SOURCE_PHOT_WEIGHT) { 147 pmSourcePixelWeight (&source->pixWeight , model, source->maskObj, maskVal);158 pmSourcePixelWeight (&source->pixWeightNotBad, &source->pixWeightNotPoor, model, source->maskObj, maskVal, markVal); 148 159 } 149 160 150 161 // measure the contribution of included pixels 151 162 if (mode & PM_SOURCE_PHOT_DIFFSTATS) { 152 pmSourceMeasureDiffStats (source, maskVal );163 pmSourceMeasureDiffStats (source, maskVal, markVal); 153 164 } 154 165 … … 191 202 192 203 // measure object aperture photometry 193 status = pmSourcePhotometryAper (&source->apMag , model, flux, mask, maskVal);204 status = pmSourcePhotometryAper (&source->apMagRaw, model, flux, mask, maskVal); 194 205 if (!status) { 195 206 psTrace ("psModules.objects", 3, "fail mag : bad Ap Mag"); … … 199 210 // if the aper mag is NAN, the flux < 0. this can happen for sources near the 200 211 // detection limits (esp near bright neighbors) 212 source->apMag = source->apMagRaw; 201 213 if (isfinite (source->apMag) && isPSF && psf) { 202 214 if (psf->growth && (mode & PM_SOURCE_PHOT_GROWTH)) { 203 source->apMag +=pmGrowthCurveCorrect (psf->growth, source->apRadius);215 source->apMag = source->apMagRaw + pmGrowthCurveCorrect (psf->growth, source->apRadius); 204 216 } 205 217 if (mode & PM_SOURCE_PHOT_APCORR) { 206 218 // XXX this should be removed -- we no longer fit for the 'sky bias' 219 // XXX is this happening??? 207 220 rflux = pow (10.0, 0.4*source->psfMag); 221 psAssert (psf->skyBias == 0.0, "sky bias not 0"); 222 psAssert (psf->skySat == 0.0, "sky sat not 0"); 208 223 source->apMag -= PS_SQR(source->apRadius)*rflux * psf->skyBias + psf->skySat / rflux; 209 224 } … … 257 272 PS_ASSERT_PTR_NON_NULL(image, false); 258 273 PS_ASSERT_PTR_NON_NULL(mask, false); 259 PS_ASSERT_PTR_NON_NULL(model, false); 274 275 if (DO_SKY) { 276 PS_ASSERT_PTR_NON_NULL(model, false); 277 } 260 278 261 279 float apSum = 0; … … 271 289 psF32 **imData = image->data.F32; 272 290 psImageMaskType **mkData = mask->data.PS_TYPE_IMAGE_MASK_DATA; 291 int nAperPix = 0; 273 292 274 293 // measure apMag 275 for (int i x = 0; ix < image->numCols; ix++) {276 for (int iy = 0; iy < image->numRows; iy++) {294 for (int iy = 0; iy < image->numRows; iy++) { 295 for (int ix = 0; ix < image->numCols; ix++) { 277 296 if (mkData[iy][ix] & maskVal) 278 297 continue; 279 298 apSum += imData[iy][ix] - sky; 299 nAperPix ++; 300 // fprintf (stderr, "aper: %d %d %f %f %f\n", ix, iy, sky, imData[iy][ix], apSum); 280 301 } 281 302 } … … 290 311 291 312 // return source aperture magnitude 292 bool pmSourcePixelWeight (float *pixWeight, pmModel *model, psImage *mask, psImageMaskType maskVal) 293 { 294 PS_ASSERT_PTR_NON_NULL(pixWeight, false); 313 bool pmSourcePixelWeight (float *pixWeightNotBad, float *pixWeightNotPoor, pmModel *model, psImage *mask, psImageMaskType maskVal, psImageMaskType markVal) 314 { 315 PS_ASSERT_PTR_NON_NULL(pixWeightNotBad, false); 316 PS_ASSERT_PTR_NON_NULL(pixWeightNotPoor, false); 295 317 PS_ASSERT_PTR_NON_NULL(mask, false); 296 318 PS_ASSERT_PTR_NON_NULL(model, false); 297 319 298 320 float modelSum = 0; 299 float validSum = 0; 321 float notBadSum = 0; 322 float notPoorSum = 0; 300 323 float sky = 0; 301 324 float value; … … 305 328 int dY, DY, NY; 306 329 307 *pixWeight = 0.0; 330 *pixWeightNotBad = 0.0; 331 *pixWeightNotPoor = 0.0; 308 332 309 333 // we only care about the value of the object model, not the local sky … … 345 369 346 370 // for the full model, add all points 347 value = model->modelFunc (NULL, params, coord) - sky;371 value = fabs(model->modelFunc (NULL, params, coord) - sky); 348 372 modelSum += value; 349 373 350 374 // include count only the unmasked pixels within the image area 351 if (mx < 0) 352 continue; 353 if (my < 0) 354 continue; 355 if (mx >= NX) 356 continue; 357 if (my >= NY) 358 continue; 359 if (mask->data.PS_TYPE_IMAGE_MASK_DATA[my][mx] & maskVal) 360 continue; 361 362 validSum += value; 375 if (mx < 0) continue; 376 if (my < 0) continue; 377 if (mx >= NX) continue; 378 if (my >= NY) continue; 379 380 if (!(mask->data.PS_TYPE_IMAGE_MASK_DATA[my][mx] & maskVal)) { 381 notBadSum += value; 382 } 383 if (!(mask->data.PS_TYPE_IMAGE_MASK_DATA[my][mx] & ~markVal)) { 384 notPoorSum += value; 385 } 363 386 } 364 387 } 365 388 psFree (coord); 366 389 367 if (validSum <= 0) 368 return false; 369 370 *pixWeight = validSum / modelSum; 390 *pixWeightNotBad = notBadSum / modelSum; 391 *pixWeightNotPoor = notPoorSum / modelSum; 392 371 393 return (true); 372 394 } … … 374 396 # define FLUX_LIMIT 3.0 375 397 376 // return source aperture magnitude377 bool pmSourceMeasureDiffStats (pmSource *source, psImageMaskType maskVal )398 // measure stats that may be using in difference images for distinguishing real sources from bad residuals 399 bool pmSourceMeasureDiffStats (pmSource *source, psImageMaskType maskVal, psImageMaskType markVal) 378 400 { 379 401 PS_ASSERT_PTR_NON_NULL(source, false); … … 399 421 for (int iy = 0; iy < flux->numRows; iy++) { 400 422 for (int ix = 0; ix < flux->numCols; ix++) { 423 // only count up the stats in the unmarked region (ie, the aperture) 424 if (mask->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix] & markVal) { 425 continue; 426 } 401 427 if (mask->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix] & maskVal) { 402 428 nMask ++; -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourcePhotometry.h
r28426 r29060 52 52 53 53 bool pmSourceMagnitudesInit (psMetadata *config); 54 bool pmSourceMagnitudes (pmSource *source, pmPSF *psf, pmSourcePhotometryMode mode, psImageMaskType maskVal); 55 bool pmSourcePixelWeight (float *pixWeight, pmModel *model, psImage *mask, psImageMaskType maskVal); 54 bool pmSourceMagnitudes (pmSource *source, pmPSF *psf, pmSourcePhotometryMode mode, psImageMaskType maskVal, psImageMaskType markVal); 55 56 bool pmSourcePixelWeight (float *pixWeightNotBad, float *pixWeightNotPoor, pmModel *model, psImage *mask, psImageMaskType maskVal, psImageMaskType markVal); 57 56 58 bool pmSourceChisq (pmModel *model, psImage *image, psImage *mask, psImage *weight, psImageMaskType maskVal, const float covarFactor); 57 59 58 bool pmSourceMeasureDiffStats (pmSource *source, psImageMaskType maskVal );60 bool pmSourceMeasureDiffStats (pmSource *source, psImageMaskType maskVal, psImageMaskType markVal); 59 61 60 62 double pmSourceDataDotModel (const pmSource *Mi, const pmSource *Mj, const bool unweighted_sum, const float covarFactor, psImageMaskType maskVal); -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourcePlotApResid.c
r26893 r29060 25 25 #include "pmFPAview.h" 26 26 #include "pmFPAfile.h" 27 28 #include "pmTrend2D.h" 29 #include "pmResiduals.h" 30 #include "pmGrowthCurve.h" 27 31 #include "pmSpan.h" 32 #include "pmFootprintSpans.h" 28 33 #include "pmFootprint.h" 29 34 #include "pmPeaks.h" 30 35 #include "pmMoments.h" 31 #include "pmResiduals.h" 32 #include "pmGrowthCurve.h" 33 #include "pmTrend2D.h" 36 #include "pmModelFuncs.h" 37 #include "pmModel.h" 38 #include "pmModelUtils.h" 39 #include "pmModelClass.h" 40 #include "pmSourceMasks.h" 41 #include "pmSourceExtendedPars.h" 42 #include "pmSourceDiffStats.h" 43 #include "pmSource.h" 44 #include "pmSourceFitModel.h" 34 45 #include "pmPSF.h" 35 #include "pmModel.h"36 46 #include "pmDetections.h" 37 #include "pmSource.h" 47 38 48 #include "pmSourcePlots.h" 39 49 #include "pmKapaPlots.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourcePlotMoments.c
r26893 r29060 28 28 #include "pmFPAview.h" 29 29 #include "pmFPAfile.h" 30 31 #include "pmTrend2D.h" 32 #include "pmResiduals.h" 33 #include "pmGrowthCurve.h" 30 34 #include "pmSpan.h" 35 #include "pmFootprintSpans.h" 31 36 #include "pmFootprint.h" 32 37 #include "pmPeaks.h" 33 38 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 39 #include "pmModelFuncs.h" 40 #include "pmModel.h" 41 #include "pmModelUtils.h" 42 #include "pmModelClass.h" 43 #include "pmSourceMasks.h" 44 #include "pmSourceExtendedPars.h" 45 #include "pmSourceDiffStats.h" 46 #include "pmSource.h" 47 #include "pmSourceFitModel.h" 37 48 #include "pmPSF.h" 38 #include "pmModel.h"39 49 #include "pmDetections.h" 40 #include "pmSource.h"41 50 #include "pmSourcePlots.h" 42 51 #include "pmKapaPlots.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourcePlotPSFModel.c
r26893 r29060 28 28 #include "pmFPAview.h" 29 29 #include "pmFPAfile.h" 30 31 32 #include "pmTrend2D.h" 33 #include "pmResiduals.h" 34 #include "pmGrowthCurve.h" 30 35 #include "pmSpan.h" 36 #include "pmFootprintSpans.h" 31 37 #include "pmFootprint.h" 32 38 #include "pmPeaks.h" 33 39 #include "pmMoments.h" 34 #include "pmGrowthCurve.h" 35 #include "pmResiduals.h" 36 #include "pmTrend2D.h" 40 #include "pmModelFuncs.h" 41 #include "pmModel.h" 42 #include "pmModelUtils.h" 43 #include "pmModelClass.h" 44 #include "pmSourceMasks.h" 45 #include "pmSourceExtendedPars.h" 46 #include "pmSourceDiffStats.h" 47 #include "pmSource.h" 48 #include "pmSourceFitModel.h" 37 49 #include "pmPSF.h" 38 #include "pmModel.h"39 50 #include "pmDetections.h" 40 #include "pmSource.h"41 51 #include "pmSourcePlots.h" 42 52 #include "pmKapaPlots.h" -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceSky.c
r23187 r29060 21 21 #include <string.h> 22 22 #include <pslib.h> 23 23 24 #include "pmHDU.h" 24 25 #include "pmFPA.h" 25 #include "pmFPAMaskWeight.h" 26 27 #include "pmTrend2D.h" 28 #include "pmResiduals.h" 29 #include "pmGrowthCurve.h" 26 30 #include "pmSpan.h" 31 #include "pmFootprintSpans.h" 27 32 #include "pmFootprint.h" 28 33 #include "pmPeaks.h" 29 34 #include "pmMoments.h" 30 #include "pmResiduals.h" 31 #include "pmGrowthCurve.h" 32 #include "pmTrend2D.h" 33 #include "pmPSF.h" 35 #include "pmModelFuncs.h" 34 36 #include "pmModel.h" 37 #include "pmModelUtils.h" 38 #include "pmModelClass.h" 39 #include "pmSourceMasks.h" 40 #include "pmSourceExtendedPars.h" 41 #include "pmSourceDiffStats.h" 35 42 #include "pmSource.h" 43 36 44 #include "pmSourceSky.h" 37 45 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceUtils.c
r24578 r29060 21 21 #include <string.h> 22 22 #include <pslib.h> 23 23 24 #include "pmHDU.h" 24 25 #include "pmFPA.h" 25 #include "pmFPAMaskWeight.h" 26 27 #include "pmTrend2D.h" 28 #include "pmResiduals.h" 29 #include "pmGrowthCurve.h" 26 30 #include "pmSpan.h" 31 #include "pmFootprintSpans.h" 27 32 #include "pmFootprint.h" 28 33 #include "pmPeaks.h" 29 34 #include "pmMoments.h" 30 #include "pmResiduals.h" 31 #include "pmGrowthCurve.h" 32 #include "pmTrend2D.h" 33 #include "pmPSF.h" 35 #include "pmModelFuncs.h" 34 36 #include "pmModel.h" 37 #include "pmModelUtils.h" 38 #include "pmModelClass.h" 39 #include "pmSourceMasks.h" 40 #include "pmSourceExtendedPars.h" 41 #include "pmSourceDiffStats.h" 35 42 #include "pmSource.h" 43 36 44 #include "pmSourceUtils.h" 37 45 -
branches/sc_branches/trunkTest/psModules/src/objects/pmSourceVisual.c
r26260 r29060 4 4 5 5 #include <pslib.h> 6 #include "pmHDU.h" 7 #include "pmFPA.h" 8 6 9 #include "pmTrend2D.h" 10 #include "pmResiduals.h" 11 #include "pmGrowthCurve.h" 12 #include "pmSpan.h" 13 #include "pmFootprintSpans.h" 14 #include "pmFootprint.h" 15 #include "pmPeaks.h" 16 #include "pmMoments.h" 17 #include "pmModelFuncs.h" 18 #include "pmModel.h" 19 #include "pmModelUtils.h" 20 #include "pmModelClass.h" 21 #include "pmSourceMasks.h" 22 #include "pmSourceExtendedPars.h" 23 #include "pmSourceDiffStats.h" 24 #include "pmSource.h" 25 #include "pmSourceFitModel.h" 7 26 #include "pmPSF.h" 8 27 #include "pmPSFtry.h" 9 #include "pmSource.h" 28 #include "pmDetections.h" 29 10 30 #include "pmSourceVisual.h" 11 31 … … 13 33 #include <kapa.h> 14 34 #include "pmVisual.h" 35 #include "pmVisualUtils.h" 15 36 16 37 // functions used to visualize the analysis as it goes … … 34 55 Graphdata graphdata; 35 56 36 if (!pmVisual IsVisual()) return true;57 if (!pmVisualTestLevel("psphot.psf.metric", 2)) return true; 37 58 38 59 if (kapa1 == -1) { … … 118 139 Graphdata graphdata; 119 140 120 if (!pmVisual IsVisual()) return true;141 if (!pmVisualTestLevel("psphot.psf.subpix", 3)) return true; 121 142 122 143 if (kapa1 == -1) { … … 280 301 bool pmSourceVisualShowModelFits (pmPSF *psf, psArray *sources, psImageMaskType maskVal) { 281 302 282 if (!pmVisual IsVisual()) return true;303 if (!pmVisualTestLevel("psphot.psf.fits", 2)) return true; 283 304 284 305 if (kapa2 == -1) { … … 360 381 bool pmSourceVisualShowModelFit (pmSource *source) { 361 382 362 if (!pmVisualIsVisual()) return true; 383 if (!pmVisualTestLevel("psphot.psf.fitresid", 2)) return true; 384 363 385 if (!source->pixels) return false; 364 386 if (!source->modelFlux) return false; … … 404 426 Graphdata graphdata; 405 427 406 if (!pmVisualIsVisual() || !plotPSF) return true; 428 if (!plotPSF) return true; 429 if (!pmVisualTestLevel("psphot.psf.resid", 2)) return true; 407 430 408 431 if (kapa1 == -1) { -
branches/sc_branches/trunkTest/psModules/src/objects/pmSpan.h
r20945 r29060 10 10 # ifndef PM_SPAN_H 11 11 # define PM_SPAN_H 12 13 #include <pslib.h>14 12 15 13 /// @addtogroup Objects Object Detection / Analysis Functions -
branches/sc_branches/trunkTest/psModules/src/objects/pmTrend2D.h
r25754 r29060 12 12 # ifndef PM_TREND_2D_H 13 13 # define PM_TREND_2D_H 14 15 #include <pslib.h>16 14 17 15 /// @addtogroup Objects Object Detection / Analysis Functions -
branches/sc_branches/trunkTest/psModules/src/psmodules.h
r28043 r29060 10 10 #include <pmKapaPlots.h> 11 11 #include <pmVisual.h> 12 #include <pmVisualUtils.h> 12 13 #include <ippStages.h> 13 14 #include <ippDiffMode.h> … … 113 114 114 115 // the following headers are from psModule:objects 116 #include <pmTrend2D.h> 117 #include <pmResiduals.h> 118 #include <pmGrowthCurve.h> 119 115 120 #include <pmSpan.h> 116 121 #include <pmFootprintSpans.h> … … 119 124 #include <pmDetections.h> 120 125 #include <pmMoments.h> 126 127 #include <pmModelFuncs.h> 128 #include <pmModel.h> 129 130 #include <pmSourceMasks.h> 121 131 #include <pmSourceExtendedPars.h> 122 132 #include <pmSourceDiffStats.h> 123 #include <pmResiduals.h> 124 #include <pmGrowthCurve.h> 125 #include <pmTrend2D.h> 133 #include <pmSource.h> 134 #include <pmSourceFitModel.h> 126 135 #include <pmPSF.h> 127 #include <pmModel.h> 128 #include <pmSourceMasks.h> 129 #include <pmSource.h> 136 #include <pmPSFtry.h> 130 137 #include <pmPhotObj.h> 131 138 #include <pmSourceUtils.h> 132 139 #include <pmSourceIO.h> 133 140 #include <pmSourceSky.h> 134 #include <pmSourceFitModel.h>135 141 #include <pmSourceFitSet.h> 136 142 #include <pmSourceContour.h> 137 143 #include <pmSourcePlots.h> 138 144 #include <pmPSF_IO.h> 139 #include <pmPSFtry.h>140 145 #include <pmModelClass.h> 141 146 #include <pmModelUtils.h> … … 144 149 #include <pmSourceMatch.h> 145 150 #include <pmDetEff.h> 151 #include <pmPCMdata.h> 146 152 147 153 // The following headers are from random locations, here because they cross bounds -
branches/sc_branches/trunkTest/psastro/src/psastroModelFitBoresite.c
r23989 r29060 80 80 params->data.F32[PAR_T0] = 0.0; 81 81 82 psMinimization *myMin = psMinimizationAlloc (25, 0.001 );82 psMinimization *myMin = psMinimizationAlloc (25, 0.001, 1.0); 83 83 psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32); 84 84 -
branches/sc_branches/trunkTest/psphot
- Property svn:mergeinfo deleted
-
branches/sc_branches/trunkTest/psphot/src/Makefile.am
r28013 r29060 163 163 psphotOutput.c \ 164 164 psphotFakeSources.c \ 165 psphotModelWithPSF.c \166 165 psphotExtendedSourceAnalysis.c \ 167 166 psphotExtendedSourceAnalysisByObject.c \ 168 167 psphotExtendedSourceFits.c \ 169 168 psphotKernelFromPSF.c \ 170 psphotPSFConvModel.c \171 169 psphotFitSet.c \ 172 170 psphotSourceFreePixels.c \ -
branches/sc_branches/trunkTest/psphot/src/psphot.h
r28013 r29060 12 12 13 13 #define PSPHOT_RECIPE_PSF_FAKE_ALLOW "PSF.FAKE.ALLOW" // Name for recipe component permitting fake PSFs 14 15 // pmPCMData : PSF Convolved Model data storage structure16 typedef struct {17 psImage *model;18 psArray *dmodels;19 psImage *modelConv;20 psArray *dmodelsConv;21 } pmPCMData;22 14 23 15 // top-level psphot functions … … 114 106 bool psphotExtendedSourceFits (pmConfig *config, const pmFPAview *view, const char *filerule); 115 107 bool psphotExtendedSourceFitsReadout (pmConfig *config, const pmFPAview *view, const char *filerule, int index, psMetadata *recipe); 108 bool psphotExtendedSourceFits_Threaded (psThreadJob *job); 116 109 117 110 bool psphotApResid (pmConfig *config, const pmFPAview *view, const char *filerule); … … 188 181 189 182 // functions to set the correct source pixels 190 bool psphotInitRadiusPSF(const psMetadata *recipe, const psMetadata *analysis, const pmModelType type); 183 bool psphotInitRadiusPSF (psMetadata *recipe, pmReadout *readout); 184 bool psphotInitRadiusEXT (psMetadata *recipe, pmReadout *readout); 191 185 192 186 bool psphotCheckRadiusPSF (pmReadout *readout, pmSource *source, pmModel *model, psImageMaskType markVal); 193 187 bool psphotCheckRadiusPSFBlend (pmReadout *readout, pmSource *source, pmModel *model, psImageMaskType markVal, float dR); 194 bool psphotInitRadiusEXT (psMetadata *recipe, pmModelType type); 195 bool psphotCheckRadiusEXT (pmReadout *readout, pmSource *source, pmModel *model, psImageMaskType markVal); 196 float psphotSetRadiusEXT (pmReadout *readout, pmSource *source, psImageMaskType markVal); 188 bool psphotSetRadiusFootprint (float *radius, pmReadout *readout, pmSource *source, psImageMaskType markVal, float factor); 189 bool psphotSetRadiusModel (pmModel *model, pmReadout *readout, pmSource *source, psImageMaskType markVal, bool deep); 197 190 198 191 bool psphotDumpMoments (psMetadata *recipe, psArray *sources); … … 210 203 // functions to support the source fitting process 211 204 bool psphotInitLimitsPSF (psMetadata *recipe, pmReadout *readout); 212 bool psphotInitLimitsEXT (psMetadata *recipe );213 bool psphotFitBlend (pmReadout *readout, pmSource *source, pmPSF *psf, p sImageMaskType maskVal, psImageMaskType markVal);214 bool psphotFitBlob (pmReadout *readout, pmSource *source, psArray *sources, pmPSF *psf, p sImageMaskType maskVal, psImageMaskType markVal);215 bool psphotFitPSF (pmReadout *readout, pmSource *source, pmPSF *psf, p sImageMaskType maskVal, psImageMaskType markVal);216 pmModel *psphotFitEXT (pmReadout *readout, pmSource *source, pm ModelType modelType, psImageMaskType maskVal, psImageMaskType markVal);217 psArray *psphotFitDBL (pmReadout *readout, pmSource *source, p sImageMaskType maskVal, psImageMaskType markVal);205 bool psphotInitLimitsEXT (psMetadata *recipe, pmReadout *readout); 206 bool psphotFitBlend (pmReadout *readout, pmSource *source, pmPSF *psf, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal); 207 bool psphotFitBlob (pmReadout *readout, pmSource *source, psArray *sources, pmPSF *psf, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal); 208 bool psphotFitPSF (pmReadout *readout, pmSource *source, pmPSF *psf, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal); 209 pmModel *psphotFitEXT (pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, pmModelType modelType, psImageMaskType maskVal, psImageMaskType markVal); 210 psArray *psphotFitDBL (pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal); 218 211 219 212 // functions to support simultaneous multi-source fitting … … 252 245 bool psphotVisualShowBackground (pmConfig *config, const pmFPAview *view, pmReadout *readout); 253 246 bool psphotVisualShowSignificance (psImage *image, float min, float max); 247 bool psphotVisualShowLogSignificance (psImage *image, float min, float max); 254 248 bool psphotVisualShowPeaks (pmDetections *detections); 255 249 bool psphotVisualShowFootprints (pmDetections *detections); … … 292 286 bool psphotRadialBins (psMetadata *recipe, pmSource *source, float radiusMax, float skynoise); 293 287 294 // structures & functions to support psf-convolved model fitting295 296 // psf-convolved model fitting297 bool psphotModelWithPSF_LMM (298 psMinimization *min,299 psImage *covar,300 psVector *params,301 psMinConstraint *constraint,302 pmSource *source,303 const psKernel *psf,304 psMinimizeLMChi2Func func);305 306 psF32 psphotModelWithPSF_SetABX(307 psImage *alpha,308 psVector *beta,309 const psVector *params,310 const psVector *paramMask,311 pmPCMData *pcm,312 const pmSource *source,313 const psKernel *psf,314 psMinimizeLMChi2Func func);315 316 pmPCMData *pmPCMDataAlloc (317 const psVector *params,318 const psVector *paramMask,319 pmSource *source);320 321 psImage *pmPCMDataSaveImage (pmPCMData *pcm);322 323 288 int psphotKapaOpen (void); 324 289 bool psphotKapaClose (void); … … 364 329 365 330 bool psphotFitSourcesLinearStack (pmConfig *config, psArray *objects, bool final); 366 int pmPhotObjSortBySN (const void **a, const void **b);367 int pmPhotObjSortByX (const void **a, const void **b);368 331 369 332 typedef enum { … … 462 425 bool psphotStackObjectsUnifyPosition (psArray *objects); 463 426 427 bool psphotFitSersicIndex (pmModel *model, pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal); 428 429 bool psphotFitSersicIndexPCM (pmPCMdata *pcm, pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal, int psfSize); 430 pmModel *psphotFitPCM (pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, pmModelType modelType, psImageMaskType maskVal, psImageMaskType markVal, int psfSize); 431 464 432 #endif -
branches/sc_branches/trunkTest/psphot/src/psphotAddNoise.c
r28013 r29060 34 34 35 35 bool status = false; 36 psEllipseShape oldshape;37 psEllipseShape newshape;38 psEllipseAxes axes;39 36 40 37 // find the currently selected readout … … 86 83 if (!(source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED)) continue; 87 84 88 // select appropriate model 89 pmModel *model = pmSourceGetModel (NULL, source); 90 if (model == NULL) continue; // model must be defined 91 92 if (add) { 93 psTrace ("psphot", 4, "adding noise for object at %f,%f\n", model->params->data.F32[PM_PAR_XPOS], model->params->data.F32[PM_PAR_YPOS]); 94 } else { 95 psTrace ("psphot", 4, "remove noise for object at %f,%f\n", model->params->data.F32[PM_PAR_XPOS], model->params->data.F32[PM_PAR_YPOS]); 96 } 97 98 psF32 *PAR = model->params->data.F32; 99 100 // save original values 101 float oldI0 = PAR[PM_PAR_I0]; 102 oldshape.sx = PAR[PM_PAR_SXX]; 103 oldshape.sy = PAR[PM_PAR_SYY]; 104 oldshape.sxy = PAR[PM_PAR_SXY]; 105 106 // XXX can this be done more intelligently? 107 if (oldI0 == 0.0) continue; 108 if (!isfinite(oldI0)) continue; 109 110 // increase size and height of source 111 axes = psEllipseShapeToAxes (oldshape, 20.0); 112 axes.major *= SIZE; 113 axes.minor *= SIZE; 114 newshape = psEllipseAxesToShape (axes); 115 PAR[PM_PAR_I0] = FACTOR*oldI0; 116 PAR[PM_PAR_SXX] = newshape.sx; 117 PAR[PM_PAR_SYY] = newshape.sy; 118 PAR[PM_PAR_SXY] = newshape.sxy; 119 120 // XXX if we use pmSourceOp, the size (and possibly Io) will not be respected 121 pmSourceOp (source, PM_MODEL_OP_FULL | PM_MODEL_OP_NOISE, add, maskVal, 0, 0); 122 123 // restore original values 124 PAR[PM_PAR_I0] = oldI0; 125 PAR[PM_PAR_SXX] = oldshape.sx; 126 PAR[PM_PAR_SYY] = oldshape.sy; 127 PAR[PM_PAR_SXY] = oldshape.sxy; 85 pmSourceNoiseOp (source, PM_MODEL_OP_FULL | PM_MODEL_OP_NOISE, FACTOR, SIZE, add, maskVal, 0, 0); 128 86 } 129 87 if (add) { … … 132 90 psLogMsg ("psphot.noise", PS_LOG_INFO, "sub noise for %ld objects: %f sec\n", sources->n, psTimerMark ("psphot.noise")); 133 91 } 92 134 93 return true; 135 94 } -
branches/sc_branches/trunkTest/psphot/src/psphotApResid.c
r28524 r29060 459 459 psImageKeepCircle (source->maskObj, source->peak->x, source->peak->y, source->apRadius, "OR", markVal); 460 460 461 bool status = pmSourceMagnitudes (source, psf, photMode, maskVal );461 bool status = pmSourceMagnitudes (source, psf, photMode, maskVal, markVal); 462 462 463 463 // clear the mask bit -
branches/sc_branches/trunkTest/psphot/src/psphotArguments.c
r25985 r29060 176 176 } 177 177 178 // visual : interactive display mode179 if ((N = psArgumentGet (argc, argv, "-visual"))) {180 psArgumentRemove (N, &argc, argv);181 pmVisualSetVisual(true);182 }183 184 178 // break : used from recipe throughout psphotReadout 185 179 if ((N = psArgumentGet (argc, argv, "-break"))) { -
branches/sc_branches/trunkTest/psphot/src/psphotBlendFit.c
r28405 r29060 65 65 assert (status && fitIter > 0); 66 66 67 float fitTol = psMetadataLookupF32 (&status, recipe, "EXT_FIT_TOL"); // Fit tolerance 68 assert (status && isfinite(fitTol) && fitTol > 0); 67 float fitMinTol = psMetadataLookupF32 (&status, recipe, "EXT_FIT_MIN_TOL"); // Fit tolerance 68 if (!status || !isfinite(fitMinTol) || fitMinTol <= 0) { 69 fitMinTol = psMetadataLookupF32 (&status, recipe, "PSF_FIT_TOL"); // Fit tolerance 70 if (!status || !isfinite(fitMinTol) || fitMinTol <= 0) { 71 psAbort("PSF_FIT_MIN_TOL (and PSF_FIT_TOL) not defined or positive"); 72 } 73 } 74 75 float fitMaxTol = psMetadataLookupF32 (&status, recipe, "EXT_FIT_MAX_TOL"); // Fit tolerance 76 if (!status || !isfinite(fitMaxTol) || fitMaxTol <= 0) { 77 fitMaxTol = 1.0; 78 } 69 79 70 80 bool poisson = psMetadataLookupBool(&status, recipe, "POISSON.ERRORS.PHOT.LMM"); // Poisson errors? 71 81 assert (status); 72 82 83 float maxChisqDOF = psMetadataLookupF32 (&status, recipe, "EXT_FIT_MAX_CHISQ"); // Fit tolerance 84 73 85 float skySig = psMetadataLookupF32(&status, recipe, "SKY_SIG"); 74 86 assert (status && isfinite(skySig) && skySig > 0); 75 87 76 88 // Define source fitting parameters for extended source fits 77 pmSourceFitModelInit(fitIter, fitTol, PS_SQR(skySig), poisson); 89 pmSourceFitOptions *fitOptions = pmSourceFitOptionsAlloc(); 90 fitOptions->nIter = fitIter; 91 fitOptions->minTol = fitMinTol; 92 fitOptions->maxTol = fitMaxTol; 93 fitOptions->maxChisqDOF = maxChisqDOF; 94 fitOptions->poissonErrors = poisson; 95 fitOptions->weight = PS_SQR(skySig); 96 fitOptions->mode = PM_SOURCE_FIT_PSF; 78 97 79 98 psphotInitLimitsPSF (recipe, readout); 80 psphotInitLimitsEXT (recipe );81 psphotInitRadiusPSF (recipe, readout ->analysis, psf->type);99 psphotInitLimitsEXT (recipe, readout); 100 psphotInitRadiusPSF (recipe, readout); 82 101 83 102 // starts the timer, sets up the array of fitSets … … 88 107 if (!sources->n) { 89 108 psLogMsg ("psphot", PS_LOG_INFO, "no sources, skipping blend"); 109 psFree (fitOptions); 90 110 return true; 91 111 } … … 112 132 psArrayAdd(job->args, 1, psf); 113 133 psArrayAdd(job->args, 1, newSources); // return for new sources 134 psArrayAdd(job->args, 1, fitOptions); // default fit options 114 135 psFree (newSources); 115 136 … … 121 142 if (!psThreadJobAddPending(job)) { 122 143 psError(PS_ERR_UNKNOWN, false, "Unable to guess model."); 144 psFree (fitOptions); 123 145 return NULL; 124 146 } 125 126 # if (0)127 {128 int nfit = 0;129 int npsf = 0;130 int next = 0;131 int nfail = 0;132 psArray *newSources = psArrayAllocEmpty(16);133 134 if (!psphotBlendFit_Unthreaded (&nfit, &npsf, &next, &nfail, readout, recipe, cells->data[j], psf, newSources)) {135 psError(PS_ERR_UNKNOWN, false, "Unable to guess model.");136 return NULL;137 }138 Nfit += nfit;139 Npsf += npsf;140 Next += next;141 Nfail += nfail;142 143 // add these back onto sources144 for (int k = 0; k < newSources->n; k++) {145 psArrayAdd (sources, 16, newSources->data[k]);146 }147 psFree (newSources);148 }149 # endif150 147 } 151 148 … … 153 150 if (!psThreadPoolWait (false)) { 154 151 psError(PS_ERR_UNKNOWN, false, "Unable to guess model."); 152 psFree (fitOptions); 155 153 return NULL; 156 154 } … … 163 161 } else { 164 162 psScalar *scalar = NULL; 165 scalar = job->args->data[ 5];163 scalar = job->args->data[6]; 166 164 Nfit += scalar->data.S32; 167 scalar = job->args->data[ 6];165 scalar = job->args->data[7]; 168 166 Npsf += scalar->data.S32; 169 scalar = job->args->data[ 7];167 scalar = job->args->data[8]; 170 168 Next += scalar->data.S32; 171 scalar = job->args->data[ 8];169 scalar = job->args->data[9]; 172 170 Nfail += scalar->data.S32; 173 171 … … 186 184 psphotSaveImage (NULL, readout->image, "image.v2.fits"); 187 185 } 186 psFree (fitOptions); 188 187 189 188 psLogMsg ("psphot.psphotBlendFit", PS_LOG_INFO, "fit models: %f sec for %d objects (%d psf, %d ext, %d failed, %ld skipped)\n", psTimerMark ("psphot.fit.nonlinear"), Nfit, Npsf, Next, Nfail, sources->n - Nfit); … … 204 203 psScalar *scalar = NULL; 205 204 206 pmReadout *readout = job->args->data[0]; 207 psMetadata *recipe = job->args->data[1]; 208 psArray *sources = job->args->data[2]; 209 pmPSF *psf = job->args->data[3]; 210 psArray *newSources = job->args->data[4]; 205 pmReadout *readout = job->args->data[0]; 206 psMetadata *recipe = job->args->data[1]; 207 psArray *sources = job->args->data[2]; 208 pmPSF *psf = job->args->data[3]; 209 psArray *newSources = job->args->data[4]; 210 pmSourceFitOptions *fitOptions = job->args->data[5]; 211 211 212 212 // bit-masks to test for good/bad pixels … … 269 269 Nfit ++; 270 270 271 if (0) { 272 psF32 Mxx = source->moments->Mxx; 273 psF32 Myy = source->moments->Myy; 274 fprintf (stderr, "1: Mxx: %f, Myy: %f\n", Mxx, Myy); 275 } 276 271 277 // try fitting PSFs or extended sources depending on source->mode 272 278 // these functions subtract the resulting fitted source 273 279 if (source->mode & PM_SOURCE_MODE_EXT_LIMIT) { 274 if (psphotFitBlob (readout, source, newSources, psf, maskVal, markVal)) {280 if (psphotFitBlob (readout, source, newSources, psf, fitOptions, maskVal, markVal)) { 275 281 source->type = PM_SOURCE_TYPE_EXTENDED; 276 282 psTrace ("psphot", 5, "source at %7.1f, %7.1f is ext", source->peak->xf, source->peak->yf); … … 280 286 } 281 287 } else { 282 if (psphotFitBlend (readout, source, psf, maskVal, markVal)) {288 if (psphotFitBlend (readout, source, psf, fitOptions, maskVal, markVal)) { 283 289 source->type = PM_SOURCE_TYPE_STAR; 284 290 psTrace ("psphot", 5, "source at %7.1f, %7.1f is psf", source->peak->xf, source->peak->yf); … … 289 295 } 290 296 297 if (0) { 298 psF32 Mxx = source->moments->Mxx; 299 psF32 Myy = source->moments->Myy; 300 fprintf (stderr, "2: Mxx: %f, Myy: %f\n", Mxx, Myy); 301 } 302 291 303 psTrace ("psphot", 5, "source at %7.1f, %7.1f failed", source->peak->xf, source->peak->yf); 292 304 Nfail ++; … … 298 310 299 311 // change the value of a scalar on the array (wrap this and put it in psArray.h) 300 scalar = job->args->data[ 5];312 scalar = job->args->data[6]; 301 313 scalar->data.S32 = Nfit; 302 314 303 scalar = job->args->data[ 6];315 scalar = job->args->data[7]; 304 316 scalar->data.S32 = Npsf; 305 317 306 scalar = job->args->data[ 7];318 scalar = job->args->data[8]; 307 319 scalar->data.S32 = Next; 308 320 309 scalar = job->args->data[ 8];321 scalar = job->args->data[9]; 310 322 scalar->data.S32 = Nfail; 311 323 -
branches/sc_branches/trunkTest/psphot/src/psphotChoosePSF.c
r28013 r29060 74 74 75 75 // structure to store user options defining the psf 76 pmPSFOptions *options = pmPSFOptionsAlloc ();76 pmPSFOptions *options = pmPSFOptionsAlloc(); 77 77 78 78 // load user options from the recipe. no need to check existence -- they are … … 138 138 return false; 139 139 } 140 float fitTol = psMetadataLookupF32 (&status, recipe, "PSF_FIT_TOL"); // Fit tolerance 141 if (!status || !isfinite(fitTol) || fitTol <= 0) { 142 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "PSF_FIT_TOL is not positive"); 143 return false; 144 } 145 pmSourceFitModelInit(fitIter, fitTol, PS_SQR(SKY_SIG), options->poissonErrorsPhotLMM); 146 140 float fitMinTol = psMetadataLookupF32 (&status, recipe, "PSF_FIT_MIN_TOL"); // Fit tolerance 141 if (!status || !isfinite(fitMinTol) || fitMinTol <= 0) { 142 fitMinTol = psMetadataLookupF32 (&status, recipe, "PSF_FIT_TOL"); // Fit tolerance 143 if (!status || !isfinite(fitMinTol) || fitMinTol <= 0) { 144 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "PSF_FIT_MIN_TOL (and PSF_FIT_TOL) not defined or positive"); 145 return false; 146 } 147 } 148 float fitMaxTol = psMetadataLookupF32 (&status, recipe, "PSF_FIT_MAX_TOL"); // Fit tolerance 149 if (!status || !isfinite(fitMaxTol) || fitMaxTol <= 0) { 150 fitMaxTol = 1.0; 151 } 152 float maxChisqDOF = psMetadataLookupF32 (&status, recipe, "PSF_FIT_MAX_CHISQ"); // Fit tolerance 153 154 // options which modify the behavior of the model fitting 155 options->fitOptions = pmSourceFitOptionsAlloc(); 156 options->fitOptions->nIter = fitIter; 157 options->fitOptions->minTol = fitMinTol; 158 options->fitOptions->maxTol = fitMaxTol; 159 options->fitOptions->maxChisqDOF = maxChisqDOF; 160 options->fitOptions->poissonErrors = options->poissonErrorsPhotLMM; 161 options->fitOptions->weight = PS_SQR(SKY_SIG); 162 options->fitOptions->mode = PM_SOURCE_FIT_PSF; 163 147 164 psArray *stars = psArrayAllocEmpty (sources->n); 148 165 … … 227 244 228 245 // try each model option listed in config 246 // pmPSFtryModel makes a local copy of the sources -- those points are not the same as those for 'sources' 229 247 for (int i = 0; i < modelNames->n; i++) { 230 248 char *modelName = modelNames->data[i]; … … 304 322 305 323 // unset the PSFSTAR flag for stars not used for PSF model 324 // XXX a more efficient way of achieving this would be to record a pair of arrays 325 // of the source index and the source id for the psf stars. but that would require we do 326 // not re-sort the source list in the meanwhile 327 int nDrop = 0; 306 328 for (int i = 0; i < try->sources->n; i++) { 307 329 pmSource *source = try->sources->data[i]; 308 330 if (try->mask->data.PS_TYPE_VECTOR_MASK_DATA[i]) { 309 source->mode &= ~PM_SOURCE_MODE_PSFSTAR; 310 } 311 } 331 // need to find this source in the original list (these are copies, not pointers) 332 for (int j = 0; j < sources->n; j++) { 333 pmSource *realSource = sources->data[j]; 334 if (realSource->id != source->id) continue; 335 realSource->mode &= ~PM_SOURCE_MODE_PSFSTAR; 336 source->mode &= ~PM_SOURCE_MODE_PSFSTAR; 337 nDrop ++; 338 break; 339 } 340 } 341 } 342 // fprintf (stderr, "drop %d stars as PSF stars\n", nDrop); 343 344 // XXX is this working? 345 // int N1 = 0; 346 // for (int i = 0; i < try->sources->n; i++) { 347 // pmSource *source = try->sources->data[i]; 348 // fprintf (stderr, "%llx : %d\n", (long long int) source, (source->mode & PM_SOURCE_MODE_PSFSTAR)); 349 // if (source->mode & PM_SOURCE_MODE_PSFSTAR) { 350 // N1 ++; 351 // } 352 // } 353 // int N2 = 0; 354 // for (int i = 0; i < sources->n; i++) { 355 // pmSource *source = sources->data[i]; 356 // fprintf (stderr, "%llx : %d\n", (long long int) source, (source->mode & PM_SOURCE_MODE_PSFSTAR)); 357 // if (source->mode & PM_SOURCE_MODE_PSFSTAR) { 358 // N2 ++; 359 // } 360 // } 361 // fprintf (stderr, "N1: %d, N2: %d\n", N1, N2); 312 362 313 363 // build a PSF residual image -
branches/sc_branches/trunkTest/psphot/src/psphotEllipticalContour.c
r27819 r29060 82 82 params->data.F32[PAR_RMIN] = Rmin; 83 83 84 psMinimization *myMin = psMinimizationAlloc (25, 0.0 01);84 psMinimization *myMin = psMinimizationAlloc (25, 0.01, 1.00); 85 85 psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32); 86 86 -
branches/sc_branches/trunkTest/psphot/src/psphotExtendedSourceAnalysis.c
r28013 r29060 121 121 if (source->peak->y > AnalysisRegion.y1) continue; 122 122 123 // fprintf (stderr, "xsrc: %f, %f : %f\n", source->peak->xf, source->peak->yf, source->peak->SN); 124 123 125 // replace object in image 124 126 if (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED) { … … 157 159 } 158 160 159 # if (0)160 // Isophotal Mags161 if (doIsophotal) {162 if (!psphotIsophotal (source, recipe, maskVal)) {163 psTrace ("psphot", 5, "failed to measure isophotal mags for source at %7.1f, %7.1f", source->moments->Mx, source->moments->My);164 } else {165 psTrace ("psphot", 5, "measured isophotal mags for source at %7.1f, %7.1f", source->moments->Mx, source->moments->My);166 Nisophot ++;167 source->mode |= PM_SOURCE_MODE_EXTENDED_STATS;168 }169 }170 // Kron Mags171 if (doKron) {172 if (!psphotKron (source, recipe, maskVal)) {173 psTrace ("psphot", 5, "failed to measure kron mags for source at %7.1f, %7.1f", source->moments->Mx, source->moments->My);174 } else {175 psTrace ("psphot", 5, "measure kron mags for source at %7.1f, %7.1f", source->moments->Mx, source->moments->My);176 Nkron ++;177 source->mode |= PM_SOURCE_MODE_EXTENDED_STATS;178 }179 }180 # endif181 182 161 // re-subtract the object, leave local sky 183 162 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); … … 201 180 } 202 181 182 // fprintf (stderr, "xsrc : tried %ld objects\n", sources->n); 183 203 184 return true; 204 185 } -
branches/sc_branches/trunkTest/psphot/src/psphotExtendedSourceFits.c
r28013 r29060 31 31 // non-linear model fitting for extended sources 32 32 bool psphotExtendedSourceFitsReadout (pmConfig *config, const pmFPAview *view, const char *filerule, int index, psMetadata *recipe) { 33 34 bool status; 35 int Next = 0; 36 int Nconvolve = 0; 37 int NconvolvePass = 0; 38 int Nplain = 0; 39 int NplainPass = 0; 40 41 psTimerStart ("psphot.extended"); 42 43 // find the currently selected readout 44 pmFPAfile *file = pmFPAfileSelectSingle(config->files, filerule, index); // File of interest 45 psAssert (file, "missing file?"); 46 47 pmReadout *readout = pmFPAviewThisReadout(view, file->fpa); 48 psAssert (readout, "missing readout?"); 49 50 pmDetections *detections = psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.DETECTIONS"); 51 psAssert (detections, "missing detections?"); 52 53 psArray *sources = detections->allSources; 54 psAssert (sources, "missing sources?"); 55 56 if (!sources->n) { 57 psLogMsg ("psphot", PS_LOG_INFO, "no sources, skipping source size"); 58 return true; 59 } 60 61 // determine the number of allowed threads 62 int nThreads = psMetadataLookupS32(&status, config->arguments, "NTHREADS"); // Number of threads 63 if (!status) { 64 nThreads = 0; 65 } 66 67 // user-defined masks to test for good/bad pixels (build from recipe list if not yet set) 68 psImageMaskType maskVal = psMetadataLookupImageMask(&status, recipe, "MASK.PSPHOT"); // Mask value for bad pixels 69 assert (maskVal); 70 71 psImageMaskType markVal = psMetadataLookupImageMask(&status, recipe, "MARK.PSPHOT"); // Mask value for bad pixels 72 assert (markVal); 73 74 // maskVal is used to test for rejected pixels, and must include markVal 75 maskVal |= markVal; 76 77 // select the collection of desired models 78 psMetadata *models = psMetadataLookupMetadata (&status, recipe, "EXTENDED_SOURCE_MODELS"); 79 if (!status) { 80 psWarning ("extended source model fits requested but model model is missing (EXTENDED_SOURCE_MODELS)\n"); 81 return true; 82 } 83 if (models->list->n == 0) { 84 psWarning ("extended source model fits requested but no models are specified\n"); 85 return true; 86 } 87 88 // validate the model entries 89 psMetadataIterator *iter = psMetadataIteratorAlloc (models, PS_LIST_HEAD, NULL); 90 psMetadataItem *item = NULL; 91 while ((item = psMetadataGetAndIncrement (iter)) != NULL) { 92 93 if (item->type != PS_DATA_METADATA) { 94 psAbort ("Invalid type for EXTENDED_SOURCE_MODEL entry %s, not a metadata folder", item->name); 95 // XXX we could cull the bad entries or build a validated model folder 96 } 97 98 psMetadata *model = (psMetadata *) item->data.md; 99 100 // check on the model type 101 char *modelName = psMetadataLookupStr (&status, model, "MODEL"); 102 int modelType = pmModelClassGetType (modelName); 103 if (modelType < 0) { 104 psAbort ("Unknown model class for EXTENDED_SOURCE_MODEL entry %s: %s", item->name, modelName); 105 } 106 psMetadataAddS32 (model, PS_LIST_TAIL, "MODEL_TYPE", PS_META_REPLACE, "", modelType); 107 108 // check on the SNLIM, set a float value 109 char *SNword = psMetadataLookupStr (&status, model, "SNLIM"); 110 if (!status) { 111 psAbort("SNLIM not defined for extended source model %s\n", item->name); 112 } 113 float SNlim = atof (SNword); 114 psMetadataAddF32 (model, PS_LIST_TAIL, "SNLIM_VALUE", PS_META_REPLACE, "", SNlim); 115 116 // check on the PSF-Convolution status 117 char *convolvedWord = psMetadataLookupStr (&status, model, "PSF_CONVOLVED"); 118 if (!status || (strcasecmp (convolvedWord, "true") && strcasecmp (convolvedWord, "false"))) { 119 psAbort ("PSF_CONVOLVED entry invalid or missing for EXTENDED_SOURCE_MODEL entry %s", item->name); 120 } 121 bool convolved = !strcasecmp (convolvedWord, "true"); 122 psMetadataAddBool (model, PS_LIST_TAIL, "PSF_CONVOLVED_VALUE", PS_META_REPLACE, "", convolved); 123 } 124 psFree (iter); 125 126 // option to limit analysis to a specific region 127 char *region = psMetadataLookupStr (&status, recipe, "ANALYSIS_REGION"); 128 psRegion *AnalysisRegion = psRegionAlloc(0,0,0,0); 129 *AnalysisRegion = psRegionForImage(readout->image, psRegionFromString (region)); 130 if (psRegionIsNaN (*AnalysisRegion)) psAbort("analysis region mis-defined"); 131 132 // what fraction of the PSF is used? (radius in pixels : 2 -> 5x5 box) 133 int psfSize = psMetadataLookupS32 (&status, recipe, "PCM_BOX_SIZE"); 134 assert (status); 135 136 // source analysis is done in S/N order (brightest first) 137 sources = psArraySort (sources, pmSourceSortBySN); 138 139 // choose Cx, Cy (see psphotThreadTools.c for overview of the concepts) 140 int Cx = 1, Cy = 1; 141 psphotChooseCellSizes (&Cx, &Cy, readout, nThreads); 142 143 psArray *cellGroups = psphotAssignSources (Cx, Cy, sources); 144 145 for (int i = 0; i < cellGroups->n; i++) { 146 147 psArray *cells = cellGroups->data[i]; 148 149 for (int j = 0; j < cells->n; j++) { 150 151 // allocate a job -- if threads are not defined, this just runs the job 152 psThreadJob *job = psThreadJobAlloc ("PSPHOT_EXTENDED_FIT"); 153 154 psArrayAdd(job->args, 1, readout); 155 psArrayAdd(job->args, 1, cells->data[j]); // sources 156 psArrayAdd(job->args, 1, models); 157 psArrayAdd(job->args, 1, AnalysisRegion); // XXX make a pointer 158 159 PS_ARRAY_ADD_SCALAR(job->args, psfSize, PS_TYPE_S32); 160 PS_ARRAY_ADD_SCALAR(job->args, maskVal, PS_TYPE_IMAGE_MASK); 161 PS_ARRAY_ADD_SCALAR(job->args, markVal, PS_TYPE_IMAGE_MASK); 162 163 PS_ARRAY_ADD_SCALAR(job->args, 0, PS_TYPE_S32); // this is used as a return value for Next 164 PS_ARRAY_ADD_SCALAR(job->args, 0, PS_TYPE_S32); // this is used as a return value for Nconvolve 165 PS_ARRAY_ADD_SCALAR(job->args, 0, PS_TYPE_S32); // this is used as a return value for NconvolvePass 166 PS_ARRAY_ADD_SCALAR(job->args, 0, PS_TYPE_S32); // this is used as a return value for Nplain 167 PS_ARRAY_ADD_SCALAR(job->args, 0, PS_TYPE_S32); // this is used as a return value for NplainPass 168 169 if (!psThreadJobAddPending(job)) { 170 psError(PS_ERR_UNKNOWN, false, "Unable to guess model."); 171 psFree(AnalysisRegion); 172 return false; 173 } 174 } 175 176 // wait for the threads to finish and manage results 177 if (!psThreadPoolWait (false)) { 178 psError(PS_ERR_UNKNOWN, false, "Unable to guess model."); 179 psFree(AnalysisRegion); 180 return false; 181 } 182 183 // we have only supplied one type of job, so we can assume the types here 184 psThreadJob *job = NULL; 185 while ((job = psThreadJobGetDone()) != NULL) { 186 if (job->args->n < 1) { 187 fprintf (stderr, "error with job\n"); 188 } else { 189 psScalar *scalar = NULL; 190 scalar = job->args->data[7]; 191 Next += scalar->data.S32; 192 scalar = job->args->data[8]; 193 Nconvolve += scalar->data.S32; 194 scalar = job->args->data[9]; 195 NconvolvePass += scalar->data.S32; 196 scalar = job->args->data[10]; 197 Nplain += scalar->data.S32; 198 scalar = job->args->data[11]; 199 NplainPass += scalar->data.S32; 200 } 201 psFree(job); 202 } 203 } 204 psFree (cellGroups); 205 psFree(AnalysisRegion); 206 207 psLogMsg ("psphot", PS_LOG_INFO, "extended source analysis: %f sec for %d objects\n", psTimerMark ("psphot.extended"), Next); 208 psLogMsg ("psphot", PS_LOG_INFO, " %d convolved models (%d passed)\n", Nconvolve, NconvolvePass); 209 psLogMsg ("psphot", PS_LOG_INFO, " %d plain models (%d passed)\n", Nplain, NplainPass); 210 return true; 211 } 212 213 // non-linear model fitting for extended sources 214 bool psphotExtendedSourceFits_Threaded (psThreadJob *job) { 33 215 34 216 bool status; … … 39 221 int NplainPass = 0; 40 222 bool savePics = false; 41 42 // find the currently selected readout 43 pmFPAfile *file = pmFPAfileSelectSingle(config->files, filerule, index); // File of interest 44 psAssert (file, "missing file?"); 45 46 pmReadout *readout = pmFPAviewThisReadout(view, file->fpa); 47 psAssert (readout, "missing readout?"); 48 49 pmDetections *detections = psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.DETECTIONS"); 50 psAssert (detections, "missing detections?"); 51 52 psArray *sources = detections->allSources; 53 psAssert (sources, "missing sources?"); 54 55 if (!sources->n) { 56 psLogMsg ("psphot", PS_LOG_INFO, "no sources, skipping source size"); 57 return true; 58 } 59 60 // user-defined masks to test for good/bad pixels (build from recipe list if not yet set) 61 psImageMaskType maskVal = psMetadataLookupImageMask(&status, recipe, "MASK.PSPHOT"); // Mask value for bad pixels 62 assert (maskVal); 63 64 psImageMaskType markVal = psMetadataLookupImageMask(&status, recipe, "MARK.PSPHOT"); // Mask value for bad pixels 65 assert (markVal); 66 67 // maskVal is used to test for rejected pixels, and must include markVal 68 maskVal |= markVal; 69 70 // select the collection of desired models 71 psMetadata *models = psMetadataLookupMetadata (&status, recipe, "EXTENDED_SOURCE_MODELS"); 72 if (!status) { 73 psWarning ("extended source model fits requested but model model is missing (EXTENDED_SOURCE_MODELS)\n"); 74 return true; 75 } 76 if (models->list->n == 0) { 77 psWarning ("extended source model fits requested but no models are specified\n"); 78 return true; 79 } 80 81 // validate the model entries 82 psMetadataIterator *iter = psMetadataIteratorAlloc (models, PS_LIST_HEAD, NULL); 83 psMetadataItem *item = NULL; 84 while ((item = psMetadataGetAndIncrement (iter)) != NULL) { 85 86 if (item->type != PS_DATA_METADATA) { 87 psAbort ("Invalid type for EXTENDED_SOURCE_MODEL entry %s, not a metadata folder", item->name); 88 // XXX we could cull the bad entries or build a validated model folder 89 } 90 91 psMetadata *model = (psMetadata *) item->data.md; 92 93 // check on the model type 94 char *modelName = psMetadataLookupStr (&status, model, "MODEL"); 95 int modelType = pmModelClassGetType (modelName); 96 if (modelType < 0) { 97 psAbort ("Unknown model class for EXTENDED_SOURCE_MODEL entry %s: %s", item->name, modelName); 98 } 99 psMetadataAddS32 (model, PS_LIST_TAIL, "MODEL_TYPE", PS_META_REPLACE, "", modelType); 100 101 // check on the SNLIM, set a float value 102 char *SNword = psMetadataLookupStr (&status, model, "SNLIM"); 103 if (!status) { 104 psAbort("SNLIM not defined for extended source model %s\n", item->name); 105 } 106 float SNlim = atof (SNword); 107 psMetadataAddF32 (model, PS_LIST_TAIL, "SNLIM_VALUE", PS_META_REPLACE, "", SNlim); 108 109 // check on the PSF-Convolution status 110 char *convolvedWord = psMetadataLookupStr (&status, model, "PSF_CONVOLVED"); 111 if (!status || (strcasecmp (convolvedWord, "true") && strcasecmp (convolvedWord, "false"))) { 112 psAbort ("PSF_CONVOLVED entry invalid or missing for EXTENDED_SOURCE_MODEL entry %s", item->name); 113 } 114 bool convolved = !strcasecmp (convolvedWord, "true"); 115 psMetadataAddBool (model, PS_LIST_TAIL, "PSF_CONVOLVED_VALUE", PS_META_REPLACE, "", convolved); 116 } 117 psFree (iter); 118 119 // option to limit analysis to a specific region 120 char *region = psMetadataLookupStr (&status, recipe, "ANALYSIS_REGION"); 121 psRegion AnalysisRegion = psRegionForImage (readout->image, psRegionFromString (region)); 122 if (psRegionIsNaN (AnalysisRegion)) psAbort("analysis region mis-defined"); 123 124 // what fraction of the PSF is used? (radius in pixels : 2 -> 5x5 box) 125 int psfSize = psMetadataLookupS32 (&status, recipe, "PCM_BOX_SIZE"); 126 assert (status); 127 128 // source analysis is done in S/N order (brightest first) 129 sources = psArraySort (sources, pmSourceSortBySN); 223 float radius; 224 psScalar *scalar = NULL; 225 226 // arguments: readout, sources, models, region, psfSize, maskVal, markVal 227 pmReadout *readout = job->args->data[0]; 228 psArray *sources = job->args->data[1]; 229 psMetadata *models = job->args->data[2]; 230 psRegion *region = job->args->data[3]; 231 int psfSize = PS_SCALAR_VALUE(job->args->data[4],PS_TYPE_IMAGE_MASK_DATA); 232 psImageMaskType maskVal = PS_SCALAR_VALUE(job->args->data[5],PS_TYPE_IMAGE_MASK_DATA); 233 psImageMaskType markVal = PS_SCALAR_VALUE(job->args->data[6],PS_TYPE_IMAGE_MASK_DATA); 234 235 // Define source fitting parameters for extended source fits 236 pmSourceFitOptions *fitOptions = pmSourceFitOptionsAlloc(); 237 fitOptions->mode = PM_SOURCE_FIT_EXT; 238 // XXX for now, use the defaults for the rest: 239 // fitOptions->nIter = fitIter; 240 // fitOptions->tol = fitTol; 241 // fitOptions->poissonErrors = poisson; 242 // fitOptions->weight = PS_SQR(skySig); 130 243 131 244 // choose the sources of interest … … 140 253 141 254 // XXX this should use peak? 142 if (source->peak->x < AnalysisRegion.x0) continue;143 if (source->peak->y < AnalysisRegion.y0) continue;144 if (source->peak->x > AnalysisRegion.x1) continue;145 if (source->peak->y > AnalysisRegion.y1) continue;255 if (source->peak->x < region->x0) continue; 256 if (source->peak->y < region->y0) continue; 257 if (source->peak->x > region->x1) continue; 258 if (source->peak->y > region->y1) continue; 146 259 147 260 // if model is NULL, we don't have a starting guess … … 155 268 Next ++; 156 269 270 // set the radius based on the footprint (also sets the mask pixels) 271 if (!psphotSetRadiusFootprint(&radius, readout, source, markVal, 1.0)) { 272 fprintf (stderr, "skipping (1) %f, %f\n", source->peak->xf, source->peak->yf); 273 psFree (fitOptions) 274 return false; 275 } 276 277 // XXX note that this changes the source moments that are published... 278 // recalculate the source moments using the larger extended-source moments radius 279 // at this stage, skip Gaussian windowing, and do not clip pixels by S/N 280 // this uses the footprint to judge both radius and aperture? 281 // XXX save the psf-based moments for output 282 if (!pmSourceMoments (source, radius, 0.0, 0.0, maskVal)) { 283 fprintf (stderr, "skipping (2) %f, %f\n", source->peak->xf, source->peak->yf); 284 // subtract the best fit from the object, leave local sky 285 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 286 // XXX raise an error of some kind 287 continue; 288 } 289 157 290 // save the modelFlux here in case we need to subtract it (for failure) 158 291 psImage *modelFluxStart = psMemIncrRefCounter (source->modelFlux); 159 292 if (!modelFluxStart) { 293 pmSourceCacheModel (source, maskVal); 294 modelFluxStart = psMemIncrRefCounter (source->modelFlux); 295 if (!modelFluxStart) { 296 fprintf (stderr, "skipping (3) %f, %f\n", source->peak->xf, source->peak->yf); 297 // XXX raise an error of some kind? 298 continue; 299 } 300 } 301 160 302 if (savePics) { 161 303 psphotSaveImage (NULL, readout->image, "image.xp.fits"); … … 183 325 assert (status); 184 326 327 // fprintf (stderr, "xfit: %f, %f : %f\n", source->peak->xf, source->peak->yf, source->peak->SN); 328 185 329 // limit selection to some SN limit 186 330 assert (source->peak); // how can a source not have a peak? … … 201 345 pmModel *modelFit = NULL; 202 346 if (convolved) { 203 modelFit = psphot PSFConvModel (readout, source, modelType, maskVal, markVal, psfSize);347 modelFit = psphotFitPCM (readout, source, fitOptions, modelType, maskVal, markVal, psfSize); 204 348 if (!modelFit) { 205 349 psTrace ("psphot", 5, "failed to fit psf-conv model for object at %f, %f", source->moments->Mx, source->moments->My); … … 215 359 psFree (source->modelFlux); 216 360 source->modelFlux = NULL; 217 modelFit = psphotFitEXT (readout, source, modelType, maskVal, markVal);361 modelFit = psphotFitEXT (readout, source, fitOptions, modelType, maskVal, markVal); 218 362 if (!modelFit) { 219 363 psTrace ("psphot", 5, "failed to fit plain model for object at %f, %f", source->moments->Mx, source->moments->My); … … 233 377 234 378 // test for fit quality / result 379 modelFit->fitRadius = radius; 235 380 psArrayAdd (source->modelFits, 4, modelFit); 236 381 … … 311 456 } 312 457 } 313 314 psLogMsg ("psphot", PS_LOG_INFO, "extended source analysis: %f sec for %d objects\n", psTimerMark ("psphot"), Next); 315 psLogMsg ("psphot", PS_LOG_INFO, " %d convolved models (%d passed)\n", Nconvolve, NconvolvePass); 316 psLogMsg ("psphot", PS_LOG_INFO, " %d plain models (%d passed)\n", Nplain, NplainPass); 458 psFree (fitOptions); 459 460 // fprintf (stderr, "xfit : tried %ld objects\n", sources->n); 461 462 // change the value of a scalar on the array (wrap this and put it in psArray.h) 463 scalar = job->args->data[7]; 464 scalar->data.S32 = Next; 465 466 scalar = job->args->data[8]; 467 scalar->data.S32 = Nconvolve; 468 469 scalar = job->args->data[9]; 470 scalar->data.S32 = NconvolvePass; 471 472 scalar = job->args->data[10]; 473 scalar->data.S32 = Nplain; 474 475 scalar = job->args->data[11]; 476 scalar->data.S32 = NplainPass; 477 317 478 return true; 318 479 } -
branches/sc_branches/trunkTest/psphot/src/psphotFindDetections.c
r28013 r29060 90 90 psphotVisualShowSignificance (significance, -1.0, PS_SQR(3.0*NSIGMA_PEAK)); 91 91 92 // XXX getting some strange results from significance image 93 if (0) { 94 psImage *lsig = (psImage *) psUnaryOp (NULL, significance, "log"); 95 psphotVisualShowSignificance (lsig, 0.0, 4.0); 96 psFree (lsig); 97 } 92 // display the log significance image 93 psphotVisualShowLogSignificance (significance, 0.0, 4.5); 98 94 99 95 // detect the peaks in the significance image -
branches/sc_branches/trunkTest/psphot/src/psphotFitSet.c
r21183 r29060 24 24 } 25 25 26 // Define source fitting parameters for extended source fits 27 pmSourceFitOptions *fitOptions = pmSourceFitOptionsAlloc(); 28 fitOptions->mode = PM_SOURCE_FIT_EXT; 29 // XXX for now, use the defaults for the rest: 30 // fitOptions->nIter = fitIter; 31 // fitOptions->tol = fitTol; 32 // fitOptions->poissonErrors = poisson; 33 // fitOptions->weight = PS_SQR(skySig); 34 26 35 // XXX pmSourceFitSet must cache the modelFlux? 27 pmSourceFitSet (source, modelSet, mode, maskVal);36 pmSourceFitSet (source, modelSet, fitOptions, maskVal); 28 37 29 38 // write out positive object -
branches/sc_branches/trunkTest/psphot/src/psphotFitSourcesLinear.c
r28426 r29060 100 100 if (!status) { 101 101 SKY_FIT_LINEAR = false; 102 } 103 104 float MIN_VALID_FLUX = psMetadataLookupF32(&status, recipe, "PSF_FIT_MIN_VALID_FLUX"); 105 if (!status) { 106 MIN_VALID_FLUX = 1e-8; 107 } 108 float MAX_VALID_FLUX = psMetadataLookupF32(&status, recipe, "PSF_FIT_MAX_VALID_FLUX"); 109 if (!status) { 110 MAX_VALID_FLUX = 1e+8; 102 111 } 103 112 … … 228 237 229 238 psSparseConstraint constraint; 230 constraint.paramMin = 0.0;231 constraint.paramMax = 1e8;232 constraint.paramDelta = 1e 8;239 constraint.paramMin = MIN_VALID_FLUX; 240 constraint.paramMax = MAX_VALID_FLUX; 241 constraint.paramDelta = 1e7; 233 242 234 243 // solve for normalization terms (need include local sky?) -
branches/sc_branches/trunkTest/psphot/src/psphotFitSourcesLinearStack.c
r28426 r29060 170 170 return true; 171 171 } 172 173 // sort by X (ascending)174 int pmPhotObjSortByX (const void **a, const void **b)175 {176 pmPhotObj *objA = *(pmPhotObj **)a;177 pmPhotObj *objB = *(pmPhotObj **)b;178 179 psF32 fA = objA->x;180 psF32 fB = objB->x;181 182 psF32 diff = fA - fB;183 if (diff > FLT_EPSILON) return (+1);184 if (diff < FLT_EPSILON) return (-1);185 return (0);186 } -
branches/sc_branches/trunkTest/psphot/src/psphotGuessModels.c
r28405 r29060 80 80 81 81 // setup the PSF fit radius details 82 psphotInitRadiusPSF (recipe, readout ->analysis, psf->type);82 psphotInitRadiusPSF (recipe, readout); 83 83 84 84 // choose Cx, Cy (see psphotThreadTools.c for overview of the concepts) -
branches/sc_branches/trunkTest/psphot/src/psphotLoadSRCTEXT.c
r25983 r29060 84 84 source->peak->yf = PAR[PM_PAR_YPOS]; // but we know the pixel coordinate 85 85 86 source->pixWeight = 1.0; 86 source->pixWeightNotBad = 1.0; 87 source->pixWeightNotPoor = 1.0; 87 88 source->crNsigma = 0.0; 88 89 source->extNsigma = 0.0; -
branches/sc_branches/trunkTest/psphot/src/psphotMagnitudes.c
r28405 r29060 124 124 return false; 125 125 } 126 127 # if (0)128 int nap = 0;129 if (!psphotMagnitudes_Unthreaded (&nap, cells->data[j], psf, binning, backModel, backStdev, photMode, maskVal)) {130 psError(PS_ERR_UNKNOWN, false, "Unable to guess model.");131 return false;132 }133 Nap += nap;134 # endif135 126 } 136 127 … … 186 177 psImageKeepCircle (source->maskObj, source->peak->x, source->peak->y, source->apRadius, "OR", markVal); 187 178 188 status = pmSourceMagnitudes (source, psf, photMode, maskVal ); // maskVal includes markVal179 status = pmSourceMagnitudes (source, psf, photMode, maskVal, markVal); 189 180 if (status && isfinite(source->apMag)) Nap ++; 190 181 … … 268 259 psArrayAdd(job->args, 1, cells->data[j]); // sources 269 260 PS_ARRAY_ADD_SCALAR(job->args, maskVal, PS_TYPE_IMAGE_MASK); 261 PS_ARRAY_ADD_SCALAR(job->args, markVal, PS_TYPE_IMAGE_MASK); 270 262 271 263 if (!psThreadJobAddPending(job)) { … … 304 296 psArray *sources = job->args->data[0]; 305 297 psImageMaskType maskVal = PS_SCALAR_VALUE(job->args->data[1],PS_TYPE_IMAGE_MASK_DATA); 298 psImageMaskType markVal = PS_SCALAR_VALUE(job->args->data[2],PS_TYPE_IMAGE_MASK_DATA); 306 299 307 300 for (int i = 0; i < sources->n; i++) { … … 312 305 if (model == NULL) { 313 306 psTrace ("psphot", 3, "fail mag : no valid model"); 314 source->pixWeight = NAN; 307 source->pixWeightNotBad = NAN; 308 source->pixWeightNotPoor = NAN; 315 309 continue; 316 310 } 317 311 318 status = pmSourcePixelWeight (&source->pixWeight , model, source->maskObj, maskVal);312 status = pmSourcePixelWeight (&source->pixWeightNotBad, &source->pixWeightNotPoor, model, source->maskObj, maskVal, markVal); 319 313 if (!status) { 320 314 psTrace ("psphot", 3, "fail to measure pixel weight"); 321 source->pixWeight = NAN; 315 source->pixWeightNotBad = NAN; 316 source->pixWeightNotPoor = NAN; 322 317 continue; 323 318 } -
branches/sc_branches/trunkTest/psphot/src/psphotModelWithPSF.c
r21366 r29060 73 73 74 74 // iterate until the tolerance is reached, or give up 75 while ((min->iter < min->maxIter) && ((min->lastDelta > min-> tol) || !isfinite(min->lastDelta))) {75 while ((min->iter < min->maxIter) && ((min->lastDelta > min->minTol) || !isfinite(min->lastDelta))) { 76 76 psTrace("psphot", 5, "Iteration number %d. (max iterations is %d).\n", min->iter, min->maxIter); 77 psTrace("psphot", 5, "Last delta is %f. Min-> tol is %f.\n", min->lastDelta, min->tol);77 psTrace("psphot", 5, "Last delta is %f. Min->minTol is %f.\n", min->lastDelta, min->minTol); 78 78 79 79 … … 166 166 psFree(pcm); 167 167 168 if (min->iter == min->maxIter) {169 psTrace("psphot", 3, "---- end (false) ----\n");170 return(false);171 }172 173 psTrace("psphot", 3, "---- end (true) ----\n");174 return( true);168 // if the last improvement was at least as good as maxTol, accept the fit: 169 if (min->lastDelta <= min->maxTol) { 170 psTrace("psphot", 6, "---- end (true) ----\n"); 171 return(true); 172 } 173 psTrace("psphot", 6, "---- end (false) ----\n"); 174 return(false); 175 175 } 176 176 -
branches/sc_branches/trunkTest/psphot/src/psphotPSFConvModel.c
r26894 r29060 4 4 // save as static values so they may be set externally 5 5 static psF32 PM_SOURCE_FIT_MODEL_NUM_ITERATIONS = 15; 6 static psF32 PM_SOURCE_FIT_MODEL_TOLERANCE = 0.1; 6 static psF32 PM_SOURCE_FIT_MODEL_MIN_TOL = 0.1; 7 static psF32 PM_SOURCE_FIT_MODEL_MAX_TOL = 2.0; 7 8 8 9 // input source has both modelPSF and modelEXT. on successful exit, we set the 9 10 // modelConv to contain the fitted parameters, and the modelFlux to contain the 10 11 // convolved model image. 11 pmModel *psphotPSFConvModel (pmReadout *readout, pmSource *source, pmModelType modelType, psImageMaskType maskVal, psImageMaskType markVal, int psfSize) { 12 13 // XXX need to generalize this -- number of fitted parameters must be flexible based on the fitOptions 14 15 pmModel *psphotPSFConvModel (pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, pmModelType modelType, psImageMaskType maskVal, psImageMaskType markVal, int psfSize) { 12 16 13 17 // maskVal is used to test for rejected pixels, and must include markVal … … 90 94 91 95 // set up the minimization process 92 psMinimization *myMin = psMinimizationAlloc (PM_SOURCE_FIT_MODEL_NUM_ITERATIONS, PM_SOURCE_FIT_MODEL_ TOLERANCE);96 psMinimization *myMin = psMinimizationAlloc (PM_SOURCE_FIT_MODEL_NUM_ITERATIONS, PM_SOURCE_FIT_MODEL_MIN_TOL, PM_SOURCE_FIT_MODEL_MAX_TOL); 93 97 94 98 psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32); -
branches/sc_branches/trunkTest/psphot/src/psphotPetrosianVisual.c
r27819 r29060 1 1 # include "psphotInternal.h" 2 # define FORCE_VISUAL 03 2 4 3 // this function displays representative images as the psphot analysis progresses: … … 54 53 Graphdata graphdata; 55 54 56 // return true; 57 if (!FORCE_VISUAL && !pmVisualIsVisual()) return true; 55 if (!pmVisualTestLevel("psphot.petro.byangle", 2)) return true; 58 56 59 57 if (kapa2 == -1) { … … 101 99 Graphdata graphdata; 102 100 103 // return true; 104 if (!FORCE_VISUAL && !pmVisualIsVisual()) return true; 101 if (!pmVisualTestLevel("psphot.petro.radii", 2)) return true; 105 102 106 103 if (kapa == -1) { … … 173 170 KapaSection section; 174 171 175 if (! FORCE_VISUAL && !pmVisualIsVisual()) return true;172 if (!pmVisualTestLevel("psphot.petro.stats", 2)) return true; 176 173 177 174 if (kapa2 == -1) { … … 311 308 Graphdata graphdata; 312 309 313 if (! FORCE_VISUAL && !pmVisualIsVisual()) return true;310 if (!pmVisualTestLevel("psphot.petro.ellipse", 2)) return true; 314 311 315 312 if (kapa == -1) { -
branches/sc_branches/trunkTest/psphot/src/psphotRadiusChecks.c
r28418 r29060 8 8 // and a per-object radius is calculated) 9 9 10 bool psphotInitRadiusPSF( const psMetadata *recipe, const psMetadata *analysis, const pmModelType type) {10 bool psphotInitRadiusPSF(psMetadata *recipe, pmReadout *readout) { 11 11 12 12 bool status = true; … … 15 15 PSF_FIT_PADDING = psMetadataLookupF32(&status, recipe, "PSF_FIT_PADDING"); 16 16 17 PSF_FIT_RADIUS = psMetadataLookupF32(&status, analysis, "PSF_FIT_RADIUS");17 PSF_FIT_RADIUS = psMetadataLookupF32(&status, readout->analysis, "PSF_FIT_RADIUS"); 18 18 if (!status) { 19 19 PSF_FIT_RADIUS = psMetadataLookupF32(&status, recipe, "PSF_FIT_RADIUS"); 20 20 } 21 21 22 PSF_APERTURE = psMetadataLookupF32(&status, analysis, "PSF_APERTURE");22 PSF_APERTURE = psMetadataLookupF32(&status, readout->analysis, "PSF_APERTURE"); 23 23 if (!status) { 24 24 PSF_APERTURE = psMetadataLookupF32(&status, recipe, "PSF_APERTURE"); … … 28 28 29 29 if (PSF_FIT_RADIUS == 0.0) { 30 float gaussSigma = psMetadataLookupF32(&status, analysis, "MOMENTS_GAUSS_SIGMA");30 float gaussSigma = psMetadataLookupF32(&status, readout->analysis, "MOMENTS_GAUSS_SIGMA"); 31 31 if (!status) { 32 32 gaussSigma = psMetadataLookupF32(&status, recipe, "MOMENTS_GAUSS_SIGMA"); … … 37 37 38 38 if (PSF_APERTURE == 0.0) { 39 float gaussSigma = psMetadataLookupF32(&status, analysis, "MOMENTS_GAUSS_SIGMA");39 float gaussSigma = psMetadataLookupF32(&status, readout->analysis, "MOMENTS_GAUSS_SIGMA"); 40 40 if (!status) { 41 41 gaussSigma = psMetadataLookupF32(&status, recipe, "MOMENTS_GAUSS_SIGMA"); … … 122 122 } 123 123 124 static float EXT_FIT_SKY_SIG; 124 125 static float EXT_FIT_NSIGMA; 125 126 static float EXT_FIT_PADDING; 126 127 static float EXT_FIT_MAX_RADIUS; 127 128 128 bool psphotInitRadiusEXT (psMetadata *recipe, pm ModelType type) {129 bool psphotInitRadiusEXT (psMetadata *recipe, pmReadout *readout) { 129 130 130 131 bool status; … … 134 135 EXT_FIT_MAX_RADIUS = psMetadataLookupF32 (&status, recipe, "EXT_FIT_MAX_RADIUS"); 135 136 137 float skyMean = psMetadataLookupF32 (&status, readout->analysis, "SKY_MEAN"); 138 float skyStdev = psMetadataLookupF32 (&status, readout->analysis, "SKY_STDEV"); 139 140 fprintf (stderr, "sky: %f +/- %f\n", skyMean, skyStdev); 141 142 EXT_FIT_SKY_SIG = skyStdev; 143 136 144 return true; 137 145 } 138 146 139 147 // call this function whenever you (re)-define the EXT model 140 float psphotSetRadiusEXT (pmReadout *readout, pmSource *source, psImageMaskType markVal) {148 bool psphotSetRadiusFootprint (float *radius, pmReadout *readout, pmSource *source, psImageMaskType markVal, float factor) { 141 149 142 150 psAssert (source, "source not defined??"); … … 146 154 147 155 // set the radius based on the footprint: 148 if (!peak->footprint) goto escape;156 if (!peak->footprint) return false; 149 157 pmFootprint *footprint = peak->footprint; 150 if (!footprint->spans) goto escape;151 if (footprint->spans->n < 1) goto escape;158 if (!footprint->spans) return false; 159 if (footprint->spans->n < 1) return false; 152 160 153 161 // find the max radius 154 float ra dius = 0.0;162 float rawRadius = 0.0; 155 163 for (int j = 0; j < footprint->spans->n; j++) { 156 164 pmSpan *span = footprint->spans->data[j]; … … 160 168 float dX1 = span->x1 - peak->xf; 161 169 162 radius = PS_MAX (radius, hypot(dY, dX0)); 163 radius = PS_MAX (radius, hypot(dY, dX1)); 164 } 165 166 radius += EXT_FIT_PADDING; 167 if (isnan(radius)) psAbort("error in radius"); 168 169 radius = PS_MIN (radius, EXT_FIT_MAX_RADIUS); 170 rawRadius = PS_MAX (rawRadius, hypot(dY, dX0)); 171 rawRadius = PS_MAX (rawRadius, hypot(dY, dX1)); 172 } 173 if (isnan(rawRadius)) return false; 174 rawRadius = PS_MIN (factor*rawRadius + EXT_FIT_PADDING, EXT_FIT_MAX_RADIUS); 170 175 171 176 // redefine the pixels if needed 172 pmSourceRedefinePixels (source, readout, peak->xf, peak->yf, radius); 173 174 // set the mask to flag the excluded pixels 175 psImageKeepCircle (source->maskObj, peak->xf, peak->yf, radius, "OR", markVal); 176 return radius; 177 178 escape: 179 return NAN; 180 // bool result = psphotCheckRadiusEXT (readout, source, model, markVal); 181 // return result; 177 pmSourceRedefinePixels (source, readout, peak->xf, peak->yf, rawRadius); 178 179 // set the mask to flag the excluded pixels 180 psImageKeepCircle (source->maskObj, peak->xf, peak->yf, rawRadius, "OR", markVal); 181 182 *radius = rawRadius; 183 return true; 182 184 } 183 185 184 186 // alternative EXT radius based on model guess (for use without footprints) 185 bool psphotCheckRadiusEXT (pmReadout *readout, pmSource *source, pmModel *model, psImageMaskType markVal) { 186 187 psAbort ("do not use this function"); 187 bool psphotSetRadiusModel (pmModel *model, pmReadout *readout, pmSource *source, psImageMaskType markVal, bool deep) { 188 188 189 189 psF32 *PAR = model->params->data.F32; … … 193 193 194 194 // set the fit radius based on the object flux limit and the model 195 float rawRadius = model->modelRadius (model->params, EXT_FIT_NSIGMA*moments->dSky); 196 197 model->fitRadius = rawRadius + EXT_FIT_PADDING; 198 if (isnan(model->fitRadius)) psAbort("error in radius"); 195 float flux = deep ? EXT_FIT_NSIGMA*EXT_FIT_SKY_SIG : 0.1 * model->params->data.F32[PM_PAR_I0]; 196 197 float rawRadius = model->modelRadius (model->params, flux); 198 if (isnan(rawRadius)) return false; 199 200 rawRadius = PS_MIN (rawRadius + EXT_FIT_PADDING, EXT_FIT_MAX_RADIUS); 201 model->fitRadius = rawRadius; 199 202 200 203 // redefine the pixels if needed 201 bool status =pmSourceRedefinePixels (source, readout, PAR[PM_PAR_XPOS], PAR[PM_PAR_YPOS], model->fitRadius);204 pmSourceRedefinePixels (source, readout, PAR[PM_PAR_XPOS], PAR[PM_PAR_YPOS], model->fitRadius); 202 205 203 206 // set the mask to flag the excluded pixels 204 207 psImageKeepCircle (source->maskObj, PAR[PM_PAR_XPOS], PAR[PM_PAR_YPOS], model->fitRadius, "OR", markVal); 205 return status;206 } 208 return true; 209 } -
branches/sc_branches/trunkTest/psphot/src/psphotReadout.c
r28398 r29060 53 53 } 54 54 55 // load the psf model, if suppled. FWHM_X,FWHM_Y,etc are determined and saved on 56 // readout->analysis XXX this function currently only works with a single PSPHOT.INPUT 55 // load the psf model, if suppled. FWHM_MAJ,FWHM_MIN,etc are determined and saved on 56 // readout->analysis. XXX Note: this function currently only works with a single 57 // PSPHOT.INPUT 57 58 if (!psphotLoadPSF (config, view)) { // ??? need to supply 2 ? 58 59 psError (PSPHOT_ERR_UNKNOWN, false, "error loading psf model"); -
branches/sc_branches/trunkTest/psphot/src/psphotSetThreads.c
r26894 r29060 15 15 psFree(task); 16 16 17 task = psThreadTaskAlloc("PSPHOT_PSF_WEIGHTS", 2);17 task = psThreadTaskAlloc("PSPHOT_PSF_WEIGHTS", 3); 18 18 task->function = &psphotPSFWeights_Threaded; 19 19 psThreadTaskAdd(task); … … 30 30 psFree(task); 31 31 32 task = psThreadTaskAlloc("PSPHOT_BLEND_FIT", 9);32 task = psThreadTaskAlloc("PSPHOT_BLEND_FIT", 10); 33 33 task->function = &psphotBlendFit_Threaded; 34 psThreadTaskAdd(task); 35 psFree(task); 36 37 task = psThreadTaskAlloc("PSPHOT_EXTENDED_FIT", 12); 38 task->function = &psphotExtendedSourceFits_Threaded; 34 39 psThreadTaskAdd(task); 35 40 psFree(task); -
branches/sc_branches/trunkTest/psphot/src/psphotSignificanceImage.c
r28667 r29060 97 97 smooth_im->data.F32[j][i] = 0.0; 98 98 } else { 99 smooth_im->data.F32[j][i] = factor * PS_SQR(value) / smooth_wt->data.F32[j][i]; 99 float v2 = value + PS_SQR(value/1000.0); 100 smooth_im->data.F32[j][i] = factor * PS_SQR(v2) / smooth_wt->data.F32[j][i]; 100 101 } 101 102 } -
branches/sc_branches/trunkTest/psphot/src/psphotSourceFits.c
r26894 r29060 2 2 3 3 // given a source with an existing modelPSF, attempt a full PSF fit, subtract if successful 4 // XXX this function does not call pmSourceFitModelInit : fix this?5 4 6 5 static int NfitPSF = 0; … … 8 7 static int NfitDBL = 0; 9 8 static int NfitEXT = 0; 9 static int NfitPCM = 0; 10 10 11 11 bool psphotFitInit (int nThreads) { … … 18 18 19 19 psLogMsg ("psphot.pspsf", PS_LOG_INFO, "fitted %5d psf, %5d blend, %5d ext, %5d dbl : %6.2f sec\n", 20 NfitPSF, NfitBlend, NfitEXT, NfitDBL, psTimerMark ("psphot.fits"));21 return true; 22 } 23 24 bool psphotFitBlend (pmReadout *readout, pmSource *source, pmPSF *psf, p sImageMaskType maskVal, psImageMaskType markVal) {20 NfitPSF, NfitBlend, NfitEXT, NfitDBL, psTimerMark ("psphot.fits")); 21 return true; 22 } 23 24 bool psphotFitBlend (pmReadout *readout, pmSource *source, pmPSF *psf, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal) { 25 25 26 26 float x, y, dR; 27 28 pmSourceFitOptions options = *fitOptions; 27 29 28 30 // maskVal is used to test for rejected pixels, and must include markVal … … 31 33 // if this source is not a possible blend, just fit as PSF 32 34 if ((source->blends == NULL) || (source->mode & PM_SOURCE_MODE_SATSTAR)) { 33 bool status = psphotFitPSF (readout, source, psf, maskVal, markVal);35 bool status = psphotFitPSF (readout, source, psf, fitOptions, maskVal, markVal); 34 36 return status; 35 37 } … … 91 93 92 94 // fit PSF model 93 pmSourceFitSet (source, modelSet, PM_SOURCE_FIT_PSF, maskVal); 95 options.mode = PM_SOURCE_FIT_PSF; 96 pmSourceFitSet (source, modelSet, &options, maskVal); 94 97 95 98 // clear the circular mask … … 154 157 } 155 158 156 bool psphotFitPSF (pmReadout *readout, pmSource *source, pmPSF *psf, p sImageMaskType maskVal, psImageMaskType markVal) {159 bool psphotFitPSF (pmReadout *readout, pmSource *source, pmPSF *psf, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal) { 157 160 158 161 double chiTrend; 162 pmSourceFitOptions options = *fitOptions; 159 163 160 164 // maskVal is used to test for rejected pixels, and must include markVal … … 171 175 172 176 // fit PSF model (set/unset the pixel mask) 173 pmSourceFitModel (source, PSF, PM_SOURCE_FIT_PSF, maskVal); 177 options.mode = PM_SOURCE_FIT_PSF; 178 pmSourceFitModel (source, PSF, &options, maskVal); 174 179 175 180 if (!isfinite(PSF->params->data.F32[PM_PAR_I0])) psAbort("nan in fit"); … … 199 204 } 200 205 206 // save a local, static copy of the EXT model type so we don't have to lookup for each object 201 207 static pmModelType modelTypeEXT; 202 208 203 bool psphotInitLimitsEXT (psMetadata *recipe ) {209 bool psphotInitLimitsEXT (psMetadata *recipe, pmReadout *readout) { 204 210 205 211 bool status; … … 208 214 char *modelNameEXT = psMetadataLookupStr (&status, recipe, "EXT_MODEL"); 209 215 modelTypeEXT = pmModelClassGetType (modelNameEXT); 210 psphotInitRadiusEXT (recipe, modelTypeEXT); 211 212 return true; 213 } 214 215 bool psphotFitBlob (pmReadout *readout, pmSource *source, psArray *newSources, pmPSF *psf, psImageMaskType maskVal, psImageMaskType markVal) { 216 216 217 psphotInitRadiusEXT (recipe, readout); 218 219 return true; 220 } 221 222 bool psphotFitBlob (pmReadout *readout, pmSource *source, psArray *newSources, pmPSF *psf, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal) { 223 224 float radius; 217 225 bool okEXT, okDBL; 218 226 float chiEXT, chiDBL; … … 222 230 pmModel *EXT = NULL; 223 231 psArray *DBL = NULL; 232 pmMoments psfMoments; 224 233 225 234 // skip the source if we don't think it is extended 235 // XXX are these robust, or do we have better info from the source-size analysis?? 226 236 if (source->type == PM_SOURCE_TYPE_UNKNOWN) return false; 227 237 if (source->type == PM_SOURCE_TYPE_DEFECT) return false; … … 229 239 230 240 // set the radius based on the footprint (also sets the mask pixels) 231 float radius = psphotSetRadiusEXT (readout, source, markVal);241 if (!psphotSetRadiusFootprint(&radius, readout, source, markVal, 1.0)) return false; 232 242 233 243 // XXX note that this changes the source moments that are published... 244 // XXX all published moments should use the same measurement 234 245 // recalculate the source moments using the larger extended-source moments radius 235 246 // at this stage, skip Gaussian windowing, and do not clip pixels by S/N 236 247 // this uses the footprint to judge both radius and aperture? 237 if (!pmSourceMoments (source, radius, 0.0, 0.0, maskVal)) return false; 248 // XXX save the psf-based moments for output 249 psfMoments = *source->moments; 250 if (!pmSourceMoments (source, radius, 0.0, 0.5, maskVal)) { 251 *source->moments = psfMoments; 252 return false; 253 } 238 254 239 255 psTrace ("psphot", 5, "trying blob...\n"); … … 244 260 // this temporary source is used as a place-holder by the psphotEval functions below 245 261 tmpSrc = pmSourceAlloc (); 246 247 // XXX need to handle failures better here 248 EXT = psphotFitEXT (readout, source, modelTypeEXT, maskVal, markVal); 249 if (!EXT) goto escape; 250 if (!isfinite(EXT->params->data.F32[PM_PAR_I0])) goto escape; 251 252 okEXT = psphotEvalEXT (tmpSrc, EXT); 253 chiEXT = EXT ? EXT->chisq / EXT->nDOF : NAN; 254 255 // DBL will always be defined, but DBL->data[n] might not 256 DBL = psphotFitDBL (readout, source, maskVal, markVal); 257 if (!DBL) goto escape; 258 if (!DBL->n) goto escape; 259 260 okDBL = psphotEvalDBL (tmpSrc, DBL->data[0]); 261 okDBL &= psphotEvalDBL (tmpSrc, DBL->data[1]); 262 // XXX should I keep / save the flags set in the eval functions? 262 { 263 // DBL will always be defined, but DBL->data[n] might not 264 DBL = psphotFitDBL (readout, source, fitOptions, maskVal, markVal); 265 if (!DBL) goto escape; 266 if (!DBL->n) goto escape; 267 268 okDBL = psphotEvalDBL (tmpSrc, DBL->data[0]); 269 okDBL &= psphotEvalDBL (tmpSrc, DBL->data[1]); 270 // XXX should I keep / save the flags set in the eval functions? 271 272 // correct first model chisqs for flux trend 273 chiDBL = NAN; 274 ONE = DBL->data[0]; 275 if (ONE) { 276 if (!isfinite(ONE->params->data.F32[PM_PAR_I0])) psAbort("nan in fit"); 277 chiTrend = psPolynomial1DEval (psf->ChiTrend, ONE->params->data.F32[1]); 278 ONE->chisqNorm = ONE->chisq / chiTrend; 279 chiDBL = ONE->chisq / ONE->nDOF; // save chisq for double-star/galaxy comparison 280 ONE->fitRadius = radius; 281 } 282 283 // correct second model chisqs for flux trend 284 ONE = DBL->data[1]; 285 if (ONE) { 286 if (!isfinite(ONE->params->data.F32[PM_PAR_I0])) psAbort("nan in fit"); 287 chiTrend = psPolynomial1DEval (psf->ChiTrend, ONE->params->data.F32[1]); 288 ONE->chisqNorm = ONE->chisq / chiTrend; 289 ONE->fitRadius = radius; 290 } 291 } 292 293 { 294 // XXX need to handle failures better here 295 EXT = psphotFitEXT (readout, source, fitOptions, modelTypeEXT, maskVal, markVal); 296 if (!EXT) goto escape; 297 if (!isfinite(EXT->params->data.F32[PM_PAR_I0])) goto escape; 298 299 okEXT = psphotEvalEXT (tmpSrc, EXT); 300 chiEXT = EXT ? EXT->chisq / EXT->nDOF : NAN; 301 } 263 302 264 303 // clear the circular mask 265 304 psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(markVal)); 266 267 // correct first model chisqs for flux trend268 chiDBL = NAN;269 ONE = DBL->data[0];270 if (ONE) {271 if (!isfinite(ONE->params->data.F32[PM_PAR_I0])) psAbort("nan in fit");272 chiTrend = psPolynomial1DEval (psf->ChiTrend, ONE->params->data.F32[1]);273 ONE->chisqNorm = ONE->chisq / chiTrend;274 chiDBL = ONE->chisq / ONE->nDOF; // save chisq for double-star/galaxy comparison275 }276 277 // correct second model chisqs for flux trend278 ONE = DBL->data[1];279 if (ONE) {280 if (!isfinite(ONE->params->data.F32[PM_PAR_I0])) psAbort("nan in fit");281 chiTrend = psPolynomial1DEval (psf->ChiTrend, ONE->params->data.F32[1]);282 ONE->chisqNorm = ONE->chisq / chiTrend;283 }284 305 285 306 psFree (tmpSrc); … … 298 319 299 320 // both models failed; reject them both 300 // XXX -- change type flags to psf in this case and keep original moments? 321 // XXX -- change type flags to psf in this case, and make sure we subtract it? 322 // reset the psf moments 323 *source->moments = psfMoments; 324 301 325 psFree (EXT); 302 326 psFree (DBL); … … 308 332 309 333 // save new model 334 // XXX save the correct radius... 310 335 source->modelEXT = EXT; 311 source->modelEXT->fitRadius = radius;312 336 source->type = PM_SOURCE_TYPE_EXTENDED; 313 337 source->mode |= PM_SOURCE_MODE_EXTMODEL; … … 327 351 # endif 328 352 353 // reset the psf moments 354 *source->moments = psfMoments; 329 355 return true; 330 356 … … 337 363 source->modelPSF = psMemIncrRefCounter (DBL->data[0]); 338 364 source->mode |= PM_SOURCE_MODE_PAIR; 339 source->modelPSF->fitRadius = radius;340 365 341 366 // copy most data from the primary source (modelEXT, blends stay NULL) 342 pmSource *newSrc = pmSourceCopy (source);367 pmSource *newSrc = pmSourceCopyData (source); 343 368 newSrc->modelPSF = psMemIncrRefCounter (DBL->data[1]); 344 newSrc->modelPSF->fitRadius = radius;345 369 346 370 // build cached models and subtract … … 365 389 # endif 366 390 391 // reset the (original) psf moments 392 *source->moments = psfMoments; 393 *newSrc->moments = psfMoments; 394 367 395 psArrayAdd (newSources, 100, newSrc); 368 396 psFree (newSrc); … … 371 399 372 400 escape: 401 // reset the psf moments 402 *source->moments = psfMoments; 373 403 psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(markVal)); 374 404 psFree (tmpSrc); … … 379 409 380 410 // fit a double PSF source to an extended blob 381 psArray *psphotFitDBL (pmReadout *readout, pmSource *source, p sImageMaskType maskVal, psImageMaskType markVal) {411 psArray *psphotFitDBL (pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal) { 382 412 383 413 float dx, dy; … … 387 417 psEllipseMoments moments; 388 418 psArray *modelSet; 419 420 pmSourceFitOptions options = *fitOptions; 389 421 390 422 NfitDBL ++; … … 403 435 axes = psEllipseMomentsToAxes (moments, 20.0); 404 436 437 if (isnan(axes.major)) return NULL; 438 if (isnan(axes.minor)) return NULL; 439 if (isnan(axes.theta)) return NULL; 440 405 441 // XXX this is really arbitrary: 4 pixel separation? 406 442 dx = 2 * cos (axes.theta); … … 426 462 427 463 // fit PSF model (set/unset the pixel mask) 428 pmSourceFitSet (source, modelSet, PM_SOURCE_FIT_PSF, maskVal); 464 options.mode = PM_SOURCE_FIT_PSF; 465 pmSourceFitSet (source, modelSet, &options, maskVal); 429 466 return (modelSet); 430 467 } 431 468 432 pmModel *psphotFitEXT (pmReadout *readout, pmSource *source, pmModelType modelType, psImageMaskType maskVal, psImageMaskType markVal) { 469 pmModel *psphotFitEXT (pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, pmModelType modelType, psImageMaskType maskVal, psImageMaskType markVal) { 470 471 if ((source->moments->Mxx < 1e-3) || (source->moments->Myy < 1e-3)) { 472 psTrace ("psphot", 5, "problem source: moments: %f %f\n", source->moments->Mxx, source->moments->Myy); 473 } 474 475 pmSourceFitOptions options = *fitOptions; 433 476 434 477 NfitEXT ++; … … 438 481 439 482 // use the source moments, etc to guess basic model parameters 440 pmModel * EXT= pmSourceModelGuess (source, modelType);441 if (! EXT) {483 pmModel *model = pmSourceModelGuess (source, modelType); 484 if (!model) { 442 485 psTrace ("psphot", 5, "failed to generate a model for source: moments: %f %f\n", source->moments->Mxx, source->moments->Myy); 443 486 return NULL; 444 487 } 445 488 489 // for sersic models, use a grid search to choose an index, then float the params there 490 if (modelType == pmModelClassGetType("PS_MODEL_SERSIC")) { 491 // for the test fits, use a somewhat smaller radius 492 psphotSetRadiusFootprint(&model->fitRadius, readout, source, markVal, 0.5); 493 psphotFitSersicIndex (model, readout, source, fitOptions, maskVal, markVal); 494 } 495 496 if (!psphotSetRadiusModel (model, readout, source, markVal, true)) { 497 psphotSetRadiusFootprint(&model->fitRadius, readout, source, markVal, 1.0); 498 } 499 500 if (modelType == pmModelClassGetType("PS_MODEL_SERSIC")) { 501 options.mode = PM_SOURCE_FIT_NO_INDEX; 502 } else { 503 options.mode = PM_SOURCE_FIT_EXT; 504 } 505 506 // psTraceSetLevel("psLib.math.psMinimizeLMChi2", 5); 507 pmSourceFitModel (source, model, &options, maskVal); 508 // fprintf (stderr, "chisq: %f, nIter: %d, radius: %f, npix: %d\n\n", model->chisqNorm, model->nIter, model->fitRadius, model->nPix); 509 510 // psTraceSetLevel("psLib.math.psMinimizeLMChi2", 0); 511 return (model); 512 } 513 514 pmModel *psphotFitPCM (pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, pmModelType modelType, psImageMaskType maskVal, psImageMaskType markVal, int psfSize) { 515 446 516 if ((source->moments->Mxx < 1e-3) || (source->moments->Myy < 1e-3)) { 447 517 psTrace ("psphot", 5, "problem source: moments: %f %f\n", source->moments->Mxx, source->moments->Myy); 448 518 } 449 519 520 pmSourceFitOptions options = *fitOptions; 521 522 NfitPCM ++; 523 524 // maskVal is used to test for rejected pixels, and must include markVal 525 maskVal |= markVal; 526 527 // allocate the model 528 pmModel *model = pmModelAlloc(modelType); 529 if (!model) { 530 return NULL; 531 } 532 533 pmPCMdata *pcm = pmPCMinit (source, &options, model, maskVal, psfSize); 534 if (!pcm) { 535 psTrace ("psphot", 5, "failed to generate a model for source: moments: %f %f\n", source->moments->Mxx, source->moments->Myy); 536 model->flags |= PM_MODEL_STATUS_BADARGS; // XXX this is probably already set in pmPCMinit 537 return model; 538 } 539 540 // use the source moments, etc to guess basic model parameters 541 if (!pmSourceModelGuessPCM (pcm, source, maskVal, markVal)) { 542 psFree (pcm); 543 model->flags |= PM_MODEL_STATUS_BADARGS; 544 return model; 545 } 546 547 // for sersic models, use a grid search to choose an index, then float the params there 548 if (modelType == pmModelClassGetType("PS_MODEL_SERSIC")) { 549 // for the test fits, use a somewhat smaller radius 550 psphotSetRadiusFootprint(&model->fitRadius, readout, source, markVal, 0.5); 551 552 if (!psphotFitSersicIndexPCM (pcm, readout, source, fitOptions, maskVal, markVal, psfSize)) { 553 model->flags |= PM_MODEL_STATUS_BADARGS; 554 return model; 555 } 556 } 557 558 if (!psphotSetRadiusModel (model, readout, source, markVal, true)) { 559 psphotSetRadiusFootprint(&model->fitRadius, readout, source, markVal, 1.0); 560 } 561 562 if (modelType == pmModelClassGetType("PS_MODEL_SERSIC")) { 563 options.mode = PM_SOURCE_FIT_NO_INDEX; 564 } else { 565 options.mode = PM_SOURCE_FIT_EXT; 566 } 567 // update the pcm elements if we have changed the circumstance (options.mode or source->pixels) 568 pmPCMupdate(pcm, source, &options, model); 569 570 // psTraceSetLevel("psLib.math.psMinimizeLMChi2", 5); 571 pmSourceFitPCM (pcm, source, &options, maskVal, markVal, psfSize); 572 // fprintf (stderr, "chisq: %f, nIter: %d, radius: %f, npix: %d\n\n", model->chisqNorm, model->nIter, model->fitRadius, model->nPix); 573 574 // psTraceSetLevel("psLib.math.psMinimizeLMChi2", 0); 575 psFree (pcm); 576 577 return model; 578 } 579 580 // note that these should be 1/2n of the standard sersic index 581 float indexGuess[] = {0.5, 0.33, 0.25, 0.167, 0.125, 0.083}; 582 # define N_INDEX_GUESS 6 583 584 // A sersic model is very sensitive to the index. attempt to find the index first by grid search in just the index 585 // for a sersic model, attempt to fit just the index and normalization with a modest number of iterations 586 bool psphotFitSersicIndex (pmModel *model, pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal) { 587 588 assert (model->type == pmModelClassGetType("PS_MODEL_SERSIC")); 589 590 pmSourceFitOptions options = *fitOptions; 591 450 592 // fit EXT (not PSF) model (set/unset the pixel mask) 451 pmSourceFitModel (source, EXT, PM_SOURCE_FIT_EXT, maskVal); 452 return (EXT); 453 } 593 options.mode = PM_SOURCE_FIT_NO_INDEX; 594 options.nIter = 4; 595 596 int iMin = -1; 597 float xMin = NAN; 598 float chiSquare[N_INDEX_GUESS]; 599 600 for (int i = 0; i < N_INDEX_GUESS; i++) { 601 model->params->data.F32[PM_PAR_7] = indexGuess[i]; 602 603 if (!model->modelGuess(model, source)) { 604 model->flags |= PM_MODEL_STATUS_BADARGS; 605 return false; 606 } 607 608 // each time we change the model guess, we need to adjust the radius 609 // XXX this did not work : we do not need such a large radius -- just uses moments-based radius 610 if (false && !psphotSetRadiusModel (model, readout, source, markVal, false)) { 611 psphotSetRadiusFootprint(&model->fitRadius, readout, source, markVal, 0.5); 612 } 613 614 pmSourceFitModel (source, model, &options, maskVal); 615 // fprintf (stderr, "chisq: %f, nIter: %d, radius: %f, npix: %d\n", model->chisqNorm, model->nIter, model->fitRadius, model->nPix); 616 617 chiSquare[i] = model->chisqNorm; 618 if (i == 0) { 619 xMin = chiSquare[i]; 620 iMin = i; 621 } else { 622 if (chiSquare[i] < xMin) { 623 xMin = chiSquare[i]; 624 iMin = i; 625 } 626 } 627 } 628 assert (iMin >= 0); 629 630 model->flags = PM_MODEL_STATUS_NONE; // do not attempt to handle failures here, let the next iteration deal with it 631 model->params->data.F32[PM_PAR_7] = indexGuess[iMin]; 632 model->modelGuess(model, source); 633 634 // each time we change the model guess, we need to adjust the radius 635 // if (!psphotSetRadiusModel (model, readout, source, markVal, true)) { 636 // psphotSetRadiusFootprint(&model->fitRadius, readout, source, markVal); 637 // } 638 639 return true; 640 } 641 642 // A sersic model is very sensitive to the index. attempt to find the index first by grid search in just the index 643 // for a sersic model, attempt to fit just the index and normalization with a modest number of iterations 644 bool psphotFitSersicIndexPCM (pmPCMdata *pcm, pmReadout *readout, pmSource *source, pmSourceFitOptions *fitOptions, psImageMaskType maskVal, psImageMaskType markVal, int psfSize) { 645 646 pmModel *model = pcm->modelConv; 647 648 assert (model->type == pmModelClassGetType("PS_MODEL_SERSIC")); 649 650 pmSourceFitOptions options = *fitOptions; 651 652 // fit EXT (not PSF) model (set/unset the pixel mask) 653 options.mode = PM_SOURCE_FIT_NO_INDEX; 654 options.nIter = 4; 655 656 // update the pcm elements if we have changed the circumstance (here, options.mode) 657 pmPCMupdate(pcm, source, &options, model); 658 659 int iMin = -1; 660 float xMin = NAN; 661 float chiSquare[N_INDEX_GUESS]; 662 663 for (int i = 0; i < N_INDEX_GUESS; i++) { 664 model->params->data.F32[PM_PAR_7] = indexGuess[i]; 665 666 if (!model->modelGuess(model, source)) { 667 model->flags |= PM_MODEL_STATUS_BADARGS; 668 return false; 669 } 670 671 // each time we change the model guess, we need to adjust the radius 672 // XXX this did not work : we do not need such a large radius -- just uses moments-based radius 673 if (false && !psphotSetRadiusModel (model, readout, source, markVal, false)) { 674 psphotSetRadiusFootprint(&model->fitRadius, readout, source, markVal, 0.5); 675 } 676 677 # if (0) 678 pmSourceFitModel (source, model, &options, maskVal); 679 # else 680 pmSourceModelGuessPCM(pcm, source, maskVal, markVal); 681 pmSourceFitPCM (pcm, source, &options, maskVal, markVal, psfSize); 682 # endif 683 // fprintf (stderr, "chisq: %f, nIter: %d, radius: %f, npix: %d\n", model->chisqNorm, model->nIter, model->fitRadius, model->nPix); 684 685 chiSquare[i] = model->chisq; 686 if (i == 0) { 687 xMin = chiSquare[i]; 688 iMin = i; 689 } else { 690 if (chiSquare[i] < xMin) { 691 xMin = chiSquare[i]; 692 iMin = i; 693 } 694 } 695 } 696 assert (iMin >= 0); 697 698 model->flags = PM_MODEL_STATUS_NONE; // do not attempt to handle failures here, let the next iteration deal with it 699 model->params->data.F32[PM_PAR_7] = indexGuess[iMin]; 700 701 pmSourceModelGuessPCM(pcm, source, maskVal, markVal); 702 703 return true; 704 } -
branches/sc_branches/trunkTest/psphot/src/psphotSourceSize.c
r28013 r29060 1 1 # include "psphotInternal.h" 2 2 # include <gsl/gsl_sf_gamma.h> 3 4 # define KRON 1 3 5 4 6 typedef struct { … … 168 170 psVector *ApErr = psVectorAllocEmpty (100, PS_TYPE_F32); 169 171 172 psImageMaskType markVal = options->markVal; 170 173 psImageMaskType maskVal = options->maskVal | options->markVal; 171 174 … … 189 192 190 193 // XXX can we test if psfMag is set and calculate only if needed? 191 pmSourceMagnitudes (source, psf, photMode, maskVal ); // maskVal includes markVal194 pmSourceMagnitudes (source, psf, photMode, maskVal, markVal); 192 195 193 196 // clear the mask bit … … 197 200 pmSourceSub (source, PM_MODEL_OP_FULL, options->maskVal); 198 201 202 // XXX test: switch to kron flux 203 # if (KRON) 204 float apMag = -2.5*log10(source->moments->KronFlux); 205 # else 199 206 float apMag = -2.5*log10(source->moments->Sum); 207 # endif 200 208 float dMag = source->psfMag - apMag; 201 209 … … 288 296 pmSourcePhotometryMode photMode = PM_SOURCE_PHOT_WEIGHT; 289 297 298 psImageMaskType markVal = options->markVal; 290 299 psImageMaskType maskVal = options->maskVal | options->markVal; 291 300 … … 335 344 336 345 // XXX can we test if psfMag is set and calculate only if needed? 337 pmSourceMagnitudes (source, psf, photMode, maskVal ); // maskVal includes markVal346 pmSourceMagnitudes (source, psf, photMode, maskVal, markVal); 338 347 339 348 // clear the mask bit … … 343 352 pmSourceSub (source, PM_MODEL_OP_FULL, options->maskVal); 344 353 354 # if (KRON) 355 float apMag = -2.5*log10(source->moments->KronFlux); 356 # else 345 357 float apMag = -2.5*log10(source->moments->Sum); 358 # endif 346 359 float dMag = source->psfMag - apMag; 347 360 348 361 // set nSigma to include both systematic and poisson error terms 349 362 // XXX the 'poisson error' contribution for size is probably wrong... 350 float nSigmaMAG = (dMag - options->ApResid) / hypot(source->errMag, options->ApSysErr); 363 // XXX add in a hard floor on the Ap Sys Err (to be a bit generous) 364 float nSigmaMAG = (dMag - options->ApResid) / hypot(source->errMag, hypot(options->ApSysErr, 0.025)); 351 365 float nSigmaMXX = (Mxx - psfClump->X) / hypot(psfClump->dX, psfClump->X*psfClump->X*source->errMag); 352 366 float nSigmaMYY = (Myy - psfClump->Y) / hypot(psfClump->dY, psfClump->Y*psfClump->Y*source->errMag); 353 367 354 // partially-masked sources are more likely to be mis-measured PSFs 368 // fprintf (stderr, "%f %f : Mxx: %f, Myy: %f, dx: %f, dy: %f, psfMag: %f, apMag: %f, dMag: %f, errMag: %f, nSigmaMag: %f, nSigmaMxx: %f, nSigmaMyy: %f\n", 369 // source->peak->xf, source->peak->yf, Mxx, Myy, source->peak->xf - source->moments->Mx, source->peak->yf - source->moments->My, 370 // source->psfMag, apMag, dMag, source->errMag, nSigmaMAG, nSigmaMXX, nSigmaMYY); 371 372 // XXX double check on ths stuff!! partially-masked sources are more likely to be mis-measured PSFs 355 373 float sizeBias = 1.0; 356 if (source->pixWeight < 0.9) { 374 if (source->pixWeightNotBad < 0.9) { 375 sizeBias = 3.0; 376 } 377 if (source->pixWeightNotPoor < 0.9) { 357 378 sizeBias = 3.0; 358 379 } … … 389 410 if (isCR) { 390 411 psTrace("psphotSourceClassRegion.CR",4,"CLASS: %g %g %f\t%g %g %g %g %g %g\t%g %g\t%g CR\t%g %g\n", 391 source->peak->xf,source->peak->yf,source->pixWeight ,Mxx,Myy,psfClump->X,psfClump->Y,psfClump->dX,psfClump->dY,apMag,dMag,nSigmaMAG,412 source->peak->xf,source->peak->yf,source->pixWeightNotBad,Mxx,Myy,psfClump->X,psfClump->Y,psfClump->dX,psfClump->dY,apMag,dMag,nSigmaMAG, 392 413 options->nSigmaApResid,sizeBias*options->nSigmaMoments); 393 414 source->mode |= PM_SOURCE_MODE_DEFECT; -
branches/sc_branches/trunkTest/psphot/src/psphotSourceStats.c
r28419 r29060 1 1 # include "psphotInternal.h" 2 void pmSourceMomentsSetVerbose(bool state); 2 3 3 4 // convert detections to sources and measure their basic properties (moments, local sky, sky … … 369 370 maskVal |= markVal; 370 371 372 // XXX test : pmSourceMomentsSetVerbose(true); 373 371 374 // threaded measurement of the sources moments 372 375 int Nfail = 0; … … 408 411 // measure basic source moments (no S/N clipping on input pixels) 409 412 status = pmSourceMoments (source, RADIUS, SIGMA, 0.0, maskVal); 413 // XXX moments / aperture test: 414 if (0) { 415 // clear the mask bit and set the circular mask pixels 416 psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(markVal)); 417 psImageKeepCircle (source->maskObj, source->peak->x, source->peak->y, 4.0*source->moments->Mrf, "OR", markVal); 418 419 float apMag = NAN; 420 pmSourcePhotometryAper (&apMag, NULL, source->pixels, source->maskObj, maskVal); 421 fprintf (stderr, "apMag: %f, kronMag: %f\n", apMag, -2.5*log10(source->moments->KronFlux)); 422 423 // clear the mask bit 424 psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(markVal)); 425 } 410 426 if (status) { 411 427 Nmoments ++; … … 502 518 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX); 503 519 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY); 504 psphotVisualPlotMoments (recipe, analysis, sources); 520 if (pmVisualTestLevel("psphot.moments.full", 2)) { 521 psphotVisualPlotMoments (recipe, analysis, sources); 522 } 505 523 #endif 506 524 -
branches/sc_branches/trunkTest/psphot/src/psphotStack.c
r27547 r29060 24 24 exit (psphotGetExitStatus()); 25 25 } 26 // Dump configuration 27 bool mdok; 28 psString dump = psMetadataLookupStr(&mdok, config->arguments, "DUMP_CONFIG"); // File for config 29 if (dump && !pmConfigDump(config, dump)) { 30 psError(psErrorCodeLast(), false, "Unable to dump configuration."); 31 exit (psphotGetExitStatus()); 32 } 33 34 26 35 27 36 psLogMsg ("psphot", 3, "complete psphot run: %f sec\n", psTimerMark ("complete")); -
branches/sc_branches/trunkTest/psphot/src/psphotStackMatchPSFsUtils.c
r28013 r29060 346 346 if (!fake) goto escape; 347 347 348 dumpImage(fake, readoutSrc, index, "fake");349 dumpImage(readoutSrc, readoutSrc, index, "real");348 // dumpImage(fake, readoutSrc, index, "fake"); 349 // dumpImage(readoutSrc, readoutSrc, index, "real"); 350 350 351 351 if (threads) pmSubtractionThreadsInit(); … … 380 380 } 381 381 382 dumpImage(readoutOut, readoutSrc, index, "conv");383 dumpImageDiff(readoutOut, fake, readoutSrc, index, "diff");382 // dumpImage(readoutOut, readoutSrc, index, "conv"); 383 // dumpImageDiff(readoutOut, fake, readoutSrc, index, "diff"); 384 384 385 385 psFree(fake); -
branches/sc_branches/trunkTest/psphot/src/psphotVisual.c
r28128 r29060 66 66 int myKapa = psphotKapaChannel (channel); 67 67 if (!(strcasecmp (overlay, "all"))) { 68 KiiEraseOverlay (myKapa, "red");69 KiiEraseOverlay (myKapa, "green");70 KiiEraseOverlay (myKapa, "blue");71 KiiEraseOverlay (myKapa, "yellow");72 return true;68 KiiEraseOverlay (myKapa, "red"); 69 KiiEraseOverlay (myKapa, "green"); 70 KiiEraseOverlay (myKapa, "blue"); 71 KiiEraseOverlay (myKapa, "yellow"); 72 return true; 73 73 } 74 74 KiiEraseOverlay (myKapa, overlay); … … 182 182 bool psphotVisualShowImage (pmReadout *readout) { 183 183 184 if (!pmVisual IsVisual()) return true;184 if (!pmVisualTestLevel("psphot.image", 1)) return true; 185 185 186 186 int kapa = psphotKapaChannel (1); … … 199 199 pmReadout *backgnd; 200 200 201 if (! DEBUG && !pmVisualIsVisual()) return true;201 if (!pmVisualTestLevel("psphot.image.backgnd", 2)) return true; 202 202 203 203 int kapa = psphotKapaChannel (1); … … 208 208 209 209 if (file->mode == PM_FPA_MODE_INTERNAL) { 210 backgnd = file->readout;210 backgnd = file->readout; 211 211 } else { 212 backgnd = pmFPAviewThisReadout (view, file->fpa);212 backgnd = pmFPAviewThisReadout (view, file->fpa); 213 213 } 214 214 … … 222 222 bool psphotVisualShowSignificance (psImage *image, float min, float max) { 223 223 224 if (! DEBUG && !pmVisualIsVisual()) return true;224 if (!pmVisualTestLevel("psphot.image.signif", 2)) return true; 225 225 226 226 int kapa = psphotKapaChannel (1); … … 233 233 } 234 234 235 bool psphotVisualShowLogSignificance (psImage *image, float min, float max) { 236 237 if (!pmVisualTestLevel("psphot.image.logsignif", 3)) return true; 238 239 int kapa = psphotKapaChannel (1); 240 if (kapa == -1) return false; 241 242 psImage *lsig = (psImage *) psUnaryOp (NULL, image, "log"); 243 psphotVisualRangeImage (kapa, lsig, "log-signif", 2, min, max); 244 psFree (lsig); 245 246 pmVisualAskUser(NULL); 247 return true; 248 } 249 250 // XXX : requires psphotVisualShowImage 235 251 bool psphotVisualShowPeaks (pmDetections *detections) { 236 252 … … 238 254 KiiOverlay *overlay; 239 255 240 if (! DEBUG && !pmVisualIsVisual()) return true;256 if (!pmVisualTestLevel("psphot.objects.peaks", 1)) return true; 241 257 242 258 int kapa = psphotKapaChannel (1); … … 252 268 for (int i = 0; i < peaks->n; i++) { 253 269 254 pmPeak *peak = peaks->data[i];255 if (peak == NULL) continue;256 257 overlay[Noverlay].type = KII_OVERLAY_BOX;258 overlay[Noverlay].x = peak->xf;259 overlay[Noverlay].y = peak->yf;260 overlay[Noverlay].dx = 2.0;261 overlay[Noverlay].dy = 2.0;262 overlay[Noverlay].angle = 0.0;263 overlay[Noverlay].text = NULL;264 Noverlay ++;270 pmPeak *peak = peaks->data[i]; 271 if (peak == NULL) continue; 272 273 overlay[Noverlay].type = KII_OVERLAY_BOX; 274 overlay[Noverlay].x = peak->xf; 275 overlay[Noverlay].y = peak->yf; 276 overlay[Noverlay].dx = 2.0; 277 overlay[Noverlay].dy = 2.0; 278 overlay[Noverlay].angle = 0.0; 279 overlay[Noverlay].text = NULL; 280 Noverlay ++; 265 281 } 266 282 … … 272 288 } 273 289 290 // XXX : requires psphotVisualShowImage 274 291 bool psphotVisualShowFootprints (pmDetections *detections) { 275 292 … … 277 294 KiiOverlay *overlay; 278 295 279 if (! DEBUG && !pmVisualIsVisual()) return true;296 if (!pmVisualTestLevel("psphot.objects.footprints", 3)) return true; 280 297 281 298 int kapa = psphotKapaChannel (1); … … 292 309 for (int i = 0; i < footprints->n; i++) { 293 310 294 pmSpan *span = NULL;295 296 pmFootprint *footprint = footprints->data[i];297 if (footprint == NULL) continue;298 if (footprint->spans == NULL) continue;299 if (footprint->spans->n < 1) continue;300 301 // draw the top302 // XXX need to allow top (and bottom) to have more than one span303 span = footprint->spans->data[0];304 overlay[Noverlay].type = KII_OVERLAY_LINE;305 overlay[Noverlay].x = span->x0;306 overlay[Noverlay].y = span->y;307 overlay[Noverlay].dx = span->x1 - span->x0;308 overlay[Noverlay].dy = 0;309 overlay[Noverlay].angle = 0.0;310 overlay[Noverlay].text = NULL;311 Noverlay ++;312 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);313 314 int ys = span->y;315 int x0s = span->x0;316 int x1s = span->x1;317 318 // draw the outer span edges319 for (int j = 1; j < footprint->spans->n; j++) {320 pmSpan *span1 = footprint->spans->data[j];321 322 int ye = span1->y;323 int x0e = span1->x0;324 int x1e = span1->x1;325 326 // we cannot have two discontinuous spans on the top or bottom, right? (no, probably not right)327 // find all of the spans in this row and generate x0e, x01:328 for (int k = j + 1; k < footprint->spans->n; k++) {329 pmSpan *span2 = footprint->spans->data[k];330 if (span2->y > span1->y) break;331 x0e = PS_MIN (x0e, span2->x0);332 x1e = PS_MAX (x1e, span2->x1);333 j++;334 }335 336 overlay[Noverlay].type = KII_OVERLAY_LINE;337 overlay[Noverlay].x = x0s;338 overlay[Noverlay].y = ys;339 overlay[Noverlay].dx = x0e - x0s;340 overlay[Noverlay].dy = ye - ys;341 overlay[Noverlay].angle = 0.0;342 overlay[Noverlay].text = NULL;343 Noverlay ++;344 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);345 346 overlay[Noverlay].type = KII_OVERLAY_LINE;347 overlay[Noverlay].x = x1s;348 overlay[Noverlay].y = ys;349 overlay[Noverlay].dx = x1e - x1s;350 overlay[Noverlay].dy = ye - ys;351 overlay[Noverlay].angle = 0.0;352 overlay[Noverlay].text = NULL;353 Noverlay ++;354 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);355 356 ys = ye;357 x0s = x0e;358 x1s = x1e;359 }360 361 // draw the bottom362 span = footprint->spans->data[footprint->spans->n - 1];363 overlay[Noverlay].type = KII_OVERLAY_LINE;364 overlay[Noverlay].x = span->x0;365 overlay[Noverlay].y = span->y;366 overlay[Noverlay].dx = span->x1 - span->x0;367 overlay[Noverlay].dy = 0;368 overlay[Noverlay].angle = 0.0;369 overlay[Noverlay].text = NULL;370 Noverlay ++;371 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);311 pmSpan *span = NULL; 312 313 pmFootprint *footprint = footprints->data[i]; 314 if (footprint == NULL) continue; 315 if (footprint->spans == NULL) continue; 316 if (footprint->spans->n < 1) continue; 317 318 // draw the top 319 // XXX need to allow top (and bottom) to have more than one span 320 span = footprint->spans->data[0]; 321 overlay[Noverlay].type = KII_OVERLAY_LINE; 322 overlay[Noverlay].x = span->x0; 323 overlay[Noverlay].y = span->y; 324 overlay[Noverlay].dx = span->x1 - span->x0; 325 overlay[Noverlay].dy = 0; 326 overlay[Noverlay].angle = 0.0; 327 overlay[Noverlay].text = NULL; 328 Noverlay ++; 329 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 330 331 int ys = span->y; 332 int x0s = span->x0; 333 int x1s = span->x1; 334 335 // draw the outer span edges 336 for (int j = 1; j < footprint->spans->n; j++) { 337 pmSpan *span1 = footprint->spans->data[j]; 338 339 int ye = span1->y; 340 int x0e = span1->x0; 341 int x1e = span1->x1; 342 343 // we cannot have two discontinuous spans on the top or bottom, right? (no, probably not right) 344 // find all of the spans in this row and generate x0e, x01: 345 for (int k = j + 1; k < footprint->spans->n; k++) { 346 pmSpan *span2 = footprint->spans->data[k]; 347 if (span2->y > span1->y) break; 348 x0e = PS_MIN (x0e, span2->x0); 349 x1e = PS_MAX (x1e, span2->x1); 350 j++; 351 } 352 353 overlay[Noverlay].type = KII_OVERLAY_LINE; 354 overlay[Noverlay].x = x0s; 355 overlay[Noverlay].y = ys; 356 overlay[Noverlay].dx = x0e - x0s; 357 overlay[Noverlay].dy = ye - ys; 358 overlay[Noverlay].angle = 0.0; 359 overlay[Noverlay].text = NULL; 360 Noverlay ++; 361 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 362 363 overlay[Noverlay].type = KII_OVERLAY_LINE; 364 overlay[Noverlay].x = x1s; 365 overlay[Noverlay].y = ys; 366 overlay[Noverlay].dx = x1e - x1s; 367 overlay[Noverlay].dy = ye - ys; 368 overlay[Noverlay].angle = 0.0; 369 overlay[Noverlay].text = NULL; 370 Noverlay ++; 371 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 372 373 ys = ye; 374 x0s = x0e; 375 x1s = x1e; 376 } 377 378 // draw the bottom 379 span = footprint->spans->data[footprint->spans->n - 1]; 380 overlay[Noverlay].type = KII_OVERLAY_LINE; 381 overlay[Noverlay].x = span->x0; 382 overlay[Noverlay].y = span->y; 383 overlay[Noverlay].dx = span->x1 - span->x0; 384 overlay[Noverlay].dy = 0; 385 overlay[Noverlay].angle = 0.0; 386 overlay[Noverlay].text = NULL; 387 Noverlay ++; 388 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 372 389 } 373 390 … … 379 396 } 380 397 398 // XXX : requires psphotVisualShowImage 381 399 bool psphotVisualShowMoments (psArray *sources) { 382 400 … … 387 405 psEllipseAxes axes; 388 406 389 if (! DEBUG && !pmVisualIsVisual()) return true;407 if (!pmVisualTestLevel("psphot.objects.moments", 2)) return true; 390 408 391 409 int kapa = psphotKapaChannel (1); … … 401 419 for (int i = 0; i < sources->n; i++) { 402 420 403 pmSource *source = sources->data[i];404 if (source == NULL) continue;405 406 pmMoments *moments = source->moments;407 if (moments == NULL) continue;408 409 overlay[Noverlay].type = KII_OVERLAY_CIRCLE;410 overlay[Noverlay].x = moments->Mx;411 overlay[Noverlay].y = moments->My;412 413 emoments.x2 = moments->Mxx;414 emoments.xy = moments->Mxy;415 emoments.y2 = moments->Myy;416 417 axes = psEllipseMomentsToAxes (emoments, 20.0);418 419 overlay[Noverlay].dx = 2.0*axes.major;420 overlay[Noverlay].dy = 2.0*axes.minor;421 422 overlay[Noverlay].angle = axes.theta * PS_DEG_RAD;423 424 overlay[Noverlay].text = NULL;425 Noverlay ++;421 pmSource *source = sources->data[i]; 422 if (source == NULL) continue; 423 424 pmMoments *moments = source->moments; 425 if (moments == NULL) continue; 426 427 overlay[Noverlay].type = KII_OVERLAY_CIRCLE; 428 overlay[Noverlay].x = moments->Mx; 429 overlay[Noverlay].y = moments->My; 430 431 emoments.x2 = moments->Mxx; 432 emoments.xy = moments->Mxy; 433 emoments.y2 = moments->Myy; 434 435 axes = psEllipseMomentsToAxes (emoments, 20.0); 436 437 overlay[Noverlay].dx = 2.0*axes.major; 438 overlay[Noverlay].dy = 2.0*axes.minor; 439 440 overlay[Noverlay].angle = axes.theta * PS_DEG_RAD; 441 442 overlay[Noverlay].text = NULL; 443 Noverlay ++; 426 444 } 427 445 … … 439 457 KapaSection section; 440 458 441 if (! DEBUG && !pmVisualIsVisual()) return true;459 if (!pmVisualTestLevel("psphot.moments", 1)) return true; 442 460 443 461 int myKapa = psphotKapaChannel (2); … … 456 474 float Ymin = 1000.0, Ymax = 0.0; 457 475 { 458 int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS");459 for (int n = 0; n < nRegions; n++) {460 461 char regionName[64];462 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n);463 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName);464 465 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");466 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");467 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");468 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");469 470 float X0 = psfX - 4.0*psfdX;471 float X1 = psfX + 4.0*psfdX;472 float Y0 = psfY - 4.0*psfdY;473 float Y1 = psfY + 4.0*psfdY;474 475 if (isfinite(X0)) { Xmin = PS_MIN(Xmin, X0); }476 if (isfinite(X1)) { Xmax = PS_MAX(Xmax, X1); }477 if (isfinite(Y0)) { Ymin = PS_MIN(Ymin, Y0); }478 if (isfinite(Y1)) { Ymax = PS_MAX(Ymax, Y1); }479 }476 int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS"); 477 for (int n = 0; n < nRegions; n++) { 478 479 char regionName[64]; 480 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n); 481 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName); 482 483 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X"); 484 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y"); 485 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX"); 486 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY"); 487 488 float X0 = psfX - 4.0*psfdX; 489 float X1 = psfX + 4.0*psfdX; 490 float Y0 = psfY - 4.0*psfdY; 491 float Y1 = psfY + 4.0*psfdY; 492 493 if (isfinite(X0)) { Xmin = PS_MIN(Xmin, X0); } 494 if (isfinite(X1)) { Xmax = PS_MAX(Xmax, X1); } 495 if (isfinite(Y0)) { Ymin = PS_MIN(Ymin, Y0); } 496 if (isfinite(Y1)) { Ymax = PS_MAX(Ymax, Y1); } 497 } 480 498 } 481 499 Xmin = PS_MAX(Xmin, -0.1); … … 498 516 int nF = 0; 499 517 for (int i = 0; i < sources->n; i++) { 500 pmSource *source = sources->data[i];501 if (source->moments == NULL)502 continue;503 504 xFaint->data.F32[nF] = source->moments->Mxx;505 yFaint->data.F32[nF] = source->moments->Myy;506 mFaint->data.F32[nF] = -2.5*log10(source->moments->Sum);507 nF++;508 509 // XXX make this a user-defined cutoff510 if (source->moments->SN < SN_LIM)511 continue;512 513 xBright->data.F32[nB] = source->moments->Mxx;514 yBright->data.F32[nB] = source->moments->Myy;515 mBright->data.F32[nB] = -2.5*log10(source->moments->Sum);516 nB++;518 pmSource *source = sources->data[i]; 519 if (source->moments == NULL) 520 continue; 521 522 xFaint->data.F32[nF] = source->moments->Mxx; 523 yFaint->data.F32[nF] = source->moments->Myy; 524 mFaint->data.F32[nF] = -2.5*log10(source->moments->Sum); 525 nF++; 526 527 // XXX make this a user-defined cutoff 528 if (source->moments->SN < SN_LIM) 529 continue; 530 531 xBright->data.F32[nB] = source->moments->Mxx; 532 yBright->data.F32[nB] = source->moments->Myy; 533 mBright->data.F32[nB] = -2.5*log10(source->moments->Sum); 534 nB++; 517 535 } 518 536 xFaint->n = nF; … … 652 670 // draw N circles to outline the clumps 653 671 { 654 KapaSelectSection (myKapa, "MxxMyy");655 656 // draw a circle centered on psfX,Y with size of the psf limit657 psVector *xLimit = psVectorAlloc (120, PS_TYPE_F32);658 psVector *yLimit = psVectorAlloc (120, PS_TYPE_F32);659 660 int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS");661 float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, recipe, "PSF_CLUMP_NSIGMA");662 663 graphdata.color = KapaColorByName ("blue");664 graphdata.style = 0;665 666 graphdata.xmin = Xmin;667 graphdata.ymin = Ymin;668 graphdata.xmax = Xmax;669 graphdata.ymax = Ymax;670 KapaSetLimits (myKapa, &graphdata);671 672 for (int n = 0; n < nRegions; n++) {673 674 char regionName[64];675 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n);676 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName);677 678 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");679 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");680 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");681 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");682 float Rx = psfdX * PSF_CLUMP_NSIGMA;683 float Ry = psfdY * PSF_CLUMP_NSIGMA;684 685 for (int i = 0; i < xLimit->n; i++) {686 xLimit->data.F32[i] = Rx*cos(i*2.0*M_PI/120.0) + psfX;687 yLimit->data.F32[i] = Ry*sin(i*2.0*M_PI/120.0) + psfY;688 }689 KapaPrepPlot (myKapa, xLimit->n, &graphdata);690 KapaPlotVector (myKapa, xLimit->n, xLimit->data.F32, "x");691 KapaPlotVector (myKapa, yLimit->n, yLimit->data.F32, "y");692 }693 psFree (xLimit);694 psFree (yLimit);672 KapaSelectSection (myKapa, "MxxMyy"); 673 674 // draw a circle centered on psfX,Y with size of the psf limit 675 psVector *xLimit = psVectorAlloc (120, PS_TYPE_F32); 676 psVector *yLimit = psVectorAlloc (120, PS_TYPE_F32); 677 678 int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS"); 679 float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, recipe, "PSF_CLUMP_NSIGMA"); 680 681 graphdata.color = KapaColorByName ("blue"); 682 graphdata.style = 0; 683 684 graphdata.xmin = Xmin; 685 graphdata.ymin = Ymin; 686 graphdata.xmax = Xmax; 687 graphdata.ymax = Ymax; 688 KapaSetLimits (myKapa, &graphdata); 689 690 for (int n = 0; n < nRegions; n++) { 691 692 char regionName[64]; 693 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n); 694 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName); 695 696 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X"); 697 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y"); 698 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX"); 699 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY"); 700 float Rx = psfdX * PSF_CLUMP_NSIGMA; 701 float Ry = psfdY * PSF_CLUMP_NSIGMA; 702 703 for (int i = 0; i < xLimit->n; i++) { 704 xLimit->data.F32[i] = Rx*cos(i*2.0*M_PI/120.0) + psfX; 705 yLimit->data.F32[i] = Ry*sin(i*2.0*M_PI/120.0) + psfY; 706 } 707 KapaPrepPlot (myKapa, xLimit->n, &graphdata); 708 KapaPlotVector (myKapa, xLimit->n, xLimit->data.F32, "x"); 709 KapaPlotVector (myKapa, yLimit->n, yLimit->data.F32, "y"); 710 } 711 psFree (xLimit); 712 psFree (yLimit); 695 713 } 696 714 … … 721 739 for (int i = 0; i < sources->n; i++) { 722 740 723 pmSource *source = sources->data[i];724 if (source == NULL) continue;725 726 if (source->type != type) continue;727 if (mode && !(source->mode & mode)) continue;728 729 pmMoments *moments = source->moments;730 if (moments == NULL) continue;731 732 overlay[Noverlay].type = KII_OVERLAY_CIRCLE;733 overlay[Noverlay].x = moments->Mx;734 overlay[Noverlay].y = moments->My;735 736 emoments.x2 = moments->Mxx;737 emoments.y2 = moments->Myy;738 emoments.xy = moments->Mxy;739 740 axes = psEllipseMomentsToAxes (emoments, 20.0);741 742 overlay[Noverlay].dx = 2.0*axes.major;743 overlay[Noverlay].dy = 2.0*axes.minor;744 overlay[Noverlay].angle = axes.theta * PS_DEG_RAD;745 overlay[Noverlay].text = NULL;746 Noverlay ++;741 pmSource *source = sources->data[i]; 742 if (source == NULL) continue; 743 744 if (source->type != type) continue; 745 if (mode && !(source->mode & mode)) continue; 746 747 pmMoments *moments = source->moments; 748 if (moments == NULL) continue; 749 750 overlay[Noverlay].type = KII_OVERLAY_CIRCLE; 751 overlay[Noverlay].x = moments->Mx; 752 overlay[Noverlay].y = moments->My; 753 754 emoments.x2 = moments->Mxx; 755 emoments.y2 = moments->Myy; 756 emoments.xy = moments->Mxy; 757 758 axes = psEllipseMomentsToAxes (emoments, 20.0); 759 760 overlay[Noverlay].dx = 2.0*axes.major; 761 overlay[Noverlay].dy = 2.0*axes.minor; 762 overlay[Noverlay].angle = axes.theta * PS_DEG_RAD; 763 overlay[Noverlay].text = NULL; 764 Noverlay ++; 747 765 } 748 766 … … 753 771 } 754 772 773 // XXX : requires psphotVisualShowImage 755 774 bool psphotVisualShowRoughClass (psArray *sources) { 756 775 757 if (! DEBUG && !pmVisualIsVisual()) return true;776 if (!pmVisualTestLevel("psphot.objects.size", 3)) return true; 758 777 759 778 int myKapa = psphotKapaChannel (1); … … 776 795 bool psphotVisualShowPSFModel (pmReadout *readout, pmPSF *psf) { 777 796 778 if (! DEBUG && !pmVisualIsVisual()) return true;797 if (!pmVisualTestLevel("psphot.psf.model", 1)) return true; 779 798 780 799 int myKapa = psphotKapaChannel (3); … … 797 816 // generate a fake model at each of the 3x3 image grid positions 798 817 for (int x = -2; x <= +2; x ++) { 799 for (int y = -2; y <= +2; y ++) {800 // use the center of the center pixel of the image801 float xc = (int)((0.5 + 0.225*x)*readout->image->numCols) + readout->image->col0 + 0.5;802 float yc = (int)((0.5 + 0.225*y)*readout->image->numRows) + readout->image->row0 + 0.5;803 804 // assign the x and y coords to the image center805 // create an object with center intensity of 1000806 modelRef->params->data.F32[PM_PAR_SKY] = 0;807 modelRef->params->data.F32[PM_PAR_I0] = 1000;808 modelRef->params->data.F32[PM_PAR_XPOS] = xc;809 modelRef->params->data.F32[PM_PAR_YPOS] = yc;810 811 // create modelPSF from this model812 pmModel *model = pmModelFromPSF (modelRef, psf);813 if (!model) continue;814 815 // place the reference object in the image center816 // no need to mask the source here817 // XXX should we measure this for the analytical model only or the full model?818 pmModelAddWithOffset (psfMosaic, NULL, model, PM_MODEL_OP_FULL | PM_MODEL_OP_CENTER, 0, x*DX, y*DY);819 pmModelAddWithOffset (funMosaic, NULL, model, PM_MODEL_OP_FUNC | PM_MODEL_OP_CENTER, 0, x*DX, y*DY);820 pmModelAddWithOffset (resMosaic, NULL, model, PM_MODEL_OP_RES0 | PM_MODEL_OP_RES1 | PM_MODEL_OP_CENTER, 0, x*DX, y*DY);821 psFree (model);822 }818 for (int y = -2; y <= +2; y ++) { 819 // use the center of the center pixel of the image 820 float xc = (int)((0.5 + 0.225*x)*readout->image->numCols) + readout->image->col0 + 0.5; 821 float yc = (int)((0.5 + 0.225*y)*readout->image->numRows) + readout->image->row0 + 0.5; 822 823 // assign the x and y coords to the image center 824 // create an object with center intensity of 1000 825 modelRef->params->data.F32[PM_PAR_SKY] = 0; 826 modelRef->params->data.F32[PM_PAR_I0] = 1000; 827 modelRef->params->data.F32[PM_PAR_XPOS] = xc; 828 modelRef->params->data.F32[PM_PAR_YPOS] = yc; 829 830 // create modelPSF from this model 831 pmModel *model = pmModelFromPSF (modelRef, psf); 832 if (!model) continue; 833 834 // place the reference object in the image center 835 // no need to mask the source here 836 // XXX should we measure this for the analytical model only or the full model? 837 pmModelAddWithOffset (psfMosaic, NULL, model, PM_MODEL_OP_FULL | PM_MODEL_OP_CENTER, 0, x*DX, y*DY); 838 pmModelAddWithOffset (funMosaic, NULL, model, PM_MODEL_OP_FUNC | PM_MODEL_OP_CENTER, 0, x*DX, y*DY); 839 pmModelAddWithOffset (resMosaic, NULL, model, PM_MODEL_OP_RES0 | PM_MODEL_OP_RES1 | PM_MODEL_OP_CENTER, 0, x*DX, y*DY); 840 psFree (model); 841 } 823 842 } 824 843 … … 842 861 bool status; 843 862 844 if (! DEBUG && !pmVisualIsVisual()) return true;863 if (!pmVisualTestLevel("psphot.psf.stars", 2)) return true; 845 864 846 865 int myKapa = psphotKapaChannel (3); … … 871 890 for (int i = 0; i < sources->n; i++) { 872 891 873 pmSource *source = sources->data[i];874 875 bool keep = false;876 keep |= (source->mode & PM_SOURCE_MODE_PSFSTAR);877 if (!keep) continue;878 879 // how does this subimage get placed into the output image?880 // DX = source->pixels->numCols881 // DY = source->pixels->numRows882 883 if (dX + DX > NX) {884 // too wide for the rest of this row885 if (dX == 0) {886 // alone on this row887 NY += DY;888 dX = 0;889 dY = 0;890 } else {891 // start the next row892 NY += dY;893 dX = DX;894 dY = DY;895 }896 } else {897 // extend this row898 dX += DX;899 dY = PS_MAX (dY, DY);900 }892 pmSource *source = sources->data[i]; 893 894 bool keep = false; 895 keep |= (source->mode & PM_SOURCE_MODE_PSFSTAR); 896 if (!keep) continue; 897 898 // how does this subimage get placed into the output image? 899 // DX = source->pixels->numCols 900 // DY = source->pixels->numRows 901 902 if (dX + DX > NX) { 903 // too wide for the rest of this row 904 if (dX == 0) { 905 // alone on this row 906 NY += DY; 907 dX = 0; 908 dY = 0; 909 } else { 910 // start the next row 911 NY += dY; 912 dX = DX; 913 dY = DY; 914 } 915 } else { 916 // extend this row 917 dX += DX; 918 dY = PS_MAX (dY, DY); 919 } 901 920 } 902 921 NY += DY; … … 918 937 for (int i = 0; i < sources->n; i++) { 919 938 920 pmSource *source = sources->data[i];921 922 bool keep = false;923 if (source->mode & PM_SOURCE_MODE_PSFSTAR) {924 nPSF ++;925 keep = true;926 }927 if (!keep) continue;928 929 if (Xo + DX > NX) {930 // too wide for the rest of this row931 if (Xo == 0) {932 // place source alone on this row933 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED);934 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);935 psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY, true);936 937 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);938 psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY, true);939 940 if (!subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);941 942 Yo += DY;943 Xo = 0;944 dY = 0;945 } else {946 // start the next row947 Yo += dY;948 Xo = 0;949 950 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED);951 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);952 psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY, true);953 954 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);955 psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY, true);956 957 if (!subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);958 959 Xo = DX;960 dY = DY;961 }962 } else {963 // extend this row964 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED);965 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);966 psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY, true);967 968 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);969 psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY, true);970 if (!subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);971 972 Xo += DX;973 dY = PS_MAX (dY, DY);974 }939 pmSource *source = sources->data[i]; 940 941 bool keep = false; 942 if (source->mode & PM_SOURCE_MODE_PSFSTAR) { 943 nPSF ++; 944 keep = true; 945 } 946 if (!keep) continue; 947 948 if (Xo + DX > NX) { 949 // too wide for the rest of this row 950 if (Xo == 0) { 951 // place source alone on this row 952 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 953 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 954 psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY, true); 955 956 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 957 psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY, true); 958 959 if (!subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 960 961 Yo += DY; 962 Xo = 0; 963 dY = 0; 964 } else { 965 // start the next row 966 Yo += dY; 967 Xo = 0; 968 969 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 970 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 971 psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY, true); 972 973 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 974 psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY, true); 975 976 if (!subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 977 978 Xo = DX; 979 dY = DY; 980 } 981 } else { 982 // extend this row 983 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 984 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 985 psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY, true); 986 987 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 988 psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY, true); 989 if (!subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 990 991 Xo += DX; 992 dY = PS_MAX (dY, DY); 993 } 975 994 } 976 995 … … 994 1013 bool status; 995 1014 996 if (! DEBUG && !pmVisualIsVisual()) return true;1015 if (!pmVisualTestLevel("psphot.psf.sat", 3)) return true; 997 1016 998 1017 int myKapa = psphotKapaChannel (3); … … 1023 1042 for (int i = 0; i < sources->n; i++) { 1024 1043 1025 pmSource *source = sources->data[i];1026 1027 // only show "real" saturated stars (not defects)1028 if (!(source->mode & PM_SOURCE_MODE_SATSTAR)) continue;;1029 if (source->mode & PM_SOURCE_MODE_DEFECT) continue;;1030 1031 // how does this subimage get placed into the output image?1032 // DX = source->pixels->numCols1033 // DY = source->pixels->numRows1034 1035 if (dX + DX > NX) {1036 // too wide for the rest of this row1037 if (dX == 0) {1038 // alone on this row1039 NY += DY;1040 dX = 0;1041 dY = 0;1042 } else {1043 // start the next row1044 NY += dY;1045 dX = DX;1046 dY = DY;1047 }1048 } else {1049 // extend this row1050 dX += DX;1051 dY = PS_MAX (dY, DY);1052 }1044 pmSource *source = sources->data[i]; 1045 1046 // only show "real" saturated stars (not defects) 1047 if (!(source->mode & PM_SOURCE_MODE_SATSTAR)) continue;; 1048 if (source->mode & PM_SOURCE_MODE_DEFECT) continue;; 1049 1050 // how does this subimage get placed into the output image? 1051 // DX = source->pixels->numCols 1052 // DY = source->pixels->numRows 1053 1054 if (dX + DX > NX) { 1055 // too wide for the rest of this row 1056 if (dX == 0) { 1057 // alone on this row 1058 NY += DY; 1059 dX = 0; 1060 dY = 0; 1061 } else { 1062 // start the next row 1063 NY += dY; 1064 dX = DX; 1065 dY = DY; 1066 } 1067 } else { 1068 // extend this row 1069 dX += DX; 1070 dY = PS_MAX (dY, DY); 1071 } 1053 1072 } 1054 1073 NY += DY; … … 1068 1087 for (int i = 0; i < sources->n; i++) { 1069 1088 1070 pmSource *source = sources->data[i];1071 1072 // only show "real" saturated stars (not defects)1073 if (!(source->mode & PM_SOURCE_MODE_SATSTAR)) continue;;1074 if (source->mode & PM_SOURCE_MODE_DEFECT) continue;;1075 nSAT ++;1076 1077 if (Xo + DX > NX) {1078 // too wide for the rest of this row1079 if (Xo == 0) {1080 // place source alone on this row1081 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED);1082 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);1083 psphotMosaicSubimage (outsat, source, Xo, Yo, DX, DY, false);1084 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);1085 1086 Yo += DY;1087 Xo = 0;1088 dY = 0;1089 } else {1090 // start the next row1091 Yo += dY;1092 Xo = 0;1093 1094 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED);1095 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);1096 psphotMosaicSubimage (outsat, source, Xo, Yo, DX, DY, false);1097 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);1098 1099 Xo = DX;1100 dY = DY;1101 }1102 } else {1103 // extend this row1104 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED);1105 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);1106 psphotMosaicSubimage (outsat, source, Xo, Yo, DX, DY, false);1107 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);1108 1109 Xo += DX;1110 dY = PS_MAX (dY, DY);1111 }1089 pmSource *source = sources->data[i]; 1090 1091 // only show "real" saturated stars (not defects) 1092 if (!(source->mode & PM_SOURCE_MODE_SATSTAR)) continue;; 1093 if (source->mode & PM_SOURCE_MODE_DEFECT) continue;; 1094 nSAT ++; 1095 1096 if (Xo + DX > NX) { 1097 // too wide for the rest of this row 1098 if (Xo == 0) { 1099 // place source alone on this row 1100 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 1101 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1102 psphotMosaicSubimage (outsat, source, Xo, Yo, DX, DY, false); 1103 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1104 1105 Yo += DY; 1106 Xo = 0; 1107 dY = 0; 1108 } else { 1109 // start the next row 1110 Yo += dY; 1111 Xo = 0; 1112 1113 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 1114 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1115 psphotMosaicSubimage (outsat, source, Xo, Yo, DX, DY, false); 1116 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1117 1118 Xo = DX; 1119 dY = DY; 1120 } 1121 } else { 1122 // extend this row 1123 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 1124 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1125 psphotMosaicSubimage (outsat, source, Xo, Yo, DX, DY, false); 1126 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1127 1128 Xo += DX; 1129 dY = PS_MAX (dY, DY); 1130 } 1112 1131 } 1113 1132 … … 1151 1170 float Yo = source->modelPSF->params->data.F32[PM_PAR_YPOS] - source->pixels->row0; 1152 1171 for (int iy = 0; iy < source->pixels->numRows; iy++) { 1153 for (int ix = 0; ix < source->pixels->numCols; ix++) {1154 if (source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix]) {1155 rb->data.F32[nb] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ;1156 // rb->data.F32[nb] = hypot (ix - Xo, iy - Yo) ;1157 Rb->data.F32[nb] = log10(rb->data.F32[nb]);1158 fb->data.F32[nb] = log10(source->pixels->data.F32[iy][ix]);1159 nb++;1160 } else {1161 rg->data.F32[ng] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ;1162 // rg->data.F32[ng] = hypot (ix - Xo, iy - Yo) ;1163 Rg->data.F32[ng] = log10(rg->data.F32[ng]);1164 fg->data.F32[ng] = log10(source->pixels->data.F32[iy][ix]);1165 ng++;1166 }1167 }1172 for (int ix = 0; ix < source->pixels->numCols; ix++) { 1173 if (source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix]) { 1174 rb->data.F32[nb] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ; 1175 // rb->data.F32[nb] = hypot (ix - Xo, iy - Yo) ; 1176 Rb->data.F32[nb] = log10(rb->data.F32[nb]); 1177 fb->data.F32[nb] = log10(source->pixels->data.F32[iy][ix]); 1178 nb++; 1179 } else { 1180 rg->data.F32[ng] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ; 1181 // rg->data.F32[ng] = hypot (ix - Xo, iy - Yo) ; 1182 Rg->data.F32[ng] = log10(rg->data.F32[ng]); 1183 fg->data.F32[ng] = log10(source->pixels->data.F32[iy][ix]); 1184 ng++; 1185 } 1186 } 1168 1187 } 1169 1188 … … 1358 1377 KapaSection section; // put the positive profile in one and the residuals in another? 1359 1378 1360 if (! DEBUG && !pmVisualIsVisual()) return true;1379 if (!pmVisualTestLevel("psphot.profiles", 3)) return true; 1361 1380 1362 1381 int myKapa = psphotKapaChannel (2); … … 1394 1413 for (int i = 0; i < sources->n; i++) { 1395 1414 1396 pmSource *source = sources->data[i];1397 if (!(source->mode & PM_SOURCE_MODE_PSFSTAR)) continue;1398 1399 psphotVisualPlotRadialProfile (myKapa, source, maskVal);1400 1401 // pause and wait for user input:1402 // continue, save (provide name), ??1403 char key[10];1404 fprintf (stdout, "[e]rase and continue? [o]verplot and continue? [s]kip rest of stars? : ");1405 if (!fgets(key, 8, stdin)) {1406 psWarning("Unable to read option");1407 }1408 if (key[0] == 'e') {1409 KapaClearPlots (myKapa);1410 }1411 if (key[0] == 's') {1412 break;1413 }1415 pmSource *source = sources->data[i]; 1416 if (!(source->mode & PM_SOURCE_MODE_PSFSTAR)) continue; 1417 1418 psphotVisualPlotRadialProfile (myKapa, source, maskVal); 1419 1420 // pause and wait for user input: 1421 // continue, save (provide name), ?? 1422 char key[10]; 1423 fprintf (stdout, "[e]rase and continue? [o]verplot and continue? [s]kip rest of stars? : "); 1424 if (!fgets(key, 8, stdin)) { 1425 psWarning("Unable to read option"); 1426 } 1427 if (key[0] == 'e') { 1428 KapaClearPlots (myKapa); 1429 } 1430 if (key[0] == 's') { 1431 break; 1432 } 1414 1433 } 1415 1434 … … 1429 1448 return true; 1430 1449 1431 if (! DEBUG && !pmVisualIsVisual()) return true;1450 if (!pmVisualTestLevel("psphot.objects.flags", 3)) return true; 1432 1451 1433 1452 int myKapa = psphotKapaChannel (1); … … 1445 1464 for (int i = 0; i < sources->n; i++) { 1446 1465 1447 float Xo, Yo, Rmaj, Rmin, cs, sn;1448 1449 pmSource *source = sources->data[i];1450 if (source == NULL) continue;1451 1452 pmMoments *moments = source->moments;1453 if (0) {1454 emoments.x2 = moments->Mxx;1455 emoments.y2 = moments->Myy;1456 emoments.xy = moments->Mxy;1457 Xo = moments->Mx;1458 Yo = moments->My;1459 1460 axes = psEllipseMomentsToAxes (emoments, 20.0);1461 Rmaj = 2.0*axes.major;1462 Rmin = 2.0*axes.minor;1463 cs = cos(axes.theta);1464 sn = sin(axes.theta);1465 } else {1466 Rmaj = Rmin = 5.0;1467 cs = 1.0;1468 sn = 0.0;1469 Xo = source->peak->xf;1470 Yo = source->peak->yf;1471 }1472 1473 unsigned short int flagMask = 0x01;1474 for (int j = 0; j < 8; j++) {1475 if (source->mode & flagMask) {1476 overlayE[NoverlayE].type = KII_OVERLAY_LINE;1477 overlayE[NoverlayE].x = Xo;1478 overlayE[NoverlayE].y = Yo;1479 1480 float phi = j*M_PI/4.0;1481 overlayE[NoverlayE].dx = +Rmaj*cos(phi)*cs - Rmin*sin(phi)*sn;1482 overlayE[NoverlayE].dy = +Rmaj*cos(phi)*sn + Rmin*sin(phi)*cs;1483 overlayE[NoverlayE].angle = 0;1484 overlayE[NoverlayE].text = NULL;1485 NoverlayE ++;1486 CHECK_REALLOCATE (overlayE, KiiOverlay, NOVERLAYE, NoverlayE, 100);1487 }1488 flagMask <<= 1;1489 1490 if (source->mode & flagMask) {1491 overlayO[NoverlayO].type = KII_OVERLAY_LINE;1492 overlayO[NoverlayO].x = Xo + 1;1493 overlayO[NoverlayO].y = Yo;1494 1495 float phi = j*M_PI/4.0;1496 overlayO[NoverlayO].dx = +Rmaj*cos(phi)*cs - Rmin*sin(phi)*sn;1497 overlayO[NoverlayO].dy = +Rmaj*cos(phi)*sn + Rmin*sin(phi)*cs;1498 overlayO[NoverlayO].angle = 0;1499 overlayO[NoverlayO].text = NULL;1500 NoverlayO ++;1501 CHECK_REALLOCATE (overlayO, KiiOverlay, NOVERLAYO, NoverlayO, 100);1502 }1503 flagMask <<= 1;1504 }1466 float Xo, Yo, Rmaj, Rmin, cs, sn; 1467 1468 pmSource *source = sources->data[i]; 1469 if (source == NULL) continue; 1470 1471 pmMoments *moments = source->moments; 1472 if (0) { 1473 emoments.x2 = moments->Mxx; 1474 emoments.y2 = moments->Myy; 1475 emoments.xy = moments->Mxy; 1476 Xo = moments->Mx; 1477 Yo = moments->My; 1478 1479 axes = psEllipseMomentsToAxes (emoments, 20.0); 1480 Rmaj = 2.0*axes.major; 1481 Rmin = 2.0*axes.minor; 1482 cs = cos(axes.theta); 1483 sn = sin(axes.theta); 1484 } else { 1485 Rmaj = Rmin = 5.0; 1486 cs = 1.0; 1487 sn = 0.0; 1488 Xo = source->peak->xf; 1489 Yo = source->peak->yf; 1490 } 1491 1492 unsigned short int flagMask = 0x01; 1493 for (int j = 0; j < 8; j++) { 1494 if (source->mode & flagMask) { 1495 overlayE[NoverlayE].type = KII_OVERLAY_LINE; 1496 overlayE[NoverlayE].x = Xo; 1497 overlayE[NoverlayE].y = Yo; 1498 1499 float phi = j*M_PI/4.0; 1500 overlayE[NoverlayE].dx = +Rmaj*cos(phi)*cs - Rmin*sin(phi)*sn; 1501 overlayE[NoverlayE].dy = +Rmaj*cos(phi)*sn + Rmin*sin(phi)*cs; 1502 overlayE[NoverlayE].angle = 0; 1503 overlayE[NoverlayE].text = NULL; 1504 NoverlayE ++; 1505 CHECK_REALLOCATE (overlayE, KiiOverlay, NOVERLAYE, NoverlayE, 100); 1506 } 1507 flagMask <<= 1; 1508 1509 if (source->mode & flagMask) { 1510 overlayO[NoverlayO].type = KII_OVERLAY_LINE; 1511 overlayO[NoverlayO].x = Xo + 1; 1512 overlayO[NoverlayO].y = Yo; 1513 1514 float phi = j*M_PI/4.0; 1515 overlayO[NoverlayO].dx = +Rmaj*cos(phi)*cs - Rmin*sin(phi)*sn; 1516 overlayO[NoverlayO].dy = +Rmaj*cos(phi)*sn + Rmin*sin(phi)*cs; 1517 overlayO[NoverlayO].angle = 0; 1518 overlayO[NoverlayO].text = NULL; 1519 NoverlayO ++; 1520 CHECK_REALLOCATE (overlayO, KiiOverlay, NOVERLAYO, NoverlayO, 100); 1521 } 1522 flagMask <<= 1; 1523 } 1505 1524 } 1506 1525 … … 1531 1550 for (int i = 0; i < sources->n; i++) { 1532 1551 1533 pmSource *source = sources->data[i];1534 if (source == NULL) continue;1535 1536 if (mode) {1537 if (keep) {1538 if (!(source->mode & mode)) continue;1539 } else {1540 if (source->mode & mode) continue;1541 }1542 }1543 1544 pmMoments *moments = source->moments;1545 if (moments == NULL) continue;1546 1547 overlay[Noverlay].type = KII_OVERLAY_CIRCLE;1548 overlay[Noverlay].x = moments->Mx;1549 overlay[Noverlay].y = moments->My;1550 1551 emoments.x2 = moments->Mxx;1552 emoments.y2 = moments->Myy;1553 emoments.xy = moments->Mxy;1554 1555 axes = psEllipseMomentsToAxes (emoments, 20.0);1556 1557 overlay[Noverlay].dx = scale*2.0*axes.major;1558 overlay[Noverlay].dy = scale*2.0*axes.minor;1559 overlay[Noverlay].angle = axes.theta * PS_DEG_RAD;1560 overlay[Noverlay].text = NULL;1561 Noverlay ++;1552 pmSource *source = sources->data[i]; 1553 if (source == NULL) continue; 1554 1555 if (mode) { 1556 if (keep) { 1557 if (!(source->mode & mode)) continue; 1558 } else { 1559 if (source->mode & mode) continue; 1560 } 1561 } 1562 1563 pmMoments *moments = source->moments; 1564 if (moments == NULL) continue; 1565 1566 overlay[Noverlay].type = KII_OVERLAY_CIRCLE; 1567 overlay[Noverlay].x = moments->Mx; 1568 overlay[Noverlay].y = moments->My; 1569 1570 emoments.x2 = moments->Mxx; 1571 emoments.y2 = moments->Myy; 1572 emoments.xy = moments->Mxy; 1573 1574 axes = psEllipseMomentsToAxes (emoments, 20.0); 1575 1576 overlay[Noverlay].dx = scale*2.0*axes.major; 1577 overlay[Noverlay].dy = scale*2.0*axes.minor; 1578 overlay[Noverlay].angle = axes.theta * PS_DEG_RAD; 1579 overlay[Noverlay].text = NULL; 1580 Noverlay ++; 1562 1581 } 1563 1582 … … 1570 1589 bool psphotVisualShowSourceSize (pmReadout *readout, psArray *sources) { 1571 1590 1572 if (! DEBUG && !pmVisualIsVisual()) return true;1591 if (!pmVisualTestLevel("psphot.objects.size", 2)) return true; 1573 1592 1574 1593 int myKapa = psphotKapaChannel (1); … … 1597 1616 KapaSection section; 1598 1617 1599 if (! DEBUG && !pmVisualIsVisual()) return true;1618 if (!pmVisualTestLevel("psphot.size", 2)) return true; 1600 1619 1601 1620 int myKapa = psphotKapaChannel (2); … … 1612 1631 float Ymin = 1000.0, Ymax = 0.0; 1613 1632 { 1614 int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS");1615 for (int n = 0; n < nRegions; n++) {1616 1617 char regionName[64];1618 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n);1619 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName);1620 1621 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");1622 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");1623 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");1624 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");1625 1626 float X0 = psfX - 10.0*psfdX;1627 float X1 = psfX + 10.0*psfdX;1628 float Y0 = psfY - 10.0*psfdY;1629 float Y1 = psfY + 10.0*psfdY;1630 1631 if (isfinite(X0)) { Xmin = PS_MIN(Xmin, X0); }1632 if (isfinite(X1)) { Xmax = PS_MAX(Xmax, X1); }1633 if (isfinite(Y0)) { Ymin = PS_MIN(Ymin, Y0); }1634 if (isfinite(Y1)) { Ymax = PS_MAX(Ymax, Y1); }1635 }1633 int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS"); 1634 for (int n = 0; n < nRegions; n++) { 1635 1636 char regionName[64]; 1637 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n); 1638 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName); 1639 1640 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X"); 1641 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y"); 1642 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX"); 1643 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY"); 1644 1645 float X0 = psfX - 10.0*psfdX; 1646 float X1 = psfX + 10.0*psfdX; 1647 float Y0 = psfY - 10.0*psfdY; 1648 float Y1 = psfY + 10.0*psfdY; 1649 1650 if (isfinite(X0)) { Xmin = PS_MIN(Xmin, X0); } 1651 if (isfinite(X1)) { Xmax = PS_MAX(Xmax, X1); } 1652 if (isfinite(Y0)) { Ymin = PS_MIN(Ymin, Y0); } 1653 if (isfinite(Y1)) { Ymax = PS_MAX(Ymax, Y1); } 1654 } 1636 1655 } 1637 1656 Xmin = PS_MAX(Xmin, -0.1); … … 1677 1696 int nCR = 0; 1678 1697 for (int i = 0; i < sources->n; i++) { 1679 pmSource *source = sources->data[i];1680 if (source->moments == NULL) continue;1698 pmSource *source = sources->data[i]; 1699 if (source->moments == NULL) continue; 1681 1700 1682 1701 // only plot the measured sources... 1683 if (!(source->tmpFlags & PM_SOURCE_TMPF_SIZE_MEASURED)) continue;1684 1685 if (source->mode & PM_SOURCE_MODE_CR_LIMIT) {1686 xCR->data.F32[nCR] = source->moments->Mxx;1687 yCR->data.F32[nCR] = source->moments->Myy;1688 mCR->data.F32[nCR] = -2.5*log10(source->moments->Sum);1689 sCR->data.F32[nCR] = source->extNsigma;1690 nCR++;1691 }1692 if (source->mode & PM_SOURCE_MODE_SATSTAR) {1693 xSAT->data.F32[nSAT] = source->moments->Mxx;1694 ySAT->data.F32[nSAT] = source->moments->Myy;1695 mSAT->data.F32[nSAT] = -2.5*log10(source->moments->Sum);1696 sSAT->data.F32[nSAT] = source->extNsigma;1697 nSAT++;1698 }1699 if (source->mode & PM_SOURCE_MODE_EXT_LIMIT) {1700 xEXT->data.F32[nEXT] = source->moments->Mxx;1701 yEXT->data.F32[nEXT] = source->moments->Myy;1702 mEXT->data.F32[nEXT] = -2.5*log10(source->moments->Sum);1703 sEXT->data.F32[nEXT] = source->extNsigma;1704 nEXT++;1705 continue;1706 }1707 if (source->mode & PM_SOURCE_MODE_DEFECT) {1708 xDEF->data.F32[nDEF] = source->moments->Mxx;1709 yDEF->data.F32[nDEF] = source->moments->Myy;1710 mDEF->data.F32[nDEF] = -2.5*log10(source->moments->Sum);1711 sDEF->data.F32[nDEF] = source->extNsigma;1712 nDEF++;1713 continue;1714 }1715 if (source->errMag > 0.1) {1716 xLOW->data.F32[nLOW] = source->moments->Mxx;1717 yLOW->data.F32[nLOW] = source->moments->Myy;1718 mLOW->data.F32[nLOW] = -2.5*log10(source->moments->Sum);1719 sLOW->data.F32[nLOW] = source->extNsigma;1720 nLOW++;1721 continue;1722 }1723 xPSF->data.F32[nPSF] = source->moments->Mxx;1724 yPSF->data.F32[nPSF] = source->moments->Myy;1725 mPSF->data.F32[nPSF] = -2.5*log10(source->moments->Sum);1726 sPSF->data.F32[nPSF] = source->extNsigma;1727 nPSF++;1702 if (!(source->tmpFlags & PM_SOURCE_TMPF_SIZE_MEASURED)) continue; 1703 1704 if (source->mode & PM_SOURCE_MODE_CR_LIMIT) { 1705 xCR->data.F32[nCR] = source->moments->Mxx; 1706 yCR->data.F32[nCR] = source->moments->Myy; 1707 mCR->data.F32[nCR] = -2.5*log10(source->moments->Sum); 1708 sCR->data.F32[nCR] = source->extNsigma; 1709 nCR++; 1710 } 1711 if (source->mode & PM_SOURCE_MODE_SATSTAR) { 1712 xSAT->data.F32[nSAT] = source->moments->Mxx; 1713 ySAT->data.F32[nSAT] = source->moments->Myy; 1714 mSAT->data.F32[nSAT] = -2.5*log10(source->moments->Sum); 1715 sSAT->data.F32[nSAT] = source->extNsigma; 1716 nSAT++; 1717 } 1718 if (source->mode & PM_SOURCE_MODE_EXT_LIMIT) { 1719 xEXT->data.F32[nEXT] = source->moments->Mxx; 1720 yEXT->data.F32[nEXT] = source->moments->Myy; 1721 mEXT->data.F32[nEXT] = -2.5*log10(source->moments->Sum); 1722 sEXT->data.F32[nEXT] = source->extNsigma; 1723 nEXT++; 1724 continue; 1725 } 1726 if (source->mode & PM_SOURCE_MODE_DEFECT) { 1727 xDEF->data.F32[nDEF] = source->moments->Mxx; 1728 yDEF->data.F32[nDEF] = source->moments->Myy; 1729 mDEF->data.F32[nDEF] = -2.5*log10(source->moments->Sum); 1730 sDEF->data.F32[nDEF] = source->extNsigma; 1731 nDEF++; 1732 continue; 1733 } 1734 if (source->errMag > 0.1) { 1735 xLOW->data.F32[nLOW] = source->moments->Mxx; 1736 yLOW->data.F32[nLOW] = source->moments->Myy; 1737 mLOW->data.F32[nLOW] = -2.5*log10(source->moments->Sum); 1738 sLOW->data.F32[nLOW] = source->extNsigma; 1739 nLOW++; 1740 continue; 1741 } 1742 xPSF->data.F32[nPSF] = source->moments->Mxx; 1743 yPSF->data.F32[nPSF] = source->moments->Myy; 1744 mPSF->data.F32[nPSF] = -2.5*log10(source->moments->Sum); 1745 sPSF->data.F32[nPSF] = source->extNsigma; 1746 nPSF++; 1728 1747 } 1729 1748 … … 2029 2048 // draw N circles to outline the clumps 2030 2049 { 2031 KapaSelectSection (myKapa, "MxxMyy");2032 2033 // draw a circle centered on psfX,Y with size of the psf limit2034 psVector *xLimit = psVectorAlloc (120, PS_TYPE_F32);2035 psVector *yLimit = psVectorAlloc (120, PS_TYPE_F32);2036 2037 int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS");2038 float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, recipe, "PSF_CLUMP_NSIGMA");2039 2040 graphdata.color = KapaColorByName ("blue");2041 graphdata.style = 0;2042 2043 graphdata.xmin = Xmin;2044 graphdata.ymin = Ymin;2045 graphdata.xmax = Xmax;2046 graphdata.ymax = Ymax;2047 KapaSetLimits (myKapa, &graphdata);2048 2049 for (int n = 0; n < nRegions; n++) {2050 2051 char regionName[64];2052 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n);2053 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName);2054 2055 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");2056 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");2057 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");2058 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");2059 float Rx = psfdX * PSF_CLUMP_NSIGMA;2060 float Ry = psfdY * PSF_CLUMP_NSIGMA;2061 2062 for (int i = 0; i < xLimit->n; i++) {2063 xLimit->data.F32[i] = Rx*cos(i*2.0*M_PI/120.0) + psfX;2064 yLimit->data.F32[i] = Ry*sin(i*2.0*M_PI/120.0) + psfY;2065 }2066 KapaPrepPlot (myKapa, xLimit->n, &graphdata);2067 KapaPlotVector (myKapa, xLimit->n, xLimit->data.F32, "x");2068 KapaPlotVector (myKapa, yLimit->n, yLimit->data.F32, "y");2069 }2070 psFree (xLimit);2071 psFree (yLimit);2050 KapaSelectSection (myKapa, "MxxMyy"); 2051 2052 // draw a circle centered on psfX,Y with size of the psf limit 2053 psVector *xLimit = psVectorAlloc (120, PS_TYPE_F32); 2054 psVector *yLimit = psVectorAlloc (120, PS_TYPE_F32); 2055 2056 int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS"); 2057 float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, recipe, "PSF_CLUMP_NSIGMA"); 2058 2059 graphdata.color = KapaColorByName ("blue"); 2060 graphdata.style = 0; 2061 2062 graphdata.xmin = Xmin; 2063 graphdata.ymin = Ymin; 2064 graphdata.xmax = Xmax; 2065 graphdata.ymax = Ymax; 2066 KapaSetLimits (myKapa, &graphdata); 2067 2068 for (int n = 0; n < nRegions; n++) { 2069 2070 char regionName[64]; 2071 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n); 2072 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName); 2073 2074 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X"); 2075 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y"); 2076 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX"); 2077 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY"); 2078 float Rx = psfdX * PSF_CLUMP_NSIGMA; 2079 float Ry = psfdY * PSF_CLUMP_NSIGMA; 2080 2081 for (int i = 0; i < xLimit->n; i++) { 2082 xLimit->data.F32[i] = Rx*cos(i*2.0*M_PI/120.0) + psfX; 2083 yLimit->data.F32[i] = Ry*sin(i*2.0*M_PI/120.0) + psfY; 2084 } 2085 KapaPrepPlot (myKapa, xLimit->n, &graphdata); 2086 KapaPlotVector (myKapa, xLimit->n, xLimit->data.F32, "x"); 2087 KapaPlotVector (myKapa, yLimit->n, yLimit->data.F32, "y"); 2088 } 2089 psFree (xLimit); 2090 psFree (yLimit); 2072 2091 } 2073 2092 … … 2108 2127 bool psphotVisualShowResidualImage (pmReadout *readout) { 2109 2128 2110 if (! DEBUG && !pmVisualIsVisual()) return true;2129 if (!pmVisualTestLevel("psphot.image.resid", 2)) return true; 2111 2130 2112 2131 int myKapa = psphotKapaChannel (1); … … 2124 2143 float lineX[2], lineY[2]; 2125 2144 2126 if (! DEBUG && !pmVisualIsVisual()) return true;2145 if (!pmVisualTestLevel("psphot.apresid", 1)) return true; 2127 2146 2128 2147 int myKapa = psphotKapaChannel (2); … … 2144 2163 int n = 0; 2145 2164 for (int i = 0; i < sources->n; i++) { 2146 pmSource *source = sources->data[i];2147 if (!source) continue;2148 if (source->type != PM_SOURCE_TYPE_STAR) continue;2149 if (!isfinite (source->apMag)) continue;2150 if (!isfinite (source->psfMag)) continue;2151 2152 x->data.F32[n] = source->psfMag;2153 y->data.F32[n] = source->apMag - source->psfMag;2154 dy->data.F32[n] = source->errMag;2155 graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]);2156 graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]);2157 graphdata.ymin = PS_MIN(graphdata.ymin, y->data.F32[n]);2158 graphdata.ymax = PS_MAX(graphdata.ymax, y->data.F32[n]);2159 2160 n++;2165 pmSource *source = sources->data[i]; 2166 if (!source) continue; 2167 if (source->type != PM_SOURCE_TYPE_STAR) continue; 2168 if (!isfinite (source->apMag)) continue; 2169 if (!isfinite (source->psfMag)) continue; 2170 2171 x->data.F32[n] = source->psfMag; 2172 y->data.F32[n] = source->apMag - source->psfMag; 2173 dy->data.F32[n] = source->errMag; 2174 graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]); 2175 graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]); 2176 graphdata.ymin = PS_MIN(graphdata.ymin, y->data.F32[n]); 2177 graphdata.ymax = PS_MAX(graphdata.ymax, y->data.F32[n]); 2178 2179 n++; 2161 2180 } 2162 2181 x->n = y->n = dy->n = n; … … 2242 2261 Graphdata graphdata; 2243 2262 2244 if (! DEBUG && !pmVisualIsVisual()) return true;2263 if (!pmVisualTestLevel("psphot.chisq", 1)) return true; 2245 2264 2246 2265 int myKapa = psphotKapaChannel (2); … … 2263 2282 int n = 0; 2264 2283 for (int i = 0; i < sources->n; i++) { 2265 pmSource *source = sources->data[i];2266 if (!source) continue;2267 if (source->type != PM_SOURCE_TYPE_STAR) continue;2268 if (!source->moments) continue;2269 if (!isfinite(source->moments->Sum)) continue;2270 if (!source->modelPSF) continue;2271 if (!isfinite(source->modelPSF->chisq)) continue;2272 2273 x->data.F32[n] = -2.5*log10(source->moments->Sum);2274 y->data.F32[n] = source->modelPSF->chisq / source->modelPSF->nDOF;2275 graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]);2276 graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]);2277 graphdata.ymin = PS_MIN(graphdata.ymin, y->data.F32[n]);2278 graphdata.ymax = PS_MAX(graphdata.ymax, y->data.F32[n]);2279 2280 fprintf (f, "%d %d %f %f\n", i, n, x->data.F32[n], y->data.F32[n]);2281 2282 n++;2284 pmSource *source = sources->data[i]; 2285 if (!source) continue; 2286 if (source->type != PM_SOURCE_TYPE_STAR) continue; 2287 if (!source->moments) continue; 2288 if (!isfinite(source->moments->Sum)) continue; 2289 if (!source->modelPSF) continue; 2290 if (!isfinite(source->modelPSF->chisq)) continue; 2291 2292 x->data.F32[n] = -2.5*log10(source->moments->Sum); 2293 y->data.F32[n] = source->modelPSF->chisq / source->modelPSF->nDOF; 2294 graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]); 2295 graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]); 2296 graphdata.ymin = PS_MIN(graphdata.ymin, y->data.F32[n]); 2297 graphdata.ymax = PS_MAX(graphdata.ymax, y->data.F32[n]); 2298 2299 fprintf (f, "%d %d %f %f\n", i, n, x->data.F32[n], y->data.F32[n]); 2300 2301 n++; 2283 2302 } 2284 2303 x->n = y->n = n; … … 2326 2345 KiiOverlay *overlay; 2327 2346 2328 if (! DEBUG && !pmVisualIsVisual()) return true;2347 if (!pmVisualTestLevel("psphot.objects.petro", 2)) return true; 2329 2348 2330 2349 int kapa = psphotKapaChannel (1); … … 2336 2355 2337 2356 for (int i = 0; i < sources->n; i++) { 2338 pmSource *source = sources->data[i];2339 2340 if (!source) continue;2341 if (!source->extpars) continue;2342 if (!source->extpars->petProfile) continue;2343 2344 float petrosianRadius = source->extpars->petrosianRadius;2357 pmSource *source = sources->data[i]; 2358 2359 if (!source) continue; 2360 if (!source->extpars) continue; 2361 if (!source->extpars->petProfile) continue; 2362 2363 float petrosianRadius = source->extpars->petrosianRadius; 2345 2364 psEllipseAxes *axes = &source->extpars->axes; 2346 2365 2347 overlay[Noverlay].type = KII_OVERLAY_CIRCLE;2348 overlay[Noverlay].x = source->peak->xf;2349 overlay[Noverlay].y = source->peak->yf;2350 overlay[Noverlay].dx = 1.0*petrosianRadius;2351 overlay[Noverlay].dy = 1.0*petrosianRadius*axes->minor/axes->major;2352 overlay[Noverlay].angle = axes->theta * PS_DEG_RAD;2353 overlay[Noverlay].text = NULL;2354 Noverlay ++;2355 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);2356 2357 // overlay[Noverlay].type = KII_OVERLAY_CIRCLE;2358 // overlay[Noverlay].x = source->peak->xf;2359 // overlay[Noverlay].y = source->peak->yf;2360 // overlay[Noverlay].dx = 2.0*petrosianRadius;2361 // overlay[Noverlay].dy = 2.0*petrosianRadius*axes->minor/axes->major;2362 // overlay[Noverlay].angle = axes->theta * PS_DEG_RAD;2363 // overlay[Noverlay].text = NULL;2364 // Noverlay ++;2365 // CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);2366 overlay[Noverlay].type = KII_OVERLAY_CIRCLE; 2367 overlay[Noverlay].x = source->peak->xf; 2368 overlay[Noverlay].y = source->peak->yf; 2369 overlay[Noverlay].dx = 1.0*petrosianRadius; 2370 overlay[Noverlay].dy = 1.0*petrosianRadius*axes->minor/axes->major; 2371 overlay[Noverlay].angle = axes->theta * PS_DEG_RAD; 2372 overlay[Noverlay].text = NULL; 2373 Noverlay ++; 2374 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 2375 2376 // overlay[Noverlay].type = KII_OVERLAY_CIRCLE; 2377 // overlay[Noverlay].x = source->peak->xf; 2378 // overlay[Noverlay].y = source->peak->yf; 2379 // overlay[Noverlay].dx = 2.0*petrosianRadius; 2380 // overlay[Noverlay].dy = 2.0*petrosianRadius*axes->minor/axes->major; 2381 // overlay[Noverlay].angle = axes->theta * PS_DEG_RAD; 2382 // overlay[Noverlay].text = NULL; 2383 // Noverlay ++; 2384 // CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 2366 2385 } 2367 2386 -
branches/sc_branches/trunkTest/pstamp/scripts/detectability_respond.pl
r28902 r29060 98 98 my $key = shift(@key_values); 99 99 my $val = shift(@key_values); 100 # if we have wisdom, then we should have updated already. If not, we'll bomb out later in the code. 101 if ($key eq 'FAULT') { 102 $val = 0; 103 } 100 104 $query{$fpa_id}{$key}[$i] = $val; 101 105 } … … 148 152 # Determine the query style for this fpa_id 149 153 if ($fpa_id =~ /o.*g.*o/) { 150 $query_style = 'byexp';151 }154 $query_style = 'byexp'; 155 } 152 156 elsif ($fpa_id =~ /\d+/) { 153 $query_style = 'byid';154 }157 $query_style = 'byid'; 158 } 155 159 else { 156 exit_with_failure(21,"Parse error in request file");157 }160 exit_with_failure(21,"Parse error in request file"); 161 } 158 162 # Confirm that we only have one stage/filter/mjd 159 163 for (my $i = 0; $i <= $#{ $query{$fpa_id}{STAGE} }; $i++) { 160 $temp_hash{STAGE}{$query{$fpa_id}{STAGE}[$i]} = 1;161 $temp_hash{FILTER}{$query{$fpa_id}{FILTER}[$i]} = 1;162 $temp_hash{'MJD-OBS'}{$query{$fpa_id}{'MJD-OBS'}[$i]} = 1;163 }164 $temp_hash{STAGE}{$query{$fpa_id}{STAGE}[$i]} = 1; 165 $temp_hash{FILTER}{$query{$fpa_id}{FILTER}[$i]} = 1; 166 $temp_hash{'MJD-OBS'}{$query{$fpa_id}{'MJD-OBS'}[$i]} = 1; 167 } 164 168 if (scalar(keys(%{ $temp_hash{STAGE} })) == 1) { 165 169 $stage = (keys(%{ $temp_hash{STAGE} }))[0]; 166 170 } 167 171 else { 168 exit_with_failure(21,"Too many STAGEs specified");169 }172 exit_with_failure(21,"Too many STAGEs specified"); 173 } 170 174 if (scalar(keys(%{ $temp_hash{FILTER} })) == 1) { 171 $filter = (keys(%{ $temp_hash{FILTER} }))[0];172 }175 $filter = (keys(%{ $temp_hash{FILTER} }))[0]; 176 } 173 177 else { 174 exit_with_failure(21,"Too many FILTERs specified");175 }178 exit_with_failure(21,"Too many FILTERs specified"); 179 } 176 180 if (scalar(keys(%{ $temp_hash{'MJD-OBS'} })) == 1) { 177 $mjd = (keys(%{ $temp_hash{'MJD-OBS'} }))[0];178 }181 $mjd = (keys(%{ $temp_hash{'MJD-OBS'} }))[0]; 182 } 179 183 else { 180 exit_with_failure(21,"Too many MJD-OBS specified");181 }184 exit_with_failure(21,"Too many MJD-OBS specified"); 185 } 182 186 # Set common request components 183 187 my $option_mask |= 1; … … 231 235 } 232 236 else { 233 $query{$fpa_id}{CATALOG}[$valid_index] = $this_image_ref->{cmf};234 }237 $query{$fpa_id}{CATALOG}[$valid_index] = $this_image_ref->{cmf}; 238 } 235 239 if (exists($this_image_ref->{class_id})) { 236 240 $query{$fpa_id}{COMPONENT_ID}[$valid_index] = $this_image_ref->{class_id}; … … 304 308 ($query{$fpa_id}{STATE}[$i],$query{$fpa_id}{STAGE}[$i],$query{$fpa_id}{STAGE_ID}[$i], 305 309 $query{$fpa_id}{COMPONENT_ID}[$i],$query{$fpa_id}{NEED_MAGIC}[$i],$query{$fpa_id}{IMAGE_DB}[$i]); 306 push @{ $processing_request{$fpa_id}{$query{$fpa_id}{IMAGE}[$i]} }, $i;310 push @{ $processing_request{$fpa_id}{$query{$fpa_id}{IMAGE}[$i]} }, $i; 307 311 } 308 312 } … … 384 388 my ($r_ra,$r_dec,$trash,$r_x,$r_y,$r_chip) = split /\s+/, $line; 385 389 print $targetfile "$r_x $r_y\n"; 386 if (( $r_ra == $query{$fpa_id}{RA1_DEG}[$processing_request{$fpa_id}{$image}[$i]])&&387 ( $r_dec == $query{$fpa_id}{DEC1_DEG}[$processing_request{$fpa_id}{$image}[$i]])) {390 if ((abs($r_ra - $query{$fpa_id}{RA1_DEG}[$processing_request{$fpa_id}{$image}[$i]]) < 1e-8)&& 391 (abs($r_dec - $query{$fpa_id}{DEC1_DEG}[$processing_request{$fpa_id}{$image}[$i]]) < 1e-8)) { 388 392 $query{$fpa_id}{X_PXL}[$processing_request{$fpa_id}{$image}[$i]] = $r_x; 389 393 $query{$fpa_id}{Y_PXL}[$processing_request{$fpa_id}{$image}[$i]] = $r_y; … … 392 396 else { 393 397 $error_code = $PS_EXIT_PROG_ERROR; 394 my_die("Unable to match input RA/DEC with output RA/DEC: ($query{$fpa_id}{RA1_DEG}[$i],$query{$fpa_id}{DEC1_DEG}[$i]) -> ($r_ra,$r_dec) i.$error_code",398 my_die("Unable to match input RA/DEC with output RA/DEC: ($query{$fpa_id}{RA1_DEG}[$i],$query{$fpa_id}{DEC1_DEG}[$i]) -> ($r_ra,$r_dec) $error_code", 395 399 $query{$fpa_id}{QUERY_ID}[$index],$fpa_id,$query{$fpa_id}{'MJD-OBS'}[$index], 396 400 $query{$fpa_id}{FILTER}[$index],$query{$fpa_id}{OBSCODE}[$index],$query{$fpa_id}{STAGE}[$index], -
branches/sc_branches/trunkTest/pstamp/scripts/pstamp_checkdependent.pl
r28929 r29060 644 644 # if the input file is already magicked no need to queue destreaking for this chipRun 645 645 if ($need_magic and !$input_magicked) { 646 if ($dsRun_state eq 'cleaned') { 646 if (!defined($dsRun_state) or ($dsRun_state eq 'NULL')) { 647 print "No magicDSRun for chipRun $stage_id and magic is required\n"; 648 faultJobs('stop', undef, undef, $PSTAMP_NOT_DESTREAKED); 649 } elsif ($dsRun_state eq 'cleaned') { 647 650 my $command = "$magicdstool -updaterun -set_state new -stage $stage -stage_id $stage_id"; 648 651 $command .= " -set_label $rlabel" if $rlabel; … … 658 661 } 659 662 } elsif ($dsRun_state eq 'failed_revert') { 660 print "magicDSRun.state = $dsRun_state for chipRun $stage_id is in state failed_revert cannot update ";663 print "magicDSRun.state = $dsRun_state for chipRun $stage_id is in state failed_revert cannot update\n"; 661 664 faultJobs('stop', undef, undef, $PSTAMP_NOT_AVAILABLE); 662 665 } else { -
branches/sc_branches/trunkTest/pswarp/src/pswarpTransformSources.c
r27279 r29060 102 102 new->errMag = source->errMag; 103 103 new->apMag = source->apMag; 104 new->pixWeight = source->pixWeight; 104 new->pixWeightNotBad = source->pixWeightNotBad; 105 new->pixWeightNotPoor = source->pixWeightNotPoor; 105 106 new->psfChisq = source->psfChisq; 106 107 new->crNsigma = source->crNsigma; -
branches/sc_branches/trunkTest/tools/czarplot.pl
r28922 r29060 38 38 ); 39 39 40 print "\n"; 40 41 print "\n*******************************************************************************\n"; 42 print "* \n"; 43 my $quit = 0; 44 if (@ARGV) { 45 $quit=1; 46 print "* UNKNKOWN: option @ARGV\n"; 47 } 41 48 if (!$histogram) { 42 49 print "* OPTIONAL: plot histogram -h (default=off)\n";} … … 50 57 print "* OPTIONAL: choose a stage -s <chip|cam|warp|etc> (default=none)\n";} 51 58 if (!$interval) { 52 print "* OPTIONAL: choose time interval in past -i <'1 hour'|'1 day'|etc> (default= interval since 7am this morning)\n";}59 print "* OPTIONAL: choose time interval in past -i <'1 hour'|'1 day'|etc> (default=none\n";} 53 60 if (!$begin) { 54 61 print "* OPTIONAL: choose a begin time -b <datetime> (default=7am this morning)\n";} … … 57 64 if (!$path) { 58 65 print "* OPTIONAL: choose an output location -o <path> (default=none)\n";} 66 print "*\n*******************************************************************************\n"; 59 67 60 print "\n"; 68 if ($quit) { exit; } 61 69 62 70 # default values … … 71 79 $czarDb->setDateFormat("%Y%m%d-%H%i%s"); 72 80 81 82 # GENE PLOTS my $czarplot = new czartool::Czarplot($czarDb, "%Y%m%d-%H%M%S", $savingToFile ? "png size 1280,960 font \"/usr/share/fonts/corefonts/arial.ttf\" 12" : "X11", $path, $save_temps); 73 83 my $czarplot = new czartool::Czarplot($czarDb, "%Y%m%d-%H%M%S", $savingToFile ? "png font \"/usr/share/fonts/corefonts/arial.ttf\" 8" : "X11", $path, $save_temps); 74 75 my @allStages = ("chip", "cam", "fake", "warp", "stack", "diff", "magic", "magicDS", "dist");76 84 77 85 # sort out times … … 79 87 if (!$begin) { 80 88 if ($interval) {$begin = $czarDb->subtractInterval($end, $interval);} 81 else {$begin = strftime('%Y-%m-%d 0 7:00',localtime);}89 else {$begin = strftime('%Y-%m-%d 06:30',localtime);} 82 90 } 83 91 -
branches/sc_branches/trunkTest/tools/czartool/CzarDb.pm
r28921 r29060 1 #!/usr/bin/perl i-w1 #!/usr/bin/perl -w 2 2 3 3 package czartool::CzarDb; … … 6 6 use strict; 7 7 8 my @stages = (" chip", "cam", "fake", "warp", "stack", "diff", "magic", "magicDS", "dist"); # TODO put elsewhere8 my @stages = ("burntool", "chip", "cam", "fake", "warp", "stack", "diff", "magic", "magicDS", "dist"); # TODO put elsewhere 9 9 10 10 use base 'czartool::MySQLDb'; … … 491 491 } 492 492 493 494 ########################################################################### 495 # 496 # Deletes all but one row per interval from all stage tables for all labels between the two dates 497 # 498 ########################################################################### 499 sub cleanupDateRange { 500 my ($self, $startDay, $endDay, $interval) = @_; 501 502 my $thisDay = $startDay; 503 my $quit = 0; 504 while(!$quit) { 505 506 if (!$self->isBefore($thisDay, $endDay)) { 507 508 $quit = 1; 509 } 510 511 print "* Running cleanup for $thisDay with an interval of $interval\n"; 512 $self->cleanupADay($thisDay, $interval); 513 $thisDay = $self->addInterval($thisDay, "1 DAY"); 514 515 } 516 } 517 ########################################################################### 518 # 519 # Deletes all but one row per interval from all stage tables for all labels between the provided day 520 # 521 ########################################################################### 522 sub cleanupADay { 523 my ($self, $startDay, $interval) = @_; 524 525 my $endDay = $self->addInterval($startDay, "1 DAY"); 526 527 my $labels = undef; 528 my $fromTime = $startDay; 529 my $toTime = undef; 530 my $totalDeleted = undef; 531 my $quit = 0; 532 while(!$quit) { 533 534 $toTime = $self->addInterval($fromTime, $interval); 535 if (!$self->isBefore($toTime, $endDay)) { 536 537 $toTime = $endDay; 538 $quit = 1; 539 } 540 541 my $stage = undef; 542 $totalDeleted = 0; 543 foreach $stage (@stages) { 544 545 if (!$self->getLabelsInThisTimePeriod($stage, $fromTime, $toTime, \$labels)) {next;} 546 547 my $label = undef; 548 my $row = undef; 549 foreach $row ( @{$labels} ) { 550 my ($label) = @{$row}; 551 552 my $query = $self->{_db}->prepare(<<SQL); 553 SELECT COUNT(*) 554 FROM $stage 555 WHERE timestamp > '$fromTime' 556 AND timestamp <= '$toTime' 557 AND label = '$label' 558 SQL 559 560 $query->execute; 561 562 my $toDelete = scalar $query->fetchrow_array() - 1; 563 if ($toDelete < 1) {next;} 564 565 $query = $self->{_db}->prepare(<<SQL); 566 DELETE FROM $stage 567 WHERE timestamp > '$fromTime' 568 AND timestamp <= '$toTime' 569 AND label = '$label' ORDER BY timestamp DESC LIMIT $toDelete 570 SQL 571 $query->execute; 572 573 $totalDeleted += $toDelete; 574 } 575 } 576 print " * Deleted $totalDeleted between $fromTime and $toTime\n"; 577 $fromTime = $toTime; 578 } 579 } 580 581 ########################################################################### 582 # 583 # Returns an array of labels present during the provided time frame 584 # 585 ########################################################################### 586 sub getLabelsInThisTimePeriod { 587 my ($self, $stage, $fromTime, $toTime, $labels) = @_; 588 589 my $query = $self->{_db}->prepare(<<SQL); 590 SELECT DISTINCT label 591 FROM $stage 592 WHERE timestamp > '$fromTime' 593 AND timestamp <= '$toTime'; 594 SQL 595 596 if (!$query->execute) { 597 598 return 0; 599 } 600 601 ${$labels} = $query->fetchall_arrayref(); 602 603 return 1; 604 } 605 493 606 ########################################################################### 494 607 # … … 500 613 501 614 my $currentRevision = -1; 502 my $latestRevision = 10; 503 504 while ($currentRevision != $latestRevision) { 615 616 while (1) { 505 617 506 618 $currentRevision = $self->getRevision(); … … 517 629 elsif ($currentRevision == 8) {$self->createRevision_9();} 518 630 elsif ($currentRevision == 9) {$self->createRevision_10();} 631 elsif ($currentRevision == 10) {$self->createRevision_11();} 632 else {last;} 519 633 } 520 634 } … … 841 955 } 842 956 957 ####################################################################################### 958 # 959 # Create revision 11 of the database 960 # 961 ####################################################################################### 962 sub createRevision_11 { 963 my ($self) = @_; 964 965 print "* Creating revision 11 of '$self->{_dbName}'\n"; 966 967 # same shape as other stage tables to enable easy update 968 my $query = $self->{_db}->prepare(<<SQL); 969 CREATE TABLE burntool ( 970 timestamp TIMESTAMP DEFAULT NOW(), 971 label VARCHAR(128) DEFAULT "NONE", 972 pending BIGINT NOT NULL, 973 processed BIGINT NOT NULL, 974 faults BIGINT NOT NULL); 975 SQL 976 977 $query->execute; 978 $query = $self->{_db}->prepare(<<SQL); 979 CREATE INDEX burntoolIndex ON burntool (timestamp, label); 980 SQL 981 982 $query->execute; 983 984 $self->setRevision(11); 985 } 986 987 988 843 989 1; 844 990 -
branches/sc_branches/trunkTest/tools/czartool/Czarplot.pm
r28923 r29060 5 5 use strict; 6 6 7 my @allStages = (" chip", "cam", "fake", "warp", "stack", "diff", "magic", "magicDS", "dist");7 my @allStages = ("burntool", "chip", "cam", "fake", "warp", "stack", "diff", "magic", "magicDS", "dist"); 8 8 9 9 … … 75 75 if ($numOfPlots == 0 ) { 76 76 77 print "Warning: No plots could be generated for '$label' during time period '$beginTime', '$endTime'\n";77 print "Warning: No plots could be generated for stage '$selectedStage' and label '$label' during time period '$beginTime', '$endTime'\n"; 78 78 return; 79 79 } … … 103 103 my ($processed, $pending, $faults); 104 104 my $stage = undef; 105 my $pendingMinusFaults = undef; 105 106 foreach $stage (@allStages) { 106 107 107 108 $self->{_czarDb}->countProcessedPendingAndFaults($label, $stage, $beginTime, $endTime, \$processed, \$pending, \$faults); 108 print GNUDAT "$stage $processed, $pending, $faults\n"; 109 110 $pendingMinusFaults = $pending - $faults; 111 print GNUDAT "$stage $faults $processed, $pendingMinusFaults\n"; 109 112 } 110 113 … … 258 261 if ($numOfPlots == 1) { 259 262 260 print GP "'" . $gnuplotFiles->{$stage} . "' using 1:4 title \"Processed\" with lines lt 2 ,";261 print GP "'" . $gnuplotFiles->{$stage} . "' using 1:2 title \"Pending\" with lines lt 4 ,";262 print GP "'" . $gnuplotFiles->{$stage} . "' using 1:3 title \"Faults\" with lines lt 7 ";263 print GP "'" . $gnuplotFiles->{$stage} . "' using 1:4 title \"Processed\" with lines lt 2 lw 2,"; 264 print GP "'" . $gnuplotFiles->{$stage} . "' using 1:2 title \"Pending\" with lines lt 4 lw 2,"; 265 print GP "'" . $gnuplotFiles->{$stage} . "' using 1:3 title \"Faults\" with lines lt 7 lw 2"; 263 266 } 264 267 # when plotting multiple stages, show only processed 265 268 else { 266 print GP "'" . $gnuplotFiles->{$stage} . "' using 1:4 title \"$stage\" with lines ";269 print GP "'" . $gnuplotFiles->{$stage} . "' using 1:4 title \"$stage\" with lines lw 2"; 267 270 } 268 271 $firstIn = 0; … … 339 342 "set boxwidth;" . 340 343 "set style data histogram;" . 341 "set style histogram cluster gap 3;" .344 "set style histogram rowstacked;" . 342 345 "set style fill solid border -1;" . 343 "set bmargin 5;" .344 346 "set ylabel \"Exposures\";" . 345 "plot '$inputFile' using 2:xtic(1) title \"Processed\" lt 2, '' using 3 title \"Pending\" lt 4, '' using 4 title \"Faults\" lt 7;" . 347 "set boxwidth 0.75;" . 348 "plot '$inputFile' using 2:xtic(1) title \"Faults\" lt 1, '' using 3 title \"Processed\" lt 2, '' using 4 title \"Pending\" lt 7;" . 346 349 "\n"; 350 351 347 352 348 353 close GP; -
branches/sc_branches/trunkTest/tools/czartool/MySQLDb.pm
r28771 r29060 64 64 return $self->{_dbHost}; 65 65 } 66 67 ########################################################################### 68 # 69 # Adds the provided interval to the provided time 70 # 71 ########################################################################### 72 sub addInterval { 73 my ($self, $time, $interval) = @_; 74 75 my $query = $self->{_db}->prepare(<<SQL); 76 SELECT '$time' + INTERVAL $interval; 77 SQL 78 $query->execute; 79 80 return scalar $query->fetchrow_array(); 81 } 66 82 67 83 ########################################################################### -
branches/sc_branches/trunkTest/tools/roboczar.pl
r28926 r29060 12 12 use czartool::Nebulous; 13 13 use czartool::Czarplot; 14 use czartool::Burntool; 14 15 15 16 my $period = 60; … … 27 28 my $pantasks = new czartool::Pantasks(); 28 29 my $czarplot = new czartool::Czarplot($czarDb, "%Y%m%d-%H%M%S", "png font \"/usr/share/fonts/corefonts/arial.ttf\" 8", "/tmp", $save_temps); # TODO hardcoded font path 30 my $burntool = new czartool::Burntool(); 31 29 32 $czarDb->setDateFormat("%Y%m%d-%H%i%s"); 30 33 31 my @stages = (" chip", "cam", "fake", "warp", "stack", "diff", "magic", "magicDS", "dist");34 my @stages = ("burntool", "chip", "cam", "fake", "warp", "stack", "diff", "magic", "magicDS", "dist"); 32 35 33 36 … … 105 108 106 109 # sort out times 107 $begin = strftime('%Y-%m-%d 0 7:00',localtime);110 $begin = strftime('%Y-%m-%d 06:30',localtime); 108 111 $end = $czarDb->getNowTimestamp(); 109 112 … … 233 236 chomp($label); 234 237 235 $new = $gpc1Db->countExposures($label, $stage, $newState); 236 $full = $gpc1Db->countExposures($label, $stage, "full"); 237 $faults = $gpc1Db->countFaults($label, $stage, $newState); 238 238 if ($stage eq "burntool") { 239 240 if ($labelServer eq "stdscience") { 241 242 $burntool->getPendingAndProcessed($label, \$new, \$full); 243 $faults = 0; 244 } 245 else { $new = $full = $faults = 0;} 246 } 247 else { 248 249 $new = $gpc1Db->countExposures($label, $stage, $newState); 250 $full = $gpc1Db->countExposures($label, $stage, "full"); 251 $faults = $gpc1Db->countFaults($label, $stage, $newState); 252 } 239 253 #printf("%s %s, %s, %d, %d\n", $labelServer, $label, $stage, $new, $faults); 240 254 $totalNew += $new;
Note:
See TracChangeset
for help on using the changeset viewer.
