ZSwcTree* ZSwcGenerator::createRangeCompareSwc( const ZFlyEmNeuronRange &range, const ZFlyEmNeuronRange &reference) { if (range.isEmpty()) { return NULL; } double minZ = range.getMinZ(); double maxZ = range.getMaxZ(); double dz = (maxZ - minZ) / 50.0; if (dz == 0.0) { //Avoid dead loop dz = 1.0; } ZSwcTree *tree = createVirtualRootSwc(); double minReferenceZ = reference.getMinZ(); double maxReferenceZ = reference.getMaxZ(); for (double z = minReferenceZ; z < minZ; z += dz) { ZSwcTree *subtree = createCircleSwc(0, 0, z, reference.getRadius(z)); subtree->setType(5); tree->merge(subtree, true); } for (double z = maxZ + dz; z <= maxReferenceZ; z += dz) { ZSwcTree *subtree = createCircleSwc(0, 0, z, reference.getRadius(z)); subtree->setType(5); tree->merge(subtree, true); } for (double z = minZ; z <= maxZ; z += dz) { double r = range.getRadius(z); ZSwcTree *subtree = createCircleSwc(0, 0, z, r); ZFlyEmNeuronRangeCompare comp; ZFlyEmNeuronRangeCompare::EMatchStatus status = comp.compare(range, reference, z); switch (status) { case ZFlyEmNeuronRangeCompare::MISSING_BRANCH: subtree->setType(2); break; case ZFlyEmNeuronRangeCompare::EXTRA_BRANCH: subtree->setType(3); break; case ZFlyEmNeuronRangeCompare::GOOD_MATCH: subtree->setType(0); break; default: subtree->setType(0); } tree->merge(subtree, true); } tree->resortId(); return tree; }
ZSwcTree* ZSwcGenerator::createSwc(const ZFlyEmNeuronRange &range) { if (range.isEmpty()) { return NULL; } double minZ = range.getMinZ(); double maxZ = range.getMaxZ(); double dz = (maxZ - minZ) / 50.0; if (dz == 0.0) { //Avoid dead loop dz = 1.0; } ZSwcTree *tree = createVirtualRootSwc(); for (double z = minZ; z <= maxZ; z += dz) { double r = range.getRadius(z); ZSwcTree *subtree = createCircleSwc(0, 0, z, r); tree->merge(subtree, true); } tree->resortId(); return tree; }
ZSwcTree* ZSwcGenerator::createSwc( const ZObject3dScan &blockObj, int z, const ZDvidInfo &dvidInfo) { #ifdef _FLYEM_ ZObject3dScan slice = blockObj.getSlice(z); size_t stripeNumber = slice.getStripeNumber(); ZSwcTree *tree = new ZSwcTree; for (size_t s = 0; s < stripeNumber; ++s) { const ZObject3dStripe &stripe = slice.getStripe(s); int nseg = stripe.getSegmentNumber(); int y = stripe.getY(); int z = stripe.getZ(); for (int i = 0; i < nseg; ++i) { int x0 = stripe.getSegmentStart(i); int x1 = stripe.getSegmentEnd(i); for (int x = x0; x <= x1; ++x) { ZIntCuboid cuboid = dvidInfo.getBlockBox(x, y, z); tree->merge(createBoxSwc(cuboid)); } } } return tree; #else UNUSED_PARAMETER(&blockObj); UNUSED_PARAMETER(z); UNUSED_PARAMETER(&dvidInfo); return NULL; #endif }
void FlyEm::ZSubstackRoi::exportSwc(const string &filePath) { if (!m_cuboidArray.empty()) { ZSwcTree *tree = new ZSwcTree; int index = 0; for (ZIntCuboidArray::const_iterator iter = m_cuboidArray.begin(); iter != m_cuboidArray.end(); ++iter, ++index) { ZCuboid cuboid; cuboid.set(iter->cb[0], iter->cb[1], iter->cb[2], iter->ce[0], iter->ce[1], iter->ce[2]); ZSwcTree *subtree = ZSwcTree::CreateCuboidSwc(cuboid); if (!m_idArray.empty()) { subtree->setType(m_idArray[index]); } else { subtree->setType(index); } tree->merge(subtree, true); } tree->resortId(); tree->save(filePath); delete tree; } }
ZSwcTree* ZSwcGenerator::createSwc( const ZIntCuboidFaceArray &faceArray, double radius) { if (faceArray.empty()) { return NULL; } ZSwcTree *tree = new ZSwcTree; for (ZIntCuboidFaceArray::const_iterator iter = faceArray.begin(); iter != faceArray.end(); ++iter) { ZSwcTree *subtree = createSwc(*iter, radius); tree->merge(subtree, true); } return tree; }
ZSwcTree* ZSwcGenerator::createSwc( const ZFlyEmNeuronRange &range, const ZFlyEmNeuronAxis &axis) { double minZ = range.getMinZ(); double maxZ = range.getMaxZ(); double dz = (maxZ - minZ) / 50.0; ZSwcTree *tree = createVirtualRootSwc(); for (double z = minZ; z <= maxZ; z += dz) { double r = range.getRadius(z); ZPoint pt = axis.getCenter(z); ZSwcTree *subtree = createCircleSwc(pt.x(), pt.y(), z, r); tree->merge(subtree, true); } tree->resortId(); return tree; }
void ZIntCuboidArray::exportSwc(const string &filePath) const { if (!empty()) { ZSwcTree *tree = new ZSwcTree; int index = 0; for (ZIntCuboidArray::const_iterator iter = begin(); iter != end(); ++iter, ++index) { ZCuboid cuboid; cuboid.set(iter->cb[0], iter->cb[1], iter->cb[2], iter->ce[0], iter->ce[1], iter->ce[2]); ZSwcTree *subtree = ZSwcTree::CreateCuboidSwc(cuboid); subtree->setType(index); tree->merge(subtree, true); } tree->resortId(); tree->save(filePath); delete tree; } }
ZSwcTree* ZIntCuboidArray::toSwc() const { ZSwcTree *tree = NULL; if (!empty()) { tree = new ZSwcTree; int index = 0; for (ZIntCuboidArray::const_iterator iter = begin(); iter != end(); ++iter, ++index) { ZCuboid cuboid; cuboid.set(iter->cb[0], iter->cb[1], iter->cb[2], iter->ce[0], iter->ce[1], iter->ce[2]); ZSwcTree *subtree = ZSwcTree::CreateCuboidSwc(cuboid); subtree->setType(index); tree->merge(subtree, true); } tree->resortId(); } return tree; }