| Conditions | 17 |
| Total Lines | 201 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 1 | ||
| Bugs | 0 | Features | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
Complex classes like ne_spiral_arm() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
| 1 | """ Density for spiral arms |
||
| 14 | def ne_spiral_arm(xyz, Aa, wa, ha, farms, harms, narms, warms, adict): |
||
| 15 | """ |
||
| 16 | Parameters |
||
| 17 | ---------- |
||
| 18 | xyz |
||
| 19 | gal_param |
||
| 20 | adict |
||
| 21 | |||
| 22 | Returns |
||
| 23 | ------- |
||
| 24 | nea : ndarray or float |
||
| 25 | whicharm : ndarray or int |
||
| 26 | |||
| 27 | c----------------------------------------------------------------------- |
||
| 28 | c Spiral arms are defined as logarithmic spirals using the |
||
| 29 | c parameterization in Wainscoat et al. 1992, ApJS, 83, 111-146. |
||
| 30 | c But arms are modified selectively at various places to distort them |
||
| 31 | c as needed (08 Aug 2000). |
||
| 32 | c Note that arm numbering follows that of TC93 for the four large arms |
||
| 33 | c (after remapping). |
||
| 34 | c The local spiral arm is number 5. |
||
| 35 | c 06 Apr 02: removed TC type modifications of arms 2,3 (fac calculations) |
||
| 36 | c and replaced with new versions. Data for these are hard wired. |
||
| 37 | """ |
||
| 38 | x, y, z = xyz[0], xyz[1], xyz[-1] |
||
| 39 | if isinstance(x, float): |
||
| 40 | x = np.array([x]) |
||
| 41 | y = np.array([y]) |
||
| 42 | z = np.array([z]) |
||
| 43 | flg_float = True |
||
| 44 | else: |
||
| 45 | flg_float = False |
||
| 46 | |||
| 47 | # see get_parameters for definitions of narm, warm, harm. |
||
| 48 | # narmsmax = 5 |
||
| 49 | # common/armfactors/ |
||
| 50 | # . harm(narmsmax),narm(narmsmax),warm(narmsmax),farm(narmsmax) |
||
| 51 | |||
| 52 | # parameter(rad=57.29577 95130 823) |
||
| 53 | rad = 180/np.pi |
||
| 54 | # ks = 3 |
||
| 55 | # NN = 7 |
||
| 56 | nfine = 1000 |
||
| 57 | |||
| 58 | # rr |
||
| 59 | rr = rad2d2(xyz) |
||
| 60 | if flg_float: |
||
| 61 | rr = np.array([rr]) |
||
| 62 | |||
| 63 | # |
||
| 64 | # Get spiral arm component: 30 do loop finds a coarse minimum distance |
||
| 65 | # from line of sight to arm; 40 do loop finds a fine minimum distance |
||
| 66 | # from line of sight to arm; line 35 ensures that arm limits are not |
||
| 67 | # exceeded; linear interpolation beginning at line 41 finds the |
||
| 68 | # minimum distance from line of sight to arm on a finer scale than gridding |
||
| 69 | # of arms allows (TJL) |
||
| 70 | |||
| 71 | # Init |
||
| 72 | whicharm = np.zeros_like(x).astype(int) |
||
| 73 | nea = np.zeros_like(x) |
||
| 74 | |||
| 75 | # thxy |
||
| 76 | thxy = np.arctan2(-x, y) * rad # measured ccw from +y axis (different from tc93 theta) |
||
| 77 | neg_th = thxy < 0. |
||
| 78 | thxy[neg_th] += 360. |
||
| 79 | # Cut on values near the disk |
||
| 80 | icutz = np.where(np.abs(z/ha) < 10.)[0] |
||
| 81 | if len(icutz) > 0: |
||
| 82 | cutx = x[icutz] |
||
| 83 | cuty = y[icutz] |
||
| 84 | cutz = z[icutz] |
||
| 85 | sminmin = 1.e10 * np.ones_like(cutx) |
||
| 86 | else: |
||
| 87 | # Time to return |
||
| 88 | return nea |
||
| 89 | # Find closest distance to each arm and then assign arm |
||
| 90 | # We will brute force with a spline |
||
| 91 | # Could get memory intensive |
||
| 92 | # Could refine |
||
| 93 | for j in range(adict['narms']): |
||
| 94 | # do 50 j=1,narms |
||
| 95 | jj = adict['armmap'][j] |
||
| 96 | # Crude |
||
| 97 | xarm = adict['arm'][j, :adict['kmax'][j], 0] |
||
| 98 | yarm = adict['arm'][j, :adict['kmax'][j], 1] |
||
| 99 | |||
| 100 | xtmp = np.outer(cutx, np.ones_like(xarm)) |
||
| 101 | ytmp = np.outer(cuty, np.ones_like(yarm)) |
||
| 102 | xatmp = np.outer(np.ones_like(cutx), xarm) |
||
| 103 | yatmp = np.outer(np.ones_like(cuty), yarm) |
||
| 104 | dist = (xtmp-xatmp)**2 + (ytmp-yatmp)**2 |
||
| 105 | kmin = np.argmin(dist, axis=1) |
||
| 106 | |||
| 107 | # Refine with a Spline? -- Requires a loop |
||
| 108 | csp_xarm = CubicSpline(np.arange(adict['kmax'][j]), |
||
| 109 | adict['arm'][j, :adict['kmax'][j], 0]) |
||
| 110 | csp_yarm = CubicSpline(np.arange(adict['kmax'][j]), |
||
| 111 | adict['arm'][j, :adict['kmax'][j], 1]) |
||
| 112 | jtmp = np.zeros((len(cutx), nfine)) |
||
| 113 | for ii, ix in enumerate(cutx): |
||
| 114 | j0 = max(0, kmin[ii]-1) |
||
| 115 | j1 = min(adict['kmax'][j], kmin[ii]+1) |
||
| 116 | jtmp[ii, :] = np.linspace(j0, j1, num=nfine) |
||
| 117 | xjarm = csp_xarm(jtmp) |
||
| 118 | yjarm = csp_yarm(jtmp) |
||
| 119 | xtmp = np.outer(cutx, np.ones(nfine)) |
||
| 120 | ytmp = np.outer(cuty, np.ones(nfine)) |
||
| 121 | dist = (xtmp-xjarm)**2 + (ytmp-yjarm)**2 |
||
| 122 | # kmin2 = np.argmin(dist, axis=1) |
||
| 123 | min_dist2 = np.amin(dist, axis=1) |
||
| 124 | |||
| 125 | smin = np.sqrt(min_dist2) # Distance of (x,y,z) from this arm's axis |
||
| 126 | # Close enough? |
||
| 127 | gd_wa = np.where(smin < (3*wa))[0] |
||
| 128 | if len(gd_wa) > 0: |
||
| 129 | # ga |
||
| 130 | ga = np.exp(-(smin[gd_wa]/warms[jj - 1]/wa)**2) # arm, get the arm weighting factor |
||
| 131 | # Galactocentric radial dependence of arms |
||
| 132 | tmp_rr = rr[icutz[gd_wa]] |
||
| 133 | lg_rr = tmp_rr > Aa |
||
| 134 | if np.sum(lg_rr) > 0: |
||
| 135 | ga[lg_rr] *= 1. / (np.cosh((tmp_rr[lg_rr]-Aa)/2.0))**2 |
||
| 136 | |||
| 137 | # arm3 reweighting: |
||
| 138 | if adict['armmap'][j] == 3: |
||
| 139 | th3a = 320. |
||
| 140 | th3b = 390. |
||
| 141 | th3b = 370. |
||
| 142 | th3a = 290. |
||
| 143 | th3b = 363. |
||
| 144 | th3b = 363. |
||
| 145 | fac3min = 0.0 |
||
| 146 | test3 = thxy[icutz[gd_wa]]-th3a |
||
| 147 | neg_t3 = test3 < 0 |
||
| 148 | test3[neg_t3] += 360. |
||
| 149 | gd_t3 = (0. <= test3) & (test3 < (th3b-th3a)) |
||
| 150 | if np.sum(gd_t3) > 0: |
||
| 151 | arg = 6.2831853*(thxy[icutz[gd_wa]][gd_t3]-th3a)/(th3b-th3a) |
||
| 152 | fac = (1.+fac3min + (1.-fac3min)*np.cos(arg))/2. |
||
| 153 | fac = fac**4.0 |
||
| 154 | # Update ga |
||
| 155 | ga[gd_t3] *= fac |
||
| 156 | |||
| 157 | # arm2 reweighting: |
||
| 158 | if adict['armmap'][j] == 2: |
||
| 159 | th2a = 35. |
||
| 160 | th2b = 55. |
||
| 161 | test2 = thxy[icutz[gd_wa]]-th2a |
||
| 162 | fac = 1. |
||
| 163 | if False: |
||
| 164 | # first: as in tc93 (note different definition of theta) |
||
| 165 | gd_t2_first = (0 <= test2) & (test2 < (th2b-th2a)) |
||
| 166 | if np.sum(gd_t2_first) > 0: |
||
| 167 | fac = 1. + test2[gd_t2_first]/(th2b-th2a) |
||
| 168 | fac = 1. # !**** note turned off |
||
| 169 | # ga=ga*fac |
||
| 170 | gd_t2_first2 = test2 > (th2b-th2a) |
||
| 171 | if np.sum(gd_t2_first2) > 0: |
||
| 172 | fac = 2. |
||
| 173 | fac = 1. # !**** note turned off |
||
| 174 | # ga=ga*fac |
||
| 175 | # c second: weaken the arm in a short range: |
||
| 176 | th2a = 340. |
||
| 177 | th2b = 370. |
||
| 178 | # c note fix does nothing if fac2min = 1.0 |
||
| 179 | fac2min = 0.1 |
||
| 180 | neg_t2 = test2 < 0. |
||
| 181 | test2[neg_t2] += 360. |
||
| 182 | gd_t2_snd = (0. <= test2) & (test2 < (th2b-th2a)) |
||
| 183 | if np.sum(gd_t2_snd) > 0: |
||
| 184 | arg = 6.2831853*(thxy[icutz[gd_wa]][gd_t2_snd]-th2a)/(th2b-th2a) |
||
| 185 | fac = (1.+fac2min + (1.-fac2min)*np.cos(arg))/2. |
||
| 186 | # Update ga |
||
| 187 | ga[gd_t2_snd] *= fac |
||
| 188 | |||
| 189 | # Find the ones which are closer than any previous arm |
||
| 190 | iclosest = smin[gd_wa] < sminmin[gd_wa] |
||
| 191 | if np.sum(iclosest) > 0: |
||
| 192 | whicharm[icutz[gd_wa[iclosest]]] = adict['armmap'][j] |
||
| 193 | |||
| 194 | # Update nea |
||
| 195 | nea[icutz[gd_wa]] += narms[jj - 1] * ( |
||
| 196 | ga / (np.cosh(cutz[gd_wa]/(harms[jj - 1]*ha))**2)) |
||
| 197 | if flg_float: |
||
| 198 | nea = float(nea[0]) |
||
| 199 | whicharm = int(whicharm[0]) |
||
| 200 | |||
| 201 | # Return |
||
| 202 | return nea |
||
| 203 | |||
| 204 | ''' |
||
| 205 | Farms = 0 |
||
| 206 | if(whicharm_spiralmodel .eq. 0) then |
||
| 207 | whicharm = 0 |
||
| 208 | else |
||
| 209 | whicharm = armmap(whicharm_spiralmodel) ! remap arm number |
||
| 210 | Farms = Fa * farm(whicharm) |
||
| 211 | endif |
||
| 212 | return |
||
| 213 | end |
||
| 214 | ''' |
||
| 215 |