Education/ExperimentMenu/1stLevelBasic/BreakdownStudies/13MiOd/data_object.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys, getopt, os
from numpy import *
from matplotlib.pyplot import *
from copy import deepcopy
from scipy.stats.mstats import mquantiles

set_printoptions(precision=4,linewidth=500)

class Data:
    """ Class containing all data, names, values"""

    def __init__(self,X,Y, ShotNo, names, norm):
	"""construct a new Dir class with the specified directory"""
	self.X = double(X)
	self.Y = Y
	self.shots = ShotNo
	self.names = array(names)
	self.norm = array(norm)
	self.N = len(self.X)
	self.Ndim = shape(X)[1]
	self.remove_wrong()

    def __getitem__(self, vars):
	return self.X[:,self.ind(vars)].ravel()

    def remove_dim(self,ind):
	if  type(ind[0]) == str:
	    ind = in1d(self.names, [ind])
	if all(~ind):
	    return
	self.X = self.X[:,~ind]
	self.names = self.names[~ind]
	if len(self.norm) == self.Ndim :
	    self.norm = self.norm[~ind]
	self.Ndim = shape(self.X)[1]

    def ind(self,vars):
	ind =  where(in1d(self.names, array(vars)))[0]
	if len(ind) == 1:
	    return int(ind)
	else:
	    return ind

    def remove_data(self,ind):
	ind = ravel(ind)
	if len(ind) == 0:
	    return

	if dtype(ind[0]) == int:
	    ind = in1d(self.shots, ind)

	if sum(ind) < 2:
	    return

	self.X = self.X[~ind,:]
	self.Y = self.Y[~ind]
	self.shots = self.shots[~ind]
	self.N = len(self.X)


    def add_data(self,X,Y):
	self.X = vstack([self.X, X])
	self.Y = concatenate([self.Y, Y])
	self.shots = concatenate([self.shots, nan*ones(shape(Y))])
	self.N = len(self.X)

    def normalize(self, norm):
	""" renormalize data in all dimensions to be similar """
	self.norm = norm
	self.X -= self.norm[0,:]
	self.X /= self.norm[1,:]

	#for i in range(self.Ndim):
	    #self.X[self.X[:,i] > 0,i] /= self.norm[1,i]
	    #self.X[self.X[:,i] < 0,i] /= self.norm[2,i]

    def denormalize(self):
	""" renormalize data in all dimensions to be similar """
	self.X *= self.norm[1,:]
	self.X += self.norm[0,:]
	self.norm[0,:] = 0
	self.norm[[1,2],:] = 1


    def get_norm(self):
	norm = zeros((3,self.Ndim))
	for i in arange(self.Ndim):
	    d = self.X[:,i]
	    if median(d) != 0:
		m = median(d)
	    else:
		m = mean(d)
	    var = d-m;
	    sig1 =   mean( abs(var[var >= 0]))
	    sig2 =   mean( abs(var[var < 0]))
	    norm[:,i] = [m,sig1, sig2]
	return norm
	#self.norm = norm;

    def remove_wrong(self):
	"""  remove wrong shots (semi manual way ...) """
	wrong = list()
	wrong.append(array([ 3111, 3112, 3971, 1151, 1108, 2135, 2134, 2133 , 2699, 3046, 2544 , 3706, 4169, 4146, 3943, 3940, 3930,3905, 3768, 3767, 4201, 4300, 2138,2919, 4366, 4360, 1162, 3165  ] )) #something wrong
	wrong.append(arange(4374, 4398))  #missing diagnistics
	wrong.append(arange(4443, 4447)) #stabilozace
	wrong.append(concatenate([arange(3040, 3068), arange(1227, 1272), arange(1152, 1159)]))  #reverse field
	wrong.append(concatenate([arange(3800, 4020), arange(4476,4481)]))
	wrong = concatenate(wrong)
	self.remove_data(wrong)

    def __str__(self):
	print "========DATA OBJECT START======"
	print 'N', self.N, 'Ndim', self.Ndim
	print "size X", shape(self.X)
	print "size Y", shape(self.Y)
	print "size shots", shape(self.shots)
	print "size norm", shape(self.norm)
	print  "names", self.names
	print "mean", mean(self.X,0)
	print " max", amax(abs(self.X),0)
	return "========DATA OBJECT END======"