Skip to content

Commit 836c3f0

Browse files
authored
Merge pull request #8 from danilexn/stim_logging
* logging with log4j * caching of stdev (and general entropy computations) * bugfixes
2 parents d0596b4 + d470dc5 commit 836c3f0

120 files changed

Lines changed: 1882 additions & 2480 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ If you use STIM in your research, please cite our [publication](https://www.bior
4343
## Wrapping in Python
4444

4545
The [stimwrap package](https://github.com/rajewsky-lab/stimwrap) from the Rajewsky lab provides an interface to extract datasets and their attributes from an N5-container created by STIM.
46+
The package can be easily installed via pip:
47+
48+
```bash
49+
pip install stimwrap
50+
```
4651

4752

4853
## Java code examples

install.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ install_command st-resave "cmd.Resave"
8686
install_command st-add-slice "cmd.AddSlice"
8787
install_command st-normalize "cmd.Normalize"
8888
install_command st-add-annotations "cmd.AddAnnotations"
89+
install_command st-add-entropy "cmd.AddEntropy"
8990
install_command st-align-pairs "cmd.PairwiseSectionAligner"
9091
install_command st-align-pairs-add "cmd.AddPairwiseMatch"
9192
install_command st-align-pairs-view "cmd.ViewPairwiseAlignment"
@@ -108,8 +109,9 @@ else
108109
mv st-add-slice ${INSTALL_DIR}/
109110
mv st-normalize ${INSTALL_DIR}/
110111
mv st-add-annotations ${INSTALL_DIR}/
112+
mv st-add-entropy ${INSTALL_DIR}/
111113
mv st-align-pairs ${INSTALL_DIR}/
112-
mv st-align-pairs-add ${INSTALL_DIR}/
114+
mv st-align-pairs-add ${INSTALL_DIR}/
113115
mv st-align-pairs-view ${INSTALL_DIR}/
114116
mv st-align-global ${INSTALL_DIR}/
115117
mv st-align-interactive ${INSTALL_DIR}/

install_windows.bat

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ call :install_command st-resave.bat cmd.Resave
5454
call :install_command st-add-slice.bat cmd.AddSlice
5555
call :install_command st-normalize.bat cmd.Normalize
5656
call :install_command st-add-annotations.bat cmd.AddAnnotations
57+
call :install_command st-add-entropy.bat cmd.AddEntropy
5758
call :install_command st-align-pairs.bat cmd.PairwiseSectionAligner
5859
call :install_command st-align-pairs-view.bat cmd.ViewPairwiseAlignment
5960
call :install_command st-align-global.bat cmd.GlobalOpt
@@ -73,6 +74,7 @@ if "%CD%"=="%INSTALL_DIR%" (
7374
move "st-add-slice.bat" "%INSTALL_DIR%\"
7475
move "st-normalize.bat" "%INSTALL_DIR%\"
7576
move "st-add-annotations.bat" "%INSTALL_DIR%\"
77+
move "st-add-entropy.bat" "%INSTALL_DIR%\"
7678
move "st-align-pairs.bat" "%INSTALL_DIR%\"
7779
move "st-align-pairs-view.bat" "%INSTALL_DIR%\"
7880
move "st-align-global.bat" "%INSTALL_DIR%\"

pom.xml

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.scijava</groupId>
77
<artifactId>pom-scijava</artifactId>
8-
<version>33.2.0</version>
8+
<version>38.0.1</version>
99
<relativePath />
1010
</parent>
1111

@@ -158,22 +158,27 @@
158158
<dependency>
159159
<groupId>org.janelia.saalfeldlab</groupId>
160160
<artifactId>n5</artifactId>
161-
<version>2.3.0</version>
161+
<version>3.1.1</version>
162162
</dependency>
163163
<dependency>
164164
<groupId>org.janelia.saalfeldlab</groupId>
165165
<artifactId>n5-imglib2</artifactId>
166-
<version>3.5.1</version>
166+
<version>7.0.0</version>
167167
</dependency>
168168
<dependency>
169169
<groupId>org.janelia.saalfeldlab</groupId>
170170
<artifactId>n5-hdf5</artifactId>
171-
<version>1.4.2</version>
171+
<version>2.2.0</version>
172172
</dependency>
173173
<dependency>
174174
<groupId>org.janelia.saalfeldlab</groupId>
175175
<artifactId>n5-zarr</artifactId>
176-
<version>0.0.8</version>
176+
<version>1.3.4</version>
177+
</dependency>
178+
<dependency>
179+
<groupId>org.janelia.n5anndata</groupId>
180+
<artifactId>n5-anndata</artifactId>
181+
<version>0.1</version>
177182
</dependency>
178183

179184
<!-- JUnit framework -->
@@ -203,6 +208,19 @@
203208
<groupId>cisd</groupId>
204209
<artifactId>jhdf5</artifactId>
205210
</dependency>
211+
212+
<!-- Log4j Core -->
213+
<dependency>
214+
<groupId>org.apache.logging.log4j</groupId>
215+
<artifactId>log4j-core</artifactId>
216+
<version>2.14.1</version>
217+
</dependency>
218+
<!-- Log4j API -->
219+
<dependency>
220+
<groupId>org.apache.logging.log4j</groupId>
221+
<artifactId>log4j-api</artifactId>
222+
<version>2.14.1</version>
223+
</dependency>
206224
</dependencies>
207225

208226
<groupId>net.preibisch</groupId>

src/main/java/align/GlobalOpt.java

Lines changed: 29 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import java.io.IOException;
66
import java.util.ArrayList;
77
import java.util.Collection;
8-
import java.util.Date;
98
import java.util.HashMap;
109
import java.util.HashSet;
1110
import java.util.List;
@@ -34,9 +33,14 @@
3433
import net.imglib2.realtransform.AffineTransform2D;
3534
import net.imglib2.util.Pair;
3635
import net.imglib2.util.ValuePair;
36+
import org.apache.logging.log4j.Logger;
37+
import util.LoggerUtil;
38+
import util.Threads;
3739

3840
public class GlobalOpt
3941
{
42+
private static final Logger logger = LoggerUtil.getLogger();
43+
4044
public static double centerOfMassDistance( final STData dataA, final STData dataB, final AffineTransform2D transformA, final AffineTransform2D transformB )
4145
{
4246
final Interval intervalA = dataA.getRenderInterval();
@@ -115,7 +119,7 @@ protected static ArrayList< Alignment > loadPairwiseAlignments( final String fil
115119
}
116120
catch (IOException e)
117121
{
118-
e.printStackTrace();
122+
logger.error("Could not load pairwise alignments", e);
119123
return null;
120124
}
121125

@@ -171,26 +175,25 @@ public static void iterativeGlobalOpt(
171175
{
172176
int unaligned = tc.preAlign().size();
173177
if ( unaligned > 0 )
174-
System.out.println( "(" + new Date( System.currentTimeMillis() ) + "): pre-aligned all tiles but " + unaligned );
178+
logger.info("Pre-aligned all tiles but {}", unaligned);
175179
else
176-
System.out.println( "(" + new Date( System.currentTimeMillis() ) + "): prealigned all tiles" );
180+
logger.info( "Prealigned all tiles" );
177181

178182
TileUtil.optimizeConcurrently(
179183
new ErrorStatistic( maxPlateauwidth + 1 ), maxAllowedError, maxIterations, maxPlateauwidth, 1.0f,
180184
tc, tc.getTiles(), tc.getFixedTiles(), numThreads );
181185

182-
System.out.println( "(" + new Date( System.currentTimeMillis() ) + "): Global optimization of " + tc.getTiles().size());
183-
System.out.println( "(" + new Date( System.currentTimeMillis() ) + "): Avg Error: " + tc.getError() + "px" );
184-
System.out.println( "(" + new Date( System.currentTimeMillis() ) + "): Min Error: " + tc.getMinError() + "px" );
185-
System.out.println( "(" + new Date( System.currentTimeMillis() ) + "): Max Error: " + tc.getMaxError() + "px" );
186+
logger.info("Global optimization of {}", tc.getTiles().size());
187+
logger.info(" Avg Error: {}px", tc.getError());
188+
logger.info(" Min Error: {}px", tc.getMinError());
189+
logger.info(" Max Error: {}px", tc.getMaxError());
186190

187191
// give some time for the output
188-
try { Thread.sleep( 50 ); } catch ( Exception e) {}
192+
try { Thread.sleep( 50 ); } catch ( Exception ignored) {}
189193
}
190194
catch (Exception e)
191195
{
192-
System.out.println( "Global optimization failed, please report this bug: " + e );
193-
e.printStackTrace();
196+
logger.error( "Global optimization failed, please report this bug: ", e );
194197
return;
195198
}
196199

@@ -282,7 +285,7 @@ public static boolean isConverged(
282285
worstTile1.removeConnectedTile( worstTile2 );
283286
worstTile2.removeConnectedTile( worstTile1 );
284287

285-
System.out.println( new Date( System.currentTimeMillis() ) + ": Removed link from " + tileToIndex.get( worstTile1 ) + " to " + tileToIndex.get( worstTile2 ) );
288+
logger.info("Removed link from {} to {}", tileToIndex.get(worstTile1), tileToIndex.get(worstTile2));
286289

287290
return new ValuePair<>( worstTile1, worstTile2 );
288291
}
@@ -291,19 +294,10 @@ public static void main( String[] args ) throws IOException
291294
{
292295
new ImageJ();
293296

294-
final int debugA = 0;
295-
int debugB = 4;
296-
297297
final String path = Path.getPath();
298298

299299
final ArrayList< Alignment > alignments = loadPairwiseAlignments( new File( path + "/slide-seq", "alignments2" ).getAbsolutePath(), false );
300300

301-
// the inverse transformations were stored, upsi
302-
//for ( final Alignment al : alignments )
303-
// al.t = al.t.inverse();
304-
305-
//final String[] pucks = new String[] { "Puck_180602_20", "Puck_180602_18", "Puck_180602_17", "Puck_180602_16", "Puck_180602_15", "Puck_180531_23", "Puck_180531_22", "Puck_180531_19", "Puck_180531_18", "Puck_180531_17", "Puck_180531_13", "Puck_180528_22", "Puck_180528_20" };
306-
307301
final ExecutorService service = Executors.newFixedThreadPool(8);
308302
final SpatialDataContainer container = SpatialDataContainer.openForReading(path + "slide-seq-normalized-gzip3.n5", service);
309303
final List<String> pucks = container.getDatasets();
@@ -314,35 +308,13 @@ public static void main( String[] args ) throws IOException
314308

315309
for ( final Alignment align : alignments )
316310
if ( align.i < pucks.size() && align.j < pucks.size() )
317-
System.out.println( align.i + "-" + align.j + ": " + align.t );
318-
319-
/*
320-
i=0: 0=0.0 1=0.024038337709212782 2=0.24492487553469394 3=0.1518118833959881 4=0.7241020145787477 5=0.1306794304704525 6=0.15222925121638156 7=0.15483774054692553 8=0.132491429163626 9=0.17711581870553708 10=0.08701363466375361 11=0.2045784760110544 12=0.20891249466281947
321-
i=1: 0=0.024038337709212782 1=0.0 2=0.3330466142561688 3=0.11319724753860656 4=0.10022550806834965 5=0.20877708923578545 6=0.11832271709488193 7=0.07353720095912314 8=0.1713950715270506 9=0.09502724052349071 10=0.23944240649678283 11=0.11694349640166943 12=0.11195066945693335
322-
i=2: 0=0.24492487553469394 1=0.3330466142561688 2=0.0 3=0.24969917436088443 4=0.17472813760575273 5=0.9788951614909751 6=0.17426245380946803 7=0.18054806935102374 8=0.09074454325647692 9=0.09496693464673195 10=0.10267048518938668 11=0.1075661352374083 12=0.12349217922514331
323-
i=3: 0=0.1518118833959881 1=0.11319724753860656 2=0.24969917436088443 3=0.0 4=0.20776253762129704 5=0.3521493379456508 6=0.19462129769496608 7=0.03320550904928819 8=0.04381501333935987 9=0.02137252255928331 10=0.0 11=0.04980400301525422 12=0.004242569157942368
324-
i=4: 0=0.7241020145787477 1=0.10022550806834965 2=0.17472813760575273 3=0.20776253762129704 4=0.0 5=0.2760105640202167 6=0.5531206597483922 7=0.07913515105826611 8=0.15917311091873323 9=0.25045172666096027 10=0.16054736849735818 11=0.06656905561406037 12=0.0763166146516399
325-
i=5: 0=0.1306794304704525 1=0.20877708923578545 2=0.9788951614909751 3=0.3521493379456508 4=0.2760105640202167 5=0.0 6=0.6588552463927722 7=0.01900772579346503 8=0.1335874659752252 9=0.1277205212237738 10=0.08614429525971219 11=0.09772324217675286 12=0.01858521788859697
326-
i=6: 0=0.15222925121638156 1=0.11832271709488193 2=0.17426245380946803 3=0.19462129769496608 4=0.5531206597483922 5=0.6588552463927722 6=0.0 7=0.026002077904843646 8=0.1409801668617941 9=0.09114859275656546 10=0.31376868024657656 11=0.07260773747676567 12=4.418234511038576E-4
327-
i=7: 0=0.15483774054692553 1=0.07353720095912314 2=0.18054806935102374 3=0.03320550904928819 4=0.07913515105826611 5=0.01900772579346503 6=0.026002077904843646 7=0.0 8=0.2876741736681163 9=0.06181190408928276 10=0.10964337542752722 11=0.2132312584540062 12=0.0675333286312243
328-
i=8: 0=0.132491429163626 1=0.1713950715270506 2=0.09074454325647692 3=0.04381501333935987 4=0.15917311091873323 5=0.1335874659752252 6=0.1409801668617941 7=0.2876741736681163 8=0.0 9=1.0 10=0.15129672985645543 11=0.28507782241080326 12=0.4203623375451118
329-
i=9: 0=0.17711581870553708 1=0.09502724052349071 2=0.09496693464673195 3=0.02137252255928331 4=0.25045172666096027 5=0.1277205212237738 6=0.09114859275656546 7=0.06181190408928276 8=1.0 9=0.0 10=0.09688531350422797 11=0.35687450831352985 12=0.38860932836273004
330-
i=10: 0=0.08701363466375361 1=0.23944240649678283 2=0.10267048518938668 3=0.0 4=0.16054736849735818 5=0.08614429525971219 6=0.31376868024657656 7=0.10964337542752722 8=0.15129672985645543 9=0.09688531350422797 10=0.0 11=0.11920034539333373 12=0.2483245130454527
331-
i=11: 0=0.2045784760110544 1=0.11694349640166943 2=0.1075661352374083 3=0.04980400301525422 4=0.06656905561406037 5=0.09772324217675286 6=0.07260773747676567 7=0.2132312584540062 8=0.28507782241080326 9=0.35687450831352985 10=0.11920034539333373 11=0.0 12=0.48298694045995
332-
i=12: 0=0.20891249466281947 1=0.11195066945693335 2=0.12349217922514331 3=0.004242569157942368 4=0.0763166146516399 5=0.01858521788859697 6=4.418234511038576E-4 7=0.0675333286312243 8=0.4203623375451118 9=0.38860932836273004 10=0.2483245130454527 11=0.48298694045995 12=0.0
333-
334-
c(i)=1: 0=302.8970299336632 1=0.0 2=1966.7125790780851 3=1127.5798466482315 4=1018.3643858073019 5=1244.0948936063103 6=1918.835171680812 7=1243.2553900055561 8=2550.2704505567276 9=250.05292046699788 10=2050.432852579864 11=755.2194098362946 12=1774.572922744189
335-
336-
*/
311+
logger.info("{}-{}: {}", align.i, align.j, align.t);
337312

338313
final List< Pair< STData, AffineTransform2D > > initialdata = new ArrayList<>();
339314

340-
for ( int i = 0; i < puckData.size(); ++i )
341-
initialdata.add(new ValuePair<>(puckData.get(i).data(), new AffineTransform2D()));
342-
343-
// initialdata.add( new ValuePair<>( puckData.get( debugA ), new AffineTransform2D() ) );
344-
// for ( debugB = debugA + 1; debugB < 11; ++debugB )
345-
// initialdata.add( new ValuePair<>(puckData.get( debugB ), Alignment.getAlignment( alignments, debugA, debugB ).t ) );
315+
for (STDataAssembly puckDatum : puckData) {
316+
initialdata.add(new ValuePair<>(puckDatum.data(), new AffineTransform2D()));
317+
}
346318

347319
AlignTools.visualizeList( initialdata );
348320
//visualizePair( puckData.get( debugA ), puckData.get( debugB ), new AffineTransform2D(), Alignment.getAlignment( alignments, debugA, debugB ).t );
@@ -365,17 +337,12 @@ public static void main( String[] args ) throws IOException
365337
{
366338
final Alignment align = Alignment.getAlignment( alignments, i, j );
367339

368-
//if ( align.quality < 0.6 )
369-
// continue;
370-
371-
//quality[ i ][ j ] = quality[ j ][ i ] = align.quality;
372-
373340
quality[i][j] = quality[j][i] = 1.0 / centerOfMassDistance(puckData.get(i).data(), puckData.get(j).data(), new AffineTransform2D(), Alignment.getAlignment(alignments, i, j).t);
374341

375342
maxQuality = Math.max( maxQuality, quality[ i ][ j ] );
376343
minQuality = Math.min( minQuality, quality[ i ][ j ] );
377344

378-
System.out.println( "Connecting " + i + "-" + j );
345+
logger.debug("Connecting {}-{}", i, j);
379346

380347
final STData stDataA = puckData.get(i).data();
381348
final STData stDataB = puckData.get(j).data();
@@ -415,8 +382,8 @@ public static void main( String[] args ) throws IOException
415382
}
416383
}
417384

418-
System.out.println( "minQ: " + minQuality );
419-
System.out.println( "maxQ: " + maxQuality );
385+
logger.debug("minQ: {}", minQuality);
386+
logger.debug("maxQ: {}", maxQuality);
420387

421388
for ( int i = 0; i < pucks.size(); ++i )
422389
{
@@ -434,13 +401,13 @@ public static void main( String[] args ) throws IOException
434401
System.out.println();
435402
}
436403

437-
System.out.println( dataToTile.keySet().size() + " / " + pucks.size() );
438-
System.out.println( tileToData.keySet().size() + " / " + pucks.size() );
404+
logger.debug("{} / {}", dataToTile.keySet().size(), pucks.size());
405+
logger.debug("{} / {}", tileToData.keySet().size(), pucks.size());
439406

440407
//System.exit( 0 );
441408

442409
for ( int i = 0; i < pucks.size(); ++i )
443-
System.out.println( puckData.get( i ) + ": " + dataToTile.get( puckData.get( i ) ) );
410+
logger.debug("{}: {}", puckData.get(i), dataToTile.get(puckData.get(i)));
444411

445412
final TileConfiguration tileConfig = new TileConfiguration();
446413

@@ -459,74 +426,24 @@ public static void main( String[] args ) throws IOException
459426
50,
460427
tileToIndex,
461428
quality,
462-
util.Threads.numThreads() );
429+
Threads.numThreads());
463430

464431
for ( final Pair< Tile< ? >, Tile< ? > > removed : removedInconsistentPairs )
465-
System.out.println( "Removed " + tileToIndex.get( removed.getA() ) + " to " + tileToIndex.get( removed.getB() ) + " (" + tileToData.get( removed.getA() ) + " to " + tileToData.get( removed.getB() ) + ")" );
466-
467-
/*
468-
try
469-
{
470-
tileConfig.preAlign();
471-
472-
TileUtil.optimizeConcurrently(
473-
new ErrorStatistic( 500 + 1 ),
474-
30,
475-
3000,
476-
500,
477-
1.0,
478-
tileConfig,
479-
tileConfig.getTiles(),
480-
tileConfig.getFixedTiles(),
481-
30 );
482-
483-
System.out.println( " avg=" + tileConfig.getError() + ", min=" + tileConfig.getMinError() + ", max=" + tileConfig.getMaxError() );
484-
}
485-
catch ( Exception e )
486-
{
487-
System.out.println( ": Could not solve, cause: " + e );
488-
e.printStackTrace();
489-
}
490-
*/
432+
logger.info("Removed {} to {} ({} to {})",
433+
tileToIndex.get(removed.getA()), tileToIndex.get(removed.getB()), tileToData.get(removed.getA()), tileToData.get(removed.getB()));
491434

492435
final List< Pair< STData, AffineTransform2D > > data = new ArrayList<>();
493436

494437
for ( int i = 0; i < pucks.size(); ++i )
495438
{
496-
System.out.println( puckData.get( i ) + ": " + dataToTile.get( puckData.get( i ) ).getModel() );
439+
logger.debug("{}: {}", puckData.get(i), dataToTile.get(puckData.get(i)).getModel());
497440

498441
final RigidModel2D model = dataToTile.get( puckData.get( i ) ).getModel();
499-
/*
500-
// m00, m10, m01, m11, m02, m12
501-
final double[] array = new double[ 6 ];
502442

503-
model.toArray(array);
504-
505-
final AffineTransform2D t = new AffineTransform2D();
506-
t.set( array[ 0 ], array[ 2 ], array[ 4 ], array[ 1 ], array[ 3 ], array[ 5 ] );
507-
*/
508443
data.add(new ValuePair<>(puckData.get(i).data(), AlignTools.modelToAffineTransform2D(model)));
509444
}
510445

511446
AlignTools.visualizeList( data );
512447
service.shutdown();
513-
/*
514-
final RigidModel2D modelA = dataToTile.get( puckData.get( debugA ) ).getModel();
515-
final RigidModel2D modelB = dataToTile.get( puckData.get( debugB ) ).getModel();
516-
517-
// m00, m10, m01, m11, m02, m12
518-
final double[] dataA = new double[ 6 ];
519-
final double[] dataB = new double[ 6 ];
520-
521-
modelA.toArray(dataA);
522-
modelB.toArray(dataB);
523-
524-
final AffineTransform2D tA = new AffineTransform2D();
525-
final AffineTransform2D tB = new AffineTransform2D();
526-
527-
tA.set( dataA[ 0 ], dataA[ 2 ], dataA[ 4 ], dataA[ 1 ], dataA[ 3 ], dataA[ 5 ] );
528-
tB.set( dataB[ 0 ], dataB[ 2 ], dataB[ 4 ], dataB[ 1 ], dataB[ 3 ], dataB[ 5 ] );
529-
530-
visualizePair( puckData.get( debugA ), puckData.get( debugB ), tA.inverse(), tB.inverse() );*/
531448
}
532449
}

0 commit comments

Comments
 (0)