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 ZStroke2d &stroke) { #if _QT_GUI_USED_ if (stroke.isEmpty()) { return NULL; } double z = stroke.getZ(); double r = stroke.getWidth() / 2.0; ZSwcTree *tree = new ZSwcTree(); tree->forceVirtualRoot(); Swc_Tree_Node *parent = tree->root(); for (size_t i = 0; i < stroke.getPointNumber(); ++i) { double x, y; stroke.getPoint(&x, &y, i); Swc_Tree_Node *tn = SwcTreeNode::makePointer(x, y, z, r); SwcTreeNode::setParent(tn, parent); parent = tn; } tree->resortId(); return tree; #else return NULL; #endif }
ZSwcTree* ZSwcGenerator::createSwc(const ZObject3dScan &obj) { if (obj.isEmpty()) { return NULL; } ZSwcTree *tree = new ZSwcTree(); tree->forceVirtualRoot(); Swc_Tree_Node *root = tree->root(); size_t stripeNumber = obj.getStripeNumber(); for (size_t i = 0; i < stripeNumber; ++i) { const ZObject3dStripe &stripe = obj.getStripe(i); int segNumber = stripe.getSegmentNumber(); int y = stripe.getY(); int z = stripe.getZ(); for (int j = 0; j < segNumber; ++j) { Swc_Tree_Node *tn = SwcTreeNode::makePointer(stripe.getSegmentStart(j), y, z, 2.0); SwcTreeNode::setFirstChild(root, tn); Swc_Tree_Node *tn2 = SwcTreeNode::makePointer(stripe.getSegmentEnd(j), y, z, 2.0); SwcTreeNode::setFirstChild(tn, tn2); } } tree->resortId(); return tree; }
ZSwcTree* ZSwcGenerator::createCircleSwc(double cx, double cy, double cz, double r) { if (r < 0.0) { return NULL; } ZSwcTree *tree = createVirtualRootSwc(); Swc_Tree_Node *parent = tree->root(); double nodeRadius = r * 0.05; for (double angle = 0.0; angle < 6.0; angle += 0.314) { double x, y, z; x = r * cos(angle) + cx; y = r * sin(angle) + cy; z = cz; Swc_Tree_Node *tn = SwcTreeNode::makePointer(x, y, z, nodeRadius); SwcTreeNode::setParent(tn, parent); parent = tn; } Swc_Tree_Node *tn = SwcTreeNode::makePointer(); SwcTreeNode::copyProperty(SwcTreeNode::firstChild(tree->root()), tn); SwcTreeNode::setParent(tn, parent); tree->resortId(); return tree; }
ZSwcTree* ZSwcGenerator::createSwc( const ZLineSegmentArray &lineArray, double radius) { ZSwcTree *tree = new ZSwcTree; Swc_Tree_Node *root = tree->forceVirtualRoot(); for (ZLineSegmentArray::const_iterator iter = lineArray.begin(); iter != lineArray.end(); ++iter) { const ZLineSegment &seg = *iter; Swc_Tree_Node *tn = New_Swc_Tree_Node(); SwcTreeNode::setPos(tn, seg.getStartPoint()); SwcTreeNode::setRadius(tn, radius); SwcTreeNode::setParent(tn, root); Swc_Tree_Node *tn2 = New_Swc_Tree_Node(); SwcTreeNode::setPos(tn2, seg.getEndPoint()); SwcTreeNode::setRadius(tn2, radius); SwcTreeNode::setParent(tn2, tn); } tree->resortId(); return tree; }
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 ZPointArray &pointArray, double radius, bool isConnected) { ZSwcTree *tree = new ZSwcTree; tree->useCosmeticPen(true); Swc_Tree_Node *root = tree->forceVirtualRoot(); Swc_Tree_Node *parent = root; for (ZPointArray::const_iterator iter = pointArray.begin(); iter != pointArray.end(); ++iter) { const ZPoint &pt = *iter; Swc_Tree_Node *tn = New_Swc_Tree_Node(); SwcTreeNode::setPos(tn, pt.x(), pt.y(), pt.z()); SwcTreeNode::setRadius(tn, radius); SwcTreeNode::setParent(tn, parent); if (isConnected) { parent = tn; } } tree->resortId(); return tree; }
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 *ZNeuronConstructor::reconstruct( std::vector<Locseg_Chain*> &chainArray) { ZSwcTree *tree = NULL; if (!chainArray.empty()) { int chain_number = chainArray.size(); /* <neuronComponent> allocated */ Neuron_Component *neuronComponent = Make_Neuron_Component_Array(chain_number); for (int i = 0; i < chain_number; i++) { Set_Neuron_Component(neuronComponent + i, NEUROCOMP_TYPE_LOCSEG_CHAIN, chainArray[i]); } /* reconstruct neuron */ /* alloc <ns> */ double zscale = 1.0; Neuron_Structure *ns = Locseg_Chain_Comp_Neurostruct( neuronComponent, chain_number, m_signal, zscale, m_connWorkspace); Process_Neuron_Structure(ns); if (m_connWorkspace->crossover_test == TRUE) { Neuron_Structure_Crossover_Test(ns, zscale); } /* alloc <ns2> */ Neuron_Structure* ns2= Neuron_Structure_Locseg_Chain_To_Circle_S(ns, 1.0, 1.0); Neuron_Structure_To_Tree(ns2); tree = new ZSwcTree; tree->setData(Neuron_Structure_To_Swc_Tree_Circle_Z(ns2, 1.0, NULL)); tree->resortId(); /* free <ns2> */ Kill_Neuron_Structure(ns2); /* free <ns> */ ns->comp = NULL; Kill_Neuron_Structure(ns); /* free <neuronComponent> */ Clean_Neuron_Component_Array(neuronComponent, chain_number); free(neuronComponent); } 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; }