/*
* Copyright (c) 2012 European Synchrotron Radiation Facility,
* Diamond Light Source Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package fable.python;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import java.util.Vector;
import org.dawb.fabio.FabioFile;
import org.dawb.fabio.FabioFileException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import fable.framework.internal.IVarKeys;
/**
*
* @author G. Suchet fable.peaksearch 9 janv. 08 This class represents the
* output of peaksearcher.
*/
public class PeakSearchSpt {
private int npks = 0;
/** This is the name of spt file */
private String parentName = "";
private Vector<Peak> peaks; // keys (Number_of_pixels, Average_counts,f, s,
// fc, sc , sig_f sig_s cov_fs)
private float treshold = 0;
float[] tabPeak = null; // an array containing (x,y) values for image viewer
private List<IPropertyChangeListener> listeners = new ArrayList<IPropertyChangeListener>();
private String scannedPeak = ""; // file info block to be parsed when needed
private String[] peakKeys;//
private FabioFile imageFile = null;
private String fabioFileName = "";
private PeakSearchSpt parent = this;
protected boolean parsed = false;
/**
* f
*
* @description constructor
* @param Filename
*/
public PeakSearchSpt(String parentFileName) {
peaks = new Vector<Peak>(npks);
parentName = parentFileName;
}
public void setNbPeaks(int pks) {
npks = pks;
}
public void setTreshold(float t) {
treshold = t;
}
public int getNbPeaks() {
return npks;
}
public FabioFile getImageFile() {
return imageFile;
}
public void initFabioFile(String fullFileName) throws FabioFileException {
imageFile = new FabioFile(fullFileName);
}
/**
*
* 14 janv. 08
*
* @author G. Suchet
* @return treshold ; value stored in output peaksearch header
*/
public float getTreshold() {
return treshold;
}
public void addPeak(Peak p) {
peaks.add(p);
addPropertyChangeListener(p);
}
public Vector<Peak> getSortedpeaks() {
if (peaks != null && peaks.size() > 0) {
Collections.sort(peaks);
}
return peaks;
}
public void setComparator(String Key, int dir) {
fireChangeSorter(Key);
firechangeSortdirection(dir);
}
public Peak getPeak(int i) {
return peaks.elementAt(i);
}
public int getSize() {
return peaks.size();
}
public String getParentFileName() {
return parentName;
}
/**
*
* @return filenames
*/
public String getFabioFileName() {
return fabioFileName;
}
public Vector<Peak> getChildren() {
return peaks;
}
/**
*
* @return an array containing a pair of [i=s, i+1=f], for 2d peaks for
* visible peaks (bshow=true).<br>
* Peaks should be already parsed.
*/
public Vector<Float> getTabChildren() {
Vector<Float> peaksToDisplay = new Vector<Float>(peaks.size());
if (peaks != null) {
int j = -1;
int k = 0;
for (int i = 0; i < peaks.size(); i++) {
if (getPeak(i).isVisible()) {
j = k + 1;
peaksToDisplay.add(k, Float.valueOf(getPeak(i).getS()));
peaksToDisplay.add(j, Float.valueOf(getPeak(i).getF()));
k += 2;
}
peaksToDisplay.setSize(j + 1);
}
}
return peaksToDisplay;
}
/**
* add this method for treeviewer content provider
*/
public String toString() {
return parentName;
}
/**
* listKeys is:
* "Number_of_pixels Average_counts f s fc sc sig_f sig_s cov_fs"
* As it comes from sptParser
*/
public void setKeys(String listKeys) {
peakKeys = listKeys.split("\\s+");
}
/**
* listKeys is:
* "Number_of_pixels Average_counts f s fc sc sig_f sig_s cov_fs"
* As it comes from sptParser
*/
public void setKeys(String[] listKeys) {
peakKeys = listKeys;
}
public void setPeaks(String blockWithAllPeaks) {
scannedPeak = blockWithAllPeaks;
}
/**
*
* @param peak
* this is one line coming from the parser 4194304 1040.879432
* 1025.619308 1024.586495 1025.797993 1025.442168 588.552309
* 588.380541 -0.000225
*/
public void concatPeaks(String peak) {
scannedPeak = scannedPeak.concat(peak);
scannedPeak = scannedPeak + System.getProperty("line.separator");
// scannedPeak=scannedPeak.concat("\\n");
}
public void parse() {
// npks=peaks.size();
Job parseJob = new Job("Getting " + npks + " peaks in file "
+ parentName) {
@Override
protected IStatus run(IProgressMonitor monitor) {
if (!parsed) {
parsed = true;
Scanner scanner = new Scanner(scannedPeak);
scanner.useDelimiter("[\n\r]+");//
// System.out.println(scannedPeak);
monitor.beginTask("Wait while loading peaks", npks);
int percentage = 0;
int j = 0;
while (scanner.hasNext()) {
String line = scanner.nextLine();
if (!line.trim().equals("")) {
line = peaks.size() + " " + line;
Peak p = new Peak(peakKeys, line);
p.setParent(parent);
// The first time, all peaks can be displayed in the
// imageViewer
p.show(true);
peaks.add(p);
percentage = (peaks.size() * 100) / npks;
monitor.subTask(percentage + "% done");
// addPropertyChangeListener(p);
if (j % 250 == 0 && j > 0) {
fireSomePeaksLoaded();
} else if (j == npks - 1) {
fireSomePeaksLoaded();
}
j++;
monitor.worked(1);
if (monitor.isCanceled()) {
scanner.close();
return Status.CANCEL_STATUS;
}
}
}
scanner.close();
// monitor.done();
}
monitor.done();
return Status.OK_STATUS;
}
};
parseJob.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
fireParseCompleted();
}
});
parseJob.setUser(true);
parseJob.schedule();
}
public boolean isParsed() {
return parsed;
}
public void setParsed(boolean parsed) {
this.parsed = parsed;
}
/**
* Update table in sptview because parser is launched in a job
*/
private void fireSomePeaksLoaded() {
for (Iterator<IPropertyChangeListener> it = listeners.iterator(); it
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) it
.next();
if (element != null) {
element.propertyChange(new PropertyChangeEvent(this,
IVarKeys.ParseInProgress, null, null));
}
}
}
/**
* Update table in sptview because parser is launched in a job
*/
private void fireParseCompleted() {
for (Iterator<IPropertyChangeListener> it = listeners.iterator(); it
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) it
.next();
if (element != null) {
element.propertyChange(new PropertyChangeEvent(this,
IVarKeys.ParseCompleted, null, null));
}
}
}
/************************************************************************
*
* Register or remove listeners
*
**************************************************************************/
public void addPropertyChangeListener(IPropertyChangeListener listener) {
listeners.add(listener);
}
public void removePropertyChangeListener(IPropertyChangeListener listener) {
listeners.remove(listener);
}
public void fireChangeSorter(String comp) {
for (Iterator<IPropertyChangeListener> it = listeners.iterator(); it
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) it
.next();
if (element != null) {
element.propertyChange(new PropertyChangeEvent(this,
"comparator", null, comp));
}
}
}
public void firechangeSortdirection(int comp) {
for (Iterator<IPropertyChangeListener> it = listeners.iterator(); it
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) it
.next();
if (element != null) {
element.propertyChange(new PropertyChangeEvent(this, "dir",
null, comp));
}
}
}
public void setParentFileName(String sptFile) {
parentName = sptFile;
}
public void setFabioFileName(String filename) {
fabioFileName = filename;
}
public void setFabioFile(FabioFile object) {
imageFile = object;
}
}