scripts/channelClasses/standard/GratPreclean.java
/////////////////////////////////////////////////////////////////
// Gratton filtering, with custom precleaning
//
// This code is compiled at runtime, but compilation can be tested by:
// javac -cp build scripts/channelClasses/standard/GratPreclean.java
// rm scripts/channelClasses/standard/GratPreclean.class
/////////////////////////////////////////////////////////////////
package standard;
import java.io.*;
import java.util.*;
import generalClasses.*;
import recordingClasses.Recording;
import seriesClasses.*;
import channelClasses.ChannelScript;
import static channelClasses.Channel.*;
/////////////////////////////////////////////////////////////////
/** Gratton filtering, with custom precleaning
*/
public class GratPreclean extends ChannelScript
{
/** Recording instance to be operated on */
Recording rec = null;
/** Cutoff in Hz, applied only to EEG,EMG,EOG */
float highpassCutoff;
/** Log of warnings generated during update */
ArrayList<String> warnings = null;
////////////////////////////////////////////////////////////////////
/** Initialize instance by setting its parameters to specified values.
* @param highpassCutoff Highpass cutoff applied to EEG,EMG and EOG
*/
public GratPreclean(Recording rec, float highpassCutoff) {
this.rec = rec;
this.highpassCutoff = highpassCutoff;
warnings = new ArrayList<String>();
} // GratPreclean
////////////////////////////////////////////////////////////////////
/** Initialize instance by setting its parameters to default values.
*/
public GratPreclean(Recording rec) {
this(rec, 2.0f);
} // GratPreclean
////////////////////////////////////////////////////////////////////
/** Update recording data by performing channel-oriented operations.
* <p>Available modes in are EEG, EOG, REF, EMG, EDA, RES, ECG, EVE.
*/
public void update() {
// Process EEG,EMG,EOG
ArrayList<SeriesAnalog> subset = selectMode(rec, DataMode.EEG);
subset = listsUnion(subset,selectMode(rec, DataMode.EMG));
subset = listsUnion(subset,selectMode(rec, DataMode.EOG));
subset = discardSite("O[12z]",subset);
filterHP(highpassCutoff, subset); // NB: this does not remove DC
subtractTemporalMean(subset);
ArrayList<SeriesAnalog> result = subset;
// Process EDA,EVE: do nothing to them
subset = selectMode(rec, DataMode.EDA);
subset = listsUnion(subset,selectMode(rec, DataMode.EVE));
result = listsUnion(result, subset);
// Process RES,ECG,REF: subtract temporal mean
subset = selectMode(rec, DataMode.ECG);
subset = listsUnion(subset,selectMode(rec, DataMode.RES));
subset = listsUnion(subset,selectMode(rec, DataMode.REF));
subtractTemporalMean(subset);
result = listsUnion(result, subset);
// Update Recording object
replaceAllSeries(rec, result);
// Perform Gratton correction
float epochDur = 0.0f; // Let Gratton choose epochs
doGratton(rec, epochDur);
} // update
////////////////////////////////////////////////////////////////////
/** Dump summary of this class or object
* @return String representation of this object
*/
public String toString() {
String s = "<<<"+this.getClass().toString()+">>>\n";
s += "Highpass (Hz) = "+ highpassCutoff+"\n";
for(String w: warnings)
s += w+"\n";
return s;
} // toString
}