@typescriptify/sweph 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/README.md +422 -0
  2. package/ephe/semo_18.se1 +0 -0
  3. package/ephe/sepl_18.se1 +0 -0
  4. package/originalCode/.eslintrc.json +124 -0
  5. package/originalCode/.gitattributes +2 -0
  6. package/originalCode/.github/FUNDING.yml +5 -0
  7. package/originalCode/.github/workflows/test.yml +35 -0
  8. package/originalCode/LICENSE +840 -0
  9. package/originalCode/README.md +91 -0
  10. package/originalCode/binding.gyp +41 -0
  11. package/originalCode/constants.js +366 -0
  12. package/originalCode/docs.gif +0 -0
  13. package/originalCode/index.d.ts +5115 -0
  14. package/originalCode/index.js +7 -0
  15. package/originalCode/index.mjs +109 -0
  16. package/originalCode/package.json +55 -0
  17. package/originalCode/src/functions/azalt.cpp +39 -0
  18. package/originalCode/src/functions/azalt_rev.cpp +35 -0
  19. package/originalCode/src/functions/calc.cpp +29 -0
  20. package/originalCode/src/functions/calc_pctr.cpp +31 -0
  21. package/originalCode/src/functions/calc_ut.cpp +29 -0
  22. package/originalCode/src/functions/close.cpp +6 -0
  23. package/originalCode/src/functions/cotrans.cpp +26 -0
  24. package/originalCode/src/functions/cotrans_sp.cpp +26 -0
  25. package/originalCode/src/functions/cs2degstr.cpp +19 -0
  26. package/originalCode/src/functions/cs2lonlatstr.cpp +23 -0
  27. package/originalCode/src/functions/cs2timestr.cpp +23 -0
  28. package/originalCode/src/functions/csnorm.cpp +15 -0
  29. package/originalCode/src/functions/csroundsec.cpp +15 -0
  30. package/originalCode/src/functions/d2l.cpp +15 -0
  31. package/originalCode/src/functions/date_conversion.cpp +30 -0
  32. package/originalCode/src/functions/day_of_week.cpp +15 -0
  33. package/originalCode/src/functions/degnorm.cpp +15 -0
  34. package/originalCode/src/functions/deltat.cpp +15 -0
  35. package/originalCode/src/functions/deltat_ex.cpp +24 -0
  36. package/originalCode/src/functions/difcs2n.cpp +19 -0
  37. package/originalCode/src/functions/difcsn.cpp +19 -0
  38. package/originalCode/src/functions/difdeg2n.cpp +19 -0
  39. package/originalCode/src/functions/difdegn.cpp +19 -0
  40. package/originalCode/src/functions/fixstar.cpp +32 -0
  41. package/originalCode/src/functions/fixstar2.cpp +32 -0
  42. package/originalCode/src/functions/fixstar2_mag.cpp +28 -0
  43. package/originalCode/src/functions/fixstar2_ut.cpp +32 -0
  44. package/originalCode/src/functions/fixstar_mag.cpp +28 -0
  45. package/originalCode/src/functions/fixstar_ut.cpp +32 -0
  46. package/originalCode/src/functions/gauquelin_sector.cpp +44 -0
  47. package/originalCode/src/functions/get_ayanamsa.cpp +15 -0
  48. package/originalCode/src/functions/get_ayanamsa_ex.cpp +27 -0
  49. package/originalCode/src/functions/get_ayanamsa_ex_ut.cpp +27 -0
  50. package/originalCode/src/functions/get_ayanamsa_name.cpp +19 -0
  51. package/originalCode/src/functions/get_ayanamsa_ut.cpp +15 -0
  52. package/originalCode/src/functions/get_current_file_data.cpp +28 -0
  53. package/originalCode/src/functions/get_library_path.cpp +8 -0
  54. package/originalCode/src/functions/get_orbital_elements.cpp +29 -0
  55. package/originalCode/src/functions/get_planet_name.cpp +19 -0
  56. package/originalCode/src/functions/get_tid_acc.cpp +7 -0
  57. package/originalCode/src/functions/heliacal_pheno_ut.cpp +52 -0
  58. package/originalCode/src/functions/heliacal_ut.cpp +52 -0
  59. package/originalCode/src/functions/helio_cross.cpp +33 -0
  60. package/originalCode/src/functions/helio_cross_ut.cpp +33 -0
  61. package/originalCode/src/functions/house_name.cpp +20 -0
  62. package/originalCode/src/functions/house_pos.cpp +36 -0
  63. package/originalCode/src/functions/houses.cpp +35 -0
  64. package/originalCode/src/functions/houses_armc.cpp +38 -0
  65. package/originalCode/src/functions/houses_armc_ex2.cpp +47 -0
  66. package/originalCode/src/functions/houses_ex.cpp +37 -0
  67. package/originalCode/src/functions/houses_ex2.cpp +46 -0
  68. package/originalCode/src/functions/jdet_to_utc.cpp +38 -0
  69. package/originalCode/src/functions/jdut1_to_utc.cpp +38 -0
  70. package/originalCode/src/functions/julday.cpp +25 -0
  71. package/originalCode/src/functions/lat_to_lmt.cpp +27 -0
  72. package/originalCode/src/functions/lmt_to_lat.cpp +27 -0
  73. package/originalCode/src/functions/lun_eclipse_how.cpp +34 -0
  74. package/originalCode/src/functions/lun_eclipse_when.cpp +31 -0
  75. package/originalCode/src/functions/lun_eclipse_when_loc.cpp +39 -0
  76. package/originalCode/src/functions/lun_occult_when_glob.cpp +35 -0
  77. package/originalCode/src/functions/lun_occult_when_loc.cpp +43 -0
  78. package/originalCode/src/functions/lun_occult_where.cpp +34 -0
  79. package/originalCode/src/functions/mooncross.cpp +26 -0
  80. package/originalCode/src/functions/mooncross_node.cpp +30 -0
  81. package/originalCode/src/functions/mooncross_node_ut.cpp +30 -0
  82. package/originalCode/src/functions/mooncross_ut.cpp +26 -0
  83. package/originalCode/src/functions/nod_aps.cpp +42 -0
  84. package/originalCode/src/functions/nod_aps_ut.cpp +42 -0
  85. package/originalCode/src/functions/orbit_max_min_true_distance.cpp +37 -0
  86. package/originalCode/src/functions/pheno.cpp +29 -0
  87. package/originalCode/src/functions/pheno_ut.cpp +29 -0
  88. package/originalCode/src/functions/radnorm.cpp +15 -0
  89. package/originalCode/src/functions/refrac.cpp +23 -0
  90. package/originalCode/src/functions/refrac_extended.cpp +32 -0
  91. package/originalCode/src/functions/revjul.cpp +33 -0
  92. package/originalCode/src/functions/rise_trans.cpp +44 -0
  93. package/originalCode/src/functions/rise_trans_true_hor.cpp +46 -0
  94. package/originalCode/src/functions/set_delta_t_userdef.cpp +14 -0
  95. package/originalCode/src/functions/set_ephe_path.cpp +14 -0
  96. package/originalCode/src/functions/set_jpl_file.cpp +14 -0
  97. package/originalCode/src/functions/set_sid_mode.cpp +20 -0
  98. package/originalCode/src/functions/set_tid_acc.cpp +14 -0
  99. package/originalCode/src/functions/set_topo.cpp +20 -0
  100. package/originalCode/src/functions/sidtime.cpp +15 -0
  101. package/originalCode/src/functions/sidtime0.cpp +21 -0
  102. package/originalCode/src/functions/sol_eclipse_how.cpp +34 -0
  103. package/originalCode/src/functions/sol_eclipse_when_glob.cpp +31 -0
  104. package/originalCode/src/functions/sol_eclipse_when_loc.cpp +39 -0
  105. package/originalCode/src/functions/sol_eclipse_where.cpp +30 -0
  106. package/originalCode/src/functions/solcross.cpp +26 -0
  107. package/originalCode/src/functions/solcross_ut.cpp +26 -0
  108. package/originalCode/src/functions/split_deg.cpp +35 -0
  109. package/originalCode/src/functions/time_equ.cpp +25 -0
  110. package/originalCode/src/functions/utc_time_zone.cpp +48 -0
  111. package/originalCode/src/functions/utc_to_jd.cpp +37 -0
  112. package/originalCode/src/functions/version.cpp +8 -0
  113. package/originalCode/src/functions/vis_limit_mag.cpp +50 -0
  114. package/originalCode/src/sweph.cpp +150 -0
  115. package/originalCode/src/sweph.h +119 -0
  116. package/originalCode/swisseph/swecl.c +6428 -0
  117. package/originalCode/swisseph/swedate.c +588 -0
  118. package/originalCode/swisseph/swedate.h +81 -0
  119. package/originalCode/swisseph/swehel.c +3511 -0
  120. package/originalCode/swisseph/swehouse.c +3143 -0
  121. package/originalCode/swisseph/swehouse.h +98 -0
  122. package/originalCode/swisseph/swejpl.c +958 -0
  123. package/originalCode/swisseph/swejpl.h +103 -0
  124. package/originalCode/swisseph/swemmoon.c +1930 -0
  125. package/originalCode/swisseph/swemplan.c +967 -0
  126. package/originalCode/swisseph/swemptab.h +10640 -0
  127. package/originalCode/swisseph/swenut2000a.h +2819 -0
  128. package/originalCode/swisseph/sweodef.h +326 -0
  129. package/originalCode/swisseph/sweph.c +8614 -0
  130. package/originalCode/swisseph/sweph.h +849 -0
  131. package/originalCode/swisseph/swephexp.h +1020 -0
  132. package/originalCode/swisseph/swephlib.c +4634 -0
  133. package/originalCode/swisseph/swephlib.h +189 -0
  134. package/package.json +28 -0
  135. package/scripts/gen-swemptab.js +177 -0
  136. package/scripts/gen-swenut2000a.js +106 -0
  137. package/src/SwissEph/README.md +268 -0
  138. package/src/SwissEph/UseCases/Ayanamsa.md +363 -0
  139. package/src/SwissEph/UseCases/AzimuthAltitude.md +408 -0
  140. package/src/SwissEph/UseCases/CoordinateSystems.md +337 -0
  141. package/src/SwissEph/UseCases/DateAndTime.md +368 -0
  142. package/src/SwissEph/UseCases/DeltaT.md +258 -0
  143. package/src/SwissEph/UseCases/EphemerisFiles.md +338 -0
  144. package/src/SwissEph/UseCases/FixedStars.md +300 -0
  145. package/src/SwissEph/UseCases/GauquelinSectors.md +304 -0
  146. package/src/SwissEph/UseCases/HeliacalEvents.md +396 -0
  147. package/src/SwissEph/UseCases/HelioCrossings.md +325 -0
  148. package/src/SwissEph/UseCases/HousePosition.md +254 -0
  149. package/src/SwissEph/UseCases/HouseSystems.md +279 -0
  150. package/src/SwissEph/UseCases/LunarEclipse.md +326 -0
  151. package/src/SwissEph/UseCases/MeridianTransit.md +279 -0
  152. package/src/SwissEph/UseCases/MoonCrossings.md +373 -0
  153. package/src/SwissEph/UseCases/NodesAndApsides.md +307 -0
  154. package/src/SwissEph/UseCases/Occultation.md +352 -0
  155. package/src/SwissEph/UseCases/OrbitalElements.md +469 -0
  156. package/src/SwissEph/UseCases/Phenomena.md +328 -0
  157. package/src/SwissEph/UseCases/PlanetPositions.md +366 -0
  158. package/src/SwissEph/UseCases/Planetocentric.md +278 -0
  159. package/src/SwissEph/UseCases/Refraction.md +314 -0
  160. package/src/SwissEph/UseCases/RiseAndSet.md +433 -0
  161. package/src/SwissEph/UseCases/SiderealTime.md +302 -0
  162. package/src/SwissEph/UseCases/SolarEclipse.md +379 -0
  163. package/src/SwissEph/UseCases/SunCrossings.md +275 -0
  164. package/src/SwissEph/UseCases/TopocentricCorrection.md +335 -0
  165. package/src/SwissEph/errors.ts +10 -0
  166. package/src/SwissEph/index.ts +823 -0
  167. package/src/SwissEph/types.ts +291 -0
  168. package/src/constants.ts +762 -0
  169. package/src/file-reader.ts +147 -0
  170. package/src/index.ts +10 -0
  171. package/src/swecl.ts +4526 -0
  172. package/src/swedate.ts +376 -0
  173. package/src/swehel.ts +1939 -0
  174. package/src/swehouse.ts +2167 -0
  175. package/src/swejpl.ts +470 -0
  176. package/src/swemmoon.ts +1318 -0
  177. package/src/swemplan.ts +585 -0
  178. package/src/swemptab.ts +4448 -0
  179. package/src/swenut2000a.ts +2763 -0
  180. package/src/sweph.ts +3993 -0
  181. package/src/swephlib.ts +2720 -0
  182. package/src/types.ts +490 -0
  183. package/tests/c-style/ayanamsa.test.ts +63 -0
  184. package/tests/c-style/config.test.ts +96 -0
  185. package/tests/c-style/crossings.test.ts +81 -0
  186. package/tests/c-style/date-time.test.ts +114 -0
  187. package/tests/c-style/eclipses.test.ts +84 -0
  188. package/tests/c-style/fixed-stars.test.ts +66 -0
  189. package/tests/c-style/heliacal.test.ts +34 -0
  190. package/tests/c-style/houses.test.ts +135 -0
  191. package/tests/c-style/math-utils.test.ts +160 -0
  192. package/tests/c-style/orbital.test.ts +78 -0
  193. package/tests/c-style/phenomena.test.ts +42 -0
  194. package/tests/c-style/planetocentric.test.ts +26 -0
  195. package/tests/c-style/planets.test.ts +117 -0
  196. package/tests/c-style/rise-set.test.ts +71 -0
  197. package/tests/helpers.ts +21 -0
  198. package/tests/modern/ayanamsa.test.ts +47 -0
  199. package/tests/modern/calc.test.ts +113 -0
  200. package/tests/modern/config.test.ts +46 -0
  201. package/tests/modern/crossings.test.ts +45 -0
  202. package/tests/modern/eclipses.test.ts +81 -0
  203. package/tests/modern/errors.test.ts +71 -0
  204. package/tests/modern/heliacal.test.ts +30 -0
  205. package/tests/modern/houses.test.ts +87 -0
  206. package/tests/modern/orbital.test.ts +79 -0
  207. package/tests/modern/phenomena.test.ts +41 -0
  208. package/tests/modern/rise-set.test.ts +60 -0
  209. package/tests/modern/statics.test.ts +99 -0
  210. package/tests/modern/utilities.test.ts +70 -0
  211. package/tsconfig.json +20 -0
@@ -0,0 +1,304 @@
1
+ # Gauquelin Sectors
2
+
3
+ **Michel Gauquelin** (1928-1991) was a French psychologist and statistician who conducted one of the most controversial and widely-discussed statistical studies in the history of astrology. He collected birth data for tens of thousands of professionals and found that the positions of certain planets at the moment of birth correlated with professional eminence in specific fields. To analyze these correlations, he divided the sky into **36 sectors** (a finer division than the 12 astrological houses) based on the planet's diurnal arc -- the path it traces across the sky from rising to setting.
4
+
5
+ His most famous finding, the **"Mars effect,"** showed that an unusually high proportion of eminent athletes were born when Mars had just risen above the horizon or had just passed the meridian (culminated). Similar effects were found for Jupiter and actors, Saturn and scientists, and the Moon and writers.
6
+
7
+ The `gauquelinSector()` method calculates which of the 36 sectors a planet occupies at a given moment, for a specific geographic location.
8
+
9
+ ---
10
+
11
+ ## Quick Example
12
+
13
+ ```typescript
14
+ import { SwissEph } from '../index';
15
+ import { SE_MARS } from '../../constants';
16
+
17
+ const swe = new SwissEph();
18
+ const jd = SwissEph.julianDay(1960, 10, 30, 2.5); // Oct 30, 1960, 02:30 UT
19
+
20
+ // Diego Maradona's approximate birth location (Lanús, Argentina)
21
+ const geo = { longitude: -58.39, latitude: -34.70 };
22
+
23
+ const result = swe.gauquelinSector(jd, SE_MARS, geo);
24
+ console.log(`Mars Gauquelin sector: ${result.sector.toFixed(2)}`);
25
+ // A sector near 1 (just risen) or 10 (just culminated) would be in a "plus zone"
26
+
27
+ swe.close();
28
+ ```
29
+
30
+ ---
31
+
32
+ ## Detailed Examples
33
+
34
+ ### Checking all classical planets for Gauquelin sectors
35
+
36
+ ```typescript
37
+ import { SwissEph } from '../index';
38
+ import {
39
+ SE_MOON, SE_VENUS, SE_MARS,
40
+ SE_JUPITER, SE_SATURN,
41
+ } from '../../constants';
42
+
43
+ const swe = new SwissEph();
44
+
45
+ // Example birth data
46
+ const jd = SwissEph.julianDay(1985, 7, 15, 14.5); // Jul 15, 1985, 14:30 UT
47
+ const geo = { longitude: 2.3522, latitude: 48.8566 }; // Paris
48
+
49
+ const planets = [
50
+ { id: SE_MOON, name: 'Moon' },
51
+ { id: SE_VENUS, name: 'Venus' },
52
+ { id: SE_MARS, name: 'Mars' },
53
+ { id: SE_JUPITER, name: 'Jupiter' },
54
+ { id: SE_SATURN, name: 'Saturn' },
55
+ ];
56
+
57
+ for (const pl of planets) {
58
+ const r = swe.gauquelinSector(jd, pl.id, geo);
59
+ const sector = Math.floor(r.sector);
60
+
61
+ // Check if in a "plus zone"
62
+ const risePlus = [36, 1, 2, 3];
63
+ const culminPlus = [9, 10, 11, 12];
64
+ const isRisePlus = risePlus.includes(sector);
65
+ const isCulminPlus = culminPlus.includes(sector);
66
+
67
+ let zone = '';
68
+ if (isRisePlus) zone = ' ← PLUS ZONE (rise)';
69
+ if (isCulminPlus) zone = ' ← PLUS ZONE (culmination)';
70
+
71
+ console.log(`${pl.name.padEnd(9)} sector ${sector.toString().padStart(2)}${zone}`);
72
+ }
73
+
74
+ swe.close();
75
+ ```
76
+
77
+ ### Using different calculation methods
78
+
79
+ The `method` parameter controls how the sectors are calculated:
80
+
81
+ ```typescript
82
+ import { SwissEph } from '../index';
83
+ import { SE_MARS } from '../../constants';
84
+
85
+ const swe = new SwissEph();
86
+ const jd = SwissEph.julianDay(1990, 5, 20, 8.0);
87
+ const geo = { longitude: -0.1276, latitude: 51.5074 }; // London
88
+
89
+ // Method 0: sector from ecliptic longitude and house position (Placidus)
90
+ // Method 1: sector from ecliptic longitude and house position (Placidus),
91
+ // planet/house computed from rising and setting of the planet
92
+ // Method 2: sector from right ascension of MC and house position (Placidus)
93
+ // Method 3: sector from right ascension of MC and house position (Placidus),
94
+ // planet/house computed from rising and setting of the planet
95
+
96
+ for (let method = 0; method <= 3; method++) {
97
+ const r = swe.gauquelinSector(jd, SE_MARS, geo, method);
98
+ console.log(`Method ${method}: Mars sector = ${r.sector.toFixed(4)}`);
99
+ }
100
+
101
+ swe.close();
102
+ ```
103
+
104
+ ### Full "Mars effect" analysis for a group of athletes
105
+
106
+ This example demonstrates how you might analyze a collection of birth data to look for the Mars effect pattern:
107
+
108
+ ```typescript
109
+ import { SwissEph } from '../index';
110
+ import { SE_MARS } from '../../constants';
111
+
112
+ const swe = new SwissEph();
113
+
114
+ // Hypothetical athlete birth data (JD, longitude, latitude)
115
+ const athletes = [
116
+ { jd: SwissEph.julianDay(1960, 10, 30, 2.5), geo: { longitude: -58.39, latitude: -34.70 } },
117
+ { jd: SwissEph.julianDay(1940, 10, 23, 19.0), geo: { longitude: -43.17, latitude: -22.91 } },
118
+ { jd: SwissEph.julianDay(1981, 8, 29, 18.0), geo: { longitude: 2.35, latitude: 48.86 } },
119
+ { jd: SwissEph.julianDay(1942, 1, 17, 8.0), geo: { longitude: 13.40, latitude: 52.52 } },
120
+ ];
121
+
122
+ // Count how many have Mars in the plus zones
123
+ const risePlusZones = [36, 1, 2, 3];
124
+ const culminPlusZones = [9, 10, 11, 12];
125
+ const allPlusZones = [...risePlusZones, ...culminPlusZones];
126
+
127
+ let plusCount = 0;
128
+
129
+ for (const a of athletes) {
130
+ const r = swe.gauquelinSector(jd, SE_MARS, a.geo);
131
+ const sector = Math.floor(r.sector);
132
+ if (allPlusZones.includes(sector)) plusCount++;
133
+ }
134
+
135
+ const expectedPct = (8 / 36) * 100; // 22.2% expected by chance
136
+ const actualPct = (plusCount / athletes.length) * 100;
137
+
138
+ console.log(`Athletes with Mars in plus zones: ${plusCount}/${athletes.length}`);
139
+ console.log(`Expected by chance: ${expectedPct.toFixed(1)}%`);
140
+ console.log(`Actual: ${actualPct.toFixed(1)}%`);
141
+ // Gauquelin found ~22% for ordinary people vs ~30%+ for eminent athletes
142
+
143
+ swe.close();
144
+ ```
145
+
146
+ ### Accounting for atmospheric refraction
147
+
148
+ The `pressure` and `temperature` parameters allow you to control atmospheric refraction, which affects the precise moment a planet appears to rise or set:
149
+
150
+ ```typescript
151
+ import { SwissEph } from '../index';
152
+ import { SE_MARS } from '../../constants';
153
+
154
+ const swe = new SwissEph();
155
+ const jd = SwissEph.julianDay(1990, 5, 20, 8.0);
156
+ const geo = { longitude: 2.35, latitude: 48.86, altitude: 35 }; // Paris, 35m elevation
157
+
158
+ // Default atmospheric conditions
159
+ const r1 = swe.gauquelinSector(jd, SE_MARS, geo, 0, 1013.25, 15);
160
+ console.log(`Standard atmosphere: sector ${r1.sector.toFixed(4)}`);
161
+
162
+ // Custom conditions (high altitude, low pressure, cold)
163
+ const r2 = swe.gauquelinSector(jd, SE_MARS, geo, 0, 900, 5);
164
+ console.log(`Mountain conditions: sector ${r2.sector.toFixed(4)}`);
165
+
166
+ // No refraction (pressure = 0)
167
+ const r3 = swe.gauquelinSector(jd, SE_MARS, geo, 0, 0, 0);
168
+ console.log(`No refraction: sector ${r3.sector.toFixed(4)}`);
169
+
170
+ swe.close();
171
+ ```
172
+
173
+ ---
174
+
175
+ ## Deep Explanation
176
+
177
+ ### How Gauquelin Sectors Work
178
+
179
+ The 36 Gauquelin sectors are essentially the 12 Placidus houses, each subdivided into 3 equal parts. They are based on the **diurnal arc** -- the path a celestial body traces across the sky during one day.
180
+
181
+ A planet's diurnal cycle consists of:
182
+ 1. **Rising** (crossing the eastern horizon) -- the Ascendant
183
+ 2. **Culminating** (crossing the upper meridian) -- the Midheaven (MC)
184
+ 3. **Setting** (crossing the western horizon) -- the Descendant
185
+ 4. **Anti-culminating** (crossing the lower meridian) -- the IC
186
+
187
+ The sectors are numbered 1-36, starting from the Ascendant and proceeding in the direction of **diurnal motion** (clockwise in a standard chart):
188
+
189
+ ```
190
+ MC (Midheaven)
191
+ Sectors 9-10-11
192
+ |
193
+ |
194
+ Sectors ----+---- Sectors
195
+ 4-5-6-7-8 | 12-13-14-15-16
196
+ |
197
+ Sectors 17-18
198
+ IC (Imum Coeli)
199
+ |
200
+ Sectors ----+---- Sectors
201
+ 19-20-21-22-23 | 27-28-29-30-31
202
+ |
203
+ Sectors 24-25-26
204
+ Desc (Setting)
205
+ |
206
+ Sectors 32-33
207
+ |
208
+ Sectors ----+---- Sectors
209
+ 34-35-36 | 34-35-36...
210
+ |
211
+ ASC (Rising)
212
+ Sectors 36-1
213
+ ```
214
+
215
+ The numbering proceeds: sector 36 is just above the eastern horizon (the planet has just risen), sector 1 is just below the eastern horizon (the planet is about to rise or has just risen -- the convention counts clockwise from the ASC). A planet at the MC is around sectors 9-10.
216
+
217
+ ### The Plus Zones and Minus Zones
218
+
219
+ Gauquelin identified four "plus zones" and four "minus zones" arranged in a cross pattern:
220
+
221
+ | Zone | Sectors | Sky position | Meaning |
222
+ |------|---------|-------------|---------|
223
+ | Plus Zone 1 | 36, 1, 2, 3 | Just after rising | Planet has just risen |
224
+ | Plus Zone 2 | 9, 10, 11, 12 | Just after culmination | Planet has just passed MC |
225
+ | Plus Zone 3 | 19, 20, 21 | Just after setting | Planet has just set |
226
+ | Plus Zone 4 | 28, 29, 30 | Just after anti-culmination | Planet has just passed IC |
227
+
228
+ The rise and culmination plus zones (1 and 2) showed the strongest effects. The setting and IC zones showed weaker but still elevated frequencies.
229
+
230
+ ### The Mars Effect
231
+
232
+ Gauquelin's most famous finding: among **2,088 eminent European sports champions**, Mars appeared in the plus zones significantly more often than chance would predict.
233
+
234
+ Expected by chance: ~22% (8 out of 36 sectors)
235
+ Observed for champions: ~30%+
236
+
237
+ This result was replicated multiple times, including by skeptical organizations (CSICOP/CFEPP), though the interpretation of those replications remains disputed.
238
+
239
+ ### Other Gauquelin Findings
240
+
241
+ | Planet | Profession | Effect |
242
+ |--------|-----------|--------|
243
+ | Mars | Athletes, military leaders | Plus zones over-represented |
244
+ | Jupiter | Actors, politicians | Plus zones over-represented |
245
+ | Saturn | Scientists, doctors | Plus zones over-represented |
246
+ | Moon | Writers, politicians | Plus zones over-represented |
247
+
248
+ Gauquelin found NO significant effects for the Sun, Mercury, Venus, Uranus, Neptune, or Pluto. He also found no effects for "ordinary" people -- only for those who achieved eminence in their profession.
249
+
250
+ ### Method Parameter Details
251
+
252
+ The `method` parameter controls two aspects of the calculation:
253
+
254
+ **Ecliptic vs. Equatorial (methods 0-1 vs. 2-3)**:
255
+ - Methods 0 and 1 compute the sector based on the planet's ecliptic longitude (the standard astrological coordinate)
256
+ - Methods 2 and 3 use the planet's right ascension and the MC's right ascension (equatorial coordinates)
257
+
258
+ **Standard vs. Planet-based houses (even vs. odd methods)**:
259
+ - Methods 0 and 2 divide the diurnal arc based on the ecliptic (like standard Placidus houses)
260
+ - Methods 1 and 3 divide the diurnal arc based on the actual rising and setting times of the planet itself. This is more astronomically precise because different planets rise and set at different points along the horizon depending on their declination
261
+
262
+ For most Gauquelin research, method 0 is standard.
263
+
264
+ ### Relationship to Placidus Houses
265
+
266
+ Gauquelin sectors map directly to Placidus houses:
267
+ - Sectors 1-3 = 12th house (planet has just risen)
268
+ - Sectors 4-6 = 11th house
269
+ - Sectors 7-9 = 10th house (approaching MC)
270
+ - Sectors 10-12 = 9th house (just past MC)
271
+ - Sectors 13-15 = 8th house
272
+ - Sectors 16-18 = 7th house (approaching Descendant)
273
+ - Sectors 19-21 = 6th house (just past setting)
274
+ - Sectors 22-24 = 5th house
275
+ - Sectors 25-27 = 4th house (approaching IC)
276
+ - Sectors 28-30 = 3rd house (just past IC)
277
+ - Sectors 31-33 = 2nd house
278
+ - Sectors 34-36 = 1st house (approaching rise)
279
+
280
+ Note the numbering direction: sector 1 starts just past the Ascendant going clockwise (which is the 12th house in a standard chart), and the numbers increase in the direction of diurnal motion.
281
+
282
+ ### Controversy and Scientific Reception
283
+
284
+ The Gauquelin findings remain one of the most debated topics at the intersection of science and astrology:
285
+
286
+ **In favor**: The Mars effect was replicated by multiple independent groups. The data was collected from official civil registries, making fabrication difficult. The effect showed appropriate "dose-response" -- it was stronger for more eminent athletes.
287
+
288
+ **Against**: Skeptics raised concerns about demographic artifacts (birth times being rounded to certain hours), possible selection bias in choosing which athletes counted as "eminent," and the absence of any known physical mechanism.
289
+
290
+ **Current status**: Most scientists consider the effect to be a statistical artifact or the result of subtle methodological issues, while proponents argue that no specific flaw has been identified that explains the full pattern of results.
291
+
292
+ ### Return Type
293
+
294
+ ```typescript
295
+ interface GauquelinResult {
296
+ sector: number; // Fractional sector value, 1.0–36.999...
297
+ }
298
+ ```
299
+
300
+ The returned value is a fractional number. For example, `1.5` means the planet is in the middle of sector 1. Use `Math.floor(result.sector)` to get the integer sector number (but note that sector 0 should be treated as sector 36).
301
+
302
+ ### Requirements
303
+
304
+ Gauquelin sector calculation requires a geographic location because it depends on the local horizon and meridian. The calculation will not work without a valid `geo` parameter containing longitude and latitude.