/**
*
*/
package fr.unistra.pelican.algorithms.io;
import java.io.File;
import java.io.IOException;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.AlgorithmException;
import fr.unistra.pelican.DoubleImage;
import fr.unistra.pelican.algorithms.visualisation.MViewer;
import fr.unistra.pelican.gui.MultiViews.MultiView;
import fr.unistra.pelican.util.jFits.Fits;
import fr.unistra.pelican.util.jFits.FitsException;
import fr.unistra.pelican.util.jFits.FitsFile;
import fr.unistra.pelican.util.jFits.FitsHDUnit;
import fr.unistra.pelican.util.jFits.FitsHeader;
import fr.unistra.pelican.util.jFits.FitsMatrix;
/**
*
* Read a fits file with possible extensions, each image extension correspond to a band in the final image.
* Image extensions must have 2 dims all equals.
*
* Result is always in double precision
*
* @author Benjamin Perret
*
*/
public class LoadFitsWithExtensions extends Algorithm {
public static final String HEADER_KEYWORD= "FITS_HEADER_";
/**
* Path to fits file
*/
public String filename;
/**
* Result
*/
public DoubleImage outputImage;
private boolean debug=false;
public LoadFitsWithExtensions(){
super.inputs="filename";
super.outputs="outputImage";
}
/* (non-Javadoc)
* @see fr.unistra.pelican.Algorithm#launch()
*/
@Override
public void launch() throws AlgorithmException {
File f= new File(filename);
try {
FitsFile ff = new FitsFile(f);
int nbHdu=0;
if(debug)
{
System.out.println("Fits Reader: " + ff.getNoHDUnits() +" data units found");
}
for(int i=0;i<ff.getNoHDUnits();i++)
{
if(ff.getHDUnit(i).getType() == Fits.IMAGE)
nbHdu++;
else{
System.out.println("Fits Reader: Skipping HDU " +i + " unmanaged data type: " + ff.getHDUnit(i).getType());
}
}
int dimx=0;
int dimy=0;
int b=0;
for(int i=0;i<ff.getNoHDUnits();i++)
if(ff.getHDUnit(i).getType() == Fits.IMAGE)
{
FitsHDUnit hdu =ff.getHDUnit(i);
FitsHeader header=hdu.getHeader();
FitsMatrix matrix=(FitsMatrix)hdu.getData();
if(outputImage==null)
{
int [] naxis =matrix.getNaxis();
if(naxis.length != 2)
{
boolean flag=true; // some fits image have more axis but with only one element per axis so we can just ignore them
for(int bi=2;flag && bi<naxis.length;bi++)
if(naxis[bi]!=1)
flag=false;
if(!flag)
throw new AlgorithmException("Fits reading exception, image in data unit " + i +" must have two dimensions! " +filename);
}
dimx=naxis[0];
dimy=naxis[1];
outputImage=new DoubleImage(dimx,dimy,1,1,nbHdu);
} else {
int [] naxis =matrix.getNaxis();
if(naxis.length != 2)
{
System.out.println("Fits HDU " +i + " ignored : incorrect number of dimensions");
continue;
//throw new AlgorithmException("Fits reading exception, image in data unit " + i +" must have two dimensions! " +filename);
}
if(dimx!=naxis[0] || dimy!=naxis[1])
{
System.out.println("Fits HDU " +i + " ignored : incorrect dimension sizes");
continue;
}
//throw new AlgorithmException("Fits reading excpetion, all image extensions must have same dimensions! " +filename);
}
double [] tmp = new double[dimx];
outputImage.properties.put(HEADER_KEYWORD + b, header);
for(int y=0;y<dimy;y++)
{
tmp = matrix.getDoubleValues(y*dimx, dimx, tmp);
for(int x=0;x<dimx;x++)
{
outputImage.setPixelXYBDouble(x, dimy-y-1, b, tmp[x]);
}
}
b++;
}
ff.closeFile();
} catch (IOException e) {
throw new AlgorithmException("IO exception: ",e);
} catch (FitsException e) {
throw new AlgorithmException("Fits File exception: ",e);
}
}
public static DoubleImage exec(String filename) throws AlgorithmException
{
return (DoubleImage)(new LoadFitsWithExtensions()).process(filename);
}
/*
public static void main(String [] args)
{
DoubleImage im= LoadFitsWithExtensions.exec("D:\\perret\\Articles\\2009 - SCIA\\fig\\pgc2182-3b-ori.fits");
DoubleImage im0 = (DoubleImage)im.getImage2D(0, 0, 0);
DoubleImage im1 = (DoubleImage)im.getImage2D(0, 0, 1);
DoubleImage im2 = (DoubleImage)im.getImage2D(0, 0, 2);
DoubleImage imr= LoadFitsWithExtensions.exec("D:\\perret\\Articles\\2009 - SCIA\\fig\\pgc2182-3b-residual.fits");
DoubleImage imr0 = (DoubleImage)imr.getImage2D(0, 0, 0);
DoubleImage imr1 = (DoubleImage)imr.getImage2D(0, 0, 1);
DoubleImage imr2 = (DoubleImage)imr.getImage2D(0, 0, 2);
DoubleImage ims= LoadFitsWithExtensions.exec("D:\\perret\\Articles\\2009 - SCIA\\fig\\pgc2182-3b-simu.fits");
DoubleImage ims0 = (DoubleImage)ims.getImage2D(0, 0, 0);
DoubleImage ims1 = (DoubleImage)ims.getImage2D(0, 0, 1);
DoubleImage ims2 = (DoubleImage)ims.getImage2D(0, 0, 2);
MultiView mv = MViewer.exec(im0);
mv.add(im1);
mv.add(im2);
mv.add(imr0);
mv.add(imr1);
mv.add(imr2);
mv.add(ims0);
mv.add(ims1);
mv.add(ims2);
double vo = im.volume();
double vr = imr.volume();
double p=im.size();
System.out.println("vo " + (vo/p) + " vr " + (vr/p));
}*/
}