Geo3d_Scalar_Field* ZNeuronTracer::extractLineSeed( const Stack *mask, const Stack *dist, int minObjSize) { Object_3d_List *objList = Stack_Find_Object_N( const_cast<Stack*>(mask), NULL, 1, minObjSize, 26); ZObject3dArray objArray; objArray.append(objList); Geo3d_Scalar_Field *field = Make_Geo3d_Scalar_Field(objArray.size()); for (size_t i = 0; i < objArray.size(); ++i) { ZObject3d *obj = objArray[i]; ZIntPoint pt = obj->getCentralVoxel(); field->points[i][0] = pt.getX(); field->points[i][1] = pt.getY(); field->points[i][2] = pt.getZ(); field->values[i] = sqrt( C_Stack::value(dist, pt.getX(), pt.getY(), pt.getZ())); } return field; }
int main(int argc, char *argv[]) { /* Takes '-ver' option and show the version */ if (Show_Version(argc, argv, "0.1") == 1) { return 0; } //For testing #if 0 Object_3d *obj_test = Make_Object_3d(27, 6); ndim_type ndim_test = 3; dim_type dim_test[3] = {3, 3, 3}; FMatrix *detected1_test = FMatrix_Ones(dim_test, ndim_test); detected1_test->array[0] = 2.0; detected1_test->array[7] = 2.0; size_t offset = 0; for (int k = 0; k < 3; k++) { for (int j = 0; j < 3; j++) { for (int i = 0; i < 3; i++) { obj_test->voxels[offset][0] = i; obj_test->voxels[offset][1] = j; obj_test->voxels[offset][2] = k; offset++; } } } vector<int> labelArray_test = apply_clustering(obj_test, detected1_test, 3); return 1; #endif #if 1 static const char *Spec[] = {"--result_file <string>", "--param_file <string> --jsonoutputfile <string>", "[--test <string>]", "[--golden <string>]", NULL}; ZArgumentProcessor::processArguments(argc, argv, Spec); cout << argv[0] << " started ..." << endl; cout << "Parsing parameters ..." << endl; TbarSaParameter opts; parse_param(ZArgumentProcessor::getStringArg("--param_file"), &opts); cout << "TBar width " << opts.tbarWidth << endl; cout << "cluster_cc " << opts.clusterCC << endl; cout << "max_cluster_sz " << opts.max_cluster_sz << endl; cout << "boundary_offset " << opts.offset << endl; cout << "thds "; darray_print(&(opts.thds[0]), opts.thds.size()); cout << "min_dist_ctrs " << opts.minDistCtrs << endl; cout << "save_screenshot " << opts.saveScreenShot << endl; cout << "Loading result file ..." << endl; if (opts.saveScreenShot) { cout << "Screenshot function is not avaible yet" << endl; //void *vol_all = hdf5read(Get_String_Arg("--result_file"), "volume/data"); //double *vol = hdf5_make_double_array(vol_all, type); } FMatrix *detected_all = hdf5read_prediction(ZArgumentProcessor::getStringArg("--result_file")); size_t length = Matrix_Size(detected_all->dim, detected_all->ndim); cout << "Overall length: " << length << endl; int vold = detected_all->dim[1]; int imh = detected_all->dim[2]; int imw = detected_all->dim[3]; dim_type dims[3]; dims[0] = detected_all->dim[1]; dims[1] = detected_all->dim[2]; dims[2] = detected_all->dim[3]; FMatrix *detected1 = Make_FMatrix(dims, 3); length = Matrix_Size(detected1->dim, detected1->ndim); size_t offset_all = 0; for (size_t offset1 = 0; offset1 < length; offset1++) { detected1->array[offset1] = detected_all->array[offset_all]; offset_all += detected_all->dim[0]; } string testDir; string goldenDir; if (ZArgumentProcessor::isArgMatched("--golden")) { goldenDir = ZArgumentProcessor::getStringArg("--golden"); } if (ZArgumentProcessor::isArgMatched("--test")) { testDir = ZArgumentProcessor::getStringArg("--test"); } if (ZArgumentProcessor::isArgMatched("--golden") || ZArgumentProcessor::isArgMatched("--test")) { Stack golden; golden.kind = FLOAT32; golden.width = detected1->dim[0]; golden.height = detected1->dim[1]; golden.depth = detected1->dim[2]; golden.array = (uint8*) detected1->array; golden.text = const_cast<char*>("\0"); if (ZArgumentProcessor::isArgMatched("--golden")) { Write_Stack(const_cast<char*>((goldenDir + "/detected1.tif").c_str()), &golden); } if (ZArgumentProcessor::isArgMatched("--test")) { Write_Stack(const_cast<char*>((testDir + "/detected1.tif").c_str()), &golden); } } //////testing////////// /* Stack *stack = Scale_Float_Stack(detected1->array, detected1->dim[0], detected1->dim[1], detected1->dim[2], GREY); Write_Stack("/Users/zhaot/Work/neutube/neurolabi/data/test.tif", stack); */ /////////////////// double avg_sz = opts.tbarWidth * opts.tbarWidth * opts.tbarWidth; double min_sz = avg_sz / 125.0; double tbar_cube_w = floor(opts.tbarWidth / 2.0); static const int morpho_w = 3; Struct_Element *se = Make_Cuboid_Se(morpho_w, morpho_w, morpho_w); Stack *bb = Make_Stack(GREY, vold, imh, imw); Stack *bb2 = Make_Stack(GREY, vold, imh, imw); Stack *bb3 = Make_Stack(GREY, vold, imh, imw); size_t volume = Stack_Voxel_Number(bb); for (int ti = 0; ti < opts.thds.size(); ti++) { double thd = opts.thds[ti]; cout << "thd = " << thd << endl; for (size_t offset = 0; offset < volume; offset++) { if (detected1->array[offset] > thd) { bb->array[offset] = 1; } else { bb->array[offset] = 0; } } //Write_Stack(const_cast<char*>("../../../data/test.tif"), bb); if (ZArgumentProcessor::isArgMatched("--golden")) { Write_Stack(const_cast<char*>((goldenDir + "/bb.tif").c_str()), bb); } if (ZArgumentProcessor::isArgMatched("--test")) { Write_Stack(const_cast<char*>((testDir + "/bb.tif").c_str()), bb); } tic(); Stack_Erode_Fast(bb, bb2, se); ptoc(); //Write_Stack(const_cast<char*>("../../../data/test2.tif"), bb2); if (ZArgumentProcessor::isArgMatched("--golden")) { Write_Stack(const_cast<char*>((goldenDir + "/bb2.tif").c_str()), bb2); } if (ZArgumentProcessor::isArgMatched("--test")) { Write_Stack(const_cast<char*>((testDir + "/bb2.tif").c_str()), bb2); } tic(); Stack_Dilate_Fast(bb2, bb3, se); ptoc(); if (ZArgumentProcessor::isArgMatched("--golden")) { Write_Stack(const_cast<char*>((goldenDir + "/bb3.tif").c_str()), bb3); } if (ZArgumentProcessor::isArgMatched("--test")) { Write_Stack(const_cast<char*>((testDir + "/bb3.tif").c_str()), bb3); } tic(); cout << "Finding objects ..." << endl; Object_3d_List *objList = Stack_Find_Object_N(bb3, NULL, 1, 0, 6); ptoc(); if (ZArgumentProcessor::isArgMatched("--golden")) { Object_3d_List_Export_Csv(const_cast<char*>((goldenDir + "/objlist.csv").c_str()), objList); } if (ZArgumentProcessor::isArgMatched("--test")) { Object_3d_List_Export_Csv(const_cast<char*>((testDir + "/objlist.csv").c_str()), objList); } ZObject3dArray objArray; Object_3d_List *head = objList; cout << "split objects ..." << endl; tic(); if (opts.clusterCC) { while (objList != NULL) { vector<int> labelArray = apply_clustering(objList->data, detected1, opts.max_cluster_sz); objArray.append(objList->data, labelArray); //cout << "Object number: " << objArray.size() << endl; objList = objList->next; } Kill_Object_3d_List(head); } else { objArray.append(objList); } ptoc(); cout << objArray.size() << " objects" << endl; if (ZArgumentProcessor::isArgMatched("--golden")) { objArray.exportCsvFile((goldenDir + "/split_objlist.csv").c_str()); } if (ZArgumentProcessor::isArgMatched("--test")) { objArray.exportCsvFile((testDir + "/split_objlist.csv").c_str()); } cout << "Computer centers ..." << endl; ZObject3d centerArray; int nselected = 0; for (size_t i = 0; i < objArray.size(); i++) { if (objArray[i]->size() >= min_sz) { nselected++; //objArray[i]->translate(-1, -1, -1); ZPoint center = objArray[i]->computeCentroid(detected1); int x = floor(center.x()) + 1; int y = floor(center.y()) + 1; int z = floor(center.z()) + 1; if (z >= opts.offset && z <= (detected1->dim[2] - opts.offset) && y >= opts.offset && y <= (detected1->dim[1] - opts.offset)) { centerArray.append(x, y, z); } } } cout << centerArray.size() << " centers calculated." << endl; if (ZArgumentProcessor::isArgMatched("--golden")) { centerArray.exportCsvFile((goldenDir + "/center.csv").c_str()); } if (ZArgumentProcessor::isArgMatched("--test")) { centerArray.exportCsvFile((testDir + "/center.csv").c_str()); } cout << "Merge centers ..." << endl; vector<size_t> indexArray = centerArray.toIndexArray<size_t>( detected1->dim[0], detected1->dim[1], detected1->dim[2], -1, -1, -1); vector<float> weightArray(indexArray.size()); for (int i = 0; i < indexArray.size(); i++) { weightArray[i] = detected1->array[indexArray[i]]; } vector<int> rankArray(indexArray.size()); farray_qsort(&(weightArray[0]), &(rankArray[0]), weightArray.size()); vector<bool> merged(centerArray.size(), false); int nmerged = 0; for (int i = centerArray.size() - 1; i >= 0; i--) { if (!merged[rankArray[i]]) { for (int j = 0; j < centerArray.size(); j++) { if (!merged[j] && j != rankArray[i]) { int dx = centerArray.x(rankArray[i]) - centerArray.x(j); int dy = centerArray.y(rankArray[i]) - centerArray.y(j); int dz = centerArray.z(rankArray[i]) - centerArray.z(j); int d = dx * dx + dy * dy + dz * dz; if (sqrt(d) < opts.minDistCtrs) { merged[j] = true; nmerged++; } } } } } //centerArray.exportSwcFile("/Users/zhaot/Work/neutube/neurolabi/data/test.swc"); cout << nmerged << " merged" << endl; ///test/// if (ZArgumentProcessor::isArgMatched("--golden")) { ofstream stream((goldenDir + "/merged_center.csv").c_str()); for (size_t i = 0; i < centerArray.size(); i++) { if (!merged[i]) { stream << centerArray.x(i) - 1 << "," << centerArray.y(i) - 1 << "," << centerArray.z(i) - 1 << endl; } } stream.close(); } if (ZArgumentProcessor::isArgMatched("--test")) { ofstream stream((testDir + "/merged_center.csv").c_str()); for (size_t i = 0; i < centerArray.size(); i++) { if (!merged[i]) { stream << centerArray.x(i) - 1 << "," << centerArray.y(i) - 1 << "," << centerArray.z(i) - 1 << endl; } } stream.close(); } ofstream stream("/Users/zhaot/Work/neutube/neurolabi/data/test2.swc"); for (size_t i = 0; i < centerArray.size(); i++) { if (!merged[i]) { stream << i + 1 << " " << 2 << " " << centerArray.x(i) - 1 << " " << centerArray.y(i) - 1 << " " << centerArray.z(i) - 1 << " " << 3.0 << " " << -1 << endl; } } stream.close(); ////////// cout << "Writing results to " << ZArgumentProcessor::getStringArg("--jsonoutputfile") << "..." << endl; FILE *jfid = fopen(ZArgumentProcessor::getStringArg(("--jsonoutputfile")), "w"); fprintf(jfid,"{\n \"data\": [\n"); bool tbarcheck = false; for (int i = 0; i < centerArray.size(); i++) { if (!merged[i] /*|| kept[i]*/) { int mx = centerArray.z(i); int my = centerArray.y(i); int mz = centerArray.x(i); if (tbarcheck) { fprintf(jfid, ",\n { \n"); } else { fprintf(jfid, " { \n"); } fprintf(jfid,"\t \"T-bar\": { \n"); fprintf(jfid,"\t\t\"status\": \"working\", \n"); fprintf(jfid,"\t\t\"confidence\": 1.0, \n"); fprintf(jfid,"\t\t\"body ID\": -1, \n"); fprintf(jfid,"\t\t\"location\": [ \n"); fprintf(jfid,"\t\t %d, \n", mx); fprintf(jfid,"\t\t %d, \n", detected1->dim[1] - my); fprintf(jfid,"\t\t %d \n", mz); fprintf(jfid,"\t\t ] \n"); fprintf(jfid,"\t }, \n"); fprintf(jfid,"\t\"partners\": [ ]\n"); fprintf(jfid," } "); tbarcheck=true; } } fprintf(jfid,"\n ],\n"); fprintf(jfid," \"metadata\": {\n"); fprintf(jfid,"\t \"username\": \"dummy\",\n"); fprintf(jfid,"\t \"software version\": \"dummy\",\n"); fprintf(jfid,"\t \"description\": \"synapse annotations\",\n"); fprintf(jfid,"\t \"file version\": 1, \n"); fprintf(jfid,"\t \"software version\": \"dummy\",\n"); fprintf(jfid,"\t \"computer\": \"dummy\",\n"); fprintf(jfid,"\t \"date\": \"dummy\",\n"); fprintf(jfid,"\t \"session path\": \"dummy\",\n"); fprintf(jfid,"\t \"software\": \"dummy\"\n"); fprintf(jfid," }\n}"); fclose(jfid); } #endif #ifdef _TEST_ cout << "Testing hdf5 now ... " << endl; hid_t file_id; herr_t status; file_id = H5Fcreate("../../../data/test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); status = H5Fclose(file_id); hid_t dataset_id, dataspace_id; hsize_t dims[2]; file_id = H5Fcreate("../../../data/test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); dims[0] = 4; dims[1] = 6; dataspace_id = H5Screate_simple(2, dims, NULL); dataset_id = H5Dcreate(file_id, "/dset", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dclose(dataset_id); status = H5Sclose(dataspace_id); status = H5Fclose(file_id); int i, j, dset_data[4][6]; for (i = 0; i < 4; i++) { for (j = 0; j < 6; j++) { dset_data[i][j] = i * 6 + j + 1; } } file_id = H5Fopen("../../../data/test.h5", H5F_ACC_RDWR, H5P_DEFAULT); dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT); status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data); status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data); status = H5Dclose(dataset_id); status = H5Fclose(file_id); dims[0] = 2; dims[1] = 3; int data[6] = {1,2,3,4,5,6}; file_id = H5Fcreate("../../../data/test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); status = H5LTmake_dataset(file_id, "/dset", 2, dims, H5T_NATIVE_INT, data); status = H5Fclose(file_id); size_t nrow, n_values; file_id = H5Fopen("../../../data/test.h5", H5F_ACC_RDONLY, H5P_DEFAULT); status = H5LTread_dataset_int(file_id, "/dset", data); status = H5LTget_dataset_info(file_id, "/dset", dims, NULL, NULL); n_values = (size_t) (dims[0] * dims[1]); nrow = (size_t) dims[1]; cout << n_values << " " << nrow << endl; for (i = 0; i < n_values / nrow; i++) { for (j = 0; j < nrow; j++) { printf(" %d", data[i * nrow + j]); } printf("\n"); } status = H5Fclose(file_id); hid_t group_id; file_id = H5Fcreate("../../../data/test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); group_id = H5Gcreate(file_id, "/MyGroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Gclose(group_id); status = H5Fclose(file_id); hid_t group1_id, group2_id, group3_id; file_id = H5Fcreate("../../../data/test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); group1_id = H5Gcreate(file_id, "/MyGroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); group2_id = H5Gcreate(file_id, "/MyGroup/Group_A", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); group3_id = H5Gcreate(group1_id, "Group_B", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Gclose(group1_id); status = H5Gclose(group2_id); status = H5Gclose(group3_id); status = H5Fclose(file_id); int dset1_data[3][3], dset2_data[2][10]; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { dset1_data[i][j] = j + 1; } } for (i = 0; i < 2; i++) { for (j = 0; j < 10; j++) { dset2_data[i][j] = j + 1; } } file_id = H5Fopen("../../../data/test.h5", H5F_ACC_RDWR, H5P_DEFAULT); dims[0] = 3; dims[1] = 3; dataspace_id = H5Screate_simple(2, dims, NULL); dataset_id = H5Dcreate(file_id, "/MyGroup/dset1", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1_data); status = H5Sclose(dataspace_id); status = H5Dclose(dataset_id); group_id = H5Gopen(file_id, "/MyGroup/Group_A", H5P_DEFAULT); dims[0] = 2; dims[1] = 10; dataspace_id = H5Screate_simple(2, dims, NULL); dataset_id = H5Dcreate(group_id, "dset2", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_data); status = H5Sclose(dataspace_id); status = H5Gclose(group_id); status = H5Fclose(file_id); cout << "Done!" << endl; #endif return 0; }