package pl.edu.fuw.MP.Core;
import java.io.*;
import java.util.Enumeration;
import java.util.Vector;
import org.signalml.domain.book.StandardBookAtom;
//import org.signalml.domain.book.StandardBookAtomWriter;
import org.signalml.domain.book.StandardBookAtomWriter;
public class AtomV5 implements StandardBookAtom, StandardBookAtomWriter {
public int iteration=0;
public float modulus=0.0F;
public float amplitude=0.0F;
public float position=0.0F;
public float scale=0.0F;
public float frequency=0.0F;
public float phase=0.0F;
public int type=0;
public int sizeOfAtomsField=0;
public boolean conv=false;
public int baseSize;
public float samplingFreq;
public AtomV5() {}
public AtomV5(Object o) {
AtomV5 atom = (AtomV5) o;
this.iteration = atom.iteration;
this.modulus = atom.modulus;
this.amplitude = atom.amplitude;
this.position = atom.position;
this.scale = atom.scale;
this.frequency = atom.frequency;
this.phase = atom.phase;
this.type = atom.type;
this.sizeOfAtomsField = atom.sizeOfAtomsField;
this.conv = atom.conv;
this.baseSize = atom.baseSize;
this.samplingFreq = atom.samplingFreq;
}
public int Size() {
return sizeOfAtomsField;
}
public int SizeOfAtom() {
int size=0;
switch (type) {
case DIRACDELTA_IDENTITY:
size=3;
break;
case SINCOSWAVE_IDENTITY:
case GAUSSFUNCTION_IDENTITY:
size=4;
break;
case GABORWAVE_IDENTITY:
size=6;
break;
}
return 4*size; // 2 is added only in SegmentHeaderV5.java:240
}
public void Read(RandomAccessFile stream) throws IOException {
type=(int)stream.readByte();
int sizeOfAtom=(int)(stream.readByte())&0xff;
sizeOfAtomsField=2+sizeOfAtom;
switch (type) {
case DIRACDELTA_IDENTITY:
modulus=stream.readFloat();
amplitude=stream.readFloat();
position=stream.readFloat();
break;
case GAUSSFUNCTION_IDENTITY:
modulus=stream.readFloat();
amplitude=stream.readFloat();
position=stream.readFloat();
scale=stream.readFloat();
break;
case SINCOSWAVE_IDENTITY:
modulus=stream.readFloat();
amplitude=stream.readFloat();
frequency=stream.readFloat();
phase=stream.readFloat();
break;
case GABORWAVE_IDENTITY:
modulus=stream.readFloat();
amplitude=stream.readFloat();
position=stream.readFloat();
scale=stream.readFloat();
frequency=stream.readFloat();
phase=stream.readFloat();
break;
}
}
public float getAmplitude() {
return this.amplitude;
}
public int getNaturalFrequency() {
return (int)(this.frequency * getBaseLength() / 2.0);
}
public float getFrequency() {
return this.frequency;
}
public float getModulus() {
return this.modulus;
}
public float getPhase() {
return this.phase;
}
public int getPosition() {
return (int)this.position;
}
public Object getProperty(String name) throws IllegalArgumentException {
throw new IllegalArgumentException("No properties");
}
public Enumeration<String> getPropertyNames() {
Vector<String> names = new Vector<String>();
return names.elements();
}
public int getScale() {
return (int)this.scale;
}
public int getType() {
return this.type;
}
public void setAmplitude(float amplitude) {
this.amplitude=amplitude;
}
public void setFrequency(float freq) {
this.frequency=freq;
}
public void setModulus(float modulus) {
this.modulus=modulus;
}
public void setPhase(float phase) {
this.phase=phase;
}
public void setPosition(float position) {
this.position=position;
}
public void setScale(float scale) {
this.scale=scale;
}
public void setType(int type) {
this.type=type;
}
public void set(StandardBookAtom atom) {
if (atom!=null) {
setAmplitude(atom.getAmplitude());
setFrequency(atom.getFrequency());
setModulus(atom.getModulus());
setPhase(atom.getPhase());
setPosition(atom.getPosition());
setScale(atom.getScale());
setType(atom.getType());
}
}
public void Write(DataOutputStream stream) throws IOException {
stream.writeByte(type);
stream.writeByte((byte)SizeOfAtom());
switch (type) {
case DIRACDELTA_IDENTITY:
stream.writeFloat(modulus);
stream.writeFloat(amplitude);
stream.writeFloat(position);
break;
case GAUSSFUNCTION_IDENTITY:
stream.writeFloat(modulus);
stream.writeFloat(amplitude);
stream.writeFloat(position);
stream.writeFloat(scale);
break;
case SINCOSWAVE_IDENTITY:
stream.writeFloat(modulus);
stream.writeFloat(amplitude);
stream.writeFloat(frequency);
stream.writeFloat(phase);
break;
case GABORWAVE_IDENTITY:
stream.writeFloat(modulus);
stream.writeFloat(amplitude);
stream.writeFloat(position);
stream.writeFloat(scale);
stream.writeFloat(frequency);
stream.writeFloat(phase);
break;
}
}
@Override
public int getBaseLength() {
return baseSize;
}
@Override
public float getHzFrequency() {
return 0.5f * frequency * getSamplingFrequency();
}
@Override
public int getIteration() {
return iteration;
}
@Override
public float getSamplingFrequency() {
return samplingFreq;
}
@Override
public float getTimePosition() {
return position/getSamplingFrequency();
}
@Override
public float getTimeScale() {
return scale/getSamplingFrequency();
}
}