读取Fits数据及画图显示JAVA版

初学JAVA,没想到读取Fits,尤其是在MATLAB中一条命令搞定的显示数据,显得比较麻烦。这里用了两个包,分别完成读取及显示的功能。
读取Fits的头文件以及获取Table的数据: Java Library for access to FITS files
对于读取出来的波长和流量进行绘图: Plot Package,jahuwaldt.plot 
在他们类的基础上,参考他们给出的Demo,我稍微封装了一点,以方便以后的调用。

对jfits的封装,因为我主要读取文件只是获取其波长和流量的值,所以自己在那个基础上做了一个类

package org.eso.fits;

import java.io.IOException;
import java.util.ListIterator;

import org.eso.fits.FitsException;
import org.eso.fits.FitsFile;
import org.eso.fits.FitsHDUnit;
import org.eso.fits.FitsHeader;
import org.eso.fits.FitsKeyword;
import org.eso.fits.FitsMatrix;

public class LamostFits {
	public LamostFits() {
		// TODO Auto-generated constructor stub
	}

	public FitsFile GetFitsFile(String filePathString) {
		FitsFile file = null;

		try {
			System.out.println("new fits file");
			file = new FitsFile(filePathString);
		} catch (FitsException e) {
			System.out.println("Error: is not a FITS file >" + filePathString
					+ "<");
		} catch (IOException e) {
			System.out.println("Error: cannot open file >" + filePathString
					+ "<");
		}
		return file;

	}

	public int GetDataLength(FitsFile file) {
		FitsHDUnit hdu = file.getHDUnit(0);
		FitsMatrix dataMatrix = (FitsMatrix) hdu.getData();
		int[] dimSize = dataMatrix.getNaxis();
		return dimSize[0];
	}

	public int GetFlux(FitsFile file, float[] flux) {

		FitsHDUnit hdu = file.getHDUnit(0);
		FitsMatrix dataMatrix = (FitsMatrix) hdu.getData();
		int len = dataMatrix.getNaxis()[0];
		try {
			dataMatrix.getFloatValues(0, len, flux);
		} catch (FitsException e) {
			e.printStackTrace();
			return -1;
		}
		return len;
	}

	public void GetLambda(FitsFile file, float[] lambda) {
		FitsHDUnit hdu = file.getHDUnit(0);
		FitsHeader hdr = hdu.getHeader();
		ListIterator itr = hdr.getKeywords();

		double lambda_start = 0;
		double lambda_deta = 0;

		while (itr.hasNext()) {
			FitsKeyword kw = (FitsKeyword) itr.next();
			if (kw.getName().equals("CRVAL1")) {
				/*
				 * CRVAL1(R)= 3.5682 / Central wavelength (log10) of first pixel
				 * CD1_1(R)= 1.0E-4 / Log10 dispersion per pixel
				 */
				lambda_start = kw.getReal();
			} else if (kw.getName().equals("CD1_1")) {
				lambda_deta = kw.getReal();
			}
		}
		for (int i = 0; i < lambda.length; i++) {
			lambda[i] = (float) Math.pow(10, lambda_start + lambda_deta * i);
		}
	}

}

而对于数据的显示这块,同样,我想要有matlab那样,直接给出x,y的值,显示其曲线即可,重新定义了一个可以传递x,y参数的函数进行绘图。

package jahuwaldt.plot;

import java.awt.*;
import javax.swing.*;

public class PlotXY extends JFrame {

public static void PlotFits(float[] lambda, float[] flux, String title) {

		double[] xArr = new double[lambda.length];
		double[] yArr = new double[lambda.length];

		for (int i = 0; i < lambda.length; i++) {
			xArr[i] = (double) (lambda[i]);
			yArr[i] = (double) flux[i];

		}

		Plot2D aPlot = new SimplePlotXY(xArr, yArr, title, "Wavelength",
				"Flux", null, null, null);

		PlotPanel panel = new PlotPanel(aPlot);
		panel.setBackground(Color.white);

		PlotXY window = new PlotXY("SimplePlotXY Plot Window", panel);
		window.setSize(1000, 600);
		window.setLocation(100, 100);
		window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		window.show();

	}

}

具体的调用过程:

package org.eso.fits;

import jahuwaldt.plot.PlotXY;
import java.io.FileNotFoundException;

public class SpectraFits{

	public static void main(String[] argv) throws FileNotFoundException, FitsException {
		
    	LamostFits lamFits = new LamostFits();
    	String fitsname = "xxx";
    	String filenameString = "fitFiles/" + fitsname + ".fits";
    	FitsFile file = lamFits.GetFitsFile(filenameString);
    	int len = lamFits.GetDataLength(file);
    	float[] lambda = new float[len];
    	lamFits.GetLambda(file, lambda);
    	float[] flux = new float[len];
    	lamFits.GetFlux(file, flux);
    	
    	PlotXY.PlotFits(lambda, flux, fitsname);    
    }
}

显示结果:

 5 total views,  1 views today

页面下部广告