/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package applications;
import fileIO.InFile;
import fileIO.OutFile;
import java.text.DecimalFormat;
import java.util.*;
/**
*
* @author ajb
*/
public class FelixstowePort {
public static String path = "C:\\Users\\ajb\\Dropbox\\Other Data\\";
public static int getTowerIDS(String res){
InFile all=new InFile(path+"felixstowe.csv");
OutFile of=new OutFile(path+res);
String header=all.readLine();
String[] split=header.split(",");
int count=0;
for(String s:split){
if(!s.equals("")){
System.out.println(s);
of.writeString(s+",");
count++;
}
}
System.out.println(" Size ="+split.length+" count ="+count);
return count;
}
public static SingleTower[] readData(String fullPath){
InFile namesF=new InFile(path+"TowerID.csv");
String[] names=namesF.readLine().split(",");
int nosTowers=names.length;
SingleTower[] all=new SingleTower[nosTowers];
for(int i=0;i<nosTowers;i++){
all[i]=new SingleTower(names[i]);
}
InFile f= new InFile(fullPath);
int nosEntries=f.countLines()-3; //135135
SingleTower.NOS_READINGS=nosEntries;
System.out.println(" Number of towers ="+nosTowers+" Nos Readings ="+nosEntries);
f= new InFile(fullPath);
f.readLine();
f.readLine();
for(int i=0;i<nosEntries;i++){
if(i%1000==0)
System.out.println(" Reading line "+i);
int[] time=new int[6];
//Day,Month,Year,Hour,Minute,Second
for(int j=0;j<6;j++)
time[j]=f.readInt();
Date d=new Date();
d.setDate(time[0]);
d.setMonth(time[1]);
d.setYear(time[2]);
d.setHours(time[3]);
d.setMinutes(time[4]);
d.setSeconds(time[5]);
for(int j=0;j<nosTowers;j++){
SingleTower.SingleEntry s =new SingleTower.SingleEntry();
s.time=d;
//MsgType,Terminal,Windspeed,Gust,Direction,Alarm1,Alarm2
for(int k=0;k<7;k++){
s.data[k]=f.readDouble();
if(s.data[k]==-999.999)
s.missing=true;
}
all[j].readings.add(s);
}
}
return all;
}
public static void summariseStats(SingleTower[] a){
for(int i=0;i<a.length;i++)
a[i].findStats();
}
public static void saveStats(SingleTower[] a, String s){
OutFile of= new OutFile(s);
for(int i=0;i<a.length;i++)
of.writeString(a[i]+"\n");
}
public static void findRangesAndDistributions(String path,SingleTower[] all){
int fields=7;
TreeSet[] data= new TreeSet[fields];
for(int i=0;i<fields;i++)
data[i]=new TreeSet<Double>();
for(SingleTower a: all){
for(SingleTower.SingleEntry s: a.readings)
for(int i=0;i<fields;i++)
data[i].add(s.data[i]);
}
TreeMap[] dist= new TreeMap[fields];
//Initialise counts
for(int i=0;i<fields;i++){
dist[i]=new TreeMap<Double,IntWrapper>();
Object[] a=data[i].toArray();
for(int j=0;j<a.length;j++)
dist[i].put(a[j],new IntWrapper());
}
for(SingleTower a: all){
for(SingleTower.SingleEntry s: a.readings){
for(int i=0;i<fields;i++){
IntWrapper count=(IntWrapper)dist[i].get(s.data[i]);
count.c++;
}
}
}
OutFile of=new OutFile(path);
for(int i=0;i<fields;i++){
of.writeString(SingleTower.SingleEntry.fieldNames[i]+",");
for(Object d:data[i])
of.writeString((Double)d+",");
of.writeString("\n"+SingleTower.SingleEntry.fieldNames[i]+",");
for(Object d:data[i]){
IntWrapper count=(IntWrapper) dist[i].get(d);
of.writeString(count.c+",");
}
of.writeString("\n");
}
}
public static class IntWrapper{
public int c=0;
}
public static void main(String[] args){
System.out.println(" Loading Data...");
SingleTower[] all=readData(path+"felixstowe.csv");
System.out.println(" Finding Ranges...");
findRangesAndDistributions(path+"fieldRanges.csv",all);
System.out.println(" Finding Stats...");
summariseStats(all);
System.out.println(" Saving Stats...");
saveStats(all,path+"summaryStats.csv");
}
public static class SingleTower{
static DecimalFormat df=new DecimalFormat("###.###");
static int NOS_READINGS=135126;
String id;
ArrayList<SingleEntry> readings;
TowerStats stats;
public SingleTower(){
readings=new ArrayList<SingleEntry>();
}
public SingleTower(String name){
readings=new ArrayList<SingleEntry>();
id=name;
}
public void findStats(){
stats=new TowerStats();
stats.countValid();
}
public String toString(){
return id+","+stats.toString();
}
public class TowerStats{
int validReadings;
double proportionValid;
public void countValid(){
for(SingleEntry s:readings){
if(!s.missing)
validReadings++;
}
proportionValid= (double)validReadings/(double)NOS_READINGS;
}
public String toString(){
return validReadings+","+df.format(proportionValid);
}
}
public static class SingleEntry{
public Date time;
public boolean missing; //True if any field is missing
public static String[] fieldNames={"msgType","terminal","windspeed","gust","direction","alarm1","alarm2"};
public double[] data=new double[7];
}
}
}