package com.isti.traceview.data;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Set;
import java.util.TimeZone;
import org.apache.log4j.Logger;
import com.isti.traceview.TraceView;
import edu.iris.Fissures.Time;
import edu.sc.seis.seisFile.sac.SacTimeSeries;
import static edu.sc.seis.seisFile.sac.SacConstants.data_offset;
public class SourceFileSAC extends SourceFile implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(SourceFileSAC.class);
private static final SimpleDateFormat fissTime = new SimpleDateFormat("yyyyDDD'T'HH:mm:ss.SSS'Z'");
static {
fissTime.setTimeZone(TimeZone.getTimeZone("GMT"));
}
public SourceFileSAC(File file) {
super(file);
logger.debug("Created: " + this);
}
public FormatType getFormatType(){
return FormatType.SAC;
}
public Set<RawDataProvider> parse(DataModule dataModule) {
Set<RawDataProvider> ret = new HashSet<RawDataProvider>();
try {
SacTimeSeries sac = new SacTimeSeries();
sac.read(getFile().getCanonicalPath());
if (getFile().length() != sac.getHeader().getNpts() * 4 + data_offset) {
throw new IOException(getFile().getName() + " does not appear to be a SAC file!");
}
// sac.read(getFile());
String loc="";
if(sac.getHeader().getKinst().trim().equals("-12345")){
loc = sac.getHeader().getKhole().trim();
} else {
loc = sac.getHeader().getKhole().trim();
}
RawDataProvider channel = dataModule.getOrAddChannel(sac.getHeader().getKcmpnm(), DataModule.getOrAddStation(sac.getHeader().getKstnm()), sac.getHeader().getKnetwk(), loc);
ret.add(channel);
Segment segment = new Segment(this, 0, new Date(getSACtime(sac)), sac.getHeader().getDelta() * 1000, sac.getHeader().getNpts(), 0);
channel.addSegment(segment);
} catch (IOException e) {
logger.error("IO error: ", e);
}
return ret;
}
public void load(Segment segment){
int[] data = null;
try {
SacTimeSeries sac = new SacTimeSeries();
sac.read(getFile());
data = new int[segment.getSampleCount()];
int i = 0;
for (float val: sac.getY()) {
data[i++]=new Float(val).intValue();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
for (int value: data) {
segment.addDataPoint(value);
}
}
public String toString() {
return "SourceFileSAC: file " + (getFile() == null ? "absent" : getFile().getName()) + ";";
}
public static Time getFissuresTime(long time){
return new Time(fissTime.format(new Date(time)), 0);
}
private static long getSACtime(SacTimeSeries sac) {
GregorianCalendar cal = new GregorianCalendar(TraceView.timeZone);
cal.set(Calendar.YEAR, sac.getHeader().getNzyear());
cal.set(Calendar.DAY_OF_YEAR, sac.getHeader().getNzjday());
cal.set(Calendar.HOUR_OF_DAY, sac.getHeader().getNzhour());
cal.set(Calendar.MINUTE, sac.getHeader().getNzmin());
cal.set(Calendar.SECOND, sac.getHeader().getNzsec());
cal.set(Calendar.MILLISECOND, sac.getHeader().getNzmsec());
return cal.getTimeInMillis();
}
}