package com.activequant.servicelayer.matlab;
import java.text.ParseException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.activequant.domainmodel.TimeStamp;
import com.activequant.domainmodel.exceptions.InvalidDate8Time6Input;
import com.activequant.utils.Date8Time6Parser;
public class Converters {
private double offset = 719529.0;
public TimeSeriesContainer convertDataMap(List<TimeStamp> timeStamps,
Map<String, Map<String, Map<TimeStamp, Double>>> dataMap, String[] marketInstrumentIds, String[] fieldNames,
Map<Parameter, Object> paramMap) throws InvalidDate8Time6Input, ParseException {
timeStamps = new TimeStampProcessor().processTimeStampList(timeStamps, paramMap);
//
Collections.sort(timeStamps);
Date8Time6Parser parser = new Date8Time6Parser();
TimeSeriesContainer ret = new TimeSeriesContainer();
// convert the timestamps to matlab timestamps
double[] matlabTS = new double[timeStamps.size()];
for (int i = 0; i < timeStamps.size(); i++) {
double milliseconds = timeStamps.get(i).getNanoseconds() / 1000000.0;
matlabTS[i] = milliseconds / 1000.0 / 86400.0 + offset;
}
// assemble the return matrix.
ret.timeStamps(matlabTS);
ret.values(new double[marketInstrumentIds.length][timeStamps.size()][fieldNames.length]);
for (int i = 0; i < marketInstrumentIds.length; i++) {
String instrument = marketInstrumentIds[i];
// get the instrument specific map.
Map<String, Map<TimeStamp, Double>> instrumentMap = dataMap.get(instrument);
for (int j = 0; j < fieldNames.length; j++) {
String field = fieldNames[j];
// get the field specific map
Map<TimeStamp, Double> fieldMap = instrumentMap.get(field);
for (int k = 0; k < timeStamps.size(); k++) {
TimeStamp date8time6 = timeStamps.get(k);
if (fieldMap.containsKey(date8time6))
ret.values()[i][k][j] = fieldMap.get(date8time6);
else
ret.values()[i][k][j] = Double.NaN;
}
}
}
ret.values(new ReturnMapProcessor().processTimeStampList(ret.values(), paramMap));
return ret;
}
}