/*
VisAD system for interactive analysis and visualization of numerical
data. Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/
package visad.data.amanda;
import java.rmi.RemoteException;
import visad.Data;
import visad.FieldImpl;
import visad.MathType;
import visad.RealType;
import visad.ScalarMap;
import visad.TupleType;
import visad.VisADException;
public class Event
{
public static final RealType indexType =
RealType.getRealType("Event_Index");
public static TupleType tupleType;
public static Data missing = Hits.missing;
static {
try {
tupleType = new TupleType(new MathType[] {
Tracks.functionType, Hits.functionType
});
} catch (VisADException ve) {
ve.printStackTrace();
tupleType = null;
}
}
private int number, run, year, day;
private double time, timeShift;
private Hits hits;
private Tracks tracks;
Event(int number, int run, int year, int day, double time, double timeShift)
{
this.number = number;
this.run = run;
this.year = year;
this.day = day;
this.time = time;
this.timeShift = timeShift;
this.hits = new Hits();
this.tracks = new Tracks();
}
final void add(Hit hit) { hits.add(hit); }
final void add(FitTrack track) { tracks.add(track); }
final void add(MCTrack track) { tracks.add(track); }
final void dump(java.io.PrintStream out)
{
out.println(this);
hits.dump(out);
tracks.dump(out);
}
public final int getDay() { return day; }
public final Hit getHit(int idx) { return hits.get(idx); }
public final int getNumber() { return number; }
public final int getNumberOfHits() { return hits.size(); }
public final int getNumberOfTracks() { return tracks.size(); }
public final int getRun() { return run; }
public final double getTime() { return time; }
public final double getTimeShift() { return timeShift; }
public final BaseTrack getTrack(int idx) { return tracks.get(idx); }
public final int getYear() { return year; }
public final float[][] makeHistogram(ScalarMap xMap, ScalarMap yMap,
ScalarMap cMap, ScalarMap dpyColorMap)
{
float[] timeSteps = hits.getTimeSteps();
// create bins
int[] bin = new int[timeSteps.length - 1];
for (int i = 0; i < bin.length; i++) {
bin[i] = 0;
}
// fill bins with count of hits in that bin
final int hitsLen = hits.size();
for (int i = 0; i < hitsLen; i++) {
final float time = hits.get(i).getLeadingEdgeTime();
// look for the proper bin, and increment its count
boolean found = false;
for (int j = 0; !found && j < bin.length; j++) {
if (time < timeSteps[j]) {
bin[j]++;
found = true;
}
}
// if it wasn't found, toss it in the last bin
if (!found) {
bin[bin.length - 1]++;
}
}
// calculate maximum bin value
float binMax = bin[0];
for (int i = 1; i < bin.length; i++) {
final int val = bin[i];
if (val > binMax) {
binMax = val;
}
}
// build list of point data
float[] x = new float[bin.length * 4];
float[] y = new float[bin.length * 4];
int idx = 0;
for (int i = 0; i < bin.length; i++) {
x[idx] = timeSteps[i];
y[idx] = 0;
idx++;
x[idx] = timeSteps[i];
y[idx] = bin[i];
idx++;
x[idx] = timeSteps[i + 1];
y[idx] = bin[i];
idx++;
x[idx] = timeSteps[i + 1];
y[idx] = 0;
idx++;
}
// set the scalarmap ranges
try {
xMap.setRange(0.0, (double )binMax);
yMap.setRange((double )timeSteps[0],
(double )timeSteps[timeSteps.length - 1]);
cMap.setRange((double )timeSteps[0],
(double )timeSteps[timeSteps.length - 1]);
dpyColorMap.setRange((double )timeSteps[0],
(double )timeSteps[timeSteps.length - 1]);
} catch (RemoteException re) {
System.err.println("Couldn't set histogram ScalarMap ranges");
re.printStackTrace();
} catch (VisADException ve) {
System.err.println("Couldn't set histogram ScalarMap ranges");
ve.printStackTrace();
}
// return the new data
return new float[][] { x, y };
}
public final FieldImpl makeHitSequence()
{
return hits.makeTimeSequence();
}
public final FieldImpl makeTrackSequence(int idx)
{
return tracks.get(idx).makeTimeSequence(hits.getTimeSteps());
}
public String toString()
{
return "Event#" + number + "[Y" + year + "D" + day +
" H" + hits + " T" + tracks + "]";
}
}