package com.awsmithson.tcx2nikeplus.test;
import org.apache.commons.math3.analysis.interpolation.SplineInterpolator;
import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@Deprecated
public class SnapShotPace {
public SnapShotPace() {
}
// Prints out the pace at <duration> seconds into the run.
public void printPace(File nikePlusFile, int period, double[] kms) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// Create and load input document
DocumentBuilder db = dbf.newDocumentBuilder();
Document inDoc = db.parse(nikePlusFile);
inDoc.getDocumentElement().normalize();
// Read in the extendedData element
String extendedData = getSimpleNodeValue(inDoc, "extendedData");
//System.out.println(extendedData);
String[] splits = extendedData.split(", ");
//System.out.println(splits.length);
//System.out.println(splits[100]);
double[] millis = new double[splits.length];
double[] distance = new double[splits.length];
for (int i = 0; i < splits.length; ++i) {
millis[i] = i*10*1000;
distance[i] = Double.parseDouble(splits[i]);
}
SplineInterpolator interpolator = new SplineInterpolator();
PolynomialSplineFunction distanceToMillis = interpolator.interpolate(distance, millis);
PolynomialSplineFunction millisToDistance = interpolator.interpolate(millis, distance);
for (int i = 1; i < 180; i = i + 1) {
if ((getPace(distanceToMillis, millisToDistance, kms[0], i*1000) > 283200) && (getPace(distanceToMillis, millisToDistance, kms[0], i*1000) < 284000))
System.out.printf("%d\t%f\n", i, getPace(distanceToMillis, millisToDistance, kms[0], i*1000));
}
for (double km : kms) {
System.out.printf("%f\t%f\n", km, getPace(distanceToMillis, millisToDistance, km, period*1000));
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private double getPace(PolynomialSplineFunction distanceToMillis, PolynomialSplineFunction millisToDistance, double endKm, double periodMillis) {
/*
double periodDistance = 0.08; // distance in km
double startKm = endKm - periodDistance;
double endMillis = distanceToMillis.interpolate(endKm);
double startMillis = distanceToMillis.interpolate(startKm);
*/
//double periodMillis = 60 * 1000; // duration in milliseconds
double endMillis = distanceToMillis.value(endKm);
double startMillis = endMillis - periodMillis;
double startKm = millisToDistance.value(startMillis);
double periodDistance = endKm - startKm;
double totalMillis = endMillis - startMillis;
//double startKm = millisToDistance.interpolate(endKm)
//System.out.printf("\nstartMillis: %f\tendMillis: %f\tstartKm: %f\tendKm: %f\ttime: %f\tdistance%f\n", startMillis, endMillis, startKm, endKm, totalMillis, periodDistance);
return totalMillis / periodDistance;
}
private String getSimpleNodeValue(Document doc, String nodeName) {
return getSimpleNodeValue(doc.getElementsByTagName(nodeName).item(0));
}
private String getSimpleNodeValue(Node node) {
return node.getChildNodes().item(0).getNodeValue();
}
public static void main(String[] args) {
File inFile = new File(args[0]);
int period = Integer.parseInt(args[1]);
double[] kms = new double[args.length - 2];
for (int i = 2; i < args.length; ++i) {
kms[i-2] = Double.parseDouble(args[i]);
}
SnapShotPace c = new SnapShotPace();
c.printPace(inFile, period, kms);
}
}