<commit_before>= Fixture Definitions
<NAME> <<EMAIL>>
:icons: font

// Set up support for relative links on GitHub; add more conditions
// if you need to support other environments and extensions.
ifdef::env-github[:outfilesuffix: .adoc]

Fixture definitions tell afterglow what capabilities a given piece of
lighting hardware has, and how to control it to get the effects that are
being requested.

There are a vast number of fixture types out there, and at this early
stage almost none of them are built in to Afterglow, so you will
probably need to create your own. You can study the existing fixture
definitions for examples of how it is done. You can also ask for help
on the https://github.com/brunchboy/afterglow/wiki/Questions[wiki].

The namespace
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.html[afterglow.fixtures]
has definitions for very basic one-channel generic dimmers and
switches. Looking at the source for those can illustrate the most
basic structure of a fixture definition. It also contains some helper
functions Afterglow uses in processing fixture definitions.

The namespace
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.american-dj.html[afterglow.fixtures.american-dj]
contains definitions for fixtures made by American DJ. Currently, only
the Hypnotic RGB laser is present.

The namespace
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.blizzard.html[afterglow.fixtures.blizzard]
is the most complete so far, mostly because the author lives close to
Blizzard and mostly owns fixures made by them. It includes definitions
for a full-featured moving head spot (the Torrent F3), a moving head
color-mixing LED fixture (the Blade RGBW), an LED five-color Par (the
Puck Fab5), an eight-head RGB system (the Weather System), and an RGBW
moonflower effect (the Snowball). These might be useful examples for
fixtures you want to create.

The namespace
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.chauvet.html[afterglow.fixtures.chauvet]
is for fixtures made by Chauvet. The only one in there so far is for a
six-color (RGB, amber, white, and ultraviolet) LED Par.

== Structure of a Fixture Definition

Once created, a fixture definition is simply a Clojure map with keys
and values that tell Afterglow how to control it. The fixture
definition functions linked to above simply create and return these
maps.

Fixtures may have multiple "personalities" or _modes_ which change the
number and meaning of the control channels they use, and the features
that are available. For such fixtures, the mode is generally given as
an argument to the fixture definition function, and tells it what
version of the map to return. For convenience, the function may let
you call it with no argument, and assume a default mode. Its
documentation should reflect this, see for example the
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.blizzard.html#var-blade-rgbw[blade-rgbw]
documentation.

When you are learning how to write fixture definitions, it can be
helpful to compare the fixture definition functions, which call helper
functions described on this page, with the actual maps that they
return. This can be facilitated by using `clojure.pprint/pprint` to
pretty-print the map that you get when calling the function. For
example:

[source,clojure]
----
(clojure.pprint/pprint (afterglow.fixtures.blizzard/snowball))
; {:name "<NAME>",
;  :channels
;  [{:offset 1,
;    :type :dimmer,
;    :functions
;    [{:start 0,
;      :end 255,
;      :range :variable,
;      :type :dimmer,
;      :label "Dimmer"}]}
;   {:offset 2,
;    :type :color,
;    :functions
;    [{:start 0, :end 255, :range :variable, :type :red, :label "Red"}],
;    :color :red}
; [...many channels omitted for brevity...]
;   {:offset 9,
;    :type :control,
;    :functions
;    [{:start 0,
;      :range :fixed,
;      :type :no-function,
;      :label "No function",
;      :end 127}
;     {:range :variable,
;      :label "Sound-active",
;      :type :sound-active,
;      :var-label "Sensitivity",
;      :start 128,
;      :end 255}]}]}
; -> nil
----

Even though most of the channels were cut out to shorten that example,
it is still pretty long. Still, it gives a sense of the shape of a
fixture definition. You may have noticed that there were only two
top-level keys in the returned map, `:name` and `:channels`. Those
are the only two that need to be there for a simple fixture. And
almost all of the information Afterglow needs is found in the
`:channels` list, so that is where you will spend most of your work in
creating the fixture definition.

If you had already looked at the source for
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.blizzard.html#var-snowball[snowball]
(which you can get to by clicking the `view source` button at the
bottom of all the API documentation entries), you might have noticed
that the source is a lot shorter than the resulting map. That's
because it can take advantage of a bunch of helper functions described
on this page to help with the tedious and repetetive parts of
constructing the map. And when you patch a fixture into a show using
http://deepsymmetry.org/afterglow/doc/afterglow.show.html#var-patch-fixture.21[afterglow.show/patch-fixture!]
the map gets much bigger again, as Afterglow annotates it with
information you provided during the patching process, assigning the
actual universes and DMX channels for each logical channel in the
fixture definition, and figuring out the location in space and aiming
direction, potentially of several heads of a multi-head fixture.

So, let's look at the fixture definition map contents in detail.

[cols="2l,5a", options="header"]
|===
|Key
|Purpose

|:name

|A string which identifies the manufacturer and model of fixture.

|:channels

| A list of channel specifications which tell Afterglow about the DMX
channels that the fixture responds to, and how to make it do different
things. This is the meat of the fixture definition, and is described
in detail <<channel-specifications,below>>.

|:mode

|If present, identifies the fixture mode in which this definition map
 was created. As desrcibed above, some fixtures can be configured to
 have different &ldquo;personalities&rdquo; which use a different
 number of DMX channels and provide a different set of features. Their
 fixture definition functions will use a `mode` argument to determine
 the mode in which the fixture is operating, and return an appropriate
 map. That map will include the chosen mode keyword as the value at
 this key.

|:heads

|If a fixture has multiple independent heads, which can be controlled
 individually, the channels which control the heads are grouped into a
 list under this key. Each entry in the list is a map which explains a
 single head. It will contain its own `:channels` key with the channel
 specifications controlling that specific head, and will also contain
 geometric information about the offset of that particular head from
 the geometric center of the fixture, so Afterglow can figure out
 where the head is in space when the fiture is patched into the show.
 This is described in more detail <<head-specifications,below>>.

|:pan-center

|If this fixture is a moving head capable of pan movements, this entry
 tells afterglow the DMX value to send the fixture to pan it directly
 at the audience when the fixture is hung at its standard orientation.
 (The documentation you create for your fixture definition needs to
 explain what this default orientation is, so that people patching
 your fixture can figure out the proper angle information to tell
 Afterglow if they hung it in a different orientation, as explained in
 <<show_space#show-space,Show Space>>.) The `:pan-center` value should
 pan the light so it is aimed exactly along the show Z axis when also
 tilted to `:tilt-center`.

Many fixtures can pan more than once around a full circle, so you may
have a choice of values to supply here, all of which pan the fixture
directly towards the audience in your default hanging orientation. If
so, pick one towards the middle of the DMX range, giving Afterglow
room to maneuver without having to flip to the opposite end of the pan
range regardless of how the fixture has been hung.

If the fixture cannot pan far enough to aim directly at the audience
when it is hung in its default orientation, you may be better off
choosing a different default hanging orientation. But if you do not
want to do that, you can set this to the closest value outside the
legal DMX range which would cause the fixture to pan that far if it
were legal and possible, and Afterglow will still be able to figure
out and use the legal movements that the fixture is capable of.

|:pan-half-circle

|If this fixture is a moving head capable of pan movements, this entry
 tells Afterglow the amount it needs to add to the DMX value sent on
 the fixture's Pan channel to pan it halfway around a circle in a
 counterclockwise direction. Afterglow uses this to figure out how to
 aim the head exactly where you want it. If your fixture is not
 capable of panning that far, this value may be larger than a legal
 DMX value. That is fine, Afterglow will figure that out. Simply
 always give it the value which, when added to some legal Pan channel
 value, would cause the fixture to rotate counterclockwise halfway
 around a circle if it could rotate that far. (This number could be
 negative if the fixture turns clockwise when the pan value is
 increased in its default hanging orientation.)

The <<show_space#show-space,Show Space>> page explains how to figure
out which rotations are clockwise or counterclockwise with respect to
different axes. Pan motions are rotations around the fixture Y axis.

|:tilt-center

|If this fixture is a moving head capable of tilt movements, this
 entry tells afterglow the DMX value to send the fixture to tilt it
 directly at the audience when the fixture is hung at its standard
 orientation. (The documentation you create for your fixture
 definition needs to explain what this default orientation is, so that
 people patching your fixture can figure out the proper angle
 information to tell Afterglow if they hung it in a different
 orientation, as explained in <<show_space#show-space,Show Space>>.)
 The `:tilt-center` value should tilt the light so it is aimed exactly
 along the show Z axis when also panned to `:pan-center`.

Some fixtures can tilt more than once around a full circle, so you may
have a choice of values to supply here, all of which tilt the fixture
directly towards the audience in your default hanging orientation. If
so, pick one towards the middle of the DMX range, giving Afterglow
room to maneuver without having to flip to the opposite end of the tilt
range regardless of how the fixture has been hung.

If the fixture cannot tilt far enough to aim directly at the audience
when it is hung in its default orientation, you may be better off
choosing a different default hanging orientation. But if you do not
want to do that, you can set this to the closest value outside the
legal DMX range which would cause the fixture to tilt that far if it
were legal and possible, and Afterglow will still be able to figure
out and use the legal movements that the fixture is capable of.

|:tilt-half-circle

|If this fixture is a moving head capable of tilt movements, this entry
 tells Afterglow the amount it needs to add to the DMX value sent on
 the fixture's Tilt channel to tilt it halfway around a circle in a
 counterclockwise direction. Afterglow uses this to figure out how to
 aim the head exactly where you want it. If your fixture is not
 capable of tilting that far, this value may be larger than a legal
 DMX value. That is fine, Afterglow will figure that out. Simply
 always give it the value which, when added to some legal Tilt channel
 value, would cause the fixture to rotate counterclockwise halfway
 around a circle if it could rotate that far. (This number could be
 negative if the fixture turns clockwise when the tilt value is
 increased in its default hanging orientation.)

The <<show_space#show-space,Show Space>> page explains how to figure
out which rotations are clockwise or counterclockwise with respect to
different axes. Tilt motions are rotations around the fixture X axis.

|===

=== Channel Specifications

=== Head Specifications

As described above, the `:heads` entry in a fixture definition map is
a list that describes each individually controllable head within that
fixture. It may be a separate moving head, or it may just be an
individually-addressable pixel. Each element of the list is a map with
the following content:

[cols="2l,5a", options="header"]
|===
|Key
|Purpose

|:name

|A string which identifies the manufacturer and model of fixture.

|:channels

| A list of channel specifications which tell Afterglow about the DMX
channels that this individual head responds to. These have exactly the
same structure as the channel specifications for the main fixture, as
described <<channel-specifications,above>>. A channel can only be
listed in one place or the other. If it affects the entire fixture, it
should be in the main list; if it affects only a single head, it
should be in that head's list.

|:x

|The offset along the fixture X axis, in meters, from the geometric
 center of the fixture (the point at which Afterglow is told the
 fixture is located when patching the fixture) and the geometric
 center of this head. If this head is centered within the fixture X
 axis, you can omit this value or you can supply it with a value of
 0.0. The <<show_space#show-space,Show Space>> page illustrates the
 axes and links to a function you can use for converting inches to
 meters.

|:y

|The offset along the fixture Y axis, in meters, from the geometric
 center of the fixture (the point at which Afterglow is told the
 fixture is located when patching the fixture) and the geometric
 center of this head. If this head is centered within the fixture Y
 axis, you can omit this value or you can supply it with a value of
 0.0. The <<show_space#show-space,Show Space>> page illustrates the
 axes and links to a function you can use for converting inches to
 meters.

|:z

|The offset along the fixture Z axis, in meters, from the geometric
 center of the fixture (the point at which Afterglow is told the
 fixture is located when patching the fixture) and the geometric
 center of this head. If this head is centered within the fixture X
 axis, you can omit this value or you can supply it with a value of
 0.0. The <<show_space#show-space,Show Space>> page illustrates the
 axes and links to a function you can use for converting inches to
 meters.

|:x-rotation

|If this head aims in a different direction than the fixture as a<commit_msg>Documenting fixture definitions.<commit_after>= Fixture Definitions
<NAME> <<EMAIL>>
:icons: font

// Set up support for relative links on GitHub; add more conditions
// if you need to support other environments and extensions.
ifdef::env-github[:outfilesuffix: .adoc]

Fixture definitions tell afterglow what capabilities a given piece of
lighting hardware has, and how to control it to get the effects that are
being requested.

There are a vast number of fixture types out there, and at this early
stage almost none of them are built in to Afterglow, so you will
probably need to create your own. You can study the existing fixture
definitions for examples of how it is done. You can also ask for help
on the https://github.com/brunchboy/afterglow/wiki/Questions[wiki].

TIP: When you first embark on the project of creating a fixture
definition, it might seem overwhelming. This page is long, and
includes a great deal of complicated detail. But don't despair! First,
remember that most fixtures only do a subset of the kinds of things
that the fixture definition mechanism needs to handle, so you do not
need to learn and understand all of it at once. And even more helpful
to beginners, realize that you do not need to finish your fixture
definition before you can start using and testing it. Your fixture may
be capable of many things, but start out by defining just a couple of
channels that will make it at least light up, and see if you can get
those working in a show. Once they are, you can already use the
fixture at least at that level. And that success can be a foundation
for digging deeper into other types of channels, which you can add to
your definition one at a time, building on what you learn as you go
along.

The namespace
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.html[afterglow.fixtures]
has definitions for very basic one-channel generic dimmers and
switches. Looking at the source for those can illustrate the most
basic structure of a fixture definition. It also contains some helper
functions Afterglow uses in processing fixture definitions.

The namespace
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.american-dj.html[afterglow.fixtures.american-dj]
contains definitions for fixtures made by American DJ. Currently, only
the Hypnotic RGB laser is present.

The namespace
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.blizzard.html[afterglow.fixtures.blizzard]
is the most complete so far, mostly because the author lives close to
Blizzard and mostly owns fixures made by them. It includes definitions
for a full-featured moving head spot (the Torrent F3), a moving head
color-mixing LED fixture (the Blade RGBW), an LED five-color Par (the
Puck Fab5), an eight-head RGB system (the Weather System), and an RGBW
moonflower effect (the Snowball). These might be useful examples for
fixtures you want to create.

The namespace
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.chauvet.html[afterglow.fixtures.chauvet]
is for fixtures made by Chauvet. The only one in there so far is for a
six-color (RGB, amber, white, and ultraviolet) LED Par.

== Structure of a Fixture Definition

Once created, a fixture definition is simply a Clojure map with keys
and values that tell Afterglow how to control it. The fixture
definition functions linked to above simply create and return these
maps.

Fixtures may have multiple "personalities" or _modes_ which change the
number and meaning of the control channels they use, and the features
that are available. For such fixtures, the mode is generally given as
an argument to the fixture definition function, and tells it what
version of the map to return. For convenience, the function may let
you call it with no argument, and assume a default mode. Its
documentation should reflect this, see for example the
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.blizzard.html#var-blade-rgbw[blade-rgbw]
documentation.

When you are learning how to write fixture definitions, it can be
helpful to compare the fixture definition functions, which call helper
functions described on this page, with the actual maps that they
return. This can be facilitated by using `clojure.pprint/pprint` to
pretty-print the map that you get when calling the function. For
example:

[source,clojure]
----
(clojure.pprint/pprint (afterglow.fixtures.blizzard/snowball))
; {:name "<NAME>",
;  :channels
;  [{:offset 1,
;    :type :dimmer,
;    :functions
;    [{:start 0,
;      :end 255,
;      :range :variable,
;      :type :dimmer,
;      :label "Dimmer"}]}
;   {:offset 2,
;    :type :color,
;    :functions
;    [{:start 0, :end 255, :range :variable, :type :red, :label "Red"}],
;    :color :red}
; [...many channels omitted for brevity...]
;   {:offset 9,
;    :type :control,
;    :functions
;    [{:start 0,
;      :range :fixed,
;      :type :no-function,
;      :label "No function",
;      :end 127}
;     {:range :variable,
;      :label "Sound-active",
;      :type :sound-active,
;      :var-label "Sensitivity",
;      :start 128,
;      :end 255}]}]}
; -> nil
----

Even though most of the channels were cut out to shorten that example,
it is still pretty long. Still, it gives a sense of the shape of a
fixture definition. You may have noticed that there were only two
top-level keys in the returned map, `:name` and `:channels`. Those
are the only two that need to be there for a simple fixture. And
almost all of the information Afterglow needs is found in the
`:channels` list, so that is where you will spend most of your work in
creating the fixture definition.

If you had already looked at the source for
http://deepsymmetry.org/afterglow/doc/afterglow.fixtures.blizzard.html#var-snowball[snowball]
(which you can get to by clicking the `view source` button at the
bottom of all the API documentation entries), you might have noticed
that the source is a lot shorter than the resulting map. That's
because it can take advantage of a bunch of helper functions described
on this page to help with the tedious and repetetive parts of
constructing the map. And when you patch a fixture into a show using
http://deepsymmetry.org/afterglow/doc/afterglow.show.html#var-patch-fixture.21[afterglow.show/patch-fixture!]
the map gets much bigger again, as Afterglow annotates it with
information you provided during the patching process, assigning the
actual universes and DMX channels for each logical channel in the
fixture definition, and figuring out the location in space and aiming
direction, potentially of several heads of a multi-head fixture.

So, let's look at the fixture definition map contents in detail.

[cols="2l,5a", options="header"]
|===
|Key
|Purpose

|:name

|A string which identifies the manufacturer and model of fixture.

|:channels

| A list of channel specifications which tell Afterglow about the DMX
channels that the fixture responds to, and how to make it do different
things. This is the meat of the fixture definition, and is described
in detail <<channel-specifications,below>>.

|:mode

|If present, identifies the fixture mode in which this definition map
 was created. As desrcibed above, some fixtures can be configured to
 have different &ldquo;personalities&rdquo; which use a different
 number of DMX channels and provide a different set of features. Their
 fixture definition functions will use a `mode` argument to determine
 the mode in which the fixture is operating, and return an appropriate
 map. That map will include the chosen mode keyword as the value at
 this key.

|:heads

|If a fixture has multiple independent heads, which can be controlled
 individually, the channels which control the heads are grouped into a
 list under this key. Each entry in the list is a map which explains a
 single head. It will contain its own `:channels` key with the channel
 specifications controlling that specific head, and will also contain
 geometric information about the offset of that particular head from
 the geometric center of the fixture, so Afterglow can figure out
 where the head is in space when the fiture is patched into the show.
 This is described in more detail <<head-specifications,below>>.

|:pan-center

|If this fixture is a moving head capable of pan movements, this entry
 tells afterglow the DMX value to send the fixture to pan it directly
 at the audience when the fixture is hung at its standard orientation.
 (The documentation you create for your fixture definition needs to
 explain what this default orientation is, so that people patching
 your fixture can figure out the proper angle information to tell
 Afterglow if they hung it in a different orientation, as explained in
 <<show_space#show-space,Show Space>>.) The `:pan-center` value should
 pan the light so it is aimed exactly along the show Z axis when also
 tilted to `:tilt-center`.

Many fixtures can pan more than once around a full circle, so you may
have a choice of values to supply here, all of which pan the fixture
directly towards the audience in your default hanging orientation. If
so, pick one towards the middle of the DMX range, giving Afterglow
room to maneuver without having to flip to the opposite end of the pan
range regardless of how the fixture has been hung.

If the fixture cannot pan far enough to aim directly at the audience
when it is hung in its default orientation, you may be better off
choosing a different default hanging orientation. But if you do not
want to do that, you can set this to the closest value outside the
legal DMX range which would cause the fixture to pan that far if it
were legal and possible, and Afterglow will still be able to figure
out and use the legal movements that the fixture is capable of.

|:pan-half-circle

|If this fixture is a moving head capable of pan movements, this entry
 tells Afterglow the amount it needs to add to the DMX value sent on
 the fixture's Pan channel to pan it halfway around a circle in a
 counterclockwise direction. Afterglow uses this to figure out how to
 aim the head exactly where you want it. If your fixture is not
 capable of panning that far, this value may be larger than a legal
 DMX value. That is fine, Afterglow will figure that out. Simply
 always give it the value which, when added to some legal Pan channel
 value, would cause the fixture to rotate counterclockwise halfway
 around a circle if it could rotate that far. (This number could be
 negative if the fixture turns clockwise when the pan value is
 increased in its default hanging orientation.)

The <<show_space#show-space,Show Space>> page explains how to figure
out which rotations are clockwise or counterclockwise with respect to
different axes. Pan motions are rotations around the fixture Y axis.

|:tilt-center

|If this fixture is a moving head capable of tilt movements, this
 entry tells afterglow the DMX value to send the fixture to tilt it
 directly at the audience when the fixture is hung at its standard
 orientation. (The documentation you create for your fixture
 definition needs to explain what this default orientation is, so that
 people patching your fixture can figure out the proper angle
 information to tell Afterglow if they hung it in a different
 orientation, as explained in <<show_space#show-space,Show Space>>.)
 The `:tilt-center` value should tilt the light so it is aimed exactly
 along the show Z axis when also panned to `:pan-center`.

Some fixtures can tilt more than once around a full circle, so you may
have a choice of values to supply here, all of which tilt the fixture
directly towards the audience in your default hanging orientation. If
so, pick one towards the middle of the DMX range, giving Afterglow
room to maneuver without having to flip to the opposite end of the tilt
range regardless of how the fixture has been hung.

If the fixture cannot tilt far enough to aim directly at the audience
when it is hung in its default orientation, you may be better off
choosing a different default hanging orientation. But if you do not
want to do that, you can set this to the closest value outside the
legal DMX range which would cause the fixture to tilt that far if it
were legal and possible, and Afterglow will still be able to figure
out and use the legal movements that the fixture is capable of.

|:tilt-half-circle

|If this fixture is a moving head capable of tilt movements, this entry
 tells Afterglow the amount it needs to add to the DMX value sent on
 the fixture's Tilt channel to tilt it halfway around a circle in a
 counterclockwise direction. Afterglow uses this to figure out how to
 aim the head exactly where you want it. If your fixture is not
 capable of tilting that far, this value may be larger than a legal
 DMX value. That is fine, Afterglow will figure that out. Simply
 always give it the value which, when added to some legal Tilt channel
 value, would cause the fixture to rotate counterclockwise halfway
 around a circle if it could rotate that far. (This number could be
 negative if the fixture turns clockwise when the tilt value is
 increased in its default hanging orientation.)

The <<show_space#show-space,Show Space>> page explains how to figure
out which rotations are clockwise or counterclockwise with respect to
different axes. Tilt motions are rotations around the fixture X axis.

|===

=== Channel Specifications

=== Head Specifications

As described above, the `:heads` entry in a fixture definition map is
a list that describes each individually controllable head within that
fixture. It may be a separate moving head, or it may just be an
individually-addressable pixel. Each element of the list is a map with
the following content:

[cols="2l,5a", options="header"]
|===
|Key
|Purpose

|:channels

| A list of channel specifications which tell Afterglow about the DMX
channels that this individual head responds to. These have exactly the
same structure as the channel specifications for the main fixture, as
described <<channel-specifications,above>>. A channel can only be
listed in one place or the other. If it affects the entire fixture, it
should be in the main list; if it affects only a single head, it
should be in that head's list.

|:x

|The offset along the fixture X axis, in meters, from the geometric
 center of the fixture (the point at which Afterglow is told the
 fixture is located when patching the fixture) and the geometric
 center of this head. If this head is centered along the fixture X
 axis, you can omit this value or you can supply it with a value of
 0.0. The <<show_space#show-space,Show Space>> page illustrates the
 axes and links to a function you can use for converting inches to
 meters.

|:y

|The offset along the fixture Y axis, in meters, from the geometric
 center of the fixture (the point at which Afterglow is told the
 fixture is located when patching the fixture) and the geometric
 center of this head. If this head is centered along the fixture Y
 axis, you can omit this value or you can supply it with a value of
 0.0. The <<show_space#show-space,Show Space>> page illustrates the
 axes and links to a function you can use for converting inches to
 meters.

|:z

|The offset along the fixture Z axis, in meters, from the geometric
 center of the fixture (the point at which Afterglow is told the
 fixture is located when patching the fixture) and the geometric
 center of this head. If this head is centered along the fixture X
 axis, you can omit this value or you can supply it with a value of
 0.0. The <<show_space#show-space,Show Space>> page illustrates the
 axes and links to a function you can use for converting inches to
 meters.

|:x-rotation

|If this head aims in a different direction than the fixture as a
{'fraction_non_alphanumeric': 0.04918463103323818, 'fraction_numerical': 0.002296813990878367, 'mean_word_length': 4.281233754981805, 'pattern_counts': {'":': 0, '<': 51, '<?xml version=': 0, '>': 53, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3684527', 'n_tokens_mistral': 7944, 'n_tokens_neox': 7670, 'n_words': 4725}