├── .gitignore ├── .idea ├── artifacts │ └── CODEX_jar_with_dependencies_jar.xml ├── compiler.xml ├── encodings.xml ├── libraries │ ├── Maven__ch_qos_logback_logback_classic_1_1_1.xml │ ├── Maven__ch_qos_logback_logback_core_1_1_1.xml │ ├── Maven__colt_colt_1_2_0.xml │ ├── Maven__com_adobe_xmp_xmpcore_5_1_2.xml │ ├── Maven__com_beust_jcommander_1_27.xml │ ├── Maven__com_drewnoakes_metadata_extractor_2_6_2.xml │ ├── Maven__com_esotericsoftware_kryo_kryo_2_24_0.xml │ ├── Maven__com_esotericsoftware_minlog_minlog_1_2.xml │ ├── Maven__com_github_jai_imageio_jai_imageio_core_1_3_1.xml │ ├── Maven__com_github_rwl_AMDJ_1_0_1.xml │ ├── Maven__com_github_rwl_BTFJ_1_0_1.xml │ ├── Maven__com_github_rwl_COLAMDJ_1_0_1.xml │ ├── Maven__com_github_rwl_JKLU_1_0_0.xml │ ├── Maven__com_google_code_gson_gson_2_7.xml │ ├── Maven__com_google_guava_guava_17_0.xml │ ├── Maven__com_googlecode_gentyref_gentyref_1_1_0.xml │ ├── Maven__com_googlecode_netlib_java_netlib_java_0_9_3.xml │ ├── Maven__com_jgoodies_jgoodies_common_1_7_0.xml │ ├── Maven__com_jgoodies_jgoodies_forms_1_7_2.xml │ ├── Maven__com_opencsv_opencsv_3_3.xml │ ├── Maven__com_sun_media_jai_codec_1_1_3.xml │ ├── Maven__commons_io_commons_io_2_5.xml │ ├── Maven__concurrent_concurrent_1_3_4.xml │ ├── Maven__csv2fcs_csv2fcs_4_0.xml │ ├── Maven__edu_mines_mines_jtk_20151125.xml │ ├── Maven__edu_ucar_udunits_4_3_18.xml │ ├── Maven__gov_nist_math_jama_1_0_3.xml │ ├── Maven__joda_time_joda_time_2_2.xml │ ├── Maven__junit_junit_4_10.xml │ ├── Maven__mpicbg_mpicbg_1_1_1.xml │ ├── Maven__myssj_myssj_2_5.xml │ ├── Maven__net_imagej_ij1_patcher_0_12_2.xml │ ├── Maven__net_imagej_ij_1_51g.xml │ ├── Maven__net_imagej_imagej_common_0_20_1.xml │ ├── Maven__net_imglib2_imglib2_3_2_1.xml │ ├── Maven__net_imglib2_imglib2_ij_2_0_0_beta_35.xml │ ├── Maven__net_sf_trove4j_trove4j_3_0_3.xml │ ├── Maven__net_sourceforge_csparsej_csparsej_1_1_1.xml │ ├── Maven__net_sourceforge_f2j_arpack_combined_all_0_1.xml │ ├── Maven__net_sourceforge_jplasma_core_lapack_0_1.xml │ ├── Maven__net_sourceforge_jplasma_jplasma_1_2_0.xml │ ├── Maven__net_sourceforge_jtransforms_jtransforms_2_4_0.xml │ ├── Maven__net_sourceforge_parallelcolt_optimization_1_0.xml │ ├── Maven__net_sourceforge_parallelcolt_parallelcolt_0_10_0.xml │ ├── Maven__ome_formats_api_5_3_2.xml │ ├── Maven__ome_formats_bsd_5_3_2.xml │ ├── Maven__ome_jai_imageio_5_3_2.xml │ ├── Maven__ome_turbojpeg_5_3_2.xml │ ├── Maven__org_apache_commons_commons_lang3_3_3_2.xml │ ├── Maven__org_beanshell_bsh_2_0b4.xml │ ├── Maven__org_bushe_eventbus_1_4.xml │ ├── Maven__org_bytedeco_javacpp_1_0.xml │ ├── Maven__org_gephi_gephi_toolkit_0_9_2.xml │ ├── Maven__org_hamcrest_hamcrest_core_1_1.xml │ ├── Maven__org_javassist_javassist_3_16_1_GA.xml │ ├── Maven__org_jfree_jcommon_1_0_23.xml │ ├── Maven__org_jfree_jfreechart_1_0_19.xml │ ├── Maven__org_nolanlab_GlassComponents_1_0.xml │ ├── Maven__org_nolanlab_sandbox_1_0.xml │ ├── Maven__org_objenesis_objenesis_2_1.xml │ ├── Maven__org_openmicroscopy_ome_common_5_3_1.xml │ ├── Maven__org_openmicroscopy_ome_xml_5_3_1.xml │ ├── Maven__org_openmicroscopy_specification_5_3_1.xml │ ├── Maven__org_perf4j_perf4j_0_9_13.xml │ ├── Maven__org_scijava_native_lib_loader_2_1_4.xml │ ├── Maven__org_scijava_scijava_common_2_53_0.xml │ ├── Maven__org_scijava_vecmath_1_6_0_scijava_2.xml │ ├── Maven__org_slf4j_slf4j_api_1_7_6.xml │ ├── Maven__org_testng_testng_6_8.xml │ ├── Maven__org_yaml_snakeyaml_1_6.xml │ ├── Maven__sc_fiji_Fiji_Plugins_3_1_0.xml │ ├── Maven__sc_fiji_Image_5D_1_2_6.xml │ ├── Maven__sc_fiji_fiji_lib_2_1_1.xml │ ├── Maven__sc_fiji_imagescience_3_0_0.xml │ ├── Maven__sc_fiji_legacy_imglib1_1_1_6.xml │ └── Maven__xerces_xercesImpl_2_8_1.xml ├── misc.xml ├── modules.xml ├── uiDesigner.xml ├── vcs.xml └── workspace.xml ├── CODEX.iml ├── LICENSE ├── README.md ├── lib ├── jpeg62.dll ├── libtiff3.dll ├── tiffcp.exe └── zlib1.dll ├── out └── artifacts │ └── CODEX_jar │ ├── release notes.txt │ └── startSegm.bat ├── pom.xml ├── readme-images ├── File_structure_naming.png ├── Folder_structure_naming.png ├── channelnames.png ├── exposure_times.png └── processe_structure.png ├── src ├── main │ ├── java │ │ ├── META-INF │ │ │ └── MANIFEST.MF │ │ └── org │ │ │ └── nolanlab │ │ │ └── codex │ │ │ ├── DefaultOptionPane.java │ │ │ ├── OkayMockOptionPane.java │ │ │ ├── OptionPane.java │ │ │ ├── clustering │ │ │ ├── ImportConfigFrm.java │ │ │ └── frmCluster.java │ │ │ ├── segm │ │ │ ├── Cell.java │ │ │ ├── CellViewer.java │ │ │ ├── ConcatenateCSVCodexWeb.java │ │ │ ├── ConcatenateResults.java │ │ │ ├── CovarianceMatrix.java │ │ │ ├── FFTFilter.java │ │ │ ├── GMM.java │ │ │ ├── GrahamScan.java │ │ │ ├── Kernel3D.java │ │ │ ├── MahalonobisDistance.java │ │ │ ├── Main.java │ │ │ ├── MakeFCS.java │ │ │ ├── MatrixOp.java │ │ │ ├── MaximaFinder3D.java │ │ │ ├── Neighborhood.java │ │ │ ├── Point2D.java │ │ │ ├── Point3D.java │ │ │ ├── ProfileAverager.java │ │ │ ├── RegionImageWriter.java │ │ │ ├── SegConfigParam.java │ │ │ ├── SegmConfigFrm.java │ │ │ ├── SegmMain.java │ │ │ ├── Segmentation.java │ │ │ ├── SegmentedObject.java │ │ │ ├── StackNormalizer.java │ │ │ ├── TIFFtoJPEG.java │ │ │ ├── XMLParse.java │ │ │ └── newXMLDocument.xml │ │ │ ├── toolkit │ │ │ ├── CellTypeCooccurence.java │ │ │ ├── DelaunayGraph.java │ │ │ ├── FeaturizeCellTypesKNN.java │ │ │ ├── GrahamScan.java │ │ │ ├── Matrix.java │ │ │ ├── Point2D.java │ │ │ ├── Strelochki.java │ │ │ ├── Toolkit.java │ │ │ ├── VerifyDelaunayGraph.java │ │ │ └── circularlayout │ │ │ │ ├── Bundle.java │ │ │ │ ├── CircleLayout.java │ │ │ │ ├── CircleLayoutBuilder.java │ │ │ │ ├── LayoutHelper.java │ │ │ │ ├── NodeComparator.java │ │ │ │ └── TempLayoutData.java │ │ │ ├── upload │ │ │ ├── driffta │ │ │ │ ├── BestFocus.java │ │ │ │ ├── DeconvolutionInterlockDispatcher.java │ │ │ │ ├── DeconvolutionTask.java │ │ │ │ ├── Deconvolve_mult.java │ │ │ │ ├── Driffta.java │ │ │ │ ├── Driftcomp.java │ │ │ │ ├── DriftcompInterlockDispatcher.java │ │ │ │ ├── Find_focused_slices.java │ │ │ │ ├── MakeMontage.java │ │ │ │ ├── OpenImage.java │ │ │ │ ├── RescaleImages.java │ │ │ │ ├── SessionIdentifierGenerator.java │ │ │ │ └── SimpleImageInfo.java │ │ │ ├── gui │ │ │ │ ├── FieldValidator.java │ │ │ │ ├── GuiActionListener.java │ │ │ │ ├── GuiHelper.java │ │ │ │ ├── GuiWorkers.java │ │ │ │ ├── NewGUI.form │ │ │ │ ├── NewGUI.java │ │ │ │ ├── SystemInfo.java │ │ │ │ ├── TextAreaOutputStream.java │ │ │ │ └── WorkerHelper.java │ │ │ ├── legacy │ │ │ │ ├── ExperimentView.java │ │ │ │ ├── ProcessingOptionsView.java │ │ │ │ └── frmMain.java │ │ │ ├── model │ │ │ │ ├── Experiment.java │ │ │ │ ├── Metadata.java │ │ │ │ └── ProcessingOptions.java │ │ │ └── scope │ │ │ │ ├── Keyence.java │ │ │ │ ├── Microscope.java │ │ │ │ ├── MicroscopeFactory.java │ │ │ │ ├── MicroscopeTypeEnum.java │ │ │ │ └── Zeiss.java │ │ │ └── utils │ │ │ ├── EncryptUtils.java │ │ │ ├── TileObject.java │ │ │ ├── logger.java │ │ │ └── util.java │ └── resources │ │ ├── application.properties │ │ └── resources │ │ └── codex │ │ ├── codex-icon-circle-256x256.png │ │ ├── codex-logo-horizontal-1920x665.png │ │ ├── logo.png │ │ └── nolanlab-logo.png └── test │ ├── java │ └── com │ │ └── akoya │ │ └── codex │ │ ├── TestHelper.java │ │ ├── clustering │ │ └── ClusteringTest.java │ │ ├── segm │ │ └── SegmMainTest.java │ │ └── upload │ │ └── ProcessorTest.java │ └── resources │ └── testng-all.xml └── target ├── classes └── org │ └── nolanlab │ └── codex │ ├── DefaultOptionPane.class │ ├── OkayMockOptionPane.class │ ├── OptionPane.class │ ├── clustering │ ├── ImportConfigFrm$1.class │ ├── ImportConfigFrm$2.class │ ├── ImportConfigFrm.class │ ├── frmCluster$1.class │ ├── frmCluster$2.class │ ├── frmCluster$3.class │ └── frmCluster.class │ ├── segm │ ├── Cell.class │ ├── CellViewer.class │ ├── ConcatenateCSVCodexWeb$1.class │ ├── ConcatenateCSVCodexWeb.class │ ├── ConcatenateResults.class │ ├── CovarianceMatrix.class │ ├── FFTFilter$1.class │ ├── FFTFilter.class │ ├── GMM$CellBubble.class │ ├── GMM.class │ ├── GrahamScan.class │ ├── Kernel3D.class │ ├── MahalonobisDistance.class │ ├── Main.class │ ├── MakeFCS$DP.class │ ├── MakeFCS.class │ ├── MatrixOp.class │ ├── MaximaFinder3D$1.class │ ├── MaximaFinder3D$2.class │ ├── MaximaFinder3D.class │ ├── Neighborhood$1.class │ ├── Neighborhood.class │ ├── Point2D$1.class │ ├── Point2D$Atan2Order.class │ ├── Point2D$DistanceToOrder.class │ ├── Point2D$PolarOrder.class │ ├── Point2D$ROrder.class │ ├── Point2D$XOrder.class │ ├── Point2D$YOrder.class │ ├── Point2D.class │ ├── Point3D.class │ ├── ProfileAverager.class │ ├── RegionImageWriter.class │ ├── SegConfigParam.class │ ├── SegmConfigFrm$1.class │ ├── SegmConfigFrm$2.class │ ├── SegmConfigFrm.class │ ├── SegmMain$1.class │ ├── SegmMain$2.class │ ├── SegmMain$3.class │ ├── SegmMain$4.class │ ├── SegmMain$5.class │ ├── SegmMain.class │ ├── Segmentation$1.class │ ├── Segmentation.class │ ├── SegmentedObject.class │ ├── StackNormalizer.class │ ├── TIFFtoJPEG$1.class │ ├── TIFFtoJPEG.class │ └── XMLParse.class │ ├── toolkit │ ├── CellTypeCooccurence.class │ ├── DelaunayGraph$1.class │ ├── DelaunayGraph$2.class │ ├── DelaunayGraph.class │ ├── FeaturizeCellTypesKNN$1.class │ ├── FeaturizeCellTypesKNN$2.class │ ├── FeaturizeCellTypesKNN$Point3D.class │ ├── FeaturizeCellTypesKNN.class │ ├── GrahamScan.class │ ├── Matrix.class │ ├── Point2D$1.class │ ├── Point2D$Atan2Order.class │ ├── Point2D$DistanceToOrder.class │ ├── Point2D$PolarOrder.class │ ├── Point2D$ROrder.class │ ├── Point2D$XOrder.class │ ├── Point2D$YOrder.class │ ├── Point2D.class │ ├── Strelochki.class │ ├── Toolkit$1.class │ ├── Toolkit$JoinEntry.class │ ├── Toolkit.class │ ├── VerifyDelaunayGraph.class │ └── circularlayout │ │ ├── Bundle.class │ │ ├── CircleLayout.class │ │ ├── CircleLayoutBuilder$CircleLayoutUI.class │ │ ├── CircleLayoutBuilder.class │ │ ├── LayoutHelper$1.class │ │ ├── LayoutHelper$CircularDirection.class │ │ ├── LayoutHelper.class │ │ ├── NodeComparator$1.class │ │ ├── NodeComparator$CompareType.class │ │ ├── NodeComparator.class │ │ └── TempLayoutData.class │ └── upload │ └── driffta │ ├── BestFocus.class │ ├── DeconvolutionInterlockDispatcher.class │ ├── DeconvolutionTask.class │ ├── Deconvolve_mult$1.class │ ├── Deconvolve_mult$2.class │ ├── Deconvolve_mult.class │ ├── Driffta.class │ ├── Driftcomp.class │ ├── DriftcompInterlockDispatcher.class │ ├── Find_focused_slices.class │ ├── MakeMontage.class │ ├── OpenImage.class │ ├── RescaleImages$1.class │ ├── RescaleImages.class │ ├── SessionIdentifierGenerator.class │ └── SimpleImageInfo.class ├── lib ├── jpeg62.dll ├── libtiff3.dll ├── tiffcp.exe └── zlib1.dll └── test-classes ├── com └── akoya │ └── codex │ ├── TestHelper.class │ ├── clustering │ └── ClusteringTest.class │ └── segm │ └── SegmMainTest.class ├── org └── nolanlab │ └── codex │ └── ProcessorTest.class └── testng-all.xml /.gitignore: -------------------------------------------------------------------------------- 1 | *.xml 2 | target 3 | **/target 4 | 5 | ### IntelliJ IDEA ### 6 | .idea 7 | **/.idea 8 | *.iws 9 | *.iml 10 | *.ipr 11 | .idea 12 | *.iws 13 | *.iml 14 | *.ipr 15 | *.jar 16 | 17 | .idea/workspace.xml 18 | *.xml 19 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__colt_colt_1_2_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_adobe_xmp_xmpcore_5_1_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_beust_jcommander_1_27.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_drewnoakes_metadata_extractor_2_6_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_esotericsoftware_kryo_kryo_2_24_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_esotericsoftware_minlog_minlog_1_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_github_jai_imageio_jai_imageio_core_1_3_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_github_rwl_AMDJ_1_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_github_rwl_BTFJ_1_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_github_rwl_COLAMDJ_1_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_github_rwl_JKLU_1_0_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_google_code_gson_gson_2_7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_google_guava_guava_17_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_googlecode_gentyref_gentyref_1_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_googlecode_netlib_java_netlib_java_0_9_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_jgoodies_jgoodies_common_1_7_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_jgoodies_jgoodies_forms_1_7_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_opencsv_opencsv_3_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_sun_media_jai_codec_1_1_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__commons_io_commons_io_2_5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__concurrent_concurrent_1_3_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__csv2fcs_csv2fcs_4_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__edu_mines_mines_jtk_20151125.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__edu_ucar_udunits_4_3_18.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__gov_nist_math_jama_1_0_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__joda_time_joda_time_2_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__junit_junit_4_10.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__mpicbg_mpicbg_1_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__myssj_myssj_2_5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_imagej_ij1_patcher_0_12_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_imagej_ij_1_51g.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_imagej_imagej_common_0_20_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_imglib2_imglib2_3_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_imglib2_imglib2_ij_2_0_0_beta_35.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_sf_trove4j_trove4j_3_0_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_sourceforge_csparsej_csparsej_1_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_sourceforge_f2j_arpack_combined_all_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_sourceforge_jplasma_core_lapack_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_sourceforge_jplasma_jplasma_1_2_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_sourceforge_jtransforms_jtransforms_2_4_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_sourceforge_parallelcolt_optimization_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_sourceforge_parallelcolt_parallelcolt_0_10_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__ome_formats_api_5_3_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__ome_formats_bsd_5_3_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__ome_jai_imageio_5_3_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__ome_turbojpeg_5_3_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_apache_commons_commons_lang3_3_3_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_beanshell_bsh_2_0b4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_bushe_eventbus_1_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_bytedeco_javacpp_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_gephi_gephi_toolkit_0_9_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_javassist_javassist_3_16_1_GA.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_jfree_jcommon_1_0_23.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_jfree_jfreechart_1_0_19.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_nolanlab_GlassComponents_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_nolanlab_sandbox_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_openmicroscopy_ome_common_5_3_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_openmicroscopy_ome_xml_5_3_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_openmicroscopy_specification_5_3_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_perf4j_perf4j_0_9_13.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_scijava_native_lib_loader_2_1_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_scijava_scijava_common_2_53_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_scijava_vecmath_1_6_0_scijava_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_6.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_testng_testng_6_8.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_yaml_snakeyaml_1_6.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__sc_fiji_Fiji_Plugins_3_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__sc_fiji_Image_5D_1_2_6.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__sc_fiji_fiji_lib_2_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__sc_fiji_imagescience_3_0_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__sc_fiji_legacy_imglib1_1_1_6.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__xerces_xercesImpl_2_8_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Stanford University 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/jpeg62.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/lib/jpeg62.dll -------------------------------------------------------------------------------- /lib/libtiff3.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/lib/libtiff3.dll -------------------------------------------------------------------------------- /lib/tiffcp.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/lib/tiffcp.exe -------------------------------------------------------------------------------- /lib/zlib1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/lib/zlib1.dll -------------------------------------------------------------------------------- /out/artifacts/CODEX_jar/release notes.txt: -------------------------------------------------------------------------------- 1 | Segmentation supports printing out comp matrices 2 | Segmentation now scales min and max thresholds to the absolute bit depth of the image -------------------------------------------------------------------------------- /out/artifacts/CODEX_jar/startSegm.bat: -------------------------------------------------------------------------------- 1 | java -Xmx64G -cp "./CODEX.jar" org.nolanlab.codex.segm.SegmMain 2 | pause -------------------------------------------------------------------------------- /readme-images/File_structure_naming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/readme-images/File_structure_naming.png -------------------------------------------------------------------------------- /readme-images/Folder_structure_naming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/readme-images/Folder_structure_naming.png -------------------------------------------------------------------------------- /readme-images/channelnames.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/readme-images/channelnames.png -------------------------------------------------------------------------------- /readme-images/exposure_times.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/readme-images/exposure_times.png -------------------------------------------------------------------------------- /readme-images/processe_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/readme-images/processe_structure.png -------------------------------------------------------------------------------- /src/main/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: org.nolanlab.codex.upload.legacy.frmMain 3 | 4 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/DefaultOptionPane.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | 6 | /** 7 | * @author Vishal 8 | */ 9 | public class DefaultOptionPane implements OptionPane { 10 | @Override 11 | public int showConfirmDialog(Component parentComponent, 12 | Object message, String title, int optionType) { 13 | 14 | return JOptionPane.showConfirmDialog(parentComponent,message,title,optionType); 15 | } 16 | } -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/OkayMockOptionPane.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | 6 | /** 7 | * @author Vishal 8 | */ 9 | public class OkayMockOptionPane extends DefaultOptionPane { 10 | 11 | //MockOptionPane is just an abstract class implementing default methods from OptionPane 12 | @Override 13 | public int showConfirmDialog(Component parentComponent, Object message, String title, int optionType) { 14 | return JOptionPane.OK_OPTION; 15 | } 16 | } -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/OptionPane.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex; 2 | 3 | import java.awt.*; 4 | 5 | /** 6 | * @author Vishal 7 | */ 8 | public interface OptionPane { 9 | 10 | int showConfirmDialog(Component parentComponent, 11 | Object message, String title, int optionType); 12 | } -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/Cell.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.segm; 7 | 8 | /** 9 | * 10 | * @author Nikolay 11 | */ 12 | public class Cell { 13 | 14 | private SegmentedObject segmentedObject; 15 | private int id; 16 | private double[] expressionVector; 17 | private int tile; 18 | private double[] neighFeaturizationVec; 19 | 20 | public Cell(int id, SegmentedObject segmentedObject, int tile, double[] expressionVector, double[] neighFeaturizationVec) { 21 | this.segmentedObject = segmentedObject; 22 | this.id = id; 23 | this.expressionVector = expressionVector; 24 | this.tile = tile; 25 | this.neighFeaturizationVec = neighFeaturizationVec; 26 | } 27 | 28 | public double[] getExpressionVector() { 29 | return expressionVector; 30 | } 31 | 32 | public double[] getNeighFeaturizationVec() { 33 | return neighFeaturizationVec; 34 | } 35 | 36 | 37 | 38 | public int getTile() { 39 | return tile; 40 | } 41 | 42 | @Override 43 | public int hashCode() { 44 | return id; 45 | } 46 | 47 | public int getId() { 48 | return id; 49 | } 50 | 51 | public SegmentedObject getSegmentedObject() { 52 | return segmentedObject; 53 | } 54 | 55 | @Override 56 | public boolean equals(Object obj) { 57 | if (!(obj instanceof Cell)) { 58 | return false; 59 | } 60 | return this.id == ((Cell) obj).id; 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/CellViewer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.segm; 7 | 8 | import ij.ImageJ; 9 | 10 | import javax.swing.*; 11 | 12 | /** 13 | * 14 | * @author Nikolay Samusik 15 | */ 16 | public class CellViewer { 17 | 18 | private final ImageJ instance = new ImageJ(); 19 | 20 | public CellViewer() { 21 | JFileChooser jfc = new JFileChooser(); 22 | jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 23 | if (jfc.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) { 24 | return; 25 | } 26 | 27 | } 28 | //А.У.Е. арестанты 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/ConcatenateCSVCodexWeb.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.segm; 2 | 3 | import net.sf.flowcyt.gp.module.csv2fcs.CSV2FCSApp; 4 | 5 | import java.io.*; 6 | 7 | /* 8 | * To change this license header, choose License Headers in Project Properties. 9 | * To change this template file, choose Tools | Templates 10 | * and open the template in the editor. 11 | */ 12 | 13 | /** 14 | * 15 | * @author Nikolay Samusik 16 | */ 17 | public class ConcatenateCSVCodexWeb { 18 | 19 | public static void main(String[] args) throws IOException { 20 | File dir = new File(args[0]); 21 | final File out = new File(args[0] + File.separator + "compensated_all.csv"); 22 | BufferedWriter bw = null; 23 | 24 | 25 | for (File f : dir.listFiles(new FileFilter() { 26 | @Override 27 | public boolean accept(File f) { 28 | if(f == null) return false; 29 | return (f.getName().startsWith("compensated") && f.getName().endsWith(".csv")); 30 | } 31 | })) { 32 | BufferedReader br = new BufferedReader(new FileReader(f)); 33 | if (bw == null) { 34 | bw = new BufferedWriter(new FileWriter(out)); 35 | 36 | String s2 = br.readLine(); 37 | if(s2==null){ 38 | continue; 39 | } 40 | String [] s = s2.split(","); 41 | 42 | String newHed = ""; 43 | 44 | for (int i = 0; i < s.length; i++) { 45 | if(!s[i].contains(":")){ 46 | newHed += s[i]+":"+s[i]+","; 47 | }else{ 48 | newHed = s[i] +","; 49 | } 50 | } 51 | 52 | bw.write(newHed + "\n"); 53 | } else { 54 | br.readLine(); 55 | } 56 | String l = null; 57 | while ((l = br.readLine()) != null) { 58 | bw.write(l); 59 | bw.write("\n"); 60 | } 61 | } 62 | if (bw != null) { 63 | bw.flush(); 64 | bw.close(); 65 | } 66 | 67 | System.out.print("Creating FCS files"); 68 | 69 | CSV2FCSApp.main(new String[]{"-InputFile:" + out.getAbsolutePath() + ""}); 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/CovarianceMatrix.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this template, choose Tools | Templates 3 | * and open the template in the editor. 4 | */ 5 | package org.nolanlab.codex.segm; 6 | 7 | /** 8 | * 9 | * @author Zina 10 | */ 11 | public class CovarianceMatrix { 12 | 13 | //Given a 2D array representing a data matrix, calculates the covariance matrix. 14 | public static double[][] covarianceMatrix(double[][] dataTable) { 15 | if (dataTable == null) { 16 | return null; 17 | } 18 | int dim = dataTable[0].length; 19 | double[][] covarianceMatrix = new double[dim][dim]; 20 | double[][] flippedMatrix = flipMatrix(dataTable); 21 | for (int i = 0; i < dim; i++) { 22 | for (int j = i; j < dim; j++) { 23 | double[] parameter1 = flippedMatrix[i]; 24 | double[] parameter2 = flippedMatrix[j]; 25 | double covariance = calculateCovariance(parameter1, parameter2); 26 | covarianceMatrix[i][j] = covariance; 27 | covarianceMatrix[j][i] = covariance; 28 | } 29 | } 30 | return covarianceMatrix; 31 | } 32 | 33 | //Given a 2D array representing a data table, flips the matrix representing that table. 34 | private static double[][] flipMatrix(double[][] dataTable) { 35 | if (dataTable == null) { 36 | return null; 37 | } 38 | double[][] flippedMatrix = new double[dataTable[0].length][dataTable.length]; 39 | for (int i = 0; i < dataTable.length; i++) { 40 | for (int j = 0; j < dataTable[i].length; j++) { 41 | double datapoint = dataTable[i][j]; 42 | flippedMatrix[j][i] = datapoint; 43 | } 44 | } 45 | return flippedMatrix; 46 | } 47 | 48 | //Given two arrays of parameter values, calculates covariance for these two parameters. 49 | private static double calculateCovariance(double[] parameter1, double[] parameter2) { 50 | if ((parameter1 == null) || (parameter2 == null) || (parameter1.length != parameter2.length)) { 51 | throw new IllegalArgumentException("You gave me bad stuff"); 52 | } 53 | double covariance = 0; 54 | double mean1 = (double) calculateMean(parameter1); 55 | double mean2 = (double) calculateMean(parameter2); 56 | for (int i = 0; i < parameter1.length; i++) { 57 | double componenti = ((double) parameter1[i] - mean1) * ((double) parameter2[i] - mean2); 58 | covariance += componenti; 59 | } 60 | covariance /= (parameter1.length - 1); 61 | return covariance; 62 | } 63 | 64 | //Given an array of parameter values, calculates mean for that parameter. 65 | private static double calculateMean(double[] parameter) { 66 | if (parameter == null) { 67 | return 0; 68 | } 69 | double sum = 0; 70 | for (int i = 0; i < parameter.length; i++) { 71 | sum += (double) parameter[i]; 72 | } 73 | double mean = sum / parameter.length; 74 | return mean; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/GMM.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.segm; 7 | 8 | import cern.colt.matrix.DoubleMatrix2D; 9 | import cern.colt.matrix.impl.DenseDoubleMatrix1D; 10 | import cern.colt.matrix.impl.DenseDoubleMatrix2D; 11 | import cern.colt.matrix.linalg.Algebra; 12 | 13 | import ij.ImagePlus; 14 | 15 | import java.util.Set; 16 | import java.util.concurrent.ConcurrentSkipListSet; 17 | 18 | /** 19 | * 20 | * @author Nikolay 21 | */ 22 | public class GMM { 23 | 24 | /** 25 | * 26 | * @param in - denoised image stack to be segmented 27 | * @param radius - search radius for local maxima 28 | * @param maxCutoff - pixels above or equal to this intensity won't be 29 | * considered. intensity is relative to the dynamic range of the image 30 | * (2^bits_per_pixel). Possible range of values: [0,1] Default: 0.99 31 | * @param minCutoff - below above or equal to this intensity won't be 32 | * considered. intensity is relative to the dynamic range of the image 33 | * (2^bits_per_pixel). Possible range of values: [0,1]. Default: 0.1 34 | * @param relativeCutoff - Limits the size of the region by defining the 35 | * high-pass cutoff for the pixel intensity, relative to the intensity of 36 | * the local maximum. Default: 0.4 37 | * @param showImage - flag that controls whether the segmentation result 38 | * will be shown. Setting it to zero makes things faster 39 | * @return 40 | */ 41 | public static SegmentedObject[] findRegionsByIntensityGradient(final ImagePlus in, int radius, double maxCutoff, double minCutoff, double relativeCutoff, boolean showImage, final double nuclMaskCutoff, final int MAX_OPT_CYCLES) { 42 | final int w = in.getWidth(); 43 | final int h = in.getHeight(); 44 | final int d = in.getStackSize(); 45 | 46 | 47 | int initNumCells = Math.max(10, (int) ((w * h) / (Math.PI * (radius * radius)))); //Assuming that the tile is completely occupied by cells; 48 | 49 | int cellsPerRow = w / radius; 50 | int cellsPerCol = h / radius; 51 | 52 | int stepX = w / cellsPerRow; 53 | int stepY = h / cellsPerCol; 54 | 55 | Set bubbli = new ConcurrentSkipListSet<>(); 56 | 57 | for (int i = 0; i < initNumCells; i++) { 58 | 59 | int x = (i % cellsPerRow) * stepX; 60 | int y = (i / cellsPerRow) * stepY; 61 | 62 | DenseDoubleMatrix2D cov = new DenseDoubleMatrix2D(3, 3); 63 | 64 | for (int j = 0; j < 3; j++) { 65 | cov.setQuick(j, j, 1); 66 | } 67 | 68 | bubbli.add(new CellBubble(new DenseDoubleMatrix1D(new double[]{x, y, d/2.0}), cov)); 69 | 70 | } 71 | 72 | //Now, optimization 73 | 74 | 75 | 76 | //init CMs: radius, intensity 77 | //if CM intensity drops below a threshold, eliminate it from the model 78 | //merge CMs based on midpoint density 79 | //likelihood is calculated on max, not sum (non-overlapping clustering) 80 | //overall model fitness is calculated using a residue, not likelihood (better penatry for unaccounted intensity) 81 | //membrane intensity on all channels is taken into the penalty 82 | //System.out.println("Filtered maxima: " + maxima.length); 83 | return null;//out.toArray(new SegmentedObject[out.size()]); 84 | } 85 | 86 | private static class CellBubble { 87 | 88 | public DenseDoubleMatrix2D covMtx; 89 | public DenseDoubleMatrix1D center; 90 | private DoubleMatrix2D invCovMtx; 91 | 92 | double wIntensity; 93 | 94 | public CellBubble(DenseDoubleMatrix1D center, DenseDoubleMatrix2D covMtx) { 95 | 96 | this.covMtx = covMtx; 97 | this.center = center; 98 | this.invCovMtx = Algebra.DEFAULT.inverse(covMtx); 99 | } 100 | 101 | public double distTo(double[] x) { 102 | DenseDoubleMatrix1D diff = new DenseDoubleMatrix1D(x.length); 103 | for (int i = 0; i < x.length; i++) { 104 | diff.setQuick(i, x[i] - center.getQuick(i)); 105 | } 106 | double dist = Algebra.DEFAULT.mult(diff, Algebra.DEFAULT.mult(invCovMtx, diff)); 107 | return Math.sqrt(dist); 108 | } 109 | 110 | } 111 | 112 | } 113 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/GrahamScan.java: -------------------------------------------------------------------------------- 1 | /** 2 | * **************************************************************************** 3 | * Compilation: javac GrahamaScan.java 4 | * Execution: java GrahamScan < input.txt 5 | * Dependencies: Point2D.java 6 | * 7 | * Create points from standard input and compute the convex hull using 8 | * Graham scan algorithm. 9 | * 10 | * May be floating-point issues if x- and y-coordinates are not integers. 11 | * 12 | ***************************************************************************** 13 | */ 14 | package org.nolanlab.codex.segm; 15 | 16 | import java.util.Arrays; 17 | import java.util.Stack; 18 | 19 | /** 20 | * The GrahamScan data type provides methods for computing the convex 21 | * hull of a set of N points in the plane. 22 | *

23 | * The implementation uses the Graham-Scan convex hull algorithm. It runs in 24 | * O(N log N) time in the worst case and uses O(N) 25 | * extra memory. 26 | *

27 | * For additional documentation, see 28 | * Section 9.9 of 29 | * Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne. 30 | * 31 | * @author Robert Sedgewick 32 | * @author Kevin Wayne 33 | */ 34 | public class GrahamScan { 35 | 36 | private Stack hull = new Stack(); 37 | 38 | /** 39 | * Computes the convex hull of the specified array of points. 40 | * 41 | * @param pts the array of points 42 | * @throws NullPointerException if points is null or if 43 | * any entry in points[] is null 44 | */ 45 | public GrahamScan(Point2D[] pts) { 46 | 47 | // defensive copy 48 | int N = pts.length; 49 | Point2D[] points = new Point2D[N]; 50 | for (int i = 0; i < N; i++) { 51 | points[i] = pts[i]; 52 | } 53 | 54 | // preprocess so that points[0] has lowest y-coordinate; break ties by x-coordinate 55 | // points[0] is an extreme point of the convex hull 56 | // (alternatively, could do easily in linear time) 57 | Arrays.sort(points); 58 | 59 | // sort by polar angle with respect to base point points[0], 60 | // breaking ties by distance to points[0] 61 | Arrays.sort(points, 1, N, points[0].polarOrder()); 62 | 63 | hull.push(points[0]); // p[0] is first extreme point 64 | 65 | // find index k1 of first point not equal to points[0] 66 | int k1; 67 | for (k1 = 1; k1 < N; k1++) { 68 | if (!points[0].equals(points[k1])) { 69 | break; 70 | } 71 | } 72 | if (k1 == N) { 73 | return; // all points equal 74 | } 75 | // find index k2 of first point not collinear with points[0] and points[k1] 76 | int k2; 77 | for (k2 = k1 + 1; k2 < N; k2++) { 78 | if (Point2D.ccw(points[0], points[k1], points[k2]) != 0) { 79 | break; 80 | } 81 | } 82 | hull.push(points[k2 - 1]); // points[k2-1] is second extreme point 83 | 84 | // Graham scan; note that points[N-1] is extreme point different from points[0] 85 | for (int i = k2; i < N; i++) { 86 | Point2D top = hull.pop(); 87 | while (Point2D.ccw(hull.peek(), top, points[i]) <= 0) { 88 | top = hull.pop(); 89 | } 90 | hull.push(top); 91 | hull.push(points[i]); 92 | } 93 | 94 | assert isConvex(); 95 | } 96 | 97 | /** 98 | * Returns the extreme points on the convex hull in counterclockwise order. 99 | * 100 | * @return the extreme points on the convex hull in counterclockwise order 101 | */ 102 | public Iterable hull() { 103 | Stack s = new Stack(); 104 | for (Point2D p : hull) { 105 | s.push(p); 106 | } 107 | return s; 108 | } 109 | 110 | // check that boundary of hull is strictly convex 111 | private boolean isConvex() { 112 | int N = hull.size(); 113 | if (N <= 2) { 114 | return true; 115 | } 116 | 117 | Point2D[] points = new Point2D[N]; 118 | int n = 0; 119 | for (Point2D p : hull()) { 120 | points[n++] = p; 121 | } 122 | 123 | for (int i = 0; i < N; i++) { 124 | if (Point2D.ccw(points[i], points[(i + 1) % N], points[(i + 2) % N]) <= 0) { 125 | return false; 126 | } 127 | } 128 | return true; 129 | } 130 | 131 | } 132 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/Kernel3D.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.segm; 7 | 8 | import ij.ImageStack; 9 | 10 | /** 11 | * 12 | * @author Nikolay 13 | */ 14 | public class Kernel3D { 15 | 16 | double[][][] weightMatrix; 17 | int[] center; 18 | int w, d, h; 19 | 20 | public Kernel3D(int w, int h, int d) { 21 | this.w = w; 22 | this.d = d; 23 | this.h = h; 24 | weightMatrix = new double[w][h][d]; 25 | 26 | center = new int[]{w / 2, h / 2, d / 2}; 27 | double[] sigmas = new double[]{w / 6.0, h / 6.0, d / 6.0}; 28 | for (int z = 0; z < d; z++) { 29 | for (int x = 0; x < w; x++) { 30 | for (int y = 0; y < h; y++) { 31 | double sqdist = Math.pow((x - center[0]) / sigmas[0], 2) + Math.pow((y - center[1]) / sigmas[1], 2) + Math.pow((z - center[2]) / sigmas[2], 2); 32 | weightMatrix[x][y][z] = sqdist < 9 ? (Math.exp(-sqdist / 2.0)) : 0;// + (Math.exp(-Math.abs(sqdist) / 2.0))*0.3; 33 | } 34 | } 35 | } 36 | } 37 | 38 | public int[] getWeightedAverage(final ImageStack in, int pointX, int pointY, int pointZ) { 39 | double[] wAvg = new double[3]; 40 | double sumWeights = 0; 41 | 42 | for (int kX = 0; kX < w; kX++) { 43 | for (int kY = 0; kY < h; kY++) { 44 | for (int kZ = 0; kZ < d; kZ++) { 45 | 46 | int xpos = (kX - center[0]) + pointX; 47 | int ypos = (kY - center[1]) + pointY; 48 | int zpos = (kZ - center[2]) + pointZ; 49 | 50 | if (0 <= xpos && xpos < in.getWidth() && 0 <= ypos && ypos < in.getHeight() && 0 <= zpos && zpos < in.size()) { 51 | double weight = in.getVoxel(xpos, ypos, zpos) * weightMatrix[kX][kY][kZ]; 52 | wAvg[0] += kX * weight; 53 | wAvg[1] += kY * weight; 54 | wAvg[2] += kZ * weight; 55 | sumWeights += weight; 56 | } 57 | } 58 | } 59 | } 60 | int xpos = (((int) (wAvg[0] / sumWeights)) - center[0]) + pointX; 61 | int ypos = (((int) (wAvg[1] / sumWeights)) - center[1]) + pointY; 62 | int zpos = (((int) (wAvg[2] / sumWeights)) - center[2]) + pointZ; 63 | 64 | xpos = Math.max(0, Math.min(xpos, w - 1)); 65 | ypos = Math.max(0, Math.min(ypos, w - 1)); 66 | zpos = Math.max(0, Math.min(zpos, w - 1)); 67 | 68 | return new int[]{xpos, ypos, zpos, (int) sumWeights}; 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/MahalonobisDistance.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this template, choose Tools | Templates 3 | * and open the template in the editor. 4 | */ 5 | package org.nolanlab.codex.segm; 6 | 7 | 8 | import cern.colt.matrix.DoubleMatrix2D; 9 | import cern.colt.matrix.impl.DenseDoubleMatrix1D; 10 | import cern.colt.matrix.impl.DenseDoubleMatrix2D; 11 | import cern.colt.matrix.linalg.Algebra; 12 | 13 | import java.util.Arrays; 14 | 15 | /** 16 | * 17 | * @author Zina 18 | */ 19 | public class MahalonobisDistance { 20 | 21 | public DenseDoubleMatrix2D covMtx; 22 | public DenseDoubleMatrix1D center; 23 | private DoubleMatrix2D invCovMtx; 24 | 25 | public MahalonobisDistance(DenseDoubleMatrix1D center, DenseDoubleMatrix2D covMtx) { 26 | this.covMtx = covMtx; 27 | this.center = center; 28 | this.invCovMtx = Algebra.DEFAULT.inverse(covMtx); 29 | } 30 | 31 | @Override 32 | public String toString() { 33 | return "Center: " + center.toString() + "\nCovMtx\n" 34 | + covMtx.toString(); 35 | } 36 | 37 | public MahalonobisDistance(SegmentedObject reg) { 38 | 39 | double[][] dataTable = new double[reg.getPoints().length][]; 40 | 41 | for (int i = 0; i < reg.getPoints().length; i++) { 42 | dataTable[i] = new double[]{reg.getPoints()[i].x, reg.getPoints()[i].y, reg.getPoints()[i].z}; 43 | } 44 | 45 | center = new DenseDoubleMatrix1D(new double[]{reg.getCenter().x, reg.getCenter().y, reg.getCenter().z}); 46 | covMtx = new DenseDoubleMatrix2D(CovarianceMatrix.covarianceMatrix(dataTable)); 47 | 48 | //Compute covariance matrix of the cluster 49 | //Take the inverse cov matrix 50 | try { 51 | invCovMtx = Algebra.DEFAULT.inverse(covMtx); 52 | } catch (IllegalArgumentException e) { 53 | System.out.println("Singular matrix. Using identity matrix instead"); 54 | invCovMtx = new DenseDoubleMatrix2D(3, 3); 55 | for (int i = 0; i < 3; i++) { 56 | invCovMtx.setQuick(i, i, 1); 57 | } 58 | } 59 | } 60 | 61 | public MahalonobisDistance(double[][] dataTable) { 62 | // logger.print("init MD"); 63 | //Compute the center of the cluster 64 | 65 | double[] vec = Arrays.copyOf(dataTable[0], dataTable[0].length); 66 | for (int i = 1; i < dataTable.length; i++) { 67 | double[] vec2 = dataTable[i]; 68 | for (int dim = 0; dim < vec2.length; dim++) { 69 | vec[dim] += vec2[dim]; 70 | } 71 | } 72 | 73 | for (int dim = 0; dim < vec.length; dim++) { 74 | vec[dim] /= (double) dataTable.length; 75 | } 76 | center = new DenseDoubleMatrix1D(vec); 77 | 78 | covMtx = new DenseDoubleMatrix2D(CovarianceMatrix.covarianceMatrix(dataTable)); 79 | 80 | invCovMtx = Algebra.DEFAULT.inverse(covMtx); 81 | } 82 | 83 | public double distTo(double[] x) { 84 | DenseDoubleMatrix1D diff = new DenseDoubleMatrix1D(x.length); 85 | for (int i = 0; i < x.length; i++) { 86 | diff.setQuick(i, x[i] - center.getQuick(i)); 87 | } 88 | double dist = Algebra.DEFAULT.mult(diff, Algebra.DEFAULT.mult(invCovMtx, diff)); 89 | return Math.sqrt(dist); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/MatrixOp.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this template, choose Tools | Templates 3 | * and open the template in the editor. 4 | */ 5 | package org.nolanlab.codex.segm; 6 | 7 | import java.util.Arrays; 8 | 9 | /** 10 | * 11 | * @author Nikolay 12 | */ 13 | public class MatrixOp { 14 | 15 | public static double mult(double[] vec1, double[] vec2) { 16 | if (vec1.length != vec2.length) { 17 | throw new IllegalArgumentException("Vectors differ in length"); 18 | } 19 | double prod = 0; 20 | for (int x = 0; x < vec1.length; x++) { 21 | prod += vec1[x] * vec2[x]; 22 | } 23 | return prod; 24 | } 25 | 26 | public static double[] subset(double[] source, int[] selectedIdx) { 27 | double[] res = new double[selectedIdx.length]; 28 | for (int i = 0; i < res.length; i++) { 29 | res[i] = source[selectedIdx[i]]; 30 | } 31 | return res; 32 | } 33 | 34 | public static double[] concat(double[] vec1, double[] vec2) { 35 | if (vec2 == null) { 36 | return vec1; 37 | } 38 | if (vec1 == null) { 39 | return vec2; 40 | } 41 | double[] res = Arrays.copyOf(vec1, vec1.length + vec2.length); 42 | for (int i = 0; i < vec2.length; i++) { 43 | res[i + vec1.length] = vec2[i]; 44 | } 45 | return res; 46 | } 47 | 48 | public static double getEuclideanDistance(double[] vec1, double[] vec2) { 49 | if (vec1.length != vec2.length) { 50 | throw new IllegalArgumentException("Vectors differ in length"); 51 | } 52 | double prod = 0; 53 | for (int x = 0; x < vec1.length; x++) { 54 | prod += (vec1[x] - vec2[x]) * (vec1[x] - vec2[x]); 55 | } 56 | return Math.sqrt(prod); 57 | } 58 | 59 | public static double getEuclideanCosine(double[] vec1, double[] vec2) { 60 | return Math.min(1.0, mult(vec1, vec2) / (lenght(vec1) * lenght(vec2))); 61 | } 62 | 63 | public static double[] copy(double[] vec) { 64 | if (vec == null) { 65 | return null; 66 | } 67 | return Arrays.copyOf(vec, vec.length); 68 | } 69 | 70 | public static void mult(double[] vec, double val) { 71 | for (int i = 0; i < vec.length; i++) { 72 | vec[i] *= val; 73 | } 74 | } 75 | 76 | public static void mult(double[][] mtx, double[] vec, double[] prod) { 77 | int col = vec.length; 78 | int row = mtx.length; 79 | for (int r = 0; r < row; r++) { 80 | prod[r] = 0; 81 | for (int c = 0; c < col; c++) { 82 | prod[r] += mtx[r][c] * vec[c]; 83 | } 84 | } 85 | } 86 | 87 | public static double[] mult(double[][] mtx, double[] vec) { 88 | int col = vec.length; 89 | int row = mtx.length; 90 | double[] prod = new double[row]; 91 | for (int r = 0; r < row; r++) { 92 | prod[r] = 0; 93 | for (int c = 0; c < col; c++) { 94 | prod[r] += mtx[r][c] * vec[c]; 95 | } 96 | } 97 | return prod; 98 | } 99 | 100 | public static void mult(double[] vec, double val, double[] res) { 101 | for (int i = 0; i < vec.length; i++) { 102 | res[i] = vec[i] * val; 103 | } 104 | } 105 | 106 | public static double lenght(double vec[]) { 107 | return Math.sqrt(mult(vec, vec)); 108 | } 109 | 110 | public static double[] toUnityLen(double[] vec) { 111 | double[] result = new double[vec.length]; 112 | double len = lenght(vec); 113 | for (int i = 0; i < result.length; i++) { 114 | result[i] = vec[i] / len; 115 | } 116 | return result; 117 | } 118 | 119 | /** 120 | * @return x1+x2 121 | */ 122 | public static double[] sum(double[] vec1, double[] vec2) { 123 | double[] result = copy(vec1); 124 | for (int x = 0; x < vec1.length; x++) { 125 | result[x] += vec2[x]; 126 | } 127 | return result; 128 | } 129 | 130 | /** 131 | * @return x1-x2 132 | */ 133 | public static double[] diff(double[] vec1, double[] vec2) { 134 | double[] result = copy(vec1); 135 | for (int x = 0; x < vec1.length; x++) { 136 | result[x] -= vec2[x]; 137 | } 138 | return result; 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/Point3D.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.segm; 7 | 8 | import java.awt.*; 9 | 10 | /** 11 | * 12 | * @author Nikolay 13 | */ 14 | public class Point3D { 15 | 16 | final int x, y, z; 17 | double intensity; 18 | Color color; 19 | 20 | public Point3D(int x, int y, int z, double intensity, Color c) { 21 | this.x = x; 22 | this.y = y; 23 | this.z = z; 24 | this.intensity = intensity; 25 | this.color = c; 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return "{" + x + "," + y + "," + z + "}"; 31 | } 32 | 33 | @Override 34 | public int hashCode() { 35 | return (String.valueOf(x) + String.valueOf(y) + String.valueOf(z)).hashCode(); 36 | } 37 | 38 | public Point3D(int x, int y, int z) { 39 | this.x = x; 40 | this.y = y; 41 | this.z = z; 42 | this.intensity = 0; 43 | this.color = Color.BLACK; 44 | } 45 | 46 | @Override 47 | public boolean equals(Object obj) { 48 | return (obj instanceof Point3D) && ((Point3D) obj).x == this.x && ((Point3D) obj).y == this.y && ((Point3D) obj).z == this.z; 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/ProfileAverager.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this template, choose Tools | Templates 3 | * and open the template in the editor. 4 | */ 5 | package org.nolanlab.codex.segm; 6 | 7 | import java.util.Arrays; 8 | 9 | /** 10 | * 11 | * @author Nikolay 12 | */ 13 | public class ProfileAverager { 14 | 15 | double[] avg = null; 16 | double count = 0; 17 | 18 | public double getCount() { 19 | return count; 20 | } 21 | 22 | 23 | 24 | 25 | public ProfileAverager() { 26 | } 27 | 28 | public double[] getAverage() { 29 | if (count == 0) { 30 | throw new IllegalStateException("No profiles have been added to this averager"); 31 | } 32 | double[] res = Arrays.copyOf(avg, avg.length); 33 | MatrixOp.mult(res, 1.0 / count); 34 | return res; 35 | } 36 | 37 | public double[] getAverageUnityLen() { 38 | if (count == 0) { 39 | throw new IllegalStateException("No profiles have been added to this averager"); 40 | } 41 | double[] res = getAverage(); 42 | return MatrixOp.toUnityLen(res); 43 | } 44 | 45 | public void addProfile(double[] vec) { 46 | if (vec == null) { 47 | return; 48 | } 49 | if (avg == null) { 50 | avg = Arrays.copyOf(vec, vec.length); 51 | } else { 52 | if (vec.length != avg.length) { 53 | throw new IllegalArgumentException("the vector size " + vec.length + " doesn't match the required size of " + vec.length); 54 | } 55 | avg = MatrixOp.sum(avg, vec); 56 | } 57 | count++; 58 | } 59 | 60 | public void addProfile(double[] vec, double weight) { 61 | if (vec == null) { 62 | return; 63 | } 64 | if (avg == null) { 65 | avg = Arrays.copyOf(vec, vec.length); 66 | MatrixOp.mult(avg, weight); 67 | } else { 68 | if (vec.length != avg.length) { 69 | throw new IllegalArgumentException("the vector size " + vec.length + " doesn't match the required size of " + vec.length); 70 | } 71 | double[] vec2 = Arrays.copyOf(vec, vec.length); 72 | MatrixOp.mult(vec2, weight); 73 | avg = MatrixOp.sum(avg, vec2); 74 | } 75 | count += weight; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/RegionImageWriter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.segm; 7 | 8 | import ij.ImagePlus; 9 | 10 | import javax.imageio.ImageIO; 11 | import java.awt.*; 12 | import java.awt.image.BufferedImage; 13 | import java.io.File; 14 | import java.io.IOException; 15 | 16 | /** 17 | * 18 | * @author Nikolay Samusik 19 | */ 20 | public class RegionImageWriter { 21 | 22 | public static BufferedImage[] writeRegionImage(SegmentedObject[] reg, ImagePlus segmImage, String srcFileName, File outputDir) throws IOException { 23 | if (srcFileName.contains(".")) { 24 | srcFileName = srcFileName.substring(0, srcFileName.lastIndexOf(".")); 25 | } 26 | int w = segmImage.getWidth(); 27 | int h = segmImage.getHeight(); 28 | int d = segmImage.getNSlices(); 29 | 30 | BufferedImage[] bi = new BufferedImage[d]; 31 | for (int z = 0; z < d; z++) { 32 | bi[z] = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 33 | } 34 | 35 | for (SegmentedObject segmentedObject : reg) { 36 | int r = (int) (Math.random() * 255); 37 | int g = (int) (Math.random() * 255); 38 | int b = (int) (Math.random() * 255); 39 | int a = 255; 40 | int col = (a << 24) | (r << 16) | (g << 8) | b; 41 | for (Point3D pt : segmentedObject.getPoints()) { 42 | bi[pt.z].setRGB(pt.x, pt.y, col); 43 | } 44 | } 45 | 46 | BufferedImage[] bi2 = new BufferedImage[d]; 47 | for (int z = 0; z < d; z++) { 48 | bi2[z] = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 49 | bi[z].getGraphics().setColor(Color.black); 50 | bi2[z].getGraphics().fillRect(0,0,w,h); 51 | } 52 | 53 | for (int z = 0; z < d; z++) { 54 | BufferedImage img = bi[z]; 55 | for (int x = 1; x < w - 1; x++) { 56 | for (int y = 1; y < h - 1; y++) { 57 | int col = img.getRGB(x, y); 58 | 59 | int a = (col >> 24) & 0xFF; 60 | if (a > 0) { 61 | boolean inner = true; 62 | for (int[] xy : new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}) { 63 | int col2 = img.getRGB(x + xy[0], y + xy[1]); 64 | inner &= col2 == col; 65 | } 66 | if (!inner) { 67 | bi2[z].setRGB(x, y, col); 68 | }else{ 69 | bi2[z].setRGB(x, y, 0); 70 | } 71 | }else{ 72 | bi2[z].setRGB(x, y, 0); 73 | } 74 | } 75 | } 76 | bi2[z].getGraphics().setColor(Color.black); 77 | bi2[z].getGraphics().drawRect(0,0,w-1,h-1); 78 | /* 79 | if (Main.printParams) { 80 | Graphics2D gr = bi2[z].createGraphics(); 81 | gr.setPaint(Color.WHITE); 82 | String[] s = (Main.revision + "\n" + Main.params.toString().replace(',', '\n')).split("\n"); 83 | int offset = 15; 84 | for (String string : s) { 85 | gr.drawString(string, 15, offset += 15); 86 | } 87 | }*/ 88 | } 89 | 90 | for (int z = 0; z < d; z++) { 91 | String fileName = String.format(outputDir + File.separator + "regions_" + srcFileName + "_Z%02d", z+1); 92 | ImageIO.write(bi2[z], "PNG", new File(fileName + ".png")); 93 | } 94 | return bi2; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/SegmentedObject.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.segm; 7 | 8 | import java.awt.*; 9 | 10 | /** 11 | * 12 | * @author Nikolay 13 | */ 14 | public class SegmentedObject { 15 | 16 | private final Point3D center; 17 | private final Point3D[] regionPts; 18 | private Point3D[] hull; 19 | private Color c; 20 | private double intensity; 21 | 22 | public void setIntensity(double intensity) { 23 | this.intensity = intensity; 24 | } 25 | 26 | public double getIntensity() { 27 | return intensity; 28 | } 29 | 30 | public void setC(Color c) { 31 | this.c = c; 32 | } 33 | 34 | public Point3D getCenter() { 35 | return center; 36 | } 37 | 38 | public Point3D[] getHull() { 39 | if (hull == null) { 40 | computeHull(); 41 | } 42 | return hull; 43 | } 44 | 45 | private void computeHull() { 46 | 47 | } 48 | 49 | public Color getColor() { 50 | return c; 51 | } 52 | 53 | public Point3D[] getPoints() { 54 | return regionPts; 55 | } 56 | 57 | public SegmentedObject(Point3D center, Point3D[] regionPts) { 58 | this.center = center; 59 | this.regionPts = regionPts; 60 | c = new Color(100 + (int) (Math.random() * 155), 100 + (int) (Math.random() * 155), 100 + (int) (Math.random() * 155)); 61 | } 62 | 63 | @Override 64 | public String toString() { 65 | 66 | StringBuilder sb = new StringBuilder(); 67 | 68 | sb.append(center.toString()); 69 | sb.append("\t"); 70 | 71 | for (Point3D regionPt : regionPts) { 72 | sb.append(regionPt.toString()); 73 | } 74 | 75 | return sb.toString(); //To change body of generated methods, choose Tools | Templates. 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/segm/TIFFtoJPEG.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.segm; 7 | 8 | import ij.IJ; 9 | import ij.ImagePlus; 10 | import ij.io.FileSaver; 11 | import ij.io.Opener; 12 | import ij.plugin.Duplicator; 13 | 14 | import java.io.File; 15 | import java.io.FileFilter; 16 | import java.io.IOException; 17 | 18 | /** 19 | * 20 | * @author Nikolay 21 | */ 22 | public class TIFFtoJPEG { 23 | 24 | public static void main(String[] args) throws IOException { 25 | 26 | File inList = null; 27 | int quality = 90; 28 | try { 29 | if (args.length != 2) { 30 | throw new IllegalArgumentException("Invalid number of arguments, expected 2 arg"); 31 | } 32 | inList = new File(args[0]); 33 | quality = Integer.parseInt(args[1]); 34 | } catch (Exception e) { 35 | e.printStackTrace(); 36 | System.out.println("Provided arguments as seen by the application:"); 37 | for (int i = 0; i < args.length; i++) { 38 | System.out.println("arg#" + i + "=" + args[i]); 39 | } 40 | System.out.println("Usage: java -jar CODEX.jar TIFFtoJPEG.class " + nNode.getFirstChild().getNodeValue()+ ""); 57 | } 58 | 59 | printChildRecur(nNode.getChildNodes()); 60 | } 61 | } 62 | 63 | } 64 | 65 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/toolkit/GrahamScan.java: -------------------------------------------------------------------------------- 1 | /** 2 | * **************************************************************************** 3 | * Compilation: javac GrahamaScan.java 4 | * Execution: java GrahamScan < input.txt 5 | * Dependencies: Point2D.java 6 | * 7 | * Create points from standard input and compute the convex hull using 8 | * Graham scan algorithm. 9 | * 10 | * May be floating-point issues if x- and y-coordinates are not integers. 11 | * 12 | ***************************************************************************** 13 | */ 14 | package org.nolanlab.codex.toolkit; 15 | 16 | import java.util.Arrays; 17 | import java.util.Stack; 18 | 19 | /** 20 | * The GrahamScan data type provides methods for computing the convex 21 | * hull of a set of N points in the plane. 22 | *

23 | * The implementation uses the Graham-Scan convex hull algorithm. It runs in 24 | * O(N log N) time in the worst case and uses O(N) 25 | * extra memory. 26 | *

27 | * For additional documentation, see 28 | * Section 9.9 of 29 | * Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne. 30 | * 31 | * @author Robert Sedgewick 32 | * @author Kevin Wayne 33 | */ 34 | public class GrahamScan { 35 | 36 | private Stack hull = new Stack(); 37 | 38 | /** 39 | * Computes the convex hull of the specified array of points. 40 | * 41 | * @param pts the array of points 42 | * @throws NullPointerException if points is null or if 43 | * any entry in points[] is null 44 | */ 45 | public GrahamScan(Point2D[] pts) { 46 | 47 | // defensive copy 48 | int N = pts.length; 49 | Point2D[] points = new Point2D[N]; 50 | for (int i = 0; i < N; i++) { 51 | points[i] = pts[i]; 52 | } 53 | 54 | // preprocess so that points[0] has lowest y-coordinate; break ties by x-coordinate 55 | // points[0] is an extreme point of the convex hull 56 | // (alternatively, could do easily in linear time) 57 | Arrays.sort(points); 58 | 59 | // sort by polar angle with respect to base point points[0], 60 | // breaking ties by distance to points[0] 61 | Arrays.sort(points, 1, N, points[0].polarOrder()); 62 | 63 | hull.push(points[0]); // p[0] is first extreme point 64 | 65 | // find index k1 of first point not equal to points[0] 66 | int k1; 67 | for (k1 = 1; k1 < N; k1++) { 68 | if (!points[0].equals(points[k1])) { 69 | break; 70 | } 71 | } 72 | if (k1 == N) { 73 | return; // all points equal 74 | } 75 | // find index k2 of first point not collinear with points[0] and points[k1] 76 | int k2; 77 | for (k2 = k1 + 1; k2 < N; k2++) { 78 | if (Point2D.ccw(points[0], points[k1], points[k2]) != 0) { 79 | break; 80 | } 81 | } 82 | hull.push(points[k2 - 1]); // points[k2-1] is second extreme point 83 | 84 | // Graham scan; note that points[N-1] is extreme point different from points[0] 85 | for (int i = k2; i < N; i++) { 86 | Point2D top = hull.pop(); 87 | while (Point2D.ccw(hull.peek(), top, points[i]) <= 0) { 88 | top = hull.pop(); 89 | } 90 | hull.push(top); 91 | hull.push(points[i]); 92 | } 93 | 94 | assert isConvex(); 95 | } 96 | 97 | /** 98 | * Returns the extreme points on the convex hull in counterclockwise order. 99 | * 100 | * @return the extreme points on the convex hull in counterclockwise order 101 | */ 102 | public Iterable hull() { 103 | Stack s = new Stack(); 104 | for (Point2D p : hull) { 105 | s.push(p); 106 | } 107 | return s; 108 | } 109 | 110 | // check that boundary of hull is strictly convex 111 | private boolean isConvex() { 112 | int N = hull.size(); 113 | if (N <= 2) { 114 | return true; 115 | } 116 | 117 | Point2D[] points = new Point2D[N]; 118 | int n = 0; 119 | for (Point2D p : hull()) { 120 | points[n++] = p; 121 | } 122 | 123 | for (int i = 0; i < N; i++) { 124 | if (Point2D.ccw(points[i], points[(i + 1) % N], points[(i + 2) % N]) <= 0) { 125 | return false; 126 | } 127 | } 128 | return true; 129 | } 130 | 131 | } 132 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/toolkit/Matrix.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.toolkit; 7 | 8 | import cern.colt.matrix.DoubleMatrix2D; 9 | import cern.colt.matrix.impl.DenseDoubleMatrix2D; 10 | import dataIO.DatasetStub; 11 | 12 | import java.io.BufferedWriter; 13 | import java.io.File; 14 | import java.io.FileWriter; 15 | import java.io.IOException; 16 | import java.util.Arrays; 17 | import java.util.List; 18 | 19 | /** 20 | * 21 | * @author Nikolay Samusik 22 | */ 23 | public class Matrix { 24 | 25 | private String[] columnNames; 26 | private String[] rowNames; 27 | private DoubleMatrix2D mtx; 28 | 29 | private final String name; 30 | 31 | public Matrix(File f) { 32 | DatasetStub ds = DatasetStub.createFromTXT(f); 33 | columnNames = Arrays.copyOf(ds.getShortColumnNames(), ds.getShortColumnNames().length); 34 | rowNames = new String[(int) ds.getRowCount()]; 35 | double[][] m = new double[rowNames.length][columnNames.length]; 36 | for (int i = 0; i < rowNames.length; i++) { 37 | m[i] = ds.getRow(i); 38 | rowNames[i] = ds.getRowName(i); 39 | } 40 | mtx = new DenseDoubleMatrix2D(m); 41 | this.name = f.getName().split("\\.")[0]; 42 | } 43 | 44 | public static Matrix sum(Matrix a, Matrix b) { 45 | Matrix ret = a.clone(a.name + " + " + b.name); 46 | for (int i = 0; i < a.rowNames.length; i++) { 47 | for (int j = 0; j < a.columnNames.length; j++) { 48 | ret.mtx().setQuick(i, j, a.mtx().getQuick(i, j) + b.mtx().getQuick(i, j)); 49 | } 50 | } 51 | return ret; 52 | } 53 | 54 | public static Matrix avg(List list) { 55 | if (list.isEmpty()) { 56 | throw new IllegalArgumentException("List is empty"); 57 | } 58 | Matrix avg = list.get(0).clone("avg of " + list.size() + " matrices"); 59 | avg = list.stream().reduce(avg, Matrix::sum); 60 | avg.mtx().assign((double d) -> d / list.size()); 61 | return avg; 62 | } 63 | 64 | public String getName() { 65 | return name; 66 | } 67 | 68 | public static Matrix SD(List list) { 69 | if (list.size() < 2) { 70 | throw new IllegalArgumentException("List size is less than 2"); 71 | } 72 | Matrix avg = avg(list); 73 | 74 | Matrix res = avg.clone("SD of " + list.size() + " matrices"); 75 | 76 | res.mtx().assign(0); 77 | 78 | for (Matrix m : list) { 79 | for (int i = 0; i < res.mtx().rows(); i++) { 80 | for (int j = 0; j < res.mtx().columns(); j++) { 81 | res.mtx().set(i, j, res.mtx().get(i, j) + Math.pow(m.mtx().getQuick(i, j) - avg.mtx().getQuick(i, j), 2)); 82 | } 83 | } 84 | } 85 | 86 | for (int i = 0; i < res.mtx().rows(); i++) { 87 | for (int j = 0; j < res.mtx().columns(); j++) { 88 | res.mtx().set(i, j, Math.sqrt(res.mtx().get(i, j) / (list.size() - 1))); 89 | } 90 | } 91 | 92 | return res; 93 | } 94 | 95 | public DoubleMatrix2D mtx() { 96 | return mtx; 97 | } 98 | 99 | public String getColumnName(int i) { 100 | return columnNames[i]; 101 | } 102 | 103 | public String getRowName(int i) { 104 | return rowNames[i]; 105 | } 106 | 107 | public void writeToFile(File f) throws IOException { 108 | BufferedWriter br = new BufferedWriter(new FileWriter(f)); 109 | br.write(this.toString()); 110 | br.close(); 111 | } 112 | 113 | @Override 114 | public String toString() { 115 | StringBuilder sb = new StringBuilder(); 116 | sb.append("\t"); 117 | sb.append(Arrays.toString(columnNames).replaceAll("[\\[\\]]", "").replaceAll(",", "\t")); 118 | sb.append("\n"); 119 | for (int i = 0; i < rowNames.length; i++) { 120 | sb.append(rowNames[i]); 121 | for (int j = 0; j < columnNames.length; j++) { 122 | sb.append("\t").append(mtx.getQuick(i, j)); 123 | } 124 | sb.append("\n"); 125 | } 126 | return sb.toString(); 127 | } 128 | 129 | public Matrix(String[] columnNames, String[] rowNames, DoubleMatrix2D mtx, String name) { 130 | this.columnNames = columnNames; 131 | this.rowNames = rowNames; 132 | if (columnNames.length != mtx.columns()) { 133 | throw new IllegalArgumentException("columnNames.size() != mtx.rows()"); 134 | } 135 | if (rowNames.length != mtx.rows()) { 136 | throw new IllegalArgumentException("rowNames.size() != mtx.rows()"); 137 | } 138 | this.mtx = mtx; 139 | this.name = name; 140 | } 141 | 142 | public Matrix clone(String newName) { 143 | return new Matrix(Arrays.copyOf(rowNames, rowNames.length), Arrays.copyOf(columnNames, columnNames.length), mtx.copy(), newName); 144 | } 145 | 146 | public String[] getColumnNames() { 147 | return columnNames; 148 | } 149 | 150 | public String[] getRowNames() { 151 | return rowNames; 152 | } 153 | 154 | } 155 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/toolkit/VerifyDelaunayGraph.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.toolkit; 7 | 8 | import java.io.File; 9 | import java.io.IOException; 10 | 11 | /** 12 | * 13 | * @author Nikolay Samusik 14 | */ 15 | public class VerifyDelaunayGraph { 16 | public static void main(String[] args) throws IOException{ 17 | File f = new File("D:\\CODEX paper revision"); 18 | DelaunayGraph.verifyGraph(f); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/toolkit/circularlayout/Bundle.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.toolkit.circularlayout; 7 | 8 | 9 | import org.openide.util.NbBundle; 10 | 11 | class Bundle 12 | { 13 | static String Layout_NodePlacement_CCW() 14 | { 15 | return NbBundle.getMessage(Bundle.class, "Layout_NodePlacement_CCW"); 16 | } 17 | 18 | static String Layout_NodePlacement_CW() 19 | { 20 | return NbBundle.getMessage(Bundle.class, "Layout_NodePlacement_CW"); 21 | } 22 | 23 | static String Layout_NodePlacement_Degree_name() 24 | { 25 | return NbBundle.getMessage(Bundle.class, "Layout_NodePlacement_Degree_name"); 26 | } 27 | 28 | static String Layout_NodePlacement_InDegree_name() 29 | { 30 | return NbBundle.getMessage(Bundle.class, "Layout_NodePlacement_InDegree_name"); 31 | } 32 | 33 | static String Layout_NodePlacement_Mutual_name() 34 | { 35 | return NbBundle.getMessage(Bundle.class, "Layout_NodePlacement_Mutual_name"); 36 | } 37 | 38 | static String Layout_NodePlacement_NodeID_name() 39 | { 40 | return NbBundle.getMessage(Bundle.class, "Layout_NodePlacement_NodeID_name"); 41 | } 42 | 43 | static String Layout_NodePlacement_OutDegree_name() 44 | { 45 | return NbBundle.getMessage(Bundle.class, "Layout_NodePlacement_OutDegree_name"); 46 | } 47 | 48 | static String Layout_NodePlacement_Random_name() 49 | { 50 | return NbBundle.getMessage(Bundle.class, "Layout_NodePlacement_Random_name"); 51 | } 52 | 53 | static String Layout_name() 54 | { 55 | return NbBundle.getMessage(Bundle.class, "Layout_name"); 56 | } 57 | 58 | private void Bundle() {} 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/toolkit/circularlayout/CircleLayoutBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.toolkit.circularlayout; 7 | 8 | import org.gephi.graph.api.GraphModel; 9 | import org.gephi.layout.spi.Layout; 10 | import org.gephi.layout.spi.LayoutBuilder; 11 | import org.gephi.layout.spi.LayoutUI; 12 | import org.openide.util.NbBundle; 13 | 14 | import javax.swing.*; 15 | 16 | public class CircleLayoutBuilder 17 | implements LayoutBuilder 18 | { 19 | private CircleLayoutUI ui; 20 | GraphModel gm; 21 | 22 | public CircleLayoutBuilder(GraphModel gm) 23 | { 24 | this.gm = gm; 25 | } 26 | 27 | public String getName() 28 | { 29 | return NbBundle.getMessage(CircleLayoutBuilder.class, "CircleLayout.name"); 30 | } 31 | 32 | @Override 33 | public Layout buildLayout() 34 | { 35 | return new CircleLayout(this, 500.0D, false); 36 | } 37 | 38 | public LayoutUI getUI() 39 | { 40 | return this.ui; 41 | } 42 | 43 | private static class CircleLayoutUI 44 | implements LayoutUI 45 | { 46 | public String getDescription() 47 | { 48 | return NbBundle.getMessage(CircleLayoutBuilder.class, "CircleLayout.description"); 49 | } 50 | 51 | public Icon getIcon() 52 | { 53 | return null; 54 | } 55 | 56 | public JPanel getSimplePanel(Layout layout) 57 | { 58 | return null; 59 | } 60 | 61 | public int getQualityRank() 62 | { 63 | return -1; 64 | } 65 | 66 | public int getSpeedRank() 67 | { 68 | return -1; 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/toolkit/circularlayout/NodeComparator.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.toolkit.circularlayout; 2 | 3 | import org.gephi.graph.api.Graph; 4 | import org.gephi.graph.api.Node; 5 | 6 | import java.lang.reflect.Field; 7 | import java.lang.reflect.Method; 8 | import java.util.Comparator; 9 | import java.util.logging.Level; 10 | import java.util.logging.Logger; 11 | 12 | public class NodeComparator 13 | implements Comparator 14 | { 15 | private Node[] collection; 16 | private String methodName; 17 | private String attribute; 18 | private boolean sortAsc; 19 | private Graph graph; 20 | private CompareType enumcompare; 21 | public static final int EQUAL = 0; 22 | public static final int LESS_THAN = -1; 23 | public static final int GREATER_THAN = 1; 24 | 25 | public static enum CompareType 26 | { 27 | NODEID, METHOD, ATTRIBUTE, LAYOUTDATA; 28 | 29 | private CompareType() {} 30 | } 31 | 32 | public NodeComparator(Graph graph, Node[] collection, CompareType enumcompare, String field, boolean sortAsc) 33 | { 34 | this.graph = graph; 35 | this.collection = collection; 36 | this.enumcompare = enumcompare; 37 | switch (enumcompare) 38 | { 39 | case NODEID: 40 | break; 41 | case LAYOUTDATA: 42 | case ATTRIBUTE: 43 | this.attribute = field; 44 | break; 45 | case METHOD: 46 | this.methodName = buildMethod(field); 47 | } 48 | this.sortAsc = sortAsc; 49 | } 50 | 51 | public int compare(Object o1, Object o2) 52 | { 53 | int rv = 0; 54 | 55 | Object result1 = null; 56 | Object result2 = null; 57 | Node node1 = (Node)o1; 58 | Node node2 = (Node)o2; 59 | 60 | Class c = null; 61 | try 62 | { 63 | switch (this.enumcompare) 64 | { 65 | case NODEID: 66 | result1 = node1.getId(); 67 | result2 = node2.getId(); 68 | break; 69 | case ATTRIBUTE: 70 | result1 = node1.getAttribute(this.attribute); 71 | result2 = node2.getAttribute(this.attribute); 72 | break; 73 | case LAYOUTDATA: 74 | Object NodeLayoutData1 = node1.getLayoutData(); 75 | Object NodeLayoutData2 = node2.getLayoutData(); 76 | Field field1 = NodeLayoutData1.getClass().getField(this.attribute); 77 | result1 = field1.get(NodeLayoutData1); 78 | Field field2 = NodeLayoutData2.getClass().getField(this.attribute); 79 | result2 = field2.get(NodeLayoutData2); 80 | break; 81 | case METHOD: 82 | Method method = this.graph.getClass().getMethod(this.methodName, new Class[] { Node.class }); 83 | c = method.getReturnType(); 84 | result1 = method.invoke(this.graph, new Object[] { o1 }); 85 | result2 = method.invoke(this.graph, new Object[] { o2 }); 86 | } 87 | if ((result1 == null) && (result2 == null)) { 88 | return 0; 89 | } 90 | if ((result1 != null) && (result2 == null)) { 91 | return -1; 92 | } 93 | if ((result1 == null) && (result2 != null)) { 94 | return 1; 95 | } 96 | if (this.enumcompare != CompareType.METHOD) { 97 | c = result1.getClass(); 98 | } 99 | if (c.isAssignableFrom(Class.forName("java.util.Comparator"))) 100 | { 101 | Comparator c1 = (Comparator)result1; 102 | Comparator c2 = (Comparator)result2; 103 | rv = c1.compare(c1, c2); 104 | } 105 | else if (Class.forName("java.lang.Comparable").isAssignableFrom(c)) 106 | { 107 | Comparable c1 = (Comparable)result1; 108 | Comparable c2 = (Comparable)result2; 109 | rv = c1.compareTo(c2); 110 | } 111 | else if (c.isPrimitive()) 112 | { 113 | long f1 = ((Number)result1).longValue(); 114 | long f2 = ((Number)result2).longValue(); 115 | if (f1 == f2) { 116 | rv = 0; 117 | } else if (f1 < f2) { 118 | rv = -1; 119 | } else if (f1 > f2) { 120 | rv = 1; 121 | } 122 | } 123 | else 124 | { 125 | throw new RuntimeException("NodeComparator does not currently support ''" + c.getName() + "''!"); 126 | } 127 | } 128 | catch (Exception e) 129 | { 130 | Logger.getLogger(NodeComparator.class.getName()).log(Level.SEVERE, null, e); 131 | } 132 | return rv * getSortOrder(); 133 | } 134 | 135 | private int getSortOrder() 136 | { 137 | return this.sortAsc ? 1 : -1; 138 | } 139 | 140 | private String buildMethod(String field) 141 | { 142 | return "get" + (field); 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/toolkit/circularlayout/TempLayoutData.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.toolkit.circularlayout; 2 | 3 | import org.gephi.graph.spi.LayoutData; 4 | 5 | public class TempLayoutData 6 | implements LayoutData 7 | { 8 | public float finishx = 0.0F; 9 | public float finishy = 0.0F; 10 | public float xdistance = 0.0F; 11 | public float ydistance = 0.0F; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/driffta/DeconvolutionInterlockDispatcher.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.upload.driffta; 7 | 8 | import java.io.BufferedWriter; 9 | import java.io.File; 10 | import java.io.FileWriter; 11 | import java.io.IOException; 12 | 13 | /** 14 | * 15 | * @author CODEX 16 | */ 17 | public class DeconvolutionInterlockDispatcher { 18 | 19 | private static File f = new File(System.getProperty("java.io.tmpdir")+"deconvolutionLock.lck"); 20 | 21 | private static boolean hasLck; 22 | 23 | private static BufferedWriter br; 24 | 25 | public static boolean hasLock() { 26 | return hasLck; 27 | } 28 | 29 | 30 | public static void waitForLock() throws InterruptedException{ 31 | while(f.exists()){ 32 | try { 33 | f.delete(); 34 | } catch (Exception e) { 35 | Driffta.log(e.toString()); 36 | } 37 | Thread.sleep(100); 38 | } 39 | } 40 | 41 | public static void gainLock()throws IOException, InterruptedException{ 42 | waitForLock(); 43 | br = new BufferedWriter(new FileWriter(f)); 44 | br.write("locked"); 45 | 46 | } 47 | 48 | public static void releaseLock()throws IOException, InterruptedException{ 49 | br.flush(); 50 | br.close(); 51 | f.delete(); 52 | } 53 | 54 | 55 | @Override 56 | protected void finalize() throws Throwable { 57 | super.finalize(); //To change body of generated methods, choose Tools | Templates. 58 | try { 59 | f.delete(); 60 | } catch (Exception e) { 61 | Driffta.log(e.toString()); 62 | } 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/driffta/DeconvolutionTask.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.upload.driffta; 2 | 3 | import com.microvolution.DeconvolutionLauncher; 4 | import com.microvolution.dispatch.DeconTask; 5 | import ij.ImagePlus; 6 | import ij.process.FloatProcessor; 7 | 8 | public class DeconvolutionTask extends DeconTask { 9 | 10 | // Any necessary start up, like loading file from disk 11 | @Override 12 | public void start() { 13 | System.out.println("starting"); 14 | } 15 | 16 | private final ImagePlus imp; 17 | private final ImagePlus ret; 18 | 19 | private final int frame; 20 | private final int channel; 21 | private float prevSumIntensities = 0; 22 | 23 | public DeconvolutionTask(ImagePlus singleStack, int frame, int channel, ImagePlus returnStack) { 24 | this.imp = singleStack; 25 | this.frame = frame; 26 | this.channel = channel; 27 | this.ret = returnStack; 28 | } 29 | 30 | // Transfer data to launcher 31 | @Override 32 | public void toLauncher(DeconvolutionLauncher launcher) { 33 | Driffta.log("Frame#" + frame + ", ch#" + channel + " loading data"); 34 | prevSumIntensities = 0; 35 | for (int i = 0; i < params.nz(); i++) { 36 | float[][] pix = ((imp != null) ? imp.getImageStack().getProcessor(i + 1) : ret.getImageStack().getProcessor(ret.getStackIndex(channel, i + 1, frame))).getFloatArray(); 37 | float[] data = new float[(int) (params.nx() * params.ny())]; 38 | int cnt = 0; 39 | for (int y = 0; y < pix[0].length; y++) { 40 | for (int x = 0; x < pix.length; x++) { 41 | data[cnt++] = pix[x][y]; 42 | prevSumIntensities += pix[x][y]; 43 | } 44 | 45 | } 46 | launcher.SetImageSlice(i, data); 47 | } 48 | Driffta.log("Frame#" + frame + ", ch#" + channel + " starting deconvolution"); 49 | } 50 | 51 | // Copy back from launcher 52 | @Override 53 | public void fromLauncher(DeconvolutionLauncher launcher) { 54 | Driffta.log("Frame#" + frame + ", ch#" + channel + " ready"); 55 | float[][] slices = new float[(int) params.nz()][]; 56 | float sum = 0; 57 | 58 | for (int i = 0; i < params.nz(); i++) { 59 | float[] data = new float[(int) (params.nx() * params.ny())]; 60 | launcher.RetrieveImageSlice(i, data); 61 | for (float f : data) { 62 | sum += f; 63 | } 64 | slices[i] = data; 65 | } 66 | 67 | float scaling = (prevSumIntensities / sum)/2.0f; 68 | 69 | Driffta.log("scaling: " + scaling); 70 | 71 | for (int i = 0; i < params.nz(); i++) { 72 | for (int j = 0; j < slices[i].length; j++) { 73 | slices[i][j] *= scaling; 74 | } 75 | ret.getStack().setProcessor(new FloatProcessor((int) params.nx(), (int) params.ny(), slices[i], ret.getImageStack().getProcessor(ret.getStackIndex(channel, i + 1, frame)).getColorModel()).convertToShortProcessor(false), ret.getStackIndex(channel, i + 1, frame)); 76 | } 77 | 78 | } 79 | 80 | // Finish up, eg save to disk 81 | @Override 82 | public void finish() { 83 | System.out.println("finishing"); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/driffta/DriftcompInterlockDispatcher.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.upload.driffta; 7 | 8 | import java.io.BufferedWriter; 9 | import java.io.File; 10 | import java.io.FileWriter; 11 | import java.io.IOException; 12 | 13 | /** 14 | * 15 | * @author CODEX 16 | */ 17 | public class DriftcompInterlockDispatcher { 18 | 19 | private static File f = new File(System.getProperty("java.io.tmpdir")+"driftcompLock.lck"); 20 | 21 | private static boolean hasLck; 22 | 23 | private static BufferedWriter br; 24 | 25 | public static boolean hasLock() { 26 | return hasLck; 27 | } 28 | 29 | 30 | public static void waitForLock() throws InterruptedException{ 31 | while(f.exists()){ 32 | try { 33 | f.delete(); 34 | } catch (Exception e) { 35 | Driffta.log(e.toString()); 36 | } 37 | Thread.sleep(100); 38 | } 39 | } 40 | 41 | public static void gainLock()throws IOException, InterruptedException{ 42 | waitForLock(); 43 | br = new BufferedWriter(new FileWriter(f)); 44 | br.write("locked"); 45 | 46 | } 47 | 48 | public static void releaseLock()throws IOException, InterruptedException{ 49 | br.flush(); 50 | br.close(); 51 | f.delete(); 52 | } 53 | 54 | 55 | @Override 56 | protected void finalize() throws Throwable { 57 | super.finalize(); //To change body of generated methods, choose Tools | Templates. 58 | try { 59 | f.delete(); 60 | } catch (Exception e) { 61 | Driffta.log(e.toString()); 62 | } 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/driffta/Find_focused_slices.java: -------------------------------------------------------------------------------- 1 | 2 | package org.nolanlab.codex.upload.driffta; 3 | 4 | import ij.*; 5 | import ij.gui.*; 6 | import ij.measure.*; 7 | import ij.plugin.filter.*; 8 | import ij.process.*; 9 | 10 | import java.awt.*; 11 | 12 | 13 | public class Find_focused_slices { 14 | 15 | ImagePlus imp; 16 | boolean abort = false; 17 | double percent, vThr; 18 | boolean consecutive, verbose, edge ; 19 | 20 | public int setup(String arg, ImagePlus imp) { 21 | this.imp = imp; 22 | return PlugInFilter.DOES_ALL; 23 | } 24 | 25 | public int run(ImageProcessor ip) { 26 | 27 | if(imp.isHyperStack()){ 28 | IJ.error("HyperStack is not supported.\nPlease split channels or time frames\nthen do the find focus seperately"); 29 | return -1; 30 | } 31 | 32 | ImageStack stack = imp.getStack(); 33 | int width = imp.getWidth(); 34 | int height = imp.getHeight(); 35 | String name = imp.getTitle(); 36 | ImageStack stack2 = new ImageStack(width, height, imp.getProcessor().getColorModel()); 37 | int fS = 0; 38 | 39 | int size = stack.getSize(); 40 | if (size == 1){ 41 | IJ.error("Stack required."); 42 | return -1; 43 | } 44 | 45 | double vMax = 0; 46 | double[] varA = new double[size]; 47 | 48 | if (!getParam()) { 49 | return-1; 50 | } 51 | 52 | if (verbose) { 53 | IJ.log("\n" + "Processing: " + name); 54 | } 55 | for (int slice = 1; slice <= size; slice++) { 56 | imp.setSlice(slice); 57 | IJ.showStatus(" " + slice + "/" + size); 58 | ip = imp.getProcessor(); 59 | varA[slice - 1] = calVar(ip); 60 | if (verbose) { 61 | IJ.log("Slice: " + slice + "\t\t Variance: " + varA[slice - 1]); 62 | } 63 | if (varA[slice - 1] > vMax) { 64 | vMax = varA[slice - 1]; 65 | fS = slice; 66 | } 67 | 68 | } 69 | if (vMax < vThr) { 70 | IJ.error("All slices are below the variance threshold value"); 71 | return-1; 72 | } 73 | if (verbose) { 74 | IJ.log("Slices selected: "); 75 | } 76 | 77 | 78 | return fS; 79 | 80 | } 81 | 82 | double calVar(ImageProcessor ip) { 83 | 84 | double variance = 0; 85 | int W = ip.getWidth(); 86 | int H = ip.getHeight(); 87 | 88 | Rectangle r = ip.getRoi(); 89 | if (r == null) { 90 | r.x = 0; 91 | r.y = 0; 92 | r.height = H; 93 | r.width = W; 94 | } 95 | ImageProcessor edged = ip.duplicate(); 96 | if (edge) edged.findEdges(); 97 | double mean = ImageStatistics.getStatistics(edged, Measurements.MEAN, null).mean; 98 | double a = 0; 99 | for (int y = r.y; y < (r.y + r.height); y++) { 100 | for (int x = r.x; x < (r.x + r.width); x++) { 101 | a += Math.pow(edged.getPixel(x, y) - mean, 2); 102 | } 103 | } 104 | variance = (1 / (W * H * mean)) * a; 105 | return variance; 106 | 107 | } 108 | 109 | private boolean getParam() { 110 | /*GenericDialog gd = new GenericDialog("Find focused slices", IJ.getInstance()); 111 | 112 | gd.addNumericField("Select images with at least", 80, 1, 4, "% of maximum variance."); 113 | gd.addNumericField("Variance threshold: ", 0, 3); 114 | gd.addCheckbox("Edge filter?", false); 115 | gd.addCheckbox("Select_only consecutive slices?", false); 116 | gd.addCheckbox("verbose mode?", true); 117 | gd.showDialog(); 118 | if (gd.wasCanceled()) { 119 | return false; 120 | }*/ 121 | 122 | percent = 100;//gd.getNextNumber(); 123 | vThr = 0;//gd.getNextNumber(); 124 | edge = true;//gd.getNextBoolean(); 125 | consecutive = false;//gd.getNextBoolean(); 126 | verbose = false;//gd.getNextBoolean(); 127 | 128 | 129 | return true; 130 | 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/driffta/OpenImage.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.upload.driffta; 7 | 8 | import com.sun.imageio.spi.FileImageInputStreamSpi; 9 | import ij.IJ; 10 | import ij.ImageJ; 11 | import ij.ImagePlus; 12 | 13 | import javax.imageio.ImageIO; 14 | import java.awt.image.BufferedImage; 15 | import java.io.File; 16 | import java.util.Calendar; 17 | 18 | /** 19 | * 20 | * @author Nikolay Samusik 21 | */ 22 | public class OpenImage { 23 | 24 | public static void main(String[] args) throws Exception { 25 | 26 | long time = Calendar.getInstance().getTimeInMillis(); 27 | FileImageInputStreamSpi stream = new FileImageInputStreamSpi(); 28 | BufferedImage bi = ImageIO.read(new File("D:\\001_00001_Z001_CH1.tif")); 29 | ImagePlus ip = new ImagePlus("tiff", bi); 30 | System.out.println(Calendar.getInstance().getTimeInMillis() - time); 31 | time = Calendar.getInstance().getTimeInMillis(); 32 | 33 | time = Calendar.getInstance().getTimeInMillis(); 34 | BufferedImage bi2 = ImageIO.read(new File("D:\\001_00001_Z001_CH2.tif")); 35 | System.out.println(Calendar.getInstance().getTimeInMillis() - time); 36 | 37 | time = Calendar.getInstance().getTimeInMillis(); 38 | BufferedImage bi3 = ImageIO.read(new File("D:\\001_00001_Z001_CH3.tif")); 39 | System.out.println(Calendar.getInstance().getTimeInMillis() - time); 40 | 41 | time = Calendar.getInstance().getTimeInMillis(); 42 | IJ.openImage("D:\\001_00001_Z001_CH1.tif"); 43 | System.out.println(Calendar.getInstance().getTimeInMillis() - time); 44 | 45 | time = Calendar.getInstance().getTimeInMillis(); 46 | IJ.openImage("D:\\001_00001_Z001_CH2.tif"); 47 | System.out.println(Calendar.getInstance().getTimeInMillis() - time); 48 | 49 | time = Calendar.getInstance().getTimeInMillis(); 50 | IJ.openImage("D:\\001_00001_Z001_CH3.tif"); 51 | System.out.println(Calendar.getInstance().getTimeInMillis() - time); 52 | 53 | new ImageJ().setVisible(true); 54 | 55 | 56 | 57 | ip.setImage(bi); 58 | 59 | IJ.saveAsTiff(ip, "D:\\tiff.tiff"); 60 | 61 | ip.show(); 62 | 63 | //ip2.show(); 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/driffta/RescaleImages.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.upload.driffta; 7 | 8 | import ij.IJ; 9 | import ij.ImageJ; 10 | import ij.ImagePlus; 11 | 12 | import java.io.File; 13 | import java.io.FilenameFilter; 14 | 15 | /** 16 | * 17 | * @author Nikolay 18 | */ 19 | public class RescaleImages { 20 | public static void main(String[] args) { 21 | File dir = new File("E:\\CODEX datasets\\5-20-16 pfizer-01\\deconv"); 22 | ImageJ ij = new ImageJ(); 23 | int i = 0; 24 | for (File f : dir.listFiles(new FilenameFilter() { 25 | @Override 26 | public boolean accept(File dir, String name) { 27 | return name.endsWith("tiff")|| name.endsWith("tif"); 28 | } 29 | })){ 30 | i++; 31 | if(i<=8) continue; 32 | System.err.println("Rescaling file#"+i + " " + f.getName()); 33 | ImagePlus imp = IJ.openImage(f.getPath()); 34 | IJ.run(imp, "Multiply...", "value=5"); 35 | IJ.save(imp, f.getPath()); 36 | imp.close(); 37 | } 38 | 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/driffta/SessionIdentifierGenerator.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.upload.driffta; 7 | 8 | import java.math.BigInteger; 9 | import java.security.SecureRandom; 10 | 11 | /** 12 | * 13 | * @author Nikolay Samusik 14 | */ 15 | public class SessionIdentifierGenerator { 16 | 17 | private SecureRandom random = new SecureRandom(); 18 | 19 | public String nextSessionId() { 20 | return new BigInteger(130, random).toString(32); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/driffta/SimpleImageInfo.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.upload.driffta; 2 | 3 | import java.io.*; 4 | 5 | public class SimpleImageInfo { 6 | private int height; 7 | private int width; 8 | private String mimeType; 9 | 10 | private SimpleImageInfo() { 11 | 12 | } 13 | 14 | public SimpleImageInfo(File file) throws IOException { 15 | InputStream is = new FileInputStream(file); 16 | try { 17 | processStream(is); 18 | } finally { 19 | is.close(); 20 | } 21 | } 22 | 23 | public SimpleImageInfo(InputStream is) throws IOException { 24 | processStream(is); 25 | } 26 | 27 | public SimpleImageInfo(byte[] bytes) throws IOException { 28 | InputStream is = new ByteArrayInputStream(bytes); 29 | try { 30 | processStream(is); 31 | } finally { 32 | is.close(); 33 | } 34 | } 35 | 36 | private void processStream(InputStream is) throws IOException { 37 | int c1 = is.read(); 38 | int c2 = is.read(); 39 | int c3 = is.read(); 40 | 41 | mimeType = null; 42 | width = height = -1; 43 | 44 | if (c1 == 'G' && c2 == 'I' && c3 == 'F') { // GIF 45 | is.skip(3); 46 | width = readInt(is,2,false); 47 | height = readInt(is,2,false); 48 | mimeType = "image/gif"; 49 | } else if (c1 == 0xFF && c2 == 0xD8) { // JPG 50 | while (c3 == 255) { 51 | int marker = is.read(); 52 | int len = readInt(is,2,true); 53 | if (marker == 192 || marker == 193 || marker == 194) { 54 | is.skip(1); 55 | height = readInt(is,2,true); 56 | width = readInt(is,2,true); 57 | mimeType = "image/jpeg"; 58 | break; 59 | } 60 | is.skip(len - 2); 61 | c3 = is.read(); 62 | } 63 | } else if (c1 == 137 && c2 == 80 && c3 == 78) { // PNG 64 | is.skip(15); 65 | width = readInt(is,2,true); 66 | is.skip(2); 67 | height = readInt(is,2,true); 68 | mimeType = "image/png"; 69 | } else if (c1 == 66 && c2 == 77) { // BMP 70 | is.skip(15); 71 | width = readInt(is,2,false); 72 | is.skip(2); 73 | height = readInt(is,2,false); 74 | mimeType = "image/bmp"; 75 | } else { 76 | int c4 = is.read(); 77 | if ((c1 == 'M' && c2 == 'M' && c3 == 0 && c4 == 42) 78 | || (c1 == 'I' && c2 == 'I' && c3 == 42 && c4 == 0)) { //TIFF 79 | boolean bigEndian = c1 == 'M'; 80 | int ifd = 0; 81 | int entries; 82 | ifd = readInt(is,4,bigEndian); 83 | is.skip(ifd - 8); 84 | entries = readInt(is,2,bigEndian); 85 | for (int i = 1; i <= entries; i++) { 86 | int tag = readInt(is,2,bigEndian); 87 | int fieldType = readInt(is,2,bigEndian); 88 | long count = readInt(is,4,bigEndian); 89 | int valOffset; 90 | if ((fieldType == 3 || fieldType == 8)) { 91 | valOffset = readInt(is,2,bigEndian); 92 | is.skip(2); 93 | } else { 94 | valOffset = readInt(is,4,bigEndian); 95 | } 96 | if (tag == 256) { 97 | width = valOffset; 98 | } else if (tag == 257) { 99 | height = valOffset; 100 | } 101 | if (width != -1 && height != -1) { 102 | mimeType = "image/tiff"; 103 | break; 104 | } 105 | } 106 | } 107 | } 108 | if (mimeType == null) { 109 | throw new IOException("Unsupported image type"); 110 | } 111 | } 112 | 113 | private int readInt(InputStream is, int noOfBytes, boolean bigEndian) throws IOException { 114 | int ret = 0; 115 | int sv = bigEndian ? ((noOfBytes - 1) * 8) : 0; 116 | int cnt = bigEndian ? -8 : 8; 117 | for(int i=0;i "); 27 | } 28 | 29 | @Override 30 | public void flush() { 31 | } 32 | 33 | @Override 34 | public void close() { 35 | } 36 | 37 | @Override 38 | public void write(int b) throws IOException { 39 | 40 | if (b == '\r') 41 | return; 42 | 43 | if (b == '\n') { 44 | final String text = sb.toString() + "\n"; 45 | SwingUtilities.invokeLater(() -> { 46 | textArea.append(text); 47 | if(location != null) { 48 | try { 49 | DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 50 | Date date = new Date(); 51 | BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(location, true)); 52 | bufferedWriter.write(dateFormat.format(date) + "\t" + text); 53 | bufferedWriter.flush(); 54 | bufferedWriter.close(); 55 | } catch (IOException e) { 56 | e.printStackTrace(); 57 | } 58 | } 59 | }); 60 | sb.setLength(0); 61 | sb.append(title + "> "); 62 | return; 63 | } 64 | sb.append((char) b); 65 | } 66 | } -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/model/ProcessingOptions.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.upload.model; 7 | 8 | import com.google.gson.Gson; 9 | import com.google.gson.GsonBuilder; 10 | import com.google.gson.stream.JsonReader; 11 | import org.nolanlab.codex.utils.EncryptUtils; 12 | 13 | import java.io.*; 14 | import java.lang.reflect.Modifier; 15 | import java.net.URL; 16 | 17 | /** 18 | * 19 | * @author Nikolay Samusik and Vishal 20 | */ 21 | public class ProcessingOptions { 22 | 23 | private File tempDir; 24 | private boolean useBleachMinimizingCrop; 25 | private boolean useBlindDeconvolution; 26 | private URL destinationUrl; 27 | private String username; 28 | private String password; 29 | private boolean doProcessing; 30 | private boolean doUpload; 31 | private boolean exportTiff; 32 | private boolean exportImgSeq; 33 | private int numThreads; 34 | private static String encoder = "encode"; 35 | 36 | public static ProcessingOptions load(File f) throws FileNotFoundException { 37 | Gson gson = new Gson(); 38 | JsonReader reader = new JsonReader(new FileReader(f)); 39 | ProcessingOptions out = gson.fromJson(reader, ProcessingOptions.class); 40 | return out; 41 | } 42 | 43 | public int getNumThreads() { 44 | return numThreads; 45 | } 46 | 47 | public ProcessingOptions(File tempDir, boolean useBleachMinimizingCrop, boolean useBlindDeconvolution, int numThreads, URL destinationUrl, String username, String password, boolean doUpload, boolean exportTiff, boolean exportImgSeq) { 48 | this.tempDir = tempDir; 49 | this.useBleachMinimizingCrop = useBleachMinimizingCrop; 50 | this.useBlindDeconvolution = useBlindDeconvolution; 51 | this.numThreads = numThreads; 52 | this.destinationUrl = destinationUrl; 53 | this.username = username; 54 | this.password = EncryptUtils.xorMessage(password, encoder); 55 | this.doProcessing = true; 56 | this.doUpload = doUpload; 57 | this.exportTiff = exportTiff; 58 | this.exportImgSeq = exportImgSeq; 59 | } 60 | 61 | public URL getDestinationUrl() { 62 | return destinationUrl; 63 | } 64 | 65 | public boolean doProcessing() { 66 | return doProcessing; 67 | } 68 | 69 | public boolean doUpload() { 70 | return doUpload; 71 | } 72 | 73 | public boolean isUseBleachMinimizingCrop() { 74 | return useBleachMinimizingCrop; 75 | } 76 | 77 | public boolean isUseBlindDeconvolution() { 78 | return useBlindDeconvolution; 79 | } 80 | 81 | public File getTempDir() { 82 | return tempDir; 83 | } 84 | 85 | public String getUsername() { 86 | return username; 87 | } 88 | 89 | public String getPassword() { 90 | return EncryptUtils.xorMessage(password, encoder); 91 | } 92 | 93 | public boolean isExportTiff() { 94 | return exportTiff; 95 | } 96 | 97 | public void setExportTiff(boolean exportTiff) { 98 | this.exportTiff = exportTiff; 99 | } 100 | 101 | public boolean isExportImgSeq() { 102 | return exportImgSeq; 103 | } 104 | 105 | public void setExportImgSeq(boolean exportImgSeq) { 106 | this.exportImgSeq = exportImgSeq; 107 | } 108 | 109 | public void saveToFile(File f) throws IOException { 110 | Gson gson = new GsonBuilder() 111 | .excludeFieldsWithModifiers(Modifier.TRANSIENT) // include static 112 | .create(); 113 | String js = gson.toJson(this).replaceAll(",", ",\n"); 114 | BufferedWriter bw = new BufferedWriter(new FileWriter(f)); 115 | bw.write(js); 116 | bw.flush(); 117 | bw.close(); 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/scope/Microscope.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.upload.scope; 2 | 3 | import org.nolanlab.codex.upload.legacy.ExperimentView; 4 | import org.nolanlab.codex.upload.gui.NewGUI; 5 | 6 | import java.io.File; 7 | 8 | /** 9 | * 10 | * @author Vishal 11 | */ 12 | public interface Microscope { 13 | 14 | // Legacy 15 | public void guessZSlices(File dir, ExperimentView experimentView); 16 | public void guessChannelNamesAndWavelength(File dir, ExperimentView experimentView); 17 | public void guessCycleRange(File dir, ExperimentView experimentView); 18 | public boolean isTilesAProductOfRegionXAndY(File dir, ExperimentView experimentView); 19 | 20 | public void guessZSlices(File dir, NewGUI gui); 21 | public void guessChannelNamesAndWavelength(File dir, NewGUI gui); 22 | public void guessCycleRange(File dir, NewGUI gui); 23 | public boolean isTilesAProductOfRegionXAndY(File dir, NewGUI gui); 24 | public void guessTileOverlap(NewGUI gui); 25 | public int getMaxCycNumberFromFolder(File dir); 26 | public void guessWidthAndHeight(File dir, NewGUI gui); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/scope/MicroscopeFactory.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.upload.scope; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | 5 | /** 6 | * 7 | * @author Vishal 8 | */ 9 | public class MicroscopeFactory { 10 | 11 | public static Microscope getMicroscope(String criteria) { 12 | if (StringUtils.containsIgnoreCase(MicroscopeTypeEnum.KEYENCE.toString(), criteria)) { 13 | return new Keyence(); 14 | } 15 | else if (StringUtils.containsIgnoreCase(MicroscopeTypeEnum.ZEISS.toString(), criteria)) { 16 | return new Zeiss(); 17 | } 18 | return null; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/upload/scope/MicroscopeTypeEnum.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.upload.scope; 2 | 3 | /** 4 | * 5 | * @author Vishal 6 | */ 7 | public enum MicroscopeTypeEnum { 8 | KEYENCE("Keyence BZ-X710"), 9 | ZEISS("Zeiss ZEN"), 10 | LEICA("Leica DMI8"); 11 | 12 | private final String type; 13 | 14 | MicroscopeTypeEnum(String type) { 15 | this.type = type; 16 | } 17 | 18 | public boolean equalsType(String otherType) { 19 | return type.equals(otherType); 20 | } 21 | 22 | public String toString() { 23 | return type; 24 | } 25 | 26 | public static MicroscopeTypeEnum getMicroscopeFromValue(String type) { 27 | switch (type) { 28 | case "Keyence BZ-X710": 29 | return KEYENCE; 30 | case "Zeiss ZEN": 31 | return ZEISS; 32 | case "Leica DMI8": 33 | return LEICA; 34 | default: 35 | return KEYENCE; 36 | } 37 | } 38 | 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/utils/EncryptUtils.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.utils; 2 | 3 | 4 | public class EncryptUtils { 5 | 6 | public static final String DEFAULT_ENCODING = "UTF-8"; 7 | 8 | 9 | public static void main(String[] args) { 10 | /*String txt = "some text to be encrypted"; 11 | String key = "key phrase used for XOR-ing"; 12 | System.out.println(txt + " XOR-ed to: " + (txt = xorMessage(txt, key))); 13 | 14 | String encoded = base64encode(txt); 15 | System.out.println(" is encoded to: " + encoded + " and that is decoding to: " + (txt = base64decode(encoded))); 16 | System.out.print("XOR-ing back to original: " + xorMessage(txt, key));*/ 17 | 18 | String msg = "P@ssw0rd.123"; 19 | 20 | String key = "encoder"; 21 | 22 | System.out.println(msg); 23 | msg = xorMessage(msg, key); 24 | System.out.println(msg); 25 | msg = xorMessage(msg, key); 26 | System.out.println(msg); 27 | 28 | } 29 | 30 | public static String xorMessage(String message, String key) { 31 | try { 32 | if (message == null || key == null) { 33 | return null; 34 | } 35 | char[] keys = key.toCharArray(); 36 | char[] mesg = message.toCharArray(); 37 | 38 | int ml = mesg.length; 39 | int kl = keys.length; 40 | char[] newmsg = new char[ml]; 41 | 42 | for (int i = 0; i < ml; i++) { 43 | newmsg[i] = (char) (mesg[i] ^ keys[i % kl]); 44 | }//for i 45 | 46 | return new String(newmsg); 47 | } catch (Exception e) { 48 | return null; 49 | } 50 | }//xorMessage 51 | }//class 52 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/utils/TileObject.java: -------------------------------------------------------------------------------- 1 | package org.nolanlab.codex.utils; 2 | 3 | import ij.ImagePlus; 4 | import org.apache.commons.io.FilenameUtils; 5 | /** 6 | * 7 | * @author Vishal 8 | */ 9 | 10 | public class TileObject { 11 | 12 | private int regionNumber; 13 | private int xNumber; 14 | private int yNumber; 15 | private int width; 16 | private int height; 17 | private String fileName; 18 | 19 | public int getRegionNumber() { 20 | return regionNumber; 21 | } 22 | 23 | public int getXNumber() { 24 | return xNumber; 25 | } 26 | 27 | public int getYNumber() { 28 | return yNumber; 29 | } 30 | 31 | public int getWidth() { 32 | return width; 33 | } 34 | 35 | public int getHeight() { 36 | return height; 37 | } 38 | 39 | public String getFileName() { 40 | return fileName; 41 | } 42 | 43 | public TileObject() { 44 | } 45 | 46 | public TileObject(ImagePlus tiffImp, String tifFileName) { 47 | this.width = tiffImp.getWidth(); 48 | this.height = tiffImp.getHeight(); 49 | 50 | String regionNumberStr = tifFileName.substring(3, 6); 51 | this.regionNumber = regionNumberStr == null? 0 : Integer.parseInt(regionNumberStr); 52 | 53 | String xNumberStr = tifFileName.substring(8, 10); 54 | this.xNumber = xNumberStr == null? 0 : Integer.parseInt(xNumberStr); 55 | 56 | String yNumberStr = tifFileName.substring(12, 14); 57 | this.yNumber = yNumberStr == null? 0 : Integer.parseInt(yNumberStr); 58 | 59 | this.fileName = FilenameUtils.removeExtension(tifFileName); 60 | } 61 | 62 | public TileObject (String tifFileName) { 63 | String regionNumberStr = tifFileName.substring(3, 6); 64 | this.regionNumber = regionNumberStr == null? 0 : Integer.parseInt(regionNumberStr); 65 | 66 | String xNumberStr = tifFileName.substring(8, 10); 67 | this.xNumber = xNumberStr == null? 0 : Integer.parseInt(xNumberStr); 68 | 69 | String yNumberStr = tifFileName.substring(12, 14); 70 | this.yNumber = yNumberStr == null? 0 : Integer.parseInt(yNumberStr); 71 | 72 | this.fileName = FilenameUtils.removeExtension(tifFileName); 73 | } 74 | 75 | @Override 76 | public String toString() { 77 | return "File name: " + fileName+ " region number: "+regionNumber+" xNumber: "+xNumber+" yNumber: "+yNumber+"Image width: "+width+"Image height: "+height; 78 | } 79 | 80 | @Override 81 | public int hashCode() { 82 | int hashCode = 0; 83 | hashCode = (regionNumber*10000) + (xNumber*100) + yNumber; 84 | return hashCode; 85 | } 86 | 87 | @Override 88 | public boolean equals(Object obj) { 89 | if(obj instanceof TileObject) { 90 | TileObject to = (TileObject) obj; 91 | return (to.regionNumber == this.regionNumber && to.xNumber == this.xNumber && to.yNumber == this.yNumber); 92 | } 93 | else { 94 | return false; 95 | } 96 | } 97 | 98 | public TileObject createTileFromFileNameWithoutImage(String tifFileName) { 99 | String regionNumberStr = tifFileName.substring(3, 6); 100 | this.regionNumber = regionNumberStr == null? 0 : Integer.parseInt(regionNumberStr); 101 | 102 | String xNumberStr = tifFileName.substring(8, 10); 103 | this.xNumber = xNumberStr == null? 0 : Integer.parseInt(xNumberStr); 104 | 105 | String yNumberStr = tifFileName.substring(12, 14); 106 | this.yNumber = yNumberStr == null? 0 : Integer.parseInt(yNumberStr); 107 | 108 | this.fileName = FilenameUtils.removeExtension(tifFileName); 109 | 110 | return this; 111 | } 112 | } -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/utils/logger.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this template, choose Tools | Templates 3 | * and open the template in the editor. 4 | */ 5 | package org.nolanlab.codex.utils; 6 | 7 | import javax.swing.*; 8 | import java.io.ByteArrayOutputStream; 9 | import java.io.PrintStream; 10 | 11 | /** 12 | * 13 | * @author Nikolay 14 | */ 15 | public class logger { 16 | 17 | private static int outputMode = 0; 18 | public static final int OUTPUT_MODE_CONSOLE = 0; 19 | public static final int OUTPUT_MODE_GUI = 1; 20 | public static final int OUTPUT_MODE_NONE = 2; 21 | public static PrintStream addlStream; 22 | 23 | public static void setAdditionalWriter(PrintStream stream){ 24 | addlStream = stream; 25 | } 26 | 27 | public static void print(Object... obj) { 28 | 29 | if(outputMode==OUTPUT_MODE_NONE) return; 30 | if (obj.length == 0) { 31 | return; 32 | } 33 | StringBuilder sb = new StringBuilder(""); 34 | 35 | for (int i = 0; i < obj.length - 1; i++) { 36 | sb.append(obj[i]); 37 | sb.append(", "); 38 | } 39 | sb.append(obj[obj.length - 1]); 40 | 41 | System.err.println(sb.toString()); 42 | if(addlStream!=null){ 43 | addlStream.println(sb.toString()); 44 | } 45 | } 46 | 47 | public static void setOutputMode(int mode) { 48 | if (mode < 0 || mode > 2) { 49 | throw new IllegalArgumentException("Mode value is outside of the allowed range"); 50 | } 51 | outputMode = mode; 52 | } 53 | 54 | public static void showException(Throwable e) { 55 | if (outputMode == OUTPUT_MODE_NONE) { 56 | return; 57 | } 58 | if (outputMode == OUTPUT_MODE_GUI) { 59 | ByteArrayOutputStream bs = new ByteArrayOutputStream(); 60 | PrintStream ps = new PrintStream(bs); 61 | e.printStackTrace(ps); 62 | String s = bs.toString(); 63 | String[] s2 = s.split("\n"); 64 | String s3 = ""; 65 | for (int i = 0; i < Math.min(s2.length,5); i++) { 66 | s3 += s2[i] + "\n"; 67 | } 68 | s3 += "..."; 69 | JOptionPane.showMessageDialog(null, s3, "Exception", JOptionPane.ERROR_MESSAGE); 70 | } else { 71 | e.printStackTrace(); 72 | } 73 | 74 | if(addlStream!=null){ 75 | ByteArrayOutputStream bs = new ByteArrayOutputStream(); 76 | PrintStream ps = new PrintStream(bs); 77 | e.printStackTrace(ps); 78 | String s = bs.toString(); 79 | String[] s2 = s.split("\n"); 80 | String s3 = ""; 81 | for (int i = 0; i < s2.length; i++) { 82 | s3 += s2[i] + "\n"; 83 | } 84 | s3 += "..."; 85 | addlStream.print(s3 + "\n"); 86 | } 87 | 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/main/java/org/nolanlab/codex/utils/util.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.nolanlab.codex.utils; 7 | 8 | /** 9 | * 10 | * @author Nikolay Samusik 11 | */ 12 | public class util { 13 | 14 | public static String concat(String[] s) { 15 | if (s.length == 0) { 16 | return ""; 17 | } 18 | String out = s[0]; 19 | for (int i = 1; i < s.length; i++) { 20 | out += (";" + s[i]); 21 | } 22 | return out; 23 | } 24 | 25 | public static String concat(int[] s) { 26 | if (s.length == 0) { 27 | return ""; 28 | } 29 | String out = String.valueOf(s[0]); 30 | for (int i = 1; i < s.length; i++) { 31 | out += (";" + s[i]); 32 | } 33 | return out; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | # Version 2 | name=Nolan Lab CODEX Uploader 3 | version=1.5.6 4 | timestamp= 5 | -------------------------------------------------------------------------------- /src/main/resources/resources/codex/codex-icon-circle-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/src/main/resources/resources/codex/codex-icon-circle-256x256.png -------------------------------------------------------------------------------- /src/main/resources/resources/codex/codex-logo-horizontal-1920x665.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/src/main/resources/resources/codex/codex-logo-horizontal-1920x665.png -------------------------------------------------------------------------------- /src/main/resources/resources/codex/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/src/main/resources/resources/codex/logo.png -------------------------------------------------------------------------------- /src/main/resources/resources/codex/nolanlab-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/src/main/resources/resources/codex/nolanlab-logo.png -------------------------------------------------------------------------------- /src/test/java/com/akoya/codex/TestHelper.java: -------------------------------------------------------------------------------- 1 | package com.akoya.codex; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.io.InputStreamReader; 6 | 7 | /** 8 | * @author Vishal 9 | */ 10 | public class TestHelper { 11 | 12 | public static void waitAndPrint(Process proc) throws IOException { 13 | do { 14 | try { 15 | BufferedReader brOut = new BufferedReader(new InputStreamReader(proc.getInputStream())); 16 | String s = null; 17 | while ((s = brOut.readLine()) != null) { 18 | log(s); 19 | } 20 | 21 | BufferedReader brErr = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 22 | 23 | while ((s = brErr.readLine()) != null) { 24 | log("ERROR>" + s); 25 | } 26 | 27 | Thread.sleep(100); 28 | 29 | } catch (InterruptedException e) { 30 | log("Process interrupted"); 31 | return; 32 | } 33 | } while (proc.isAlive()); 34 | log("Process done"); 35 | } 36 | 37 | public static void log(String s) { 38 | System.out.println(s); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/test/java/com/akoya/codex/clustering/ClusteringTest.java: -------------------------------------------------------------------------------- 1 | package com.akoya.codex.clustering; 2 | 3 | import org.nolanlab.codex.OkayMockOptionPane; 4 | import org.nolanlab.codex.clustering.ImportConfigFrm; 5 | import org.nolanlab.codex.clustering.frmCluster; 6 | import org.testng.Assert; 7 | import org.testng.annotations.BeforeTest; 8 | import org.testng.annotations.Test; 9 | import org.testng.annotations.AfterTest; 10 | 11 | import javax.swing.*; 12 | import java.awt.event.ActionEvent; 13 | import java.io.*; 14 | import java.util.Scanner; 15 | 16 | /** 17 | * @author Vishal 18 | */ 19 | public class ClusteringTest { 20 | 21 | private frmCluster frm; 22 | private ImportConfigFrm importConfigFrm; 23 | private JTextField fcsFolderField; 24 | private String inDir; 25 | 26 | @BeforeTest 27 | public void setUp() throws Exception { 28 | frm = new frmCluster(); 29 | frm.setOptionPane(new OkayMockOptionPane()); 30 | fcsFolderField = frm.getFcsFolderField(); 31 | // fcsFolderField.setText("F:\\exp2TestPro"); 32 | fcsFolderField.setText("C:\\exp2TestProcessed"); 33 | frm.initComponents(); 34 | importConfigFrm = frm.getImpConfigFrm(); 35 | inDir = fcsFolderField.getText(); 36 | frm.setClustCols("3,4,5"); 37 | importConfigFrm.setLimitEvents("-1"); 38 | importConfigFrm.setTransformation("NONE"); 39 | importConfigFrm.setScalingFactor("5"); 40 | importConfigFrm.setNoiseThreshold("1.0"); 41 | importConfigFrm.setRescale("NONE"); 42 | importConfigFrm.setQuantile("1.0"); 43 | importConfigFrm.setRescaleSeparately("True"); 44 | } 45 | 46 | @Test(priority = 1) 47 | public void testConfig() throws Exception { 48 | File clusteringTestRunFile = new File(inDir + File.separator + "clusteringTestLog.txt"); 49 | PrintStream p = new PrintStream(clusteringTestRunFile); 50 | System.setOut(p); 51 | System.setErr(p); 52 | 53 | int sec =0; 54 | Thread th= frm.cmdCreateButtonClicked(new ActionEvent(this, 1, "TestEvt")); 55 | do { 56 | Thread.currentThread().sleep(1000); 57 | }while(th.isAlive() && (sec++) < 600); 58 | 59 | 60 | Assert.assertTrue(sec < 600); 61 | Assert.assertTrue(clusteringTestRunFile.exists()); 62 | } 63 | 64 | @Test(priority = 2) 65 | public void testLogFileForErrors() throws Exception { 66 | File clusteringTestRunFile = new File(inDir+File.separator+"clusteringTestLog.txt"); 67 | Scanner scanner = new Scanner(clusteringTestRunFile); 68 | while (scanner.hasNextLine()) { 69 | String line = scanner.nextLine(); 70 | Assert.assertFalse(line == null || (line.toLowerCase().contains("error") || line.toLowerCase().contains("exception"))); 71 | } 72 | } 73 | 74 | @Test(priority = 3) 75 | public void testClusteringResults() throws Exception { 76 | //Check if out folder and .fcs files are created 77 | File dir = new File(inDir + File.separator + "out"); 78 | Assert.assertTrue(dir != null && dir.exists() && dir.isDirectory()); 79 | 80 | File[] fcsFiles = dir.listFiles(f -> f.getName().toLowerCase().endsWith(".fcs")); 81 | Assert.assertTrue(fcsFiles != null && fcsFiles.length != 0); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/test/java/com/akoya/codex/segm/SegmMainTest.java: -------------------------------------------------------------------------------- 1 | package com.akoya.codex.segm; 2 | 3 | 4 | import org.nolanlab.codex.OkayMockOptionPane; 5 | import org.nolanlab.codex.segm.SegmConfigFrm; 6 | import org.nolanlab.codex.segm.SegmMain; 7 | import org.testng.Assert; 8 | import org.testng.annotations.BeforeTest; 9 | import org.testng.annotations.Test; 10 | 11 | import javax.swing.*; 12 | import java.awt.event.ActionEvent; 13 | import java.io.*; 14 | import java.util.Scanner; 15 | 16 | /** 17 | * @author Vishal 18 | */ 19 | public class SegmMainTest { 20 | private SegmMain seg; 21 | private SegmConfigFrm segFrm; 22 | private JTextField configField; 23 | private String inDir; 24 | private File configFile; 25 | 26 | @BeforeTest 27 | public void setUp() throws Exception { 28 | seg = new SegmMain(); 29 | seg.setOptionPane(new OkayMockOptionPane()); 30 | configField = seg.getConfigField(); 31 | //configField.setText("F:\\exp2TestPro"); 32 | configField.setText("C:\\exp2TestProcessed"); 33 | seg.initComponents(); 34 | segFrm = seg.getSegmConfigFrm(); 35 | inDir = configField.getText(); 36 | segFrm.setRadius("5"); 37 | segFrm.setMaxCutOff("0.99"); 38 | segFrm.setMinCutOff("0.05"); 39 | segFrm.setRelativeCutOff("0.2"); 40 | segFrm.setNuclearStainChannel("1"); 41 | segFrm.setNuclearStainCycle("1");; 42 | segFrm.setMembraneStainChannel("1"); 43 | segFrm.setMembraneStainCycle("-1"); 44 | } 45 | 46 | @Test(priority = 1) 47 | public void testChannelNames() throws Exception { 48 | File channelNamesFile = new File(inDir + File.separator + "channelNames.txt"); 49 | Assert.assertTrue(channelNamesFile != null && channelNamesFile.exists() && channelNamesFile.isFile()); 50 | } 51 | 52 | @Test(priority = 2) 53 | public void testTileMap() throws Exception { 54 | File tileMapFile = new File(inDir + File.separator + "tileMap.txt"); 55 | Assert.assertTrue(tileMapFile != null && tileMapFile.exists() && tileMapFile.isFile()); 56 | } 57 | 58 | @Test(priority = 3) 59 | public void testSegm() throws Exception { 60 | File segmTestRunFile = new File(inDir + File.separator + "segmMainTestLog.txt"); 61 | PrintStream p = new PrintStream(segmTestRunFile); 62 | System.setOut(p); 63 | System.setErr(p); 64 | 65 | int sec =0; 66 | Thread th= seg.cmdCreateButtonClicked(new ActionEvent(this, 1, "TestEvt")); 67 | do { 68 | Thread.currentThread().sleep(1000); 69 | }while(th.isAlive() && (sec++) < 600); 70 | 71 | 72 | Assert.assertTrue(sec < 600); 73 | Assert.assertTrue(segmTestRunFile != null && segmTestRunFile.exists()); 74 | } 75 | 76 | @Test(priority = 4) 77 | public void testConfig() throws Exception { 78 | configFile = new File(inDir + File.separator + "config.txt"); 79 | Assert.assertTrue(configFile != null && configFile.exists() && configFile.isFile()); 80 | } 81 | 82 | @Test(priority = 5) 83 | public void testLogFileForErrors() throws Exception { 84 | File segmTestRunFile = new File(inDir+File.separator+"segmMainTestLog.txt"); 85 | Scanner scanner = new Scanner(segmTestRunFile); 86 | while (scanner.hasNextLine()) { 87 | String line = scanner.nextLine(); 88 | Assert.assertFalse(line == null || (line.toLowerCase().contains("error") || line.toLowerCase().contains("exception"))); 89 | } 90 | } 91 | 92 | @Test(priority = 6) 93 | public void testConcatenateResults() throws Exception { 94 | //Check if .txt files are created 95 | File dir = new File(inDir); 96 | File[] txtFiles = dir.listFiles(f -> f.getName().toLowerCase().endsWith("compensated.txt")); 97 | Assert.assertTrue(txtFiles != null && txtFiles.length != 0); 98 | } 99 | 100 | @Test(priority = 7) 101 | public void testMakeFCS() throws Exception { 102 | //Check if .fcs files are created 103 | File dir = new File(inDir); 104 | File[] fcsFiles = dir.listFiles(f -> f.getName().toLowerCase().endsWith(".fcs")); 105 | Assert.assertTrue(fcsFiles != null && fcsFiles.length != 0); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/test/resources/testng-all.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/DefaultOptionPane.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/DefaultOptionPane.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/OkayMockOptionPane.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/OkayMockOptionPane.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/OptionPane.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/OptionPane.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/clustering/ImportConfigFrm$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/clustering/ImportConfigFrm$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/clustering/ImportConfigFrm$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/clustering/ImportConfigFrm$2.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/clustering/ImportConfigFrm.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/clustering/ImportConfigFrm.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/clustering/frmCluster$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/clustering/frmCluster$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/clustering/frmCluster$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/clustering/frmCluster$2.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/clustering/frmCluster$3.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/clustering/frmCluster$3.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/clustering/frmCluster.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/clustering/frmCluster.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Cell.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Cell.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/CellViewer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/CellViewer.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/ConcatenateCSVCodexWeb$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/ConcatenateCSVCodexWeb$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/ConcatenateCSVCodexWeb.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/ConcatenateCSVCodexWeb.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/ConcatenateResults.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/ConcatenateResults.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/CovarianceMatrix.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/CovarianceMatrix.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/FFTFilter$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/FFTFilter$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/FFTFilter.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/FFTFilter.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/GMM$CellBubble.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/GMM$CellBubble.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/GMM.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/GMM.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/GrahamScan.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/GrahamScan.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Kernel3D.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Kernel3D.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/MahalonobisDistance.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/MahalonobisDistance.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Main.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Main.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/MakeFCS$DP.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/MakeFCS$DP.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/MakeFCS.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/MakeFCS.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/MatrixOp.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/MatrixOp.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/MaximaFinder3D$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/MaximaFinder3D$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/MaximaFinder3D$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/MaximaFinder3D$2.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/MaximaFinder3D.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/MaximaFinder3D.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Neighborhood$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Neighborhood$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Neighborhood.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Neighborhood.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Point2D$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Point2D$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Point2D$Atan2Order.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Point2D$Atan2Order.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Point2D$DistanceToOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Point2D$DistanceToOrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Point2D$PolarOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Point2D$PolarOrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Point2D$ROrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Point2D$ROrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Point2D$XOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Point2D$XOrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Point2D$YOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Point2D$YOrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Point2D.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Point2D.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Point3D.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Point3D.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/ProfileAverager.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/ProfileAverager.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/RegionImageWriter.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/RegionImageWriter.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegConfigParam.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegConfigParam.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmConfigFrm$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmConfigFrm$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmConfigFrm$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmConfigFrm$2.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmConfigFrm.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmConfigFrm.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmMain$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmMain$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmMain$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmMain$2.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmMain$3.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmMain$3.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmMain$4.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmMain$4.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmMain$5.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmMain$5.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmMain.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmMain.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Segmentation$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Segmentation$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/Segmentation.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/Segmentation.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/SegmentedObject.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/SegmentedObject.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/StackNormalizer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/StackNormalizer.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/TIFFtoJPEG$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/TIFFtoJPEG$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/TIFFtoJPEG.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/TIFFtoJPEG.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/segm/XMLParse.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/segm/XMLParse.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/CellTypeCooccurence.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/CellTypeCooccurence.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/DelaunayGraph$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/DelaunayGraph$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/DelaunayGraph$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/DelaunayGraph$2.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/DelaunayGraph.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/DelaunayGraph.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/FeaturizeCellTypesKNN$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/FeaturizeCellTypesKNN$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/FeaturizeCellTypesKNN$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/FeaturizeCellTypesKNN$2.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/FeaturizeCellTypesKNN$Point3D.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/FeaturizeCellTypesKNN$Point3D.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/FeaturizeCellTypesKNN.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/FeaturizeCellTypesKNN.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/GrahamScan.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/GrahamScan.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Matrix.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Matrix.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Point2D$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Point2D$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Point2D$Atan2Order.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Point2D$Atan2Order.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Point2D$DistanceToOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Point2D$DistanceToOrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Point2D$PolarOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Point2D$PolarOrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Point2D$ROrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Point2D$ROrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Point2D$XOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Point2D$XOrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Point2D$YOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Point2D$YOrder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Point2D.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Point2D.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Strelochki.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Strelochki.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Toolkit$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Toolkit$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Toolkit$JoinEntry.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Toolkit$JoinEntry.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/Toolkit.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/Toolkit.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/VerifyDelaunayGraph.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/VerifyDelaunayGraph.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/Bundle.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/Bundle.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/CircleLayout.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/CircleLayout.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/CircleLayoutBuilder$CircleLayoutUI.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/CircleLayoutBuilder$CircleLayoutUI.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/CircleLayoutBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/CircleLayoutBuilder.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/LayoutHelper$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/LayoutHelper$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/LayoutHelper$CircularDirection.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/LayoutHelper$CircularDirection.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/LayoutHelper.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/LayoutHelper.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/NodeComparator$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/NodeComparator$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/NodeComparator$CompareType.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/NodeComparator$CompareType.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/NodeComparator.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/NodeComparator.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/toolkit/circularlayout/TempLayoutData.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/toolkit/circularlayout/TempLayoutData.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/BestFocus.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/BestFocus.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/DeconvolutionInterlockDispatcher.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/DeconvolutionInterlockDispatcher.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/DeconvolutionTask.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/DeconvolutionTask.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/Deconvolve_mult$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/Deconvolve_mult$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/Deconvolve_mult$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/Deconvolve_mult$2.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/Deconvolve_mult.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/Deconvolve_mult.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/Driffta.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/Driffta.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/Driftcomp.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/Driftcomp.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/DriftcompInterlockDispatcher.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/DriftcompInterlockDispatcher.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/Find_focused_slices.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/Find_focused_slices.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/MakeMontage.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/MakeMontage.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/OpenImage.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/OpenImage.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/RescaleImages$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/RescaleImages$1.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/RescaleImages.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/RescaleImages.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/SessionIdentifierGenerator.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/SessionIdentifierGenerator.class -------------------------------------------------------------------------------- /target/classes/org/nolanlab/codex/upload/driffta/SimpleImageInfo.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/classes/org/nolanlab/codex/upload/driffta/SimpleImageInfo.class -------------------------------------------------------------------------------- /target/lib/jpeg62.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/lib/jpeg62.dll -------------------------------------------------------------------------------- /target/lib/libtiff3.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/lib/libtiff3.dll -------------------------------------------------------------------------------- /target/lib/tiffcp.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/lib/tiffcp.exe -------------------------------------------------------------------------------- /target/lib/zlib1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/lib/zlib1.dll -------------------------------------------------------------------------------- /target/test-classes/com/akoya/codex/TestHelper.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/test-classes/com/akoya/codex/TestHelper.class -------------------------------------------------------------------------------- /target/test-classes/com/akoya/codex/clustering/ClusteringTest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/test-classes/com/akoya/codex/clustering/ClusteringTest.class -------------------------------------------------------------------------------- /target/test-classes/com/akoya/codex/segm/SegmMainTest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/test-classes/com/akoya/codex/segm/SegmMainTest.class -------------------------------------------------------------------------------- /target/test-classes/org/nolanlab/codex/ProcessorTest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nolanlab/CODEX/529ea4a2ebc796c7a51698f8f695ad2365021f4b/target/test-classes/org/nolanlab/codex/ProcessorTest.class -------------------------------------------------------------------------------- /target/test-classes/testng-all.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | --------------------------------------------------------------------------------