Changeset 40


Ignore:
Timestamp:
Jun 10, 2014 10:41:57 AM (10 years ago)
Author:
JohnLightfoot
Message:

first working version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/doublefourier.py

    r31 r40  
    3939        print 'DoubleFourier.run'
    4040
     41        # convert lengths to m. Wavenumbers leave as cm-1.
    4142        fts = self.previous_results['fts']
    4243        fts_wn = fts['fts_wn']
    43         opd_max = fts['opd_max']
     44        fts_wn_truncated = fts['fts_wn_truncated']
     45        opd_max = fts['opd_max'] / 100.0
    4446        fts_nsample = fts['ftsnsample']
    45         vdrive = fts['vdrive']
     47        vdrive = fts['vdrive'] / 100.0
    4648        delta_opd = fts['delta_opd']
     49        delta_time = delta_opd / vdrive
    4750
    4851        times = np.arange(int(fts_nsample), dtype=np.float)
    49         times *= (opd_max / vdrive) / float(fts_nsample-1)
     52        times *= delta_time
     53        opd_start = -((fts_nsample + 1) / 2) * delta_opd
    5054
    5155        beamsgenerator = self.previous_results['beamsgenerator']
     
    5761        skymodel = skygenerator['sky model']
    5862        spatial_axis = self.result['spatial axis'] = skygenerator['spatial axis']
    59         self.result['frequency axis'] = fts_wn
     63        self.result['frequency axis'] = fts_wn_truncated
    6064
    6165        # assuming nx is even then transform has 0 freq at origin and [nx/2] is
     
    7074        self.result['baseline interferograms'] = collections.OrderedDict()
    7175#        for baseline in bxby:
    72         for baseline in bxby[:3]:
    73             print baseline
     76        for baseline in bxby[:1]:
     77            print 'baseline', baseline
    7478            measurement = np.zeros(np.shape(times))
     79            opd = np.zeros(np.shape(times))
    7580
    7681            # FTS path diff and possibly baseline itself vary with time
     
    7883
    7984                # calculate the sky that the system is observing at this
    80                 # moment, incorporating various errors in turn
    81                 sky_now = skymodel
     85                # moment, incorporating various errors in turn. Be explicit
     86                # about the copy otherwise a reference is made instead.
     87                sky_now = skymodel.copy()
    8288
    8389                # 1. baseline should be perp to centre of field.
     
    108114                # calculate fourier phase shift to move point at [0,0] to
    109115                # [rowpos, colpos]
    110                 print 'shift', colpos, rowpos
    111116                shiftx = np.zeros([nx], np.complex)
    112117                shiftx[:nx/2] = np.arange(nx/2, dtype=np.complex)
     
    127132                jobs = {}
    128133                # go through freq planes and shift them
    129                 for iwn,wn in enumerate(fts_wn):
     134                for iwn,wn in enumerate(fts_wn_truncated):
    130135                    # submit jobs
    131136                    indata = (sky_now[:,:,iwn], shift,)
     
    133138                      indata, (), ('numpy',))
    134139               
    135                 for iwn,wn in enumerate(fts_wn):
     140                for iwn,wn in enumerate(fts_wn_truncated):
    136141                    # collect and store results
    137142                    temp = jobs[wn]()
     
    139144
    140145                if t == times[0]:
    141                     self.result['sky at time 0'] = sky_now
     146                    # take copy of array to fix a snapshot of it now
     147                    self.result['sky at time 0'] = sky_now.copy()
    142148
    143149                # 2. telescopes should be centred on centre of field
     
    163169
    164170                if t == times[0]:
    165                     self.result['sky*beams at time 0'] = sky_now
     171                    # take copy of array to fix a snapshot of it now
     172                    self.result['sky*beams at time 0'] = sky_now.copy()
    166173                   
    167174                # 3. baseline error revisited
     
    180187                fft_now = np.zeros(np.shape(sky_now), np.complex)
    181188                spectrum = np.zeros(np.shape(fts_wn), np.complex)
    182                 for iwn,wn in enumerate(fts_wn):
     189                for iwn,wn in enumerate(fts_wn_truncated):
    183190
    184191                    # derive shift needed to place baseline at one of FFT coords
     
    196203                    colpos = 0.0
    197204                    rowpos = 0.0
    198                     print 'spatial colpos, rowpos', colpos, rowpos
    199205
    200206                    # calculate fourier phase shift to move point at [rowpos,colpos] to
     
    226232
    227233                    # set amp/phase at this frequency
    228                     spectrum[iwn] = temp[0,0]
     234                    spectrum[wn==fts_wn] = temp[0,0]
    229235
    230236                if t == times[0]:
    231                     self.result['skyfft at time 0'] = fft_now
     237                    self.result['skyfft at time 0'] = fft_now.copy()
    232238
    233239                    axis = co.Axis(data=fts_wn, title='wavenumber',
     
    242248
    243249                if t == times[0]:
    244                     # test version
     250                    # test interferogram
    245251                    # inverse fft of emission spectrum at this point
    246                     temp = np.fft.ifft(spectrum)
    247                     pos = np.fft.rfftfreq(len(spectrum))
     252                    reflected_spectrum = np.zeros([2*(len(spectrum)-1)],
     253                      np.complex)
     254                    reflected_spectrum[:len(spectrum)].real = spectrum
     255                    reflected_spectrum[len(spectrum):].real = spectrum[-2:0:-1]
     256                   
     257                    temp = np.fft.ifft(reflected_spectrum)
     258                    pos = np.fft.fftfreq(len(reflected_spectrum), d=fts_wn[1]-fts_wn[0])
    248259
    249260                    # move 0 frequency to centre of array
     
    253264                    axis = co.Axis(data=pos, title='path difference',
    254265                      units='cm')
    255                     temp = co.Spectrum(data=temp,
     266                    temp = co.Spectrum(data=temp, axis=axis,
    256267                      title='Detected interferogram', units='')
    257268
     
    259270
    260271                mirror_error = 0.0
    261                 opd = 2.0 * (vdrive * t + mirror_error)
    262                 print 'opd', opd, vdrive, t, mirror_error
    263                 opd_ipos = opd / delta_opd
    264 
    265                 # make spectrum symmetric
     272                opd[tindex] = opd_start + (vdrive * t + mirror_error)
     273                opd_ipos = opd[tindex] / delta_opd
     274
     275                # calculate shift needed to move point at opd to 0
    266276                nfreq = len(fts_wn)
    267                 symmetric_spectrum = np.zeros([2*nfreq])
    268                 symmetric_spectrum[:nfreq] = spectrum
    269                 symmetric_spectrum[nfreq:] = spectrum[::-1]
    270                
    271                 # calculate shift needed to move point at opd to 0
    272                 shift = np.zeros([2*nfreq], dtype=np.complex)
     277                ndoublefreq = 2 * (nfreq - 1)
     278                shift = np.zeros([ndoublefreq], dtype=np.complex)
    273279                shift[:nfreq] = np.arange(nfreq, dtype=np.complex)
    274                 shift[nfreq:] = np.arange(-nfreq, 0, dtype=np.complex)
    275                 shift = np.exp((-2.0j * np.pi * opd_ipos * shift) / float(nfreq))
     280                shift[nfreq:] = np.arange(nfreq, dtype=np.complex)[-2:0:-1]
     281                shift = np.exp((-2.0j * np.pi * opd_ipos * shift) / \
     282                  float(ndoublefreq))
     283
     284                # reflect spectrum about 0 to give unaliased version
     285                reflected_spectrum = np.zeros([2*(len(spectrum)-1)], np.complex)
     286                reflected_spectrum[:len(spectrum)].real = spectrum
     287                reflected_spectrum[len(spectrum):].real = spectrum[-2:0:-1]
    276288
    277289                # apply phase shift and fft
    278                 symmetric_spectrum *= shift
    279                 spectrum_fft = np.fft.fft(symmetric_spectrum)
     290                reflected_spectrum *= shift
     291                spectrum_fft = np.fft.ifft(reflected_spectrum)
    280292                measurement[tindex] = spectrum_fft[0]
    281293
     294#                if np.array_equal(baseline, bxby[0]):
     295#                    if 'skyfft check' not in self.result.keys():
     296#                        self.result['skyfft check'] = {}
     297#                    temp = co.Spectrum(data=spectrum_fft,
     298#                      title='Test interferogram', units='')
     299#                    self.result['skyfft check'][t] = temp
     300
     301            axis = co.Axis(data=np.array(opd), title='path difference',
     302              units='cm')
     303            temp = co.Spectrum(data=measurement, axis=axis,
     304              title='Detected interferogram', units='')
    282305            self.result['baseline interferograms'][tuple(baseline)] = \
    283               measurement
     306              temp
    284307
    285308        return self.result
Note: See TracChangeset for help on using the changeset viewer.