├── .gitignore ├── LICENSE ├── README.md ├── build └── lib │ └── pydoppler │ ├── __init__.py │ ├── fortran_code │ ├── cclock.f │ ├── clock.f │ ├── dop.f │ ├── dop.in │ ├── emap.par │ ├── emap_ori.par │ ├── fort.10 │ ├── hclock.f │ ├── iclock.f │ ├── lobe.f │ └── makefile │ ├── mynormalize.py │ ├── pydoppler.py │ └── test_data │ ├── output_images │ ├── Average_Spec.png │ ├── Doppler_Map.png │ ├── Reconstruction.png │ └── Trail.png │ ├── sample_script.py │ └── ugem99 │ ├── txhugem4004 │ ├── txhugem4005 │ ├── txhugem4006 │ ├── txhugem4007 │ ├── txhugem4008 │ ├── txhugem4009 │ ├── txhugem4010 │ ├── txhugem4011 │ ├── txhugem4012 │ ├── txhugem4013 │ ├── txhugem4014 │ ├── txhugem4015 │ ├── txhugem4016 │ ├── txhugem4017 │ ├── txhugem4018 │ ├── txhugem4019 │ ├── txhugem4020 │ ├── txhugem4021 │ ├── txhugem4022 │ ├── txhugem4023 │ ├── txhugem4024 │ ├── txhugem4025 │ ├── txhugem4026 │ ├── txhugem4027 │ ├── txhugem4028 │ ├── txhugem4029 │ ├── txhugem4030 │ ├── txhugem4031 │ └── ugem0all.fas ├── dist ├── pydoppler-0.2.0-py3-none-any.whl └── pydoppler-0.2.0.tar.gz ├── pydoppler.egg-info ├── PKG-INFO ├── SOURCES.txt ├── dependency_links.txt └── top_level.txt ├── pydoppler ├── __init__.py ├── fortran_code │ ├── cclock.f │ ├── clock.f │ ├── dop.f │ ├── dop.in │ ├── emap.par │ ├── emap_ori.par │ ├── fort.10 │ ├── hclock.f │ ├── iclock.f │ ├── lobe.f │ └── makefile ├── mynormalize.py ├── pydoppler.py └── test_data │ ├── output_images │ ├── Average_Spec.png │ ├── Doppler_Map.png │ ├── Reconstruction.png │ └── Trail.png │ ├── sample_script.py │ └── ugem99 │ ├── txhugem4004 │ ├── txhugem4005 │ ├── txhugem4006 │ ├── txhugem4007 │ ├── txhugem4008 │ ├── txhugem4009 │ ├── txhugem4010 │ ├── txhugem4011 │ ├── txhugem4012 │ ├── txhugem4013 │ ├── txhugem4014 │ ├── txhugem4015 │ ├── txhugem4016 │ ├── txhugem4017 │ ├── txhugem4018 │ ├── txhugem4019 │ ├── txhugem4020 │ ├── txhugem4021 │ ├── txhugem4022 │ ├── txhugem4023 │ ├── txhugem4024 │ ├── txhugem4025 │ ├── txhugem4026 │ ├── txhugem4027 │ ├── txhugem4028 │ ├── txhugem4029 │ ├── txhugem4030 │ ├── txhugem4031 │ └── ugem0all.fas ├── setup.cfg └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.whl 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 The Python Packaging Authority 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyDoppler 2 | 3 | This is the repository for a python wrapper for Henk Spruit's doppler tomography software. 4 | This code can produce a trail spectra of a dataset, and perform 5 | Doppler tomography maps. It is intended to be a light-weight code for 6 | single emission line datasets. 7 | The code will be able to: 8 | - [x] Load and normalise spectra 9 | - [x] Plot a trail spectra at initial phase resolution and binned 10 | - [x] Run Doppler tomography and plot reconstructed spectra 11 | - [ ] Perform initial spectra binning into user-defined phase bins 12 | - [ ] User-friendly functions 13 | - [ ] Auto-save figures. 14 | 15 | The original code and IDL interface can be found at: 16 | * https://wwwmpa.mpa-garching.mpg.de/~henk/ 17 | 18 | At the moment, there are many features that haven't been implemented. However, the code will be updated 19 | continuously. If you have any queries/comments/bug reports please send an e-mail to: 20 | * jvhs1 (at) st-andrews.ac.uk 21 | 22 | ## Acknowledgment 23 | 24 | If you make use of this software, please acknowledge the original code and this repository with the following citations: 25 | * Spruit 1998, arXiv, astro-ph/9806141 (https://ui.adsabs.harvard.edu/abs/1998astro.ph..6141S/abstract) 26 | * Hernandez Santisteban, 2021, ASCL, 6003 (https://ui.adsabs.harvard.edu/abs/2021ascl.soft06003H/abstract) 27 | 28 | ## Requirements & Installation 29 | 30 | The doppler tomography code is written in fortran. Please ensure that you have a fortran compiler installed. 31 | At the moment, only gfortran is supported. 32 | 33 | 34 | Python >3.0 version is required (No tests have been done for backwards compatibility with python 2.X). 35 | 36 | You can download and install PyDoppler via pip. In a terminal command line, just type: 37 | 38 | ``` 39 | pip install pydoppler 40 | ``` 41 | 42 | If you need to upgrade the package to the latest version, you can do this with 43 | ``` 44 | pip install pydoppler -upgrade 45 | ``` 46 | 47 | ## Section 1: Usage 48 | 49 | You can use the sample_script.py file to run all the relevant commands 50 | _shown in sections 2 and 3_ from a terminal command line as: 51 | ``` 52 | python sample_scipt.py 53 | ``` 54 | or in a python console: 55 | ```python 56 | run sample_scipt.py 57 | ``` 58 | This will read all the files, normalise the spectra, perform Doppler 59 | tomography and output the results. In the following sections, I will briefly 60 | explain each main routine. 61 | 62 | ## Section 2: How to load data 63 | 64 | ### Section 2.1: Test case - the accreting white dwarf - U Gem 65 | 66 | You can start to test PyDoppler with a test dataset kindly provided by J. Echevarria and published 67 | in Echevarria et al. 2007, AJ, 134, 262 (https://ui.adsabs.harvard.edu/abs/2007AJ....134..262E/abstract). 68 | To copy the data to your working directory, open a (i)python console and run the 69 | following commands: 70 | ```python 71 | import pydoppler 72 | 73 | pydoppler.test_data() 74 | 75 | ``` 76 | This will create a subdirectory (called ugem99) in your current working directory 77 | which will contain text files for each spectra (txtugem40*). The format of 78 | each spectrum file is two columns: _Wavelength_ and _Flux_. 79 | * Wavelength is assumed to be in Angstrom. 80 | * Don't use headers in the files or us a _#_ at the start of the line, so it 81 | will be ignored. 82 | 83 | In addition, a phase file (ugem0all.fas) will be added inside the ugem99 84 | directory which contains the name 85 | of each spectrum file and its corresponding orbital phase. 86 | This is a two column file with the following format: 87 | ``` 88 | txtugem4004 0.7150 89 | txtugem4005 0.7794 90 | . 91 | . 92 | . 93 | ``` 94 | 95 | ### Section 2.2: Load your data 96 | I recommend to stick to the previous file format (as in the test dataset): 97 | 98 | * Individual spectra. Two-column files, _space separated_: Wavelength Flux 99 | * Phase file. Two-column file, _space separated_: Spectrum_name Orbital_Phase 100 | 101 | and the following directory tree in order for PyDoppler to work properly: 102 | 103 | ``` 104 | wrk_dir 105 | ├── data_dir (your target) 106 | │ │ 107 | │ ├── individual_spectra (N spectra) 108 | │ │ 109 | │ └── phases_file 110 | │ 111 | └── fortran_code_files 112 | ``` 113 | 114 | ## Section 3: Doppler tomography tutorial 115 | Before running any routines, verify that you have added all the relevant 116 | parameters into the PyDoppler object. 117 | 118 | * _NOTE:_ The pydoppler.spruit() will also copy into the working directory 119 | a copy of a sample script (sample_scipt.py) with all the commands in the 120 | following tutorial. The code will add a new script (e.g. sample_scipt-1.py) 121 | if you use the "install_force=True" keyword, it will not overwrite the one 122 | found in the directory. 123 | 124 | ```python 125 | import pydoppler 126 | 127 | # Load base object for tomography 128 | dop = pydoppler.spruit() 129 | 130 | # Basic data for the tomography to work 131 | dop.object = 'U Gem' 132 | dop.base_dir = 'ugem99' # Base directory for input spectra 133 | dop.list = 'ugem0all.fas' # Name of the input file 134 | dop.lam0 = 6562.8 # Wavelength zero in units of the original spectra 135 | dop.delta_phase = 0.003 # Exposure time in terms of orbital phase 136 | dop.delw = 35 # size of Doppler map in wavelength centred at lam0 137 | dop.overs = 0.3 # between 0-1, Undersampling of the spectra. 1= Full resolution 138 | dop.gama = 36.0 # Systemic velocity in km /s 139 | dop.nbins = 28 # Number of bins. Only supported the number of spectra at the moment 140 | ``` 141 | 142 | ### Section 3.1: Read the data 143 | This routine reads in the raw data and prepares the files for further 144 | processing. 145 | ```python 146 | # Read in the individual spectra and orbital phase information 147 | dop.Foldspec() 148 | ``` 149 | ``` 150 | 001 txhugem4004 0.715 2048 151 | 002 txhugem4005 0.7794 2048 152 | 003 txhugem4006 0.8348 2048 153 | 004 txhugem4007 0.8942 2048 154 | 005 txhugem4008 0.9518 2048 155 | 006 txhugem4009 0.0072 2048 156 | 007 txhugem4010 0.0632 2048 157 | 008 txhugem4011 0.1186 2048 158 | 009 txhugem4012 0.1745 2048 159 | 010 txhugem4013 0.2344 2048 160 | 011 txhugem4014 0.2904 2048 161 | 012 txhugem4015 0.3724 2048 162 | 013 txhugem4016 0.4283 2048 163 | 014 txhugem4017 0.4866 2048 164 | 015 txhugem4018 0.5425 2048 165 | 016 txhugem4019 0.5979 2048 166 | 017 txhugem4020 0.6544 2048 167 | 018 txhugem4021 0.7098 2048 168 | 019 txhugem4022 0.7652 2048 169 | 020 txhugem4023 0.8195 2048 170 | 021 txhugem4024 0.8772 2048 171 | 022 txhugem4025 0.9269 2048 172 | 023 txhugem4026 0.9614 2048 173 | 024 txhugem4027 0.9959 2048 174 | 025 txhugem4028 0.0304 2048 175 | 026 txhugem4029 0.0648 2048 176 | 027 txhugem4030 0.1027 2048 177 | 028 txhugem4031 0.1372 2048 178 | ``` 179 | 180 | ### Section 2.2: Normalise the data and set doppler files 181 | You will need to define a continnum band - one at each side of the emission line - 182 | to fit and later subtract the continuum. This normalised spectra will be put in 183 | in a file to be read by the fortran code. 184 | ```python 185 | # Normalise the spectra 186 | dop.Dopin(continnum_band=[6500,6537,6591,6620], 187 | plot_median=False,poly_degree=2) 188 | ``` 189 | 190 | 191 |

192 | 193 | 194 |

195 | 196 | ### Section 2.3: Run the fortran code 197 | Now, let's run the tomography software! 198 | ```python 199 | # Perform tomography 200 | dop.Syncdop() 201 | ``` 202 | 203 | The output of the fortran code is: 204 | ``` 205 | nvp 477 206 | (28, 477) 207 | nv 143 143 208 | Estimated Memory required 354 Mbytes 209 | parameter (nd=npm*nvpm,nr=0.8*nvm*nvm) 210 | 211 | parameter (nt=nvpm*npm+nvm*nvpm*3+2*npm*nvm) 212 | 213 | parameter (nri=0.9*nvm*nt/nd,ndi=0.9*nvm*nt/nr) 214 | 215 | c parameters for emap routines 216 | 217 | parameter (nf=nd,nfp=ndi,nrp=nri) 218 | 219 | parameter (ni=nvm,nj=nvm) 220 | 221 | parameter (nch=1,nsu=1) 222 | 223 | * Computing MEM tomogram 224 | cp -f cclock.f clock.f ; gfortran -O -w -o dopp dop.f clock.f 225 | dopp 226 | make: dopp: No such file or directory 227 | make: *** [dop.out] Error 1 228 | RL max entropy, floating defaults 229 | ih 0 (log likelihood) 230 | iw 0 (no error bars read in) 231 | pb0,pb1 0.950 1.050 232 | ns 7 233 | ac 8.00E-04 234 | nim 150 235 | al0, alf, nal 0.0020 1.7000 -1 236 | clim 1.6000 237 | ipri 2 238 | norm 1 239 | wid, af 0.10E+07 1.0000 240 | HOLAQQ NOW 2Q 241 | cpu for geometry 0.19 242 | HOLAQQQQ 243 | it H+alfa*S delta 244 | 1 3.064384039127E+04 8.97E-01 245 | 2 3.124296879919E+04 8.88E-01 246 | 3 3.174029201244E+04 8.10E-01 247 | 4 3.187324638623E+04 6.27E-01 248 | 5 3.189338120949E+04 4.84E-01 249 | 6 3.189804389182E+04 3.63E-01 250 | 7 3.189972657354E+04 2.60E-01 251 | 8 3.190005031439E+04 2.13E-01 252 | 9 3.190020880677E+04 1.65E-01 253 | 10 3.190026635720E+04 1.43E-01 254 | 11 3.190030859976E+04 1.14E-01 255 | 12 3.190032174052E+04 9.00E-02 256 | 13 3.190032685539E+04 7.44E-02 257 | 14 3.190032853609E+04 5.82E-02 258 | 15 3.190032918090E+04 4.18E-02 259 | 16 3.190032942768E+04 2.94E-02 260 | 17 3.190032951013E+04 2.23E-02 261 | 18 3.190032954797E+04 1.53E-02 262 | 19 3.190032956032E+04 1.32E-02 263 | 20 3.190032956654E+04 9.57E-03 264 | 21 3.190032956866E+04 5.22E-03 265 | 22 3.190032956935E+04 1.92E-03 266 | 23 3.190032956960E+04 2.18E-03 267 | 24 3.190032956968E+04 8.18E-04 268 | 25 3.190032956971E+04 4.46E-04 269 | ni, al, hs, rr: 25 0.00200 0.319003296E+05 1.48261 1.60000 270 | cpu for iteration 0.81 271 | entropy -2.4072E+04 272 | ``` 273 | ### Section 2.4: Plot the tomography map 274 | This routine will display the outcome of the Doppler tomography. You can overplot 275 | contours and streams. 276 | ```python 277 | # Read and plot map 278 | cb,data = dop.Dopmap(limits=[0.05,0.99],colorbar=True,cmaps=cm.mamga_r, 279 | smooth=False,remove_mean=False) 280 | # Overplot the donor contours, keplerian and ballistic streams 281 | qm=0.35 # mass ratio M_2 / M_1 282 | k1 = 107 # Semi amplitude of the primary in km/s 283 | inc=70 # inclination angle, in degrees 284 | m1=1.2 # Mass of the primary in solar masses 285 | porb=0.1769061911 # orbital period in days 286 | 287 | 288 | pydoppler.stream(qm,k1,porb,m1,inc) 289 | ``` 290 |

291 | 292 |

293 | 294 | ### Section 2.5: Spectra reconstruction 295 | Always check that reconstructed spectra looks like the original one. A good 296 | rule of thumb "If a feature on the Doppler tomogram is not in the trail 297 | spectrum, most likely its not real!" 298 | 299 | ```python 300 | # plot trail spectra 301 | cb2,cb3,dmr,dm = dop.Reco(colorbar=True,limits=[.05,0.95],cmaps=cm.magma_r) 302 | ``` 303 | where the output variables cb2 and cb3 hold the colorbar objects (if selected); dmr and dm hold the data cubes for the reconstructed trail spectra and the binned data, respectively. 304 |

305 | 306 |

307 | 308 | ## Section 3: Extra commands 309 | There are many other commands that will interact with the Doppler tomogram. As 310 | usual, you can update them inside the pydoppler.spruit object as we did in 311 | section 2. The configurable parameters are: 312 | ```python3 313 | dop.ih = 0 # type of likelihood function (ih=1 for chi-squared) 314 | dop.iw = 0 # iw=1 if error bars are to be read and used 315 | dop.pb0 = 0.95 # range of phases to be ignored, between 0 and 1 316 | dop.pb1 = 1.05 # range of phases to be ignored, between 1 and 2 317 | dop.ns = 7 # smearing width in default map 318 | dop.ac = 8e-4 # accuracy of convergence 319 | dop.nim = 150 # max no of iterations 320 | dop.al0 = 0.002 # starting value of alfa 321 | dop.alf = 1.7 # factor 322 | dop.nal = 0 # max number of alfas 323 | dop.clim = 1.6 # 'C-aim' 324 | dop.ipri = 2 # printout control for standard output channel (ipr=2 for full) 325 | dop.norm = 1 # norm=1 for normalization to flat light curve 326 | dop.wid = 10e5 # width of central absorption fudge 327 | dop.af = 0.0 # amplitude of central absorption fudge 328 | ``` 329 | 330 | ## Section 4: Troubleshoot 331 | This is an early version of the wrapper. Things will go wrong. If you find a 332 | bug or need a feature, I will try my best to work it out. If you think you can 333 | add to this wrapper, I encourage you push new changes and contribute to it. 334 | -------------------------------------------------------------------------------- /build/lib/pydoppler/__init__.py: -------------------------------------------------------------------------------- 1 | __modules__ = ['pydoppler'] 2 | from .pydoppler import spruit, rebin_trail, stream, test_data 3 | 4 | __version__ = "0.2.0" 5 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/cclock.f: -------------------------------------------------------------------------------- 1 | subroutine clock(t) 2 | real*8 t 3 | real*4 ta(2) 4 | x=dtime(ta) 5 | t=t+ta(1) 6 | return 7 | end 8 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/clock.f: -------------------------------------------------------------------------------- 1 | subroutine clock(t) 2 | real*8 t 3 | real*4 ta(2) 4 | x=dtime(ta) 5 | t=t+ta(1) 6 | return 7 | end 8 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/dop.f: -------------------------------------------------------------------------------- 1 | program dopmap 2 | c Version 2.0 3 | c HCS 3-3-1999 4 | c version for arbitrary phase bins 5 | implicit real*8 (a-h,o-z) 6 | real*4 dpx 7 | include 'emap.par' 8 | common/phases/dpha(npm) 9 | c the 'd' lines are the nonsense IBM machines need to make them stop on an overflow. 10 | c include '/usr/include/fpdc.h' 11 | c include '/usr/include/fexcp.h' 12 | dimension dat(nd),pha(npm),vp(nvpm) 13 | real*4 p(ndi,nr),pt(nri,nd) 14 | dimension vmo(nr),vmb(nr),dato(nd),datb(nd),eb(nd) 15 | dimension reco(nvm,nvm),dpxu(nvm,nvm) 16 | character*20 spec 17 | character*80 idat 18 | common /folds/ nph,nvp 19 | common /foldn/ nv,indx(nr),indy(nr),nol 20 | common /difpix/ dpx(nr,4) 21 | common /cabsf/ wid,af 22 | c fpstat(fpve)=.true. 23 | c fpstat(fpoe)=.true. 24 | c fpstat(fpue)=.true. 25 | c fpstat(fpze)=.true. 26 | c fpstat(fpxe)=.false. 27 | c call fpsets(fpstat) 28 | c call signal(sigtrap,xl__trce) 29 | pi2=8*atan(1.) 30 | 31 | c read parameter file 32 | call repar(ns,ac,nim, 33 | * al0,alf,nal,clim,ipri,spec,ih,iw,pb0,pb1,norm) 34 | c set baseline level to be added to spectrum (fraction of the avg of entire spectrum) 35 | bfa=0.1 36 | write(*,'('' HOLAQQ NOW 2Q'')') 37 | c read input data 38 | open(4,file=spec) 39 | read(4,*) nph,nvp,w0 40 | read(4,'(a)') idat 41 | if (nph.ne.npm) call erri('nph.ne.npm',nph,npm) 42 | if (nvp.ne.nvpm) call erri('nvp.ne.npvm',nvp,nvpm) 43 | nv=nvm 44 | nil=nvp*nph 45 | read(4,*) (pha(i),i=1,nph) 46 | read(4,*) iph 47 | if (iph.eq.1) then 48 | read(4,*) (dpha(i),i=1,nph) 49 | else 50 | do i=1,nph 51 | dpha(i)=1./nph 52 | enddo 53 | endif 54 | do i=1,nph 55 | pha(i)=pha(i)*pi2 56 | dpha(i)=dpha(i)*pi2 57 | enddo 58 | c make blanking array corresponding to (pb0,pb1) 59 | call blanks(pha,nph,pb0,pb1) 60 | read(4,*) (vp(i),i=1,nvp) 61 | read(4,*) (dat(i),i=1,nil) 62 | if (iw.eq.1) read(4,*) (eb(i),i=1,nil) 63 | close(4) 64 | call clock(t1) 65 | call prom(va,nv,pha,nph,vp,nvp,pt,p) 66 | call clock(t2) 67 | write(10,'('' cpu for geometry'',f10.2)')t2-t1 68 | if (ipri.gt.0) write(*,'('' cpu for geometry'',f10.2)')t2-t1 69 | t1=t2 70 | c compute a baseline flux to add to dat 71 | call basel(dat,nph,nvp,bfa,bf,nv,va,pt,datb,vmb) 72 | c add baseline to dat, put weighting map into dato 73 | do i=1,nil 74 | dat(i)=dat(i)+datb(i) 75 | if (dat(i).lt.bf/3) then 76 | dat(i)=1e-5*bf 77 | dato(i)=0 78 | else 79 | dato(i)=1 80 | endif 81 | enddo 82 | c normalize to constant wavelength-integrated flux 83 | if (norm.eq.1) call norms(dat,pb0,pb1,pha,nph,nvp) 84 | c sum of light 85 | sdat=0 86 | do i=1,nil 87 | sdat=sdat+dat(i) 88 | enddo 89 | 90 | c make error bars relative 91 | do i=1,nil 92 | eb(i)=eb(i)/dat(i) 93 | enddo 94 | c weights 95 | call weighd(dat,datb,pha,nph,nvp,eb,iw) 96 | 97 | c reconstruction 98 | c initialize (flat) 99 | write(*,'('' HOLAQQQQ'')') 100 | do j=1,nol 101 | vmo(j)=sdat/nol 102 | enddo 103 | c decreasing sequence of alfas until required fit to input data 104 | call alfs(dat,eb,iw,p,pt,al0,alf,nal,ac,nim,vmo, 105 | * dato,nil,nol,nit,al,rr,ns,ih,clim,ipri,ier,t2,sx) 106 | if (ier.eq.2) then 107 | write(*,'('' no converged models, returning starting image'')') 108 | al=al0 109 | rr=100 110 | endif 111 | if (ier.eq.1) write(*,'('' last converged model has rr='', 112 | * f7.4,'', >clim='',f7.4)') rr,clim 113 | if (ipri.gt.0) write(*,'('' entropy'', 1pe12.4)')sx 114 | c make an identification number 115 | s1=0 116 | s2=0 117 | m=max(1,nol/30) 118 | do i=1,nol,m 119 | s1=s1+vmo(i) 120 | enddo 121 | m=max(1,nil/30) 122 | do i=1,nil,m 123 | s2=s2+dat(i) 124 | enddo 125 | fident=sin(100*(s1/s2)) 126 | c normalize dopmap to input units (probably mJy's) x Hz per (cm/s)^2 in v-space 127 | c velocity grid size 128 | dv=2*va/(nv-1) 129 | delv2=dv**2 130 | c frequency grid size 131 | dev=(vp(nvp)-vp(1))/(nvp-1) 132 | denu=dev/w0*1e8 133 | do i=1,nol 134 | vmo(i)=(vmo(i)-vmb(i))/delv2*denu 135 | enddo 136 | c make unfolded reconstructed image 137 | do j=1,nol 138 | reco(indx(j),indy(j))=vmo(j) 139 | enddo 140 | 141 | open(3,file='dop.out') 142 | c write array sizes, w0, identification 143 | write(3,'(3i5,f10.3,f20.15)')nph,nvp,nvm,w0,fident 144 | c copy second line of input data file 145 | write(3,*)idat 146 | c copy phase and velocity coordinates of input spectrum 147 | write(3,'(1p8e13.4E3)')(pha(i),i=1,nph) 148 | write(3,*)iph 149 | if (iph.eq.1) write(3,'(1p8e13.4E3)')(dpha(i),i=1,nph) 150 | write(3,'(1p8e13.4E3)')(vp(i),i=1,nvp) 151 | c write input spectrum 152 | write(3,'(1p8e13.4E3)')(dat(i)-datb(i),i=1,nil) 153 | write(3,'(2i3,2f7.3,i4,2e13.4E3,f7.3,i3,e13.4E3,f7.3)') 154 | * ih,iw,pb0/pi2,pb1/pi2,ns,ac,al,clim,norm,wid,af 155 | c write dopmap and reco 156 | write(3,'(i4,1pe13.4E3,'' dopmap '')')nv,va 157 | write(3,'(1p6e13.4E3)')((reco(i,j),j=1,nv),i=1,nv) 158 | write(3,'(i6,'' reconstructed data '')')nil 159 | write(3,'(1p6e13.4E3)')(dato(i)-datb(i),i=1,nil) 160 | write(3,'(i6,'' 4 change maps '')')nv 161 | do ii=1,4 162 | do j=1,nol 163 | dpxu(indx(j),indy(j))=dpx(j,ii) 164 | enddo 165 | write(3,'(1p6e13.4E3)')((dpxu(i,j),j=1,nv),i=1,nv) 166 | enddo 167 | close(3) 168 | end 169 | 170 | c block data 171 | c include '/usr/include/fpdc.h' 172 | c include '/usr/include/fpdt.h' 173 | c end 174 | 175 | subroutine basel(dat,nph,nvp,bfa,bf,nv,va,pt,datb,vmb) 176 | c compute a baseline flux to get a flat background level in dopmap 177 | c datb is the data corresponding to a flat (circular) dopmap 178 | c vmb is the corresponding flat dopmap 179 | implicit real*8 (a-h,o-z) 180 | include 'emap.par' 181 | common /foldn/ nvf,indx(nr),indy(nr),nol 182 | dimension dat(*),datb(*),vmb(*) 183 | if (nol.gt.nr) call errb('nol>nr',nol,nr) 184 | 185 | c make circle of radius va on a zero background 186 | fv2=nv/2. 187 | dv=2*va/(nv-1) 188 | do ir=1,nol 189 | ix=indx(ir) 190 | iy=indy(ir) 191 | vx=dv*(ix-fv2-0.5) 192 | vy=dv*(iy-fv2-0.5) 193 | v=sqrt(vx**2+vy**2) 194 | vmb(ir)=0. 195 | if (v.lt.va) vmb(ir)=1 196 | enddo 197 | 198 | nil=nph*nvp 199 | c produce spectrum from this map 200 | call fproj(pt,nil,nol,vmb,datb) 201 | c value at v=0 202 | d0=datb(nvp/2*nph) 203 | c find avg of dat 204 | avg=0. 205 | do i=1,nil 206 | avg=avg+dat(i) 207 | enddo 208 | avg=avg/nil 209 | c baseline level to add 210 | bf=bfa*avg 211 | c normalize datb 212 | do i=1,nil 213 | datb(i)=bf*datb(i)/d0 214 | enddo 215 | c normalize background map 216 | do j=1,nol 217 | vmb(j)=vmb(j)*bf/d0 218 | enddo 219 | return 220 | end 221 | 222 | subroutine blanks(pha,nph,pb0,pb1) 223 | c make blanking array corresponding to (pb0,pb1) 224 | c pb0-pb1: phase range with weight 0 (used for ignoring eclipsed part of data) 225 | implicit real*8 (a-h,o-z) 226 | include 'emap.par' 227 | dimension pha(*) 228 | common/blank/bl(npm) 229 | logical bl 230 | pi2=8*atan(1.) 231 | c get max and min values of phase 232 | phmin=pha(1) 233 | phmax=pha(1) 234 | do i=2,nph 235 | if (pha(i).lt.phmin) phmin=pha(i) 236 | if (pha(i).gt.phmax) phmax=pha(i) 237 | enddo 238 | c number of cycles present 239 | nphmi=int(phmin/pi2) 240 | if (nphmi.lt.0.) nphmi=nphmi-1 241 | nphma=int(phmax/pi2) 242 | if (nphma.lt.0.) nphma=nphma-1 243 | c reduce blanking region to phases around 0 244 | npb1=int(pb1/pi2) 245 | if (npb1.lt.0.) npb1=npb1-1 246 | pb0=pb0-npb1*pi2 247 | pb1=pb1-npb1*pi2 248 | do i=1,nph 249 | c use only non-blanked region for making average 250 | bl(i)=.false. 251 | do ic=nphmi,nphma+1 252 | if (pha(i).gt.pb0+ic*pi2.and.pha(i).lt.pb1+ic*pi2) 253 | * bl(i)=.true. 254 | enddo 255 | enddo 256 | return 257 | end 258 | 259 | subroutine norms(dat,pb0,pb1,pha,nph,nvp) 260 | c normalize by a phase-dependent factor to make wavelength-integrated 261 | c light constant with phase. 262 | implicit real*8 (a-h,o-z) 263 | include 'emap.par' 264 | dimension dat(npm,nvpm),pha(*),wi(npm) 265 | common/blank/bl(npm) 266 | logical bl 267 | pi2=8*atan(1.) 268 | ws=0 269 | np=0 270 | c use only non-blanked region for making average 271 | do i=1,nph 272 | wi(i)=0 273 | if (.not.bl(i)) then 274 | np=np+1 275 | do j=1,nvp 276 | wi(i)=wi(i)+dat(i,j) 277 | enddo 278 | endif 279 | ws=ws+wi(i) 280 | enddo 281 | ws=ws/np 282 | do i=1,nph 283 | wi(i)=wi(i)/ws 284 | enddo 285 | c measure minimum of wi 286 | wim=0 287 | do i=1,nph 288 | if (wi(i).lt.wim) wim=wi(i) 289 | enddo 290 | c set an overall level to be added before normalization 291 | wl=0 292 | wlm=0.3 293 | if (wim.lt.wlm) then wl=wlm-wim 294 | do i=1,nph 295 | if (wi(i).ne.0.) then 296 | do j=1,nvp 297 | dat(i,j)=dat(i,j)*(1+wl)/(wi(i)+wl) 298 | enddo 299 | endif 300 | enddo 301 | return 302 | end 303 | 304 | subroutine alfs(dat,eb,iw,p,pt,al0,alf,nal,ac,nim,vmo, 305 | * dato,nil,nol,nit,alx,rr,ns,ih,clim,ipri,ier,t2,sx) 306 | c sequence of models with decreasing alfas, starting at al0, in factors 307 | c of alf, max no of models nal, each converged to accuracy ac, until 308 | c rms difference with input data dat is less than clim 309 | c ier=0: normal return 310 | c ier=1: last converged model differs more than clim from input light curve 311 | c ier=2: no converged models in entire sequence 312 | implicit real*8 (a-h,o-z) 313 | include 'emap.par' 314 | c dopmaps 315 | dimension vm1(nr),vmo(*) 316 | c projection matrix 317 | real*4 p(nfp,nr),pt(nrp,nf) 318 | c input data 319 | dimension dat(nd),eb(nd),dat1(nd),dato(nd) 320 | c parameters of penalty functions 321 | logical cont 322 | ier=0 323 | c copy input into temporary image 324 | do j=1,nol 325 | vm1(j)=vmo(j) 326 | enddo 327 | c initialize number of converged models 328 | nco=0 329 | c alpha- loop 330 | rr=100 331 | ial=0 332 | cont=.true. 333 | call clock(t2) 334 | t1=t2 335 | c if nal<0 converge abs(nal) models irrespective of clim 336 | if (nal.lt.0) then 337 | nal1=-nal 338 | else 339 | nal1=nal 340 | endif 341 | do while (ial.lt.nal1.and.(rr.gt.clim.or.nal.lt.0).and.cont) 342 | ial=ial+1 343 | c next alfa value 344 | if (nal.lt.0) then 345 | al=al0*alf**(1-ial) 346 | else 347 | al=alfa(al0,ial,alf,rr,clim) 348 | endif 349 | aci=ac 350 | flim=1e5 351 | c converge with Lucy's ME scheme 352 | call rldop(dat,p,pt,al,ac,flim,nim,vm1,nil,nol,nit,hs, 353 | * ns,ih,ipri,sf,ierr) 354 | if (ierr.eq.1) write(10,'('' not converged'')') 355 | if (ierr.eq.2) write(10,'('' not monotonic'')') 356 | if (ierr.eq.3) write(10,'('' not converged, not monotonic'')') 357 | if (ierr.eq.4) write(10,'('' stuck at vanishing updates'')') 358 | if (ipri.gt.0) then 359 | if (ierr.eq.1) write(*,'('' not converged'')') 360 | if (ierr.eq.2) write(*,'('' not monotonic'')') 361 | if (ierr.eq.3) write(*,'('' not converged, not monotonic'')') 362 | if (ierr.eq.4) write(*,'('' stuck at vanishing updates'')') 363 | endif 364 | c reconstructed spectrum 365 | call fproj(pt,nil,nol,vm1,dat1) 366 | c converged at this alpha, save. 367 | nco=nco+1 368 | do j=1,nol 369 | vmo(j)=vm1(j) 370 | enddo 371 | do k=1,nil 372 | dato(k)=dat1(k) 373 | enddo 374 | alx=al 375 | sx=sf 376 | c rms difference w/r input light curve 377 | rr0=rr 378 | rr=rrms(dat,eb,iw,dat1,nil) 379 | if (iw.eq.0) then 380 | c measure accuracy of reconstruction relative to point-to-point noise in data 381 | rn=rmsn(dat,dat1) 382 | rr=rr/rn 383 | endif 384 | c summary of this iteration to activity log file 385 | write(10,'('' ni, al, hs, rr:'',i5, 386 | * f8.5,e17.9,2f8.5)')nit,al,hs,rr,clim 387 | call clock(t2) 388 | write(10,'('' cpu for iteration'',f8.2)')t2-t1 389 | if (ipri.gt.0) then 390 | write(*,'('' ni, al, hs, rr:'',i5, 391 | * f8.5,e17.9,2f8.5)')nit,al,hs,rr,clim 392 | write(*,'('' cpu for iteration'',f8.2)')t2-t1 393 | endif 394 | t1=t2 395 | c continue if no converged models found yet, or if acceptable error 396 | c return from last model 397 | cont = nco.eq.0.or.ierr.eq.0.or.ierr.eq.2 398 | enddo 399 | if (nco.eq.0) ier=2 400 | if (.not.cont) then 401 | ier=1 402 | rr=rr0 403 | endif 404 | return 405 | end 406 | 407 | subroutine repar(ns,ac,nim, 408 | * al0,alf,nal,clim,ipri,spec,ih,iw,pb0,pb1,norm) 409 | c read input parameters 410 | implicit real*8 (a-h,o-z) 411 | include 'emap.par' 412 | character*(*) spec 413 | character*40 txt 414 | c output channels 415 | dimension kch(2) 416 | common /fold/ nvx,nvy 417 | common /cabsf/ wid,af 418 | pi2=8*atan(1.) 419 | c input data file 420 | open(4,file='dop.in') 421 | c type of likelihood to be used (0=log, 1=weighted log, 2=rms, 3=weighted rms) 422 | read(4,*)ih 423 | c read weights from lightcurve file if iw=1 424 | read(4,*)iw 425 | c read range of phases to be ignored in mapping and convert to radians 426 | read(4,*)pb0,pb1 427 | if(pb1-1.gt.pb0) call errb('all phases ignored:',pb0,pb1) 428 | if(pb1.lt.pb0) call errb('pb0 must be nr in prom',ir,nr) 602 | indx(ir)=ix 603 | indy(ir)=iy 604 | do ip=1,nph 605 | c line-of sight velocity at phase bin edges 606 | vp0=vx*sfl(ip)-vy*cfl(ip) 607 | vp1=vx*sfu(ip)-vy*cfu(ip) 608 | if (vp0.gt.vp1) then 609 | vpma=vp0+dv/2 610 | vpmi=vp1-dv/2 611 | else 612 | vpma=vp1+dv/2 613 | vpmi=vp0-dv/2 614 | endif 615 | c estimate near which line-sight bins these are 616 | ka=(vpma-vpl(1))/dvi+1 617 | ki=(vpmi-vpl(1))/dvi+1 618 | if (vpmi.lt.vpl(-1)) 619 | * call errb('vpmi,vpl(-1):',vpmi,vpl(-1)) 620 | if (vpma.gt.vpl(nvp+2)) 621 | * call errb('vpma,vpl(nvp+2):',vpma,vpl(nvp+2)) 622 | c get first vpl(i)nd in weighd',nil,nd) 806 | do i=1,nph 807 | do j=1,nvp 808 | inp=i+(j-1)*nph 809 | w(inp)=1 810 | if (f0(inp).eq.0.) w(inp)=0 811 | if (bl(i)) w(inp)=0 812 | enddo 813 | enddo 814 | if (iw.eq.1) then 815 | c multiply by weights from error bars 816 | do i=1,nil 817 | w(i)=w(i)*f(i)/eb(i) 818 | enddo 819 | endif 820 | c normalize to average=1 821 | x=0 822 | do i=1,nil 823 | x=x+w(i) 824 | enddo 825 | do i=1,nil 826 | w(i)=w(i)/x*nph 827 | enddo 828 | return 829 | end 830 | 831 | subroutine rldop(pht,p,pt,al,ac,flim,nim,ps,nil,nol,nit,hs, 832 | * ns,ih,ipri,s,ierr) 833 | c interface to rlfldn for doppler mapping 834 | c RL iteration with floating default, converged to accuracy ac 835 | c input: 836 | c pht: input data, nil: length of input data, nol: length of solution 837 | c p(i,j): probability p(x|xi), al: entropy weight, ac: accuracy of convergence, 838 | c pt: transpose of p, 839 | c flim: max acceleration parameter, nim: max no of iterations 840 | c ns: smearing width (passed on to chims) 841 | c ih: type of likelihood function (subroutines like, lamun) 842 | c ipri: printout control 843 | c out: 844 | c ps: solution, nit: no of iterations, hs: optimum function Q. 845 | c nit: number of iterations 846 | c s: entropy 847 | c ierr: 0 (OK), 1 (not converged) or 2 (not monotonic) 848 | implicit real*8 (a-h,o-z) 849 | dimension pht(*),p(*),pt(*),ps(*) 850 | dum=0 851 | idum=1 852 | epc=1 853 | call rlfldn(pht,p,pt,al,ac,flim,nim,ps,nil,nol,nit,hs, 854 | * idum,idum,ns,epc,idum,dum,idum,ih,ipri,dum,s,ierr) 855 | return 856 | end 857 | 858 | subroutine chims(ps,chi,id1,id2,id3,ns,du1,id4,du2,id5,du3) 859 | c default map routine to interface dopmap with emap routines 860 | c id1-5 and du1-3 are dummies 861 | implicit real*8 (a-h,o-z) 862 | include 'emap.par' 863 | dimension ps(*),chi(nr) 864 | dimension x2(nvm,nvm),y2(nvm,nvm) 865 | common /foldn/ nv,indx(nr),indy(nr),nol 866 | c reset x2 867 | do i=1,nv 868 | do j=1,nv 869 | x2(i,j)=0 870 | enddo 871 | enddo 872 | c fold x into x2 using `backdoor' information from /foldn/ 873 | do j=1,nol 874 | x2(indx(j),indy(j))=ps(j) 875 | enddo 876 | ic=0 877 | jc=0 878 | im=1 879 | call chimg(x2,y2,nv,ic,nv,jc,im,ns) 880 | c unfold y2 881 | do j=1,nol 882 | chi(j)=y2(indx(j),indy(j)) 883 | enddo 884 | return 885 | end 886 | 887 | subroutine chimsi(ps,chi,id,k,nc,inc,ns,epc,ico,rdf,msu,wbkg) 888 | c default map routine to interface dopmap with emap routines. 889 | c since there are no sub-surfaces in dopmap, chimsi does the same thing 890 | c as chims 891 | implicit real*8 (a-h,o-z) 892 | call chims(ps,chi,id,nc,inc,ns,epc,ico,rdf,msu,wbkg) 893 | return 894 | end 895 | 896 | subroutine wpar(npm,nvpm,nvm,nri,ndi) 897 | c write a parameter file with updated values for npm,nvpm,nvm,nri,ndi 898 | implicit real*8 (a-h,o-z) 899 | open(11,file='emap.par.new') 900 | write(11,'('' parameter (npm='',i3,'',nvpm='',i3, 901 | * '',nvm='',i3,'')'')')npm,nvpm,nvm 902 | write(11,'('' parameter (nd=npm*nvpm,nr=nvm*nvm)'')') 903 | write(11,'('' parameter (nri='',i4,'',ndi='',i4,'')'')') 904 | * nri,ndi 905 | write(11,'(''c parameters for emap routines'')') 906 | write(11,'('' parameter (nf=nd,nfp=ndi,nrp=nri)'')') 907 | write(11,'('' parameter (ni=nvm,nj=nvm)'')') 908 | write(11,'('' parameter (nch=1,nsu=1)'')') 909 | close(11) 910 | return 911 | end 912 | 913 | function alfa(al0,ial,alf,rr,clim) 914 | c next alfa value. last value is chosen to land rr close to clim 915 | implicit real*8 (a-h,o-z) 916 | common /alkeep/ rr2,rr1 917 | rr1=rr2 918 | rr2=rr 919 | if (rr.gt.sqrt(alf)*clim.or.ial.lt.3) then 920 | al=al0/alf**(ial-1) 921 | else 922 | dl2=log(rr1/rr2) 923 | dl=log(rr/clim) 924 | x=dl/dl2 925 | if (x.gt.1.) then 926 | al=al0/alf**(ial-1) 927 | else 928 | alfr=exp(x*log(alf)) 929 | al=al0/alf**(ial-2)/alfr 930 | endif 931 | endif 932 | alfa=al 933 | return 934 | end 935 | 936 | subroutine chimg(x2,y2,nam,ic,nbm,jc,im,ns) 937 | c gaussian smearing with half-width ns, by consecutive 1-d smearing in x and y 938 | implicit real*8 (a-h,o-z) 939 | include 'emap.par' 940 | parameter (ms=100) 941 | dimension x2(ni,nj), y2(ni,nj) 942 | common /first/ smp(-ms:ms),ns0,ns1 943 | dimension t1(-ms:ni+ms),t2(-ms:nj+ms) 944 | if (ns0.ne.ns) then 945 | c (re)make smearing matrix smp if value of ns is new. 946 | w=1.5 947 | c actual smearing width used is w times 1/e width 948 | ns1=w*ns 949 | if (ns1.gt.ms) call errb('ns1>ms in chimg',ns1,ms) 950 | ns0=ns 951 | s=0 952 | do i=-ns1,ns1 953 | smp(i)=exp(-float(i*i)/ns**2) 954 | s=s+smp(i) 955 | enddo 956 | c normalize 957 | do i=-ns1,ns1 958 | smp(i)=smp(i)/s 959 | enddo 960 | endif 961 | 962 | c smear in j-direction 963 | do i=1,nam 964 | c extend ith column of x2 into t2, taking properties of boundary into account 965 | do j=-ns1,0 966 | if (jc.eq.1) then 967 | c wraparound 968 | t2(j)=x2(i,j+nbm) 969 | else 970 | c fold back 971 | t2(j)=x2(i,2-j-1) 972 | endif 973 | enddo 974 | do j=1,nbm 975 | t2(j)=x2(i,j) 976 | enddo 977 | do j=nbm+1,nbm+ns1 978 | if (jc.eq.1) then 979 | t2(j)=x2(i,j-nbm) 980 | else 981 | t2(j)=x2(i,2*nbm-j+1) 982 | endif 983 | enddo 984 | c smear t2, result into y2 985 | do j=1,nbm 986 | s=0 987 | do js=-ns1,ns1 988 | s=s+t2(j+js)*smp(js) 989 | enddo 990 | y2(i,j)=s 991 | enddo 992 | enddo 993 | 994 | c smear in i-direction 995 | do j=1,nbm 996 | c extend jth row of y2 into t1, taking properties of boundary into account 997 | do i=-ns1,0 998 | if (ic.eq.1) then 999 | c wraparound 1000 | t1(i)=y2(i+nam,j) 1001 | else 1002 | c fold back 1003 | t1(i)=y2(2-i-1,j) 1004 | endif 1005 | enddo 1006 | do i=1,nam 1007 | t1(i)=y2(i,j) 1008 | enddo 1009 | do i=nam+1,nam+ns1 1010 | if (ic.eq.1) then 1011 | t1(i)=y2(i-nam,j) 1012 | else 1013 | t1(i)=y2(2*nam-i+1,j) 1014 | endif 1015 | enddo 1016 | c smear t1, result into y2 1017 | do i=1,nam 1018 | s=0 1019 | do is=-ns1,ns1 1020 | s=s+t1(i+is)*smp(is) 1021 | enddo 1022 | y2(i,j)=s 1023 | enddo 1024 | enddo 1025 | return 1026 | end 1027 | 1028 | subroutine rlfldn(pht,p,pt,al,ac,flim,nim,ps,nil,nol,nit,hs, 1029 | * nc,inc,ns,epc,ico,rdf,msu,ih,ipri,wbkg,s,ierr) 1030 | c RL iteration with floating default, converged to accuracy ac 1031 | c input: 1032 | c pht: input data, nil: length of input data, nol: length of solution 1033 | c p(i,j): probability p(x|xi), al: entropy weight, ac: accuracy of convergence, 1034 | c flim: max acceleration parameter, nim: max no of iterations 1035 | c nil: no of phases, nol: size of image, nc: no of components of default, 1036 | c epc: the weights of each of these components, inc: indices for the types of 1037 | c component. 1038 | c out: 1039 | c ps: solution, nit: no of iterations, hs: optimum function Q. 1040 | c ih: type of likelihood function (subroutines like, lamun) 1041 | c ierr: 0 (OK), 1 (not converged) or 2 (not monotonic) 1042 | c ipri: printout control 1043 | implicit real*8 (a-h,o-z) 1044 | real*4 dpx 1045 | include 'emap.par' 1046 | dimension pht(*),ps(*),inc(nch,nsu),ns(nch,nsu),epc(*),ico(*) 1047 | real*4 p(nfp,nr),pt(nrp,nf) 1048 | dimension ph(nf),dha(nr),dsa(nr),chi(nr,nch),tem(nr), 1049 | * ex(nr),dps(nr),dps0(nr) 1050 | common /difpix/ dpx(nr,4) 1051 | ierr=0 1052 | del=1 1053 | nit=0 1054 | hs=0 1055 | c sum of light curve 1056 | spt=0 1057 | do i=1,nil 1058 | spt=spt+pht(i) 1059 | enddo 1060 | do while (del.gt.ac.and.nit.lt.nim) 1061 | nit=nit+1 1062 | c phi (forward projection step) 1063 | call fproj(pt,nil,nol,ps,ph) 1064 | c magic statement: On HP's, code crashes with bus error if this line is removed: 1065 | if (nit.lt.0) write(*,*)1 1066 | if (al.le.0.) then 1067 | c measure convergence by diff between ph and pht 1068 | av=0 1069 | sm=0 1070 | do i=1,nil 1071 | av=av+pht(i) 1072 | sm=sm+(pht(i)-ph(i))**2 1073 | enddo 1074 | rm=sqrt(sm/nil) 1075 | av=av/nil 1076 | del=rm/av 1077 | endif 1078 | c H and dH/dpsi 1079 | call like(pht,ph,p,nil,nol,ih,h,dha) 1080 | c sum of psi*dH/dpsi and sum of psi 1081 | su=0 1082 | sup=0 1083 | do j=1,nol 1084 | su=su+ps(j)*dha(j) 1085 | sup=sup+ps(j) 1086 | enddo 1087 | c delta-H (in same array as dha) 1088 | do j=1,nol 1089 | dha(j)=dha(j)+(-su/sup+spt/sup-1) 1090 | enddo 1091 | c entropy 1092 | if (al.gt.0.) call entr(ps,nil,nol,s,dsa,chi,tem,ex,nc,inc,ns, 1093 | * epc,ico,rdf,msu,wbkg) 1094 | c sum of psi*dS/dpsi 1095 | su=0 1096 | do k=1,nol 1097 | su=su+ps(k)*dsa(k) 1098 | enddo 1099 | c Delta-S (in same array as dsa) 1100 | do j=1,nol 1101 | dsa(j)=dsa(j)-su/sup 1102 | enddo 1103 | c save old value of Q 1104 | hs0=hs 1105 | c current value of Q 1106 | hs=h+al*s 1107 | c warning if not monotonic 1108 | if (nit.ne.1.and.hs.lt.hs0) ierr=2 1109 | c new dpsi 1110 | do j=1,nol 1111 | dps(j)=ps(j)*(dha(j)+al*dsa(j)) 1112 | enddo 1113 | if (nit.eq.1) then 1114 | do j=1,nol 1115 | dps0(j)=dps(j) 1116 | enddo 1117 | endif 1118 | 1119 | c determine optimum direction and factor for update, from dps0 and dps. 1120 | c (generalization of Lucy's acceleration) 1121 | c derivatives of Q w/r to lambda and mu at current psi 1122 | call lamun(pht,ps,dps0,dps,pt,ph,chi,tem,ex,al,nil,nol, 1123 | * fla,fmu,nc,inc,ns,epc,ico,rdf,msu,ih,wbkg) 1124 | c length of multiplier 1125 | amu=sqrt(fla**2+fmu**2) 1126 | c direction (normalized) of optimum 1127 | fla=fla/amu 1128 | fmu=fmu/amu 1129 | c find max of amu 1130 | flm=0 1131 | jlm=0 1132 | do j=1,nol 1133 | c value of prospective update 1134 | xx=fla*dps0(j)+fmu*dps(j) 1135 | if (xx.lt.0) then 1136 | c positivity not maintained at this value of amu, get max 1137 | fl=-xx/ps(j) 1138 | if (fl.gt.flm) then 1139 | flm=fl 1140 | jlm=j 1141 | endif 1142 | endif 1143 | enddo 1144 | if (flm.gt.0.) then 1145 | c positivity restriction limits amu 1146 | c safety factor 0.9 1147 | flm=dmin1(flim,0.9/flm) 1148 | else 1149 | c take overall limit 1150 | flm=flim 1151 | endif 1152 | amu=dmin1(amu,flm) 1153 | c check if amu has been small for awhile 1154 | call zcheck(amu,nit,20,0.01d0,ierr) 1155 | if (ierr.eq.4) return 1156 | c having found amu, update psi 1157 | do j=1,nol 1158 | up=fmu*dps(j)+fla*dps0(j) 1159 | ps(j)=ps(j)+amu*up 1160 | c save direction of old dps 1161 | dps0(j)=up 1162 | enddo 1163 | 1164 | if (al.gt.0.) then 1165 | del=0 1166 | do j=1,nol 1167 | c measure of convergence (Lucy's eq 17) 1168 | dj=abs(dha(j)+al*dsa(j))/(abs(dha(j))+al*abs(dsa(j))) 1169 | del=del+dj**2 1170 | enddo 1171 | del=sqrt(del/nol) 1172 | endif 1173 | c store change 1174 | do j=1,nol 1175 | dpx(j,mod(nit,4)+1)=dha(j)+al*dsa(j) 1176 | enddo 1177 | c printout 1178 | if (nit.eq.1) then 1179 | write(10,'('' it H+alfa*S delta'')') 1180 | if (ipri.gt.1) 1181 | * write(*,'('' it H+alfa*S delta'')') 1182 | endif 1183 | if (nit.ne.1.and.hs.lt.hs0) then 1184 | c line summary to activity log file 1185 | write(10,'(i4,1pe20.12,e11.2,'' **'')')nit,hs,del 1186 | if (ipri.gt.1) 1187 | * write(*,'(i4,1pe20.12,e11.2,'' **'')')nit,hs,del 1188 | else 1189 | write(10,'(i4,1pe20.12,e11.2)')nit,hs,del 1190 | if (ipri.gt.1) 1191 | * write(*,'(i4,1pe20.12,e11.2)')nit,hs,del 1192 | endif 1193 | c renormalize (mostly to strip accumulating numerical noise) 1194 | su=0 1195 | do j=1,nol 1196 | su=su+ps(j) 1197 | enddo 1198 | do j=1,nol 1199 | ps(j)=ps(j)*spt/su 1200 | enddo 1201 | enddo 1202 | if (nit.ge.nim) then 1203 | c not converged at this value of ac 1204 | hs=0 1205 | c return last value of del 1206 | ac=del 1207 | c error flag 1208 | ierr=ierr+1 1209 | endif 1210 | return 1211 | end 1212 | 1213 | subroutine like(pht,ph,p,nil,nol,ih,h,dha) 1214 | c likelihood function h and its derivative w/r psi, dha 1215 | implicit real*8 (a-h,o-z) 1216 | include 'emap.par' 1217 | dimension pht(*),ph(*),dha(*) 1218 | real*4 p(nfp,nr) 1219 | dimension phh(nf) 1220 | common /weights/ w(nf) 1221 | h=0 1222 | if (ih.eq.0) then 1223 | c log likelihood 1224 | do i=1,nil 1225 | h=h+w(i)*(pht(i)*log(ph(i))-ph(i)) 1226 | enddo 1227 | else 1228 | c rms 1229 | do i=1,nil 1230 | h=h-w(i)*(pht(i)-ph(i))**2 1231 | enddo 1232 | c normalizing factor 1233 | h=h*nil 1234 | endif 1235 | c Delta-H 1236 | if (ih.eq.0) then 1237 | c log likelihood 1238 | do i=1,nil 1239 | phh(i)=w(i)*(pht(i)/ph(i)-1) 1240 | enddo 1241 | call bproj(p,nil,nol,phh,dha) 1242 | else 1243 | c rms 1244 | do i=1,nil 1245 | phh(i)=2*nil*w(i)*(pht(i)-ph(i)) 1246 | enddo 1247 | call bproj(p,nil,nol,phh,dha) 1248 | endif 1249 | return 1250 | end 1251 | 1252 | subroutine zcheck(amu,nit,nz,amc,ierr) 1253 | c set ierr=4 if past nz amu values were less than amc 1254 | implicit real*8 (a-h,o-z) 1255 | common /zsave/ am(30) 1256 | if (nz.gt.30) call errb('nz>30 in zcheck',nz,30) 1257 | am(mod(nit,nz)+1)=amu 1258 | if (nit.ge.nz) then 1259 | ama=0 1260 | do i=1,nz 1261 | if(am(i).gt.ama) ama=am(i) 1262 | enddo 1263 | if (ama.lt.amc) ierr=4 1264 | endif 1265 | return 1266 | end 1267 | 1268 | subroutine entr(ps,nil,nol,s,sp,chi,tem,ex,nc,inc,ns,epc,ico, 1269 | * rdf,msu,wbkg) 1270 | c entropy part of `objective function' Q. 1271 | c input: ps (current reconstruction), 1272 | c output: s (S), sp (dS/dpsi) 1273 | implicit real*8 (a-h,o-z) 1274 | include 'emap.par' 1275 | dimension ps(*),sp(*),chi(nr,nch),tem(*),ex(*),inc(nch,nsu), 1276 | * ns(nch,nsu),epc(*),ico(*) 1277 | dimension x(nr),y(nr,nch) 1278 | if (nc.gt.nch) call errb('nc>nch in entr',nc,nch) 1279 | c make chi's 1280 | call chims(ps,chi,1,nc,inc,ns,epc,ico,rdf,msu,wbkg) 1281 | c entropy 1282 | s=0 1283 | do j=1,nol 1284 | tem(j)=log(ps(j)) 1285 | ex(j)=0 1286 | do k=1,nc 1287 | if (epc(k).ne.0.) then 1288 | fe=epc(k)*log(chi(j,k)) 1289 | ex(j)=ex(j)+fe 1290 | tem(j)=tem(j)-fe 1291 | endif 1292 | enddo 1293 | ex(j)=exp(ex(j)) 1294 | s=s-ps(j)*(tem(j)-1)-ex(j) 1295 | enddo 1296 | c derivative wr to psi_j, first the psilogpsi part 1297 | do j=1,nol 1298 | sp(j)=-tem(j) 1299 | enddo 1300 | c add terms due to dependence of chi on psi 1301 | do k=1,nc 1302 | if (epc(k).ne.0.) then 1303 | do j=1,nol 1304 | x(j)=(ps(j)-ex(j))/chi(j,k) 1305 | enddo 1306 | call chimsi(x,y,-1,k,nc,inc,ns,epc,ico,rdf,msu,wbkg) 1307 | do j=1,nol 1308 | sp(j)=sp(j)+epc(k)*y(j,k) 1309 | enddo 1310 | endif 1311 | enddo 1312 | return 1313 | end 1314 | 1315 | subroutine lamun(pht,ps,dps1,dps2,pt,ph,chi,tem,ex,al,nil,nol, 1316 | * fla,fmu,nc,inc,ns,epc,ico,rdf,msu,ih,wbkg) 1317 | c optimal lambda and mu from first and second derivatives of Q 1318 | implicit real*8 (a-h,o-z) 1319 | include 'emap.par' 1320 | dimension pht(*),ps(*),dps1(*),dps2(*),ph(*),chi(nr,nch), 1321 | * tem(*),ex(*),inc(nch,nsu),ns(nch,nsu),epc(*),ico(*) 1322 | real*4 pt(nrp,nf) 1323 | dimension dph1(nf),dph2(nf),dch1(nr,nch),dch2(nr,nch) 1324 | common /weights/ w(nf) 1325 | c changes in phi and chi corresponding to dps0, dps 1326 | call fproj(pt,nil,nol,dps1,dph1) 1327 | call fproj(pt,nil,nol,dps2,dph2) 1328 | if (al.gt.0.) then 1329 | call chims(dps1,dch1,1,nc,inc,ns,epc,ico,rdf,msu,wbkg) 1330 | call chims(dps2,dch2,1,nc,inc,ns,epc,ico,rdf,msu,wbkg) 1331 | endif 1332 | c first and second derivatives 1333 | hl=0 1334 | hll=0 1335 | hm=0 1336 | hlm=0 1337 | hmm=0 1338 | sl=0 1339 | sll=0 1340 | sm=0 1341 | slm=0 1342 | smm=0 1343 | c likelihood term 1344 | if (ih.eq.0) then 1345 | c log likelihood 1346 | do i=1,nil 1347 | phw=pht(i)*w(i) 1348 | dpp=pht(i)/ph(i)-1 1349 | xl=dph1(i)/ph(i) 1350 | xm=dph2(i)/ph(i) 1351 | hl=hl+w(i)*dph1(i)*dpp 1352 | hll=hll-xl**2*phw 1353 | hlm=hlm-xl*xm*phw 1354 | hm=hm+w(i)*dph2(i)*dpp 1355 | hmm=hmm-xm**2*phw 1356 | enddo 1357 | else 1358 | c rms likelihood 1359 | do i=1,nil 1360 | x=pht(i)-ph(i) 1361 | xl=dph1(i) 1362 | xm=dph2(i) 1363 | hl=hl+2*w(i)*x*xl 1364 | hll=hll-2*w(i)*xl**2 1365 | hlm=hlm-2*w(i)*xl*xm 1366 | hm=hm+2*w(i)*x*xm 1367 | hmm=hmm-2*w(i)*xm**2 1368 | enddo 1369 | hl=hl*nil 1370 | hm=hm*nil 1371 | hll=hll*nil 1372 | hmm=hmm*nil 1373 | hlm=hlm*nil 1374 | endif 1375 | c entropy terms 1376 | if (al.gt.0.) then 1377 | do j=1,nol 1378 | pl=dps1(j)/ps(j) 1379 | pm=dps2(j)/ps(j) 1380 | tl=0 1381 | tm=0 1382 | tll=0 1383 | tmm=0 1384 | tlm=0 1385 | do k=1,nc 1386 | if (epc(k).ne.0.) then 1387 | dc1=dch1(j,k)/chi(j,k) 1388 | dc2=dch2(j,k)/chi(j,k) 1389 | tl=tl+epc(k)*dc1 1390 | tm=tm+epc(k)*dc2 1391 | tll=tll+epc(k)*dc1**2 1392 | tmm=tmm+epc(k)*dc2**2 1393 | tlm=tlm+epc(k)*dc1*dc2 1394 | endif 1395 | enddo 1396 | pz=ps(j)-ex(j) 1397 | sl=sl-dps1(j)*tem(j)+pz*tl 1398 | sm=sm-dps2(j)*tem(j)+pz*tm 1399 | sll=sll-ps(j)*(pl-tl)**2+pz*(tl**2-tll) 1400 | slm=slm-ps(j)*(pl-tl)*(pm-tm)+pz*(tl*tm-tlm) 1401 | smm=smm-ps(j)*(pm-tm)**2+pz*(tm**2-tmm) 1402 | enddo 1403 | endif 1404 | 1405 | ql=hl+al*sl 1406 | qll=hll+al*sll 1407 | qlm=hlm+al*slm 1408 | qm=hm+al*sm 1409 | qmm=hmm+al*smm 1410 | c calculate lambda and mu 1411 | dd=qmm*qll-qlm**2 1412 | dr=abs(dd)/(qll**2+qmm**2) 1413 | c if det of 2X2 system too small, use only mu 1414 | if (dr.lt.1e-3) then 1415 | fla=0 1416 | fmu=-qm/qmm 1417 | else 1418 | fmu=(qlm*ql-qll*qm)/dd 1419 | fla=(qlm*qm-qmm*ql)/dd 1420 | endif 1421 | return 1422 | end 1423 | 1424 | function rrms(f1,eb,iw,f0,n) 1425 | c rms of difference between f1 and f0 (iw=0) or 1426 | c rms distance between f1 and f0 normalized by the error bars eb (iw=1) 1427 | implicit real*8 (a-h,o-z) 1428 | dimension f1(*),eb(*),f0(*) 1429 | s=0 1430 | if (iw.eq.0) then 1431 | do i=1,n 1432 | s=s+(f1(i)-f0(i))**2 1433 | enddo 1434 | else 1435 | do i=1,n 1436 | s=s+((f1(i)-f0(i))/eb(i))**2 1437 | enddo 1438 | endif 1439 | rrms=sqrt(s/(n-1)) 1440 | return 1441 | end 1442 | 1443 | function rmsn(x,y) 1444 | implicit real*8 (a-h,o-z) 1445 | dimension x(*),y(*) 1446 | common/folds/nph,nvp 1447 | s=0 1448 | do i=2,nph-1 1449 | do j=2,nvp-1 1450 | i1=i+(j-2)*nph 1451 | i2=i1+nph 1452 | i3=i2+nph 1453 | s0=x(i1-1)+x(i1)+x(i1+1)+x(i2-1)+x(i2+1)+x(i3-1)+x(i3)+x(i3+1) 1454 | s1=y(i1-1)+y(i1)+y(i1+1)+y(i2-1)+y(i2+1)+y(i3-1)+y(i3)+y(i3+1) 1455 | s=s+((s1-s0)/8-(y(i2)-x(i2)))**2 1456 | enddo 1457 | enddo 1458 | s=s/(nph-2)/(nvp-2) 1459 | rmsn=sqrt(s) 1460 | return 1461 | end 1462 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/dop.in: -------------------------------------------------------------------------------- 1 | 0 ih type of likelihood function (ih=1 for chi-squared) 2 | 0 iw iw=1 if error bars are to be read and used 3 | 0.95 1.05 pb0,pb1 range of phases to be ignored 4 | 7 ns smearing width in default map 5 | 8e-4 ac accuracy of convergence 6 | 150 nim max no of iterations 7 | 0.002 1.7 0 al0,alf,nal starting value, factor, max number of alfas 8 | 1.6 clim 'C-aim' 9 | 2 ipri printout control for standard output channel (ipr=2 for full) 10 | 1 norm norm=1 for normalization to flat light curve 11 | 10e5 0 wid,af width and amplitude central absorption fudge 12 | end of parameter input file 13 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/emap.par: -------------------------------------------------------------------------------- 1 | parameter (npm= 28,nvpm= 477,nvm= 144) 2 | parameter (nd=npm*nvpm,nr=0.8*nvm*nvm) 3 | parameter (nt=nvpm*npm+nvm*nvpm*3+2*npm*nvm) 4 | parameter (nri=0.9*nvm*nt/nd,ndi=0.9*nvm*nt/nr) 5 | c parameters for emap routines 6 | parameter (nf=nd,nfp=ndi,nrp=nri) 7 | parameter (ni=nvm,nj=nvm) 8 | parameter (nch=1,nsu=1) 9 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/emap_ori.par: -------------------------------------------------------------------------------- 1 | parameter (npm= 28,nvpm= 354,nvm= 106) 2 | parameter (nd=npm*nvpm,nr=0.8*nvm*nvm) 3 | parameter (nt=nvpm*npm+nvm*nvpm*3+2*npm*nvm) 4 | parameter (nri=0.9*nvm*nt/nd,ndi=0.9*nvm*nt/nr) 5 | c parameters for emap routines 6 | parameter (nf=nd,nfp=ndi,nrp=nri) 7 | parameter (ni=nvm,nj=nvm) 8 | parameter (nch=1,nsu=1) 9 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/fort.10: -------------------------------------------------------------------------------- 1 | nvm not even 83 0 2 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/hclock.f: -------------------------------------------------------------------------------- 1 | subroutine clock(t) 2 | real*8 t 3 | real*4 ta(2) 4 | x=dtime(ta) 5 | t=t+ta(1) 6 | return 7 | end 8 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/iclock.f: -------------------------------------------------------------------------------- 1 | subroutine clock(t) 2 | real*8 t 3 | c ibm-rs clock function 4 | t=mclock()/100. 5 | return 6 | end 7 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/lobe.f: -------------------------------------------------------------------------------- 1 | program stream 2 | c aux program for idl plots of dopmaps 3 | c calculates Roche lobes and integrates path of stream from L1 4 | parameter(nmax=10000) 5 | complex z,w,z1,z2,dz,dw,wk,no,wr,wc,w0,wm1,wi, 6 | * wout(nmax),wkout(nmax) 7 | dimension xout(nmax),yout(nmax),rout(nmax) 8 | open(3,file='lobe.out') 9 | open(4,file='lobe.in') 10 | read(4,*)qm 11 | if (abs(qm-1).lt.1e-4) qm=1e-4 12 | close(4) 13 | rd=0.1 14 | if (qm.le.0.) then 15 | write(3,'(''qm<0: '',f8.5)')qm 16 | close(3) 17 | stop 18 | endif 19 | rl1=rlq1(qm) 20 | c write(*,'('' rlq1'',f8.5)')rl1 21 | write(3,'(f8.5)')qm 22 | call lobes(qm,rl1) 23 | c center of mass rel to M1 24 | cm=qm/(1+qm) 25 | c coordinates of M1 and M2 26 | z1=-cm 27 | z2=1-cm 28 | wm1=conjg(cmplx(0.,-cm)) 29 | c start at L1-eps with v=0 30 | eps=1e-3 31 | z=cmplx(rl1-cm-eps,0.) 32 | w=0 33 | c check that we really are near L1 34 | call eqmot(z,w,zp,wp,z1,z2,qm) 35 | write(*,'('' t=0: z,w'',1p4e11.3)')zp,wp 36 | t=0 37 | dt=1e-4 38 | isa=0 39 | it=0 40 | r=1 41 | ist=0 42 | ph=0. 43 | phmax=6 44 | c do while(it.lt.nmax.and.ph.lt.phmax.and.ist.eq.0) 45 | do while(it.lt.nmax.and.ph.lt.phmax) 46 | it=it+1 47 | call intrk(z,w,dt,dz,dw,z1,z2,qm) 48 | z=z+dz 49 | w=w+dw 50 | t=t+dt 51 | if (abs(dz)/abs(z).gt.0.02) dt=dt/2 52 | if (abs(dz)/abs(z).lt.0.005) dt=2*dt 53 | dph=-aimag(z*conjg(z-dz))/abs(z)/abs(z-dz) 54 | ph=ph+dph 55 | c velocity in inertial frame 56 | c change by Guillaume 57 | wi=w+cmplx(0,1.)*z 58 | c unit vector normal to kepler orbit 59 | rold=r 60 | r=abs(z-z1) 61 | if (ist.eq.0.and.rold.lt.r) then 62 | ist=1 63 | rmin=rold 64 | endif 65 | c kepler velocity of circular orbit in potential of M1, rel. to M1 66 | vk=1/sqrt(r*(1+qm)) 67 | c unit vector in r 68 | no=conjg(z-z1)/r 69 | wk=-vk*no*cmplx(0.,1.) 70 | c same but rel. to cm, this is velocity in inertial frame 71 | wk=wk+wm1 72 | c velocity normal to disk edge, in rotating frame 73 | dot=no*w 74 | c velocity parallel to disk edge 75 | par=aimag(no*w) 76 | c reflected velocity 77 | wr=w-2*dot*no 78 | c write(*,'(f8.4,1p9e11.3)')t,z,w,wk,wr,r 79 | xout(it)=z+cm 80 | yout(it)=-aimag(z) 81 | rout(it)=sqrt(xout(it)**2+yout(it)**2) 82 | c change by Guillaume 83 | wout(it)=wi 84 | wkout(it)=conjg(wk) 85 | if (it.gt.1) then 86 | x=xout(it) 87 | y=yout(it) 88 | phi=atan(y/x) 89 | if (rout(it).lt.rd.and.rout(it-1).gt.rd) then 90 | c write(*,'('' r,x,y,phi,vs,vk,dot,par'',8f8.3)') 91 | c * rout(it),x,y,phi,real(w),vk,dot,par 92 | c write(*,'('' w,no'',4f8.3)')w,no 93 | x=xout(it-1) 94 | y=yout(it-1) 95 | phi=atan(y/x) 96 | c write(*,'('' r,x,y,phi'',4f8.3)')rout(it-1),x,y,phi 97 | endif 98 | endif 99 | if (isa.eq.0.and.yout(it).lt.0) then 100 | isa=1 101 | ra=abs(z-z1) 102 | wc=conjg(w)+cmplx(0.,1.)*conjg(z-z1) 103 | ang=abs(aimag((z-z1)*conjg(wc))) 104 | endif 105 | enddo 106 | write(3,'(i5)')it 107 | write(3,'(1p5e15.7)')(xout(i),i=1,it) 108 | write(3,'(1p5e15.7)')(yout(i),i=1,it) 109 | write(3,'(1p6e12.4)')(real(wout(i)),i=1,it) 110 | write(3,'(1p6e12.4)')(aimag(wout(i)),i=1,it) 111 | write(3,'(1p6e12.4)')(real(wkout(i)),i=1,it) 112 | write(3,'(1p6e12.4)')(aimag(wkout(i)),i=1,it) 113 | rc=ang**2*(1+qm) 114 | z=rl1-cm 115 | w0=cmplx(0.,1.)*conjg(z-z1) 116 | ang0=abs(aimag((z-z1)*conjg(w0))) 117 | rc0=ang0**2*(1+qm) 118 | write(3,'(3f8.5,'' ra, rc '')')ra,rc,rc0 119 | c write(*,'(3f8.5,'' ra, rc '')')ra,rc,rc0 120 | c write(*,'(2f8.4,'' q, rmin'')')qm,rmin 121 | end 122 | 123 | subroutine intrk(z,w,dt,dz,dw,z1,z2,qm) 124 | complex z,w,dz,dw,z1,z2 125 | complex zp,wp,hz0,hz1,hz2,hz3,hw0,hw1,hw2,hw3,zx,wx 126 | zx=z 127 | wx=w 128 | call eqmot(zx,wx,zp,wp,z1,z2,qm) 129 | hz0=zp*dt 130 | hw0=wp*dt 131 | zx=z+hz0/2 132 | wx=w+hw0/2 133 | call eqmot(zx,wx,zp,wp,z1,z2,qm) 134 | hz1=zp*dt 135 | hw1=wp*dt 136 | zx=z+hz1/2 137 | wx=w+hw1/2 138 | call eqmot(zx,wx,zp,wp,z1,z2,qm) 139 | hz2=zp*dt 140 | hw2=wp*dt 141 | zx=z+hz2 142 | wx=w+hw2 143 | call eqmot(zx,wx,zp,wp,z1,z2,qm) 144 | hz3=zp*dt 145 | hw3=wp*dt 146 | dz=(hz0+2*hz1+2*hz2+hz3)/6 147 | dw=(hw0+2*hw1+2*hw2+hw3)/6 148 | return 149 | end 150 | 151 | subroutine eqmot(z,w,zp,wp,z1,z2,qm) 152 | complex z,w,zp,wp,z1,z2 153 | complex zr1,zr2 154 | zr1=z-z1 155 | zr2=z-z2 156 | c change by Guillaume : - sign in Coriolis 157 | wp=-(qm*zr2/(abs(zr2))**3+zr1/(abs(zr1))**3)/(1+qm)- 158 | * cmplx(0.,2.)*w+z 159 | zp=w 160 | return 161 | end 162 | 163 | function rlq1(q) 164 | c radius (from primary) of L1 165 | if (abs(1-q).lt.1e-4) then 166 | rlq=0.5 167 | return 168 | endif 169 | rl=0 170 | rn=1-q 171 | 2 if (abs(rl/rn-1).gt.1e-4)then 172 | rl=rn 173 | f=q/(1-rl)**2-1/rl**2+(1+q)*rl-q 174 | fa=2*q/(1-rl)**3+2/rl**3+(1+q) 175 | rn=rl-f/fa 176 | goto 2 177 | endif 178 | rlq1=rn 179 | return 180 | end 181 | 182 | function pot(q,x,y,z,pr) 183 | c Roche potential. coordinates centered on M2, 184 | c z along rotation axis, x toward M1 185 | c pr is gradient in radius from M2 186 | c first transform to polar coordinates w/r rotation axis 187 | r=sqrt(x*x+y*y+z*z) 188 | if (r.eq.0) stop 'r=0 in pot' 189 | rh=sqrt(x*x+y*y) 190 | st=rh/r 191 | if (rh.eq.0) then 192 | cf=1 193 | else 194 | cf=x/rh 195 | endif 196 | r2=1/(1+q) 197 | r1=sqrt(1+r**2-2*r*cf*st) 198 | pot=-1/r-1/q/r1-0.5*(1/q+1)*(r2**2+(r*st)**2-2*r2*r*cf*st) 199 | pr=1/r**2+1/q/(r1**3)*(r-cf*st)-0.5*(1/q+1)*2*(r*st*st-r2*cf*st) 200 | return 201 | end 202 | 203 | subroutine lobes(q,rs) 204 | include 'emap.par' 205 | dimension r(ni,nj),ch(ni),ps(nj),x(ni),y(ni) 206 | nc=ni 207 | np=nj 208 | call surf(q,rs,nc,np,r,ch,ps) 209 | write(3,'(2i5,'' ni,nj'')')ni,nj 210 | j=1 211 | do i=1,nc 212 | x(i)=1-r(i,j)*cos(ch(i)) 213 | y(i)=-r(i,j)*sin(ch(i)) 214 | enddo 215 | write(3,'(8f9.5)')(x(i),i=1,nc),(x(i),i=nc,1,-1) 216 | write(3,'(8f9.5)')(y(i),i=1,nc),(-y(i),i=nc,1,-1) 217 | call surf(1/q,1-rs,nc,np,r,ch,ps) 218 | j=1 219 | do i=1,nc 220 | x(i)=r(i,j)*cos(ch(i)) 221 | y(i)=r(i,j)*sin(ch(i)) 222 | enddo 223 | write(3,'(8f9.5)')(x(i),i=1,nc),(x(i),i=nc,1,-1) 224 | write(3,'(8f9.5)')(y(i),i=1,nc),(-y(i),i=nc,1,-1) 225 | return 226 | end 227 | 228 | subroutine surf(q,rs,nc,np,r,ch,ps) 229 | c Roche surface around M2, coordinates on surface are ch, ps. 230 | c ch: polar angle from direction to M1; ps: corresponding azimuth, counting 231 | c from orbital plane. 232 | c q:mass ratio, rs: radius of surface at point facing M1 233 | c nc, np: number of chi's, psi's. 234 | c output: 235 | c r(nf,nt): radius. ch, ps: chi and psi arrays 236 | include 'emap.par' 237 | dimension r(ni,nj),ch(*),ps(*) 238 | if (nc.gt.ni) stop 'nc>ni' 239 | if (np.gt.nj) stop 'np>nj' 240 | pi=2*asin(1.) 241 | dc=pi/nc 242 | ch(1)=0 243 | do i=1,nc 244 | ch(i)=float((i-1))*pi/(nc-1) 245 | enddo 246 | ps(1)=0 247 | do j=1,np 248 | ps(j)=float((j-1))*2*pi/np 249 | enddo 250 | rs1=1-rs 251 | fs=pot(q,rs1,0.,0.,pr) 252 | c max no of iterations 253 | im=20 254 | do i=1,np 255 | cp=cos(ps(i)) 256 | sp=sin(ps(i)) 257 | rx=(1-dc)*rs1 258 | r(1,i)=rs1 259 | do k=2,nc 260 | x=cos(ch(k)) 261 | sc=sin(ch(k)) 262 | y=sc*cp 263 | z=sc*sp 264 | j=0 265 | f=1 266 | do while (j.lt.im.and.abs(f-fs).gt.1e-4.or.j.eq.0.) 267 | j=j+1 268 | r1=rx 269 | f=pot(q,r1*x,r1*y,r1*z,pr) 270 | rx=r1-(f-fs)/pr 271 | if (rx.gt.rs1) rx=rs1 272 | enddo 273 | if (j.ge.im) then 274 | write(*,'('' no conv in surf; k,i,ch,ps'',2i4,2f7.3)') 275 | * k,i,ch(k),ps(i) 276 | stop 277 | endif 278 | r(k,i)=rx 279 | enddo 280 | enddo 281 | return 282 | end 283 | -------------------------------------------------------------------------------- /build/lib/pydoppler/fortran_code/makefile: -------------------------------------------------------------------------------- 1 | # IBM aix 2 | # with error traps and bounds checks: 3 | # compile=cp -f iclock.f clock.f ; xlf -D -C -g -q flttrap 4 | # optimized: 5 | # compile=cp -f iclock.f clock.f ; xlf -O 6 | # optimized, with extended memory allocation of 2048 MB: 7 | #compile=cp -f iclock.f clock.f ; xlf -bmaxdata:2048000000 -bmaxstack:2048000000 -O 8 | 9 | # DEC alpha with debug and bound checks 10 | # compile=cp -f cclock.f clock.f ; f90 -C -g -ladebug 11 | # optimized: 12 | # compile=cp -f cclock.f clock.f ; g77 -O 13 | 14 | # HP HP/UX 15 | # compile=cp -f hclock.f clock.f ; f77 -O +U77 16 | # with error traps and bounds checks: 17 | # compile=cp -f hclock.f clock.f ; f77 +FPVZO -g -C -O +U77 18 | 19 | # SUN sparc 20 | #compile=cp -f cclock.f clock.f ; gfortran -O 21 | #compile=cp -f cclock.f clock.f ; g77 -O -fno-globals -Wno-globals 22 | #-fno-globals 23 | 24 | compile=cp -f cclock.f clock.f ; gfortran -O -w -fallow-argument-mismatch 25 | 26 | dop.out: dopin dop.in dopp 27 | dopp 28 | dopp: dop.f emap.par 29 | $(compile) -o dopp dop.f clock.f 30 | 31 | lobe.out: lobe lobe.in 32 | lobe 33 | lobe: lobe.f 34 | $(compile) -o lobe lobe.f 35 | -------------------------------------------------------------------------------- /build/lib/pydoppler/mynormalize.py: -------------------------------------------------------------------------------- 1 | # The Normalize class is largely based on code provided by Sarah Graves. 2 | 3 | import numpy as np 4 | import numpy.ma as ma 5 | 6 | import matplotlib.cbook as cbook 7 | from matplotlib.colors import Normalize 8 | 9 | 10 | class MyNormalize(Normalize): 11 | ''' 12 | A Normalize class for imshow that allows different stretching functions 13 | for astronomical images. 14 | ''' 15 | 16 | def __init__(self, stretch='linear', exponent=5, vmid=None, vmin=None, 17 | vmax=None, clip=False): 18 | ''' 19 | Initalize an APLpyNormalize instance. 20 | 21 | Optional Keyword Arguments: 22 | 23 | *vmin*: [ None | float ] 24 | Minimum pixel value to use for the scaling. 25 | 26 | *vmax*: [ None | float ] 27 | Maximum pixel value to use for the scaling. 28 | 29 | *stretch*: [ 'linear' | 'log' | 'sqrt' | 'arcsinh' | 'power' ] 30 | The stretch function to use (default is 'linear'). 31 | 32 | *vmid*: [ None | float ] 33 | Mid-pixel value used for the log and arcsinh stretches. If 34 | set to None, a default value is picked. 35 | 36 | *exponent*: [ float ] 37 | if self.stretch is set to 'power', this is the exponent to use. 38 | 39 | *clip*: [ True | False ] 40 | If clip is True and the given value falls outside the range, 41 | the returned value will be 0 or 1, whichever is closer. 42 | ''' 43 | 44 | if vmax < vmin: 45 | raise Exception("vmax should be larger than vmin") 46 | 47 | # Call original initalization routine 48 | Normalize.__init__(self, vmin=vmin, vmax=vmax, clip=clip) 49 | 50 | # Save parameters 51 | self.stretch = stretch 52 | self.exponent = exponent 53 | 54 | if stretch == 'power' and np.equal(self.exponent, None): 55 | raise Exception("For stretch=='power', an exponent should be specified") 56 | 57 | if np.equal(vmid, None): 58 | if stretch == 'log': 59 | if vmin > 0: 60 | self.midpoint = vmax / vmin 61 | else: 62 | raise Exception("When using a log stretch, if vmin < 0, then vmid has to be specified") 63 | elif stretch == 'arcsinh': 64 | self.midpoint = -1. / 30. 65 | else: 66 | self.midpoint = None 67 | else: 68 | if stretch == 'log': 69 | if vmin < vmid: 70 | raise Exception("When using a log stretch, vmin should be larger than vmid") 71 | self.midpoint = (vmax - vmid) / (vmin - vmid) 72 | elif stretch == 'arcsinh': 73 | self.midpoint = (vmid - vmin) / (vmax - vmin) 74 | else: 75 | self.midpoint = None 76 | 77 | def __call__(self, value, clip=None): 78 | 79 | #read in parameters 80 | method = self.stretch 81 | exponent = self.exponent 82 | midpoint = self.midpoint 83 | 84 | # ORIGINAL MATPLOTLIB CODE 85 | 86 | if clip is None: 87 | clip = self.clip 88 | 89 | if cbook.iterable(value): 90 | vtype = 'array' 91 | val = ma.asarray(value).astype(np.float) 92 | else: 93 | vtype = 'scalar' 94 | val = ma.array([value]).astype(np.float) 95 | 96 | self.autoscale_None(val) 97 | vmin, vmax = self.vmin, self.vmax 98 | if vmin > vmax: 99 | raise ValueError("minvalue must be less than or equal to maxvalue") 100 | elif vmin == vmax: 101 | return 0.0 * val 102 | else: 103 | if clip: 104 | mask = ma.getmask(val) 105 | val = ma.array(np.clip(val.filled(vmax), vmin, vmax), 106 | mask=mask) 107 | result = (val - vmin) * (1.0 / (vmax - vmin)) 108 | 109 | # CUSTOM APLPY CODE 110 | 111 | # Keep track of negative values 112 | negative = result < 0. 113 | 114 | if self.stretch == 'linear': 115 | 116 | pass 117 | 118 | elif self.stretch == 'log': 119 | 120 | result = ma.log10(result * (self.midpoint - 1.) + 1.) \ 121 | / ma.log10(self.midpoint) 122 | 123 | elif self.stretch == 'sqrt': 124 | 125 | result = ma.sqrt(result) 126 | 127 | elif self.stretch == 'arcsinh': 128 | 129 | result = ma.arcsinh(result / self.midpoint) \ 130 | / ma.arcsinh(1. / self.midpoint) 131 | 132 | elif self.stretch == 'power': 133 | 134 | result = ma.power(result, exponent) 135 | 136 | else: 137 | 138 | raise Exception("Unknown stretch in APLpyNormalize: %s" % 139 | self.stretch) 140 | 141 | # Now set previously negative values to 0, as these are 142 | # different from true NaN values in the FITS image 143 | result[negative] = -np.inf 144 | 145 | if vtype == 'scalar': 146 | result = result[0] 147 | 148 | return result 149 | 150 | def inverse(self, value): 151 | 152 | # ORIGINAL MATPLOTLIB CODE 153 | 154 | if not self.scaled(): 155 | raise ValueError("Not invertible until scaled") 156 | 157 | vmin, vmax = self.vmin, self.vmax 158 | 159 | # CUSTOM APLPY CODE 160 | 161 | if cbook.iterable(value): 162 | val = ma.asarray(value) 163 | else: 164 | val = value 165 | 166 | if self.stretch == 'linear': 167 | 168 | pass 169 | 170 | elif self.stretch == 'log': 171 | 172 | val = (ma.power(10., val * ma.log10(self.midpoint)) - 1.) / (self.midpoint - 1.) 173 | 174 | elif self.stretch == 'sqrt': 175 | 176 | val = val * val 177 | 178 | elif self.stretch == 'arcsinh': 179 | 180 | val = self.midpoint * \ 181 | ma.sinh(val * ma.arcsinh(1. / self.midpoint)) 182 | 183 | elif self.stretch == 'power': 184 | 185 | val = ma.power(val, (1. / self.exponent)) 186 | 187 | else: 188 | 189 | raise Exception("Unknown stretch in APLpyNormalize: %s" % 190 | self.stretch) 191 | 192 | return vmin + val * (vmax - vmin) -------------------------------------------------------------------------------- /build/lib/pydoppler/test_data/output_images/Average_Spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/build/lib/pydoppler/test_data/output_images/Average_Spec.png -------------------------------------------------------------------------------- /build/lib/pydoppler/test_data/output_images/Doppler_Map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/build/lib/pydoppler/test_data/output_images/Doppler_Map.png -------------------------------------------------------------------------------- /build/lib/pydoppler/test_data/output_images/Reconstruction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/build/lib/pydoppler/test_data/output_images/Reconstruction.png -------------------------------------------------------------------------------- /build/lib/pydoppler/test_data/output_images/Trail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/build/lib/pydoppler/test_data/output_images/Trail.png -------------------------------------------------------------------------------- /build/lib/pydoppler/test_data/sample_script.py: -------------------------------------------------------------------------------- 1 | import pydoppler 2 | import matplotlib.pyplot as plt 3 | # Import sample data 4 | # <<< COMMENT OUT IF YOU DONT NEED THE TEST DATASET >>> 5 | pydoppler.test_data() 6 | 7 | # Load base object for tomography 8 | dop = pydoppler.spruit() 9 | 10 | # Basic data for the tomography to work 11 | dop.object = 'U Gem' 12 | dop.base_dir = 'ugem99' # Base directory for input spectra 13 | dop.list = 'ugem0all.fas' # Name of the input file 14 | dop.lam0 = 6562.8 # Wavelength zero in units of the original spectra 15 | dop.delta_phase = 0.003 16 | dop.delw = 35 # size of Doppler map in wavelenght 17 | dop.overs = 0.3 # between 0-1, Undersampling of the spectra. 1= Full resolution 18 | dop.gama = 36.0 # km /s 19 | dop.nbins = 28 20 | 21 | # Read in the individual spectra and orbital phase information 22 | dop.Foldspec() 23 | 24 | # Normalise the spectra 25 | dop.Dopin(continnum_band=[6500,6537,6591,6620], 26 | plot_median=False,poly_degree=2) 27 | 28 | # Perform tomography 29 | dop.Syncdop(ndi=0.7,nri=0.9) 30 | 31 | # This routine will display the outcome of the Doppler tomography. 32 | # You can overplot contours and streams. 33 | cb,data = dop.Dopmap(limits=[0.05,0.99],colorbar=False,cmaps=plt.cm.magma_r, 34 | smooth=False,remove_mean=False) 35 | 36 | # Overplot the donor contours, keplerian and ballistic streams 37 | qm=0.35 38 | k1 = 107 39 | inc=70 40 | m1=1.2 41 | porb=0.1769061911 42 | 43 | pydoppler.stream(qm,k1,porb,m1,inc) 44 | 45 | # Always check that reconstructed spectra looks like the original one. A good 46 | # rule of thumb "If a feature on the Doppler tomogram isn not in the trail, 47 | # most likely its not real!" 48 | cb2,cb3,dmr,dm = dop.Reco(colorbar=False,limits=[.05,0.95],cmaps=plt.cm.magma_r) 49 | -------------------------------------------------------------------------------- /build/lib/pydoppler/test_data/ugem99/ugem0all.fas: -------------------------------------------------------------------------------- 1 | txhugem4004 0.7150 0.03930 2 | txhugem4005 0.7794 0.03930 3 | txhugem4006 0.8348 0.03930 4 | txhugem4007 0.8942 0.03930 5 | txhugem4008 0.9518 0.03930 6 | txhugem4009 0.0072 0.03930 7 | txhugem4010 0.0632 0.03930 8 | txhugem4011 0.1186 0.03930 9 | txhugem4012 0.1745 0.03930 10 | txhugem4013 0.2344 0.03930 11 | txhugem4014 0.2904 0.03930 12 | txhugem4015 0.3724 0.03930 13 | txhugem4016 0.4283 0.03930 14 | txhugem4017 0.4866 0.03930 15 | txhugem4018 0.5425 0.03930 16 | txhugem4019 0.5979 0.03930 17 | txhugem4020 0.6544 0.03930 18 | txhugem4021 0.7098 0.03930 19 | txhugem4022 0.7652 0.03930 20 | txhugem4023 0.8195 0.03930 21 | txhugem4024 0.8772 0.03930 22 | txhugem4025 0.9269 0.03930 23 | txhugem4026 0.9614 0.03930 24 | txhugem4027 0.9959 0.03930 25 | txhugem4028 0.0304 0.03930 26 | txhugem4029 0.0648 0.03930 27 | txhugem4030 0.1027 0.03930 28 | txhugem4031 0.1372 0.03930 29 | -------------------------------------------------------------------------------- /dist/pydoppler-0.2.0-py3-none-any.whl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/dist/pydoppler-0.2.0-py3-none-any.whl -------------------------------------------------------------------------------- /dist/pydoppler-0.2.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/dist/pydoppler-0.2.0.tar.gz -------------------------------------------------------------------------------- /pydoppler.egg-info/PKG-INFO: -------------------------------------------------------------------------------- 1 | Metadata-Version: 2.1 2 | Name: pydoppler 3 | Version: 0.2.0 4 | Summary: A python wrapper for Henk Spruit's doppler tomography sowftare 5 | Home-page: https://github.com/alymantara/pydoppler 6 | Author: Juan V. Hernandez Santisteban 7 | Author-email: jvhs1@st-andrews.ac.uk 8 | License: UNKNOWN 9 | Description: UNKNOWN 10 | Platform: UNKNOWN 11 | Classifier: Programming Language :: Python :: 3 12 | Classifier: License :: OSI Approved :: MIT License 13 | Classifier: Operating System :: OS Independent 14 | Description-Content-Type: text/markdown 15 | -------------------------------------------------------------------------------- /pydoppler.egg-info/SOURCES.txt: -------------------------------------------------------------------------------- 1 | README.md 2 | pydoppler 3 | setup.cfg 4 | setup.py 5 | pydoppler/__init__.py 6 | pydoppler/mynormalize.py 7 | pydoppler/pydoppler.py 8 | pydoppler.egg-info/PKG-INFO 9 | pydoppler.egg-info/SOURCES.txt 10 | pydoppler.egg-info/dependency_links.txt 11 | pydoppler.egg-info/top_level.txt 12 | pydoppler/fortran_code/cclock.f 13 | pydoppler/fortran_code/clock.f 14 | pydoppler/fortran_code/dop.f 15 | pydoppler/fortran_code/dop.in 16 | pydoppler/fortran_code/emap.par 17 | pydoppler/fortran_code/emap_ori.par 18 | pydoppler/fortran_code/fort.10 19 | pydoppler/fortran_code/hclock.f 20 | pydoppler/fortran_code/iclock.f 21 | pydoppler/fortran_code/lobe.f 22 | pydoppler/fortran_code/makefile 23 | pydoppler/test_data/sample_script.py 24 | pydoppler/test_data/output_images/Average_Spec.png 25 | pydoppler/test_data/output_images/Doppler_Map.png 26 | pydoppler/test_data/output_images/Reconstruction.png 27 | pydoppler/test_data/output_images/Trail.png 28 | pydoppler/test_data/ugem99/txhugem4004 29 | pydoppler/test_data/ugem99/txhugem4005 30 | pydoppler/test_data/ugem99/txhugem4006 31 | pydoppler/test_data/ugem99/txhugem4007 32 | pydoppler/test_data/ugem99/txhugem4008 33 | pydoppler/test_data/ugem99/txhugem4009 34 | pydoppler/test_data/ugem99/txhugem4010 35 | pydoppler/test_data/ugem99/txhugem4011 36 | pydoppler/test_data/ugem99/txhugem4012 37 | pydoppler/test_data/ugem99/txhugem4013 38 | pydoppler/test_data/ugem99/txhugem4014 39 | pydoppler/test_data/ugem99/txhugem4015 40 | pydoppler/test_data/ugem99/txhugem4016 41 | pydoppler/test_data/ugem99/txhugem4017 42 | pydoppler/test_data/ugem99/txhugem4018 43 | pydoppler/test_data/ugem99/txhugem4019 44 | pydoppler/test_data/ugem99/txhugem4020 45 | pydoppler/test_data/ugem99/txhugem4021 46 | pydoppler/test_data/ugem99/txhugem4022 47 | pydoppler/test_data/ugem99/txhugem4023 48 | pydoppler/test_data/ugem99/txhugem4024 49 | pydoppler/test_data/ugem99/txhugem4025 50 | pydoppler/test_data/ugem99/txhugem4026 51 | pydoppler/test_data/ugem99/txhugem4027 52 | pydoppler/test_data/ugem99/txhugem4028 53 | pydoppler/test_data/ugem99/txhugem4029 54 | pydoppler/test_data/ugem99/txhugem4030 55 | pydoppler/test_data/ugem99/txhugem4031 56 | pydoppler/test_data/ugem99/ugem0all.fas -------------------------------------------------------------------------------- /pydoppler.egg-info/dependency_links.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /pydoppler.egg-info/top_level.txt: -------------------------------------------------------------------------------- 1 | pydoppler 2 | -------------------------------------------------------------------------------- /pydoppler/__init__.py: -------------------------------------------------------------------------------- 1 | __modules__ = ['pydoppler'] 2 | from .pydoppler import spruit, rebin_trail, stream, test_data 3 | 4 | __version__ = "0.2.0" 5 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/cclock.f: -------------------------------------------------------------------------------- 1 | subroutine clock(t) 2 | real*8 t 3 | real*4 ta(2) 4 | x=dtime(ta) 5 | t=t+ta(1) 6 | return 7 | end 8 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/clock.f: -------------------------------------------------------------------------------- 1 | subroutine clock(t) 2 | real*8 t 3 | real*4 ta(2) 4 | x=dtime(ta) 5 | t=t+ta(1) 6 | return 7 | end 8 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/dop.f: -------------------------------------------------------------------------------- 1 | program dopmap 2 | c Version 2.0 3 | c HCS 3-3-1999 4 | c version for arbitrary phase bins 5 | implicit real*8 (a-h,o-z) 6 | real*4 dpx 7 | include 'emap.par' 8 | common/phases/dpha(npm) 9 | c the 'd' lines are the nonsense IBM machines need to make them stop on an overflow. 10 | c include '/usr/include/fpdc.h' 11 | c include '/usr/include/fexcp.h' 12 | dimension dat(nd),pha(npm),vp(nvpm) 13 | real*4 p(ndi,nr),pt(nri,nd) 14 | dimension vmo(nr),vmb(nr),dato(nd),datb(nd),eb(nd) 15 | dimension reco(nvm,nvm),dpxu(nvm,nvm) 16 | character*20 spec 17 | character*80 idat 18 | common /folds/ nph,nvp 19 | common /foldn/ nv,indx(nr),indy(nr),nol 20 | common /difpix/ dpx(nr,4) 21 | common /cabsf/ wid,af 22 | c fpstat(fpve)=.true. 23 | c fpstat(fpoe)=.true. 24 | c fpstat(fpue)=.true. 25 | c fpstat(fpze)=.true. 26 | c fpstat(fpxe)=.false. 27 | c call fpsets(fpstat) 28 | c call signal(sigtrap,xl__trce) 29 | pi2=8*atan(1.) 30 | 31 | c read parameter file 32 | call repar(ns,ac,nim, 33 | * al0,alf,nal,clim,ipri,spec,ih,iw,pb0,pb1,norm) 34 | c set baseline level to be added to spectrum (fraction of the avg of entire spectrum) 35 | bfa=0.1 36 | write(*,'('' HOLAQQ NOW 2Q'')') 37 | c read input data 38 | open(4,file=spec) 39 | read(4,*) nph,nvp,w0 40 | read(4,'(a)') idat 41 | if (nph.ne.npm) call erri('nph.ne.npm',nph,npm) 42 | if (nvp.ne.nvpm) call erri('nvp.ne.npvm',nvp,nvpm) 43 | nv=nvm 44 | nil=nvp*nph 45 | read(4,*) (pha(i),i=1,nph) 46 | read(4,*) iph 47 | if (iph.eq.1) then 48 | read(4,*) (dpha(i),i=1,nph) 49 | else 50 | do i=1,nph 51 | dpha(i)=1./nph 52 | enddo 53 | endif 54 | do i=1,nph 55 | pha(i)=pha(i)*pi2 56 | dpha(i)=dpha(i)*pi2 57 | enddo 58 | c make blanking array corresponding to (pb0,pb1) 59 | call blanks(pha,nph,pb0,pb1) 60 | read(4,*) (vp(i),i=1,nvp) 61 | read(4,*) (dat(i),i=1,nil) 62 | if (iw.eq.1) read(4,*) (eb(i),i=1,nil) 63 | close(4) 64 | call clock(t1) 65 | call prom(va,nv,pha,nph,vp,nvp,pt,p) 66 | call clock(t2) 67 | write(10,'('' cpu for geometry'',f10.2)')t2-t1 68 | if (ipri.gt.0) write(*,'('' cpu for geometry'',f10.2)')t2-t1 69 | t1=t2 70 | c compute a baseline flux to add to dat 71 | call basel(dat,nph,nvp,bfa,bf,nv,va,pt,datb,vmb) 72 | c add baseline to dat, put weighting map into dato 73 | do i=1,nil 74 | dat(i)=dat(i)+datb(i) 75 | if (dat(i).lt.bf/3) then 76 | dat(i)=1e-5*bf 77 | dato(i)=0 78 | else 79 | dato(i)=1 80 | endif 81 | enddo 82 | c normalize to constant wavelength-integrated flux 83 | if (norm.eq.1) call norms(dat,pb0,pb1,pha,nph,nvp) 84 | c sum of light 85 | sdat=0 86 | do i=1,nil 87 | sdat=sdat+dat(i) 88 | enddo 89 | 90 | c make error bars relative 91 | do i=1,nil 92 | eb(i)=eb(i)/dat(i) 93 | enddo 94 | c weights 95 | call weighd(dat,datb,pha,nph,nvp,eb,iw) 96 | 97 | c reconstruction 98 | c initialize (flat) 99 | write(*,'('' HOLAQQQQ'')') 100 | do j=1,nol 101 | vmo(j)=sdat/nol 102 | enddo 103 | c decreasing sequence of alfas until required fit to input data 104 | call alfs(dat,eb,iw,p,pt,al0,alf,nal,ac,nim,vmo, 105 | * dato,nil,nol,nit,al,rr,ns,ih,clim,ipri,ier,t2,sx) 106 | if (ier.eq.2) then 107 | write(*,'('' no converged models, returning starting image'')') 108 | al=al0 109 | rr=100 110 | endif 111 | if (ier.eq.1) write(*,'('' last converged model has rr='', 112 | * f7.4,'', >clim='',f7.4)') rr,clim 113 | if (ipri.gt.0) write(*,'('' entropy'', 1pe12.4)')sx 114 | c make an identification number 115 | s1=0 116 | s2=0 117 | m=max(1,nol/30) 118 | do i=1,nol,m 119 | s1=s1+vmo(i) 120 | enddo 121 | m=max(1,nil/30) 122 | do i=1,nil,m 123 | s2=s2+dat(i) 124 | enddo 125 | fident=sin(100*(s1/s2)) 126 | c normalize dopmap to input units (probably mJy's) x Hz per (cm/s)^2 in v-space 127 | c velocity grid size 128 | dv=2*va/(nv-1) 129 | delv2=dv**2 130 | c frequency grid size 131 | dev=(vp(nvp)-vp(1))/(nvp-1) 132 | denu=dev/w0*1e8 133 | do i=1,nol 134 | vmo(i)=(vmo(i)-vmb(i))/delv2*denu 135 | enddo 136 | c make unfolded reconstructed image 137 | do j=1,nol 138 | reco(indx(j),indy(j))=vmo(j) 139 | enddo 140 | 141 | open(3,file='dop.out') 142 | c write array sizes, w0, identification 143 | write(3,'(3i5,f10.3,f20.15)')nph,nvp,nvm,w0,fident 144 | c copy second line of input data file 145 | write(3,*)idat 146 | c copy phase and velocity coordinates of input spectrum 147 | write(3,'(1p8e13.4E3)')(pha(i),i=1,nph) 148 | write(3,*)iph 149 | if (iph.eq.1) write(3,'(1p8e13.4E3)')(dpha(i),i=1,nph) 150 | write(3,'(1p8e13.4E3)')(vp(i),i=1,nvp) 151 | c write input spectrum 152 | write(3,'(1p8e13.4E3)')(dat(i)-datb(i),i=1,nil) 153 | write(3,'(2i3,2f7.3,i4,2e13.4E3,f7.3,i3,e13.4E3,f7.3)') 154 | * ih,iw,pb0/pi2,pb1/pi2,ns,ac,al,clim,norm,wid,af 155 | c write dopmap and reco 156 | write(3,'(i4,1pe13.4E3,'' dopmap '')')nv,va 157 | write(3,'(1p6e13.4E3)')((reco(i,j),j=1,nv),i=1,nv) 158 | write(3,'(i6,'' reconstructed data '')')nil 159 | write(3,'(1p6e13.4E3)')(dato(i)-datb(i),i=1,nil) 160 | write(3,'(i6,'' 4 change maps '')')nv 161 | do ii=1,4 162 | do j=1,nol 163 | dpxu(indx(j),indy(j))=dpx(j,ii) 164 | enddo 165 | write(3,'(1p6e13.4E3)')((dpxu(i,j),j=1,nv),i=1,nv) 166 | enddo 167 | close(3) 168 | end 169 | 170 | c block data 171 | c include '/usr/include/fpdc.h' 172 | c include '/usr/include/fpdt.h' 173 | c end 174 | 175 | subroutine basel(dat,nph,nvp,bfa,bf,nv,va,pt,datb,vmb) 176 | c compute a baseline flux to get a flat background level in dopmap 177 | c datb is the data corresponding to a flat (circular) dopmap 178 | c vmb is the corresponding flat dopmap 179 | implicit real*8 (a-h,o-z) 180 | include 'emap.par' 181 | common /foldn/ nvf,indx(nr),indy(nr),nol 182 | dimension dat(*),datb(*),vmb(*) 183 | if (nol.gt.nr) call errb('nol>nr',nol,nr) 184 | 185 | c make circle of radius va on a zero background 186 | fv2=nv/2. 187 | dv=2*va/(nv-1) 188 | do ir=1,nol 189 | ix=indx(ir) 190 | iy=indy(ir) 191 | vx=dv*(ix-fv2-0.5) 192 | vy=dv*(iy-fv2-0.5) 193 | v=sqrt(vx**2+vy**2) 194 | vmb(ir)=0. 195 | if (v.lt.va) vmb(ir)=1 196 | enddo 197 | 198 | nil=nph*nvp 199 | c produce spectrum from this map 200 | call fproj(pt,nil,nol,vmb,datb) 201 | c value at v=0 202 | d0=datb(nvp/2*nph) 203 | c find avg of dat 204 | avg=0. 205 | do i=1,nil 206 | avg=avg+dat(i) 207 | enddo 208 | avg=avg/nil 209 | c baseline level to add 210 | bf=bfa*avg 211 | c normalize datb 212 | do i=1,nil 213 | datb(i)=bf*datb(i)/d0 214 | enddo 215 | c normalize background map 216 | do j=1,nol 217 | vmb(j)=vmb(j)*bf/d0 218 | enddo 219 | return 220 | end 221 | 222 | subroutine blanks(pha,nph,pb0,pb1) 223 | c make blanking array corresponding to (pb0,pb1) 224 | c pb0-pb1: phase range with weight 0 (used for ignoring eclipsed part of data) 225 | implicit real*8 (a-h,o-z) 226 | include 'emap.par' 227 | dimension pha(*) 228 | common/blank/bl(npm) 229 | logical bl 230 | pi2=8*atan(1.) 231 | c get max and min values of phase 232 | phmin=pha(1) 233 | phmax=pha(1) 234 | do i=2,nph 235 | if (pha(i).lt.phmin) phmin=pha(i) 236 | if (pha(i).gt.phmax) phmax=pha(i) 237 | enddo 238 | c number of cycles present 239 | nphmi=int(phmin/pi2) 240 | if (nphmi.lt.0.) nphmi=nphmi-1 241 | nphma=int(phmax/pi2) 242 | if (nphma.lt.0.) nphma=nphma-1 243 | c reduce blanking region to phases around 0 244 | npb1=int(pb1/pi2) 245 | if (npb1.lt.0.) npb1=npb1-1 246 | pb0=pb0-npb1*pi2 247 | pb1=pb1-npb1*pi2 248 | do i=1,nph 249 | c use only non-blanked region for making average 250 | bl(i)=.false. 251 | do ic=nphmi,nphma+1 252 | if (pha(i).gt.pb0+ic*pi2.and.pha(i).lt.pb1+ic*pi2) 253 | * bl(i)=.true. 254 | enddo 255 | enddo 256 | return 257 | end 258 | 259 | subroutine norms(dat,pb0,pb1,pha,nph,nvp) 260 | c normalize by a phase-dependent factor to make wavelength-integrated 261 | c light constant with phase. 262 | implicit real*8 (a-h,o-z) 263 | include 'emap.par' 264 | dimension dat(npm,nvpm),pha(*),wi(npm) 265 | common/blank/bl(npm) 266 | logical bl 267 | pi2=8*atan(1.) 268 | ws=0 269 | np=0 270 | c use only non-blanked region for making average 271 | do i=1,nph 272 | wi(i)=0 273 | if (.not.bl(i)) then 274 | np=np+1 275 | do j=1,nvp 276 | wi(i)=wi(i)+dat(i,j) 277 | enddo 278 | endif 279 | ws=ws+wi(i) 280 | enddo 281 | ws=ws/np 282 | do i=1,nph 283 | wi(i)=wi(i)/ws 284 | enddo 285 | c measure minimum of wi 286 | wim=0 287 | do i=1,nph 288 | if (wi(i).lt.wim) wim=wi(i) 289 | enddo 290 | c set an overall level to be added before normalization 291 | wl=0 292 | wlm=0.3 293 | if (wim.lt.wlm) then wl=wlm-wim 294 | do i=1,nph 295 | if (wi(i).ne.0.) then 296 | do j=1,nvp 297 | dat(i,j)=dat(i,j)*(1+wl)/(wi(i)+wl) 298 | enddo 299 | endif 300 | enddo 301 | return 302 | end 303 | 304 | subroutine alfs(dat,eb,iw,p,pt,al0,alf,nal,ac,nim,vmo, 305 | * dato,nil,nol,nit,alx,rr,ns,ih,clim,ipri,ier,t2,sx) 306 | c sequence of models with decreasing alfas, starting at al0, in factors 307 | c of alf, max no of models nal, each converged to accuracy ac, until 308 | c rms difference with input data dat is less than clim 309 | c ier=0: normal return 310 | c ier=1: last converged model differs more than clim from input light curve 311 | c ier=2: no converged models in entire sequence 312 | implicit real*8 (a-h,o-z) 313 | include 'emap.par' 314 | c dopmaps 315 | dimension vm1(nr),vmo(*) 316 | c projection matrix 317 | real*4 p(nfp,nr),pt(nrp,nf) 318 | c input data 319 | dimension dat(nd),eb(nd),dat1(nd),dato(nd) 320 | c parameters of penalty functions 321 | logical cont 322 | ier=0 323 | c copy input into temporary image 324 | do j=1,nol 325 | vm1(j)=vmo(j) 326 | enddo 327 | c initialize number of converged models 328 | nco=0 329 | c alpha- loop 330 | rr=100 331 | ial=0 332 | cont=.true. 333 | call clock(t2) 334 | t1=t2 335 | c if nal<0 converge abs(nal) models irrespective of clim 336 | if (nal.lt.0) then 337 | nal1=-nal 338 | else 339 | nal1=nal 340 | endif 341 | do while (ial.lt.nal1.and.(rr.gt.clim.or.nal.lt.0).and.cont) 342 | ial=ial+1 343 | c next alfa value 344 | if (nal.lt.0) then 345 | al=al0*alf**(1-ial) 346 | else 347 | al=alfa(al0,ial,alf,rr,clim) 348 | endif 349 | aci=ac 350 | flim=1e5 351 | c converge with Lucy's ME scheme 352 | call rldop(dat,p,pt,al,ac,flim,nim,vm1,nil,nol,nit,hs, 353 | * ns,ih,ipri,sf,ierr) 354 | if (ierr.eq.1) write(10,'('' not converged'')') 355 | if (ierr.eq.2) write(10,'('' not monotonic'')') 356 | if (ierr.eq.3) write(10,'('' not converged, not monotonic'')') 357 | if (ierr.eq.4) write(10,'('' stuck at vanishing updates'')') 358 | if (ipri.gt.0) then 359 | if (ierr.eq.1) write(*,'('' not converged'')') 360 | if (ierr.eq.2) write(*,'('' not monotonic'')') 361 | if (ierr.eq.3) write(*,'('' not converged, not monotonic'')') 362 | if (ierr.eq.4) write(*,'('' stuck at vanishing updates'')') 363 | endif 364 | c reconstructed spectrum 365 | call fproj(pt,nil,nol,vm1,dat1) 366 | c converged at this alpha, save. 367 | nco=nco+1 368 | do j=1,nol 369 | vmo(j)=vm1(j) 370 | enddo 371 | do k=1,nil 372 | dato(k)=dat1(k) 373 | enddo 374 | alx=al 375 | sx=sf 376 | c rms difference w/r input light curve 377 | rr0=rr 378 | rr=rrms(dat,eb,iw,dat1,nil) 379 | if (iw.eq.0) then 380 | c measure accuracy of reconstruction relative to point-to-point noise in data 381 | rn=rmsn(dat,dat1) 382 | rr=rr/rn 383 | endif 384 | c summary of this iteration to activity log file 385 | write(10,'('' ni, al, hs, rr:'',i5, 386 | * f8.5,e17.9,2f8.5)')nit,al,hs,rr,clim 387 | call clock(t2) 388 | write(10,'('' cpu for iteration'',f8.2)')t2-t1 389 | if (ipri.gt.0) then 390 | write(*,'('' ni, al, hs, rr:'',i5, 391 | * f8.5,e17.9,2f8.5)')nit,al,hs,rr,clim 392 | write(*,'('' cpu for iteration'',f8.2)')t2-t1 393 | endif 394 | t1=t2 395 | c continue if no converged models found yet, or if acceptable error 396 | c return from last model 397 | cont = nco.eq.0.or.ierr.eq.0.or.ierr.eq.2 398 | enddo 399 | if (nco.eq.0) ier=2 400 | if (.not.cont) then 401 | ier=1 402 | rr=rr0 403 | endif 404 | return 405 | end 406 | 407 | subroutine repar(ns,ac,nim, 408 | * al0,alf,nal,clim,ipri,spec,ih,iw,pb0,pb1,norm) 409 | c read input parameters 410 | implicit real*8 (a-h,o-z) 411 | include 'emap.par' 412 | character*(*) spec 413 | character*40 txt 414 | c output channels 415 | dimension kch(2) 416 | common /fold/ nvx,nvy 417 | common /cabsf/ wid,af 418 | pi2=8*atan(1.) 419 | c input data file 420 | open(4,file='dop.in') 421 | c type of likelihood to be used (0=log, 1=weighted log, 2=rms, 3=weighted rms) 422 | read(4,*)ih 423 | c read weights from lightcurve file if iw=1 424 | read(4,*)iw 425 | c read range of phases to be ignored in mapping and convert to radians 426 | read(4,*)pb0,pb1 427 | if(pb1-1.gt.pb0) call errb('all phases ignored:',pb0,pb1) 428 | if(pb1.lt.pb0) call errb('pb0 must be nr in prom',ir,nr) 602 | indx(ir)=ix 603 | indy(ir)=iy 604 | do ip=1,nph 605 | c line-of sight velocity at phase bin edges 606 | vp0=vx*sfl(ip)-vy*cfl(ip) 607 | vp1=vx*sfu(ip)-vy*cfu(ip) 608 | if (vp0.gt.vp1) then 609 | vpma=vp0+dv/2 610 | vpmi=vp1-dv/2 611 | else 612 | vpma=vp1+dv/2 613 | vpmi=vp0-dv/2 614 | endif 615 | c estimate near which line-sight bins these are 616 | ka=(vpma-vpl(1))/dvi+1 617 | ki=(vpmi-vpl(1))/dvi+1 618 | if (vpmi.lt.vpl(-1)) 619 | * call errb('vpmi,vpl(-1):',vpmi,vpl(-1)) 620 | if (vpma.gt.vpl(nvp+2)) 621 | * call errb('vpma,vpl(nvp+2):',vpma,vpl(nvp+2)) 622 | c get first vpl(i)nd in weighd',nil,nd) 806 | do i=1,nph 807 | do j=1,nvp 808 | inp=i+(j-1)*nph 809 | w(inp)=1 810 | if (f0(inp).eq.0.) w(inp)=0 811 | if (bl(i)) w(inp)=0 812 | enddo 813 | enddo 814 | if (iw.eq.1) then 815 | c multiply by weights from error bars 816 | do i=1,nil 817 | w(i)=w(i)*f(i)/eb(i) 818 | enddo 819 | endif 820 | c normalize to average=1 821 | x=0 822 | do i=1,nil 823 | x=x+w(i) 824 | enddo 825 | do i=1,nil 826 | w(i)=w(i)/x*nph 827 | enddo 828 | return 829 | end 830 | 831 | subroutine rldop(pht,p,pt,al,ac,flim,nim,ps,nil,nol,nit,hs, 832 | * ns,ih,ipri,s,ierr) 833 | c interface to rlfldn for doppler mapping 834 | c RL iteration with floating default, converged to accuracy ac 835 | c input: 836 | c pht: input data, nil: length of input data, nol: length of solution 837 | c p(i,j): probability p(x|xi), al: entropy weight, ac: accuracy of convergence, 838 | c pt: transpose of p, 839 | c flim: max acceleration parameter, nim: max no of iterations 840 | c ns: smearing width (passed on to chims) 841 | c ih: type of likelihood function (subroutines like, lamun) 842 | c ipri: printout control 843 | c out: 844 | c ps: solution, nit: no of iterations, hs: optimum function Q. 845 | c nit: number of iterations 846 | c s: entropy 847 | c ierr: 0 (OK), 1 (not converged) or 2 (not monotonic) 848 | implicit real*8 (a-h,o-z) 849 | dimension pht(*),p(*),pt(*),ps(*) 850 | dum=0 851 | idum=1 852 | epc=1 853 | call rlfldn(pht,p,pt,al,ac,flim,nim,ps,nil,nol,nit,hs, 854 | * idum,idum,ns,epc,idum,dum,idum,ih,ipri,dum,s,ierr) 855 | return 856 | end 857 | 858 | subroutine chims(ps,chi,id1,id2,id3,ns,du1,id4,du2,id5,du3) 859 | c default map routine to interface dopmap with emap routines 860 | c id1-5 and du1-3 are dummies 861 | implicit real*8 (a-h,o-z) 862 | include 'emap.par' 863 | dimension ps(*),chi(nr) 864 | dimension x2(nvm,nvm),y2(nvm,nvm) 865 | common /foldn/ nv,indx(nr),indy(nr),nol 866 | c reset x2 867 | do i=1,nv 868 | do j=1,nv 869 | x2(i,j)=0 870 | enddo 871 | enddo 872 | c fold x into x2 using `backdoor' information from /foldn/ 873 | do j=1,nol 874 | x2(indx(j),indy(j))=ps(j) 875 | enddo 876 | ic=0 877 | jc=0 878 | im=1 879 | call chimg(x2,y2,nv,ic,nv,jc,im,ns) 880 | c unfold y2 881 | do j=1,nol 882 | chi(j)=y2(indx(j),indy(j)) 883 | enddo 884 | return 885 | end 886 | 887 | subroutine chimsi(ps,chi,id,k,nc,inc,ns,epc,ico,rdf,msu,wbkg) 888 | c default map routine to interface dopmap with emap routines. 889 | c since there are no sub-surfaces in dopmap, chimsi does the same thing 890 | c as chims 891 | implicit real*8 (a-h,o-z) 892 | call chims(ps,chi,id,nc,inc,ns,epc,ico,rdf,msu,wbkg) 893 | return 894 | end 895 | 896 | subroutine wpar(npm,nvpm,nvm,nri,ndi) 897 | c write a parameter file with updated values for npm,nvpm,nvm,nri,ndi 898 | implicit real*8 (a-h,o-z) 899 | open(11,file='emap.par.new') 900 | write(11,'('' parameter (npm='',i3,'',nvpm='',i3, 901 | * '',nvm='',i3,'')'')')npm,nvpm,nvm 902 | write(11,'('' parameter (nd=npm*nvpm,nr=nvm*nvm)'')') 903 | write(11,'('' parameter (nri='',i4,'',ndi='',i4,'')'')') 904 | * nri,ndi 905 | write(11,'(''c parameters for emap routines'')') 906 | write(11,'('' parameter (nf=nd,nfp=ndi,nrp=nri)'')') 907 | write(11,'('' parameter (ni=nvm,nj=nvm)'')') 908 | write(11,'('' parameter (nch=1,nsu=1)'')') 909 | close(11) 910 | return 911 | end 912 | 913 | function alfa(al0,ial,alf,rr,clim) 914 | c next alfa value. last value is chosen to land rr close to clim 915 | implicit real*8 (a-h,o-z) 916 | common /alkeep/ rr2,rr1 917 | rr1=rr2 918 | rr2=rr 919 | if (rr.gt.sqrt(alf)*clim.or.ial.lt.3) then 920 | al=al0/alf**(ial-1) 921 | else 922 | dl2=log(rr1/rr2) 923 | dl=log(rr/clim) 924 | x=dl/dl2 925 | if (x.gt.1.) then 926 | al=al0/alf**(ial-1) 927 | else 928 | alfr=exp(x*log(alf)) 929 | al=al0/alf**(ial-2)/alfr 930 | endif 931 | endif 932 | alfa=al 933 | return 934 | end 935 | 936 | subroutine chimg(x2,y2,nam,ic,nbm,jc,im,ns) 937 | c gaussian smearing with half-width ns, by consecutive 1-d smearing in x and y 938 | implicit real*8 (a-h,o-z) 939 | include 'emap.par' 940 | parameter (ms=100) 941 | dimension x2(ni,nj), y2(ni,nj) 942 | common /first/ smp(-ms:ms),ns0,ns1 943 | dimension t1(-ms:ni+ms),t2(-ms:nj+ms) 944 | if (ns0.ne.ns) then 945 | c (re)make smearing matrix smp if value of ns is new. 946 | w=1.5 947 | c actual smearing width used is w times 1/e width 948 | ns1=w*ns 949 | if (ns1.gt.ms) call errb('ns1>ms in chimg',ns1,ms) 950 | ns0=ns 951 | s=0 952 | do i=-ns1,ns1 953 | smp(i)=exp(-float(i*i)/ns**2) 954 | s=s+smp(i) 955 | enddo 956 | c normalize 957 | do i=-ns1,ns1 958 | smp(i)=smp(i)/s 959 | enddo 960 | endif 961 | 962 | c smear in j-direction 963 | do i=1,nam 964 | c extend ith column of x2 into t2, taking properties of boundary into account 965 | do j=-ns1,0 966 | if (jc.eq.1) then 967 | c wraparound 968 | t2(j)=x2(i,j+nbm) 969 | else 970 | c fold back 971 | t2(j)=x2(i,2-j-1) 972 | endif 973 | enddo 974 | do j=1,nbm 975 | t2(j)=x2(i,j) 976 | enddo 977 | do j=nbm+1,nbm+ns1 978 | if (jc.eq.1) then 979 | t2(j)=x2(i,j-nbm) 980 | else 981 | t2(j)=x2(i,2*nbm-j+1) 982 | endif 983 | enddo 984 | c smear t2, result into y2 985 | do j=1,nbm 986 | s=0 987 | do js=-ns1,ns1 988 | s=s+t2(j+js)*smp(js) 989 | enddo 990 | y2(i,j)=s 991 | enddo 992 | enddo 993 | 994 | c smear in i-direction 995 | do j=1,nbm 996 | c extend jth row of y2 into t1, taking properties of boundary into account 997 | do i=-ns1,0 998 | if (ic.eq.1) then 999 | c wraparound 1000 | t1(i)=y2(i+nam,j) 1001 | else 1002 | c fold back 1003 | t1(i)=y2(2-i-1,j) 1004 | endif 1005 | enddo 1006 | do i=1,nam 1007 | t1(i)=y2(i,j) 1008 | enddo 1009 | do i=nam+1,nam+ns1 1010 | if (ic.eq.1) then 1011 | t1(i)=y2(i-nam,j) 1012 | else 1013 | t1(i)=y2(2*nam-i+1,j) 1014 | endif 1015 | enddo 1016 | c smear t1, result into y2 1017 | do i=1,nam 1018 | s=0 1019 | do is=-ns1,ns1 1020 | s=s+t1(i+is)*smp(is) 1021 | enddo 1022 | y2(i,j)=s 1023 | enddo 1024 | enddo 1025 | return 1026 | end 1027 | 1028 | subroutine rlfldn(pht,p,pt,al,ac,flim,nim,ps,nil,nol,nit,hs, 1029 | * nc,inc,ns,epc,ico,rdf,msu,ih,ipri,wbkg,s,ierr) 1030 | c RL iteration with floating default, converged to accuracy ac 1031 | c input: 1032 | c pht: input data, nil: length of input data, nol: length of solution 1033 | c p(i,j): probability p(x|xi), al: entropy weight, ac: accuracy of convergence, 1034 | c flim: max acceleration parameter, nim: max no of iterations 1035 | c nil: no of phases, nol: size of image, nc: no of components of default, 1036 | c epc: the weights of each of these components, inc: indices for the types of 1037 | c component. 1038 | c out: 1039 | c ps: solution, nit: no of iterations, hs: optimum function Q. 1040 | c ih: type of likelihood function (subroutines like, lamun) 1041 | c ierr: 0 (OK), 1 (not converged) or 2 (not monotonic) 1042 | c ipri: printout control 1043 | implicit real*8 (a-h,o-z) 1044 | real*4 dpx 1045 | include 'emap.par' 1046 | dimension pht(*),ps(*),inc(nch,nsu),ns(nch,nsu),epc(*),ico(*) 1047 | real*4 p(nfp,nr),pt(nrp,nf) 1048 | dimension ph(nf),dha(nr),dsa(nr),chi(nr,nch),tem(nr), 1049 | * ex(nr),dps(nr),dps0(nr) 1050 | common /difpix/ dpx(nr,4) 1051 | ierr=0 1052 | del=1 1053 | nit=0 1054 | hs=0 1055 | c sum of light curve 1056 | spt=0 1057 | do i=1,nil 1058 | spt=spt+pht(i) 1059 | enddo 1060 | do while (del.gt.ac.and.nit.lt.nim) 1061 | nit=nit+1 1062 | c phi (forward projection step) 1063 | call fproj(pt,nil,nol,ps,ph) 1064 | c magic statement: On HP's, code crashes with bus error if this line is removed: 1065 | if (nit.lt.0) write(*,*)1 1066 | if (al.le.0.) then 1067 | c measure convergence by diff between ph and pht 1068 | av=0 1069 | sm=0 1070 | do i=1,nil 1071 | av=av+pht(i) 1072 | sm=sm+(pht(i)-ph(i))**2 1073 | enddo 1074 | rm=sqrt(sm/nil) 1075 | av=av/nil 1076 | del=rm/av 1077 | endif 1078 | c H and dH/dpsi 1079 | call like(pht,ph,p,nil,nol,ih,h,dha) 1080 | c sum of psi*dH/dpsi and sum of psi 1081 | su=0 1082 | sup=0 1083 | do j=1,nol 1084 | su=su+ps(j)*dha(j) 1085 | sup=sup+ps(j) 1086 | enddo 1087 | c delta-H (in same array as dha) 1088 | do j=1,nol 1089 | dha(j)=dha(j)+(-su/sup+spt/sup-1) 1090 | enddo 1091 | c entropy 1092 | if (al.gt.0.) call entr(ps,nil,nol,s,dsa,chi,tem,ex,nc,inc,ns, 1093 | * epc,ico,rdf,msu,wbkg) 1094 | c sum of psi*dS/dpsi 1095 | su=0 1096 | do k=1,nol 1097 | su=su+ps(k)*dsa(k) 1098 | enddo 1099 | c Delta-S (in same array as dsa) 1100 | do j=1,nol 1101 | dsa(j)=dsa(j)-su/sup 1102 | enddo 1103 | c save old value of Q 1104 | hs0=hs 1105 | c current value of Q 1106 | hs=h+al*s 1107 | c warning if not monotonic 1108 | if (nit.ne.1.and.hs.lt.hs0) ierr=2 1109 | c new dpsi 1110 | do j=1,nol 1111 | dps(j)=ps(j)*(dha(j)+al*dsa(j)) 1112 | enddo 1113 | if (nit.eq.1) then 1114 | do j=1,nol 1115 | dps0(j)=dps(j) 1116 | enddo 1117 | endif 1118 | 1119 | c determine optimum direction and factor for update, from dps0 and dps. 1120 | c (generalization of Lucy's acceleration) 1121 | c derivatives of Q w/r to lambda and mu at current psi 1122 | call lamun(pht,ps,dps0,dps,pt,ph,chi,tem,ex,al,nil,nol, 1123 | * fla,fmu,nc,inc,ns,epc,ico,rdf,msu,ih,wbkg) 1124 | c length of multiplier 1125 | amu=sqrt(fla**2+fmu**2) 1126 | c direction (normalized) of optimum 1127 | fla=fla/amu 1128 | fmu=fmu/amu 1129 | c find max of amu 1130 | flm=0 1131 | jlm=0 1132 | do j=1,nol 1133 | c value of prospective update 1134 | xx=fla*dps0(j)+fmu*dps(j) 1135 | if (xx.lt.0) then 1136 | c positivity not maintained at this value of amu, get max 1137 | fl=-xx/ps(j) 1138 | if (fl.gt.flm) then 1139 | flm=fl 1140 | jlm=j 1141 | endif 1142 | endif 1143 | enddo 1144 | if (flm.gt.0.) then 1145 | c positivity restriction limits amu 1146 | c safety factor 0.9 1147 | flm=dmin1(flim,0.9/flm) 1148 | else 1149 | c take overall limit 1150 | flm=flim 1151 | endif 1152 | amu=dmin1(amu,flm) 1153 | c check if amu has been small for awhile 1154 | call zcheck(amu,nit,20,0.01d0,ierr) 1155 | if (ierr.eq.4) return 1156 | c having found amu, update psi 1157 | do j=1,nol 1158 | up=fmu*dps(j)+fla*dps0(j) 1159 | ps(j)=ps(j)+amu*up 1160 | c save direction of old dps 1161 | dps0(j)=up 1162 | enddo 1163 | 1164 | if (al.gt.0.) then 1165 | del=0 1166 | do j=1,nol 1167 | c measure of convergence (Lucy's eq 17) 1168 | dj=abs(dha(j)+al*dsa(j))/(abs(dha(j))+al*abs(dsa(j))) 1169 | del=del+dj**2 1170 | enddo 1171 | del=sqrt(del/nol) 1172 | endif 1173 | c store change 1174 | do j=1,nol 1175 | dpx(j,mod(nit,4)+1)=dha(j)+al*dsa(j) 1176 | enddo 1177 | c printout 1178 | if (nit.eq.1) then 1179 | write(10,'('' it H+alfa*S delta'')') 1180 | if (ipri.gt.1) 1181 | * write(*,'('' it H+alfa*S delta'')') 1182 | endif 1183 | if (nit.ne.1.and.hs.lt.hs0) then 1184 | c line summary to activity log file 1185 | write(10,'(i4,1pe20.12,e11.2,'' **'')')nit,hs,del 1186 | if (ipri.gt.1) 1187 | * write(*,'(i4,1pe20.12,e11.2,'' **'')')nit,hs,del 1188 | else 1189 | write(10,'(i4,1pe20.12,e11.2)')nit,hs,del 1190 | if (ipri.gt.1) 1191 | * write(*,'(i4,1pe20.12,e11.2)')nit,hs,del 1192 | endif 1193 | c renormalize (mostly to strip accumulating numerical noise) 1194 | su=0 1195 | do j=1,nol 1196 | su=su+ps(j) 1197 | enddo 1198 | do j=1,nol 1199 | ps(j)=ps(j)*spt/su 1200 | enddo 1201 | enddo 1202 | if (nit.ge.nim) then 1203 | c not converged at this value of ac 1204 | hs=0 1205 | c return last value of del 1206 | ac=del 1207 | c error flag 1208 | ierr=ierr+1 1209 | endif 1210 | return 1211 | end 1212 | 1213 | subroutine like(pht,ph,p,nil,nol,ih,h,dha) 1214 | c likelihood function h and its derivative w/r psi, dha 1215 | implicit real*8 (a-h,o-z) 1216 | include 'emap.par' 1217 | dimension pht(*),ph(*),dha(*) 1218 | real*4 p(nfp,nr) 1219 | dimension phh(nf) 1220 | common /weights/ w(nf) 1221 | h=0 1222 | if (ih.eq.0) then 1223 | c log likelihood 1224 | do i=1,nil 1225 | h=h+w(i)*(pht(i)*log(ph(i))-ph(i)) 1226 | enddo 1227 | else 1228 | c rms 1229 | do i=1,nil 1230 | h=h-w(i)*(pht(i)-ph(i))**2 1231 | enddo 1232 | c normalizing factor 1233 | h=h*nil 1234 | endif 1235 | c Delta-H 1236 | if (ih.eq.0) then 1237 | c log likelihood 1238 | do i=1,nil 1239 | phh(i)=w(i)*(pht(i)/ph(i)-1) 1240 | enddo 1241 | call bproj(p,nil,nol,phh,dha) 1242 | else 1243 | c rms 1244 | do i=1,nil 1245 | phh(i)=2*nil*w(i)*(pht(i)-ph(i)) 1246 | enddo 1247 | call bproj(p,nil,nol,phh,dha) 1248 | endif 1249 | return 1250 | end 1251 | 1252 | subroutine zcheck(amu,nit,nz,amc,ierr) 1253 | c set ierr=4 if past nz amu values were less than amc 1254 | implicit real*8 (a-h,o-z) 1255 | common /zsave/ am(30) 1256 | if (nz.gt.30) call errb('nz>30 in zcheck',nz,30) 1257 | am(mod(nit,nz)+1)=amu 1258 | if (nit.ge.nz) then 1259 | ama=0 1260 | do i=1,nz 1261 | if(am(i).gt.ama) ama=am(i) 1262 | enddo 1263 | if (ama.lt.amc) ierr=4 1264 | endif 1265 | return 1266 | end 1267 | 1268 | subroutine entr(ps,nil,nol,s,sp,chi,tem,ex,nc,inc,ns,epc,ico, 1269 | * rdf,msu,wbkg) 1270 | c entropy part of `objective function' Q. 1271 | c input: ps (current reconstruction), 1272 | c output: s (S), sp (dS/dpsi) 1273 | implicit real*8 (a-h,o-z) 1274 | include 'emap.par' 1275 | dimension ps(*),sp(*),chi(nr,nch),tem(*),ex(*),inc(nch,nsu), 1276 | * ns(nch,nsu),epc(*),ico(*) 1277 | dimension x(nr),y(nr,nch) 1278 | if (nc.gt.nch) call errb('nc>nch in entr',nc,nch) 1279 | c make chi's 1280 | call chims(ps,chi,1,nc,inc,ns,epc,ico,rdf,msu,wbkg) 1281 | c entropy 1282 | s=0 1283 | do j=1,nol 1284 | tem(j)=log(ps(j)) 1285 | ex(j)=0 1286 | do k=1,nc 1287 | if (epc(k).ne.0.) then 1288 | fe=epc(k)*log(chi(j,k)) 1289 | ex(j)=ex(j)+fe 1290 | tem(j)=tem(j)-fe 1291 | endif 1292 | enddo 1293 | ex(j)=exp(ex(j)) 1294 | s=s-ps(j)*(tem(j)-1)-ex(j) 1295 | enddo 1296 | c derivative wr to psi_j, first the psilogpsi part 1297 | do j=1,nol 1298 | sp(j)=-tem(j) 1299 | enddo 1300 | c add terms due to dependence of chi on psi 1301 | do k=1,nc 1302 | if (epc(k).ne.0.) then 1303 | do j=1,nol 1304 | x(j)=(ps(j)-ex(j))/chi(j,k) 1305 | enddo 1306 | call chimsi(x,y,-1,k,nc,inc,ns,epc,ico,rdf,msu,wbkg) 1307 | do j=1,nol 1308 | sp(j)=sp(j)+epc(k)*y(j,k) 1309 | enddo 1310 | endif 1311 | enddo 1312 | return 1313 | end 1314 | 1315 | subroutine lamun(pht,ps,dps1,dps2,pt,ph,chi,tem,ex,al,nil,nol, 1316 | * fla,fmu,nc,inc,ns,epc,ico,rdf,msu,ih,wbkg) 1317 | c optimal lambda and mu from first and second derivatives of Q 1318 | implicit real*8 (a-h,o-z) 1319 | include 'emap.par' 1320 | dimension pht(*),ps(*),dps1(*),dps2(*),ph(*),chi(nr,nch), 1321 | * tem(*),ex(*),inc(nch,nsu),ns(nch,nsu),epc(*),ico(*) 1322 | real*4 pt(nrp,nf) 1323 | dimension dph1(nf),dph2(nf),dch1(nr,nch),dch2(nr,nch) 1324 | common /weights/ w(nf) 1325 | c changes in phi and chi corresponding to dps0, dps 1326 | call fproj(pt,nil,nol,dps1,dph1) 1327 | call fproj(pt,nil,nol,dps2,dph2) 1328 | if (al.gt.0.) then 1329 | call chims(dps1,dch1,1,nc,inc,ns,epc,ico,rdf,msu,wbkg) 1330 | call chims(dps2,dch2,1,nc,inc,ns,epc,ico,rdf,msu,wbkg) 1331 | endif 1332 | c first and second derivatives 1333 | hl=0 1334 | hll=0 1335 | hm=0 1336 | hlm=0 1337 | hmm=0 1338 | sl=0 1339 | sll=0 1340 | sm=0 1341 | slm=0 1342 | smm=0 1343 | c likelihood term 1344 | if (ih.eq.0) then 1345 | c log likelihood 1346 | do i=1,nil 1347 | phw=pht(i)*w(i) 1348 | dpp=pht(i)/ph(i)-1 1349 | xl=dph1(i)/ph(i) 1350 | xm=dph2(i)/ph(i) 1351 | hl=hl+w(i)*dph1(i)*dpp 1352 | hll=hll-xl**2*phw 1353 | hlm=hlm-xl*xm*phw 1354 | hm=hm+w(i)*dph2(i)*dpp 1355 | hmm=hmm-xm**2*phw 1356 | enddo 1357 | else 1358 | c rms likelihood 1359 | do i=1,nil 1360 | x=pht(i)-ph(i) 1361 | xl=dph1(i) 1362 | xm=dph2(i) 1363 | hl=hl+2*w(i)*x*xl 1364 | hll=hll-2*w(i)*xl**2 1365 | hlm=hlm-2*w(i)*xl*xm 1366 | hm=hm+2*w(i)*x*xm 1367 | hmm=hmm-2*w(i)*xm**2 1368 | enddo 1369 | hl=hl*nil 1370 | hm=hm*nil 1371 | hll=hll*nil 1372 | hmm=hmm*nil 1373 | hlm=hlm*nil 1374 | endif 1375 | c entropy terms 1376 | if (al.gt.0.) then 1377 | do j=1,nol 1378 | pl=dps1(j)/ps(j) 1379 | pm=dps2(j)/ps(j) 1380 | tl=0 1381 | tm=0 1382 | tll=0 1383 | tmm=0 1384 | tlm=0 1385 | do k=1,nc 1386 | if (epc(k).ne.0.) then 1387 | dc1=dch1(j,k)/chi(j,k) 1388 | dc2=dch2(j,k)/chi(j,k) 1389 | tl=tl+epc(k)*dc1 1390 | tm=tm+epc(k)*dc2 1391 | tll=tll+epc(k)*dc1**2 1392 | tmm=tmm+epc(k)*dc2**2 1393 | tlm=tlm+epc(k)*dc1*dc2 1394 | endif 1395 | enddo 1396 | pz=ps(j)-ex(j) 1397 | sl=sl-dps1(j)*tem(j)+pz*tl 1398 | sm=sm-dps2(j)*tem(j)+pz*tm 1399 | sll=sll-ps(j)*(pl-tl)**2+pz*(tl**2-tll) 1400 | slm=slm-ps(j)*(pl-tl)*(pm-tm)+pz*(tl*tm-tlm) 1401 | smm=smm-ps(j)*(pm-tm)**2+pz*(tm**2-tmm) 1402 | enddo 1403 | endif 1404 | 1405 | ql=hl+al*sl 1406 | qll=hll+al*sll 1407 | qlm=hlm+al*slm 1408 | qm=hm+al*sm 1409 | qmm=hmm+al*smm 1410 | c calculate lambda and mu 1411 | dd=qmm*qll-qlm**2 1412 | dr=abs(dd)/(qll**2+qmm**2) 1413 | c if det of 2X2 system too small, use only mu 1414 | if (dr.lt.1e-3) then 1415 | fla=0 1416 | fmu=-qm/qmm 1417 | else 1418 | fmu=(qlm*ql-qll*qm)/dd 1419 | fla=(qlm*qm-qmm*ql)/dd 1420 | endif 1421 | return 1422 | end 1423 | 1424 | function rrms(f1,eb,iw,f0,n) 1425 | c rms of difference between f1 and f0 (iw=0) or 1426 | c rms distance between f1 and f0 normalized by the error bars eb (iw=1) 1427 | implicit real*8 (a-h,o-z) 1428 | dimension f1(*),eb(*),f0(*) 1429 | s=0 1430 | if (iw.eq.0) then 1431 | do i=1,n 1432 | s=s+(f1(i)-f0(i))**2 1433 | enddo 1434 | else 1435 | do i=1,n 1436 | s=s+((f1(i)-f0(i))/eb(i))**2 1437 | enddo 1438 | endif 1439 | rrms=sqrt(s/(n-1)) 1440 | return 1441 | end 1442 | 1443 | function rmsn(x,y) 1444 | implicit real*8 (a-h,o-z) 1445 | dimension x(*),y(*) 1446 | common/folds/nph,nvp 1447 | s=0 1448 | do i=2,nph-1 1449 | do j=2,nvp-1 1450 | i1=i+(j-2)*nph 1451 | i2=i1+nph 1452 | i3=i2+nph 1453 | s0=x(i1-1)+x(i1)+x(i1+1)+x(i2-1)+x(i2+1)+x(i3-1)+x(i3)+x(i3+1) 1454 | s1=y(i1-1)+y(i1)+y(i1+1)+y(i2-1)+y(i2+1)+y(i3-1)+y(i3)+y(i3+1) 1455 | s=s+((s1-s0)/8-(y(i2)-x(i2)))**2 1456 | enddo 1457 | enddo 1458 | s=s/(nph-2)/(nvp-2) 1459 | rmsn=sqrt(s) 1460 | return 1461 | end 1462 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/dop.in: -------------------------------------------------------------------------------- 1 | 0 ih type of likelihood function (ih=1 for chi-squared) 2 | 0 iw iw=1 if error bars are to be read and used 3 | 0.95 1.05 pb0,pb1 range of phases to be ignored 4 | 7 ns smearing width in default map 5 | 8e-4 ac accuracy of convergence 6 | 150 nim max no of iterations 7 | 0.002 1.7 0 al0,alf,nal starting value, factor, max number of alfas 8 | 1.6 clim 'C-aim' 9 | 2 ipri printout control for standard output channel (ipr=2 for full) 10 | 1 norm norm=1 for normalization to flat light curve 11 | 10e5 0 wid,af width and amplitude central absorption fudge 12 | end of parameter input file 13 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/emap.par: -------------------------------------------------------------------------------- 1 | parameter (npm= 28,nvpm= 477,nvm= 144) 2 | parameter (nd=npm*nvpm,nr=0.8*nvm*nvm) 3 | parameter (nt=nvpm*npm+nvm*nvpm*3+2*npm*nvm) 4 | parameter (nri=0.9*nvm*nt/nd,ndi=0.9*nvm*nt/nr) 5 | c parameters for emap routines 6 | parameter (nf=nd,nfp=ndi,nrp=nri) 7 | parameter (ni=nvm,nj=nvm) 8 | parameter (nch=1,nsu=1) 9 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/emap_ori.par: -------------------------------------------------------------------------------- 1 | parameter (npm= 28,nvpm= 354,nvm= 106) 2 | parameter (nd=npm*nvpm,nr=0.8*nvm*nvm) 3 | parameter (nt=nvpm*npm+nvm*nvpm*3+2*npm*nvm) 4 | parameter (nri=0.9*nvm*nt/nd,ndi=0.9*nvm*nt/nr) 5 | c parameters for emap routines 6 | parameter (nf=nd,nfp=ndi,nrp=nri) 7 | parameter (ni=nvm,nj=nvm) 8 | parameter (nch=1,nsu=1) 9 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/fort.10: -------------------------------------------------------------------------------- 1 | nvm not even 83 0 2 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/hclock.f: -------------------------------------------------------------------------------- 1 | subroutine clock(t) 2 | real*8 t 3 | real*4 ta(2) 4 | x=dtime(ta) 5 | t=t+ta(1) 6 | return 7 | end 8 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/iclock.f: -------------------------------------------------------------------------------- 1 | subroutine clock(t) 2 | real*8 t 3 | c ibm-rs clock function 4 | t=mclock()/100. 5 | return 6 | end 7 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/lobe.f: -------------------------------------------------------------------------------- 1 | program stream 2 | c aux program for idl plots of dopmaps 3 | c calculates Roche lobes and integrates path of stream from L1 4 | parameter(nmax=10000) 5 | complex z,w,z1,z2,dz,dw,wk,no,wr,wc,w0,wm1,wi, 6 | * wout(nmax),wkout(nmax) 7 | dimension xout(nmax),yout(nmax),rout(nmax) 8 | open(3,file='lobe.out') 9 | open(4,file='lobe.in') 10 | read(4,*)qm 11 | if (abs(qm-1).lt.1e-4) qm=1e-4 12 | close(4) 13 | rd=0.1 14 | if (qm.le.0.) then 15 | write(3,'(''qm<0: '',f8.5)')qm 16 | close(3) 17 | stop 18 | endif 19 | rl1=rlq1(qm) 20 | c write(*,'('' rlq1'',f8.5)')rl1 21 | write(3,'(f8.5)')qm 22 | call lobes(qm,rl1) 23 | c center of mass rel to M1 24 | cm=qm/(1+qm) 25 | c coordinates of M1 and M2 26 | z1=-cm 27 | z2=1-cm 28 | wm1=conjg(cmplx(0.,-cm)) 29 | c start at L1-eps with v=0 30 | eps=1e-3 31 | z=cmplx(rl1-cm-eps,0.) 32 | w=0 33 | c check that we really are near L1 34 | call eqmot(z,w,zp,wp,z1,z2,qm) 35 | write(*,'('' t=0: z,w'',1p4e11.3)')zp,wp 36 | t=0 37 | dt=1e-4 38 | isa=0 39 | it=0 40 | r=1 41 | ist=0 42 | ph=0. 43 | phmax=6 44 | c do while(it.lt.nmax.and.ph.lt.phmax.and.ist.eq.0) 45 | do while(it.lt.nmax.and.ph.lt.phmax) 46 | it=it+1 47 | call intrk(z,w,dt,dz,dw,z1,z2,qm) 48 | z=z+dz 49 | w=w+dw 50 | t=t+dt 51 | if (abs(dz)/abs(z).gt.0.02) dt=dt/2 52 | if (abs(dz)/abs(z).lt.0.005) dt=2*dt 53 | dph=-aimag(z*conjg(z-dz))/abs(z)/abs(z-dz) 54 | ph=ph+dph 55 | c velocity in inertial frame 56 | c change by Guillaume 57 | wi=w+cmplx(0,1.)*z 58 | c unit vector normal to kepler orbit 59 | rold=r 60 | r=abs(z-z1) 61 | if (ist.eq.0.and.rold.lt.r) then 62 | ist=1 63 | rmin=rold 64 | endif 65 | c kepler velocity of circular orbit in potential of M1, rel. to M1 66 | vk=1/sqrt(r*(1+qm)) 67 | c unit vector in r 68 | no=conjg(z-z1)/r 69 | wk=-vk*no*cmplx(0.,1.) 70 | c same but rel. to cm, this is velocity in inertial frame 71 | wk=wk+wm1 72 | c velocity normal to disk edge, in rotating frame 73 | dot=no*w 74 | c velocity parallel to disk edge 75 | par=aimag(no*w) 76 | c reflected velocity 77 | wr=w-2*dot*no 78 | c write(*,'(f8.4,1p9e11.3)')t,z,w,wk,wr,r 79 | xout(it)=z+cm 80 | yout(it)=-aimag(z) 81 | rout(it)=sqrt(xout(it)**2+yout(it)**2) 82 | c change by Guillaume 83 | wout(it)=wi 84 | wkout(it)=conjg(wk) 85 | if (it.gt.1) then 86 | x=xout(it) 87 | y=yout(it) 88 | phi=atan(y/x) 89 | if (rout(it).lt.rd.and.rout(it-1).gt.rd) then 90 | c write(*,'('' r,x,y,phi,vs,vk,dot,par'',8f8.3)') 91 | c * rout(it),x,y,phi,real(w),vk,dot,par 92 | c write(*,'('' w,no'',4f8.3)')w,no 93 | x=xout(it-1) 94 | y=yout(it-1) 95 | phi=atan(y/x) 96 | c write(*,'('' r,x,y,phi'',4f8.3)')rout(it-1),x,y,phi 97 | endif 98 | endif 99 | if (isa.eq.0.and.yout(it).lt.0) then 100 | isa=1 101 | ra=abs(z-z1) 102 | wc=conjg(w)+cmplx(0.,1.)*conjg(z-z1) 103 | ang=abs(aimag((z-z1)*conjg(wc))) 104 | endif 105 | enddo 106 | write(3,'(i5)')it 107 | write(3,'(1p5e15.7)')(xout(i),i=1,it) 108 | write(3,'(1p5e15.7)')(yout(i),i=1,it) 109 | write(3,'(1p6e12.4)')(real(wout(i)),i=1,it) 110 | write(3,'(1p6e12.4)')(aimag(wout(i)),i=1,it) 111 | write(3,'(1p6e12.4)')(real(wkout(i)),i=1,it) 112 | write(3,'(1p6e12.4)')(aimag(wkout(i)),i=1,it) 113 | rc=ang**2*(1+qm) 114 | z=rl1-cm 115 | w0=cmplx(0.,1.)*conjg(z-z1) 116 | ang0=abs(aimag((z-z1)*conjg(w0))) 117 | rc0=ang0**2*(1+qm) 118 | write(3,'(3f8.5,'' ra, rc '')')ra,rc,rc0 119 | c write(*,'(3f8.5,'' ra, rc '')')ra,rc,rc0 120 | c write(*,'(2f8.4,'' q, rmin'')')qm,rmin 121 | end 122 | 123 | subroutine intrk(z,w,dt,dz,dw,z1,z2,qm) 124 | complex z,w,dz,dw,z1,z2 125 | complex zp,wp,hz0,hz1,hz2,hz3,hw0,hw1,hw2,hw3,zx,wx 126 | zx=z 127 | wx=w 128 | call eqmot(zx,wx,zp,wp,z1,z2,qm) 129 | hz0=zp*dt 130 | hw0=wp*dt 131 | zx=z+hz0/2 132 | wx=w+hw0/2 133 | call eqmot(zx,wx,zp,wp,z1,z2,qm) 134 | hz1=zp*dt 135 | hw1=wp*dt 136 | zx=z+hz1/2 137 | wx=w+hw1/2 138 | call eqmot(zx,wx,zp,wp,z1,z2,qm) 139 | hz2=zp*dt 140 | hw2=wp*dt 141 | zx=z+hz2 142 | wx=w+hw2 143 | call eqmot(zx,wx,zp,wp,z1,z2,qm) 144 | hz3=zp*dt 145 | hw3=wp*dt 146 | dz=(hz0+2*hz1+2*hz2+hz3)/6 147 | dw=(hw0+2*hw1+2*hw2+hw3)/6 148 | return 149 | end 150 | 151 | subroutine eqmot(z,w,zp,wp,z1,z2,qm) 152 | complex z,w,zp,wp,z1,z2 153 | complex zr1,zr2 154 | zr1=z-z1 155 | zr2=z-z2 156 | c change by Guillaume : - sign in Coriolis 157 | wp=-(qm*zr2/(abs(zr2))**3+zr1/(abs(zr1))**3)/(1+qm)- 158 | * cmplx(0.,2.)*w+z 159 | zp=w 160 | return 161 | end 162 | 163 | function rlq1(q) 164 | c radius (from primary) of L1 165 | if (abs(1-q).lt.1e-4) then 166 | rlq=0.5 167 | return 168 | endif 169 | rl=0 170 | rn=1-q 171 | 2 if (abs(rl/rn-1).gt.1e-4)then 172 | rl=rn 173 | f=q/(1-rl)**2-1/rl**2+(1+q)*rl-q 174 | fa=2*q/(1-rl)**3+2/rl**3+(1+q) 175 | rn=rl-f/fa 176 | goto 2 177 | endif 178 | rlq1=rn 179 | return 180 | end 181 | 182 | function pot(q,x,y,z,pr) 183 | c Roche potential. coordinates centered on M2, 184 | c z along rotation axis, x toward M1 185 | c pr is gradient in radius from M2 186 | c first transform to polar coordinates w/r rotation axis 187 | r=sqrt(x*x+y*y+z*z) 188 | if (r.eq.0) stop 'r=0 in pot' 189 | rh=sqrt(x*x+y*y) 190 | st=rh/r 191 | if (rh.eq.0) then 192 | cf=1 193 | else 194 | cf=x/rh 195 | endif 196 | r2=1/(1+q) 197 | r1=sqrt(1+r**2-2*r*cf*st) 198 | pot=-1/r-1/q/r1-0.5*(1/q+1)*(r2**2+(r*st)**2-2*r2*r*cf*st) 199 | pr=1/r**2+1/q/(r1**3)*(r-cf*st)-0.5*(1/q+1)*2*(r*st*st-r2*cf*st) 200 | return 201 | end 202 | 203 | subroutine lobes(q,rs) 204 | include 'emap.par' 205 | dimension r(ni,nj),ch(ni),ps(nj),x(ni),y(ni) 206 | nc=ni 207 | np=nj 208 | call surf(q,rs,nc,np,r,ch,ps) 209 | write(3,'(2i5,'' ni,nj'')')ni,nj 210 | j=1 211 | do i=1,nc 212 | x(i)=1-r(i,j)*cos(ch(i)) 213 | y(i)=-r(i,j)*sin(ch(i)) 214 | enddo 215 | write(3,'(8f9.5)')(x(i),i=1,nc),(x(i),i=nc,1,-1) 216 | write(3,'(8f9.5)')(y(i),i=1,nc),(-y(i),i=nc,1,-1) 217 | call surf(1/q,1-rs,nc,np,r,ch,ps) 218 | j=1 219 | do i=1,nc 220 | x(i)=r(i,j)*cos(ch(i)) 221 | y(i)=r(i,j)*sin(ch(i)) 222 | enddo 223 | write(3,'(8f9.5)')(x(i),i=1,nc),(x(i),i=nc,1,-1) 224 | write(3,'(8f9.5)')(y(i),i=1,nc),(-y(i),i=nc,1,-1) 225 | return 226 | end 227 | 228 | subroutine surf(q,rs,nc,np,r,ch,ps) 229 | c Roche surface around M2, coordinates on surface are ch, ps. 230 | c ch: polar angle from direction to M1; ps: corresponding azimuth, counting 231 | c from orbital plane. 232 | c q:mass ratio, rs: radius of surface at point facing M1 233 | c nc, np: number of chi's, psi's. 234 | c output: 235 | c r(nf,nt): radius. ch, ps: chi and psi arrays 236 | include 'emap.par' 237 | dimension r(ni,nj),ch(*),ps(*) 238 | if (nc.gt.ni) stop 'nc>ni' 239 | if (np.gt.nj) stop 'np>nj' 240 | pi=2*asin(1.) 241 | dc=pi/nc 242 | ch(1)=0 243 | do i=1,nc 244 | ch(i)=float((i-1))*pi/(nc-1) 245 | enddo 246 | ps(1)=0 247 | do j=1,np 248 | ps(j)=float((j-1))*2*pi/np 249 | enddo 250 | rs1=1-rs 251 | fs=pot(q,rs1,0.,0.,pr) 252 | c max no of iterations 253 | im=20 254 | do i=1,np 255 | cp=cos(ps(i)) 256 | sp=sin(ps(i)) 257 | rx=(1-dc)*rs1 258 | r(1,i)=rs1 259 | do k=2,nc 260 | x=cos(ch(k)) 261 | sc=sin(ch(k)) 262 | y=sc*cp 263 | z=sc*sp 264 | j=0 265 | f=1 266 | do while (j.lt.im.and.abs(f-fs).gt.1e-4.or.j.eq.0.) 267 | j=j+1 268 | r1=rx 269 | f=pot(q,r1*x,r1*y,r1*z,pr) 270 | rx=r1-(f-fs)/pr 271 | if (rx.gt.rs1) rx=rs1 272 | enddo 273 | if (j.ge.im) then 274 | write(*,'('' no conv in surf; k,i,ch,ps'',2i4,2f7.3)') 275 | * k,i,ch(k),ps(i) 276 | stop 277 | endif 278 | r(k,i)=rx 279 | enddo 280 | enddo 281 | return 282 | end 283 | -------------------------------------------------------------------------------- /pydoppler/fortran_code/makefile: -------------------------------------------------------------------------------- 1 | # IBM aix 2 | # with error traps and bounds checks: 3 | # compile=cp -f iclock.f clock.f ; xlf -D -C -g -q flttrap 4 | # optimized: 5 | # compile=cp -f iclock.f clock.f ; xlf -O 6 | # optimized, with extended memory allocation of 2048 MB: 7 | #compile=cp -f iclock.f clock.f ; xlf -bmaxdata:2048000000 -bmaxstack:2048000000 -O 8 | 9 | # DEC alpha with debug and bound checks 10 | # compile=cp -f cclock.f clock.f ; f90 -C -g -ladebug 11 | # optimized: 12 | # compile=cp -f cclock.f clock.f ; g77 -O 13 | 14 | # HP HP/UX 15 | # compile=cp -f hclock.f clock.f ; f77 -O +U77 16 | # with error traps and bounds checks: 17 | # compile=cp -f hclock.f clock.f ; f77 +FPVZO -g -C -O +U77 18 | 19 | # SUN sparc 20 | #compile=cp -f cclock.f clock.f ; gfortran -O 21 | #compile=cp -f cclock.f clock.f ; g77 -O -fno-globals -Wno-globals 22 | #-fno-globals 23 | 24 | compile=cp -f cclock.f clock.f ; gfortran -O -w -fallow-argument-mismatch 25 | 26 | dop.out: dopin dop.in dopp 27 | dopp 28 | dopp: dop.f emap.par 29 | $(compile) -o dopp dop.f clock.f 30 | 31 | lobe.out: lobe lobe.in 32 | lobe 33 | lobe: lobe.f 34 | $(compile) -o lobe lobe.f 35 | -------------------------------------------------------------------------------- /pydoppler/mynormalize.py: -------------------------------------------------------------------------------- 1 | # The Normalize class is largely based on code provided by Sarah Graves. 2 | 3 | import numpy as np 4 | import numpy.ma as ma 5 | 6 | import matplotlib.cbook as cbook 7 | from matplotlib.colors import Normalize 8 | 9 | 10 | class MyNormalize(Normalize): 11 | ''' 12 | A Normalize class for imshow that allows different stretching functions 13 | for astronomical images. 14 | ''' 15 | 16 | def __init__(self, stretch='linear', exponent=5, vmid=None, vmin=None, 17 | vmax=None, clip=False): 18 | ''' 19 | Initalize an APLpyNormalize instance. 20 | 21 | Optional Keyword Arguments: 22 | 23 | *vmin*: [ None | float ] 24 | Minimum pixel value to use for the scaling. 25 | 26 | *vmax*: [ None | float ] 27 | Maximum pixel value to use for the scaling. 28 | 29 | *stretch*: [ 'linear' | 'log' | 'sqrt' | 'arcsinh' | 'power' ] 30 | The stretch function to use (default is 'linear'). 31 | 32 | *vmid*: [ None | float ] 33 | Mid-pixel value used for the log and arcsinh stretches. If 34 | set to None, a default value is picked. 35 | 36 | *exponent*: [ float ] 37 | if self.stretch is set to 'power', this is the exponent to use. 38 | 39 | *clip*: [ True | False ] 40 | If clip is True and the given value falls outside the range, 41 | the returned value will be 0 or 1, whichever is closer. 42 | ''' 43 | 44 | if vmax < vmin: 45 | raise Exception("vmax should be larger than vmin") 46 | 47 | # Call original initalization routine 48 | Normalize.__init__(self, vmin=vmin, vmax=vmax, clip=clip) 49 | 50 | # Save parameters 51 | self.stretch = stretch 52 | self.exponent = exponent 53 | 54 | if stretch == 'power' and np.equal(self.exponent, None): 55 | raise Exception("For stretch=='power', an exponent should be specified") 56 | 57 | if np.equal(vmid, None): 58 | if stretch == 'log': 59 | if vmin > 0: 60 | self.midpoint = vmax / vmin 61 | else: 62 | raise Exception("When using a log stretch, if vmin < 0, then vmid has to be specified") 63 | elif stretch == 'arcsinh': 64 | self.midpoint = -1. / 30. 65 | else: 66 | self.midpoint = None 67 | else: 68 | if stretch == 'log': 69 | if vmin < vmid: 70 | raise Exception("When using a log stretch, vmin should be larger than vmid") 71 | self.midpoint = (vmax - vmid) / (vmin - vmid) 72 | elif stretch == 'arcsinh': 73 | self.midpoint = (vmid - vmin) / (vmax - vmin) 74 | else: 75 | self.midpoint = None 76 | 77 | def __call__(self, value, clip=None): 78 | 79 | #read in parameters 80 | method = self.stretch 81 | exponent = self.exponent 82 | midpoint = self.midpoint 83 | 84 | # ORIGINAL MATPLOTLIB CODE 85 | 86 | if clip is None: 87 | clip = self.clip 88 | 89 | if cbook.iterable(value): 90 | vtype = 'array' 91 | val = ma.asarray(value).astype(np.float) 92 | else: 93 | vtype = 'scalar' 94 | val = ma.array([value]).astype(np.float) 95 | 96 | self.autoscale_None(val) 97 | vmin, vmax = self.vmin, self.vmax 98 | if vmin > vmax: 99 | raise ValueError("minvalue must be less than or equal to maxvalue") 100 | elif vmin == vmax: 101 | return 0.0 * val 102 | else: 103 | if clip: 104 | mask = ma.getmask(val) 105 | val = ma.array(np.clip(val.filled(vmax), vmin, vmax), 106 | mask=mask) 107 | result = (val - vmin) * (1.0 / (vmax - vmin)) 108 | 109 | # CUSTOM APLPY CODE 110 | 111 | # Keep track of negative values 112 | negative = result < 0. 113 | 114 | if self.stretch == 'linear': 115 | 116 | pass 117 | 118 | elif self.stretch == 'log': 119 | 120 | result = ma.log10(result * (self.midpoint - 1.) + 1.) \ 121 | / ma.log10(self.midpoint) 122 | 123 | elif self.stretch == 'sqrt': 124 | 125 | result = ma.sqrt(result) 126 | 127 | elif self.stretch == 'arcsinh': 128 | 129 | result = ma.arcsinh(result / self.midpoint) \ 130 | / ma.arcsinh(1. / self.midpoint) 131 | 132 | elif self.stretch == 'power': 133 | 134 | result = ma.power(result, exponent) 135 | 136 | else: 137 | 138 | raise Exception("Unknown stretch in APLpyNormalize: %s" % 139 | self.stretch) 140 | 141 | # Now set previously negative values to 0, as these are 142 | # different from true NaN values in the FITS image 143 | result[negative] = -np.inf 144 | 145 | if vtype == 'scalar': 146 | result = result[0] 147 | 148 | return result 149 | 150 | def inverse(self, value): 151 | 152 | # ORIGINAL MATPLOTLIB CODE 153 | 154 | if not self.scaled(): 155 | raise ValueError("Not invertible until scaled") 156 | 157 | vmin, vmax = self.vmin, self.vmax 158 | 159 | # CUSTOM APLPY CODE 160 | 161 | if cbook.iterable(value): 162 | val = ma.asarray(value) 163 | else: 164 | val = value 165 | 166 | if self.stretch == 'linear': 167 | 168 | pass 169 | 170 | elif self.stretch == 'log': 171 | 172 | val = (ma.power(10., val * ma.log10(self.midpoint)) - 1.) / (self.midpoint - 1.) 173 | 174 | elif self.stretch == 'sqrt': 175 | 176 | val = val * val 177 | 178 | elif self.stretch == 'arcsinh': 179 | 180 | val = self.midpoint * \ 181 | ma.sinh(val * ma.arcsinh(1. / self.midpoint)) 182 | 183 | elif self.stretch == 'power': 184 | 185 | val = ma.power(val, (1. / self.exponent)) 186 | 187 | else: 188 | 189 | raise Exception("Unknown stretch in APLpyNormalize: %s" % 190 | self.stretch) 191 | 192 | return vmin + val * (vmax - vmin) -------------------------------------------------------------------------------- /pydoppler/test_data/output_images/Average_Spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/pydoppler/test_data/output_images/Average_Spec.png -------------------------------------------------------------------------------- /pydoppler/test_data/output_images/Doppler_Map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/pydoppler/test_data/output_images/Doppler_Map.png -------------------------------------------------------------------------------- /pydoppler/test_data/output_images/Reconstruction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/pydoppler/test_data/output_images/Reconstruction.png -------------------------------------------------------------------------------- /pydoppler/test_data/output_images/Trail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alymantara/pydoppler/dc2d395680862159d74f164f44c5465041c5e8fd/pydoppler/test_data/output_images/Trail.png -------------------------------------------------------------------------------- /pydoppler/test_data/sample_script.py: -------------------------------------------------------------------------------- 1 | import pydoppler 2 | import matplotlib.pyplot as plt 3 | # Import sample data 4 | # <<< COMMENT OUT IF YOU DONT NEED THE TEST DATASET >>> 5 | pydoppler.test_data() 6 | 7 | # Load base object for tomography 8 | dop = pydoppler.spruit() 9 | 10 | # Basic data for the tomography to work 11 | dop.object = 'U Gem' 12 | dop.base_dir = 'ugem99' # Base directory for input spectra 13 | dop.list = 'ugem0all.fas' # Name of the input file 14 | dop.lam0 = 6562.8 # Wavelength zero in units of the original spectra 15 | dop.delta_phase = 0.003 16 | dop.delw = 35 # size of Doppler map in wavelenght 17 | dop.overs = 0.3 # between 0-1, Undersampling of the spectra. 1= Full resolution 18 | dop.gama = 36.0 # km /s 19 | dop.nbins = 28 20 | 21 | # Read in the individual spectra and orbital phase information 22 | dop.Foldspec() 23 | 24 | # Normalise the spectra 25 | dop.Dopin(continnum_band=[6500,6537,6591,6620], 26 | plot_median=False,poly_degree=2) 27 | 28 | # Perform tomography 29 | dop.Syncdop() 30 | 31 | # This routine will display the outcome of the Doppler tomography. 32 | # You can overplot contours and streams. 33 | cb,data = dop.Dopmap(limits=[0.05,0.99],colorbar=False,cmaps=plt.cm.magma_r, 34 | smooth=False,remove_mean=False) 35 | 36 | # Overplot the donor contours, keplerian and ballistic streams 37 | qm=0.35 38 | k1 = 107 39 | inc=70 40 | m1=1.2 41 | porb=0.1769061911 42 | 43 | pydoppler.stream(qm,k1,porb,m1,inc) 44 | 45 | # Always check that reconstructed spectra looks like the original one. A good 46 | # rule of thumb "If a feature on the Doppler tomogram isn not in the trail, 47 | # most likely its not real!" 48 | cb2,cb3,dmr,dm = dop.Reco(colorbar=False,limits=[.05,0.95],cmaps=plt.cm.magma_r) 49 | 50 | 51 | 52 | from astropy.modeling import models, fitting 53 | res = plt.figure('Residuals',figsize=(8,4)) 54 | plt.clf() 55 | ax = res.add_subplot(121) 56 | residuals = dm - dmr 57 | sigma = np.sqrt(dm) 58 | sh = plt.imshow(np.abs(residuals.T/sigma.T),aspect='auto', 59 | vmin=0,vmax=6) 60 | cb = plt.colorbar(sh) 61 | ax = res.add_subplot(122) 62 | bb = plt.hist(residuals.flatten()/sigma.flatten(),bins=50,color='b', 63 | histtype='step',normed=True) 64 | g_init = models.Gaussian1D(amplitude=.008, mean=0, stddev=50.) 65 | fit_g = fitting.LevMarLSQFitter() 66 | del_xx = bb[1][1:]-bb[1][1:2] 67 | g = fit_g(g_init, bb[1][:-1]+del_xx, bb[0]) 68 | plt.plot(bb[1][1:], g(bb[1][1:]), label='Gaussian',color='green') 69 | ax2= ax.twinx() 70 | plt.hist(residuals.flatten(),bins=50,color='k', 71 | histtype='step',cumulative=True,normed=True) 72 | plt.axvline(x=np.median(residuals.flatten()), 73 | linestyle='--',color='r',alpha=0.6) 74 | plt.xlim(-6,6) 75 | plt.tight_layout() 76 | -------------------------------------------------------------------------------- /pydoppler/test_data/ugem99/txhugem4008: -------------------------------------------------------------------------------- 1 | 6425.7934549521 25.5853 2 | 6425.94011140748 5.115589 3 | 6426.08676786285 27.77861 4 | 6426.23342431823 89.33115 5 | 6426.3800807736 43.50479 6 | 6426.52673722898 28.07883 7 | 6426.67339368436 -4.863095 8 | 6426.82005013973 -35.90275 9 | 6426.96670659511 52.52535 10 | 6427.11336305048 37.49124 11 | 6427.26001950586 9.782999 12 | 6427.40667596124 25.60694 13 | 6427.55333241661 30.16222 14 | 6427.69998887199 2.466208 15 | 6427.84664532736 9.31217 16 | 6427.99330178274 12.00848 17 | 6428.13995823812 83.29053 18 | 6428.28661469349 49.55418 19 | 6428.43327114887 -40.39526 20 | 6428.57992760424 92.55219 21 | 6428.72658405962 63.25944 22 | 6428.87324051499 17.18166 23 | 6429.01989697037 31.58742 24 | 6429.16655342575 40.35079 25 | 6429.31320988112 27.1171 26 | 6429.4598663365 53.85732 27 | 6429.60652279187 45.40812 28 | 6429.75317924725 55.92236 29 | 6429.89983570263 112.2789 30 | 6430.046492158 80.1021 31 | 6430.19314861338 54.16782 32 | 6430.33980506875 118.1988 33 | 6430.48646152413 27.09377 34 | 6430.6331179795 -3.532522 35 | 6430.77977443488 62.27185 36 | 6430.92643089026 41.7171 37 | 6431.07308734563 27.42423 38 | 6431.21974380101 20.45715 39 | 6431.36640025638 28.48754 40 | 6431.51305671176 55.98774 41 | 6431.65971316713 20.02346 42 | 6431.80636962251 12.26731 43 | 6431.95302607789 72.66393 44 | 6432.09968253326 93.81512 45 | 6432.24633898864 42.8853 46 | 6432.39299544401 34.70865 47 | 6432.53965189939 -75.3935 48 | 6432.68630835477 1.209053 49 | 6432.83296481014 84.79436 50 | 6432.97962126552 57.51962 51 | 6433.12627772089 74.67657 52 | 6433.27293417627 53.91092 53 | 6433.41959063165 8.914453 54 | 6433.56624708702 -5.784708 55 | 6433.7129035424 38.37061 56 | 6433.85955999777 -29.81855 57 | 6434.00621645315 -6.77641 58 | 6434.15287290853 66.94148 59 | 6434.2995293639 126.4661 60 | 6434.44618581928 81.74986 61 | 6434.59284227465 36.80796 62 | 6434.73949873003 69.79884 63 | 6434.8861551854 55.91977 64 | 6435.03281164078 57.17696 65 | 6435.17946809616 137.3949 66 | 6435.32612455153 104.3758 67 | 6435.47278100691 104.6404 68 | 6435.61943746228 4.080729 69 | 6435.76609391766 26.82587 70 | 6435.91275037304 51.62651 71 | 6436.05940682841 -0.8424249 72 | 6436.20606328379 46.46515 73 | 6436.35271973916 77.60444 74 | 6436.49937619454 1.46666 75 | 6436.64603264992 17.43308 76 | 6436.79268910529 57.25027 77 | 6436.93934556067 61.25612 78 | 6437.08600201604 80.06651 79 | 6437.23265847142 71.45667 80 | 6437.3793149268 40.64195 81 | 6437.52597138217 53.56566 82 | 6437.67262783755 78.77454 83 | 6437.81928429292 88.77995 84 | 6437.9659407483 61.79343 85 | 6438.11259720368 25.31281 86 | 6438.25925365905 48.73485 87 | 6438.40591011443 93.64561 88 | 6438.5525665698 89.07982 89 | 6438.69922302518 77.65756 90 | 6438.84587948055 71.75562 91 | 6438.99253593593 49.89167 92 | 6439.13919239131 -11.77721 93 | 6439.28584884668 -2.933198 94 | 6439.43250530206 95.89529 95 | 6439.57916175743 110.8051 96 | 6439.72581821281 62.99121 97 | 6439.87247466818 68.69646 98 | 6440.01913112356 65.1226 99 | 6440.16578757894 33.46449 100 | 6440.31244403431 54.37823 101 | 6440.45910048969 76.75149 102 | 6440.60575694506 55.6579 103 | 6440.75241340044 77.21692 104 | 6440.89906985582 56.20614 105 | 6441.04572631119 109.1347 106 | 6441.19238276657 88.26933 107 | 6441.33903922194 53.17405 108 | 6441.48569567732 73.95615 109 | 6441.6323521327 66.42425 110 | 6441.77900858807 42.28101 111 | 6441.92566504345 67.88439 112 | 6442.07232149882 121.0571 113 | 6442.2189779542 110.8756 114 | 6442.36563440958 112.1509 115 | 6442.51229086495 -1.090612 116 | 6442.65894732033 16.1952 117 | 6442.8056037757 63.06069 118 | 6442.95226023108 11.31817 119 | 6443.09891668645 34.55653 120 | 6443.24557314183 105.3248 121 | 6443.39222959721 101.3766 122 | 6443.53888605258 113.656 123 | 6443.68554250796 113.8385 124 | 6443.83219896333 41.98215 125 | 6443.97885541871 84.13034 126 | 6444.12551187408 73.48995 127 | 6444.27216832946 34.63615 128 | 6444.41882478484 91.17495 129 | 6444.56548124021 80.09575 130 | 6444.71213769559 94.45927 131 | 6444.85879415097 103.6797 132 | 6445.00545060634 12.50774 133 | 6445.15210706171 14.386 134 | 6445.29876351709 71.55073 135 | 6445.44541997247 4.614894 136 | 6445.59207642784 -8.934535 137 | 6445.73873288322 81.85416 138 | 6445.8853893386 127.1041 139 | 6446.03204579397 140.4199 140 | 6446.17870224935 55.63607 141 | 6446.32535870472 83.88093 142 | 6446.4720151601 47.67043 143 | 6446.61867161547 32.85175 144 | 6446.76532807085 49.83264 145 | 6446.91198452623 42.16685 146 | 6447.0586409816 34.8787 147 | 6447.20529743698 40.17118 148 | 6447.35195389236 36.58959 149 | 6447.49861034773 39.62455 150 | 6447.64526680311 55.76527 151 | 6447.79192325848 48.32032 152 | 6447.93857971386 95.8793 153 | 6448.08523616923 169.6989 154 | 6448.23189262461 88.46104 155 | 6448.37854907999 18.90854 156 | 6448.52520553536 6.289664 157 | 6448.67186199074 21.67239 158 | 6448.81851844611 68.80703 159 | 6448.96517490149 107.2201 160 | 6449.11183135686 80.32751 161 | 6449.25848781224 96.79135 162 | 6449.40514426762 118.9212 163 | 6449.55180072299 3.915819 164 | 6449.69845717837 -20.07601 165 | 6449.84511363374 -21.50544 166 | 6449.99177008912 70.39454 167 | 6450.1384265445 96.39194 168 | 6450.28508299987 65.14276 169 | 6450.43173945525 88.2975 170 | 6450.57839591062 65.12063 171 | 6450.725052366 13.69307 172 | 6450.87170882137 69.58011 173 | 6451.01836527675 81.02919 174 | 6451.16502173213 -3.42713 175 | 6451.3116781875 51.86281 176 | 6451.45833464288 88.90965 177 | 6451.60499109826 -35.51388 178 | 6451.75164755363 84.26986 179 | 6451.89830400901 118.3234 180 | 6452.04496046438 39.16881 181 | 6452.19161691976 92.16787 182 | 6452.33827337513 147.9185 183 | 6452.48492983051 57.13036 184 | 6452.63158628589 74.99416 185 | 6452.77824274126 101.7535 186 | 6452.92489919664 105.4224 187 | 6453.07155565201 165.75 188 | 6453.21821210739 148.2115 189 | 6453.36486856276 52.19772 190 | 6453.51152501814 33.41108 191 | 6453.65818147352 56.3947 192 | 6453.80483792889 66.88663 193 | 6453.95149438427 65.07154 194 | 6454.09815083964 73.2718 195 | 6454.24480729502 129.9156 196 | 6454.3914637504 45.97902 197 | 6454.53812020577 58.92739 198 | 6454.68477666115 150.0005 199 | 6454.83143311652 53.12819 200 | 6454.9780895719 61.64381 201 | 6455.12474602728 124.5372 202 | 6455.27140248265 59.91013 203 | 6455.41805893803 41.80126 204 | 6455.5647153934 75.25866 205 | 6455.71137184878 78.6641 206 | 6455.85802830415 31.28897 207 | 6456.00468475953 122.3535 208 | 6456.15134121491 22.45922 209 | 6456.29799767028 -3.922161 210 | 6456.44465412566 -26.33353 211 | 6456.59131058103 25.5718 212 | 6456.73796703641 18.17634 213 | 6456.88462349179 99.56216 214 | 6457.03127994716 104.2992 215 | 6457.17793640254 59.1769 216 | 6457.32459285791 135.6716 217 | 6457.47124931329 156.2973 218 | 6457.61790576866 62.70107 219 | 6457.76456222404 71.37264 220 | 6457.91121867942 139.4274 221 | 6458.05787513479 54.41899 222 | 6458.20453159017 43.03091 223 | 6458.35118804554 66.36443 224 | 6458.49784450092 -28.99715 225 | 6458.6445009563 89.94174 226 | 6458.79115741167 104.3403 227 | 6458.93781386705 28.19795 228 | 6459.08447032242 9.334018 229 | 6459.2311267778 61.0525 230 | 6459.37778323318 58.77985 231 | 6459.52443968855 98.44338 232 | 6459.67109614393 145.9092 233 | 6459.8177525993 102.4362 234 | 6459.96440905468 145.5219 235 | 6460.11106551005 79.31373 236 | 6460.25772196543 -26.65954 237 | 6460.40437842081 69.45507 238 | 6460.55103487618 132.2011 239 | 6460.69769133156 151.428 240 | 6460.84434778693 99.52069 241 | 6460.99100424231 71.17001 242 | 6461.13766069769 112.5924 243 | 6461.28431715306 135.4968 244 | 6461.43097360844 117.4923 245 | 6461.57763006381 81.92284 246 | 6461.72428651919 74.15465 247 | 6461.87094297457 95.21921 248 | 6462.01759942994 80.5855 249 | 6462.16425588532 62.87094 250 | 6462.31091234069 75.66328 251 | 6462.45756879607 64.9567 252 | 6462.60422525145 77.72759 253 | 6462.75088170682 27.22024 254 | 6462.8975381622 49.96893 255 | 6463.04419461757 71.42941 256 | 6463.19085107295 70.86082 257 | 6463.33750752832 90.24826 258 | 6463.4841639837 74.26424 259 | 6463.63082043908 70.32434 260 | 6463.77747689445 37.65242 261 | 6463.92413334983 7.147669 262 | 6464.0707898052 38.47009 263 | 6464.21744626058 53.64537 264 | 6464.36410271595 111.0439 265 | 6464.51075917133 164.5862 266 | 6464.65741562671 94.5704 267 | 6464.80407208208 150.2436 268 | 6464.95072853746 55.76471 269 | 6465.09738499284 148.749 270 | 6465.24404144821 82.27212 271 | 6465.39069790359 92.82329 272 | 6465.53735435896 115.1551 273 | 6465.68401081434 158.6446 274 | 6465.83066726971 129.5974 275 | 6465.97732372509 56.67278 276 | 6466.12398018047 38.81866 277 | 6466.27063663584 60.31516 278 | 6466.41729309122 77.90629 279 | 6466.56394954659 58.79269 280 | 6466.71060600197 57.88536 281 | 6466.85726245734 79.11277 282 | 6467.00391891272 61.48271 283 | 6467.1505753681 147.5165 284 | 6467.29723182347 134.3239 285 | 6467.44388827885 141.7439 286 | 6467.59054473422 181.0822 287 | 6467.7372011896 134.9026 288 | 6467.88385764498 53.35395 289 | 6468.03051410035 91.82825 290 | 6468.17717055573 147.0444 291 | 6468.3238270111 134.785 292 | 6468.47048346648 137.8437 293 | 6468.61713992186 94.53143 294 | 6468.76379637723 73.75185 295 | 6468.91045283261 112.9909 296 | 6469.05710928798 137.1131 297 | 6469.20376574336 153.0194 298 | 6469.35042219873 75.72148 299 | 6469.49707865411 50.20814 300 | 6469.64373510949 120.8284 301 | 6469.79039156486 99.35631 302 | 6469.93704802024 31.71656 303 | 6470.08370447561 65.51681 304 | 6470.23036093099 140.7819 305 | 6470.37701738637 132.3483 306 | 6470.52367384174 163.9879 307 | 6470.67033029712 143.7842 308 | 6470.81698675249 110.6709 309 | 6470.96364320787 173.2908 310 | 6471.11029966324 214.4706 311 | 6471.25695611862 172.132 312 | 6471.403612574 84.9351 313 | 6471.55026902937 42.76236 314 | 6471.69692548475 112.4691 315 | 6471.84358194012 148.3215 316 | 6471.9902383955 127.3541 317 | 6472.13689485088 102.5118 318 | 6472.28355130625 88.40446 319 | 6472.43020776163 136.9909 320 | 6472.576864217 186.1175 321 | 6472.72352067238 134.2387 322 | 6472.87017712775 133.9381 323 | 6473.01683358313 122.0075 324 | 6473.16349003851 143.0784 325 | 6473.31014649388 122.3769 326 | 6473.45680294926 109.5457 327 | 6473.60345940463 80.22211 328 | 6473.75011586001 -0.3488353 329 | 6473.89677231539 12.83955 330 | 6474.04342877076 131.8186 331 | 6474.19008522614 205.1465 332 | 6474.33674168151 181.8053 333 | 6474.48339813689 118.8839 334 | 6474.63005459227 75.95333 335 | 6474.77671104764 70.73276 336 | 6474.92336750302 68.9487 337 | 6475.07002395839 77.52137 338 | 6475.21668041377 170.8027 339 | 6475.36333686915 162.6596 340 | 6475.50999332452 195.9866 341 | 6475.6566497799 112.8362 342 | 6475.80330623527 124.9359 343 | 6475.94996269065 146.57 344 | 6476.09661914603 223.1154 345 | 6476.2432756014 146.8929 346 | 6476.38993205678 38.68388 347 | 6476.53658851215 113.2594 348 | 6476.68324496753 114.1908 349 | 6476.8299014229 119.9649 350 | 6476.97655787828 167.6031 351 | 6477.12321433366 155.4459 352 | 6477.26987078903 173.3128 353 | 6477.41652724441 126.6391 354 | 6477.56318369978 85.6796 355 | 6477.70984015516 132.8543 356 | 6477.85649661053 169.1392 357 | 6478.00315306591 60.92754 358 | 6478.14980952129 95.36634 359 | 6478.29646597666 190.8742 360 | 6478.44312243204 121.3855 361 | 6478.58977888741 61.0847 362 | 6478.73643534279 100.9141 363 | 6478.88309179817 84.7228 364 | 6479.02974825354 36.45514 365 | 6479.17640470892 93.03688 366 | 6479.32306116429 142.5527 367 | 6479.46971761967 117.7941 368 | 6479.61637407505 167.6433 369 | 6479.76303053042 186.5531 370 | 6479.9096869858 123.6394 371 | 6480.05634344117 181.7941 372 | 6480.20299989655 179.9167 373 | 6480.34965635193 135.7863 374 | 6480.4963128073 132.1271 375 | 6480.64296926268 128.794 376 | 6480.78962571805 191.1341 377 | 6480.93628217343 195.1657 378 | 6481.0829386288 158.0941 379 | 6481.22959508418 145.4191 380 | 6481.37625153956 110.2492 381 | 6481.52290799493 97.35088 382 | 6481.66956445031 136.5745 383 | 6481.81622090568 101.8202 384 | 6481.96287736106 94.33928 385 | 6482.10953381644 157.3916 386 | 6482.25619027181 150.8215 387 | 6482.40284672719 167.2455 388 | 6482.54950318256 193.9503 389 | 6482.69615963794 206.011 390 | 6482.84281609332 146.5158 391 | 6482.98947254869 172.489 392 | 6483.13612900407 146.2413 393 | 6483.28278545944 117.9666 394 | 6483.42944191482 143.642 395 | 6483.57609837019 175.4639 396 | 6483.72275482557 228.1023 397 | 6483.86941128095 214.5737 398 | 6484.01606773632 197.165 399 | 6484.1627241917 208.859 400 | 6484.30938064707 152.112 401 | 6484.45603710245 147.3626 402 | 6484.60269355782 214.3828 403 | 6484.7493500132 203.6852 404 | 6484.89600646858 171.8551 405 | 6485.04266292395 181.1516 406 | 6485.18931937933 200.1682 407 | 6485.3359758347 182.8742 408 | 6485.48263229008 108.1164 409 | 6485.62928874546 181.0685 410 | 6485.77594520083 205.9927 411 | 6485.92260165621 185.0195 412 | 6486.06925811158 81.16722 413 | 6486.21591456696 116.9782 414 | 6486.36257102234 154.5502 415 | 6486.50922747771 173.7755 416 | 6486.65588393309 104.8962 417 | 6486.80254038846 125.4162 418 | 6486.94919684384 191.1702 419 | 6487.09585329921 188.7816 420 | 6487.24250975459 204.6619 421 | 6487.38916620997 195.4197 422 | 6487.53582266534 156.1623 423 | 6487.68247912072 187.7446 424 | 6487.82913557609 180.1891 425 | 6487.97579203147 154.0972 426 | 6488.12244848685 256.2912 427 | 6488.26910494222 272.3614 428 | 6488.4157613976 180.5876 429 | 6488.56241785297 162.7979 430 | 6488.70907430835 116.0913 431 | 6488.85573076372 132.6806 432 | 6489.0023872191 179.1359 433 | 6489.14904367448 185.952 434 | 6489.29570012985 213.6429 435 | 6489.44235658523 168.7286 436 | 6489.5890130406 218.3605 437 | 6489.73566949598 149.5448 438 | 6489.88232595136 174.3036 439 | 6490.02898240673 233.8575 440 | 6490.17563886211 157.5956 441 | 6490.32229531748 134.2119 442 | 6490.46895177286 170.6785 443 | 6490.61560822824 161.614 444 | 6490.76226468361 169.7562 445 | 6490.90892113899 185.1284 446 | 6491.05557759436 192.0548 447 | 6491.20223404974 191.0751 448 | 6491.34889050511 166.5942 449 | 6491.49554696049 218.9427 450 | 6491.64220341587 225.977 451 | 6491.78885987124 246.1242 452 | 6491.93551632662 221.6344 453 | 6492.082172782 116.7592 454 | 6492.22882923737 183.2528 455 | 6492.37548569275 212.8104 456 | 6492.52214214812 210.1459 457 | 6492.6687986035 160.5612 458 | 6492.81545505887 163.5416 459 | 6492.96211151425 242.7223 460 | 6493.10876796963 192.7764 461 | 6493.255424425 145.345 462 | 6493.40208088038 252.3898 463 | 6493.54873733575 287.4803 464 | 6493.69539379113 217.5264 465 | 6493.8420502465 162.593 466 | 6493.98870670188 136.347 467 | 6494.13536315726 176.9957 468 | 6494.28201961263 146.5273 469 | 6494.42867606801 74.53065 470 | 6494.57533252339 162.7291 471 | 6494.72198897876 170.4373 472 | 6494.86864543414 208.3272 473 | 6495.01530188951 181.7047 474 | 6495.16195834489 205.9007 475 | 6495.30861480026 212.6986 476 | 6495.45527125564 179.5257 477 | 6495.60192771101 241.379 478 | 6495.74858416639 256.3247 479 | 6495.89524062177 196.745 480 | 6496.04189707714 192.2519 481 | 6496.18855353252 234.8785 482 | 6496.3352099879 289.2394 483 | 6496.48186644327 268.7156 484 | 6496.62852289865 250.8023 485 | 6496.77517935402 264.1273 486 | 6496.9218358094 265.7617 487 | 6497.06849226477 191.331 488 | 6497.21514872015 102.4679 489 | 6497.36180517553 147.8973 490 | 6497.5084616309 213.4311 491 | 6497.65511808628 198.1023 492 | 6497.80177454165 182.6125 493 | 6497.94843099703 259.8252 494 | 6498.0950874524 300.2902 495 | 6498.24174390778 188.2423 496 | 6498.38840036316 152.5724 497 | 6498.53505681853 238.5116 498 | 6498.68171327391 234.1871 499 | 6498.82836972928 188.2649 500 | 6498.97502618466 216.2206 501 | 6499.12168264004 239.3497 502 | 6499.26833909541 178.2252 503 | 6499.41499555079 163.42 504 | 6499.56165200616 228.0535 505 | 6499.70830846154 174.1083 506 | 6499.85496491692 149.9574 507 | 6500.00162137229 213.6527 508 | 6500.14827782767 183.8851 509 | 6500.29493428304 187.1479 510 | 6500.44159073842 227.5201 511 | 6500.5882471938 258.2231 512 | 6500.73490364917 308.7701 513 | 6500.88156010455 205.2283 514 | 6501.02821655992 117.5153 515 | 6501.1748730153 156.247 516 | 6501.32152947067 196.3441 517 | 6501.46818592605 208.2365 518 | 6501.61484238143 179.8529 519 | 6501.7614988368 228.4789 520 | 6501.90815529218 220.0983 521 | 6502.05481174755 234.3853 522 | 6502.20146820293 293.4114 523 | 6502.3481246583 287.0479 524 | 6502.49478111368 230.2397 525 | 6502.64143756906 239.1301 526 | 6502.78809402443 259.0925 527 | 6502.93475047981 261.9901 528 | 6503.08140693519 179.853 529 | 6503.22806339056 160.8032 530 | 6503.37471984594 228.9715 531 | 6503.52137630131 205.8242 532 | 6503.66803275669 173.8468 533 | 6503.81468921206 266.1725 534 | 6503.96134566744 278.1642 535 | 6504.10800212282 192.4115 536 | 6504.25465857819 189.972 537 | 6504.40131503357 222.5354 538 | 6504.54797148894 203.6315 539 | 6504.69462794432 159.3158 540 | 6504.84128439969 261.0307 541 | 6504.98794085507 183.5948 542 | 6505.13459731045 311.4583 543 | 6505.28125376582 295.7059 544 | 6505.4279102212 131.8863 545 | 6505.57456667657 174.8597 546 | 6505.72122313195 162.4886 547 | 6505.86787958733 196.5515 548 | 6506.0145360427 198.4702 549 | 6506.16119249808 285.3676 550 | 6506.30784895346 248.379 551 | 6506.45450540883 181.7473 552 | 6506.60116186421 178.9505 553 | 6506.74781831958 114.3078 554 | 6506.89447477496 120.2022 555 | 6507.04113123033 119.1532 556 | 6507.18778768571 217.4686 557 | 6507.33444414109 281.3634 558 | 6507.48110059646 224.5424 559 | 6507.62775705184 224.5438 560 | 6507.77441350721 231.4283 561 | 6507.92106996259 247.0938 562 | 6508.06772641796 190.5253 563 | 6508.21438287334 145.4116 564 | 6508.36103932872 258.8543 565 | 6508.50769578409 343.844 566 | 6508.65435223947 194.7095 567 | 6508.80100869484 181.7076 568 | 6508.94766515022 267.9284 569 | 6509.0943216056 326.2139 570 | 6509.24097806097 285.0122 571 | 6509.38763451635 246.1419 572 | 6509.53429097172 141.1214 573 | 6509.6809474271 231.5737 574 | 6509.82760388248 304.8796 575 | 6509.97426033785 249.8847 576 | 6510.12091679323 276.9943 577 | 6510.2675732486 269.7213 578 | 6510.41422970398 225.4126 579 | 6510.56088615935 282.0394 580 | 6510.70754261473 216.2897 581 | 6510.85419907011 202.335 582 | 6511.00085552548 267.6196 583 | 6511.14751198086 256.4282 584 | 6511.29416843623 261.1324 585 | 6511.44082489161 283.6146 586 | 6511.58748134698 235.3784 587 | 6511.73413780236 183.5279 588 | 6511.88079425774 270.8469 589 | 6512.02745071311 290.4411 590 | 6512.17410716849 178.0877 591 | 6512.32076362386 147.3982 592 | 6512.46742007924 177.085 593 | 6512.61407653462 218.1165 594 | 6512.76073298999 158.2467 595 | 6512.90738944537 200.9752 596 | 6513.05404590074 121.4987 597 | 6513.20070235612 214.7144 598 | 6513.3473588115 203.0425 599 | 6513.49401526687 147.7961 600 | 6513.64067172225 240.871 601 | 6513.78732817762 235.4319 602 | 6513.933984633 200.6962 603 | 6514.08064108838 182.9603 604 | 6514.22729754375 220.3176 605 | 6514.37395399913 258.5334 606 | 6514.5206104545 215.1347 607 | 6514.66726690988 195.3617 608 | 6514.81392336525 270.8014 609 | 6514.96057982063 234.3169 610 | 6515.10723627601 231.0389 611 | 6515.25389273138 275.8815 612 | 6515.40054918676 263.0346 613 | 6515.54720564213 280.5719 614 | 6515.69386209751 204.4899 615 | 6515.84051855288 241.3716 616 | 6515.98717500826 333.4545 617 | 6516.13383146364 210.2508 618 | 6516.28048791901 187.6879 619 | 6516.42714437439 159.8395 620 | 6516.57380082976 181.8712 621 | 6516.72045728514 269.467 622 | 6516.86711374052 282.0191 623 | 6517.01377019589 254.4877 624 | 6517.16042665127 213.1103 625 | 6517.30708310664 285.9018 626 | 6517.45373956202 287.8782 627 | 6517.6003960174 277.4016 628 | 6517.74705247277 162.0021 629 | 6517.89370892815 297.2898 630 | 6518.04036538352 272.6913 631 | 6518.1870218389 103.0431 632 | 6518.33367829428 114.4483 633 | 6518.48033474965 190.0891 634 | 6518.62699120503 246.8027 635 | 6518.7736476604 377.3827 636 | 6518.92030411578 326.6257 637 | 6519.06696057115 295.0858 638 | 6519.21361702653 294.2739 639 | 6519.36027348191 309.4639 640 | 6519.50692993728 313.2369 641 | 6519.65358639266 230.2204 642 | 6519.80024284803 308.7228 643 | 6519.94689930341 333.768 644 | 6520.09355575879 246.4267 645 | 6520.24021221416 214.3815 646 | 6520.38686866954 135.9801 647 | 6520.53352512491 66.46104 648 | 6520.68018158029 198.0278 649 | 6520.82683803567 140.8266 650 | 6520.97349449104 243.6237 651 | 6521.12015094642 221.104 652 | 6521.26680740179 177.346 653 | 6521.41346385717 219.3311 654 | 6521.56012031254 255.213 655 | 6521.70677676792 212.1681 656 | 6521.8534332233 245.0997 657 | 6522.00008967867 228.2793 658 | 6522.14674613405 267.5327 659 | 6522.29340258942 252.346 660 | 6522.4400590448 180.03 661 | 6522.58671550018 257.989 662 | 6522.73337195555 294.24 663 | 6522.88002841093 279.8188 664 | 6523.0266848663 298.8506 665 | 6523.17334132168 225.3399 666 | 6523.31999777706 200.3542 667 | 6523.46665423243 266.5626 668 | 6523.61331068781 294.2988 669 | 6523.75996714318 269.632 670 | 6523.90662359856 264.9716 671 | 6524.05328005393 307.8788 672 | 6524.19993650931 293.2719 673 | 6524.34659296469 242.1323 674 | 6524.49324942006 226.4007 675 | 6524.63990587544 195.3725 676 | 6524.78656233081 185.6115 677 | 6524.93321878619 190.2045 678 | 6525.07987524156 230.2383 679 | 6525.22653169694 303.5924 680 | 6525.37318815232 288.667 681 | 6525.51984460769 297.5703 682 | 6525.66650106307 281.4589 683 | 6525.81315751844 253.113 684 | 6525.95981397382 285.0104 685 | 6526.1064704292 265.3238 686 | 6526.25312688457 217.6976 687 | 6526.39978333995 214.8423 688 | 6526.54643979532 244.7057 689 | 6526.6930962507 294.1729 690 | 6526.83975270608 232.9108 691 | 6526.98640916145 282.3004 692 | 6527.13306561683 235.7012 693 | 6527.2797220722 210.012 694 | 6527.42637852758 261.4419 695 | 6527.57303498295 304.5121 696 | 6527.71969143833 326.9967 697 | 6527.86634789371 180.5239 698 | 6528.01300434908 215.3168 699 | 6528.15966080446 357.1053 700 | 6528.30631725983 240.186 701 | 6528.45297371521 186.3633 702 | 6528.59963017059 255.1879 703 | 6528.74628662596 199.7619 704 | 6528.89294308134 194.3575 705 | 6529.03959953671 275.5666 706 | 6529.18625599209 316.0722 707 | 6529.33291244746 291.6846 708 | 6529.47956890284 202.2221 709 | 6529.62622535822 215.9107 710 | 6529.77288181359 256.9981 711 | 6529.91953826897 253.8938 712 | 6530.06619472435 252.2153 713 | 6530.21285117972 328.3061 714 | 6530.3595076351 339.5113 715 | 6530.50616409047 302.277 716 | 6530.65282054585 160.8153 717 | 6530.79947700122 291.3185 718 | 6530.9461334566 328.6066 719 | 6531.09278991198 253.7409 720 | 6531.23944636735 383.9526 721 | 6531.38610282273 320.1776 722 | 6531.5327592781 252.6117 723 | 6531.67941573348 219.6702 724 | 6531.82607218885 244.1264 725 | 6531.97272864423 267.4495 726 | 6532.11938509961 268.4605 727 | 6532.26604155498 239.1398 728 | 6532.41269801036 233.2188 729 | 6532.55935446574 328.47 730 | 6532.70601092111 307.2286 731 | 6532.85266737649 242.7631 732 | 6532.99932383186 254.7867 733 | 6533.14598028724 299.2552 734 | 6533.29263674261 306.8788 735 | 6533.43929319799 291.9931 736 | 6533.58594965336 370.4435 737 | 6533.73260610874 376.7344 738 | 6533.87926256412 351.8931 739 | 6534.02591901949 392.0906 740 | 6534.17257547487 369.0575 741 | 6534.31923193025 287.3195 742 | 6534.46588838562 251.9451 743 | 6534.612544841 328.0366 744 | 6534.75920129637 299.4012 745 | 6534.90585775175 305.2026 746 | 6535.05251420712 354.8948 747 | 6535.1991706625 310.8354 748 | 6535.34582711788 206.6388 749 | 6535.49248357325 372.094 750 | 6535.63914002863 389.4353 751 | 6535.785796484 229.5321 752 | 6535.93245293938 269.951 753 | 6536.07910939475 331.3923 754 | 6536.22576585013 245.7466 755 | 6536.37242230551 284.3419 756 | 6536.51907876088 351.7499 757 | 6536.66573521626 323.0557 758 | 6536.81239167163 321.4261 759 | 6536.95904812701 308.1432 760 | 6537.10570458239 315.646 761 | 6537.25236103776 371.5175 762 | 6537.39901749314 343.9535 763 | 6537.54567394852 274.5738 764 | 6537.69233040389 392.1211 765 | 6537.83898685927 309.1316 766 | 6537.98564331464 259.1444 767 | 6538.13229977002 315.1194 768 | 6538.27895622539 332.0208 769 | 6538.42561268077 255.1936 770 | 6538.57226913615 248.0774 771 | 6538.71892559152 358.8522 772 | 6538.8655820469 363.666 773 | 6539.01223850227 292.0842 774 | 6539.15889495765 328.3028 775 | 6539.30555141302 429.4121 776 | 6539.4522078684 397.8549 777 | 6539.59886432378 341.8357 778 | 6539.74552077915 292.6964 779 | 6539.89217723453 251.7095 780 | 6540.0388336899 343.1076 781 | 6540.18549014528 365.8588 782 | 6540.33214660066 335.2758 783 | 6540.47880305603 390.6525 784 | 6540.62545951141 422.3239 785 | 6540.77211596678 385.0797 786 | 6540.91877242216 374.576 787 | 6541.06542887754 345.2239 788 | 6541.21208533291 374.7776 789 | 6541.35874178829 316.9006 790 | 6541.50539824366 315.2507 791 | 6541.65205469904 399.3571 792 | 6541.79871115441 375.8052 793 | 6541.94536760979 360.4928 794 | 6542.09202406517 391.4184 795 | 6542.23868052054 382.8205 796 | 6542.38533697592 336.0089 797 | 6542.53199343129 383.6204 798 | 6542.67864988667 490.4454 799 | 6542.82530634204 396.045 800 | 6542.97196279742 327.642 801 | 6543.1186192528 296.5583 802 | 6543.26527570817 438.1725 803 | 6543.41193216355 369.3122 804 | 6543.55858861892 382.5274 805 | 6543.7052450743 351.1816 806 | 6543.85190152968 370.9033 807 | 6543.99855798505 409.9189 808 | 6544.14521444043 435.4745 809 | 6544.2918708958 367.7957 810 | 6544.43852735118 516.3572 811 | 6544.58518380656 514.9125 812 | 6544.73184026193 338.8178 813 | 6544.87849671731 275.7362 814 | 6545.02515317268 431.5425 815 | 6545.17180962806 452.4039 816 | 6545.31846608344 379.5302 817 | 6545.46512253881 465.2376 818 | 6545.61177899419 522.9515 819 | 6545.75843544956 514.1289 820 | 6545.90509190494 449.2675 821 | 6546.05174836031 399.3715 822 | 6546.19840481569 367.0637 823 | 6546.34506127107 436.7069 824 | 6546.49171772644 547.5153 825 | 6546.63837418182 463.2274 826 | 6546.7850306372 424.0026 827 | 6546.93168709257 526.4276 828 | 6547.07834354795 569.5748 829 | 6547.22500000332 522.2139 830 | 6547.3716564587 563.3168 831 | 6547.51831291407 587.8398 832 | 6547.66496936945 565.6705 833 | 6547.81162582483 584.5856 834 | 6547.9582822802 571.1396 835 | 6548.10493873558 613.1998 836 | 6548.25159519095 622.1334 837 | 6548.39825164633 597.109 838 | 6548.5449081017 587.6158 839 | 6548.69156455708 546.7965 840 | 6548.83822101246 627.7186 841 | 6548.98487746783 710.0164 842 | 6549.13153392321 735.6177 843 | 6549.27819037859 631.0515 844 | 6549.42484683396 679.6526 845 | 6549.57150328933 717.6309 846 | 6549.71815974471 678.165 847 | 6549.86481620009 606.5073 848 | 6550.01147265546 674.5163 849 | 6550.15812911084 716.0734 850 | 6550.30478556621 666.0327 851 | 6550.45144202159 629.1735 852 | 6550.59809847697 749.2858 853 | 6550.74475493234 827.1257 854 | 6550.89141138772 801.9004 855 | 6551.0380678431 743.0653 856 | 6551.18472429847 736.0904 857 | 6551.33138075385 656.6793 858 | 6551.47803720922 747.7899 859 | 6551.6246936646 765.2488 860 | 6551.77135011997 692.9739 861 | 6551.91800657535 827.7395 862 | 6552.06466303073 903.9857 863 | 6552.2113194861 868.0743 864 | 6552.35797594148 839.3909 865 | 6552.50463239685 770.098 866 | 6552.65128885223 707.2469 867 | 6552.7979453076 782.217 868 | 6552.94460176298 802.1429 869 | 6553.09125821836 759.6458 870 | 6553.23791467373 751.014 871 | 6553.38457112911 787.4673 872 | 6553.53122758448 803.1982 873 | 6553.67788403986 809.8148 874 | 6553.82454049524 904.0918 875 | 6553.97119695061 891.2776 876 | 6554.11785340599 826.7496 877 | 6554.26450986136 791.595 878 | 6554.41116631674 819.0209 879 | 6554.55782277212 816.6345 880 | 6554.70447922749 738.7394 881 | 6554.85113568287 748.5858 882 | 6554.99779213824 798.4823 883 | 6555.14444859362 784.3643 884 | 6555.29110504899 711.3696 885 | 6555.43776150437 722.8839 886 | 6555.58441795975 772.4093 887 | 6555.73107441512 866.5121 888 | 6555.8777308705 840.5506 889 | 6556.02438732587 761.1158 890 | 6556.17104378125 750.7841 891 | 6556.31770023663 754.4905 892 | 6556.464356692 724.135 893 | 6556.61101314738 765.8207 894 | 6556.75766960275 815.6363 895 | 6556.90432605813 808.2771 896 | 6557.0509825135 903.8859 897 | 6557.19763896888 862.1776 898 | 6557.34429542426 824.2377 899 | 6557.49095187963 698.0002 900 | 6557.63760833501 894.099 901 | 6557.78426479038 830.7029 902 | 6557.93092124576 776.0857 903 | 6558.07757770114 857.1594 904 | 6558.22423415651 777.1822 905 | 6558.37089061189 845.8908 906 | 6558.51754706726 895.4857 907 | 6558.66420352264 785.9772 908 | 6558.81085997802 822.1743 909 | 6558.95751643339 884.343 910 | 6559.10417288877 843.5507 911 | 6559.25082934414 908.4141 912 | 6559.39748579952 855.9551 913 | 6559.54414225489 821.2424 914 | 6559.69079871027 912.0208 915 | 6559.83745516565 920.543 916 | 6559.98411162102 783.9944 917 | 6560.1307680764 819.0295 918 | 6560.27742453177 855.2272 919 | 6560.42408098715 872.4769 920 | 6560.57073744253 918.8267 921 | 6560.7173938979 828.0239 922 | 6560.86405035328 740.025 923 | 6561.01070680866 832.1019 924 | 6561.15736326403 777.0563 925 | 6561.30401971941 801.5882 926 | 6561.45067617478 765.5986 927 | 6561.59733263016 730.6354 928 | 6561.74398908553 716.0798 929 | 6561.89064554091 748.3523 930 | 6562.03730199628 794.5571 931 | 6562.18395845166 811.2848 932 | 6562.33061490704 730.8304 933 | 6562.47727136241 779.3246 934 | 6562.62392781779 876.1548 935 | 6562.77058427316 797.6307 936 | 6562.91724072854 735.6761 937 | 6563.06389718391 636.4343 938 | 6563.21055363929 587.0322 939 | 6563.35721009467 556.6741 940 | 6563.50386655004 503.042 941 | 6563.65052300542 524.6359 942 | 6563.7971794608 532.27 943 | 6563.94383591617 559.8677 944 | 6564.09049237155 656.2987 945 | 6564.23714882692 651.5632 946 | 6564.3838052823 454.3564 947 | 6564.53046173768 417.2787 948 | 6564.67711819305 528.4346 949 | 6564.82377464843 550.7917 950 | 6564.9704311038 473.9616 951 | 6565.11708755918 520.6211 952 | 6565.26374401455 525.4581 953 | 6565.41040046993 515.968 954 | 6565.55705692531 475.1314 955 | 6565.70371338068 471.0521 956 | 6565.85036983606 569.5387 957 | 6565.99702629143 573.8948 958 | 6566.14368274681 561.6888 959 | 6566.29033920219 500.2326 960 | 6566.43699565756 522.5347 961 | 6566.58365211294 568.65 962 | 6566.73030856831 484.2427 963 | 6566.87696502369 523.5364 964 | 6567.02362147906 681.3382 965 | 6567.17027793444 661.8645 966 | 6567.31693438982 643.055 967 | 6567.46359084519 712.4914 968 | 6567.61024730057 700.4753 969 | 6567.75690375594 660.1353 970 | 6567.90356021132 615.8997 971 | 6568.0502166667 654.3582 972 | 6568.19687312207 731.6954 973 | 6568.34352957745 671.8184 974 | 6568.49018603282 620.9368 975 | 6568.6368424882 659.7478 976 | 6568.78349894357 632.4559 977 | 6568.93015539895 689.1554 978 | 6569.07681185433 770.6353 979 | 6569.2234683097 797.5828 980 | 6569.37012476508 784.7562 981 | 6569.51678122045 714.9683 982 | 6569.66343767583 698.0602 983 | 6569.8100941312 723.811 984 | 6569.95675058658 728.4487 985 | 6570.10340704196 794.4044 986 | 6570.25006349733 733.8812 987 | 6570.39671995271 700.1499 988 | 6570.54337640809 831.9657 989 | 6570.69003286346 790.5939 990 | 6570.83668931884 814.4464 991 | 6570.98334577421 839.589 992 | 6571.13000222959 869.0762 993 | 6571.27665868496 742.979 994 | 6571.42331514034 787.5016 995 | 6571.56997159572 837.8787 996 | 6571.71662805109 656.0761 997 | 6571.86328450647 718.4302 998 | 6572.00994096184 827.9344 999 | 6572.15659741722 898.6419 1000 | 6572.3032538726 802.7294 1001 | 6572.44991032797 775.0193 1002 | 6572.59656678335 861.7485 1003 | 6572.74322323872 843.4996 1004 | 6572.8898796941 808.245 1005 | 6573.03653614947 824.4199 1006 | 6573.18319260485 861.2492 1007 | 6573.32984906023 814.1765 1008 | 6573.4765055156 809.0004 1009 | 6573.62316197098 809.2145 1010 | 6573.76981842635 802.9498 1011 | 6573.91647488173 817.7055 1012 | 6574.0631313371 911.3378 1013 | 6574.20978779248 907.282 1014 | 6574.35644424786 940.6713 1015 | 6574.50310070323 857.5538 1016 | 6574.64975715861 843.8539 1017 | 6574.79641361398 834.8184 1018 | 6574.94307006936 914.2909 1019 | 6575.08972652474 889.5176 1020 | 6575.23638298011 845.0621 1021 | 6575.38303943549 865.0549 1022 | 6575.52969589087 794.291 1023 | 6575.67635234624 876.2714 1024 | 6575.82300880162 908.8448 1025 | 6575.96966525699 929.1436 1026 | 6576.11632171237 886.0273 1027 | 6576.26297816774 811.7519 1028 | 6576.40963462312 843.3697 1029 | 6576.5562910785 866.7029 1030 | 6576.70294753387 973.6539 1031 | 6576.84960398925 902.1147 1032 | 6576.99626044462 899.6266 1033 | 6577.1429169 905.8559 1034 | 6577.28957335537 864.4767 1035 | 6577.43622981075 913.6741 1036 | 6577.58288626613 915.9134 1037 | 6577.7295427215 864.8759 1038 | 6577.87619917688 821.4492 1039 | 6578.02285563225 836.7698 1040 | 6578.16951208763 913.2195 1041 | 6578.31616854301 836.4483 1042 | 6578.46282499838 756.8129 1043 | 6578.60948145376 696.3057 1044 | 6578.75613790913 819.7901 1045 | 6578.90279436451 847.7303 1046 | 6579.04945081989 820.1881 1047 | 6579.19610727526 729.6437 1048 | 6579.34276373064 633.7653 1049 | 6579.48942018601 642.3812 1050 | 6579.63607664139 669.8622 1051 | 6579.78273309676 632.402 1052 | 6579.92938955214 721.113 1053 | 6580.07604600752 666.4919 1054 | 6580.22270246289 722.7114 1055 | 6580.36935891827 730.576 1056 | 6580.51601537365 707.4782 1057 | 6580.66267182902 631.0463 1058 | 6580.8093282844 635.1938 1059 | 6580.95598473977 646.1035 1060 | 6581.10264119515 622.6477 1061 | 6581.24929765052 678.7699 1062 | 6581.3959541059 616.468 1063 | 6581.54261056128 558.0185 1064 | 6581.68926701665 586.6411 1065 | 6581.83592347203 562.5121 1066 | 6581.9825799274 558.0722 1067 | 6582.12923638278 521.3726 1068 | 6582.27589283815 565.7167 1069 | 6582.42254929353 550.8731 1070 | 6582.56920574891 528.4202 1071 | 6582.71586220428 548.6222 1072 | 6582.86251865966 589.9081 1073 | 6583.00917511503 478.4969 1074 | 6583.15583157041 410.9919 1075 | 6583.30248802579 439.322 1076 | 6583.44914448116 488.4527 1077 | 6583.59580093654 441.6261 1078 | 6583.74245739191 431.8379 1079 | 6583.88911384729 447.7475 1080 | 6584.03577030266 465.8465 1081 | 6584.18242675804 451.5915 1082 | 6584.32908321342 448.3234 1083 | 6584.47573966879 408.675 1084 | 6584.62239612417 439.2007 1085 | 6584.76905257955 457.5721 1086 | 6584.91570903492 394.3756 1087 | 6585.0623654903 334.2785 1088 | 6585.20902194567 360.4536 1089 | 6585.35567840105 408.4034 1090 | 6585.50233485642 396.798 1091 | 6585.6489913118 420.4236 1092 | 6585.79564776718 403.1371 1093 | 6585.94230422255 385.4372 1094 | 6586.08896067793 377.9085 1095 | 6586.2356171333 318.5515 1096 | 6586.38227358868 357.5996 1097 | 6586.52893004405 311.8819 1098 | 6586.67558649943 348.1978 1099 | 6586.82224295481 378.9219 1100 | 6586.96889941018 377.6509 1101 | 6587.11555586556 340.7897 1102 | 6587.26221232094 305.6046 1103 | 6587.40886877631 283.8387 1104 | 6587.55552523168 303.9027 1105 | 6587.70218168706 375.0997 1106 | 6587.84883814244 388.9352 1107 | 6587.99549459781 369.9359 1108 | 6588.14215105319 282.9653 1109 | 6588.28880750856 302.0583 1110 | 6588.43546396394 421.8818 1111 | 6588.58212041932 489.713 1112 | 6588.72877687469 408.1749 1113 | 6588.87543333007 337.3124 1114 | 6589.02208978545 414.5043 1115 | 6589.16874624082 461.3307 1116 | 6589.3154026962 393.4447 1117 | 6589.46205915157 330.6915 1118 | 6589.60871560695 348.8755 1119 | 6589.75537206232 379.6594 1120 | 6589.9020285177 466.2528 1121 | 6590.04868497308 411.8056 1122 | 6590.19534142845 314.5703 1123 | 6590.34199788383 333.5468 1124 | 6590.4886543392 300.2564 1125 | 6590.63531079458 278.2111 1126 | 6590.78196724995 309.4969 1127 | 6590.92862370533 382.2021 1128 | 6591.07528016071 330.1128 1129 | 6591.22193661608 273.1566 1130 | 6591.36859307146 329.7739 1131 | 6591.51524952683 335.3616 1132 | 6591.66190598221 295.6603 1133 | 6591.80856243759 353.7806 1134 | 6591.95521889296 288.0641 1135 | 6592.10187534834 246.6806 1136 | 6592.24853180371 318.6031 1137 | 6592.39518825909 191.0908 1138 | 6592.54184471447 234.1686 1139 | 6592.68850116984 261.3004 1140 | 6592.83515762522 262.7228 1141 | 6592.98181408059 335.3403 1142 | 6593.12847053597 328.7934 1143 | 6593.27512699134 278.6162 1144 | 6593.42178344672 322.0889 1145 | 6593.5684399021 225.8844 1146 | 6593.71509635747 250.0853 1147 | 6593.86175281285 245.4851 1148 | 6594.00840926822 192.2799 1149 | 6594.1550657236 319.6205 1150 | 6594.30172217898 320.073 1151 | 6594.44837863435 343.8936 1152 | 6594.59503508973 340.7007 1153 | 6594.7416915451 285.3364 1154 | 6594.88834800048 230.5367 1155 | 6595.03500445586 264.4208 1156 | 6595.18166091123 194.8625 1157 | 6595.32831736661 248.8924 1158 | 6595.47497382198 261.1971 1159 | 6595.62163027736 413.8144 1160 | 6595.76828673274 299.365 1161 | 6595.91494318811 253.103 1162 | 6596.06159964349 284.3447 1163 | 6596.20825609886 287.3372 1164 | 6596.35491255424 301.5085 1165 | 6596.50156900961 260.6986 1166 | 6596.64822546499 274.6584 1167 | 6596.79488192037 346.948 1168 | 6596.94153837574 332.0191 1169 | 6597.08819483112 240.6201 1170 | 6597.23485128649 274.8877 1171 | 6597.38150774187 222.6535 1172 | 6597.52816419725 289.1939 1173 | 6597.67482065262 261.3475 1174 | 6597.821477108 220.6019 1175 | 6597.96813356337 190.1411 1176 | 6598.11479001875 270.0254 1177 | 6598.26144647412 258.7078 1178 | 6598.4081029295 260.4439 1179 | 6598.55475938488 262.8343 1180 | 6598.70141584025 258.4691 1181 | 6598.84807229563 351.4399 1182 | 6598.99472875101 271.9156 1183 | 6599.14138520638 212.7948 1184 | 6599.28804166176 276.3405 1185 | 6599.43469811713 360.27 1186 | 6599.58135457251 254.487 1187 | 6599.72801102788 184.1345 1188 | 6599.87466748326 190.4793 1189 | 6600.02132393863 235.8136 1190 | 6600.16798039401 249.7027 1191 | 6600.31463684939 209.7348 1192 | 6600.46129330476 307.1583 1193 | 6600.60794976014 262.6326 1194 | 6600.75460621551 228.1625 1195 | 6600.90126267089 142.0997 1196 | 6601.04791912626 250.2549 1197 | 6601.19457558164 389.5516 1198 | 6601.34123203702 277.9693 1199 | 6601.48788849239 226.1713 1200 | 6601.63454494777 158.8227 1201 | 6601.78120140315 263.4457 1202 | 6601.92785785852 268.9621 1203 | 6602.0745143139 312.4922 1204 | 6602.22117076927 334.2691 1205 | 6602.36782722465 358.2508 1206 | 6602.51448368002 373.8528 1207 | 6602.6611401354 295.926 1208 | 6602.80779659078 321.4558 1209 | 6602.95445304615 242.7499 1210 | 6603.10110950153 285.9166 1211 | 6603.2477659569 245.1328 1212 | 6603.39442241228 280.9849 1213 | 6603.54107886766 226.9381 1214 | 6603.68773532303 183.5357 1215 | 6603.83439177841 165.5107 1216 | 6603.98104823378 213.4494 1217 | 6604.12770468916 327.8599 1218 | 6604.27436114454 283.0748 1219 | 6604.42101759991 262.0483 1220 | 6604.56767405529 240.6315 1221 | 6604.71433051066 340.5324 1222 | 6604.86098696604 356.8286 1223 | 6605.00764342141 304.8689 1224 | 6605.15429987679 293.5062 1225 | 6605.30095633217 318.6546 1226 | 6605.44761278754 274.3242 1227 | 6605.59426924292 208.7026 1228 | 6605.74092569829 288.4755 1229 | 6605.88758215367 312.2286 1230 | 6606.03423860905 281.6208 1231 | 6606.18089506442 228.49 1232 | 6606.3275515198 204.9793 1233 | 6606.47420797517 269.4752 1234 | 6606.62086443055 314.5669 1235 | 6606.76752088592 318.0547 1236 | 6606.9141773413 209.5514 1237 | 6607.06083379668 250.2571 1238 | 6607.20749025205 372.0839 1239 | 6607.35414670743 335.8852 1240 | 6607.5008031628 355.0419 1241 | 6607.64745961818 249.8991 1242 | 6607.79411607355 245.4323 1243 | 6607.94077252893 327.374 1244 | 6608.08742898431 289.1916 1245 | 6608.23408543968 290.1137 1246 | 6608.38074189506 326.72 1247 | 6608.52739835044 347.8612 1248 | 6608.67405480581 178.0787 1249 | 6608.82071126119 205.3126 1250 | 6608.96736771656 354.8284 1251 | 6609.11402417194 305.0118 1252 | 6609.26068062732 260.2161 1253 | 6609.40733708269 350.7846 1254 | 6609.55399353807 235.0067 1255 | 6609.70064999344 226.411 1256 | 6609.84730644882 227.5087 1257 | 6609.99396290419 248.2419 1258 | 6610.14061935957 182.4997 1259 | 6610.28727581495 222.8614 1260 | 6610.43393227032 276.1185 1261 | 6610.5805887257 258.1737 1262 | 6610.72724518107 229.6745 1263 | 6610.87390163645 236.8355 1264 | 6611.02055809183 195.5539 1265 | 6611.1672145472 312.3453 1266 | 6611.31387100258 328.3215 1267 | 6611.46052745795 273.4656 1268 | 6611.60718391333 235.3385 1269 | 6611.7538403687 204.678 1270 | 6611.90049682408 140.1505 1271 | 6612.04715327946 252.7444 1272 | 6612.19380973483 262.4842 1273 | 6612.34046619021 262.3055 1274 | 6612.48712264558 275.436 1275 | 6612.63377910096 210.4435 1276 | 6612.78043555634 235.2607 1277 | 6612.92709201171 263.3746 1278 | 6613.07374846709 222.799 1279 | 6613.22040492246 327.109 1280 | 6613.36706137784 253.382 1281 | 6613.51371783322 264.6519 1282 | 6613.66037428859 231.8244 1283 | 6613.80703074397 163.652 1284 | 6613.95368719934 120.0797 1285 | 6614.10034365472 183.1519 1286 | 6614.24700011009 124.6553 1287 | 6614.39365656547 248.6499 1288 | 6614.54031302084 368.1588 1289 | 6614.68696947622 135.9025 1290 | 6614.8336259316 145.1322 1291 | 6614.98028238697 199.0585 1292 | 6615.12693884235 160.6704 1293 | 6615.27359529772 258.0927 1294 | 6615.4202517531 197.9115 1295 | 6615.56690820848 160.8957 1296 | 6615.71356466385 242.0396 1297 | 6615.86022111923 288.464 1298 | 6616.0068775746 248.4342 1299 | 6616.15353402998 164.9361 1300 | 6616.30019048536 181.1809 1301 | 6616.44684694073 266.3157 1302 | 6616.59350339611 261.2596 1303 | 6616.74015985148 162.5653 1304 | 6616.88681630686 180.2202 1305 | 6617.03347276224 263.5411 1306 | 6617.18012921761 278.8026 1307 | 6617.32678567299 215.9441 1308 | 6617.47344212836 211.6835 1309 | 6617.62009858374 270.0964 1310 | 6617.76675503911 204.3201 1311 | 6617.91341149449 262.8348 1312 | 6618.06006794987 298.5477 1313 | 6618.20672440524 225.6142 1314 | 6618.35338086062 273.1071 1315 | 6618.500037316 266.404 1316 | 6618.64669377137 220.3403 1317 | 6618.79335022675 262.8157 1318 | 6618.94000668212 289.6536 1319 | 6619.0866631375 216.729 1320 | 6619.23331959287 272.7498 1321 | 6619.37997604825 211.9156 1322 | 6619.52663250362 248.515 1323 | 6619.673288959 312.9534 1324 | 6619.81994541438 121.1396 1325 | 6619.96660186975 164.1932 1326 | 6620.11325832513 301.5853 1327 | 6620.2599147805 266.246 1328 | 6620.40657123588 249.895 1329 | 6620.55322769126 199.7937 1330 | 6620.69988414663 279.4408 1331 | 6620.84654060201 273.6426 1332 | 6620.99319705738 260.6132 1333 | 6621.13985351276 272.6404 1334 | 6621.28650996814 271.4075 1335 | 6621.43316642351 230.363 1336 | 6621.57982287889 196.8225 1337 | 6621.72647933426 271.8954 1338 | 6621.87313578964 298.2637 1339 | 6622.01979224502 324.7792 1340 | 6622.16644870039 225.8355 1341 | 6622.31310515577 225.7562 1342 | 6622.45976161114 281.748 1343 | 6622.60641806652 291.1562 1344 | 6622.7530745219 146.6917 1345 | 6622.89973097727 150.096 1346 | 6623.04638743265 177.2825 1347 | 6623.19304388802 256.3297 1348 | 6623.3397003434 297.9227 1349 | 6623.48635679877 245.0566 1350 | 6623.63301325415 305.4514 1351 | 6623.77966970953 214.8481 1352 | 6623.9263261649 287.4678 1353 | 6624.07298262028 254.3072 1354 | 6624.21963907565 212.9019 1355 | 6624.36629553103 316.1425 1356 | 6624.51295198641 252.266 1357 | 6624.65960844178 175.8136 1358 | 6624.80626489716 208.505 1359 | 6624.95292135253 191.9644 1360 | 6625.09957780791 155.2791 1361 | 6625.24623426329 286.0274 1362 | 6625.39289071866 256.8102 1363 | 6625.53954717404 243.8546 1364 | 6625.68620362941 217.0988 1365 | 6625.83286008479 189.1943 1366 | 6625.97951654016 232.7072 1367 | 6626.12617299554 143.8011 1368 | 6626.27282945092 154.4686 1369 | 6626.41948590629 127.8287 1370 | 6626.56614236167 187.5823 1371 | 6626.71279881704 152.8506 1372 | 6626.85945527242 286.5441 1373 | 6627.0061117278 312.0145 1374 | 6627.15276818317 247.2217 1375 | 6627.29942463855 200.2962 1376 | 6627.44608109392 287.2013 1377 | 6627.5927375493 284.6837 1378 | 6627.73939400467 290.6175 1379 | 6627.88605046005 274.9666 1380 | 6628.03270691543 260.3479 1381 | 6628.1793633708 233.48 1382 | 6628.32601982618 293.5536 1383 | 6628.47267628155 273.3046 1384 | 6628.61933273693 138.3974 1385 | 6628.7659891923 214.6666 1386 | 6628.91264564768 252.7036 1387 | 6629.05930210306 248.9777 1388 | 6629.20595855843 222.2726 1389 | 6629.35261501381 238.5007 1390 | 6629.49927146918 239.7296 1391 | 6629.64592792456 158.0498 1392 | 6629.79258437994 139.7056 1393 | 6629.93924083531 126.9963 1394 | 6630.08589729069 271.0854 1395 | 6630.23255374606 194.0513 1396 | 6630.37921020144 204.9893 1397 | 6630.52586665682 221.5909 1398 | 6630.67252311219 228.8563 1399 | 6630.81917956757 234.3129 1400 | 6630.96583602294 195.278 1401 | 6631.11249247832 181.4191 1402 | 6631.25914893369 128.9827 1403 | 6631.40580538907 216.1818 1404 | 6631.55246184445 292.0102 1405 | 6631.69911829982 196.8522 1406 | 6631.8457747552 233.862 1407 | 6631.99243121057 190.8298 1408 | 6632.13908766595 203.4566 1409 | 6632.28574412133 177.8127 1410 | 6632.4324005767 206.4914 1411 | 6632.57905703208 148.2997 1412 | 6632.72571348746 223.0939 1413 | 6632.87236994283 227.9191 1414 | 6633.01902639821 72.91753 1415 | 6633.16568285358 173.7725 1416 | 6633.31233930896 222.474 1417 | 6633.45899576433 125.1814 1418 | 6633.60565221971 139.025 1419 | 6633.75230867509 185.9449 1420 | 6633.89896513046 214.9978 1421 | 6634.04562158584 235.5835 1422 | 6634.19227804121 288.8055 1423 | 6634.33893449659 185.9473 1424 | 6634.48559095196 175.9714 1425 | 6634.63224740734 178.5878 1426 | 6634.77890386272 133.8118 1427 | 6634.92556031809 114.901 1428 | 6635.07221677347 157.3939 1429 | 6635.21887322884 155.1574 1430 | 6635.36552968422 225.4003 1431 | 6635.5121861396 165.485 1432 | 6635.65884259497 178.4563 1433 | 6635.80549905035 105.3557 1434 | 6635.95215550572 167.431 1435 | 6636.0988119611 161.4153 1436 | 6636.24546841647 206.3685 1437 | 6636.39212487185 276.0359 1438 | 6636.53878132723 175.3636 1439 | 6636.6854377826 271.3178 1440 | 6636.83209423798 222.2335 1441 | 6636.97875069335 88.85374 1442 | 6637.12540714873 282.5864 1443 | 6637.27206360411 250.3462 1444 | 6637.41872005948 112.3573 1445 | 6637.56537651486 149.407 1446 | 6637.71203297023 219.9272 1447 | 6637.85868942561 164.7282 1448 | 6638.00534588098 128.9444 1449 | 6638.15200233636 159.9653 1450 | 6638.29865879174 125.8622 1451 | 6638.44531524711 157.2221 1452 | 6638.59197170249 176.205 1453 | 6638.73862815786 196.0692 1454 | 6638.88528461324 213.4377 1455 | 6639.03194106862 156.1867 1456 | 6639.17859752399 189.0084 1457 | 6639.32525397937 239.2356 1458 | 6639.47191043474 331.84 1459 | 6639.61856689012 305.3728 1460 | 6639.7652233455 140.5447 1461 | 6639.91187980087 228.1169 1462 | 6640.05853625625 191.7988 1463 | 6640.20519271162 198.6622 1464 | 6640.351849167 200.7946 1465 | 6640.49850562238 178.8168 1466 | 6640.64516207775 172.6138 1467 | 6640.79181853313 137.2177 1468 | 6640.9384749885 125.4885 1469 | 6641.08513144388 150.36 1470 | 6641.23178789925 113.0308 1471 | 6641.37844435463 168.0334 1472 | 6641.52510081001 225.4622 1473 | 6641.67175726538 162.876 1474 | 6641.81841372076 175.6653 1475 | 6641.96507017613 183.3372 1476 | 6642.11172663151 238.3735 1477 | 6642.25838308689 212.2405 1478 | 6642.40503954226 146.1895 1479 | 6642.55169599764 147.6148 1480 | 6642.69835245301 170.1644 1481 | 6642.84500890839 220.7706 1482 | 6642.99166536376 166.4191 1483 | 6643.13832181914 115.6568 1484 | 6643.28497827452 159.0657 1485 | 6643.43163472989 163.9312 1486 | 6643.57829118527 155.9548 1487 | 6643.72494764064 117.888 1488 | 6643.87160409602 213.8676 1489 | 6644.0182605514 239.6886 1490 | 6644.16491700677 241.4238 1491 | 6644.31157346215 160.1875 1492 | 6644.45822991752 163.7926 1493 | 6644.6048863729 232.7233 1494 | 6644.75154282827 217.698 1495 | 6644.89819928365 146.7339 1496 | 6645.04485573903 225.7327 1497 | 6645.1915121944 220.0934 1498 | 6645.33816864978 251.3642 1499 | 6645.48482510515 200.3754 1500 | 6645.63148156053 191.3808 1501 | 6645.7781380159 189.0415 1502 | 6645.92479447128 163.5497 1503 | 6646.07145092666 160.2577 1504 | 6646.21810738203 137.9286 1505 | 6646.36476383741 230.2594 1506 | 6646.51142029279 184.0872 1507 | 6646.65807674816 253.2845 1508 | 6646.80473320354 173.6404 1509 | 6646.95138965891 161.2415 1510 | 6647.09804611429 169.5623 1511 | 6647.24470256967 272.1558 1512 | 6647.39135902504 260.4583 1513 | 6647.53801548042 198.3636 1514 | 6647.68467193579 154.8896 1515 | 6647.83132839117 203.2605 1516 | 6647.97798484654 207.1161 1517 | 6648.12464130192 212.9476 1518 | 6648.2712977573 206.6654 1519 | 6648.41795421267 164.0907 1520 | 6648.56461066805 215.4099 1521 | 6648.71126712342 215.3425 1522 | 6648.8579235788 93.80142 1523 | 6649.00458003418 164.3911 1524 | 6649.15123648955 142.5781 1525 | 6649.29789294493 261.6137 1526 | 6649.4445494003 173.2639 1527 | 6649.59120585568 133.33 1528 | 6649.73786231105 224.0782 1529 | 6649.88451876643 201.9677 1530 | 6650.03117522181 172.0605 1531 | 6650.17783167718 258.0645 1532 | 6650.32448813256 168.4947 1533 | 6650.47114458793 137.6056 1534 | 6650.61780104331 108.3519 1535 | 6650.76445749869 133.2868 1536 | 6650.91111395406 123.1896 1537 | 6651.05777040944 203.2931 1538 | 6651.20442686481 173.2295 1539 | 6651.35108332019 181.8334 1540 | 6651.49773977557 199.6114 1541 | 6651.64439623094 217.2514 1542 | 6651.79105268632 70.9881 1543 | 6651.93770914169 41.91805 1544 | 6652.08436559707 154.9469 1545 | 6652.23102205245 108.5635 1546 | 6652.37767850782 79.65182 1547 | 6652.52433496319 177.4102 1548 | 6652.67099141857 215.3093 1549 | 6652.81764787395 119.0186 1550 | 6652.96430432932 178.4666 1551 | 6653.1109607847 213.9674 1552 | 6653.25761724008 198.1872 1553 | 6653.40427369545 141.8152 1554 | 6653.55093015083 112.8576 1555 | 6653.6975866062 166.097 1556 | 6653.84424306158 149.8951 1557 | 6653.99089951696 128.9433 1558 | 6654.13755597233 190.1507 1559 | 6654.28421242771 139.3059 1560 | 6654.43086888308 109.7026 1561 | 6654.57752533846 63.34818 1562 | 6654.72418179383 122.8049 1563 | 6654.87083824921 128.7327 1564 | 6655.01749470459 150.1728 1565 | 6655.16415115996 217.2484 1566 | 6655.31080761534 185.6585 1567 | 6655.45746407071 201.7187 1568 | 6655.60412052609 184.4025 1569 | 6655.75077698147 197.1855 1570 | 6655.89743343684 130.4298 1571 | 6656.04408989222 150.7943 1572 | 6656.19074634759 189.7526 1573 | 6656.33740280297 227.9741 1574 | 6656.48405925835 187.5416 1575 | 6656.63071571372 151.02 1576 | 6656.7773721691 166.5492 1577 | 6656.92402862447 105.299 1578 | 6657.07068507985 162.4478 1579 | 6657.21734153522 228.8627 1580 | 6657.3639979906 117.7102 1581 | 6657.51065444598 148.2947 1582 | 6657.65731090135 184.2785 1583 | 6657.80396735673 237.2005 1584 | 6657.9506238121 148.2634 1585 | 6658.09728026748 36.44136 1586 | 6658.24393672285 128.2952 1587 | 6658.39059317823 133.8991 1588 | 6658.53724963361 165.6066 1589 | 6658.68390608898 145.9675 1590 | 6658.83056254436 116.3591 1591 | 6658.97721899973 78.06361 1592 | 6659.12387545511 51.3557 1593 | 6659.27053191049 119.9377 1594 | 6659.41718836586 174.4342 1595 | 6659.56384482124 138.3766 1596 | 6659.71050127661 129.4732 1597 | 6659.85715773199 141.575 1598 | 6660.00381418736 142.9995 1599 | 6660.15047064274 122.3977 1600 | 6660.29712709812 33.70505 1601 | 6660.44378355349 93.0497 1602 | 6660.59044000887 160.8294 1603 | 6660.73709646425 76.52708 1604 | 6660.88375291962 107.7761 1605 | 6661.030409375 72.00413 1606 | 6661.17706583037 91.17594 1607 | 6661.32372228575 99.97955 1608 | 6661.47037874112 73.792 1609 | 6661.6170351965 86.54167 1610 | 6661.76369165188 163.5819 1611 | 6661.91034810725 227.3017 1612 | 6662.05700456263 133.4113 1613 | 6662.203661018 52.89118 1614 | 6662.35031747338 141.0884 1615 | 6662.49697392876 153.1884 1616 | 6662.64363038413 156.6171 1617 | 6662.79028683951 108.6235 1618 | 6662.93694329488 118.9408 1619 | 6663.08359975026 141.7455 1620 | 6663.23025620564 135.7544 1621 | 6663.37691266101 112.8626 1622 | 6663.52356911639 117.1737 1623 | 6663.67022557176 133.7811 1624 | 6663.81688202714 116.0276 1625 | 6663.96353848251 108.8752 1626 | 6664.11019493789 101.104 1627 | 6664.25685139327 199.2945 1628 | 6664.40350784864 159.3139 1629 | 6664.55016430402 185.4659 1630 | 6664.69682075939 229.6116 1631 | 6664.84347721477 158.3027 1632 | 6664.99013367015 117.8701 1633 | 6665.13679012552 95.32306 1634 | 6665.2834465809 85.30643 1635 | 6665.43010303627 173.2317 1636 | 6665.57675949165 100.8398 1637 | 6665.72341594703 137.0558 1638 | 6665.8700724024 79.78004 1639 | 6666.01672885778 121.8985 1640 | 6666.16338531315 150.8818 1641 | 6666.31004176853 181.0966 1642 | 6666.4566982239 162.7959 1643 | 6666.60335467928 180.12 1644 | 6666.75001113466 121.1801 1645 | 6666.89666759003 152.5504 1646 | 6667.04332404541 133.1696 1647 | 6667.18998050078 204.3986 1648 | 6667.33663695616 128.7816 1649 | 6667.48329341154 66.77262 1650 | 6667.62994986691 146.6253 1651 | 6667.77660632229 183.2932 1652 | 6667.92326277766 180.4992 1653 | 6668.06991923304 189.4852 1654 | 6668.21657568841 136.1804 1655 | 6668.36323214379 206.0521 1656 | 6668.50988859917 185.7171 1657 | 6668.65654505454 150.507 1658 | 6668.80320150992 80.45966 1659 | 6668.94985796529 74.76597 1660 | 6669.09651442067 150.4176 1661 | 6669.24317087605 224.3971 1662 | 6669.38982733142 157.6527 1663 | 6669.5364837868 228.8113 1664 | 6669.68314024217 75.64437 1665 | 6669.82979669755 86.97521 1666 | 6669.97645315292 85.94996 1667 | 6670.1231096083 62.19365 1668 | 6670.26976606368 64.61758 1669 | 6670.41642251905 139.6445 1670 | 6670.56307897443 96.45654 1671 | 6670.70973542981 66.42998 1672 | 6670.85639188518 97.7496 1673 | 6671.00304834056 101.7126 1674 | 6671.14970479593 152.829 1675 | 6671.29636125131 118.1279 1676 | 6671.44301770668 163.5172 1677 | 6671.58967416206 53.11142 1678 | 6671.73633061744 8.955628 1679 | 6671.88298707281 62.56757 1680 | 6672.02964352819 151.5761 1681 | 6672.17629998356 141.3522 1682 | 6672.32295643894 137.8768 1683 | 6672.46961289431 197.6718 1684 | 6672.61626934969 261.0243 1685 | 6672.76292580507 220.7006 1686 | 6672.90958226044 165.2782 1687 | 6673.05623871582 93.56291 1688 | 6673.20289517119 184.6577 1689 | 6673.34955162657 128.6561 1690 | 6673.49620808194 94.48392 1691 | 6673.64286453732 92.16611 1692 | 6673.7895209927 129.0556 1693 | 6673.93617744807 161.6248 1694 | 6674.08283390345 78.90186 1695 | 6674.22949035882 66.38065 1696 | 6674.3761468142 148.6133 1697 | 6674.52280326958 141.1688 1698 | 6674.66945972495 133.8917 1699 | 6674.81611618033 71.92426 1700 | 6674.9627726357 100.5115 1701 | 6675.10942909108 141.2148 1702 | 6675.25608554646 134.9798 1703 | 6675.40274200183 105.1558 1704 | 6675.54939845721 132.3192 1705 | 6675.69605491258 188.8339 1706 | 6675.84271136796 129.5592 1707 | 6675.98936782333 76.93475 1708 | 6676.13602427871 138.7006 1709 | 6676.28268073409 110.9372 1710 | 6676.42933718946 78.30631 1711 | 6676.57599364484 134.5562 1712 | 6676.72265010021 201.5042 1713 | 6676.86930655559 100.1808 1714 | 6677.01596301096 111.4546 1715 | 6677.16261946634 100.0953 1716 | 6677.30927592172 20.41196 1717 | 6677.4559323771 134.1926 1718 | 6677.60258883247 198.9172 1719 | 6677.74924528785 231.6532 1720 | 6677.89590174322 105.443 1721 | 6678.0425581986 68.14558 1722 | 6678.18921465397 56.08713 1723 | 6678.33587110935 127.2224 1724 | 6678.48252756473 121.6061 1725 | 6678.6291840201 133.101 1726 | 6678.77584047548 125.1735 1727 | 6678.92249693085 160.5165 1728 | 6679.06915338623 86.15865 1729 | 6679.2158098416 81.14252 1730 | 6679.36246629698 127.0557 1731 | 6679.50912275236 13.3845 1732 | 6679.65577920773 21.9064 1733 | 6679.80243566311 65.11073 1734 | 6679.94909211849 62.18032 1735 | 6680.09574857386 89.70582 1736 | 6680.24240502924 159.0518 1737 | 6680.38906148461 64.2681 1738 | 6680.53571793999 126.4171 1739 | 6680.68237439536 126.6657 1740 | 6680.82903085074 5.142114 1741 | 6680.97568730611 5.616825 1742 | 6681.12234376149 49.82827 1743 | 6681.26900021687 123.8462 1744 | 6681.41565667224 102.3737 1745 | 6681.56231312762 62.2305 1746 | 6681.70896958299 82.41239 1747 | 6681.85562603837 21.16046 1748 | 6682.00228249375 34.77487 1749 | 6682.14893894912 101.3744 1750 | 6682.2955954045 75.19334 1751 | 6682.44225185987 52.26025 1752 | 6682.58890831525 -12.2713 1753 | 6682.73556477062 69.85818 1754 | 6682.882221226 179.8672 1755 | 6683.02887768138 102.7543 1756 | 6683.17553413675 63.18265 1757 | 6683.32219059213 35.47468 1758 | 6683.4688470475 86.15482 1759 | 6683.61550350288 148.859 1760 | 6683.76215995826 213.3774 1761 | 6683.90881641363 180.2833 1762 | 6684.05547286901 121.991 1763 | 6684.20212932438 97.39527 1764 | 6684.34878577976 75.1129 1765 | 6684.49544223514 97.00099 1766 | 6684.64209869051 39.89835 1767 | 6684.78875514589 160.0928 1768 | 6684.93541160126 93.87389 1769 | 6685.08206805664 122.5158 1770 | 6685.22872451202 125.5056 1771 | 6685.37538096739 101.4166 1772 | 6685.52203742277 83.68145 1773 | 6685.66869387814 70.46232 1774 | 6685.81535033352 112.3236 1775 | 6685.96200678889 99.74578 1776 | 6686.10866324427 29.56859 1777 | 6686.25531969965 93.4889 1778 | 6686.40197615502 113.915 1779 | 6686.5486326104 160.6926 1780 | 6686.69528906577 54.66016 1781 | 6686.84194552115 118.2206 1782 | 6686.98860197653 128.095 1783 | 6687.1352584319 76.96481 1784 | 6687.28191488728 35.13975 1785 | 6687.42857134265 54.93733 1786 | 6687.57522779803 77.9778 1787 | 6687.7218842534 25.72269 1788 | 6687.86854070878 -8.807614 1789 | 6688.01519716416 72.7886 1790 | 6688.16185361953 87.04781 1791 | 6688.30851007491 87.92777 1792 | 6688.45516653028 44.73328 1793 | 6688.60182298566 69.17641 1794 | 6688.74847944104 12.11328 1795 | 6688.89513589641 193.4829 1796 | 6689.04179235179 141.4421 1797 | 6689.18844880716 186.835 1798 | 6689.33510526254 74.73262 1799 | 6689.48176171792 19.70574 1800 | 6689.62841817329 49.77089 1801 | 6689.77507462867 -1.945571 1802 | 6689.92173108404 115.9485 1803 | 6690.06838753942 100.1583 1804 | 6690.2150439948 94.47063 1805 | 6690.36170045017 94.9845 1806 | 6690.50835690554 110.0756 1807 | 6690.65501336092 60.07783 1808 | 6690.8016698163 -54.59105 1809 | 6690.94832627168 102.2115 1810 | 6691.09498272705 55.92234 1811 | 6691.24163918243 114.8033 1812 | 6691.3882956378 -48.27692 1813 | 6691.53495209318 -41.15751 1814 | 6691.68160854855 41.72194 1815 | 6691.82826500393 49.62345 1816 | 6691.97492145931 83.2029 1817 | 6692.12157791468 24.46673 1818 | 6692.26823437006 39.64292 1819 | 6692.41489082543 115.1512 1820 | 6692.56154728081 103.4127 1821 | 6692.70820373618 38.24713 1822 | 6692.85486019156 41.65711 1823 | 6693.00151664694 146.361 1824 | 6693.14817310231 136.6607 1825 | 6693.29482955769 135.204 1826 | 6693.44148601306 109.5445 1827 | 6693.58814246844 120.6532 1828 | 6693.73479892382 82.26462 1829 | 6693.88145537919 109.684 1830 | 6694.02811183457 92.0491 1831 | 6694.17476828994 75.48916 1832 | 6694.32142474532 76.19907 1833 | 6694.4680812007 16.70801 1834 | 6694.61473765607 120.3727 1835 | 6694.76139411145 76.47886 1836 | 6694.90805056682 81.77024 1837 | 6695.0547070222 56.4377 1838 | 6695.20136347757 103.5729 1839 | 6695.34801993295 49.44217 1840 | 6695.49467638833 85.72097 1841 | 6695.6413328437 164.5569 1842 | 6695.78798929908 145.1264 1843 | 6695.93464575445 75.52757 1844 | 6696.08130220983 82.21582 1845 | 6696.2279586652 14.2152 1846 | 6696.37461512058 -31.16217 1847 | 6696.52127157596 -112.7178 1848 | 6696.66792803133 -19.42927 1849 | 6696.81458448671 66.54971 1850 | 6696.96124094209 69.87047 1851 | 6697.10789739746 99.15749 1852 | 6697.25455385284 63.54883 1853 | 6697.40121030821 54.56546 1854 | 6697.54786676359 87.75666 1855 | 6697.69452321896 65.83519 1856 | 6697.84117967434 54.65728 1857 | 6697.98783612972 88.39872 1858 | 6698.13449258509 69.75486 1859 | 6698.28114904047 42.35424 1860 | 6698.42780549584 53.95549 1861 | 6698.57446195122 134.9552 1862 | 6698.7211184066 89.04726 1863 | 6698.86777486197 99.69238 1864 | 6699.01443131735 29.61012 1865 | 6699.16108777272 23.01299 1866 | 6699.3077442281 47.80523 1867 | 6699.45440068347 63.2922 1868 | 6699.60105713885 85.47765 1869 | 6699.74771359423 100.1308 1870 | 6699.8943700496 -15.36889 1871 | 6700.04102650498 40.48402 1872 | 6700.18768296035 59.80405 1873 | 6700.33433941573 52.80512 1874 | 6700.48099587111 137.2136 1875 | 6700.62765232648 20.69531 1876 | 6700.77430878186 38.11709 1877 | 6700.92096523723 112.0869 1878 | 6701.06762169261 40.956 1879 | 6701.21427814799 24.42157 1880 | 6701.36093460336 -6.117372 1881 | 6701.50759105874 104.1449 1882 | 6701.65424751411 123.4631 1883 | 6701.80090396949 -9.132534 1884 | 6701.94756042486 93.97433 1885 | 6702.09421688024 55.91268 1886 | 6702.24087333562 13.83509 1887 | 6702.38752979099 -27.93554 1888 | 6702.53418624637 79.22815 1889 | 6702.68084270174 22.07458 1890 | 6702.82749915712 76.57798 1891 | 6702.97415561249 19.43046 1892 | 6703.12081206787 -28.43075 1893 | 6703.26746852325 -43.50156 1894 | 6703.41412497862 32.32796 1895 | 6703.560781434 86.64172 1896 | 6703.70743788937 23.46238 1897 | 6703.85409434475 92.19767 1898 | 6704.00075080013 63.73403 1899 | 6704.1474072555 61.14849 1900 | 6704.29406371088 -43.56305 1901 | 6704.44072016625 -50.15998 1902 | 6704.58737662163 129.1151 1903 | 6704.73403307701 88.79467 1904 | 6704.88068953238 -25.82769 1905 | 6705.02734598776 30.39192 1906 | 6705.17400244313 94.58587 1907 | 6705.32065889851 1.799872 1908 | 6705.46731535389 10.92026 1909 | 6705.61397180926 94.57939 1910 | 6705.76062826464 124.5555 1911 | 6705.90728472001 90.06426 1912 | 6706.05394117539 42.02292 1913 | 6706.20059763077 11.56075 1914 | 6706.34725408614 80.90027 1915 | 6706.49391054152 76.24354 1916 | 6706.64056699689 56.97467 1917 | 6706.78722345227 91.2066 1918 | 6706.93387990764 65.69446 1919 | 6707.08053636302 27.08086 1920 | 6707.2271928184 94.87392 1921 | 6707.37384927377 93.66444 1922 | 6707.52050572915 27.26361 1923 | 6707.66716218452 -5.337761 1924 | 6707.8138186399 13.00508 1925 | 6707.96047509528 83.40136 1926 | 6708.10713155065 -54.43883 1927 | 6708.25378800603 -52.05021 1928 | 6708.4004444614 94.41907 1929 | 6708.54710091678 56.0958 1930 | 6708.69375737216 25.38389 1931 | 6708.84041382753 29.23238 1932 | 6708.98707028291 81.76717 1933 | 6709.13372673828 108.4555 1934 | 6709.28038319366 89.07328 1935 | 6709.42703964903 45.96837 1936 | 6709.57369610441 51.29948 1937 | 6709.72035255979 30.58655 1938 | 6709.86700901516 42.32869 1939 | 6710.01366547054 39.00105 1940 | 6710.16032192591 -27.16566 1941 | 6710.30697838129 24.88566 1942 | 6710.45363483667 93.12434 1943 | 6710.60029129204 57.91033 1944 | 6710.74694774742 -61.10773 1945 | 6710.89360420279 -94.15269 1946 | 6711.04026065817 7.104421 1947 | 6711.18691711354 77.54015 1948 | 6711.33357356892 6.725111 1949 | 6711.4802300243 8.260183 1950 | 6711.62688647967 125.3586 1951 | 6711.77354293505 45.32916 1952 | 6711.92019939042 55.07585 1953 | 6712.0668558458 93.61189 1954 | 6712.21351230118 13.44003 1955 | 6712.36016875655 18.0626 1956 | 6712.50682521193 -12.37784 1957 | 6712.6534816673 65.36227 1958 | 6712.80013812268 118.7461 1959 | 6712.94679457805 103.2055 1960 | 6713.09345103343 89.17715 1961 | 6713.24010748881 80.09884 1962 | 6713.38676394418 -56.06086 1963 | 6713.53342039956 -31.82805 1964 | 6713.68007685493 94.12908 1965 | 6713.82673331031 103.2452 1966 | 6713.97338976569 -4.955136 1967 | 6714.12004622106 21.13272 1968 | 6714.26670267644 -10.05623 1969 | 6714.41335913181 39.59972 1970 | 6714.56001558719 101.572 1971 | 6714.70667204256 59.65905 1972 | 6714.85332849794 58.95206 1973 | 6714.99998495332 77.01693 1974 | 6715.14664140869 13.85927 1975 | 6715.29329786407 -27.88043 1976 | 6715.43995431945 -1.152264 1977 | 6715.58661077482 47.46487 1978 | 6715.7332672302 37.11018 1979 | 6715.87992368557 54.62857 1980 | 6716.02658014095 90.7709 1981 | 6716.17323659632 10.68226 1982 | 6716.3198930517 56.02105 1983 | 6716.46654950708 16.93428 1984 | 6716.61320596245 61.9372 1985 | 6716.75986241783 -13.23743 1986 | 6716.9065188732 0.6416206 1987 | 6717.05317532858 43.17947 1988 | 6717.19983178395 26.40118 1989 | 6717.34648823933 55.17821 1990 | 6717.49314469471 -60.64636 1991 | 6717.63980115008 3.519597 1992 | 6717.78645760546 38.36404 1993 | 6717.93311406084 -13.62472 1994 | 6718.07977051621 -74.23183 1995 | 6718.22642697159 -5.274443 1996 | 6718.37308342696 60.2217 1997 | 6718.51973988234 71.69642 1998 | 6718.66639633771 75.03237 1999 | 6718.81305279309 -49.28942 2000 | 6718.95970924846 -10.87632 2001 | 6719.10636570384 74.66318 2002 | 6719.25302215922 10.75944 2003 | 6719.39967861459 64.52384 2004 | 6719.54633506997 30.84675 2005 | 6719.69299152534 36.18697 2006 | 6719.83964798072 2.224311 2007 | 6719.9863044361 59.72824 2008 | 6720.13296089147 39.85081 2009 | 6720.27961734685 81.72473 2010 | 6720.42627380222 56.40321 2011 | 6720.5729302576 91.4016 2012 | 6720.71958671297 126.1261 2013 | 6720.86624316835 83.55839 2014 | 6721.01289962373 20.36595 2015 | 6721.1595560791 31.50176 2016 | 6721.30621253448 55.20758 2017 | 6721.45286898985 64.87359 2018 | 6721.59952544523 17.75085 2019 | 6721.74618190061 6.220811 2020 | 6721.89283835598 33.55834 2021 | 6722.03949481136 19.8217 2022 | 6722.18615126674 57.46819 2023 | 6722.33280772211 16.62341 2024 | 6722.47946417749 4.966805 2025 | 6722.62612063286 50.86965 2026 | 6722.77277708824 14.60241 2027 | 6722.91943354361 67.17075 2028 | 6723.06608999899 35.1352 2029 | 6723.21274645437 4.625997 2030 | 6723.35940290974 49.875 2031 | 6723.50605936512 59.26043 2032 | 6723.65271582049 -5.723684 2033 | 6723.79937227587 -51.14908 2034 | 6723.94602873124 -64.82422 2035 | 6724.09268518662 3.665047 2036 | 6724.239341642 -16.82057 2037 | 6724.38599809737 25.74037 2038 | 6724.53265455275 80.13545 2039 | 6724.67931100812 -6.773116 2040 | 6724.8259674635 96.25413 2041 | 6724.97262391888 81.42145 2042 | 6725.11928037425 86.61235 2043 | 6725.26593682963 19.66483 2044 | 6725.412593285 -7.753021 2045 | 6725.55924974038 -94.37636 2046 | 6725.70590619576 -42.26364 2047 | 6725.85256265113 -74.03084 2048 | 6725.99921910651 -65.23758 2049 | -------------------------------------------------------------------------------- /pydoppler/test_data/ugem99/ugem0all.fas: -------------------------------------------------------------------------------- 1 | txhugem4004 0.7150 0.03930 2 | txhugem4005 0.7794 0.03930 3 | txhugem4006 0.8348 0.03930 4 | txhugem4007 0.8942 0.03930 5 | txhugem4008 0.9518 0.03930 6 | txhugem4009 0.0072 0.03930 7 | txhugem4010 0.0632 0.03930 8 | txhugem4011 0.1186 0.03930 9 | txhugem4012 0.1745 0.03930 10 | txhugem4013 0.2344 0.03930 11 | txhugem4014 0.2904 0.03930 12 | txhugem4015 0.3724 0.03930 13 | txhugem4016 0.4283 0.03930 14 | txhugem4017 0.4866 0.03930 15 | txhugem4018 0.5425 0.03930 16 | txhugem4019 0.5979 0.03930 17 | txhugem4020 0.6544 0.03930 18 | txhugem4021 0.7098 0.03930 19 | txhugem4022 0.7652 0.03930 20 | txhugem4023 0.8195 0.03930 21 | txhugem4024 0.8772 0.03930 22 | txhugem4025 0.9269 0.03930 23 | txhugem4026 0.9614 0.03930 24 | txhugem4027 0.9959 0.03930 25 | txhugem4028 0.0304 0.03930 26 | txhugem4029 0.0648 0.03930 27 | txhugem4030 0.1027 0.03930 28 | txhugem4031 0.1372 0.03930 29 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | # Inside of setup.cfg 2 | [metadata] 3 | description-file = README.md 4 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | 3 | # upload to pip 4 | # pip install . 5 | # python3 setup.py sdist bdist_wheel 6 | # twine upload dist/pydoppler-0.1.8.tar.gz 7 | 8 | import os 9 | 10 | paths = [] 11 | def package_files(directory): 12 | for (path, directories, filenames) in os.walk(directory): 13 | for filename in filenames: 14 | paths.append(os.path.join('..', path, filename)) 15 | 16 | package_files('pydoppler/fortran_code') 17 | package_files('pydoppler/test_data') 18 | 19 | 20 | setuptools.setup( 21 | name='pydoppler', 22 | version='0.2.0', 23 | packages=['pydoppler'] , 24 | package_data={'': paths}, 25 | author="Juan V. Hernandez Santisteban", 26 | author_email="jvhs1@st-andrews.ac.uk", 27 | description="A python wrapper for Henk Spruit's doppler tomography sowftare", 28 | long_description_content_type="text/markdown", 29 | url="https://github.com/alymantara/pydoppler", 30 | classifiers=[ 31 | "Programming Language :: Python :: 3", 32 | "License :: OSI Approved :: MIT License", 33 | "Operating System :: OS Independent", 34 | ], 35 | ) 36 | --------------------------------------------------------------------------------