Articles

Print Email

Application of shell spiral deviation methodology to fossil brachiopods: Implications for obtaining specimen ontogenetic ages

Joanna V. Clark, Anthony E. Aldridge, Matías Reolid, Kazuyoshi Endo, and Alberto Pérez-Huerta

Plain Language Abstract

Brachiopods are an extant phylum of marine invertebrates that have existed since the Cambrian, and have been used extensively in paleoclimatic and paleoecological studies. Knowing ontogenetic ages of fossil brachiopods is essential to studies involving phylogeny, population structure, and life histories, but there is currently no efficient method for determining specimen ontogenetic ages. Spiral deviation analysis presents great potential for utility in specimen-based ontogenetic age determinations. A spiral deviation is a difference between the actual growth trajectory and a perfect logarithmic spiral. Previous studies have shown that shell spiral deviations correspond to ontogenetic age and seasonal growth in modern brachiopods, but this approach has not been tested on fossil specimens. Here, we analyze the application of this methodology using four species of fossil brachiopods, which possess different shell outlines and surface ornamentation patterns. The programs Vextractor and R were used for digitizing and morphometric analyses, respectively. Our results indicate that smooth, rounded shells produce spiral deviation graphs similar to those generated from modern brachiopods that yield plausible ontogenetic ages, but without providing by itself information on seasonal growth and factors controlling shell growth.

Resumen en Español

Aplicación de la metodología de desviación espiral de la conchilla en braquiópodos fósiles: implicancias en la obtención de edades ontogenéticas de especímenes

El conocimiento de las edades ontogenéticas de braquiópodos fósiles tiene gran utilidad en estudios paleoecológicos y paleoclimáticos, pero actualmente no existen medios eficientes para obtener esta información. Estudios previos han mostrado que las desviaciones espirales de la conchilla corresponden a edades ontogenéticas y crecimiento estacional en braquiópodos modernos, pero este enfoque no ha sido testeado en especímenes fósiles. Aquí analizamos la aplicación de esta metodología usando cuatro especies de braquiópodos fósiles, incluyendo Laqueus rubellus, Terebratula terebratula, Platystrophia ponderosa y Pseudoatrypa sp., cada una de las cuales posee distintos contornos de conchilla y patrones de ornamentación superficial. Los programas computacionales Vextractor y R fueron utilizados para análisis digitales y morfométricos, respectivamente. Nuestros resultados indican que las conchillas biconvexas lisas dan gráficos de desviación espiral similares a aquellos generados por braquiópodos modernos que producen edades ontogenéticas plausibles, pero sin proveer por sí solos información acerca del crecimiento estacional y factores que controlen el crecimiento de la conchilla.

Palabras clave: desviaciones espirales; braquiópodos fósiles; edad ontogenética; digitalización; código R

Traducción: Diana Elizabeth Fernández

Résumé en Français

Application de la méthodologie de la déviation de la spirale à des brachiopodes fossiles : implications pour la détermination des âges ontogénétiques des spécimens

La détermination des âges ontogénétiques des spécimens de brachiopodes fossiles est d'une grande utilité dans les études paléoécologiques et paléoclimatiques, mais il n'existe actuellement aucun moyen efficace d'obtenir cette information. Les études précédentes ont montré que les déviations de la spirale correspondaient aux âges ontogénétiques et à la croissance saisonnière chez les brachiopodes modernes, mais cette approche n'a pas été testée sur des spécimens fossiles. Dans cet article, nous analysons la mise en pratique de cette méthodologie à quatre espèces de brachiopodes fossiles présentant des contours de coquilles et des schémas d'ornementation de surface différents : Laqueus rubellus, Terebratula terebratula, Platystrophia ponderosa, et Pseudoatrypa sp. Les logiciels Vextractor et R ont été utilisés respectivement pour la numérisation et pour les analyses morphométriques. Nos résultats indiquent que des coquilles biconvexes lisses produisent des graphiques de déviation de la spirale similaires à ceux générés à partir de brachiopodes modernes et donnant des âges ontogénétiques plausibles, mais sans fournir par eux-mêmes des informations sur la croissance saisonnière et les facteurs contrôlant la croissance de la coquille.

Mots-clés : déviations de la spirale ; brachiopodes fossiles ; âge ontogénétique ; digitalisation ; code R

Translator: Antoine Souron

Deutsche Zusammenfassung

Anwendung der Schneckengang-Deviations-Methode bei fossilen Brachiopoden: Auswirkungen auf die Bestimmung ontogenetischer Stadien

Die Kenntnis über ontogenetische Stadien bei fossilen Brachiopoden hat einen großen Nutzen für paläoökologische und paläoklimatische Untersuchungen, jedoch ist derzeit keine effiziente Möglichkeit bekannt diese Information zu erlangen. Vorangehende Untersuchungen zeigten, dass Schneckengang-Deviationen mit ontogenetischen Stadien und saisonalem Wachstum bei modernen Brachiopoden übereinstimmen. Diese Herangehensweise wurde jedoch noch nicht bei fossilen Brachiopoden getestet. Wir untersuchen hier die Anwendung dieser Methode mit vier Arten fossiler Brachiopoden, Laqueus rubellus, Terebratula terebratula, Platystrophia ponderosa, und Pseudoatrypa sp., die alle verschiedene Schalenumrisse und Oberflächenmuster besitzen. Es wurden die Computerprogramme Vextractor beziehungsweise R zur Digitalisierung und zur morphometrischen Analyse benutzt. Unsere Ergebnisse zeigen, dass glatte, bikonvexe Schalen spiralförmige Deviationskurven produzieren, die ähnlich denen moderner Brachiopoden mit eingängigen ontogenetischen Stadien sind, die jedoch keine Information über saisonales Wachstum und Faktoren zum Schalenkontrollenwachstum liefern.

Schlüsselwörter: Schneckengang Deviationen; fossile Brachiopoden; ontogenetische Stadien; Digitalisierung; R code

Translator: Eva Gebauer

Arabic

Translator: Ashraf M.T. Elewa

 

 

author1Joanna V. Clark. Department of Geological Sciences, University of Alabama, 2003 Bevill Building, Tuscaloosa, Alabama, 35487, United States. This email address is being protected from spambots. You need JavaScript enabled to view it.

Joanna is a geoscientist working at the Johnson Space Center in Texas, USA. She graduated with a B.A. in geology from The State University of New York at Geneseo in 2013, and with a M.S. in geosciences from The University of Alabama in 2015. For her master's thesis, Joanna studied spiral deviations and chemical proxies as a method of determining ontogenetic ages and paleoseasonality in fossil brachiopods.

divider

author2Anthony E. Aldridge. PO Box 19576, Woolston, Christchurch, 8241, New Zealand. This email address is being protected from spambots. You need JavaScript enabled to view it.

Anthony (Tony) Aldridge is a statistician based in New Zealand. He worked ten years as a government scientist in the Applied Mathematics Division of the New Zealand Department of Scientific & Industrial Research (DSIR), including a paid sabbatical in the Center for Quality and Productivity at the University of Wisconsin (Madison) in 1985-1986. For the past 25 years, Tony has worked as an independent statistician on a range of industrial and biological problems in New Zealand and overseas. His continued research on growth and shape of brachiopods began in 1980 when participating in a DSIR cruise of shallow and deep habitats in New Zealand waters.

divider

author3Matías Reolid. Departamento de Geología, Universidad de Jaen, Campus Las Lagunillas s/n, 23071 Jaén, Spain. This email address is being protected from spambots. You need JavaScript enabled to view it.

Matías Reolid is a paleontologist from the University of Jaen (Spain). His research is focused in the reconstruction of environmental changes through the study of lithology and ecostratigraphical fluctuations of fossil assemblages, mainly macroinvertebrates and foraminifera. He is PhD from University of Granada, and worked as postdoc in University of Oslo, University of Lyon 1, and University Complutense from Madrid. Other research interest topics are taphonomy, microbialites, and isotopic analysis of microfossil shells. Recently, his main goal is the analysis of geochemical proxies and fossil assemblages for interpreting incidence of Oceanic Anoxic Events of Toarcian and Cenomanian-Turonian boundary with outcrops from Spain, Portugal, Algeria, Morocco, Tunisia, Italy and Siberia.

divider

author4Kazuyoshi Endo. Department of Earth and Planetary Sciences, The University of Tokyo, Tokyo 113-003, Japan. This email address is being protected from spambots. You need JavaScript enabled to view it.

Kazuyoshi (Yoshi) Endo is a molecular paleobiologist working on development and evolution of the shells in lophotrochozoans, such as brachiopods and molluscs. He took his PhD in Glasgow, UK, and worked as an Associate Professor in Tsukuba University, Japan, before moving to the Department of Earth and Planetary Science, University of Tokyo, Japan, where he holds the Chair in Evolutionary Paleobiology. His recent studies include elucidation of genetic basis of the shell spiral growth in snails, proteomic characterization of the shell matrices in brachiopods, and complete sequencing of the Lingula and pearl oyster genomes.

divider

author5Alberto Pérez-Huerta. Department of Geological Sciences, The University of Alabama, Tuscaloosa, Alabama, 35487, United States. This email address is being protected from spambots. You need JavaScript enabled to view it.

Alberto Pérez-Huerta is an Associate Professor in the Department of Geological Sciences at The University of Alabama (USA) with a research expertise in paleontology and biomineralization. Studied geology at the Universidad de Oviedo (Spain) where he got a B.Sc. in 2000 and continued his studies in paleoecology at the University of Oregon (USA), obtaining a Ph.D. in 2004. After one year working in Thailand (Mahasarakham University), he worked as postdoctoral researcher at the University of Glasgow (UK) until his initial appointment at UA in 2009. His research experience has been focused on the study of biomineralization, biogeochemistry, and (paleo-) ecology of modern and fossil marine invertebrates, in particular brachiopods and mollusks. Recent studies have been centered on the crystallographic analysis of carbonate fossils, geochemical proxies, and developing microscopy techniques for the characterization of biominerals and biomaterials.

divider

 

FIGURE 1. Ventral, dorsal, posterior, and longitudinal-sectional views of the fossil brachiopods Laqueus rubellus, Terebratula terebratula, Pseudoatrypa sp., and Platystrophia ponderosa . Scale bars equal 1 cm.

figure1

FIGURE 2. Example of a shell sample ( Platystrophia ponderosa) sectioning through the plane of symmetry, producing two identical halves. Both halves were analyzed for their spiral deviations.

figure 2

FIGURE 3. Example of shell ( Laqueus rubellus) digitization and spiral fitting. 1, The brachiopod shell was digitized by clicking the outline in an anterior-ward direction, starting at the umbo. 2, The digitized outline was saved as (x,y) coordinates, which were used to plot a biological outline in R. 3, R code was used to fit a perfect logarithmic spiral to the shell outline. 4, The deviations from a perfect spiral were represented in a spiral deviation graph, with green points representing spiral maxima and red points representing spiral minima.

figure 3

FIGURE 4. Spiral deviations from the dorsal and ventral valves of specimens one ( 1), two ( 2), and three ( 3) of the species Laqueus rubellus .

figure 4

FIGURE 5. Spiral deviations from three specimens of the species Terebratula terebratula.

figure 5

FIGURE 6. Spiral deviations from three specimens of the species Platystrophia ponderosa.

figure 6

FIGURE 7. Spiral deviations from three specimens of the species Pseudoatrypa sp.

figure 7

FIGURE 8. Example of two fossil brachiopod species, Rafinesquina sp. (left) and Pseudoatrypa sp. (right), which generated problematic spiral deviation graphs. 1, Ventral view 2, Longitudinal-sectional view 3, Spiral fitting 4, Spiral deviations graphs.

figure 8

FIGURE 9. Comparison of spiral deviation graphs when the dorsal valve of Terebratula terebratula specimen is fit to one (left) and two (right) spirals. A and B represent locations on the graphs that change drastically when two spirals are fit to the biological outline instead of one. Minimum A becomes more distinct when two spirals are used whereas the opposite occurs for minimum B.

figure 9

 

TABLE 1. Size measurements (length, width, and thickness) and spiral deviations from all analyzed specimens of the species Laqueus rubellus, Terebratula terebratula, Platystrophia ponderosa, and Pseudoatrypa sp.

Specimen Length (mm) Width (mm) Thickness (mm) Dorsal minima Dorsal maxima Ventral minima Ventral maxima
L. rubellus 1

 

L. rubellus 2

 

L. rubellus 3

 

T. terebratula 1

 

T. terebratula 2

 

T. terebratula 3

 

P. ponderosa 1

 

P. ponderosa 2

 

P. ponderosa 3

 

Pseudoatrypa sp. 1

 

Pseudoatrypa sp. 2

 

Pseudoatrypa sp. 3

23.2

 

29.3

 

27.1

 

47.3

 

38.7

 

40.4

 

23.9

 

35.5

 

26.0

 

19.0

 

21.0

 

19.5

14.8

 

19.0

 

18.0

 

34.0

 

34.2

 

32.0

 

35.0

 

46.0

 

32.4

 

18.0

 

22.0

 

19.6

10.5

 

17.0

 

14.0

 

24.5

 

18.9

 

21.9

 

22.5

 

28.0

 

26.0

 

10.0

 

16.1

 

11.7

4

 

2

 

2

 

5

 

4

 

4

 

2

 

3

 

4

 

N/A

 

N/A

 

N/A

4

 

3

 

3

 

6

 

3

 

4

 

3

 

4

 

5

 

N/A

 

N/A

 

N/A

4

 

3

 

2

 

3

 

4

 

3

 

2

 

4

 

3

 

N/A

 

N/A

 

N/A

4

 

3

 

3

 

4

 

4

 

4

 

2

 

4

 

4

 

N/A

 

N/A

 

N/A

TABLE 2. Spiral output from three specimens of the species Laqueus rubellus. Maximum length is the maximum distance from the posterior to anterior region. Arc length is the maximum distance along the outline of the valve, from the posterior to anterior regions. Spiral axis (a) is the distance between the spiral axis and the first set of coordinates at the umbo. Spiral parameter (k) indicates the shape of the valve, where higher numbers represent flatter valves. Two spirals were fit to these shells, thus there were two spiral axes and parameters. Error is an indicator of how well the spirals fit the biological outline. The error from one spiral fitting was included as a comparison. N is the number of digitized points on the biological outline.

Specimen Length (mm) Arc-length (mm) a1 a2 k1 parameter (spiral angle) k2 parameter (spiral angle) Error: two spirals (mm) Error: one spiral (mm) N
1 Dorsal

 

1 Ventral

 

2 Dorsal

 

2 Ventral

 

3 Dorsal

 

3 Ventral

19.96

 

23.23

 

25.78

 

29.28

 

20.47

 

27.14

23.30

 

29.62

 

35.21

 

37.03

 

26.05

 

32.79

0.40

 

0.99

 

27.03

 

5.17

 

0.95

 

7.29

0.95

 

2.76

 

22.51

 

9.76

 

1.50

 

4.78

1.63 (31.5°)

 

1.20 (39.8°)

 

0.57 (60.3°)

 

0.77 (52.3°)

 

1.08 (42.7°)

 

0.40 (68.4°)

1.24 (38.9°)

 

0.79 (51.6°)

 

0.01 (89.2°)

 

0.45 (65.6°)

 

0.91 (47.7°)

 

0.67 (56.2°)

0.06

 

0.13

 

0.25

 

0.09

 

0.08

 

0.08

0.13

 

0.20

 

0.32

 

0.19

 

0.11

 

0.15

312

 

289

 

385

 

373

 

258

 

400

TABLE 3. Spiral output from three specimens of the species Terebratula terebratula (see caption for Table 2 for definitions and abbreviations).

Specimen Length (mm) Arc-length (mm) a1 a2 k1 parameter (spiral angle) k2 parameter (spiral angle) Error: two spirals (mm) Error: one spiral (mm) N
1 Dorsal

 

1 Ventral

 

2 Dorsal

 

2 Ventral

 

3 Dorsal

 

3 Ventral

39.25

 

47.25

 

33.17

 

38.69

 

34.47

 

40.39

46.41

 

58.04

 

37.80

 

49.52

 

41.09

 

50.50

1.84

 

5.60

 

3.52

 

5.28

 

2.08

 

6.82

2.70

 

6.68

 

1.51

 

2.47

 

0.89

 

15.07

1.40 (35.5°)

 

0.93 (47.0°)

 

1.05 (43.5°)

 

0.66 (56.5°)

 

-1.11 (-42.0°)

 

0.77 (52.4°)

1.19 (40.1°)

 

0.82 (50.8°)

 

1.51 (33.5°)

 

0.97 (45.8°)

 

-1.52 (-33.4°)

 

0.39 (68.6°)

0.12

 

0.08

 

0.14

 

0.11

 

0.14

 

0.09

0.15

 

0.10

 

0.30

 

0.29

 

0.21

 

0.23

514

 

343

 

247

 

459

 

355

 

391

 

TABLE 4. Spiral output from three specimens of the species Platystrophia ponderosa (see caption for Table 2 for definitions and abbreviations).

Specimen
(No./valve)
Length
(mm)
Arc-length
(mm)
a1 a2 k1 parameter
(spiral angle)
k2 parameter
(spiral angle)
Error: two spirals
(mm)
Error: one spiral
(mm)
N
1 Dorsal

 

1 Ventral

 

2 Dorsal

 

2 Ventral

 

3 Dorsal

 

3 Ventral

23.52

 

23.86

 

33.65

 

35.49

 

24.69

 

25.97

37.09

 

37.23

 

50.02

 

49.32

 

42.73

 

43.45

3.15

 

1.41

 

2.75

 

2.01

 

4.66

 

5.02

3.65

 

2.35

 

3.81

 

3.31

 

3.18

 

8.91

0.70 (55.1°)

 

0.80 (51.5°)

 

0.94 (46.9°)

 

0.89 (48.4°)

 

-0.45 (-65.7°)

 

0.51 (62.8°)

0.53 (62.2°)

 

0.63 (57.7°)

 

0.67 (56.1°)

 

0.72 (54.1°)

 

-0.59 (-59.7°)

 

0.29 (74.0°)

0.09

 

0.11

 

0.14

 

0.11

 

0.27

 

0.14

0.10

 

0.16

 

0.16

 

0.17

 

0.29

 

0.21

514

 

492

 

484

 

187

 

524

 

490

TABLE 5. Spiral output from three specimens of the species Pseudoatrypa sp. (see caption for Table 2 for definitions and abbreviations).

Specimen
(No./valve)
Length
(mm)
Arc-length (mm) a1 a2 k1 parameter
(spiral angle)
k2 parameter
(spiral angle)
Error: two spirals
(mm)
Error: one spiral
(mm)
N
1 Dorsal

 

1 Ventral

 

2 Dorsal

 

2 Ventral

 

3 Dorsal

 

3 Ventral

18.60

 

19.02

 

20.52

 

21.03

 

19.38

 

19.54

24.07

 

22.18

 

34.03

 

29.82

 

30.17

 

25.94

4.58

 

8.43

 

5.30

 

16.34

 

3.30

 

10.88

6.27

 

9.63

 

9.26

 

17.65

 

9.32

 

23.04

-0.50 (-63.4°)

 

1.65 (31.3°)

 

0.39 (68.6°)

 

0.10 (84.0°)

 

0.69 (55.5°)

 

0.37 (69.5°)

-0.35 (-71.0°)

 

0.50 (63.4°)

 

0.17 (80.1°)

 

-0.34 (-71.1°)

 

0.23 (76.9°)

 

-0.18 (-79.6°)

0.08

 

0.13

 

0.11

 

0.10

 

0.12

 

0.15

0.10

 

0.16

 

0.15

 

0.16

 

0.22

 

0.22

474

 

438

 

628

 

557

 

497

 

419

 

APPENDIX 1.

Instructions on inputting data into R using example coordinates from the outline of a brachiopod dorsal valve.

The following set of data shows input of coordinates into R using the scan command. Copy between ##START and ##END, paste into your R command, and hit enter. The objects “x” and “y” are the coordinates of successive points along a biological outline. In the case of accretionary growth, coordinates are assumed to begin at the umbo and be oriented in a counter-clockwise direction. It is important that each valve or outline has its own separate coordinates. R interprets instructions line by line with any text after a hash symbol being ignored by R and serving as a comment.

Example data from a brachiopod dorsal valve. This data input method uses the scan command, which is ideal when x and y coordinates are saved in Excel or a similar program.

 

1. ##START

x <-scan()

##END

 

2. After setting up the scan command, values are assigned to the object. Copy the following x values and paste into R. If you have your own data saved in an Excel spreadsheet, copy the x value column and paste into R.

 

##START

43.586104 43.661530 43.742566 43.794569 43.827071 43.827687 43.849945

43.831238 43.811462 43.765150 43.702984 43.664955 43.582932 43.514087

43.466883 43.399287 43.339617 43.266055 43.198281 43.089008 42.922561

42.805183 42.717016 42.535607 42.390088 42.238425 42.128974 41.962706

41.868394 41.724480 41.587601 41.444400 41.293806 41.149892 41.006334

40.841492 40.683686 40.497916 40.289615 40.082026 39.924220 39.723488

39.502543 39.209818 38.995373 38.716719 38.416959 38.202870 37.988068

37.845223 37.560426 37.311517 37.040433 36.784133 36.614039 36.315527

36.060118 35.868740 35.685110 35.465412 35.202434 35.003842 34.769895

34.536662 34.338070 34.075805 33.771327 33.439422 33.298717 33.108765

32.946598 32.678010 32.445133 32.120798 31.916776 31.642936 31.361525

31.065510 30.704750 30.485944 30.190285 29.900948 29.611611 29.330201

29.104895 28.795522 28.442511 28.167601 27.935437 27.639422 27.378939

27.047925 26.794121 26.597312 26.400147 26.154804 25.845075 25.579340

25.214576 24.961664 24.646682 24.394304 24.155818 23.846980 23.608317

23.293156 23.061884 22.817433 22.559269 22.321496 22.041156 21.817097

21.572290 21.313055 21.075461 20.900649 20.530277 20.299718 20.020447

19.740998 19.616325 19.337233 19.099639 18.911291 18.701838 18.471814

18.242325 17.872844 17.686102 17.519395 17.339331 17.165233 17.012062

16.824250 16.637685 16.458156 16.284593 16.125100 15.965072 15.756332

15.540378 15.464239 15.249533 14.999652 14.735521 14.583242 14.409322

14.221509 14.048837 13.931377 13.829236 13.669921 13.530821 13.413005

13.232406 13.079413 12.877530 12.766927 12.649111 12.460585 12.321663

12.161457 11.966788 11.771762 11.583771 11.340390 11.089795 10.909375

10.798415 10.597067 10.444431 10.334185 10.160621 10.072551 9.971123

9.833270 9.743417 9.577780 9.446428 9.273934 9.149974 9.026014

8.901697 8.707384 8.527320 8.333721 8.126407 7.932094 7.751852

7.558253 7.399473 7.149056 6.969527 6.837819 6.713324 6.582328

6.471547 6.375371 6.209200 6.114807 5.990668 5.845781 5.714429

5.576576 5.452616 5.329012 5.170946 5.040307 4.873957 4.728713

4.631645 4.527721 4.431011 4.335548 4.253799 4.179264

##END of x coordinates.

-It is important to press enter twice after pasting values in order to complete the scan command.

3. ##START

y <-scan()

##END

4. Copy the following y values and paste into R. Be sure to hit enter twice after pasting the values in order to complete the scan command. Confirm that the number of values assigned to “x” and “y” are identical. If these numbers are different, a mistake was likely made when copying and pasting values into R.

## START

17.42193 17.50128 17.63709 17.80736 17.91378 18.16723 18.40010 18.58266

18.80744 18.96818 19.19891 19.31059 19.49154 19.70803 19.90395 20.07119

20.20343 20.32828 20.50256 20.64763 20.82644 21.01354 21.15914 21.37278

21.55916 21.71020 21.86230 22.03408 22.14432 22.26739 22.39064 22.48557

22.59439 22.71746 22.82645 22.94195 23.05763 23.16556 23.32923 23.46477

23.58045 23.72319 23.83023 23.99177 24.12009 24.28198 24.44334 24.55759

24.69998 24.78084 24.90737 25.00666 25.14763 25.26081 25.30578 25.41789

25.49589 25.54736 25.57087 25.62866 25.72759 25.78591 25.85038 25.88671

25.94503 26.01582 26.08555 26.12641 26.12285 26.11803 26.12800 26.17047

26.19273 26.21267 26.20750 26.17944 26.17231 26.18593 26.25422 26.27683

26.27638 26.30425 26.33211 26.32498 26.32631 26.31143 26.35176 26.36592

26.36003 26.37365 26.37409 26.37978 26.39447 26.38244 26.38448 26.34306

26.34226 26.27216 26.22068 26.20019 26.12885 26.08725 26.05305 26.01706

25.98990 25.92559 25.88453 25.80794 25.71692 25.65458 25.60523 25.55731

25.49479 25.44598 25.37660 25.32993 25.22199 25.15279 25.06124 24.97672

24.89612 24.79753 24.72815 24.66002 24.59135 24.50105 24.38963 24.24651

24.11507 24.02636 23.90916 23.83435 23.76711 23.67788 23.53939 23.40109

23.30517 23.20961 23.13516 23.03835 22.94840 22.89719 22.75800 22.61791

22.48450 22.38208 22.30024 22.21100 22.07991 21.99245 21.85611 21.75351

21.68663 21.61325 21.51715 21.44288 21.35328 21.27304 21.19966 21.13856

21.06465 20.99723 20.90078 20.81840 20.73620 20.61739 20.50544 20.40231

20.33614 20.22545 20.13710 20.04279 19.94687 19.81088 19.64640 19.53027

19.46463 19.33372 19.23888 19.10075 18.99201 18.88327 18.78860 18.67808

18.56088 18.42222 18.26913 18.15861 18.04845 17.90978 17.78608 17.66710

17.52879 17.44802 17.36039 17.25147 17.17826 17.08431 16.97450 16.81020

16.70849 16.59219 16.49734 16.38121 16.27247 16.14966 15.99782 15.87483

15.77206 15.66982 15.61105 15.54505 15.47220 15.35011 15.24244 15.12791

## END of y coordinates.

5. ##START

plot(x,y)

##END

This creates a basic graph using the objects x and y. Confirm that the umbo is located at the right and the outline curves in a counter-clockwise direction. (Note: in this example the outline is oriented in the correct direction). If this is not the case, you must reverse either the x coordinates or y coordinates, or both. To reverse the x coordinates, enter the code:

##START

x<--x

##END

To reverse the y coordinates, enter the code:

##START

y<--y

##END

APPENDIX 2.

Instructions on generating a biological outline in R.

 

Step 1: Creating a scale bar

The following directions assume you have already defined the objects “x” and “y” using the brachiopod dorsal valve coordinates from appendix 1. Directions are included on how to modify the following code to suit your own data. Copy and paste the following code between ##START and ##END into R, then hit enter. Descriptions of the commands follow the code itself.

1. ##START

require (MASS)

##END

-This loads the package “MASS”, which is required for future commands.

2. ##START

eqscplot( x, y, axes = FALSE)

##END

-This plots a basic outline of the valve using equal units on each coordinate axis. No scale bar is shown with this plot; it is just a quick confirmation on whether the outline appears correct.

3. ##START

axis(side = 1, line= - 8)

##END

-This creates a default scale bar. “side=1” means that the scale bar is oriented parallel to the x-axis. This can be changed to “side =2”, which orients the scale bar parallel to the y-axis. “line= -8” is the spatial placement of the scale bar relative to the x-axis. Decreasing this number moves the scale bar up and increasing this number moves it down.

-Now that you know where the scale bar should be placed, you can edit the length and labels. Exit the graphics window, and enter the following four lines of code into the command window. The following code assumes you are using the brachiopod dorsal valve data from Appendix 1.

4. ##START

eqscplot( x, y, axes = FALSE )

axis( 1, at = c(25,35), labels = c("0 mm", "10 mm"), tck = 0.02, line = -8)

axis( side = 1, at=30, labels = F, tck = 0.016, line=-8)

axis( 1, at =seq(25,35,1), labels=F, tck = 0.009, line=-8)

##END

-The first line of code plots the biological outline of the brachiopod dorsal valve.

-The second line of code adds length, horizontal placement, and labels to the scale bar. “at=c(25,35)” means that the scale bar will extend from x=25 to x=35. In this case, the scale bar will be 10 units long and should be labeled accordingly. “labels=c(“0 mm”,”10 mm”)” labels the tick marks at the ends of the scale bar. At x=25, the scale bar label is “0 mm”, and at x=35, the scale bar label is “10 mm”. You can change these numbers to suit your own scale bar units. “tck=.02” creates a tick mark that extends in the upwards direction because it is positive. To make it extend downwards instead of upwards, make the value negative instead of positive. To increase the length of this tick mark, increase the magnitude of the value listed after “tck= ”.

-The third line of code creates a tick mark halfway through the scale bar because in this example, x=30 is the point midway between 25 and 35. “tck=.016” creates a tick mark that extends in the upwards direction and is shorter than the end tick marks. If you do not want a halfway tick mark on your scale bar, delete this line of code.

-It is important that the number you used for the line placement of the scale bar (“line = -8”) is the same as the line placement of the tick marks so they overlap each other.

-The last line of code creates minor tick marks at every unit. “at=seq(25,35,1)” means that the ticks will be placed over the span of x=25 to x=35, with 1 unit of space in between ticks. “tck=0.009” means that the tick marks will extend upwards and they will be shorter than the end and halfway tick marks.

-It is important to save the scale bar code you just determined in a document so that it is easily accessible in step 2.

Step 2: Making a biological outline with a scale

Copy and paste the following code between ##START and ##END into R, then hit enter.

1. ##START

specimen.df <- data.frame( x,y)

##END

-This combines the two objects “x” and “y” into a single data frame.

2. ##START

z.df <- specimen.df

##END

-This creates a copy of the data and saves it under the name “z.df” in case a mistake is made.

3. ##START

dev.new()

##END

-This creates a new graphic window.

4. ##START

eqscplot( z.df$x, z.df$y, type="p", pch=16, cex=0.3, col=2, xlab="", ylab="", axes=F)

##END

-This creates a plot using the data frame z.df. “z.df$x” means that the x values from the data frame “z.df” are being used in the plot. “z.df$y” means that the y values from the data frame “z.df” are being used in the plot. “pch=16” creates data points that are solid dots. Altering the value after “pch =” changes the style of data points (e.g., squares, diamonds, open circles). “cex=0.3” indicates the size of these data points. Increasing this value increases the size of the data points and vice versa. “col=2” indicates the color of the data points (e.g., 1 = black, 2 = red, 3 = green, 4 = blue). “xlab=””” and “ylab=””” means that labels on the x and y axes are absent. “axes=F” makes the x and y axes lines disappear completely.

-Now, you should have a biological outline with no labels or axes.

5. The next step is to add a scale bar to the biological outline. If you are working with the brachiopod example coordinates from appendix 1, select, copy and paste the following commands into R. The following code was determined in step 1.

##START

axis( 1, at = c(25,35), labels = c("0 mm", "10 mm"), tck = 0.02, line = -8)

axis( side = 1, at=30, labels = F, tck = 0.016, line=-8)

axis( 1, at =seq(25,35,1), labels=F, tck = 0.009, line=-8)

##END

-Now, you should have a biological outline with a correct scale bar.

APPENDIX 3.

R code necessary to create spiral deviation graphs.

Acquiring spiral deviations requires the function, fit.any.spirals, that in turn uses up to seven other functions. All eight functions are provided below. Select, copy and paste the functions listed in between ##START and ##END into your R session. Appendix 4 shows how to use these functions on example coordinate data. When exiting R, save the session so the functions are retained in your designated workspace.

##START

start.angle <- function(xc, yc, u1, v1)

{

start.theta <- atan(abs((yc - v1))/abs(xc - u1))

# now check the starting quadrant of outline

if(xc - u1 < 0 && yc - v1 > 0) start.theta <- pi - start.theta else

if(xc - u1 < 0 && yc - v1 < 0)

start.theta <- pi + start.theta

else if(xc - u1 > 0 && yc - v1 < 0)

start.theta <- 2 * pi - start.theta

# otherwise retain the first quadrant as the start of outline

return(start.theta)

}

## end of function to calculate the angle from given location to the first outline coordinate

cumulative.angle.fcn <- function (x, y, u, v)

{

# accumulates sequential angle between coordinates (x,y) about an axis location (u,y)

#

xy.r <- sqrt((x - u)^2 + (y - v)^2)

x.unit <- (x - u)/xy.r # unit vector in x direction

y.unit <- (y - v)/xy.r # unit vector in y direction

npts <- length(x.unit) # number of coordinate points

theta <- acos(abs(x.unit[1:(npts - 1)] * x.unit[2:npts] +

y.unit[1:(npts - 1)] * y.unit[2:npts]))

theta <- c(0, theta)

theta <- (theta)

eps <- 1e-05

theta.sign <- rep(+99, npts)

#

# check whether part of the outline regresses creating negative angles

# if negative then change the sign of the angle increment

#

check1 <- rotate.fcn(x = x.unit[1:(npts - 1)],

y = y.unit[1:(npts - 1)], theta = -theta[2:npts])

xc <- c(x.unit[1], check1$x)

yc <- c(y.unit[1], check1$y)

check1.x <- x.unit - xc

check1.y <- y.unit - yc

theta.sign <- ifelse(check1.x < eps & check1.y < eps, 1, -1)

theta <- theta * theta.sign

theta <- cumsum(theta)

return(theta)

} ## end of function to accumulate angle about location

rotate.fcn <- function (x, y, theta, u = 0, v = 0)

{

# rotates coordinates by an angle theta about an axis location (u,v)

#

xx <- x - u

yy <- y - v

xp <- xx * cos(theta) + yy * sin(theta)

yp <- -xx * sin(theta) + yy * cos(theta)

list(x = xp, y = yp)

} ## end of function to rotate points

fit.one.spiral.fcn <- function (x, y, start.u = NULL, start.v = NULL,

tolerance.step = 0.01)

{

# fits a single spiral to sequential outline coordinates (x,y)

# using non linear regression with a supplied tolerance and set

# to a maximum of 400 iterations.

#

lspiral.lhs <- function(x, y, u, v) sqrt((x - u)^2 + (y - v)^2)

lspiral.rhs <- function(x, y, u, v, a, k) {

xtheta <- cumulative.angle.fcn(x, y, u, v)

a * exp(k * xtheta)

}

u <- start.u

v <- start.v

spiral.fit <- nls(~lspiral.lhs(x, y, u, v) - lspiral.rhs(x, y, u, v, a, k),

trace = F, control = list(tol = tolerance.step,

maxiter = 400), start = list(u = u, v = v, a = 2, k = 0.2))

spiral.fit.coef <- coef(spiral.fit)

u1 <- as.numeric(spiral.fit.coef[1])

v1 <- as.numeric(spiral.fit.coef[2])

a1 <- as.numeric(spiral.fit.coef[3])

k1 <- as.numeric(spiral.fit.coef[4])

fit.summary <- summary(spiral.fit)

df1 <- fit.summary$df[2]

sigma1 <- fit.summary$sigma

rp1 <- sqrt((x - u1)^2 + (y - v1)^2)

thetap1 <- cumulative.angle.fcn(x, y, u1, v1)

rpp1 <- a1 * exp(k1 * thetap1)

deviations <- rp1 - rpp1 # spiral deviations

start.theta <- start.angle(xc = x[1], yc = y[1], u1, v1)

#

rfit.a <- a1 * exp(k1 * thetap1)

arc.length <- sqrt(diff(x - u1)^2 + diff(y - v1)^2)

arc.length <- cumsum(c(0, arc.length))

xp.a <- rfit.a * cos(thetap1)

yp.a <- rfit.a * sin(thetap1)

xp1.a <- xp.a * cos(-start.theta) + yp.a * sin(-start.theta)

yp1.a <- yp.a * cos(-start.theta) - xp.a * sin(-start.theta)

xp1.a <- xp1.a + u1

yp1.a <- yp1.a + v1

#

parameters1 <- round(c(u1, v1, a1, k1,sigma1), 4)

names(parameters1) <- c("x.axis", "y.axis", "a1", "k1","error")

r.residuals <- deviations

r.fitted <- rfit.a

spiral.output <- list(parameters1, thetap1, arc.length,

deviations, r.fitted, xp1.a, yp1.a)

names(spiral.output) <- c("parameters1",

"angle", "arc.length", "deviations", "fitted", "xpred.orig", "ypred.orig")

return(spiral.output)

} ## end of function to fit one spiral

#

#

fit.two.spiral.fcn <- function (x, y, m = NULL,

start.u = NULL, start.v = NULL, tolerance.step = 0.01)

{

# fits two spirals to sequential outline coordinates (x,y)

# the m th coordinate is the user specified change in spiral

# Nonlinear regression is used with a supplied tolerance and set

# at a maximum of 400 iterations.

#

lspiral.lhs <- function(x, y, u, v) sqrt((x - u)^2 + (y - v)^2)

m1 <- m

lspiral.rhs <- function(x, y, u, v, a, k1, k2, m = m1) {

xtheta <- cumulative.angle.fcn(x, y, u, v)

xchange <- xtheta[m]

a * exp(k1 * pmin(xtheta, xchange)) * exp(k2 *

pmax(xtheta - xchange, 0))

}

u <- start.u # initial estimate of horizontal location of spiral axis

v <- start.v # initial estimate of vertical location of spiral axis

spiral.fit <- nls(~lspiral.lhs(x, y, u, v) - lspiral.rhs(x,

y, u, v, a, k1, k2), trace = F, control = list(tol = tolerance.step,

maxiter = 400), start = list(u = u, v = v, a = 2, k1 = 0.2, k2 = 0.2))

spiral.fit.coef <- coef(spiral.fit)

u1 <- as.numeric(spiral.fit.coef[1])

v1 <- as.numeric(spiral.fit.coef[2])

a1 <- as.numeric(spiral.fit.coef[3])

k1 <- as.numeric(spiral.fit.coef[4])

k2 <- as.numeric(spiral.fit.coef[5])

fit.summary <- summary(spiral.fit)

df1 <- fit.summary$df[2]

sigma1 <- fit.summary$sigma

rp1 <- sqrt((x - u1)^2 + (y - v1)^2)

thetap1 <- cumulative.angle.fcn(x, y, u1, v1)

zz <- thetap1[m1]

theta.change <- c(zz)

a2 <- a1 * exp((k1 - k2) * zz)

rpp1 <- ifelse(thetap1 < zz,

a1 * exp(k1 * thetap1), a2*exp(k2 * thetap1))

deviations <- rp1 - rpp1

#

n <- length(deviations)

start.theta <- start.angle(xc = x[1], yc = y[1], u1, v1)

rfit.a <- ifelse(thetap1 < zz, a1 * exp(k1 * thetap1), a2 *

exp(k2 * thetap1))

arc.length <- sqrt(diff(x - u1)^2 + diff(y - v1)^2)

arc.length <- cumsum(c(0, arc.length))

xp.a <- rfit.a * cos(thetap1)

yp.a <- rfit.a * sin(thetap1)

xp1.a <- xp.a * cos(-start.theta) + yp.a * sin(-start.theta)

yp1.a <- yp.a * cos(-start.theta) - xp.a * sin(-start.theta)

xp1.a <- xp1.a + u1

yp1.a <- yp1.a + v1

parameters1 <- round(c(u1, v1, a1, a2, k1, k2,sigma1), 4)

names(parameters1) <- c("x.axis", "y.axis", "a1", "a2", "k1","k2","error")

r.residuals <- deviations

r.fitted <- rpp1

spiral.output <- list(parameters1, thetap1, arc.length, deviations, r.fitted,

xp1.a, yp1.a)

names(spiral.output) <- c("parameters1", "angle", "arc.length", "deviations",

"fitted", "xpred.orig", "ypred.orig")

return(spiral.output)

} ## end of function to fit two spirals with a given change location

# two plotting functions

plot.spiral.fit <- function( spiral.output=zzz, change=NULL, xdata=x,ydata=y, title.label ="" )

{

if( is.null(change) ) spirals <- 1 else spirals <- 2

x.fit <- spiral.output$xpred.orig

y.fit <- spiral.output$ypred.orig

xaxis <- spiral.output$parameters1[1]

yaxis <- spiral.output$parameters1[2]

eqscplot( xdata, ydata, pch=1, axes=F, xlab="",ylab="")

lines( x.fit, y.fit, col=2, lwd=2)

points( xaxis, yaxis, pch=10, cex=2.5,col=2)

points(xdata[change], ydata[change], pch=16, col=4, cex=1.8)

if (spirals ==1)

title( paste( " One Spiral"," for specimen ", title.label), cex.main=1.1, col.main=4,adj=0.0)

else

title( paste( " Two Spirals change at ",change[1]," for ", title.label), cex.main=1.0, col.main=4,adj=0.0)

}

# end of function to plot original outline and fitted spiral(s)

plot.spiral.deviations <- function( spiral.output=zzz, change=NULL, title.label ="" )

{

deviations <- spiral.output$deviations

arc.length <- spiral.output$arc.length

plot( arc.length, deviations, type="s", xlab="Secant or Arc length from umbo",

ylab="Spiral deviations")

abline(h=0,col=4)

abline( v=arc.length[change], col=2,lwd=2,lty=3)

axis(4,labels=F)

axis(3,labels=F)

mtext( paste( "Spiral deviations : ", title.label), side=3, outer=T, line=-2,cex=1.2,col=4,adj=0.05)

}

# end of function to plot spiral deviations

## function to use the above functions and acquire spiral deviations

fit.any.spirals <- function (x, y, m = NULL, axis.start = c(NULL,NULL),

specimen = "", res1 = NULL, res2 = NULL, tolerance.step = 0.01,

plot.fit = FALSE, plot.deviations = FALSE )

{

# fits either one or two spirals depending on the user supplied m th coordinate

# of the second spiral. If the initial axis location is not supplied

# then the outline will be plotted and location requested through a

# screen or mouse click.

xx <- x

yy <- y

require(MASS)

#

if (is.null(axis.start)) {

eqscplot(xx, yy, pch = 1)

title("Please mouse (left) click your best guess at axis location",

cex = 0.9, col.main = 2, adj = 0)

points(xx[1], yy[1], pch = 16, col = 2, cex = 1.1)

locate.xy <- locator(n = 1)

start.u <- locate.xy$x

start.v <- locate.xy$y

}

else {

start.u <- axis.start[1]

start.v <- axis.start[2]

}

#

if (is.null(m)) spiral <- 1 else spiral <- 2

if (spiral==1) { spiral.output <- fit.one.spiral.fcn(x = xx, y = yy, start.u = start.u,

start.v = start.v, tolerance.step = tolerance.step) }

else { spiral.output <- fit.two.spiral.fcn(x = xx, y = yy, m = m,

start.u = start.u, start.v = start.v, tolerance.step = tolerance.step) }

if (plot.fit)

plot.spiral.fit(spiral.output = spiral.output, change = m,

title.label = specimen, xdata = x, ydata = y)

if (plot.deviations)

plot.spiral.deviations(spiral.output = spiral.output,

change = m, title.label = specimen)

return(spiral.output)

}

##END

APPENDIX 4.

Instructions on how to use the R code in Appendix 3 to generate spiral deviation graphs, using either one or two spirals.

The following are directions to plotting spiral deviation graphs, with either one or two spirals. These directions assume you have worked through appendices 1-3, and are using the brachiopod shell coordinates from appendix 1. Select, copy and paste the functions listed in between ##START and ##END into your R session.

Spiral deviations using one spiral

1. ##START

example.fit<- fit.any.spirals(x,y, plot.fit=TRUE, specimen="A1, one spiral" )

##END

-After entering this line of code, a cross-shaped cursor will appear and you will be asked to click the location of the spiral axis. In order to do this, magine that you place a round coin inside the curve of the umbo so that it fits perfectly. The center of that imaginary coin is the approximate location of the spiral axis where you should click. Based on your chosen spiral axis, R will choose the best location for the spiral axis. The output for this code is a spiral-fitting graph, which displays the best fit of one perfect spiral (red line) to the biological outline.

2. ##START

example.fit <- fit.any.spirals(x,y, plot.deviations=TRUE, specimen="A1 example")

##END

-Click the approximate location of the spiral axis again. The output of this code is a spiral deviation graph, which plots spiral deviation versus growth from umbo. The blue line represents a spiral deviation of zero.

3. ##START

example.fit[[1]]

##END

This code displays the spiral output, which includes x.axis, y.axis, a1, k1, and error. “x.axis” and “y.axis” are the coordinates of the spiral axis location. “a1” is the distance between the spiral axis and the first coordinate pair at the umbo. “k1” is the spiral parameter, which indicates the shape of the valve. Higher values are associated with flatter valves and lower values are associates with more rounded valves. “error” is an indicator of how well the perfect spiral fits the biological outline. Lower values (<0.2) are preferable to higher values, and indicate a better spiral fit.

Spiral deviations using two spirals

1. #START

example.dorsal1<- fit.any.spirals(x,y, m=108, plot.fit=TRUE, specimen="A1, two spirals" )

##END

-Click the approximate location of the spiral axis. This code fits two spirals to the brachiopod outline with a second spiral start location at the 108th point from umbo. “m=108” means that the second spiral starts at the 108th point from the umbo. See text for discussion of where to start a second spiral. The output of this code is a spiral-fitting graph, in which the red lines are the two perfect spirals and the blue dot is the second spiral start location.

2. ##START

example.dorsal1 <- fit.any.spirals(x,y, m=108, plot.deviations=TRUE)

##END

-Click the location of the spiral axis. This code creates a spiral deviation graph, which plots spiral deviation versus growth from umbo. The vertical red-dotted line represents the location where the second spiral starts.

3. ##START

example.dorsal1[[1]]

##END

-This code displays the spiral output, which includes x.axis, y.axis, a1, a2, k1, k2, and error. When using two spirals, “a” and “k” values are computed for each spiral.

APPENDIX 5.

Spiral deviation graphs generated from the other halves of brachiopod shells shown in Figures 4-7.

5.1. Spiral deviation graphs generated from the corresponding halves to shells used in Figure 4 (Laqueus rubellus).

 appendix 5 1

5.2 Spiral deviation graphs generated from the corresponding halves to shells used in Figure 5 (Terebratula terebratula).

 appendix 5 2

5.3 Spiral deviation graphs generated from the corresponding halves to shells used in Figure 6 (Platystrophia ponderosa).

 appendix 5 3

5.4 Spiral deviation graphs generated from the corresponding halves to shells used in Figure 7 (Pseudoatrypa sp.).

appendix 5 4