Trace_Record* Trace_Record_Fread_V(Trace_Record *tr, FILE *stream, double version) { if (version == 0.0) { ASSERT(stream != NULL, "Invalid file pointer"); if (feof(stream)) { return NULL; } Bitmask_t mask = ZERO_BIT_MASK; if (fread(&mask, sizeof(Bitmask_t), 1, stream) != 1) { return NULL; } BOOL is_local_alloc = FALSE; if (tr == NULL) { if (mask == ZERO_BIT_MASK) { return NULL; } else { tr = New_Trace_Record(); is_local_alloc = TRUE; } } tr->mask = mask; if (mask != ZERO_BIT_MASK) { if (fread(BYTE_ARRAY(tr) + sizeof(Bitmask_t), sizeof(Trace_Record) - sizeof(Bitmask_t) - sizeof(tr->fix_point), 1, stream) != 1) { if (is_local_alloc == TRUE) { Delete_Trace_Record(tr); } tr = NULL; } } } else if (version == 1.0) { tr = Trace_Record_Fread(tr, stream); } else if (version == 2.0) { tr = Trace_Record_Fread(tr, stream); if (tr != NULL) { int fix_point; fread(&fix_point, sizeof(fix_point), 1, stream); tr->fix_point = fix_point; } } else if (version == 3.0) { tr = Trace_Record_Fread(tr, stream); if (tr != NULL) { fread(&(tr->fix_point), sizeof(tr->fix_point), 1, stream); } } else { TZ_ERROR(ERROR_IO_FORMAT); } return tr; }
Trace_Record* Copy_Trace_Record(Trace_Record *tr) { if (tr == NULL) { return NULL; } Trace_Record *newtr = New_Trace_Record(); Trace_Record_Copy(newtr, tr); return newtr; }
ZSwcPath ZNeuronTracer::trace(double x, double y, double z) { if (m_traceWorkspace->trace_mask == NULL) { m_traceWorkspace->trace_mask = C_Stack::make(GREY, C_Stack::width(m_stack), C_Stack::height(m_stack), C_Stack::depth(m_stack)); Zero_Stack(m_traceWorkspace->trace_mask); } double pos[3]; pos[0] = x; pos[1] = y; pos[2] = z; Local_Neuroseg *locseg = New_Local_Neuroseg(); Set_Neuroseg(&(locseg->seg), 3.0, 0.0, 11.0, TZ_PI_4, 0.0, 0.0, 0.0, 1.0); Set_Neuroseg_Position(locseg, pos, NEUROSEG_CENTER); Locseg_Fit_Workspace *ws = (Locseg_Fit_Workspace*) m_traceWorkspace->fit_workspace; Local_Neuroseg_Optimize_W(locseg, m_stack, 1.0, 1, ws); Trace_Record *tr = New_Trace_Record(); tr->mask = ZERO_BIT_MASK; Trace_Record_Set_Fix_Point(tr, 0.0); Trace_Record_Set_Direction(tr, DL_BOTHDIR); Locseg_Node *p = Make_Locseg_Node(locseg, tr); Locseg_Chain *locseg_chain = Make_Locseg_Chain(p); Trace_Workspace_Set_Trace_Status(m_traceWorkspace, TRACE_NORMAL, TRACE_NORMAL); Trace_Locseg(m_stack, 1.0, locseg_chain, m_traceWorkspace); Locseg_Chain_Remove_Overlap_Ends(locseg_chain); Locseg_Chain_Remove_Turn_Ends(locseg_chain, 1.0); int n; Geo3d_Circle *circles = Locseg_Chain_To_Geo3d_Circle_Array(locseg_chain, NULL, &n); ZSwcPath path; for (int i = 0; i < n; ++i) { Swc_Tree_Node *tn = SwcTreeNode::makePointer(circles[i].center[0], circles[i].center[1], circles[i].center[2], circles[i].radius); if (!path.empty()) { SwcTreeNode::setParent(tn, path.back()); } path.push_back(tn); } return path; }
Trace_Record* Trace_Record_Fread(Trace_Record *tr, FILE *stream) { ASSERT(stream != NULL, "Invalid file pointer"); if (feof(stream)) { return NULL; } Bitmask_t mask = ZERO_BIT_MASK; if (fread(&mask, sizeof(Bitmask_t), 1, stream) != 1) { return NULL; } BOOL is_local_alloc = FALSE; if (tr == NULL) { if (mask == ZERO_BIT_MASK) { return NULL; } else { tr = New_Trace_Record(); is_local_alloc = TRUE; } } tr->mask = mask; if (mask != ZERO_BIT_MASK) { /* if (fread(((void *) tr) + sizeof(Bitmask_t), sizeof(Trace_Record) - sizeof(Bitmask_t), 1, stream) != 1) { if (is_local_alloc == TRUE) { Delete_Trace_Record(tr); } tr = NULL; } */ Stack_Fit_Score_Fread(&(tr->fs), stream); fread(&(tr->hit_region), sizeof(tr->hit_region), 1, stream); fread(&(tr->index), sizeof(tr->index), 1, stream); fread(&(tr->refit), sizeof(tr->refit), 1, stream); fread(tr->fit_height, sizeof(tr->fit_height[0]), 2, stream); fread(&(tr->direction), sizeof(tr->direction), 1, stream); } return tr; }
ZSwcPath ZNeuronTracer::trace(double x, double y, double z) { setTraceScoreThreshold(TRACING_INTERACTIVE); if (m_traceWorkspace->trace_mask == NULL) { m_traceWorkspace->trace_mask = C_Stack::make(GREY, getStack()->width(), getStack()->height(), getStack()->depth()); Zero_Stack(m_traceWorkspace->trace_mask); } Stack *stackData = getIntensityData(); ZIntPoint stackOffset = getStack()->getOffset(); double pos[3]; pos[0] = x - stackOffset.getX(); pos[1] = y - stackOffset.getY(); pos[2] = z - stackOffset.getZ(); /* alloc <locseg> */ Local_Neuroseg *locseg = New_Local_Neuroseg(); Set_Neuroseg(&(locseg->seg), 3.0, 0.0, 11.0, TZ_PI_4, 0.0, 0.0, 0.0, 1.0); Set_Neuroseg_Position(locseg, pos, NEUROSEG_CENTER); Locseg_Fit_Workspace *ws = (Locseg_Fit_Workspace*) m_traceWorkspace->fit_workspace; Local_Neuroseg_Optimize_W(locseg, stackData, 1.0, 1, ws); Trace_Record *tr = New_Trace_Record(); tr->mask = ZERO_BIT_MASK; Trace_Record_Set_Fix_Point(tr, 0.0); Trace_Record_Set_Direction(tr, DL_BOTHDIR); /* consume <locseg> */ Locseg_Node *p = Make_Locseg_Node(locseg, tr); /* alloc <locseg_chain> */ Locseg_Chain *locseg_chain = Make_Locseg_Chain(p); Trace_Workspace_Set_Trace_Status(m_traceWorkspace, TRACE_NORMAL, TRACE_NORMAL); Trace_Locseg(stackData, 1.0, locseg_chain, m_traceWorkspace); Locseg_Chain_Remove_Overlap_Ends(locseg_chain); Locseg_Chain_Remove_Turn_Ends(locseg_chain, 1.0); int n; /* alloc <circles> */ Geo3d_Circle *circles = Locseg_Chain_To_Geo3d_Circle_Array(locseg_chain, NULL, &n); /* free <locseg_chain> */ Kill_Locseg_Chain(locseg_chain); ZSwcPath path; if (n > 0) { // bool hit = false; int start = 0; int end = n; if (Trace_Workspace_Mask_Value(m_traceWorkspace, circles[0].center) > 0) { for (int i = 1; i < n; ++i) { start = i - 1; if (Trace_Workspace_Mask_Value(m_traceWorkspace, circles[i].center) == 0) { break; } } } if (n > 1) { if (Trace_Workspace_Mask_Value(m_traceWorkspace, circles[n - 1].center) > 0) { for (int i = n - 2; i >= 0; --i) { end = i + 2; if (Trace_Workspace_Mask_Value(m_traceWorkspace, circles[i].center) == 0) { break; } } } } for (int i = start; i < end; ++i) { Swc_Tree_Node *tn = SwcTreeNode::makePointer(circles[i].center[0], circles[i].center[1], circles[i].center[2], circles[i].radius); if (!path.empty()) { SwcTreeNode::setParent(tn, path.back()); } SwcTreeNode::translate(tn, stackOffset); path.push_back(tn); } } /* free <circles> */ if (circles != NULL) { free(circles); } return path; }