/*- * #%L * Fiji distribution of ImageJ for the life sciences. * %% * Copyright (C) 2007 - 2017 Fiji developers. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-2.0.html>. * #L% */ package mpicbg.spim.vis3d; import java.awt.Font; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import spim.vecmath.Color3f; import mpicbg.imglib.multithreading.SimpleMultiThreading; import mpicbg.models.AffineModel3D; import mpicbg.spim.io.ConfigurationParserException; import mpicbg.spim.io.ConfigurationParserGeneral; import mpicbg.spim.io.ConfigurationParserSPIM; import mpicbg.spim.io.IOFunctions; import mpicbg.spim.io.ProgramConfiguration; import mpicbg.spim.io.SPIMConfiguration; import mpicbg.spim.io.TextFileAccess; import mpicbg.spim.registration.ViewDataBeads; import mpicbg.spim.registration.ViewStructure; import mpicbg.spim.registration.bead.Bead; import mpicbg.spim.registration.bead.BeadIdentification; import mpicbg.spim.registration.bead.BeadRegistration; public class VisualizeBeads { final SPIMConfiguration config; final ArrayList<ViewDataBeads> views; final ViewStructure viewStructure; final static public Color3f backgroundColor = new Color3f( 1f, 1f, 1f ); final static public Color3f foregroundColor = new Color3f( 0.5f, 0.5f, 0.59f ); final static public Color3f beadColor = new Color3f( 0f, 0f, 0f ); final static public float beadSize = 3f; final static public Color3f boundingBoxColor = new Color3f( 0.7f, 0.7f, 0.85f ); final static public Color3f imagingBoxColor = new Color3f( 1f, 0.0f, 0.25f ); final static public Font statusbarFont = new Font("Cambria", Font.PLAIN, 12); public VisualizeBeads( SPIMConfiguration config ) { this.config = config; viewStructure = ViewStructure.initViewStructure( config, 0, new AffineModel3D(), "ViewStructure Timepoint " + 0, config.debugLevelInt ); views = viewStructure.getViews(); for ( ViewDataBeads view : viewStructure.getViews() ) { view.loadDimensions(); view.loadSegmentation(); view.loadRegistration(); } writeSketchTikZ("src/templates/beadimage-1.sk", "src/templates/allViewsWorm.sk"); } protected void writeSketchTikZ( final String template, final String output ) { // // scale the views // BeadRegistration.concatenateAxialScaling( views, viewStructure.getDebugLevel() ); final float factor = 0.005f; boolean reachedInsertPosition = false; try { BufferedReader in = TextFileAccess.openFileRead( template ); PrintWriter out = TextFileAccess.openFileWrite( output ); // find the insert site and copy the beginning while ( in.ready() && !reachedInsertPosition ) { String line = in.readLine(); if ( line.contains("%<--for Java-->")) reachedInsertPosition = true; else out.println( line ); } // // draw // int num = views.size(); //num = 1; for ( int i = 0; i < num; i++ ) { out.println( VisualizationSketchTikZ.drawView( views.get( i ), factor ) ); out.println( VisualizationSketchTikZ.drawBeads( views.get( i ).getBeadStructure().getBeadList(), views.get( i ).getTransform3D(), "Bead", factor ) ); } //out.println( drawFalseCorrespondences( views[0], views[4], factor ) ); //out.println( drawRANSACCorrespondences( views[0], views[4], factor ) ); out.println( drawAllFalseCorrespondences( views, factor ) ); out.println( drawAllRANSACCorrespondences( views, factor ) ); // copy the rest while ( in.ready() ) { String line = in.readLine(); out.println( line ); } in.close(); out.close(); } catch (IOException e) { IOFunctions.printErr("Error reading/writing template or output file: " + e); return; } System.exit(0); } protected String drawFalseCorrespondences( final ViewDataBeads view, final ViewDataBeads correspondingView, final float factor ) { final ArrayList<Bead> beads = view.getBeadStructure().getBeadList(); final ArrayList<Bead> correspondences = new ArrayList<Bead>(); for ( final Bead bead : beads) { boolean isDescriptorCorrespondingBead = false; boolean isRANSACCorrespondingBead = false; final ArrayList<BeadIdentification> correspondingRANSACBeads = bead.getRANSACCorrespondence(); for ( final BeadIdentification correspondingBead : correspondingRANSACBeads ) if (correspondingBead.getViewID() == correspondingView.getID()) isRANSACCorrespondingBead = true; final ArrayList<BeadIdentification> correspondingDescriptorBeads = bead.getDescriptorCorrespondence(); for ( final BeadIdentification correspondingBead : correspondingDescriptorBeads ) if (correspondingBead.getViewID() == correspondingView.getID()) isDescriptorCorrespondingBead = true; if ( isDescriptorCorrespondingBead && ! isRANSACCorrespondingBead ) correspondences.add( bead ); } return VisualizationSketchTikZ.drawBeads( correspondences, view.getTransform3D(), "FalseBead", factor ); } protected String drawRANSACCorrespondences( final ViewDataBeads view, final ViewDataBeads correspondingView, final float factor ) { final ArrayList<Bead> beads = view.getBeadStructure().getBeadList(); final ArrayList<Bead> correspondences = new ArrayList<Bead>(); for ( final Bead bead : beads) { final ArrayList<BeadIdentification> correspondingBeads = bead.getRANSACCorrespondence(); boolean isCorrespondingBead = false; for ( final BeadIdentification correspondingBead : correspondingBeads ) if (correspondingBead.getViewID() == correspondingView.getID()) isCorrespondingBead = true; if ( isCorrespondingBead ) correspondences.add( bead ); } return VisualizationSketchTikZ.drawBeads( correspondences, view.getTransform3D(), "RansacBead", factor ); } protected String drawAllRANSACCorrespondences( final ArrayList<ViewDataBeads> views, final float factor ) { String insert = ""; final ArrayList <int[]> comparePairs = new ArrayList<int[]>(); for ( int viewA = 0; viewA < views.size() - 1; viewA++ ) for ( int viewB = viewA + 1; viewB < views.size(); viewB++ ) comparePairs.add(new int[]{viewA, viewB}); for ( int[] pair : comparePairs ) { final ViewDataBeads viewA = views.get( pair[0] ); final ViewDataBeads viewB = views.get( pair[1] ); final ArrayList<Bead> beads = viewA.getBeadStructure().getBeadList(); final ArrayList<Bead> correspondences = new ArrayList<Bead>(); for ( final Bead bead : beads) { final ArrayList<BeadIdentification> correspondingBeads = bead.getRANSACCorrespondence(); boolean isCorrespondingBead = false; for ( final BeadIdentification correspondingBead : correspondingBeads ) if (correspondingBead.getViewID() == viewB.getID()) isCorrespondingBead = true; if ( isCorrespondingBead ) correspondences.add( bead ); } insert += VisualizationSketchTikZ.drawBeads( correspondences, viewA.getTransform3D(), "RansacBead", factor ); } return insert; } protected String drawAllFalseCorrespondences( final ArrayList<ViewDataBeads> views, final float factor ) { String insert = ""; final ArrayList <int[]> comparePairs = new ArrayList<int[]>(); for ( int viewA = 0; viewA < views.size() - 1; viewA++ ) for ( int viewB = viewA + 1; viewB < views.size(); viewB++ ) comparePairs.add(new int[]{viewA, viewB}); for ( int[] pair : comparePairs ) { final ViewDataBeads viewA = views.get( pair[0] ); final ViewDataBeads viewB = views.get( pair[1] ); final ArrayList<Bead> beads = viewA.getBeadStructure().getBeadList(); final ArrayList<Bead> correspondences = new ArrayList<Bead>(); for ( final Bead bead : beads) { boolean isDescriptorCorrespondingBead = false; boolean isRANSACCorrespondingBead = false; final ArrayList<BeadIdentification> correspondingRANSACBeads = bead.getRANSACCorrespondence(); for ( final BeadIdentification correspondingBead : correspondingRANSACBeads ) if (correspondingBead.getViewID() == viewB.getID()) isRANSACCorrespondingBead = true; final ArrayList<BeadIdentification> correspondingDescriptorBeads = bead.getDescriptorCorrespondence(); for ( final BeadIdentification correspondingBead : correspondingDescriptorBeads ) if (correspondingBead.getViewID() == viewB.getID()) isDescriptorCorrespondingBead = true; if ( isDescriptorCorrespondingBead && ! isRANSACCorrespondingBead ) correspondences.add( bead ); } insert += VisualizationSketchTikZ.drawBeads( correspondences, viewA.getTransform3D(), "FalseBead", factor ); } return insert; } protected String drawPointDescriptorCorrespondences( final ViewDataBeads view, final ViewDataBeads correspondingView, final float factor ) { final ArrayList<Bead> beads = view.getBeadStructure().getBeadList(); final ArrayList<Bead> correspondences = new ArrayList<Bead>(); for ( final Bead bead : beads) { final ArrayList<BeadIdentification> correspondingBeads = bead.getDescriptorCorrespondence(); boolean isCorrespondingBead = false; for ( final BeadIdentification correspondingBead : correspondingBeads ) if (correspondingBead.getViewID() == correspondingView.getID()) isCorrespondingBead = true; if ( isCorrespondingBead ) correspondences.add( bead ); } return VisualizationSketchTikZ.drawBeads( correspondences, view.getTransform3D(), "CorrespondingBead", factor ); } public static void main(String[] args) { // read&parse configuration file ProgramConfiguration conf = null; try { conf = ConfigurationParserGeneral.parseFile("config/configuration.txt"); } catch (final Exception e) { IOFunctions.printErr("Cannot open configuration file: " + e); e.printStackTrace(); return; } // open imageJ window System.getProperties().setProperty("plugins.dir", conf.pluginsDir); final String params[] = {"-ijpath " + conf.pluginsDir}; ij.ImageJ.main(params); // read SPIM configuration SPIMConfiguration config = null; try { config = ConfigurationParserSPIM.parseFile("spimconfig/configuration.txt"); config.printProperties(); } catch (final ConfigurationParserException e) { e.printStackTrace(); System.exit(0); } new VisualizeBeads( config ); } }