pygplates.synchronise_crossovers
- pygplates.synchronise_crossovers(rotation_features[, crossover_filter][, crossover_threshold_degrees][, crossover_type_function=CrossoverTypeFunction.type_from_xo_tags_in_comment][, crossover_results])
Synchronise crossovers in rotation features.
- Parameters
rotation_features (
FeatureCollection
, or string, orFeature
, or sequence ofFeature
, or sequence of any combination of those four types) – A rotation feature collection, or rotation filename, or rotation feature, or sequence of rotation features, or a sequence (eg,list
ortuple
) of any combination of those four types - all features are used as input and outputcrossover_filter (a callable accepting a single named-tuple 'Crossover' argument, or a sequence of named-tuple 'Crossover', or None) – Optional predicate function (accepting a single crossover argument) that determines which crossovers (in rotation_features) to synchronise, or an optional sequence of crossovers (in any order) to synchronise - if nothing is specified then all crossovers (in rotation_features) are synchronised - a crossover is a named-tuple ‘Crossover’ (see table below)
crossover_threshold_degrees (float or None) – If specified then crossovers are synchronised only if the old-crossover rotation latitude, longitude or angle differ from those in young-crossover rotation by more than this amount
crossover_type_function (a callable, or a CrossoverType enumerated value, or can also be None if crossover_filter is a sequence (since it then gets ignored)) – A function that determines a crossover’s type, or one of the CrossoverType enumerated values, or CrossoverTypeFunction.type_from_xo_tags_in_comment if using default scheme for determining crossover type (see below) - default is CrossoverTypeFunction.type_from_xo_tags_in_comment
crossover_results (list or None) – If specified then a tuple of (Crossover, int) is appended for each filtered crossover where the integer value is CrossoverResult.synchronised if the crossover was synchronised, or CrossoverResult.not_synchronised if the crossover did not require synchronising, or CrossoverResult.ignored if the crossover was ignored (due to a crossover type of CrossoverType.ignore), or CrossoverResult.error if the crossover was unable to be processed (due to a crossover type of CrossoverType.unknown) - the list is sorted by crossover time - default is None
- Returns
True on success. False if the type of any crossover is CrossoverType.unknown (which generates a CrossoverResult.error in crossover_results, if specified, due to inability to process crossover). Also returns False if unable to synchronise all crossovers due to an infinite cycle between crossovers. In all cases (success or failure) as many crossovers as possible will be processed and results saved to rotation features (and rotation files, if any).
- Return type
bool
A crossover occurs when the motion of a (moving) plate crosses over from one (fixed) plate to move relative to another (fixed) plate at a particular geological time. Synchronising a crossover involves adjusting the finite rotations before (older) the crossover to match the finite rotation after (younger) the crossover, or vice versa depending on the type of crossover.
Note
Younger means more recent (smaller time values) and older means less recent (larger time values).
A crossover is represented as a named-tuple ‘Crossover’ with the following named elements:
Name
Type
Description
type
int
One of the enumerated values of CrossoverType (see table below).
time
float
The crossover time.
moving_plate_id
int
The moving plate ID.
young_crossover_fixed_plate_id
int
The fixed plate ID after (younger than) the crossover.
old_crossover_fixed_plate_id
int
The fixed plate ID before (older than) the crossover.
young_crossover_rotation_sequence
list of
GpmlFiniteRotation
The time sequence of enabled finite rotations after (younger than) the crossover.
old_crossover_rotation_sequence
list of
GpmlFiniteRotation
The time sequence of enabled finite rotations before (older than) the crossover.
See also
find_crossovers()
for more information on the young/old rotation sequences in named-tuple ‘Crossover’.Note
rotation_features should contain all features that directly or indirectly affect the crossovers to be synchronised (typically rotation_features is one or more rotation files), otherwise crossovers may not be correctly synchronised.
Synchronising crossovers results in modifications to rotation_features. The modified rotation features can then be used to create a new
RotationModel
with updated rotations. If any filenames are specified in rotation_features then the modified feature collection(s) (containing synchronised crossovers) that are associated with those files are written back out to those same files.FeatureCollection
is used internally to read/write feature collections from/to those files.crossover_filter can optionally be used to limit (or specify) the crossovers to synchronise. It can either be a predicate function (accepting a single crossover argument) or a sequence of crossovers. If crossover_filter is not specified then all crossovers (found using
find_crossovers()
on rotation_features) will be synchronised. If crossover_filter is a predicate function then only those crossovers (found usingfind_crossovers()
on rotation_features) that pass the predicate test will be synchronised. If crossover_filter is a sequence of crossovers then only crossovers in that sequence will be synchronised (and you must ensure that both the young and old sequences in each crossover have at least one enabled time sample otherwise the crossover can’t really be a crossover).Note
crossover_type_function is ignored if crossover_filter is a sequence of crossovers (since the crossover types are already known).
crossover_threshold_degrees can optionally be used to synchronise (fix) only those crossovers whose difference in young and old crossover rotation latitudes, longitudes or angles exceeds this amount. This is useful since some PLATES rotation files are typically only accurate to 2 decimal places (or threshold of 0.01).
CrossoverType supports the following enumeration values:
Value
Description
CrossoverType.unknown
The crossover is of unknown type (it will not be
synchronised
).CrossoverType.ignore
The crossover will be ignored (it will not be
synchronised
).CrossoverType.synch_old_crossover_and_stages
All finite rotations in the old crossover sequence will be synchronised (such that old stage rotations are preserved). All finite rotations in the young crossover sequence are preserved.
CrossoverType.synch_old_crossover_only
Only the crossover finite rotation in the old crossover sequence will be synchronised (such that the older finite rotations are preserved). All finite rotations in the young crossover sequence are preserved.
CrossoverType.synch_young_crossover_and_stages
All finite rotations in the young crossover sequence will be synchronised (such that young stage rotations are preserved). All finite rotations in the old crossover sequence are preserved. Note: This can result in non-zero finite rotations at present day if the younger sequence includes present day.
CrossoverType.synch_young_crossover_only
Only the crossover finite rotation in the young crossover sequence will be synchronised (such that the younger finite rotations are preserved). All finite rotations in the old crossover sequence are preserved.
crossover_type_function supports the following arguments:
Type
Description
Arbitrary callable (function)
A callable accepting the following arguments:
crossover_time
moving_plate_id
young_crossover_fixed_plate_id
old_crossover_fixed_plate_id
young_crossover_rotation_sequence
old_crossover_rotation_sequence
…and returning a CrossoverType enumerated value.
CrossoverTypeFunction.type_from_xo_tags_in_comment
A callable (with same arguments as arbitrary callable) that uses the comment/description field of the young crossover pole to determine the crossover type according to the presence of the following strings/tags:
@xo_ig : CrossoverType.ignore
@xo_ys : CrossoverType.synch_old_crossover_and_stages
@xo_yf : CrossoverType.synch_old_crossover_only
@xo_os : CrossoverType.synch_young_crossover_and_stages
@xo_of : CrossoverType.synch_young_crossover_only
…and if none of those tags are present then the crossover type is CrossoverType.unknown.
This is the default for crossover_type_function.
CrossoverTypeFunction.type_from_xo_tags_in_comment_default_xo_ys
Same as CrossoverTypeFunction.type_from_xo_tags_in_comment except defaults to CrossoverType.synch_old_crossover_and_stages if no tags are present in the comment/description field of the young crossover pole.
CrossoverTypeFunction.type_from_xo_tags_in_comment_default_xo_ig
Same as CrossoverTypeFunction.type_from_xo_tags_in_comment except defaults to CrossoverType.ignore if no tags are present in the comment/description field of the young crossover pole.
CrossoverType.unknown
All crossovers will be of type CrossoverType.unknown.
CrossoverType.ignore
All crossovers will be of type CrossoverType.ignore.
CrossoverType.synch_old_crossover_and_stages
All crossovers will be of type CrossoverType.synch_old_crossover_and_stages.
CrossoverType.synch_old_crossover_only
All crossovers will be of type CrossoverType.synch_old_crossover_only.
CrossoverType.synch_young_crossover_and_stages
All crossovers will be of type CrossoverType.synch_young_crossover_and_stages.
CrossoverType.synch_young_crossover_only
All crossovers will be of type CrossoverType.synch_young_crossover_only.
crossover_results can optionally be used to obtain a list of the synchronisation results of all filtered crossovers (see crossover_filter). Each appended list element is a tuple of (Crossover, int) where the integer value is CrossoverResult.synchronised if the crossover was synchronised, or CrossoverResult.not_synchronised if the crossover did not require synchronising, or CrossoverResult.ignored if the crossover was ignored (due to a crossover type of CrossoverType.ignore), or CrossoverResult.error if the crossover was unable to be processed (due to a crossover type of CrossoverType.unknown). The appended list elements are sorted by crossover time.
Synchronise all crossovers found in a rotation file (and save modifications back to the same rotation file) where crossover types are determined by ‘@xo_’ tags in the young crossover description/comment:
pygplates.synchronise_crossovers('rotations.rot')
Synchronise crossovers between present day and 20Ma found in a PLATES rotation file that has rotation latitudes, longitudes and angles rounded to 2 decimal places (and save modifications back to the same rotation file) assuming all crossovers are of type CrossoverType.synch_old_crossover_and_stages:
crossover_results = [] pygplates.synchronise_crossovers( 'rotations.rot', lambda crossover: crossover.time <= 20, 0.01, # Equivalent to 2 decimal places pygplates.CrossoverType.synch_old_crossover_and_stages, crossover_results) print 'Fixed %d crossovers' % sum( 1 for result in crossover_results if result[1]==pygplates.CrossoverResult.synchronised)