Raw File
band.py
import numpy     as np
import src.units as un

class Band:
    def __init__(self, log, bandFile, freqArr=None):
        self.log   = log
        self.ftype = bandFile.split('.')[-1]

        #Parse band file
        if 'csv' in self.ftype:
            try:    freqs, self.eff, self.err = np.loadtxt(bandFile, unpack=True, dtype=np.float, delimiter=',')
            except: freqs, self.eff,          = np.loadtxt(bandFile, unpack=True, dtype=np.float, delimiter=','); self.err = None
            if not np.all(freqs) > 1.e6: self.freqs = freqs*un.GHzToHz #Convert to Hz if band file is in GHz
            if freqArr is not None:
                mask = np.array([1. if f >= self.freqs[0] and f <= self.freqs[-1] else 0. for f in freqArr])
                self.eff   = np.interp(freqArr, self.freqs, self.eff)*mask
                if self.err is not None: self.err   = np.interp(freqArr, self.freqs, self.err)*mask
                self.freqs = freqArr
        elif 'txt' in self.ftype:
            try:    freqs, self.eff, self.err = np.loadtxt(bandFile, unpack=True, dtype=np.float)
            except: freqs, self.eff,          = np.loadtxt(bandFile, unpack=True, dtype=np.float); self.err = None
            if not np.all(freqs) > 1.e6: self.freqs = freqs*un.GHzToHz #Convert to Hz if band file is in GHz
            if freqArr is not None:
                mask = np.array([1. if f >= self.freqs[0] and f <= self.freqs[-1] else 0. for f in freqArr])
                self.eff   = np.interp(freqArr, self.freqs, self.eff)*mask
                if self.err is not None: self.err   = np.interp(freqArr, self.freqs, self.err)*mask
                self.freqs = freqArr
        else:
            self.log.log('Unable to parse band file %s.' % (bandFile), 0)
            self.freqs = None;  self.eff = None; self.err = None

        #Not allowed to have a standard deviation of zero or negative
        if self.err is not None:
            self.err[(self.err <= 0.)] = 1.e-6

    #***** Public Methods *****
    #Sample the band
    def sample(self, nsample=1):
        if self.eff is None: return [None]
        if self.err is None:
            return np.array([self.eff for n in range(nsample)])
        else:
            if nsample == 1: return np.array([np.random.normal(self.eff, self.err)])
            else:            return np.random.normal(self.eff, self.err, (nsample, len(self.eff)))
back to top