From 60e7fc220ab1bef89e150041f7ad4b7e750399b0 Mon Sep 17 00:00:00 2001
From: Ben Cumming <bcumming@cscs.ch>
Date: Thu, 6 Feb 2020 13:54:27 +0200
Subject: [PATCH] rename z distance region calls (#954)

- Rename z distance region definitions to refer to the root, not the soma.
- Also fix printing of some region expressions to s-expressions.

Fixes #947.
---
 arbor/include/arbor/morph/region.hpp |  8 +++----
 arbor/morph/locset.cpp               |  3 +--
 arbor/morph/region.cpp               | 28 ++++++++++++------------
 python/morph_parse.cpp               |  8 +++++++
 test/unit/test_morph_expr.cpp        | 32 ++++++++++++++--------------
 5 files changed, 43 insertions(+), 36 deletions(-)

diff --git a/arbor/include/arbor/morph/region.hpp b/arbor/include/arbor/morph/region.hpp
index 629c7345..40db2f63 100644
--- a/arbor/include/arbor/morph/region.hpp
+++ b/arbor/include/arbor/morph/region.hpp
@@ -147,12 +147,12 @@ region radius_gt(region reg, double r);
 region radius_ge(region reg, double r);
 
 // Region with all segments with projection less than/less than or equal to r
-region z_dist_from_soma_lt(double r);
-region z_dist_from_soma_le(double r);
+region z_dist_from_root_lt(double r);
+region z_dist_from_root_le(double r);
 
 // Region with all segments with projection greater than/greater than or equal to r
-region z_dist_from_soma_gt(double r);
-region z_dist_from_soma_ge(double r);
+region z_dist_from_root_gt(double r);
+region z_dist_from_root_ge(double r);
 
 // Region with all segments in a cell.
 region all();
diff --git a/arbor/morph/locset.cpp b/arbor/morph/locset.cpp
index e9acaef7..5accd881 100644
--- a/arbor/morph/locset.cpp
+++ b/arbor/morph/locset.cpp
@@ -308,8 +308,7 @@ mlocation_list thingify_(const uniform_& u, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const uniform_& u) {
-    return o << "(uniform from region: \"" << u.reg << "\"; using seed: " << u.seed
-             << "; range: {" << u.left << ", " << u.right << "})";
+    return o << "(uniform " << u.reg << " " << u.left << " " << u.right << " " << u.seed << ")";
 }
 
 // Intersection of two point sets.
diff --git a/arbor/morph/region.cpp b/arbor/morph/region.cpp
index 9aafa123..c98313a3 100644
--- a/arbor/morph/region.cpp
+++ b/arbor/morph/region.cpp
@@ -374,7 +374,7 @@ mcable_list thingify_(const distal_interval_& reg, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const distal_interval_& d) {
-    return o << "(distal_interval: " << d.start << ", " << d.distance << ")";
+    return o << "(distal_interval " << d.start << " " << d.distance << ")";
 }
 
 // Region with all segments proximal from another region
@@ -426,7 +426,7 @@ mcable_list thingify_(const proximal_interval_& reg, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const proximal_interval_& d) {
-    return o << "(distal_interval: " << d.end << ", " << d.distance << ")";
+    return o << "(distal_interval " << d.end << " " << d.distance << ")";
 }
 
 mcable_list radius_cmp(const mprovider& p, region r, double v, comp_op op) {
@@ -459,7 +459,7 @@ mcable_list thingify_(const radius_lt_& r, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const radius_lt_& r) {
-    return o << "(radius_lt: " << r.reg << ", " << r.val << ")";
+    return o << "(radius_lt " << r.reg << " " << r.val << ")";
 }
 
 // Region with all segments with radius less than r
@@ -477,7 +477,7 @@ mcable_list thingify_(const radius_le_& r, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const radius_le_& r) {
-    return o << "(radius_le: " << r.reg << ", " << r.val << ")";
+    return o << "(radius_le " << r.reg << " " << r.val << ")";
 }
 
 // Region with all segments with radius greater than r
@@ -495,7 +495,7 @@ mcable_list thingify_(const radius_gt_& r, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const radius_gt_& r) {
-    return o << "(radius_gt: " << r.reg << ", " << r.val << ")";
+    return o << "(radius_gt " << r.reg << " " << r.val << ")";
 }
 
 // Region with all segments with radius greater than or equal to r
@@ -513,7 +513,7 @@ mcable_list thingify_(const radius_ge_& r, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const radius_ge_& r) {
-    return o << "(radius_ge: " << r.reg << ", " << r.val << ")";
+    return o << "(radius_ge " << r.reg << " " << r.val << ")";
 }
 
 mcable_list projection_cmp(const mprovider& p, double v, comp_op op) {
@@ -542,7 +542,7 @@ mcable_list thingify_(const projection_lt_& r, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const projection_lt_& r) {
-    return o << "(projection_lt: " << r.val << ")";
+    return o << "(projection_lt " << r.val << ")";
 }
 
 // Region with all segments with projection less than or equal to val
@@ -559,7 +559,7 @@ mcable_list thingify_(const projection_le_& r, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const projection_le_& r) {
-    return o << "(projection_le: " << r.val << ")";
+    return o << "(projection_le " << r.val << ")";
 }
 
 // Region with all segments with projection greater than val
@@ -576,7 +576,7 @@ mcable_list thingify_(const projection_gt_& r, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const projection_gt_& r) {
-    return o << "(projection_gt: " << r.val << ")";
+    return o << "(projection_gt " << r.val << ")";
 }
 
 // Region with all segments with projection greater than val
@@ -593,10 +593,10 @@ mcable_list thingify_(const projection_ge_& r, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const projection_ge_& r) {
-    return o << "(projection_ge: " << r.val << ")";
+    return o << "(projection_ge " << r.val << ")";
 }
 
-region z_dist_from_soma_lt(double r0) {
+region z_dist_from_root_lt(double r0) {
     if (r0 == 0) {
         return {};
     }
@@ -605,19 +605,19 @@ region z_dist_from_soma_lt(double r0) {
     return intersect(std::move(lt), std::move(gt));
 }
 
-region z_dist_from_soma_le(double r0) {
+region z_dist_from_root_le(double r0) {
     region le = reg::projection_le(r0);
     region ge = reg::projection_ge(-r0);
     return intersect(std::move(le), std::move(ge));
 }
 
-region z_dist_from_soma_gt(double r0) {
+region z_dist_from_root_gt(double r0) {
     region lt = reg::projection_lt(-r0);
     region gt = reg::projection_gt(r0);
     return region{join(std::move(lt), std::move(gt))};
 }
 
-region z_dist_from_soma_ge(double r0) {
+region z_dist_from_root_ge(double r0) {
     region lt = reg::projection_le(-r0);
     region gt = reg::projection_ge(r0);
     return region{join(std::move(lt), std::move(gt))};
diff --git a/python/morph_parse.cpp b/python/morph_parse.cpp
index bef6fef2..64288f0f 100644
--- a/python/morph_parse.cpp
+++ b/python/morph_parse.cpp
@@ -197,6 +197,14 @@ std::unordered_multimap<std::string, evaluator> eval_map {
                             "'radius_gt' with 2 arguments: (reg:region radius:real)")},
     {"radius_ge",make_call<arb::region, double>(arb::reg::radius_ge,
                             "'radius_ge' with 2 arguments: (reg:region radius:real)")},
+    {"z_dist_from_root_lt",make_call<double>(arb::reg::z_dist_from_root_lt,
+                            "'z_dist_from_root_lt' with 1 arguments: (distance:real)")},
+    {"z_dist_from_root_le",make_call<double>(arb::reg::z_dist_from_root_le,
+                            "'z_dist_from_root_le' with 1 arguments: (distance:real)")},
+    {"z_dist_from_root_gt",make_call<double>(arb::reg::z_dist_from_root_gt,
+                            "'z_dist_from_root_gt' with 1 arguments: (distance:real)")},
+    {"z_dist_from_root_ge",make_call<double>(arb::reg::z_dist_from_root_ge,
+                            "'z_dist_from_root_ge' with 1 arguments: (distance:real)")},
     {"join",    make_fold<arb::region>(static_cast<arb::region(*)(arb::region, arb::region)>(arb::join),
                             "'join' with at least 2 arguments: (region region [...region])")},
     {"intersect",make_fold<arb::region>(static_cast<arb::region(*)(arb::region, arb::region)>(arb::intersect),
diff --git a/test/unit/test_morph_expr.cpp b/test/unit/test_morph_expr.cpp
index 5a06a275..9f2d9449 100644
--- a/test/unit/test_morph_expr.cpp
+++ b/test/unit/test_morph_expr.cpp
@@ -854,29 +854,29 @@ TEST(region, thingify_complex_morphologies) {
         mprovider mp(morphology(sm, false));
 
         using reg::all;
-        using reg::z_dist_from_soma_lt;
-        using reg::z_dist_from_soma_le;
-        using reg::z_dist_from_soma_gt;
-        using reg::z_dist_from_soma_ge;
+        using reg::z_dist_from_root_lt;
+        using reg::z_dist_from_root_le;
+        using reg::z_dist_from_root_gt;
+        using reg::z_dist_from_root_ge;
         using reg::cable;
 
         // Test projection
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_lt(0), mp), (mcable_list{})));
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_ge(0), mp), thingify(all(), mp)));
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_lt(0), mp), (mcable_list{})));
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_ge(0), mp), thingify(all(), mp)));
 
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_le(100), mp), thingify(all(), mp)));
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_gt(100), mp), (mcable_list{})));
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_le(100), mp), thingify(all(), mp)));
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_gt(100), mp), (mcable_list{})));
 
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_le(90), mp), thingify(all(), mp)));
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_gt(90), mp), (mcable_list{})));
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_le(90), mp), thingify(all(), mp)));
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_gt(90), mp), (mcable_list{})));
 
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_lt(20), mp),
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_lt(20), mp),
                                 (mcable_list{{0,0,1},
                                              {1,0,0.578250901781922829},
                                              {2,0.61499300915417734997,0.8349970039232188642},
                                              {3,0,0.179407353580315756}
                                 })));
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_ge(20), mp),
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_ge(20), mp),
                                 (mcable_list{{0,1,1},
                                              {1,0.578250901781922829,1},
                                              {2,0,0.61499300915417734997},
@@ -885,9 +885,9 @@ TEST(region, thingify_complex_morphologies) {
                                              {4,0,1},
                                              {5,0,1}
                                 })));
-        EXPECT_TRUE(cablelist_eq(thingify(join(z_dist_from_soma_lt(20), z_dist_from_soma_ge(20)), mp), thingify(all(), mp)));
+        EXPECT_TRUE(cablelist_eq(thingify(join(z_dist_from_root_lt(20), z_dist_from_root_ge(20)), mp), thingify(all(), mp)));
 
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_le(50), mp),
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_le(50), mp),
                                 (mcable_list{{0,0,1},
                                              {1,0,1},
                                              {2,0,0.2962417607888518767},
@@ -897,12 +897,12 @@ TEST(region, thingify_complex_morphologies) {
                                              {4,0,0.0869615364994152821},
                                              {5,0,0.25}
                                 })));
-        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_soma_gt(50), mp),
+        EXPECT_TRUE(cablelist_eq(thingify(z_dist_from_root_gt(50), mp),
                                 (mcable_list{{2,0.2962417607888518767,0.4499900130773962142},
                                              {3,0.4485183839507893905,0.7691110303704736343},
                                              {4,0.0869615364994152821,1},
                                              {5,0.25,1}})));
 
-        EXPECT_TRUE(cablelist_eq(thingify(join(z_dist_from_soma_le(50), z_dist_from_soma_gt(50)), mp), thingify(all(), mp)));
+        EXPECT_TRUE(cablelist_eq(thingify(join(z_dist_from_root_le(50), z_dist_from_root_gt(50)), mp), thingify(all(), mp)));
     }
 }
-- 
GitLab