Sources and editions
Primary texts, as used.
- Polybius, Historiae 3.33-60 and 34.10, ed. Th. Büttner-Wobst (Teubner, 1882 and 1905), Greek text from the Perseus Digital Library XML; readings at 3.49.6 from J. Schweighäuser, Polybii Historiae V (1789) 594-595 and from the Oxford editors of Livy; English of W. R. Paton (Loeb, 1922) and E. S. Shuckburgh (1889) for comparison. Saved:
texts/polybius_3_greek.txt, texts/polybius_34_10_greek.txt.
- Livy, Ab urbe condita 21.22-39, text of B. O. Foster (Loeb, 1929) as transcribed on la.wikisource, collated at the cruces with C. F. Walters and R. S. Conway, Titi Livi Ab urbe condita III (Oxford, 1929) and with Weissenborn-Müller and Riemann-Benoist from scanned pages; Livy 27.39 from thelatinlibrary. Saved:
texts/livy_21_latin.txt, texts/editions_ocr/.
- Strabo 4.6.5-12, ed. A. Meineke (Teubner, 1877), with H. L. Jones (Loeb, 1923). Servius on Aeneid 10.13, ed. G. Thilo (1884). Sallust, Historiae 2.98 Maurenbrecher, from J. C. Rolfe (Loeb, 1921). Cornelius Nepos, Hannibal 3, edd. Fleckeisen and Halm (Perseus). Pliny, Naturalis historia 3.31-37 and 3.117-138, ed. Mayhoff. Ammianus Marcellinus 15.10, J. C. Rolfe (Loeb, 1935). Appian, Hannibalica 1-4, ed. L. Mendelssohn. Zonaras 8.23 in E. Cary's Dio (Loeb, 1914). Columella, De re rustica 11.2, thelatinlibrary. All saved under
texts/testimonia/ and texts/terrain_sources/.
The Traversette papers and their critics.
- Mahaney, W. C., and 23 co-authors, "Biostratigraphic evidence relating to the age-old question of Hannibal's invasion of Italy, I: History and geological reconstruction", and "II: Chemical biomarkers and microbial signatures", Archaeometry 59 (2017) 164-178 and 179-190. Read in full (author manuscripts, Queen's University Belfast repository).
- Mahaney, W. C., and others, "Polybius' 'previous landslide': proof that Hannibal's invasion route crossed the Col de la Traversette", Mediterranean Archaeology and Archaeometry 14.2 (2014) 77-94; "Notes on magnetic susceptibility in the Guil valley alluvial mire", ibid. 17.1 (2017) 23-35. Read in full.
- Mahaney, W. C., "The Hannibal enigma of 218 BC", Scientific Culture 6.3 (2020) 7-24; "Polybius: decoder of Hannibal's alpine invasion route", ibid. 10.1 (2024) 59-67; "Futile route quest of the Hannibal invasion", London Journal of Research in Humanities and Social Sciences (2026). Read in full.
- Mahaney, W. C., and others, Journal of Quaternary Science 25 (2010); Archaeometry 55 (2013) and 61 (2019); Kuhle, M. and Kuhle, S., Archaeometry 54 (2012) and 57 (2015). Abstracts only.
- Hunt, P., in EARTH magazine (2012, 2016); Allen, C. C. R., The Conversation (April 2016); de Galbert, G., "Hannibal, les Alpes et la Traversette" (2016); Smithsonian and Queen's University Belfast press material (2016); Berti, E. and Vollrath, F., PNAS (2026). Read in full.
- Reimer, P. J., and others, "The IntCal20 Northern Hemisphere radiocarbon age calibration curve (0-55 cal kBP)", Radiocarbon 62 (2020) 725-757; curve file
data/intcal20.14c. Ward, G. K. and Wilson, S. R., "Procedures for comparing and combining radiocarbon age determinations", Archaeometry 20 (1978) 19-31.
Terrain, climate and astronomy.
- Copernicus GLO-90 digital elevation model, tiles N43-N46 E004-E008, from the AWS open-data bucket. OpenStreetMap place and river data through Nominatim.
- Rabatel, A., Letréguilly, A., Dedieu, J.-P. and Eckert, N., "Changes in glacier equilibrium-line altitude in the western Alps from 1984 to 2010", The Cryosphere 7 (2013) 1455-1471. Klein, G., and others, "Shorter snow cover duration since 1970 in the Swiss Alps", Climatic Change 139 (2016) 637-649. Bender, E., Lehning, M. and Fiddes, J., Frontiers in Earth Science 8 (2020) 100. ARPA Piemonte, technical note on snow cover in the Piedmont Alps. Météo-France, "Le climat des Hautes-Alpes".
- Holzhauser, H., Magny, M. and Zumbühl, H. J., "Glacier and lake-level variations in west-central Europe over the last 3500 years", The Holocene 15 (2005) 789-801. Le Roy, M., Ivy-Ochs, S., and others, "Holocene glacier variations in the Alps", in European Glacial Landscapes: The Holocene (Elsevier, 2024) 367-418.
- Skyfield 1.55 with the JPL DE406 ephemeris; PyEphem 4.2.1 as an independent check.
Modern scholarship on the pass. The works consulted, with how much of each could be read, are listed in the accompanying notes (dossiers/scholarship.md); the principal ones are named in the candidates section above. The public-domain studies from Whitaker (1794) to Torr (1924) were read from scanned copies. The books of de Beer, Walbank, Hoyte, Proctor, Lazenby, Seibert, Lancel, Prevas, Hunt and Mahaney are in copyright and were obtained only as abstracts, catalogue records or search snippets.
Reproducing the results
The code, data and texts behind this page are kept together in one folder. dossiers/ holds the working notes of the four strands (the sources, the terrain, the geoarchaeology and the scholarship), texts/ the editions and papers, data/ the outputs, and code/ the scripts, which run in this order. The network is needed only for the downloads.
cd code
pip install rasterio numpy pillow skyfield ephem
python3 download_dem.py # 20 Copernicus GLO-90 tiles
python3 geocode.py # places -> data/places.json
python3 fetch_rivers.py # river centrelines for the map
python3 routes.py # least-cost paths, profiles, distance tables (about 3 min)
python3 viewshed.py # Po-plain visibility from every col and descent (about 20 min)
python3 pleiades.py de406.bsp # Pleiades phases in 218 BC (JPL DE406, 300 MB download)
python3 figures.py # map, profiles, viewshed panels
python3 report_tables.py # data/terrain_tables.md
python3 calibrate.py # IntCal20 recalibration of the Traversette dates
python3 evidence_model.py 20000 # the evidence model and every variant
python3 make_chart.py; python3 make_tables.py; python3 make_extra_tables.py
python3 make_map_report.py; python3 make_profiles_report.py; python3 make_viewshed_fig.py
python3 build_report.py # assembles this page from report_body.html
To change a judgement, edit the range in code/evidence_table.py and run the last two lines again. To test another col, add its waypoints to routes.py and its saddle to viewshed.py.