The AstroPatterns User's Guide
Installation and Prerequisites
The installation is quite easy. Simply download the most recent release from the SourceForge project area, which is a zip compressed folder, to your computer. Extract the whole folder to a destination of your choice. That's all – after this step, AstroPatterns is ready to use! The software doesn't require any registry entries and also runs perfectly as a portable application from your USB stick (to be really portably, it will be a good idea to copy the Swiss Ephemeris folder with all its contents to the stick as well).
Content of the AstroPatterns download folder
After extracting (unzipping) the download, the folder will (currently) show the following content:
What are these files?
- AstroPatterns.xls is the Excel workbook for AstroPatterns. It is the main User Interface for AstroPatterns. Customizing and data input are distributed over several worksheets.
- apc.exe is a command-line tool for calling some AstroPatterns functions. It is a predecessor of apc+.exe but may still be useful for some very simple calls of AstroPatterns (type ap -h to get help on its options).
- apc+.exe is a flexible interactive shell for AstroPatterns, accepting an astrological programming language as input. See the apc+ Documentation for details.
- astropatterns.dll is the core library of AstroPatterns. It contains all the logic and functionality exposed in this documentation. The other programs of the folder like apc+ or AstroPatterns.xls only provide different kinds of access to these functions – these functions themselves being implemented in astropatterns.dll.
- davdb.csv is an extract of the Deutscher Astrologen-Verband database, initiated and mainly assembled by Dr. Peter Niehenke. The extract contains the data in the simple format required by the ListRange of AstroPatterns: Using a Perl program, the Julian date, longitude and latitude of the first A93/B93 record for the person in question have been extracted, together with the string "Last name, first name" which is used as label. davdb.csv can be used as direct file input for the ListRange. There is a caveat: 1'149 records of the AAF file could not be transformed with the script and are therefore missing in this CSV file. The reason was that no #B93 part of the record was present, so the geographical longitude and latitude could not be extracted. We remain with 27'876 horoscopes, a big part of them collected by the famous Michel and Françoise Gauquelin. The file must not be used commercially and is subject to license terms.
- HoroGraphic.exe is a small Windows program for visualization of horoscopes. It displays one or two horoscopes, the user can control its content by some keys and the clipboard, as described in the HoroGraphic documentation.
- swedll32.dll is the core library of the Swiss Ephemeris, containing the algorithms for the computation of the planetary positions. It is part of the Swiss Ephemeris distribution and subject to its own license. It is part of the release only as a fallback. Usually, you can instruct Windows to look for the Swiss Ephemeris library in your sweph folder. If you don't do this, Windows will take the DLL contained in this folder.
- test.exe is an executable containing some self-test of the library. If you start it in a MS-DOS console window, it should execute and pass some 30 or 40 automatical tests. This program exists only for diagnostical purposes.
- locations.txt is a list of locations, mainly in Germany, in a format suitable for the console programs apc.exe and apc+.exe (for the Excel Sheet, this file is not used).
Installing Swiss Ephemeris
AstroPatterns has only one external dependency - it needs the Swiss Ephemeris (see the linked site for download). When you have downloaded the folder sweph on your computer (which contains the library and the Swiss Ephemeris data), you may tell AstroPatterns the location of the ephemeris files in the worksheet General:
AstroPatterns needs not only to find the ephemeris files but also the library swedll32.dll which contains the executable code of the Swiss Ephemeris calculation algorithms. To achieve this, you may either add the subdirectory sweph/bin to the environment variable PATH of your computer. If you don't do this, AstroPatterns will use the current version of the DLL (1.73) which I have made part of the AstroPatterns distribution.
Here is a short guide how to extend the system's PATH variable:
- Go to Start -> Control Panel -> System -> Advanced
- Click on Environment Variables, under System Variables, find PATH, and click on it.
- In the Edit windows, modify PATH by adding the location of the class to the value for PATH. If you have placed the Swiss Ephemeris on C:\sweph, so that the DLL has the full path c:\sweph\bin\swedll32.dll, you add to the existing PATH string the string C:\sweph\bin containing all the binaries of the Swiss Ephemeris distribution.
- Close the window. A restart shouldn't be necessary.
The source code is publicly available on the sourceforge CVS repository of AstroPatterns. The web interface of the CVS is found on http://astropatterns.cvs.sourceforge.net/viewvc/astropatterns/. It contains the C++ code of the DLL as well as the code for HoroGraphic and apc+. Also, the VBA code of AstroPattern.xls and this documentation are under version control.
First steps with AstroPatterns.xls
As a first example, we will compute the list of all syzygies (full and new moons) for the year 2010 using AstroPatterns.xls. We open the Excel sheet AstroPatterns.xls.
The Visual Basic part of the workbook contains the glue code necessary for calling the AstroPattern functions, as well as input checks, parsing of constellation formulae, etc. Since Visual Basic macros can be abused for writing malware, you will get a macro warning when opening the Excel workbook the first time: You are asked whether you really want to process the Visual Basic code of this workbook. In order to use AstroPatterns, you need to confirm this question.
The control of AstroPatterns.xls is spread over several worksheets. These worksheets have specific names by which they are addressed in the coding. Also, the input areas are expected to be in certain cell Ranges. Hence you are free to add more sheets to the workbook, but you shouldn't change the names or layout of the existing worksheets. For some sheets, I have introduced a sheet protection (with empty password) - just to prevent that you accidentally change cell contents.
After opening, AstroPatterns.xls will automatically navigate to the Workplace sheet. As start date and end date, we enter 2010. This tells AstroPatterns to put the allowed time interval from January 1, 2010 until the end of December 31, 2010. The field Max Size can be used to control the length of the list to a certain maximum. If you look for the charts giving the highest score for a certain Pattern, it will accelerate the application significantly if you bound the list size here. In the case at hand – computing syzygies – we know that the list is bounded by 24 anyway: There can be no more than 24 syzygies in a year. It is therefore of no relevance to impose a bound here. We leave the field empty.
Next, we open the Run Settings dialog and choose "Syzygy" for Range and "No Pattern":
In the section to the right which is reserved for data of a reference horoscope, we only enter some geographical coordinates. Since for syzygies, no reference horoscope is required, this goes OK. The geographical coordinates will nevertheless serve as base for the chart display in the hit list.
Before we finally hit Compute, the blue control area finally looks as follows:
The computer then puts the result into the worksheet, a list of 24 dates, as expected:
The list shows for each hit the Julian date – a successive day number – then the Calendar Date and the Ephemeris Time (ET). There is no Score in this case - because score values are only computed in the presence of Patterns: In our simple example, we didn't specify a Pattern.
Right after the Score column, there are three more columns in the result list which are only used with ListRanges: The field Label is used as a textual identifier. The two columns for geographical longitude and latitude allow for ListRanges to enter an individual geographical location for each horoscope of the set.
If you click into a result line, the HoroGraphic window should pop up, showing you the horoscope for this date. If you go up or down with the arrow keys, the chart graphic will be updated. For example, for the February Full Moon, you get the graphic
showing the precise opposition of Sun and Moon, up to one degree at the horizon axis for Berlin, Jupiter being in conjunction up to 10' of arcs with the Sun at the Descendant.
Why Berlin? Well, the coordinates are taken from the cells of column F, where you can enter the data of a reference horoscope.
The Reference Horoscope
Some Patterns require a reference horoscope for evaluation, for example the ResonancePattern. Another advantage connected with the reference horoscope is: As soon as you enter one, the graphics will display the horoscopes of the result list with reference to the reference horoscope as a base.
Let's demonstrate this, continuing the syzygies example above: We would like to know how all these New and Full Moon horoscope charts are related to the horoscope of Germany. As is widely agreed, we take January 1, 1871, 0h LMT as base horoscope for Germany. AstroPatterns has no time zone handling whatsoever, it requires UT as input. Using the longitude 13°24' for Berlin, we therefore have to subtract 53m36s from the LMT to get UT.
After entering the date and time (UT), the Julian day number (JD in ET) is computed and placed in the cell aside. The Julian Day number is a system of time measurement which basically counts the days (measured in ET, or more precisely: in terrestrial time (TT)) that passed since January 1, 4713 BC. This is useful, for example in calculating differences of dates. The cell belows shows the corresponding Ephemeris Time. For this year - 1871 - it does not differ from the Universal Time. But if you change the date to 1.1.1000, say, you will see that the difference already increased to about 25 minutes.
Due to the lack of an integrated location database in AstroPatterns, I have added a link to a web page which basically presents the Google Maps geocoding services in a usable frame. You can use it to get the coordinates of the city by simply entering the name of that city. You can then transfer the geographical latitude and longitude values in decimal format into the Excel sheet. Only requirement for using this service: You need to be online.
As soon as we entered date and time of the reference horoscope, HoroGraphic will show the Germany chart in the inner wheel, while the horoscope of the currently selected line flips to the outer side. If you would prefer it the other way, you can put the focus on HoroGraphic by clicking on its window area and then entering the key t for "toggle": Then, inner and horoscope change their roles.
However, in the presence of a reference horoscope, one would usually like to have the reference horoscope in the inner wheel. Configured this way, one can easily "zap" down from chart to chart, seeing the current constellations in the outer wheel. Since the zodiac and the axes are fixed like the inner horoscope, one can focus on the journey of the planets and which aspects they form to the inner horoscope. In the syzygy example in relationship to the Germany horoscope, the following new moon from October 7, 2010, looks particularly interesting, with a conjunction of Mercury and Saturn at the Ascendant, the syzygy itself being in the first house:
In the worksheet General settings, some global variables can be set that are valid through the whole session.
- Ephemeris Path.- This is the name of the directory containing the compressed ephemeris files used by Swiss Ephemeris. It is possible to specify a relative name: You don't need to specify the full directory path. If you omit the drive name (C:) like here, the system takes the drive on which the current program is running (which may be a memory stick with varying drive letter).
- Verbosity (0..9).- Controls how much log output will be produced during Pattern evaluation – while 9 is the highest level of verbosity, 0 means to generate no output at all. You can inspect this output in the Log worksheet.
Don't be afraid that a verbose run could affect the performance: On whatever value you have set the verbosity level - the iteration on the Range is run in silent mode. Only after that, when the Top N list is returned to the caller and the scores are recomputed for the list display, the verbose mode is switched on.
- Geocentric/Heliocentric.- This is a very strong switch. All planetary computations performed at any place in the AstroPatterns library will be based on the selected system here. Even the visualization program HoroGraphic, although not part of AstroPatterns itself, works with the mode you entered here.
- House system.- You may choose between Placidus (P), Koch (K), Regiomontanus (R), Campanus (C), Equal (A) and Vehlow (V). All calculations of AstroPatterns will then be performed using the selected house system. Contrary to the helio/geo flag, however, the visualization program HoroGraphic only works with Placidus cusps.
Customizing the Planets
In the Planets worksheet, you find a list of the planets which should be used by AstroPatterns.
You are by no means restricted to the planets listed there: You are free to extend AstroPatterns by any planet known to Swiss Ephemeris. Just invent a two-letter acronym for your object, enter the Swiss Ephemeris object number and append it to the list:
Here, "15" is the Swiss Ephemeris number of Chiron. You will find a complete list of available objects in the Swiss Ephemeris documentation. Here is a list of some popular objects you could add:
It should be noted, however, that the application HoroGraphic only displays a fixed set of planets - a customization of HoroGraphic is not (yet?) possible. But this is only a visualization app. The core functions of AstroPatterns, the evaluation of the different Patterns and Ranges, always uses the planet set as defined in the Planets worksheet.
AstroPatterns will scan the Planets worksheet until it detects an empty line. This means, you may restrict the number of planets used in AstroPatterns' calculations by simply inserting an empty line:
If you insert an empty line after the definition of Saturn, as shown in the screenshot, AstroPatterns will only work with the classical seven astrological planets.
The short text of the planet should be unique. It is used at several places in AstroPatterns: In the ConstellationPattern worksheet, you can use the short texts for astrological formulae like SO OPP MO. In some situations, the short texts will be used for logging (the log can be inspected on the Log worksheet), giving more detailed information on how a particular horoscope achieved a certain score. Also, the long text of a planet is used. For example, in the Run Settings popup, the argument listboxes are populated with the planets' long names if a planet is required.
The column essential strength gives a strength value > 0 of the planet by its nature, i.e. independent of its position in sign and house. The values for Sun, Moon and Mercury till Pluto have been taken from Koch's Aspektlehre nach Kepler , p.73. They can be used in Patterns (and are in use, for example in the ElementPattern).
The values in the column orb base are used for orb determination, see below. Initially, their values are simply a copy of the essential strength value. But they can be changed independently from the essential strength, which allows to set priorities in transit score computations using planetary strength in different ways, without changing the underlying orb criteria.
|Mean Lunar Node
|True Lunar Node
|Lilith (Mean Lunar Apogee)
|Eris (2003 UB313)
|Quaoar (2002 LM60)
The Aspects worksheet is used for defining the aspects to be considered and to customize their names and properties. This aspect customizing is only used in the implementation of Patterns. It is not relevant for Ranges like AspectRange (where you enter the angle directly).
That is, for each aspect you have to define
- a name,
- an abbreviated name (which will be used in formulae like those of the ConstellationPattern),
- its angular value,
- its base number which is used for calculating the strength of an aspect between two planets (see below).
Similar to the Planets worksheet, the program stops scanning aspects as soon as it encounters a row with no name entered. So, as described earlier, you can insert an empty line somewhere in the aspect customizing — the system will take into respect only the aspects situated above that empty line.
How Aspects are detected
If a Pattern wants to check an aspect between two planets, we use a slightly modified version of the orb formula of Koch :
orb = orb_base(aspect) * (orb_base(pl1) + orb_base(pl2))/2
Here, orb_base(aspect) is a kind of aspect strength which can be defined in the Aspects worksheet. On the other hand, orb_base(pl1) and orb_base(pl2) are the values taken from the orb base column in the planets' customizing. Our modification of  consists in balancing out the asymmetry of the classical orb definition by using the average of two orbs. To illustrate this, let's consider an example: Let Pluto and Sun be in a distance of 96° of ecliptical longitude. Are Sun and Pluto forming a square aspect or not? According to , the answer depends: If you regarded the Sun as approaching the square to Pluto (Sun Square Pluto), the aspect would not be formed, since a square aspect of Pluto only has an orb of 3*1.5 = 4.5. On the other hand, Pluto has entered into the square of Sun, since square aspects of Sun throw an orb of 3*3 = 9 degrees.
But nowadays, the difference between these two aspects is usually neglected. A square of Sun and Pluto is – in the eyes of the majority of astrologers – equivalent to a square of Pluto and Sun. To be in line with this, we take the average of the two orbs. In the example, this amounts to an orb of 3 * (1.5 + 3) / 2 = 6° 45' for square aspects between Sun and Pluto.
As for the strength of an actual aspect: An exact aspect will have the maximum strength. Since a higher orb corresponds to a more significant aspect, the strength that we assign to an exact aspect will be the value of its orb. The more the difference from exactness, the smaller will simply be the strength. Finally, when the boundary of the orb is reached, the strength will be zero. Thus, we have the following formula for the aspect strength:
aspect_strength = max( orb - abs(orb - actual_angular_diff), 0 )
where actual_angular_diff means the difference between the longitudes of the second object and the the first object's aspect. This can be visualized by the following graph:
Of course, there are more sophisticated ways of aspect analysis, as described by E. C. Kühr . It might be preserved to future releases of AstroPatterns to implement this kind of aspect analysis: Among other things, Kühr takes into respect the actual Sun's or Moon's diameter, the ecliptical latitude of the objects, the fact whether the aspect is in application or separation (which has an influence on the strength of the aspect) and whether there is a sign change involved (for aspects that are integer multiples of 30°, f course).
The minimal strength
In the right part of the Aspects worksheet, you can enter a minimum aspect strength.
This works as a cutoff parameter. All aspects having a computed strength below this value will be ignored (i.e. will be treated as if there were no such aspect). The purpose of this parameter is to help you focus on strong aspects.
Customizing mundane positions
Apart from its essential strength as derived from the nature of the object itself, there also is an accidental strength for a planet, resulting from its zodiacal and mundane position, i.e. the position of the planet in the circle of houses: A planet near the axes will – in the opinion of most astrologers – be more important than at other places of the circle of houses.
In the Mundane Positions worksheet, you have two options to define the mundane strength: Either in a continuous or in a discrete style. In the continuous style, the strength of a mundane position will be read off from a smooth curve, whereas in the discrete style only the house position (1, 2, ... 12) decides about the strength.
In the mid of the sheet – at row 45 – you will find the switch between these options. Setting the flag to 1, house positions will be used, as customized in the part below of this row. If you enter a zero here, the smooth curve will be used that you defined in the upper part of the sheet:
Continuous mundane positions
In this case, an smooth curve is interpolated from the values you entered (a periodic cubic spline) for 10° steps of the mundane positions. 0° means a planet in conjunction with the Ascendant, 30° in conjunction with house cusp II, and so on. Thus, the following customizing gives 100 points for a planet at the rising point, 60 points for a planet at cusp II, and a locally minimal value near 50 points somewhere in the mid of the second house:
Your input is extended periodically by some rows below and above your input, to allow a visualization with Excel's built-in non-periodical interpolating spline: These are the rows with the negative degree values and the values > 360°. They are not ready for input but are transferred from your input data. You find the graphic of how your curve looks to the right of your input column:
If you switch on the weighting by mundane position, giving the highest score to angular houses, the list changes, but the first place is still the horoscope of the new moon in May:
But the New Moon now has a new score of 30 points. How is this score computed? If you want to know how AstroPatterns achieved its results, you may have a look at the Log worksheet. For each of the top N members, the ElementPattern collects a detailed table explaining the result:
Discrete mundane positions
Using discrete mundane positions means to assign one score value to each house. Only the house in which a planet is located decides about the mundane score. The following table gives three points to angular, 2 to succedent and 1 point to cadent houses.
You can use the discrete mundane positions as a filter for certain house positions by assigning zero to all houses you aren't interested in (but think of using the ConstellationPattern directly for such a task instead).
Extending the syzygies example, we would like to know the horoscopes of this series having a maximum component of the Earth element. For questions of this type, you can use the ElementPattern. If you switch to the ElementPattern worksheet, you see the configurations that are possible for an ElementPattern scan:
If we set the switches as in the screenshot above, this means we are looking for syzygies in 2010 containing as many planets in the earth element as possible (calculated with our weight customizing, which makes Sun and Moon twice as strong as Neptune and Pluto). Now, we restrict the Max size to ten – we are only interested in the first ten horoscopes. After hitting Compute, we get the following top 10 list:
This time, the Score column is filled. The horoscope with the highest score is that of the Taurus new moon, which was somehow to expect since Sun and Moon have the highest weights (3 points). Furthermore, the horoscope shows Mercury (2 points), Saturn (2.5 points) and Pluto (1.5 points) in Earth signs.
- In the first cell, you enter the element you are searching for, simply coded as a a number: 0 for Fire, 1 for Earth, 2 for Air and 3 for Water.
- You can activate a weighting by mundane position. If active, each planet that is present in the element will contribute with the strength of its mundane position, as customized in the Mundane Positions worksheet. If inactive, the number of planets will simply be counted.
- There are switches to include the position of ascendant and medium coeli into the element count.
--- Score computed for 14. 5.2010 1h 4m23s : 30.000000
SO | 23TA 9'11" | 47.26 | 2.0 || 0.0 | 3.0 | 0.0 | 0.0 || 0.0 | 6.0 | 0.0 | 0.0 || 6.0 |
MO | 23TA 9'11" | 47.26 | 2.0 || 0.0 | 3.0 | 0.0 | 0.0 || 0.0 | 6.0 | 0.0 | 0.0 || 6.0 |
ME | 2TA49'55" | 27.91 | 3.0 || 0.0 | 2.0 | 0.0 | 0.0 || 0.0 | 6.0 | 0.0 | 0.0 || 6.0 |
VE | 22GE47'43" | 91.58 | 3.0 || 0.0 | 0.0 | 2.0 | 0.0 || 0.0 | 0.0 | 6.0 | 0.0 || 0.0 |
MA | 18LE 7'35" | 167.50 | 1.0 || 2.5 | 0.0 | 0.0 | 0.0 || 2.5 | 0.0 | 0.0 | 0.0 || 0.0 |
JU | 26PI17' 7" | 7.19 | 3.0 || 0.0 | 0.0 | 0.0 | 2.0 || 0.0 | 0.0 | 0.0 | 6.0 || 0.0 |
SA | 28VI 4' 7" | 187.97 | 3.0 || 0.0 | 2.5 | 0.0 | 0.0 || 0.0 | 7.5 | 0.0 | 0.0 || 7.5 |
UR | 29PI30'56" | 8.61 | 3.0 || 0.0 | 0.0 | 0.0 | 2.0 || 0.0 | 0.0 | 0.0 | 6.0 || 0.0 |
NE | 28AQ37' 1" | 354.66 | 1.0 || 0.0 | 0.0 | 1.5 | 0.0 || 0.0 | 0.0 | 1.5 | 0.0 || 0.0 |
PL | 5CP 5' 1" | 293.18 | 3.0 || 0.0 | 1.5 | 0.0 | 0.0 || 0.0 | 4.5 | 0.0 | 0.0 || 4.5 |
Score without axes : 30.0
A Pattern may (or may not) write specific informations into the log. In the case of the ElementPattern, we get a table displaying for each planet
In the example, you see Sun and Moon achieving each 6 points (essential strength 3, multiplied by house position strength 2), Mercury again 6 points (essential strength 2, times house strength 3, it is in an angular house!), Saturn in an angular house (3 points) times its essential strength (2.5 points) contributing 7.5 points, and Pluto, likewise angular (3) with essential strength 1.5, adds 4.5 points, yielding a total of 30 points.
Maybe you think Pluto should have a higher essential strength, or you only want to take angular planets into account – no problem: Simply change the settings in the PlanetSettings and/or MundanePositions worksheet and re-run the computation. The Compute function of the Workplace sheet always uses the current settings you have made in the other sheets. You will see that even the house system chosen in the General worksheet has a strong influence on the result: If you choose Vehlow (V) instead of Placidus (P), the Capricorn new moon from January 15, 2010 will be at the top of the list.
- its ecliptical longitude,
- its mundane position, as a degree value between 0 (rising) and 360 degrees,
- the resulting mundane strength, as customized in the Mundane Positions worksheet,
- four columns displaying the essential strengths per element (fire, earth, air and water in this sequence),
- four columns displaying the weighted score resulting for the planets' position in house and element.
- finally, resulting the total score for the selected element.
The ConstellationPattern is much more flexible than the ElementPattern and thus has a wider range of uses. The Excel workbook has a built-in formula parser which allows to combine certain elementary Patterns to more complex Patterns.
Here is a list of the elementary constellations:
Observe that the ability of searching aspects from midpoints to midpoints means that we can search for "tetrads" as they are used in the Hamburg school and in cosmobiology: ma/sa con so/mo is nothing else than what would be written down as ma/sa = so/mo in the Hamburg school.
You can combine these elementary constellations using the logical operators and and or. You may use brackets to group your expression (even nested brackets are allowed). Here is a more complex example:
In the top area of the sheet, there is a button Check input which checks your formula for syntactic correctness and helps detect typos.
The ConstellationPattern in the screenshot is to be spelled out as follows: Find all horoscopes of the given Range, having
|Planet or House Cusp in a Single Sign (using abbreviations from PlanetSettings)
||so in le
vii in li
|Planet or House Cusp in an Element
||me in fire
x in earth
|Planet or House Cusp in a Sign Quality (cardinal, fixed, mutable)
||mo in mutable
|Midpoint in Sign or Sign Group
||ma/sa in cardinal
so/mo in air
|Planet or Midpoint in a House
||ve in iv
ma/sa in i
|Position in a House Quality (angular, succedent, cadent)
||ma in succedent
ne in cad
|Position in a Zodiac Segment
||ju in 12ta-23ge
|Planets, Cusps or Midpoints in Aspect
||ma con ju
ve con ii
ma/sa con so/mo
|Stellium (= Planet Cluster) of a certain extent (in °)
If we run this Pattern for our example – the 2010 syzygies – we get the following list:
Since we have a Pattern built of boolean conditions, this is not a hit list! The first element of the list is in no way "the best fit" of the search. It is simply one of the hits, not more. Its rank is totally equal to all the other hits of the list. We can see this from the Score column: All the hits have the same score, the value 1 corresponding simply to true, meaning the Pattern to be satisfied. We see that only four of the 24 syzygies happen to meet our complex ConstellationPattern.
- At least one of the following two constellations:
- the midpoint Mars / Saturn in an angular field,
- or the midpoint Sun / Moon in an angular field,
- and (in any case) Jupiter in the first house.
You can assign a weight to each elementary constellation and combine them with the plus operator:
Here, we are looking for conjunctions of Mars with Jupiter, Saturn or Uranus, and in the same horoscope a prevalence of the main astrological factors in the air element. Differently to the and and or operators, the weighted sum operator is not a boolean Pattern, you really get a hit list when running it. An aspect gets a score by its exactness, as explained above in the section Customizing Aspects and Aspect detection. Here, we multiply this score by 2. The boolean expressions like "Sun in air" will give the value 1 if satisfied. To scale this with the aspect score, we weight them with the weight factor 8.
The score of the StelliumPattern is the difference from the maximum extent. The top chart having a score of 51.7, means that the cluster itself has an extent of 150-51.7 = 98.3 degrees. It is thus significantly closer than the stellium of the 1980 conjunction which is located on rank 3 of the result list. But nevertheless, the 1980 conjunction is more important since it is a shift – it is the first conjunction in the air element, after almost 200 years of earth conjunctions.
There are two Patterns dedicated to detecting planet clusters. One of them, the StelliumPattern, can be used as a building block for more complex Patterns in the ConstellationPattern worksheet. The other Pattern, scoring a chart with André Barbaults cyclic index, can only be entered directly in the Workplace worksheet.
As a simple example, we will ask for those conjunction charts of Jupiter and Saturn in the last 2000 years showing a cluster of the ten standard astrological "planets". In the Run Settings dialog, we enter the aspect Range combined with the ConstellationPattern:
For simplicity, we use the ConstellationPattern worksheet only for specifying the StelliumPattern (we could also decorate this Pattern by further elementary conditions from the enumeration above). The StelliumPattern requires the maximum extent of the cluster as parameter. We set this argument to 150 degrees:
Now, after hitting Compute in the Workplace sheet, we obtain the following hit list. The leading conjunction is a minima, not an element shift, dating back to 452. Nevertheless, the chart is interesting. The conjunction itself is displaced from the rest of the planets, which would build an even much closer stellium.
The Cyclic Index Pattern
This Pattern is not provided by the AstroPatterns.xls User Interface but belongs to one of the Patterns that can be entered manually - without support by the rest of the workbook. The cyclic index, as originally defined by André Barbault, adds up all the differences in longitude that exist between all possible pairs of two planets. We follow this definition, but instead of the distance, we take the distances complement to 180°. This is done with the purpose that a higher score corresponds to a tighter cluster. The theoretically possible maximum value, corresponding to a 0° orb conjunction of all planets, will be n*(n-1)*90, where n is the number of planets that are declared in the PlanetSettings sheet. For n = 10, this will give the unbeatable theoretical high score of 8100 points.
The integer constant defining the cyclic index Pattern is 9. To use it, you simply enter a 9 in the Pattern field:
When applying the Pattern to the example Range of Jupiter-Saturn conjunctions between 0 and 2200, we get the following result:
Thus, the 1980 shift is even less significant when looked at with Barbault's cyclic index. Indeed, the cyclic index and the ClusterPattern have different focus: The former looks for as many planets being as close together as possible, but an outlier positioned far aside doesn't deteriorate the score too much. On the other hand, for the ClusterPattern every planet counts, and an outlier can spoil the chart's score completely.
With the ResonancePattern, you are able to compare the charts produced by the current Range with a reference chart. Contrary to the ConstellationPattern, you do not fix in advance the aspects you are looking for but let the Pattern itself find the relevant aspects for you. For most choices, there is a repetition criterion: Except for the option Simple Transits, an aspect of a current planet to a planet in the reference chart will not be handled as a resonance by itself. The aspects of the current planets will only count as resonance if there is some kind of repetition when comparing with the reference chart.
The ResonancePattern allows the following choices for the kind of repetition:
You can customize which type of repetitions you would like to observe. Also, it is possible to weight resonances with the mundane positions and strength of the two involved planets (as seen in their own horoscopes).
For the switches Use mundane positions and Use planetary strengths, you have the following options:
- A current planet forming an aspect to a natal planet, repeating an aspect that it already had in the natal chart. The nativity shows an aspect SO SQU MA, while the current MA is in opposition to the natal SO. As in the other kinds of resonance, the nature of the aspect is not taken into account (but you can influence the aspects to consider using the AspectSettings worksheet). This is what we call a transit resonance.
- A current planet forming an aspect to another current planet, thus repeating a linkage that already existed in the natal chart. Example: Current Jupiter forming a trine to current Saturn, where already the natal chart showed a conjunction of Jupiter and Saturn. This is called a returning aspect.
- A current planet forming an aspect to a natal planet, while at the same time the latter planet in the current chart forms an aspect to the first planet in the natal chart. Example: Current Sun in square aspect to natal Moon, while at the same time current Moon is in sextile to natal Sun. This is what we call a reception aspect.
- If you want to ignore repetition and simply count the number of aspects formed, you have the Simple Transits option.
We would like to know which of the Jupiter Saturn conjunctions since the foundation of the German Reich had the highest number of correlations to its foundation chart (31.12.1870, 23h6m24s UT). We only want to count the number of occurrences, no weight factors at all. This gives us the following list:
The ResonancePattern writes a log explicitly listing all the contributions to the score.
- (A+B)/2 (1) Take the arithmetic mean of the two strengths involved.
- A (2) Use only the strength of the first (the current) planet.
- B (3) Use only the strength of the second (the natal) planet.
- - (0) Don't weight with this strength at all.
--------------- Compute Score -------------------------------------------------
--- For 8. 8.1940 1h23m58s
--- Call of get_correlation:
First planet set:
135.341 193.070 116.778 93.683 142.627 44.457 44.457 55.904 173.809 122.856
Second planet set:
280.146 35.109 299.464 285.813 180.440 78.991 271.997 115.155 19.021 47.132
0.00 0.00 0.00 1.00 1.00 1.00 1.00 0.00 1.00 1.00
1.00 0.00 0.00 1.00 1.00 1.00 0.00 0.00 1.00 0.00
0.00 0.00 1.00 0.00 1.00 0.00 0.00 1.00 0.00 0.00
1.00 1.00 0.00 0.00 1.00 0.00 1.00 0.00 0.00 1.00
1.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 1.00 1.00
1.00 1.00 0.00 1.00 1.00 0.00 0.00 0.00 0.00 1.00
1.00 1.00 0.00 1.00 1.00 0.00 0.00 0.00 0.00 1.00
1.00 0.00 1.00 0.00 1.00 0.00 0.00 1.00 0.00 0.00
0.00 0.00 0.00 0.00 1.00 1.00 0.00 1.00 0.00 0.00
0.00 1.00 1.00 0.00 1.00 1.00 1.00 1.00 0.00 0.00
--- End of get_correlation()
SO QCX VE (1.000000)
SO SQQ SA (1.000000)
MO SQU SO (1.000000)
MO TRI JU (1.000000)
ME SXT MA (1.000000)
ME CON UR (1.000000)
VE OPP SO (1.000000)
VE SSQ PL (1.000000)
MA SQU PL (1.000000)
JU CON MO (1.000000)
SA TRI SO (1.000000)
SA CON MO (1.000000)
SA SQQ MA (1.000000)
SA CON PL (1.000000)
UR TRI ME (1.000000)
NE SQU JU (1.000000)
PL SXT MA (1.000000)
PL QCX SA (1.000000)
-> Returning Transit Score for 8. 8.1940 1h23m58s : 18.000000
MO SXT SO (1.000000)
JU QCX MO (1.000000)
SA SQU SO (1.000000)
SA QCX MO (1.000000)
UR SXT ME (1.000000)
PL SSX VE (1.000000)
-> Returning Aspect Score for 8. 8.1940 1h23m58s : 6.000000
VE OPP SO (1.000000) - SO QCX VE (1.000000)
VE SXT MO (1.000000) - MO SQU VE (1.000000)
MA SQQ SO (1.000000) - SO SSQ MA (1.000000)
JU TRI SO (1.000000) - SO SXT JU (1.000000)
JU CON MO (1.000000) - MO TRI JU (1.000000)
JU SQQ MA (1.000000) - MA SXT JU (1.000000)
SA TRI SO (1.000000) - SO SQQ SA (1.000000)
SA TRI VE (1.000000) - VE OPP SA (1.000000)
UR TRI ME (1.000000) - ME CON UR (1.000000)
NE CON MA (1.000000) - MA TRI NE (1.000000)
PL SXT MA (1.000000) - MA SQU PL (1.000000)
PL SSQ JU (1.000000) - JU CON PL (1.000000)
PL QCX SA (1.000000) - SA CON PL (1.000000)
-> Reception Aspect Score for 8. 8.1940 1h23m58s : 13.000000
The program first calculates a correlation matrix between the current and the natal planets. For each planet pair, it sets the matrix coefficient to 1 if an aspect occurs (or to the aspect strength with mundane weight, depending on your customizing), and to 0 if there is no aspect between these two planets. Together with a similar matrix for the natal chart correlated with itself, and a transit chart correlated with itself, it simply counts corresponding places of these matrices having non-zero coefficients.
The results are then listed for each category in the log. You may be astonished how many aspects are found between two charts if a computer is scrutinously looking at them. This will even be the case if you narrow down the aspect orbs and restrict the scope to only "strong" aspects like opposition, conjunction and square.
All kinds of preconfigured Patterns have their limits. In research, one sometimes would like to inspect Patterns defined in an adhoc manner. AstroPatterns serves this purpose by offering the FreePattern.
The FreePattern is a kind of "expert mode" of AstroPatterns: The AstroPatterns library allows to inject the function which computes the score for a horoscope from outside. This function can be defined in any programming language that allows passing function references as parameters to a library function.
The pointer of such a score function has to be of the following type (using C for the definition):
double (*scoreFunction)(const t_horo*)
Here, t_horo* is a pointer to a horoscope data structure (consisting of three doubles jd_et, lon and lat – these are all the data needed for a horoscope calculation). If you write a function in Visual Basic, this translates to a definition like
Public Function myScoreFunction(ByRef h As t_horo) As Double
Using the AddressOf operator in Visual Basic, a pointer to such a function can be passed as a Long integer to an API function like ap_set_free_pattern in our case.
As an example, you find the function resonanceWithSolar on the FreePattern worksheet. As explained there, this score function tries to involve the solar horoscope that is valid for the current time. Please have a look at the code in the VBA module FreePatterns if you are interested in the programming details. The Pattern internally applies the ResonancePatterns twice: It looks for resonances of the solar horoscope with the natal chart, and after that it computes the resonances of the current horoscope with the natal chart. It then performs the intersection of all resonances found. This is the score. There are some utility functions available for usage in own custom Patterns. See the API reference for details.
Working with ListRanges
A ListRange simply is a list of horoscopes. They can be viewed, edited, loaded and saved in the ListRange worksheet. Also, the result list of a former AstroPatterns run can be copied into the ListRange worksheet for further processing.
With all these features, the ListRange allows an arbitrary chaining of the Pattern computation process: Starting with evaluating Pattern 1 on Range 1, you get a result list which can be reused as Range 2 for a Pattern 2, and so on.
Storing and loading ListRanges
If you have performed a computation in AstroPatterns, you might want to save the result for later use. The ListRange worksheet helps you with this. For e simple example, let's produce a list of all conjunctions of Neptune and Pluto since 1000 BC. The computation is performed with an Aspect Range without Pattern:
In this case, the input is quite easy, and the output is computed in less than two seconds on an average computer. But you may imagine more complex examples, for example combining a Range with a complex Pattern where it would be useful to save the computed data. To achieve this, you transfer the data to the ListRange worksheet using the button
After navigating to the ListRange worksheet, you see the data have been taken over and enriched by the UT date and time. You may add some labels to the list, change the data, add geographic locations, and so on and finally save the data to a file using the button Save to file. If you look at the saved file using a plain text editor, you see that the file format is indeed very simple:
Namely, the format is
Here, the LON and LAT are optional (indicated by the square brackets). The LABEL usually is the name of the horoscope owner or a short description of an event, respectively. DATE_UT and TIME_UT have to be entered in European fashion: 1.12.2000 for December 1, 2000, and the UT formatted like 12h20m22s. On the other hand, LON and LAT are entered as decimal numbers (with sign, the minus indicating West and South, respectively).
Additionally, lines containing only whitespace characters, and lines starting with the # symbol are ignored and can be used to place manual comments into the file. Indeed, you could create a file in this format using any plain text editor, even notepad. The following file is a perfectly legal input file for an AstroPatterns ListRange:
# My little dataset
1.1.1900;0h;Begin of the 20th century (0h UT);14.5;52
1.1.2000;0h;Begin of the 21st cetnruy (0h UT);13.4;51.6
Creating and editing ListRanges manually
The ListRange worksheet can be used to visualize and edit data before or after working with them on the Workplace worksheet. If you have data from somewhere else and you want to work with them in AstroPatterns, you will either may input the data directly in the ListRange worksheet, or you have to transform them into the CSV format described above and then load it into the ListRange worksheet.
When creating a ListRange manually, you start with data row 12 of the ListRange worksheet to enter dates and times in UT. You then may use the button Complete from Date/Time UT to fill in the data needed by AstroPatterns like JD and the transformed date and time in ET:
After having finished your input, it is a good idea to save the ListRange with the button Save To File so that you can later pull it in from the file.
If you want to use a ListRange that has been entered this way, don't forget to set the switch Use worksheet data to 1 = yes. Otherwise the AstroPatterns Range loop would try to obtain its data directly from a file.
ListRanges as direct file input
It is possible to instruct AstroPatterns to directly use a CSV file as input. The file will then be opened and scanned by the AstroPatterns library itself which is more efficient than looping the cells of an Excel sheet and passing them one by one into the memory of AstroPattern using its API functions. The direct file input is recommended for large files, like the file davdb.csv, the DAV database coming with the AstroPatterns distribution. This file contains 27'000+ horoscopes and would consume a considerable amount of memory and computer time when loaded into an Excel workbook and propagated into AstroPatterns from there.
The required format for a file to serve as direct input for AstroPatterns is
Also, comment lines and empty lines are allowed – they will be skipped when the file is scanned by AstroPatterns:
# This is a comment line, the following line is left empty intentionally
# The following line is a valid data line
2451544.5;13.4;52.5;Begin of the 21st century (0h UT)
As an example, we ask for those horoscopes of the DAV database having the highest value of Barbault's Cyclic Index. To answer this question, we enter the file davdb.csv in the ListRange worksheet:
In row 6 Use worksheet data, you enter a 0. In this example, we don't want to use worksheet data but directly work with a file. Instead of typing the file name manually, you may also use the button Search file right of the input cell for picking the file from a file explorer tree.
After this, change to the Workplace sheet, and specifiy ListRange in the Run Settings dialog. Even when specifying the ListRange, the start date and end date are evaluated. This means you have to enter values here, and they really work as filter. This is a useful feature. For example, when working with a horoscope collection, you can restrict the horoscopes to a certain epoch simply by setting an appropriate start date and end date. In our case, we want to use all available horoscopes, so we choose the interval big enough to include all the horoscopes of the Range.
As for the Pattern: The cyclic index doesn't appear in the Run Settings dialog which is preserved for Patterns with an own worksheet. But nevertheless you can enter it directly. The number, as mentioned above, is 9. So we end up with the following result list,
... and the winner is the Italian opera composer Ruggero Cavallo, born in April 23, 1857. He makes a cyclic index record of 6'701 points. This man indeed has an interesting Taurus stellium, with only Saturn and Neptune standing apart. According to Taeger's Internationale Horoscope Lexikon, his birth register is available, so the time should be reliable too – the stellium therefore is located in the eighth house.
References  Koch, W. Aspektlehre nach Kepler, Rohm Verlag, Bietigheim, published without year.
 E. C. Kühr, Aspektanalyse, Verlag Rudolf Cerny, Wien 1948.