Changeset 13420


Ignore:
Timestamp:
04/23/12 19:18:56 (13 years ago)
Author:
neise
Message:
new class Signal Generator CSV
File:
1 edited

Legend:

Unmodified
Added
Removed
  • fact/tools/pyscripts/pyfact/generator.py

    r13328 r13420  
    9898
    9999
     100class SignalGeneratorCSV(object):
     101   
     102    def __init__(self, file_name, option_str = 'len 100 noise 3', name = 'SignalGenerator'):
     103        time, maxprob, mean, median = np.loadtxt( file_name, delimiter=',', unpack=True)
     104        csv_data = maxprob
     105       
     106        # csv data was downshifted, I shift it up here
     107        self.csv_data = csv_data - csv_data.min()
     108       
     109
     110        self.__module__ = 'CSV generator'
     111        self.option_str = option_str.lower()
     112        self.options = make_options_from_str(option_str)
     113        self.parse_options()
     114        self.name = name
     115       
     116    def parse_options(self):
     117        o = self.options #shortcut
     118        if 'len' in o:
     119            self.npoints = int(o['len'][0])
     120        else:
     121            self.npoints = 100
     122        if 'noise' in o:
     123            self.sigma = float(o['noise'][0])
     124        else:
     125            self.sigma = 1
     126        if 'bsl' in o:
     127            self.bsl = float(o['bsl'][0])
     128        else:
     129            self.bsl = -0.5
     130       
     131        if 'step' in o:
     132            self.step_height = float(o['step'][0])
     133            self.step_start = int(o['step'][1])
     134            self.step_stop = int(o['step'][2])
     135
     136        if 'triangle' in o:
     137            self.pulses = []
     138            # append 1st pulse to list of pulses
     139            self.pulses.append( ( float(o['triangle'][0]) , float(o['triangle'][1]), int(o['triangle'][2]), int(o['triangle'][3]) ) )
     140            number_of_pulses_after_1st = (len(o['triangle'])-4)/2
     141            for i in range(number_of_pulses_after_1st):
     142                self.pulses.append( ( float(o['triangle'][2*i+4]) , float(o['triangle'][2*i+5]), int(o['triangle'][2]), int(o['triangle'][3]) ) )
     143
     144        if 'spike' in o:
     145            self.spikes = []
     146            for i in range(len(o['spike'])/2):
     147                self.spikes.append( ( int(o['spike'][2*i]), float(o['spike'][2*i+1]) ) )
     148       
     149        if 'csv' in o:
     150            self.csvs = []
     151            for i in range(len(o['csv'])/2):
     152                time = int( o['csv'][2*i] )
     153                amplitude = float( o['csv'][2*i+1] )
     154                self.csvs.append( (time, amplitude) )
     155
     156    def __call__(self, option_str = ''):
     157        if option_str:
     158            self.option_str = option_str.lower()
     159            self.options = make_options_from_str(self.option_str)
     160            self.parse_options()
     161
     162        signal = np.zeros(self.npoints)
     163        signal += self.bsl
     164       
     165        if 'step' in self.options:
     166            signal[self.step_start:self.step_stop] += self.step_height
     167        if 'triangle' in self.options:
     168            for pulse in self.pulses:
     169                pos = pulse[0]
     170                height = pulse[1]
     171                rise = pulse[2]
     172                fall = pulse[3]
     173                start = pos - rise
     174                stop = pos + fall
     175                signal[start:pos] += np.linspace(0., height, rise)
     176                signal[pos:stop] += np.linspace(height, 0. , fall)
     177        if 'spike' in self.options:
     178            for spike in self.spikes:
     179                signal[spike[0]] += spike[1]
     180        if 'csv' in self.options:
     181            for csv in self.csvs:
     182                amplitude = csv[1]
     183                time = csv[0]
     184                csv_data = self.csv_data.copy()
     185                #scale
     186                csv_data *= amplitude
     187                # add shifted
     188                print 'bumm', len(csv_data)
     189                print csv_data.shape
     190                print signal[time:time+len(csv_data)].shape
     191                signal[time:time+len(csv_data)] += csv_data
     192               
     193        # add noise
     194        signal += + np.random.normal(0.0,self.sigma, signal.shape)
     195        return signal
     196
     197    def __str__(self):
     198        s = self.name + '\n'
     199        s += 'possible options and parameters\n'
     200        s += ' * len:      number of samples (100)\n'
     201        s += ' * noise:    sigma (1)\n'
     202        s += ' * bsl:      level (-0.5)\n'
     203        s += ' * step:     height, start, end\n'
     204        s += ' * triangle: pos height risingedge, fallingedge [pos height ...]\n'
     205        s += ' * spike:    pos height [pos height ...]\n'
     206        s += ' * csv:      pos height [pos height ...]\n'
     207       
     208        s += 'current options are:\n'
     209        for key in self.options.keys():
     210            s += key + ':' + str(self.options[key]) + '\n'
     211        return s
     212
     213
    100214# Helper function to parse signalname and create a dictionary
    101215# dictionary layout :
     
    115229    return options
    116230   
    117 def _plotter(signal, text):
    118     x=range(len(signal))
    119     ax = plt.plot(x, signal, 'b.', label='signal')
    120     plt.title('test of SignalGenerator with option string:\n' + text)
    121     plt.xlabel('sample')
    122     plt.legend()
    123     plt.grid(True)
    124     plt.show()
    125    
    126231if __name__ == '__main__':
    127     import matplotlib.pyplot as plt
    128     """ test the class """
    129     myGenerator = SignalGenerator('len 400 noise 0.3 bsl -2.5 triangle 50 10.2 10 100 65 10 150 20 180 10 250 10 spike 100 50. 20 50 21 49')
     232    from plotters import Plotter
     233    myGenerator = SignalGenerator('len 400 noise 0.3 bsl -2.5 triangle 50 10.2 10 100 65 10 150 20 spike 100 50. 20 50 21 49')
    130234    sig = myGenerator()
    131235    print myGenerator
    132     _plotter(sig, myGenerator.option_str)   
     236   
     237    p = Plotter('generator test')
     238    p(sig)
     239   
     240    anothergen = SignalGeneratorCSV('PulseTemplate_PointSet_0.csv',
     241                'len 1000 noise 0.4 bsl -2.0 csv 300 1 60 2 650 1 spike 110 50')
     242    sig2 = anothergen()
     243    print anothergen
     244   
     245    pp = Plotter('CSV Gen Test')
     246    pp(sig2)
     247   
     248    raw_input('any key to quit')
Note: See TracChangeset for help on using the changeset viewer.