tests/testthat/test-neuron-io.R

context("neuron fileformats")

test_that("we can query fileformats",{
  expect_equal(fileformats(ext='swc',rval='names'), c('swc','swcng'))
  expect_equal(fileformats(ext='am', class='neuron', rval='names'),
               c('hxlineset','hxskel'))
  expect_is(fileformats(class='neuron',rval='info'),'data.frame')
  
  expect_is(fw<-getformatwriter(file='test.rds', class='neuron'),'list')
  expect_equal(fw$ext,'.rds')
  expect_equal(fw$read,readRDS)
  expect_equal(fw$write,saveRDS)
  
  expect_equal(getformatwriter(file='test.am', format='rds', class='neuron')$file,'test.am')
  
  expect_equal(getformatwriter(file='test.am', format='rds', ext='.rds', class='neuron')$file,'test.rds')
  expect_equal(getformatwriter(file='test', format='rds', ext='.rds', class='neuron')$file,'test.rds')
  
  expect_equal(getformatwriter(file='test.am', format='rds', ext=NA, class='neuron')$file,'test.am')
  expect_equal(getformatwriter(file='test.am', format='rds', ext=NULL, class='neuron')$file,'test.am')
  
  expect_equal(getformatwriter(file='test', format='rds', ext=NULL, class='neuron')$file,'test.rds')
  expect_equal(getformatwriter(file='test', format='rds', ext=NA, class='neuron')$file,'test')
  
  expect_equal(getformatwriter(file='test.am', ext='.rds', class='neuron')$ext,'.rds')
  
  expect_error(getformatwriter(file='test.rds', ext='.rhubarb', class='neuron'))
  
  expect_equal(fileformats(format='hxl', ext='_skel.am', class='neuron'),
               'hxlineset')
})

test_that("we can set new fileformats",{
  expect_error(registerformat('rhubarb'), 'provide.*read or write')
  # returns null on success
  expect_null(registerformat('rhubarb', class='crumble', read=read.table))
  expect_warning(registerformat('rhubarb', class='crumble', read=read.table),
                 'already been registered')
})
  
test_that("is.swc works", {
  expect_false(is.swc("testdata/neuron/EBT7R.am"))
  expect_false(is.swc("testdata/neuron/SequentiallyBranchingTrace.traces"))
  expect_true(is.swc("testdata/neuron/XT6L2.CNG.swc"))
  file.copy("testdata/neuron/XT6L2.CNG.swc", tf<-tempfile())
  on.exit(unlink(tf))
  expect_true(is.swc(tf))
  expect_is(read.neuron(tf), 'neuron')
})

context("neurons reading")

test_that("we can read single neurons in rda or rds format", {
  rda=tempfile(fileext='.rda')
  rds=tempfile(fileext='.rds')
  on.exit(unlink(c(rda,rds)))
  
  n=Cell07PNs[[1]]
  save(n,file=rda)
  saveRDS(n,file=rds)
  expect_equivalent(n,read.neuron(rda))
  expect_equivalent(n,read.neuron(rds))
  
  # check that we can read neurons in rda or rds format
  # even if they do not have an appropriate file extension
  file.copy(rds,tfrds<-tempfile())
  file.copy(rda,tfrda<-tempfile())
  on.exit(unlink(c(tfrda,tfrds)),add=TRUE)
  
  expect_equivalent(n,read.neuron(tfrds,format='rds'))
  expect_equivalent(n,read.neuron(tfrda,format='rda'))
  
  # check that a length 1 neuronlist works ok
  expect_equivalent(n,read.neurons(tfrds,format='rds')[[1]])
})

test_that("we can read single dotprops objects in rda or rds format", {
  rda=tempfile(fileext='.rda')
  rds=tempfile(fileext='.rds')
  on.exit(unlink(c(rda,rds)))
  
  n=kcs20[[1]]
  save(n,file=rda)
  saveRDS(n,file=rds)
  expect_equivalent(n,read.neuron(rda))
  expect_equivalent(n,read.neuron(rds))
  
  # check that we can read dotprops objects in rda or rds format
  # even if they do not have an appropriate file extension
  file.copy(rds,tfrds<-tempfile())
  file.copy(rda,tfrda<-tempfile())
  on.exit(unlink(c(tfrda,tfrds)),add=TRUE)
  expect_equivalent(n,read.neuron(tfrds,format='rds'))
  expect_equivalent(n,read.neuron(tfrda,format='rda'))
  
  expect_equivalent(n,read.neurons(tfrds,format='rds')[[1]])
})

test_that("we can read neurons in swc format", {
  swc='testdata/neuron/EBT7R.CNG.swc'
  expect_is(n<-read.neuron(swc),'neuron')
  expect_equal(n$NeuronName,'EBT7R.CNG')
})

test_that("we can read swc data into an ngraph object", {
  swc='testdata/neuron/EBT7R.CNG.swc'
  expect_is(ng<-read.neuron(swc, class='ngraph'),'ngraph')
  expect_equal(as.neuron(ng), read.neuron(swc))
})

test_that("we get an error when trying to read a non-neuron file", {
  nrrd="testdata/nrrd/LHMask.nrrd"
  expect_error(read.neuron(nrrd))
})

test_that("we can set the NeuronName field when reading a file", {
  swc='testdata/neuron/EBT7R.CNG.swc'
  n<-read.neuron(swc, NeuronName="rhubarb")
  expect_equal(n$NeuronName,'rhubarb')
  # check that we can use a user defined function to define the NeuronName
  nfun=function(x) sub("\\..*","",basename(x))
  n<-read.neuron(swc, NeuronName=nfun)
  expect_equal(n$NeuronName,'EBT7R')
})

test_that("we can read in neurons as a neuronlist",{
  expect_is(nl<-read.neurons(paths='testdata/neuron/',pattern='\\.CNG\\.swc$',
               neuronnames=function(x) sub("\\..*","",basename(x))),'neuronlist')
  expect_equal(length(nl),2)
  
  # check that InputFileName field is not mangled
  expect_true('InputFileName'%in%names(nl[[1]]))
  
  fieldsToIgnore=c("CreatedAt",'InputFileStat')
  n.read.neurons=nl[[1]]
  n.read.neurons[fieldsToIgnore]=NULL
  n.read.neuron=read.neuron(n.read.neurons$InputFileName)
  n.read.neuron[fieldsToIgnore]=NULL
  expect_equal(unclass(n.read.neuron),unclass(n.read.neurons), 
               info = 'check equality of neuron read by read.neuron & read.neurons')
  
  # check that problem files are named on error/warning
  expect_message(suppressWarnings(read.neurons('testdata/neuron/Neurites.am')),
                 regexp = 'While reading file.*Neurites\\.am')
})

test_that("we can read hxlineset format neurons",{
  
  ebt7=structure(list(NeuronName = "EBT7R", InputFileName = "testdata/neuron/EBT7R.am", 
      CreatedAt = structure(1391870899.00482, class = c("POSIXct", 
      "POSIXt")), NodeName = structure("mac1041-14.lmb.internal", .Names = "nodename"), 
      InputFileStat = structure(list(size = 9870, isdir = FALSE, 
          mode = structure(493L, class = "octmode"), mtime = structure(1391851874, class = c("POSIXct", 
          "POSIXt")), ctime = structure(1391851874, class = c("POSIXct", 
          "POSIXt")), atime = structure(1391851874, class = c("POSIXct", 
          "POSIXt")), uid = 501L, gid = 80L, uname = "jefferis", 
          grname = "admin"), .Names = c("size", "isdir", "mode", 
      "mtime", "ctime", "atime", "uid", "gid", "uname", "grname"
      ), row.names = "testdata/neuron/EBT7R.am", class = "data.frame"), 
      InputFileMD5 = structure("9e5016e8722314537bb4344ab2877f03", .Names = "testdata/neuron/EBT7R.am"), 
      NumPoints = 343L, StartPoint = 1L, BranchPoints = c(26L, 
      38L, 56L, 65L, 77L, 90L, 92L, 117L, 121L, 127L, 135L, 141L, 
      153L, 154L, 158L, 173L, 191L, 195L, 206L, 211L, 214L, 234L, 
      239L, 243L, 255L, 264L, 279L, 280L, 284L, 285L, 313L, 318L, 
      327L, 336L), EndPoints = c(1L, 37L, 49L, 64L, 76L, 86L, 104L, 
      120L, 133L, 138L, 148L, 162L, 166L, 169L, 175L, 188L, 197L, 
      202L, 216L, 223L, 232L, 238L, 254L, 257L, 268L, 276L, 282L, 
      295L, 300L, 307L, 316L, 320L, 322L, 334L, 337L, 343L), nTrees = 1, 
      NumSegs = 69L, SegList = structure(list(1:26, 26:37, c(26L, 
      38L), 38:49, c(38L, 50L, 51L, 52L, 53L, 54L, 55L, 56L), 56:64, 
          c(56L, 65L), 65:76, c(65L, 77L), 77:86, c(77L, 87L, 88L, 
          89L, 90L), 90:92, 92:104, c(92L, 105L, 106L, 107L, 108L, 
          109L, 110L, 111L, 112L, 113L, 114L, 115L, 116L, 117L), 
          117:120, c(117L, 121L), 121:127, 127:133, c(127L, 134L, 
          135L), 135:138, c(135L, 139L, 140L, 141L), 141:148, c(141L, 
          149L, 150L, 151L, 152L, 153L), 153:154, 154:158, 158:162, 
          c(158L, 163L, 164L, 165L, 166L), c(154L, 167L, 168L, 
          169L), c(153L, 170L, 171L, 172L, 173L), 173:175, c(173L, 
          176L, 177L, 178L, 179L, 180L, 181L, 182L, 183L, 184L, 
          185L, 186L, 187L, 188L), c(121L, 189L, 190L, 191L), 191:195, 
          195:197, c(195L, 198L, 199L, 200L, 201L, 202L), c(191L, 
          203L, 204L, 205L, 206L), 206:211, 211:214, 214:216, c(214L, 
          217L, 218L, 219L, 220L, 221L, 222L, 223L), c(211L, 224L, 
          225L, 226L, 227L, 228L, 229L, 230L, 231L, 232L), c(206L, 
          233L, 234L), 234:238, c(234L, 239L), 239:243, 243:254, 
          c(243L, 255L), 255:257, c(255L, 258L, 259L, 260L, 261L, 
          262L, 263L, 264L), 264:268, c(264L, 269L, 270L, 271L, 
          272L, 273L, 274L, 275L, 276L), c(239L, 277L, 278L, 279L
          ), 279:280, 280:282, c(280L, 283L, 284L), 284:285, 285:295, 
          c(285L, 296L, 297L, 298L, 299L, 300L), c(284L, 301L, 
          302L, 303L, 304L, 305L, 306L, 307L), c(279L, 308L, 309L, 
          310L, 311L, 312L, 313L), 313:316, c(313L, 317L, 318L), 
          318:320, c(318L, 321L, 322L), c(90L, 323L, 324L, 325L, 
          326L, 327L), 327:334, c(327L, 335L, 336L), 336:337, c(336L, 
          338L, 339L, 340L, 341L, 342L, 343L)), class = c("seglist", 
      "list")), d = structure(list(PointNo = 1:343, Label = c(2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), 
          X = c(12.75, 14.43, 15.84, 16.54, 17.53, 18.09, 18.65, 
          19.36, 19.5, 19.5, 19.22, 19.92, 20.76, 22.59, 24.28, 
          25.97, 28.36, 29.91, 32.72, 34.83, 37.36, 39.89, 42.28, 
          44.96, 46.93, 49.18, 51.99, 53.82, 55.23, 56.77, 58.04, 
          58.32, 58.32, 59.3, 61.84, 64.93, 66.2, 50.3, 49.46, 
          48.33, 47.49, 46.08, 45.66, 45.24, 45.94, 47.77, 48.61, 
          49.88, 50.02, 52.69, 54.38, 56.91, 59.45, 61.27, 62.54, 
          64.93, 65.49, 65.49, 65.78, 66.62, 65.92, 64.79, 63.67, 
          63.1, 66.06, 67.04, 69.85, 72.67, 76.89, 79.7, 82.37, 
          84.48, 86.59, 88.14, 89.41, 90.81, 69.43, 70.14, 71.12, 
          70.7, 69.43, 68.17, 67.32, 66.9, 67.18, 68.03, 70.98, 
          73.51, 75.62, 76.61, 79.28, 80.12, 79.42, 79.28, 79.98, 
          80.54, 81.25, 83.22, 84.62, 86.17, 90.11, 92.64, 94.05, 
          96.02, 81.67, 83.78, 86.03, 87.44, 89.69, 93.48, 97.56, 
          99.67, 102.21, 104.6, 106.28, 107.97, 108.96, 107.69, 
          106.28, 105.86, 110.93, 112.76, 114.02, 115.85, 117.82, 
          119.37, 120.63, 119.93, 118.94, 118.94, 118.1, 116.27, 
          115.01, 122.46, 123.87, 123.16, 122.46, 121.9, 125.84, 
          127.67, 128.93, 128.23, 127.95, 127.67, 126.96, 126.82, 
          126.12, 125.56, 130.76, 132.87, 134.56, 137.23, 138.64, 
          139.62, 141.31, 143.98, 145.39, 147.08, 148.34, 149.05, 
          149.47, 149.19, 148.34, 149.61, 150.73, 151.16, 140.47, 
          141.31, 141.87, 139.34, 142.15, 144.12, 145.25, 145.67, 
          145.67, 146.51, 147.92, 149.19, 150.73, 152, 153.12, 
          152.56, 151.58, 150.17, 149.47, 148.34, 147.5, 146.23, 
          112.33, 114.16, 115.01, 114.44, 112.05, 110.79, 110.08, 
          110.36, 110.5, 110.22, 109.52, 108.54, 107.69, 106.57, 
          115.85, 116.98, 118.24, 118.52, 117.26, 116.41, 115.15, 
          113.88, 113.18, 112.47, 111.07, 110.22, 111.35, 111.35, 
          109.66, 108.82, 107.55, 106.85, 105.44, 103.89, 103.33, 
          115.57, 116.27, 117.96, 119.93, 121.9, 124.01, 125.41, 
          127.95, 128.37, 119.65, 120.35, 119.79, 120.63, 121.62, 
          121.76, 121.48, 123.59, 125.27, 126.4, 127.1, 125.98, 
          125.84, 124.57, 124.15, 124.43, 125.13, 126.26, 127.24, 
          128.09, 130.76, 132.17, 128.09, 127.95, 127.38, 130.48, 
          132.31, 133.29, 135.96, 137.09, 138.92, 138.92, 137.51, 
          136.39, 136.1, 136.1, 140.04, 140.47, 141.59, 142.15, 
          142.72, 143.42, 144.4, 144.54, 122.32, 123.87, 124.57, 
          124.99, 124.57, 123.73, 126.12, 127.38, 127.95, 129.21, 
          130.48, 132.45, 133.43, 134.84, 136.81, 138.21, 139.06, 
          139.9, 140.47, 129.21, 130.9, 132.31, 133.99, 135.12, 
          126.82, 126.4, 124.99, 123.73, 122.74, 123.3, 123.59, 
          126.4, 129.35, 131.46, 132.73, 134.7, 137.51, 138.78, 
          139.48, 139.2, 139.48, 140.04, 140.47, 140.61, 141.45, 
          142.01, 77.45, 79.14, 80.83, 82.51, 83.22, 82.79, 82.37, 
          82.23, 84.34, 86.59, 88.7, 89.55, 84.62, 85.75, 85.75, 
          87.86, 90.25, 92.5, 94.47, 97.28, 98.41), Y = c(-121.51, 
          -119.4, -117.57, -115.89, -114.62, -113.21, -111.24, 
          -109.27, -107.31, -105.76, -103.93, -101.96, -99.57, 
          -97.46, -96.19, -94.79, -93.8, -92.68, -91.27, -90, -89.44, 
          -89.02, -88.74, -88.74, -88.88, -89.02, -90.57, -92.54, 
          -93.52, -95.07, -96.76, -99.01, -100.41, -102.38, -104.49, 
          -106.74, -107.31, -88.46, -86.63, -85.08, -83.67, -82.27, 
          -81, -79.17, -77.06, -76.92, -77.35, -78.89, -79.45, 
          -87.75, -86.91, -86.91, -88.32, -88.04, -87.33, -86.35, 
          -84.8, -83.82, -83.25, -82.55, -81.99, -81.56, -81.56, 
          -81.71, -86.21, -87.89, -91.13, -93.52, -95.21, -96.76, 
          -97.74, -100.41, -102.38, -103.79, -104.21, -104.63, 
          -85.08, -87.19, -87.61, -88.6, -89.72, -91.69, -94.08, 
          -97.32, -100.84, -102.1, -84.66, -83.67, -83.39, -83.11, 
          -82.13, -81.56, -80.16, -79.03, -78.05, -76.64, -76.08, 
          -75.24, -74.67, -75.09, -76.5, -77.35, -78.19, -80.72, 
          -80.72, -79.74, -79.6, -79.45, -79.45, -79.17, -79.03, 
          -78.89, -78.75, -78.75, -78.33, -78.05, -77.63, -76.92, 
          -76.22, -75.38, -77.63, -78.61, -79.45, -80.86, -81.56, 
          -82.41, -83.39, -82.41, -81.71, -81.14, -80.58, -79.88, 
          -79.31, -84.1, -84.8, -86.07, -86.49, -86.91, -85.36, 
          -86.21, -87.47, -87.33, -86.21, -84.8, -82.69, -80.58, 
          -78.33, -76.08, -86.91, -87.19, -88.46, -90, -90.71, 
          -90.15, -88.74, -87.61, -86.63, -85.78, -87.05, -89.02, 
          -91.13, -92.25, -84.24, -83.11, -82.69, -82.41, -89.72, 
          -89.58, -89.86, -92.25, -93.66, -93.94, -93.38, -94.08, 
          -95.07, -92.11, -91.41, -89.44, -87.75, -85.93, -84.24, 
          -82.27, -80.02, -77.06, -74.81, -72.98, -71.72, -69.89, 
          -76.08, -74.81, -74.11, -74.25, -74.95, -74.67, -74.81, 
          -73.41, -72.56, -75.8, -76.36, -76.5, -75.52, -74.95, 
          -72.84, -71.16, -68.34, -67.92, -67.78, -67.78, -67.5, 
          -67.64, -67.64, -67.5, -67.08, -66.51, -66.09, -65.25, 
          -67.22, -67.5, -67.22, -67.22, -67.64, -67.78, -67.78, 
          -67.64, -67.5, -67.64, -68.62, -69.19, -69.33, -68.76, 
          -68.76, -68.76, -67.22, -66.37, -65.81, -65.11, -64.69, 
          -64.69, -65.53, -66.09, -66.09, -66.65, -66.65, -69.05, 
          -70.17, -71.86, -73.13, -76.22, -77.35, -79.74, -81.56, 
          -82.97, -84.8, -85.36, -66.37, -65.25, -64.26, -66.37, 
          -66.23, -66.94, -67.78, -69.61, -71.44, -73.13, -73.97, 
          -75.24, -76.22, -76.64, -74.11, -75.8, -78.33, -80.58, 
          -82.41, -83.96, -85.22, -86.07, -63.84, -62.72, -62.58, 
          -61.59, -60.33, -59.76, -60.47, -59.34, -59.76, -61.17, 
          -60.89, -60.33, -59.9, -59.76, -60.18, -60.33, -61.03, 
          -62.01, -62.01, -58.78, -58.22, -58.64, -58.92, -59.48, 
          -58.64, -58.64, -58.78, -59.48, -60.04, -61.17, -61.31, 
          -62.72, -62.01, -61.31, -60.75, -60.47, -61.73, -62.86, 
          -63.84, -63.7, -62.15, -62.29, -62.29, -62.15, -62.86, 
          -63.28, -83.67, -84.1, -84.66, -85.64, -86.21, -87.47, 
          -88.32, -91.41, -93.52, -95.07, -95.07, -95.35, -86.35, 
          -86.49, -87.19, -86.49, -86.49, -87.75, -89.58, -90.29, 
          -90.85), Z = c(0, -2, -4, -6, -9, -12, -15, -18, -20, 
          -23, -27, -30, -33, -36, -37, -38, -39, -42, -44, -45, 
          -47, -48, -50, -51, -52, -55, -56, -57, -60, -59, -61, 
          -61, -61, -61, -61, -60, -60, -56, -57, -58, -59, -60, 
          -62, -63, -63, -66, -67, -67, -67, -56, -57, -57, -57, 
          -57, -56, -58, -59, -61, -63, -68, -70, -71, -69, -71, 
          -58, -58, -58, -60, -61, -61, -62, -62, -62, -64, -67, 
          -66, -59, -59, -62, -66, -68, -69, -69, -69, -71, -71, 
          -60, -60, -59, -59, -59, -59, -59, -60, -61, -62, -64, 
          -65, -66, -67, -67, -68, -70, -69, -59, -58, -57, -57, 
          -56, -54, -52, -51, -50, -49, -48, -47, -47, -47, -46, 
          -44, -47, -45, -44, -43, -42, -41, -40, -35, -34, -32, 
          -31, -30, -28, -38, -36, -33, -32, -31, -34, -32, -29, 
          -27, -26, -25, -23, -22, -21, -20, -29, -29, -29, -28, 
          -26, -26, -26, -26, -26, -27, -28, -31, -32, -35, -27, 
          -27, -27, -26, -23, -21, -18, -27, -26, -26, -25, -24, 
          -22, -25, -26, -27, -27, -27, -27, -26, -25, -24, -23, 
          -22, -21, -22, -46, -45, -41, -37, -36, -34, -34, -34, 
          -34, -33, -32, -29, -27, -26, -43, -41, -41, -41, -39, 
          -38, -36, -35, -35, -34, -33, -33, -32, -30, -32, -31, 
          -30, -30, -30, -29, -29, -32, -31, -29, -28, -26, -25, 
          -24, -25, -25, -42, -43, -41, -39, -38, -37, -43, -45, 
          -46, -47, -47, -48, -48, -50, -50, -51, -51, -51, -52, 
          -53, -54, -53, -49, -48, -47, -48, -48, -48, -49, -50, 
          -51, -51, -52, -53, -55, -54, -53, -52, -52, -51, -51, 
          -50, -49, -49, -44, -43, -42, -40, -40, -44, -38, -35, 
          -32, -31, -28, -25, -24, -24, -24, -25, -24, -24, -24, 
          -32, -31, -29, -28, -27, -34, -34, -33, -32, -31, -29, 
          -27, -40, -40, -40, -40, -40, -40, -41, -43, -47, -39, 
          -38, -35, -32, -39, -39, -62, -63, -65, -66, -67, -67, 
          -67, -68, -68, -70, -71, -70, -67, -68, -71, -70, -71, 
          -71, -70, -70, -69), W = c(1.27, 1.27, 1.27, 1.27, 1.27, 
          1.27, 1.27, 1.27, 1.27, 1.27, 1.27, 1.27, 1.27, 1.27, 
          1.27, 1.27, 1.27, 1.27, 1.27, 1.27, 1.27, 1.27, 1.27, 
          1.27, 1.27, 1.27, 0.42, 0.42, 0.42, 0.42, 0.42, 0.42, 
          0.42, 0.42, 0.42, 0.42, 0.7, 1.13, 0.42, 0.42, 0.42, 
          0.42, 0.42, 0.42, 0.42, 0.42, 0.42, 0.42, 0.42, 0.84, 
          0.84, 0.84, 0.84, 0.84, 0.84, 0.84, 0.42, 0.42, 0.7, 
          0.7, 0.7, 0.7, 0.7, 0.7, 0.98, 0.14, 0.14, 0.14, 0.14, 
          0.14, 0.14, 0.14, 0.14, 0.14, 0.98, 0.98, 0.98, 0.42, 
          0.42, 0.42, 0.42, 0.42, 0.42, 0.42, 0.42, 0.84, 0.98, 
          0.98, 0.98, 0.98, 0.98, 0.98, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.42, 0.42, 0.42, 0.42, 0.42, 0.7, 0.7, 0.7, 
          0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 
          0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 
          0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 
          0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 
          0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.7, 0.7, 0.7, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.7, 0.7, 0.7, 
          0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 0.56, 
          0.56, 0.56, 0.56, 0.56, 0.56, 0.7, 0.56, 0.56, 0.56, 
          0.56, 0.42, 0.42, 0.42, 0.42, 0.42, 0.42, 1.41, 0.7, 
          0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7), Parent = c(-1L, 
          1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
          14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 
          25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 
          36L, 26L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 
          47L, 48L, 38L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 
          58L, 59L, 60L, 61L, 62L, 63L, 56L, 65L, 66L, 67L, 68L, 
          69L, 70L, 71L, 72L, 73L, 74L, 75L, 65L, 77L, 78L, 79L, 
          80L, 81L, 82L, 83L, 84L, 85L, 77L, 87L, 88L, 89L, 90L, 
          91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L, 101L, 
          102L, 103L, 92L, 105L, 106L, 107L, 108L, 109L, 110L, 
          111L, 112L, 113L, 114L, 115L, 116L, 117L, 118L, 119L, 
          117L, 121L, 122L, 123L, 124L, 125L, 126L, 127L, 128L, 
          129L, 130L, 131L, 132L, 127L, 134L, 135L, 136L, 137L, 
          135L, 139L, 140L, 141L, 142L, 143L, 144L, 145L, 146L, 
          147L, 141L, 149L, 150L, 151L, 152L, 153L, 154L, 155L, 
          156L, 157L, 158L, 159L, 160L, 161L, 158L, 163L, 164L, 
          165L, 154L, 167L, 168L, 153L, 170L, 171L, 172L, 173L, 
          174L, 173L, 176L, 177L, 178L, 179L, 180L, 181L, 182L, 
          183L, 184L, 185L, 186L, 187L, 121L, 189L, 190L, 191L, 
          192L, 193L, 194L, 195L, 196L, 195L, 198L, 199L, 200L, 
          201L, 191L, 203L, 204L, 205L, 206L, 207L, 208L, 209L, 
          210L, 211L, 212L, 213L, 214L, 215L, 214L, 217L, 218L, 
          219L, 220L, 221L, 222L, 211L, 224L, 225L, 226L, 227L, 
          228L, 229L, 230L, 231L, 206L, 233L, 234L, 235L, 236L, 
          237L, 234L, 239L, 240L, 241L, 242L, 243L, 244L, 245L, 
          246L, 247L, 248L, 249L, 250L, 251L, 252L, 253L, 243L, 
          255L, 256L, 255L, 258L, 259L, 260L, 261L, 262L, 263L, 
          264L, 265L, 266L, 267L, 264L, 269L, 270L, 271L, 272L, 
          273L, 274L, 275L, 239L, 277L, 278L, 279L, 280L, 281L, 
          280L, 283L, 284L, 285L, 286L, 287L, 288L, 289L, 290L, 
          291L, 292L, 293L, 294L, 285L, 296L, 297L, 298L, 299L, 
          284L, 301L, 302L, 303L, 304L, 305L, 306L, 279L, 308L, 
          309L, 310L, 311L, 312L, 313L, 314L, 315L, 313L, 317L, 
          318L, 319L, 318L, 321L, 90L, 323L, 324L, 325L, 326L, 
          327L, 328L, 329L, 330L, 331L, 332L, 333L, 327L, 335L, 
          336L, 336L, 338L, 339L, 340L, 341L, 342L)), .Names = c("PointNo", 
      "Label", "X", "Y", "Z", "W", "Parent"), class = "data.frame", row.names = c(NA, 
      343L))), .Names = c("NeuronName", "InputFileName", "CreatedAt", 
  "NodeName", "InputFileStat", "InputFileMD5", "NumPoints", "StartPoint", 
  "BranchPoints", "EndPoints", "nTrees", "NumSegs", "SegList", 
  "d"), class = c("neuron", "list"))
  
  expect_equal(read.neuron('testdata/neuron/EBT7R.am'), ebt7)
})

test_that("we can read hxskel format neurons",{
  
  Neurites=structure(list(NeuronName = "Neurites", InputFileName = "testdata/neuron/Neurites.am", 
      CreatedAt = structure(1391883985.19409, class = c("POSIXct", 
      "POSIXt")), NodeName = structure("mac1041-14.lmb.internal", .Names = "nodename"), 
      InputFileStat = structure(list(size = 16617, isdir = FALSE, 
          mode = structure(420L, class = "octmode"), mtime = structure(1391851874, class = c("POSIXct", 
          "POSIXt")), ctime = structure(1391851874, class = c("POSIXct", 
          "POSIXt")), atime = structure(1391851874, class = c("POSIXct", 
          "POSIXt")), uid = 501L, gid = 80L, uname = "jefferis", 
          grname = "admin"), .Names = c("size", "isdir", "mode", 
      "mtime", "ctime", "atime", "uid", "gid", "uname", "grname"
      ), row.names = "testdata/neuron/Neurites.am", class = "data.frame"), 
      InputFileMD5 = structure("11c837b13f2f0814fffaf94a58912e16", .Names = "testdata/neuron/Neurites.am"), 
      NumPoints = 291L, StartPoint = 1L, BranchPoints = c(98L, 
      256L, 272L), EndPoints = c(1L, 54L, 202L, 257L, 274L), nTrees = 1, 
      NumSegs = 7L, SegList = structure(list(c(1L, 3L, 4L, 5L, 
      6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 
      19L, 20L, 21L, 22L, 2L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 
      31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 
      43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 23L, 
      55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 
      67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 
      79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 
      91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L), c(98L, 54L), c(98L, 
      100L, 101L, 102L, 103L, 104L, 105L, 106L, 107L, 108L, 109L, 
      110L, 111L, 112L, 113L, 114L, 115L, 116L, 117L, 118L, 119L, 
      120L, 121L, 122L, 123L, 124L, 125L, 126L, 127L, 128L, 129L, 
      130L, 131L, 132L, 133L, 134L, 135L, 136L, 137L, 138L, 139L, 
      140L, 141L, 142L, 143L, 144L, 145L, 146L, 147L, 99L, 149L, 
      150L, 151L, 152L, 153L, 154L, 155L, 156L, 157L, 158L, 159L, 
      160L, 161L, 162L, 163L, 164L, 165L, 166L, 167L, 168L, 169L, 
      170L, 171L, 172L, 173L, 174L, 175L, 176L, 177L, 178L, 179L, 
      180L, 181L, 182L, 183L, 184L, 185L, 186L, 187L, 188L, 189L, 
      190L, 191L, 192L, 193L, 194L, 195L, 196L, 197L, 198L, 199L, 
      200L, 201L, 148L, 203L, 204L, 205L, 206L, 207L, 208L, 209L, 
      210L, 211L, 212L, 213L, 214L, 215L, 216L, 217L, 218L, 219L, 
      220L, 221L, 222L, 223L, 224L, 225L, 226L, 227L, 228L, 229L, 
      230L, 231L, 232L, 233L, 234L, 235L, 236L, 237L, 238L, 239L, 
      240L, 241L, 242L, 243L, 244L, 245L, 246L, 247L, 248L, 249L, 
      250L, 251L, 252L, 253L, 254L, 255L, 256L), c(256L, 202L), 
          c(256L, 258L, 259L, 260L, 261L, 262L, 263L, 264L, 265L, 
          266L, 267L, 268L, 269L, 270L, 271L, 272L), c(272L, 273L, 
          257L), c(272L, 275L, 276L, 277L, 278L, 279L, 280L, 281L, 
          282L, 283L, 284L, 285L, 286L, 287L, 288L, 289L, 290L, 
          291L, 274L)), class = c("seglist", "list")), d = structure(list(
          PointNo = 1:291, Label = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
          2L, 2L, 2L, 2L), X = c(374.888, 367.069, 374.368, 373.722, 
          373.54, 373.06, 372.566, 372.127, 371.78, 371.355, 371.035, 
          370.838, 370.688, 370.279, 370.065, 369.657, 369.463, 
          369.148, 368.773, 368.404, 367.915, 367.46, 353.928, 
          366.653, 366.212, 365.852, 365.353, 364.904, 364.445, 
          363.922, 363.397, 362.923, 362.431, 361.949, 361.538, 
          361.045, 360.716, 360.307, 359.857, 359.463, 359.048, 
          358.636, 358.247, 357.909, 357.534, 357.09, 356.569, 
          356.077, 355.622, 355.213, 354.876, 354.556, 354.252, 
          333.369, 353.573, 353.202, 352.765, 352.335, 351.875, 
          351.421, 350.954, 350.503, 350.076, 349.699, 349.23, 
          348.823, 348.355, 347.894, 347.434, 346.964, 346.519, 
          346.088, 345.621, 345.191, 344.733, 344.313, 343.89, 
          343.439, 342.975, 342.531, 342.051, 341.585, 341.088, 
          340.637, 340.216, 339.763, 339.265, 338.77, 338.271, 
          337.779, 337.29, 336.787, 336.276, 335.77, 335.291, 334.826, 
          334.337, 333.855, 314.925, 333.431, 332.992, 332.523, 
          332.064, 331.566, 331.112, 330.672, 330.289, 329.891, 
          329.427, 328.943, 328.547, 328.139, 327.73, 327.263, 
          326.831, 326.391, 325.979, 325.62, 325.355, 324.995, 
          324.667, 324.359, 324.053, 323.735, 323.446, 323.087, 
          322.742, 322.442, 322.189, 321.906, 321.57, 321.237, 
          320.855, 320.465, 320.063, 319.7, 319.292, 318.879, 318.48, 
          318.082, 317.704, 317.319, 316.905, 316.475, 316.045, 
          315.621, 315.262, 293.393, 314.521, 314.097, 313.667, 
          313.274, 312.86, 312.426, 311.999, 311.585, 311.14, 310.716, 
          310.291, 309.868, 309.473, 309.108, 308.732, 308.352, 
          307.986, 307.601, 307.212, 306.839, 306.433, 306.074, 
          305.695, 305.344, 305.029, 304.767, 304.485, 304.322, 
          303.999, 303.742, 303.387, 303.024, 302.64, 302.239, 
          301.846, 301.347, 300.981, 300.541, 300.122, 299.689, 
          299.236, 298.752, 298.364, 297.906, 297.534, 297.064, 
          296.574, 296.167, 295.678, 295.294, 294.802, 294.327, 
          293.862, 275.121, 292.979, 292.551, 292.082, 291.67, 
          291.281, 290.922, 290.559, 290.221, 289.845, 289.478, 
          289.128, 288.804, 288.504, 288.205, 287.898, 287.608, 
          287.347, 287.088, 286.884, 286.679, 286.425, 286.247, 
          286.058, 285.855, 285.57, 285.272, 284.972, 284.721, 
          284.576, 284.46, 284.221, 283.92, 283.517, 283.187, 282.757, 
          282.293, 281.837, 281.371, 280.97, 280.587, 280.223, 
          279.848, 279.444, 279.015, 278.557, 278.093, 277.641, 
          277.164, 276.729, 276.318, 275.959, 275.645, 275.467, 
          275.273, 268.316, 274.985, 274.684, 274.324, 273.95, 
          273.466, 273.011, 272.56, 272.122, 271.703, 271.273, 
          270.948, 270.647, 270.339, 269.921, 269.4, 268.847, 269.844, 
          269.25, 269.297, 269.457, 269.693, 269.842, 269.914, 
          269.975, 269.998, 270.004, 270.004, 270.016, 270.076, 
          270.148, 270.164, 270.134, 270.053, 269.952), Y = c(127.498, 
          134.529, 127.91, 128.142, 128.732, 129.072, 129.291, 
          129.574, 129.973, 130.268, 130.671, 131.121, 131.576, 
          131.884, 132.313, 132.596, 133.006, 133.344, 133.633, 
          133.918, 134.038, 134.25, 141.004, 134.77, 134.832, 135.048, 
          135.129, 135.284, 135.427, 135.327, 135.326, 135.565, 
          135.806, 136.055, 136.402, 136.576, 136.97, 137.27, 137.475, 
          137.761, 137.995, 138.223, 138.474, 138.76, 139.007, 
          139.161, 139.258, 139.454, 139.667, 139.9, 140.188, 140.466, 
          140.748, 144.76, 141.07, 141.079, 141.028, 141.074, 141.077, 
          141.207, 141.391, 141.627, 141.889, 142.213, 142.355, 
          142.632, 142.791, 142.98, 143.181, 143.362, 143.584, 
          143.825, 143.991, 144.222, 144.314, 144.336, 144.445, 
          144.598, 144.775, 144.973, 145.076, 145.205, 145.151, 
          145.128, 145.099, 145.166, 145.118, 145.114, 145.121, 
          145.163, 145.167, 145.122, 145.106, 145.117, 144.984, 
          144.832, 144.796, 144.78, 132.196, 144.586, 144.405, 
          144.287, 144.112, 144.067, 143.929, 143.814, 143.593, 
          143.394, 143.345, 143.285, 143.041, 142.826, 142.584, 
          142.413, 142.206, 142.019, 141.737, 141.398, 140.983, 
          140.651, 140.291, 139.924, 139.559, 139.195, 138.793, 
          138.459, 138.112, 137.718, 137.289, 136.889, 136.541, 
          136.192, 135.892, 135.592, 135.299, 134.955, 134.669, 
          134.383, 134.109, 133.858, 133.599, 133.35, 133.113, 
          132.926, 132.761, 132.623, 132.417, 118.666, 132.05, 
          131.875, 131.696, 131.497, 131.345, 131.181, 131.079, 
          130.955, 130.861, 130.727, 130.591, 130.372, 130.103, 
          129.799, 129.519, 129.29, 129.051, 128.823, 128.543, 
          128.244, 128.004, 127.744, 127.441, 127.107, 126.75, 
          126.371, 126.005, 125.563, 125.197, 124.767, 124.393, 
          124.028, 123.677, 123.327, 122.961, 122.78, 122.412, 
          122.141, 121.865, 121.648, 121.473, 121.329, 121.03, 
          120.839, 120.505, 120.305, 120.158, 119.851, 119.705, 
          119.382, 119.272, 119.094, 118.883, 104.161, 118.403, 
          118.16, 118.009, 117.756, 117.471, 117.145, 116.817, 
          116.469, 116.167, 115.855, 115.531, 115.195, 114.832, 
          114.473, 114.196, 113.976, 113.711, 113.451, 113.188, 
          112.888, 112.588, 112.217, 111.876, 111.55, 111.339, 
          111.122, 110.939, 110.842, 110.675, 110.421, 110.144, 
          109.787, 109.507, 109.183, 109.025, 108.881, 108.722, 
          108.559, 108.269, 107.953, 107.623, 107.325, 107.117, 
          107.037, 106.931, 106.762, 106.549, 106.4, 106.154, 105.875, 
          105.555, 105.238, 104.867, 104.524, 102.149, 104.142, 
          103.75, 103.42, 103.083, 102.868, 102.637, 102.515, 102.415, 
          102.263, 102.174, 102.22, 102.307, 102.279, 102.152, 
          102.093, 102.156, 107.951, 102.476, 102.893, 103.305, 
          103.706, 104.127, 104.53, 104.874, 105.156, 105.423, 
          105.705, 105.992, 106.278, 106.555, 106.817, 107.076, 
          107.351, 107.644), Z = c(61.9981, 64.3031, 62.0689, 62.0696, 
          62.2841, 62.2736, 62.1473, 62.0312, 62.0649, 62.0972, 
          62.1912, 62.3661, 62.5525, 62.6129, 62.823, 62.9742, 
          63.2231, 63.461, 63.6682, 63.8911, 64.0093, 64.1344, 
          66.7161, 64.4829, 64.7311, 65.0288, 65.1708, 65.3869, 
          65.6093, 65.6313, 65.5564, 65.5039, 65.5628, 65.5888, 
          65.6379, 65.5624, 65.5866, 65.5547, 65.4929, 65.5247, 
          65.5698, 65.6666, 65.8168, 66.0407, 66.2888, 66.5425, 
          66.6698, 66.7291, 66.7337, 66.7142, 66.7145, 66.7104, 
          66.7198, 65.0324, 67.0547, 67.3831, 67.6107, 67.8564, 
          68.06, 68.2439, 68.3291, 68.3076, 68.2468, 68.2, 68.1154, 
          68.0588, 68.0102, 67.9724, 68.0149, 67.9788, 67.8952, 
          67.7923, 67.724, 67.6134, 67.4358, 67.1662, 66.9274, 
          66.7869, 66.7589, 66.6408, 66.5193, 66.3527, 66.2505, 
          66.0244, 65.7299, 65.4971, 65.3895, 65.2693, 65.1819, 
          65.0667, 64.923, 64.8429, 64.8306, 64.8293, 64.898, 64.9695, 
          65.0019, 65.0381, 58.3124, 64.8468, 64.6799, 64.5215, 
          64.3933, 64.3027, 64.1217, 63.9013, 63.6562, 63.4155, 
          63.2212, 63.095, 62.9015, 62.704, 62.5429, 62.467, 62.3134, 
          62.1545, 62.0728, 61.9662, 61.8454, 61.7214, 61.589, 
          61.4366, 61.2806, 61.1532, 61.087, 60.9767, 60.8783, 
          60.8144, 60.8091, 60.7345, 60.6313, 60.5315, 60.4507, 
          60.4005, 60.3706, 60.3386, 60.2805, 60.2323, 60.0883, 
          59.9093, 59.7103, 59.524, 59.4076, 59.2722, 59.0982, 
          58.881, 58.6044, 53.0065, 58.0661, 57.8822, 57.7212, 
          57.5049, 57.2925, 57.1396, 56.9202, 56.6813, 56.4743, 
          56.2354, 55.991, 55.8031, 55.6306, 55.4725, 55.3218, 
          55.1169, 54.8904, 54.6747, 54.5429, 54.4207, 54.2754, 
          54.0578, 53.9671, 53.8641, 53.7235, 53.5268, 53.3172, 
          53.1101, 52.9368, 52.7875, 52.6906, 52.5853, 52.4909, 
          52.4995, 52.5359, 52.5537, 52.5622, 52.6043, 52.728, 
          52.881, 53.0148, 53.0332, 52.8953, 52.7735, 52.6787, 
          52.6789, 52.644, 52.6706, 52.6549, 52.7715, 52.8828, 
          52.9455, 52.9852, 44.6427, 52.9415, 52.8796, 52.816, 
          52.706, 52.5988, 52.5053, 52.4356, 52.3407, 52.2378, 
          52.1263, 51.9953, 51.8267, 51.6621, 51.4764, 51.1894, 
          50.8444, 50.5126, 50.18, 49.8177, 49.4918, 49.2072, 48.95, 
          48.6568, 48.3524, 48.0093, 47.6759, 47.3171, 46.8885, 
          46.4296, 45.996, 45.6238, 45.3828, 45.1923, 44.9475, 
          44.7043, 44.549, 44.4061, 44.3211, 44.2644, 44.2683, 
          44.2176, 44.0996, 43.9066, 43.6726, 43.5092, 43.4422, 
          43.4181, 43.3891, 43.3677, 43.4146, 43.5467, 43.7659, 
          44.042, 44.342, 40.2316, 44.1425, 43.9771, 43.7827, 43.6176, 
          43.5734, 43.4302, 43.1812, 42.8989, 42.608, 42.3042, 
          41.8753, 41.4239, 40.9543, 40.5827, 40.3432, 40.3135, 
          33.7535, 40.0501, 39.7702, 39.528, 39.3275, 39.0805, 
          38.7714, 38.3951, 37.9694, 37.5357, 37.1134, 36.6941, 
          36.2787, 35.8591, 35.4238, 34.985, 34.5605, 34.1519), 
          W = c(1.3882, 2.7819, 1.5615, 1.5824, 1.8039, 1.9936, 
          2.2251, 2.5169, 2.6649, 2.6124, 2.4982, 2.3369, 2.1493, 
          2.1147, 2.0964, 2.1652, 2.1859, 2.2724, 2.4049, 2.4828, 
          2.5644, 2.6883, 4.0784, 2.7723, 2.7734, 2.7565, 2.6667, 
          2.4426, 2.3305, 2.1823, 1.9618, 1.9482, 1.7556, 1.6962, 
          1.7556, 1.6805, 1.7182, 1.6916, 1.6257, 1.6843, 1.7985, 
          1.9919, 2.2562, 2.6641, 3.1971, 3.6209, 3.9178, 4.2101, 
          4.428, 4.5577, 4.5461, 4.4357, 4.2392, 4.5268, 3.8395, 
          3.8834, 4.072, 4.1348, 4.1366, 4.0006, 3.8899, 3.8102, 
          3.7388, 3.7013, 3.6252, 3.5688, 3.4873, 3.4683, 3.5046, 
          3.6658, 3.9193, 4.13, 4.2278, 4.1145, 4.0719, 4.1144, 
          4.2006, 4.2801, 4.2713, 4.1837, 4.0027, 3.8537, 3.7887, 
          3.7537, 3.8005, 3.8964, 4.3029, 4.5979, 4.7156, 4.5342, 
          4.4095, 4.3308, 4.3359, 4.3579, 4.3955, 4.4551, 4.5105, 
          4.52, 5.5757, 4.3702, 4.1605, 4.0272, 3.8673, 3.8175, 
          3.759, 3.6974, 3.6828, 3.695, 3.6597, 3.6224, 3.6337, 
          3.7271, 3.8679, 4.1209, 4.4256, 4.6062, 4.7647, 4.6636, 
          4.5291, 4.2886, 4.23, 4.2487, 4.33, 4.4368, 4.8105, 4.984, 
          5.1266, 5.2741, 5.5003, 5.6065, 5.6154, 5.6269, 5.5736, 
          5.557, 5.5537, 5.6078, 5.6999, 5.8844, 5.9727, 5.9657, 
          5.9697, 5.9663, 5.9181, 5.8303, 5.7631, 5.596, 5.5707, 
          3.6889, 5.5117, 5.423, 5.337, 5.4996, 5.584, 5.7197, 
          5.6598, 5.8183, 5.9847, 6.2232, 6.43, 6.6574, 6.6474, 
          6.3972, 6.0178, 5.6352, 5.3175, 5.102, 5.0389, 4.9197, 
          4.7698, 4.5178, 4.4641, 4.4854, 4.5123, 4.5296, 4.5329, 
          4.4523, 4.3745, 4.3218, 4.1692, 4.0811, 3.9654, 3.9957, 
          4.0861, 4.1231, 4.1128, 4.0458, 3.9995, 3.8927, 3.7398, 
          3.6189, 3.3257, 3.1791, 3.1781, 3.2329, 3.1418, 3.1643, 
          3.14, 3.2668, 3.4014, 3.5382, 3.6131, 2.862, 3.7155, 
          3.7428, 3.7716, 3.8027, 3.8367, 3.8737, 3.9134, 3.9556, 
          4.0001, 4.0473, 4.098, 4.152, 4.2081, 4.2633, 4.3128, 
          4.3503, 4.3692, 4.3635, 4.3298, 4.2673, 4.1786, 4.069, 
          3.9459, 3.8181, 3.6953, 3.5871, 3.5015, 3.4437, 3.414, 
          3.4079, 3.4162, 3.4276, 3.4307, 3.4172, 3.3828, 3.3278, 
          3.2565, 3.1755, 3.0926, 3.0151, 2.9486, 2.8965, 2.8602, 
          2.8387, 2.8296, 2.8291, 2.8334, 2.839, 2.8441, 2.848, 
          2.8513, 2.8546, 2.8581, 2.8609, 4.7105, 3.0057, 3.1443, 
          3.2729, 3.3917, 3.5048, 3.6179, 3.7365, 3.8635, 3.9988, 
          4.1389, 4.2774, 4.4061, 4.5169, 4.6037, 4.6643, 4.6992, 
          3.9769, 4.6679, 4.662, 4.6388, 4.5942, 4.5276, 4.4423, 
          4.3443, 4.2416, 4.143, 4.0569, 3.9905, 3.9477, 3.9285, 
          3.9288, 3.9415, 3.9583, 3.9718), Parent = c(-1L, 22L, 
          1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
          15L, 16L, 17L, 18L, 19L, 20L, 21L, 53L, 2L, 24L, 25L, 
          26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 
          37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 
          48L, 49L, 50L, 51L, 52L, 98L, 23L, 55L, 56L, 57L, 58L, 
          59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, 
          70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 
          81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 
          92L, 93L, 94L, 95L, 96L, 97L, 147L, 98L, 100L, 101L, 
          102L, 103L, 104L, 105L, 106L, 107L, 108L, 109L, 110L, 
          111L, 112L, 113L, 114L, 115L, 116L, 117L, 118L, 119L, 
          120L, 121L, 122L, 123L, 124L, 125L, 126L, 127L, 128L, 
          129L, 130L, 131L, 132L, 133L, 134L, 135L, 136L, 137L, 
          138L, 139L, 140L, 141L, 142L, 143L, 144L, 145L, 146L, 
          201L, 99L, 149L, 150L, 151L, 152L, 153L, 154L, 155L, 
          156L, 157L, 158L, 159L, 160L, 161L, 162L, 163L, 164L, 
          165L, 166L, 167L, 168L, 169L, 170L, 171L, 172L, 173L, 
          174L, 175L, 176L, 177L, 178L, 179L, 180L, 181L, 182L, 
          183L, 184L, 185L, 186L, 187L, 188L, 189L, 190L, 191L, 
          192L, 193L, 194L, 195L, 196L, 197L, 198L, 199L, 200L, 
          256L, 148L, 203L, 204L, 205L, 206L, 207L, 208L, 209L, 
          210L, 211L, 212L, 213L, 214L, 215L, 216L, 217L, 218L, 
          219L, 220L, 221L, 222L, 223L, 224L, 225L, 226L, 227L, 
          228L, 229L, 230L, 231L, 232L, 233L, 234L, 235L, 236L, 
          237L, 238L, 239L, 240L, 241L, 242L, 243L, 244L, 245L, 
          246L, 247L, 248L, 249L, 250L, 251L, 252L, 253L, 254L, 
          255L, 273L, 256L, 258L, 259L, 260L, 261L, 262L, 263L, 
          264L, 265L, 266L, 267L, 268L, 269L, 270L, 271L, 272L, 
          291L, 272L, 275L, 276L, 277L, 278L, 279L, 280L, 281L, 
          282L, 283L, 284L, 285L, 286L, 287L, 288L, 289L, 290L)), .Names = c("PointNo", 
      "Label", "X", "Y", "Z", "W", "Parent"), class = "data.frame", row.names = c(NA, 
      291L))), .Names = c("NeuronName", "InputFileName", "CreatedAt", 
  "NodeName", "InputFileStat", "InputFileMD5", "NumPoints", "StartPoint", 
  "BranchPoints", "EndPoints", "nTrees", "NumSegs", "SegList", 
  "d"), class = c("neuron", "list"))
  # NB this neuron does not have an origin set
  expect_warning(n<-read.neuron('testdata/neuron/Neurites.am'), 
                 regexp = 'No valid origin found')
  expect_is(n,'neuron')
  g1<-as.ngraph(Neurites)
  g2<-as.ngraph(n)
  expect_true(igraph::graph.isomorphic(g1,g2))
  expect_equal(n, Neurites)
  tmpfile=tempfile(fileext='.wurgle')
  on.exit(unlink(tmpfile))
  file.copy('testdata/neuron/Neurites.am',tmpfile)
  
  expect_equal(suppressWarnings(read.neuron(tmpfile)), n,
               fieldsToExclude='NeuronName')
})

test_that("we can read multiple neurons from a zip archive", {
  files_to_zip <- c("testdata/neuron/testneuron_am3d.am", "testdata/neuron/testneuron_lineset.am")
  # swallow extraneous warning
  expect_warning(neurons <- read.neurons(files_to_zip,
                                         neuronnames = function(f) tools::file_path_sans_ext(basename(f))),
                 regexp = "specifies radius")
  zip_file <- paste0(tempfile(), ".zip")
  on.exit(unlink(zip_file, recursive=TRUE))
  zip(zip_file, files_to_zip)
  expect_warning(zip_neurons <- read.neurons(zip_file, format="zip",
                                             neuronnames = function(f) tools::file_path_sans_ext(basename(f))),
                 regexp = "specifies radius")
  expect_equal(neurons, zip_neurons)
})

test_that("we can write multiple neurons to a zip archive", {
  dir.create(td<-tempfile())
  owd=setwd(td)
  zip_file <- "test.zip"
  on.exit(unlink(zip_file))
  file.create(zip_file)
  expect_error(write.neurons(Cell07PNs[1:5], zip_file, format="swc"), 
               'already exists')
  write.neurons(Cell07PNs[1:5], zip_file, format="swc", Force=T, subdir=Glomerulus)
  nat.utils::zipinfo(zip_file)
  zip_neurons <- read.neurons(zip_file, format="zip")
  # fix names and compare
  names(zip_neurons)=sub("\\.swc","",names(zip_neurons))
  expect_equivalent(Cell07PNs[1:5], zip_neurons[names(Cell07PNs)[1:5]])
  setwd(owd)
})

test_that("we can identify amira hxskel neurons",{
  # hxlineset neuron
  expect_false(is.hxskel('testdata/neuron/EBT7R.am'))
  # swc neuron
  expect_false(is.hxskel('testdata/neuron/EBT7R.CNG.swc'))
  # hxskel neuron
  expect_true(is.hxskel('testdata/neuron/Neurites.am'))
  # hxskel
  p='testdata/neuron/Neurites.am'
  expect_true(is.hxskel(p,bytes=readBin(p,what=raw(),n=80)))
})

test_that("reading identical neuron in 2 amira formats and 3 encodings works",{
  expect_warning(l<-read.neuron("testdata/neuron/testneuron_lineset.am"),
                 regexp = 'Data section 3 .* specifies radius')
  expect_is(l,'neuron')
  expect_equal(l,read.neuron("testdata/neuron/testneuron_am3d.am"),
               fieldsToExclude='NeuronName')
  expect_equal(l,read.neuron("testdata/neuron/testneuron_am3d_ascii.am.gz"),
               fieldsToExclude='NeuronName')
  expect_equal(l,read.neuron("testdata/neuron/testneuron_am3d.am.gz"),fieldsToExclude='NeuronName')
})

test_that("reading gzipped binary format amiramesh neurons works",{
  library(nat.utils)
  expect_true(is.gzip("testdata/neuron/testneuron_am3d_ascii.am.gz"))
  expect_true(is.gzip("testdata/neuron/testneuron_am3d.am.gz"))
  expect_false(is.gzip("testdata/neuron/testneuron_am3d.am"))
})

test_that("we can identify amira hxlineset neurons",{
  # hxlineset neuron
  expect_true(is.hxlineset('testdata/neuron/EBT7R.am'))
  # swc neuron
  expect_false(is.hxlineset('testdata/neuron/EBT7R.CNG.swc'))
  # hxskel neuron
  expect_false(is.hxlineset('testdata/neuron/Neurites.am'))
  # hxlineset via byte array
  p='testdata/neuron/EBT7R.am'
  expect_true(is.hxlineset(p,bytes=readBin(p,what=raw(),n=80)))
  q='testdata/neuron/Neurites.am'
  expect_false(is.hxlineset(q,bytes=readBin(p,what=raw(),n=80)))
  # gzipped direct
  expect_true(is.hxlineset('testdata/neuron/testneuron_fclineset.am.gz'))
  # gzipped via byte array
  # nb this relies on decompression which is looked after by getformatfuns
  r='testdata/neuron/testneuron_fclineset.am.gz'
  gzf=gzfile(r, open='rb')
  on.exit(close(gzf))
  expect_true(is.hxlineset(r,bytes=readBin(gzf,what=raw(),n=80)))
})

test_that("we can read a flycircuit lineset neuron w/o radius info",{
  f="testdata/neuron/testneuron_fclineset.am.gz"
  expect_warning(n<-read.neuron(f), regexp = 'No width data')
  expect_is(n, 'neuron')
})

test_that("we can update an existing neuronlist",{
  dir.create(td<-tempfile())
  owd=setwd(td)
  on.exit({setwd(owd); unlink(td,recursive=TRUE)})
  
  write.neurons(Cell07PNs[1:3], dir='.', format = 'swc')
  expect_is(nl3<-read.neurons(dir(pattern='swc$')), 'neuronlist')
  write.neurons(Cell07PNs[4], dir='.', format='swc')
  
  expect_message(nl4<-read.neurons(rev(dir(pattern='swc$')), nl = nl3, 
                                   SortOnUpdate = TRUE), 
                 '0 modified.* 1 new')
  # note that is the order of neurons specified in paths _not_ the order of
  # neurons specified in the neuron list that counts.
  expect_equal(names(nl4)[4:2], names(nl3))
  # overwrite the last file with a different neuron
  write.neurons(Cell07PNs[5], dir='.', format='swc', 
                files = names(Cell07PNs)[4], Force = T)
  expect_message(nl4<-read.neurons(dir(pattern='swc$'), nl = nl4),
                 '1 modified.* 0 new')
})

context("neurons writing")

test_that("we can write neuron/dotprops to rds file",{
  x=kcs20[[1]]
  td=tempfile()
  on.exit(unlink(td,recursive=TRUE))
  expect_error(f<-write.neuron(x, dir=td, MakeDir = F), 'does not exist')
  expect_equal(f<-write.neuron(x, dir=td), 
               file.path(td,'FruMARCM-M001205_seg002_03.rds'))
  # can't overwrite get a warning and an NA back
  expect_warning(f2<-write.neuron(x, f))
  expect_true(is.na(f2))
  # can overwrite with force
  expect_equal(write.neuron(x, f, Force=TRUE), f)
  unlink(f)
  
  expect_equal(write.neuron(x, dir=td, ext='.RDS'),
               file.path(td,'FruMARCM-M001205_seg002_03.RDS'))
  
  y=Cell07PNs[[1]]
  expect_error(write.neuron(y, dir=td),'Ambiguous file format')
  expect_equal(write.neuron(y, dir=td, format='rds', ext='.RDS'),
               file.path(td,'EBH11R.RDS'))
  expect_equal(write.neuron(y, dir=td, format='rds', ext='_skel.rds'),
               file.path(td,'EBH11R_skel.rds'))
  
})

test_that("we can write neuron to swc file",{
  y=Cell07PNs[[1]]
  td=tempfile()
  dir.create(td)
  on.exit(unlink(td,recursive=TRUE))
  
  expect_equal(write.neuron(y, dir=td, ext='.swc'),
               file.path(td,'EBH11R.swc'))
  expect_equal(write.neuron(y, dir=td, format='swc', file='rhubarb'),
               file.path(td,'rhubarb.swc'))
  expect_equal(write.neuron(y, dir=td, format='swc', ext='.swcreally', file='rhubarb'),
               file.path(td,'rhubarb.swcreally'))
  expect_equal(f<-write.neuron(y, dir=td, format='swc', ext='_skel.swc'),
               file.path(td,'EBH11R_skel.swc'))
  expect_equal(read.neuron(f),y,fieldsToExclude='NeuronName')
})

test_that("we can write dotprops objects to SWC format",{
  
  # setup
  td=tempfile()
  dir.create(td)
  on.exit(unlink(td,recursive=TRUE))
  
  # write, testing out veclength param to double segment length
  veclength=2
  expect_is(written <- write.neurons(kcs20[1:3], dir=td, files = Name, 
                                     format='swc', veclength=veclength),
            'character')
  expect_is(x <- read.neuron(written[1]), 'neuron')
  # The key feature is that the parents are set up properly
  # for head to tail segments
  expect_equal(x$d$Parent[1:6], c(-1, 1, -1, 3, -1, 5))
  # and that the segments define the original tangent vectorS
  # multiplied by veclength as appropriate
  seg1=data.matrix(xyzmatrix(x)[1:2,])
  vec1=as.vector(diff(seg1))
  expect_equivalent(vec1/veclength, kcs20[[1]]$vect[1,])
})

test_that("we can write neuron to amira hxskel file",{
  y=Cell07PNs[[1]]
  td=tempfile()
  dir.create(td)
  on.exit(unlink(td,recursive=TRUE))
  
  expect_equal(f<-write.neuron(y, dir=td, format='hxskel'),
               file.path(td,'EBH11R.am'))
  expect_equal(read.neuron(f),y,fieldsToExclude='NeuronName')
})

test_that("we can write neuron to amira hxlineset file",{
  y=Cell07PNs[[1]]
  td=tempfile()
  dir.create(td)
  on.exit(unlink(td,recursive=TRUE))
  
  expect_equal(f<-write.neuron(y, dir=td, format='hxlineset'),
               file.path(td,'EBH11R.am'))
  expect_equal(read.neuron(f),y,fieldsToExclude='NeuronName')
  
  y$d$W[2]=NA
  expect_warning(write.neuron(y, file=file.path(td,'EBH11R_narad.am'), format='hxlineset'))
})

test_that("we get an error when writing neuron to unknown format",{
  expect_error(write.neuron(Cell07PNs[[1]], dir=td, format='rhubarb'))
})

test_that("write.neurons works",{
  td=tempfile()
  dir.create(td)
  on.exit(unlink(td,recursive=TRUE))
  neurons_to_write=subset(Cell07PNs,Scored.By%in%c("ACH","CJP"),rval='names')
  expect_is(written_files<-write.neurons(Cell07PNs, dir=td,
                                         INDICES=neurons_to_write,
                                         format='hxlineset'),'character')
  files_found=dir(td,recursive=T,pattern='am$')
  expect_true(all(basename(written_files)%in%basename(files_found)))
  
  expect_is(written_files<-write.neurons(Cell07PNs, dir=td, subdir="CellType",
                                         INDICES=neurons_to_write,ext='.am3d',
                                         format='hxskel'),'character')
  files_found=dir(td,recursive=T,pattern='am3d$')
  expect_true(all(basename(written_files)%in%basename(files_found)))
  expect_equal(with(Cell07PNs[neurons_to_write],as.character(Glomerulus)),
               basename(dirname(written_files)))

  expect_is(written_files<-write.neurons(Cell07PNs, dir=td, subdir="CellType",
                                         INDICES=neurons_to_write, files=basename(TraceFile),
                                         ext='.am3d', format='hxskel', Force=T),
            'character')
  files_found=dir(td,recursive=T,pattern='am3d$')
  expect_true(all(basename(written_files)%in%basename(files_found)), 
              'specify output file names directly')

  expect_is(written_files<-write.neurons(Cell07PNs, dir=td, subdir="CellType",
                                         INDICES=neurons_to_write, files=basename(TraceFile),
                                         ext='.am3d', format='hxskel', Force=T),
            'character')
  files_found=dir(td,recursive=T,pattern='am3d$')
  expect_true(all(basename(written_files)%in%basename(files_found)), 'specify files')
  
  expect_is(written_files<-write.neurons(Cell07PNs, dir=td, subdir=Glomerulus,
                                         INDICES=neurons_to_write,ext='.amm',
                                         format='hxskel'),'character')
  files_found=dir(td,recursive=T,pattern='amm$')
  expect_true(all(basename(written_files)%in%basename(files_found)))
  expect_equal(with(Cell07PNs[neurons_to_write],as.character(Glomerulus)),
               basename(dirname(written_files)))
  
  nldf=subset(Cell07PNs, neurons_to_write, rval="data.frame")
  nl=Cell07PNs[neurons_to_write]
  attr(nl,'df')=NULL
  expect_is(written_files<-write.neurons(nl, dir=td,
                INDICES=neurons_to_write,
                subdir=nldf$Glomerulus,format='swc'),'character',
            info='use variable from calling environment to specify subdir')
  files_found=dir(td,recursive=T,pattern='swc$')
  expect_true(all(basename(written_files)%in%basename(files_found)))
})


context("vtk-io")

test_that("we can write a neuron to vtk format", {
  testd=data.frame(PointNo=1:6,Label=2L,
                   X=c(1:5,3),Y=c(rep(1,5),2),Z=0,W=NA,
                   Parent=c(-1,1:4,3))
  testn=as.neuron(testd)
  tf <- tempfile(fileext = '.vtk')
  write.vtk(testn, tf)
  readLines(tf)
})

Try the nat package in your browser

Any scripts or data that you put into this service are public.

nat documentation built on Sept. 6, 2021, 5:09 p.m.