## ----setup, include=FALSE------------------------------------------------
knitr::opts_chunk$set(echo = TRUE)

## ------------------------------------------------------------------------
library(knitr)
library(ProFit)
library(FITSio)

## ------------------------------------------------------------------------
data('ExampleInit', package="ProFit")
kable(head(ExampleInit, 10))

## ------------------------------------------------------------------------
datasource='SDSS'

## ------------------------------------------------------------------------
ExampleFiles=list.files(system.file("extdata",datasource,package="ProFit"))
ExampleIDs=unlist(strsplit(ExampleFiles[grep('fitim',ExampleFiles)],'fitim.fits'))
ExampleIDs

## ------------------------------------------------------------------------
useID=ExampleIDs[1]
psf = readFITS(system.file("extdata", paste(datasource,'/',useID,'psfim.fits',sep=''),package="ProFit"))$imDat
psf=psf/sum(psf)
psfsigma=sqrt(abs(psf))/200 #To get reasonable PSF errors

## ---- fig.width=5, fig.height=5, eval=F----------------------------------
#  temp=magimage(psf,lo=0,hi=1)
#  contour(temp, add=T, col='red', drawlabels = FALSE)

## ---- fig.width=5, fig.height=5, eval=F----------------------------------
#  magplot(psf[13,],type='l')
#  lines(psf[12,],lty=2,col='red')
#  lines(psf[14,],lty=2,col='blue')
#  lines(psf[11,],lty=3,col='red')
#  lines(psf[15,],lty=3,col='blue')

## ------------------------------------------------------------------------
modellist=list(
  moffat=list(
    xcen=dim(psf)[1]/2,
    ycen=dim(psf)[2]/2,
    mag=0,
    fwhm=2.5,
    con=3,
    ang=0,
    axrat=0.9,
    box=0
  )
)
modellist

## ------------------------------------------------------------------------
psfmodel=profitMakeModel(modellist,dim=c(25,25))$z

## ---- fig.width=5, fig.height=5, eval=F----------------------------------
#  magimage(psfmodel)
#  magimage(abs(psfmodel-psf)/psfmodel,zlim=c(0,1))

## ------------------------------------------------------------------------
tofit=list(
  moffat=list(
    xcen=TRUE,
    ycen=TRUE,
    mag=TRUE,
    fwhm=TRUE,
    con=TRUE,
    ang=TRUE,
    axrat=TRUE,
    box=TRUE
  )
)

## ------------------------------------------------------------------------
tolog=list(
  moffat=list(
    xcen=FALSE,
    ycen=FALSE,
    mag=FALSE,
    fwhm=FALSE,
    con=TRUE,
    ang=FALSE,
    axrat=TRUE,
    box=FALSE
  )
)

## ------------------------------------------------------------------------
intervals=list(
  moffat=list(
    xcen=list(lim=c(0,25)),
    ycen=list(lim=c(0,25)),
    mag=list(lim=c(-1,1)),
    fwhm=list(lim=c(0.1,10)),
    con=list(lim=c(1,20)),
    ang=list(lim=c(-180,360)),
    axrat=list(lim=c(0.1,1)),
    box=list(lim=c(-1,1))
  )
)

## ------------------------------------------------------------------------
Data=profitSetupData(image=psf, mask=(psf==0), sigma=psfsigma, modellist=modellist, tofit=tofit, tolog=tolog, intervals=intervals, magzero=0, algo.func='optim', verbose=TRUE, like.func = 'norm')

## ----  fig.width=7, fig.height=5, eval=F---------------------------------
#  profitLikeModel(parm=Data$init, Data=Data, makeplots=TRUE, plotchisq=TRUE)

## ---- eval=FALSE, fig.width=5, fig.height=5------------------------------
#  optimfit=optim(Data$init, profitLikeModel, method='BFGS', Data=Data, control=list(fnscale=-1))

## ---- eval=FALSE, fig.width=5, fig.height=5------------------------------
#  profitLikeModel(optimfit$par, Data,makeplots=TRUE, plotchisq=TRUE)

## ---- eval=FALSE---------------------------------------------------------
#  Data$algo.func = "LD"
#  
#  LDfit=LaplacesDemon(profitLikeModel, Initial.Values=optimfit$par, Data=Data,
#    Iterations=1e4, Algorithm='CHARM', Thinning=1, Specs=list(alpha.star=0.44))

## ---- eval=FALSE---------------------------------------------------------
#  profitLikeModel(LDfit$Summary2[,1], Data,makeplots=TRUE, plotchisq=TRUE)

## ---- eval=FALSE, fig.width=5, fig.height=5------------------------------
#  PSFmodellist=profitRemakeModelList(optimfit$par, modellist, tofit=tofit, tolog=tolog)
#  PSFmodellist$moffat$xcen=12.5
#  PSFmodellist$moffat$xcen=12.5
#  PSFmodellist$moffat$mag=0
#  psfmodel=profitMakeModel(PSFmodellist, dim=c(25,25))$z
#  contour(magimage(psfmodel), add=TRUE, col='red', drawlabels = FALSE)

## ------------------------------------------------------------------------
useID=ExampleIDs[1]
image = readFITS(system.file("extdata", paste(datasource,'/',useID,'fitim.fits',sep=''), package="ProFit"))$imDat
mask = readFITS(system.file("extdata", paste(datasource,'/',useID,'mskim.fits',sep=''), package="ProFit"))$imDat
sigma = readFITS(system.file("extdata", paste(datasource,'/',useID,'sigma.fits',sep=''), package="ProFit"))$imDat
segim = readFITS(system.file("extdata", paste(datasource,'/',useID,'segim.fits',sep=''), package="ProFit"))$imDat

## ------------------------------------------------------------------------
useIDnum=as.integer(strsplit(useID,'G')[[1]][2])
useloc=which(ExampleInit$CATAID==useIDnum)

## ------------------------------------------------------------------------
modellist=list(
  sersic=list(
    xcen= c(dim(image)[1]/2, dim(image)[1]/2),
    ycen= c(dim(image)[2]/2, dim(image)[2]/2),
    mag= c(ExampleInit$sersic.mag1[useloc], ExampleInit$sersic.mag2[useloc]),
    re= c(ExampleInit$sersic.re1[useloc], ExampleInit$sersic.re2[useloc])*
      if(datasource=='KiDS'){1}else{0.2/0.339},
    nser= c(ExampleInit$sersic.nser1[useloc], 1),  #Disk is initially nser=1
    ang= c(ExampleInit$sersic.ang2[useloc], ExampleInit$sersic.ang2[useloc]),
    axrat= c(1, ExampleInit$sersic.axrat2[useloc]),  #Bulge is initially axrat=1
    box=c(0, 0)
  )
)
modellist

## ---- fig.width=5, fig.height=5------------------------------------------
magimage(profitMakeModel(modellist,dim=dim(image)))

## ---- fig.width=5, fig.height=5------------------------------------------
magimage(image)

## ---- fig.width=5, fig.height=5------------------------------------------
magimage(profitMakeModel(modellist,dim=dim(image),psf=psfmodel))

## ------------------------------------------------------------------------
tofit=list(
  sersic=list(
    xcen= c(TRUE,NA), #We fit for xcen and tie the two togther
    ycen= c(TRUE,NA), #We fit for ycen and tie the two togther
    mag= c(TRUE,TRUE), #Fit for both
    re= c(TRUE,TRUE), #Fit for both
    nser= c(TRUE,FALSE), #Fit for bulge
    ang= c(FALSE,TRUE), #Fit for disk
    axrat= c(FALSE,TRUE), #Fit for disk
    box= c(FALSE,FALSE) #Fit for neither
  )
)

## ------------------------------------------------------------------------
tolog=list(
  sersic=list(
    xcen= c(FALSE,FALSE),
    ycen= c(FALSE,FALSE),
    mag= c(FALSE,FALSE),
    re= c(TRUE,TRUE), #re is best fit in log space
    nser= c(TRUE,TRUE), #nser is best fit in log space
    ang= c(FALSE,FALSE),
    axrat= c(TRUE,TRUE), #axrat is best fit in log space
    box= c(FALSE,FALSE)
  )
)

## ------------------------------------------------------------------------
intervals=list(
  sersic=list(
    xcen=list(lim=c(0,300),lim=c(0,300)),
    ycen=list(lim=c(0,300),lim=c(0,300)),
    mag=list(lim=c(10,30),lim=c(10,30)),
    re=list(lim=c(1,100),lim=c(1,100)),
    nser=list(lim=c(0.5,20),lim=c(0.5,20)),
    ang=list(lim=c(-180,360),lim=c(-180,360)),
    axrat=list(lim=c(0.1,1),lim=c(0.1,1)),
    box=list(lim=c(-1,1),lim=c(-1,1))
  )
)

## ------------------------------------------------------------------------
Data=profitSetupData(image=image, sigma=sigma, segim=segim, mask=mask, psf=psfmodel,
                     modellist=modellist, tofit=tofit, tolog=tolog, intervals=intervals,
                     magzero=0, algo.func='optim', like.func = "t", verbose=TRUE)

## ---- eval=FALSE---------------------------------------------------------
#  optimfitMod=optim(Data$init, profitLikeModel, method='BFGS', Data=Data,
#                    control=list(fnscale=-1))

## ---- eval=FALSE---------------------------------------------------------
#  optimfitMod$par

## ---- eval=FALSE---------------------------------------------------------
#  profitLikeModel(optimfitMod$par,Data,makeplots=TRUE,whichcomponents=list(sersic=1))
#  profitLikeModel(optimfitMod$par,Data,makeplots=TRUE,whichcomponents=list(sersic=2))
#  profitLikeModel(optimfitMod$par,Data,makeplots=TRUE,whichcomponents=list(sersic='all'))

## ---- eval=FALSE---------------------------------------------------------
#  modeloptim=profitRemakeModelList(optimfitMod$par,Data$modellist,Data$tofit,Data$tolog)
#  profitEllipsePlot(Data,modeloptim,pixscale=0.339,FWHM=1,SBlim=26)

## ------------------------------------------------------------------------
Data=profitSetupData(image=image, sigma=sigma, segim=segim, mask=mask, psf=psf,
  modellist=modellist, tofit=tofit, tolog=tolog, intervals=intervals, magzero=0,
  algo.func='optim', like.func = "t", verbose=TRUE)

## ---- eval=FALSE---------------------------------------------------------
#  optimfitEmp=optim(Data$init, profitLikeModel, method='BFGS', Data=Data,
#                    control=list(fnscale=-1))

## ---- eval=FALSE---------------------------------------------------------
#  optimfitEmp$par

## ---- eval=FALSE, fig.width=5, fig.height=5------------------------------
#  profitLikeModel(optimfitEmp$par,Data,makeplots=TRUE,whichcomponents=list(sersic=1))
#  profitLikeModel(optimfitEmp$par,Data,makeplots=TRUE,whichcomponents=list(sersic=2))
#  profitLikeModel(optimfitEmp$par,Data,makeplots=TRUE,whichcomponents=list(sersic='all'))

## ---- eval=FALSE, fig.width=5, fig.height=5------------------------------
#  modeloptim=profitRemakeModelList(optimfitEmp$par,Data$modellist,Data$tofit,Data$tolog)
#  profitEllipsePlot(Data,modeloptim,pixscale=0.339,FWHM=1,SBlim=26)

