Skip to content

Commit 9a0de4a

Browse files
committed
Merge branch 'addingWritingFullImageWithPyramids'
2 parents 35d283c + 53ae5db commit 9a0de4a

10 files changed

+207
-28
lines changed

src/main/ijm/DataStore-To-TIFFs.ijm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ for (t = downloadTimePoint_FROM; t <= downloadTimePoint_TILL; t++) {
3232
filename = outputDir+"/"+fileNameBeforeTPNumber+padding(t,zeroPaddingWidth)+fileNameAfterTPNumber;
3333
print("Doing TP "+t+", that is a file: "+filename);
3434

35-
run("Read full image", "url="+host_port+" datasetid="+dataset+" timepoint="+t+" channel="+downloadFromThisChannel+" angle="+downloadThisAngle+" resolutionlevelsasstr=[[1, 1, 1]] versionasstr="+version+" timeout="+(timeout*1000)+" verboselog="+verboseDownload);
35+
run("Read full image", "url="+host_port+" datasetid="+dataset+" versionasstr="+version+" timepoint="+t+" channel="+downloadFromThisChannel+" angle="+downloadThisAngle+" resolutionlevelsasstr=[[1, 1, 1]] timeout="+(timeout*1000)+" verboselog="+verboseDownload);
3636

3737
saveAs("Tiff", filename);
3838
close();

src/main/ijm/TIFFs_Downscale_And_To_DataStore.ijm renamed to src/main/ijm/TIFFs-Downscale-And-To-DataStore.ijm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function padding(number, width) {
2828
}
2929

3030
function justSaveAsLevel(resLevelX,resLevelY,resLevelZ) {
31-
run("Write full image", "url="+host_port+" datasetid="+dataset+" timepoint="+t+" channel="+uploadIntoThisChannel+" angle="+uploadIntoThisAngle+" resolutionlevelsasstr=[["+resLevelX+", "+resLevelY+", "+resLevelZ+"]] versionasstr="+version+" timeout="+(timeout*1000)+" verboselog="+verboseUpload);
31+
run("Write full image", "url="+host_port+" datasetid="+dataset+" versionasstr="+version+" timepoint="+t+" channel="+uploadIntoThisChannel+" angle="+uploadIntoThisAngle+" resolutionlevelsasstr=[["+resLevelX+", "+resLevelY+", "+resLevelZ+"]] timeout="+(timeout*1000)+" verboselog="+verboseUpload+" uploadrespyramids=false");
3232
}
3333

3434
function scaleAndSave(refMainImg, resLevelX,resLevelY,resLevelZ) {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#@ String(persistkey="datasetserverurl") host_port
2+
#@ String(persistkey="datasetdatasetid") dataset
3+
#@ String(description="Use single number like 0,1,2 or keywords latest or new") version = "latest"
4+
5+
#@ int(min="0") uploadIntoThisChannel
6+
#@ int(min="0") uploadIntoThisAngle
7+
#@ int(min="0") uploadTimePoint_FROM
8+
#@ int(min="0") uploadTimePoint_TILL
9+
10+
#@ String(description="The part of file name before the time-point running numbers", default="img") fileNameBeforeTPNumber
11+
#@ int(description="Pad running numbers with zeros up to the given width, set to 0 for no padding.", min="0", default="0") zeroPaddingWidth
12+
#@ String(description="The part of file name right after the time-point running numbers", default=".tif") fileNameAfterTPNumber = ".tif"
13+
#@ File(style="directory", description="Folder with the above defined files") inputDir
14+
15+
#@ boolean verboseUpload = false
16+
#@ int(min="0", label="Timeout in seconds, e.g. 60") timeout
17+
18+
//fixup boolean: 1 -> true
19+
if (verboseUpload == 1) { verboseUpload = "true"; }
20+
21+
function padding(number, width) {
22+
if (width > 0) {
23+
numStr = "00000000000000000000"+number;
24+
return substring(numStr, numStr.length-width);
25+
} else {
26+
return number;
27+
}
28+
}
29+
30+
print("Uploading started....");
31+
for (t = uploadTimePoint_FROM; t <= uploadTimePoint_TILL; t++) {
32+
filename = inputDir+"/"+fileNameBeforeTPNumber+padding(t,zeroPaddingWidth)+fileNameAfterTPNumber;
33+
print("Doing TP "+t+", that is a file: "+filename);
34+
35+
open(filename);
36+
37+
run("Write full image", "url="+host_port+" datasetid="+dataset+" versionasstr="+version+" timepoint="+t+" channel="+uploadIntoThisChannel+" angle="+uploadIntoThisAngle+" resolutionlevelsasstr=[[1, 1, 1]] timeout="+(timeout*1000)+" verboselog="+verboseUpload+" uploadrespyramids=true");
38+
39+
close();
40+
}
41+
print("Uploading finished....");

src/main/java/cz/it4i/fiji/legacy/AddVersionDataset.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class AddVersionDataset implements Command {
2525
public int newlyAddedVersion = 0;
2626

2727
@Parameter(type = ItemIO.OUTPUT)
28-
public String universalReferenceHint = "Try the 'last' keyword instead of a particular version in scripts...";
28+
public String universalReferenceHint = "Try the 'latest' keyword instead of a particular version in scripts...";
2929

3030
@Parameter
3131
public DataStoreService dataStoreService;

src/main/java/cz/it4i/fiji/legacy/ReadFullImage.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public void run() {
7272
timepoint,channel,angle,
7373
resolutionLevelsAsStr,versionAsStr,
7474
timeout,verboseLog);
75+
log.info("transfer is finished");
7576
} catch (IOException e) {
7677
log.error("Problem reading full image: "+e.getMessage());
7778
//e.printStackTrace();
@@ -160,6 +161,10 @@ Dataset readNow(final String url, final String datasetID,
160161
rangeSpatialY();
161162
rangeSpatialZ();
162163

164+
if (currentResLevel == null)
165+
throw new IOException("Cannot read at res level "+resolutionLevelsAsStr
166+
+" because the dataset is not having this one.");
167+
163168
return this.readWithAType();
164169
}
165170
}

src/main/java/cz/it4i/fiji/legacy/ReadIntoImagePlus.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public void run() {
1919
adjustReportingVerbosity();
2020

2121
outDatasetImg = readWithAType();
22+
mainLogger.info("transfer is finished");
2223
if (showRunCmd) {
2324
final String howToRun = reportAsMacroCommand("Read full image");
2425
mainLogger.info("Corresponding IJM command: "+howToRun);

src/main/java/cz/it4i/fiji/legacy/WriteFromImagePlus.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public void run() {
1919
adjustReportingVerbosity();
2020

2121
writeWithAType((Img)inDatasetImg);
22+
mainLogger.info("transfer is finished");
2223
if (showRunCmd) {
2324
final String howToRun = reportAsMacroCommand("Write full image");
2425
mainLogger.info("Corresponding IJM command: "+howToRun);

src/main/java/cz/it4i/fiji/legacy/WriteFullImage.java

Lines changed: 125 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import cz.it4i.fiji.legacy.common.ImagePlusTransferrer;
1111
import cz.it4i.fiji.rest.util.DatasetInfo;
1212
import net.imglib2.img.Img;
13+
import net.imglib2.view.Views;
1314
import net.imglib2.type.NativeType;
1415
import net.imglib2.type.numeric.RealType;
1516
import org.scijava.Context;
@@ -44,6 +45,9 @@ public class WriteFullImage implements Command {
4445
persistKey="datasetreslevel")
4546
public String resolutionLevelsAsStr = "[1, 1, 1]";
4647

48+
@Parameter(label = "Write also lower resolutions:", required = false)
49+
public boolean uploadResPyramids = true;
50+
4751
@Parameter(label = "Selected version:",
4852
description = "provide number, or keyword: latest, new",
4953
persistKey="datasetversion")
@@ -69,14 +73,14 @@ public class WriteFullImage implements Command {
6973
@Override
7074
public void run() {
7175
try {
72-
new LocalWriter(log.getContext()).writeNow(inDatasetImg.getImgPlus().getImg(),
76+
new LocalWriter(log.getContext()).writeNow((Img)inDatasetImg.getImgPlus().getImg(),
7377
URL,datasetID,
7478
timepoint,channel,angle,
75-
resolutionLevelsAsStr,versionAsStr,
79+
resolutionLevelsAsStr,uploadResPyramids,versionAsStr,
7680
timeout,verboseLog);
77-
} catch (IOException e) {
81+
log.info("transfer is finished");
82+
} catch (IOException | IllegalArgumentException e) {
7883
log.error("Problem writing full image: "+e.getMessage());
79-
//e.printStackTrace();
8084
}
8185
}
8286

@@ -86,7 +90,7 @@ void to(final Img<? extends RealType<?>> image, final String url, final String d
8690
final int timepoint, final int channel, final int angle,
8791
final int downscaleX, final int downscaleY, final int downscaleZ,
8892
final String versionAsStr)
89-
throws IOException {
93+
throws IOException,IllegalArgumentException {
9094
to(image, url,datasetID,timepoint,channel,angle,
9195
createResStr(downscaleX,downscaleY,downscaleZ),
9296
versionAsStr,120000,false);
@@ -96,7 +100,7 @@ void to(final Img<? extends RealType<?>> image, final String url, final String d
96100
void to(final Img<? extends RealType<?>> image, final String url, final String datasetID,
97101
final int timepoint, final int channel, final int angle,
98102
final String resolutionLevelsAsStr, final String versionAsStr)
99-
throws IOException {
103+
throws IOException,IllegalArgumentException {
100104
to(image, url,datasetID,timepoint,channel,angle,
101105
resolutionLevelsAsStr,
102106
versionAsStr,120000,false);
@@ -107,8 +111,40 @@ void to(final Img<? extends RealType<?>> image, final String url, final String d
107111
final int timepoint, final int channel, final int angle,
108112
final String resolutionLevelsAsStr, final String versionAsStr,
109113
final int serverTimeout, final boolean verboseLog)
110-
throws IOException {
111-
new LocalWriter().writeNow(image, url, datasetID, timepoint, channel, angle,
114+
throws IOException,IllegalArgumentException {
115+
new LocalWriter().writeNow((Img)image, url, datasetID, timepoint, channel, angle,
116+
resolutionLevelsAsStr, versionAsStr, serverTimeout, verboseLog);
117+
}
118+
119+
120+
public static
121+
void toWithoutPyramids(final Img<? extends RealType<?>> image, final String url, final String datasetID,
122+
final int timepoint, final int channel, final int angle,
123+
final int downscaleX, final int downscaleY, final int downscaleZ,
124+
final String versionAsStr)
125+
throws IOException,IllegalArgumentException {
126+
toWithoutPyramids(image, url,datasetID,timepoint,channel,angle,
127+
createResStr(downscaleX,downscaleY,downscaleZ),
128+
versionAsStr,120000,false);
129+
}
130+
131+
public static
132+
void toWithoutPyramids(final Img<? extends RealType<?>> image, final String url, final String datasetID,
133+
final int timepoint, final int channel, final int angle,
134+
final String resolutionLevelsAsStr, final String versionAsStr)
135+
throws IOException,IllegalArgumentException {
136+
toWithoutPyramids(image, url,datasetID,timepoint,channel,angle,
137+
resolutionLevelsAsStr,
138+
versionAsStr,120000,false);
139+
}
140+
141+
public static
142+
void toWithoutPyramids(final Img<? extends RealType<?>> image, final String url, final String datasetID,
143+
final int timepoint, final int channel, final int angle,
144+
final String resolutionLevelsAsStr, final String versionAsStr,
145+
final int serverTimeout, final boolean verboseLog)
146+
throws IOException,IllegalArgumentException {
147+
new LocalWriter().writeNowWithoutPyramids((Img)image, url, datasetID, timepoint, channel, angle,
112148
resolutionLevelsAsStr, versionAsStr, serverTimeout, verboseLog);
113149
}
114150

@@ -125,17 +161,38 @@ static class LocalWriter extends ImagePlusTransferrer {
125161
this.setContext(useThisCtx);
126162
}
127163

128-
void writeNow(final Img<? extends RealType<?>> image, final String url, final String datasetID,
164+
<T extends RealType<T>>
165+
void writeNow(final Img<T> img, final String url, final String datasetID,
129166
final int timepoint, final int channel, final int angle,
130167
final String resolutionLevelsAsStr, final String versionAsStr,
131168
final int serverTimeout, final boolean verboseLog)
132-
throws IOException {
169+
throws IOException,IllegalArgumentException
170+
{
171+
writeNow(img,url,datasetID,timepoint,channel,angle,
172+
resolutionLevelsAsStr,true,versionAsStr,serverTimeout,verboseLog);
173+
}
174+
175+
<T extends RealType<T>>
176+
void writeNowWithoutPyramids(final Img<T> img, final String url, final String datasetID,
177+
final int timepoint, final int channel, final int angle,
178+
final String resolutionLevelsAsStr, final String versionAsStr,
179+
final int serverTimeout, final boolean verboseLog)
180+
throws IOException,IllegalArgumentException
181+
{
182+
writeNow(img,url,datasetID,timepoint,channel,angle,
183+
resolutionLevelsAsStr,false,versionAsStr,serverTimeout,verboseLog);
184+
}
133185

134-
if (!(image.firstElement() instanceof NativeType)) {
135-
throw new IllegalArgumentException("Provided type ("
136-
+image.firstElement().getClass().getSimpleName()
137-
+") is not derived from NativeType.");
138-
}
186+
187+
<TR extends RealType<TR>, TNR extends NativeType<TNR> & RealType<TNR>>
188+
void writeNow(final Img<TR> img, final String url, final String datasetID,
189+
final int timepoint, final int channel, final int angle,
190+
final String resolutionLevelsAsStr, final boolean uploadResPyramids,
191+
final String versionAsStr,
192+
final int serverTimeout, final boolean verboseLog)
193+
throws IOException,IllegalArgumentException
194+
{
195+
final Img<TNR> image = checkForAndExtendWithNativeType(img);
139196

140197
this.URL = url;
141198
this.datasetID = datasetID;
@@ -169,7 +226,59 @@ void writeNow(final Img<? extends RealType<?>> image, final String url, final St
169226
rangeSpatialY();
170227
rangeSpatialZ();
171228

172-
this.writeWithAType((Img)image);
229+
if (currentResLevel == null)
230+
throw new IOException("Cannot write to res level "+resolutionLevelsAsStr
231+
+" because the dataset is not having this one.");
232+
233+
this.writeWithAType(image);
234+
235+
if (uploadResPyramids)
236+
{
237+
//prevent from creating new version with every next resolution
238+
if (versionAsStr.startsWith("new")) this.versionAsStr = "latest";
239+
240+
//plan: find upper res levels, for each create downscaled image and upload it
241+
int resLevelIdx = 0;
242+
while (resLevelIdx < di.resolutionLevels.size()
243+
&& di.resolutionLevels.get(resLevelIdx) != currentResLevel) ++resLevelIdx;
244+
if (resLevelIdx == di.resolutionLevels.size())
245+
throw new RuntimeException("Failed re-matching the resolution level, that's odd...");
246+
myLogger.info("Starting to upload down-scaled versions from level "+ resLevelIdx +".");
247+
248+
//base downscale factors:
249+
final int rx = currentResLevel.resolutions.get(0);
250+
final int ry = currentResLevel.resolutions.get(1);
251+
final int rz = currentResLevel.resolutions.get(2);
252+
253+
//these remaining res levels we're gonna write too
254+
++resLevelIdx;
255+
while (resLevelIdx < di.resolutionLevels.size())
256+
{
257+
currentResLevel = di.resolutionLevels.get(resLevelIdx);
258+
this.resolutionLevelsAsStr = currentResLevel.resolutions.toString();
259+
myLogger.info("==> Writing also: "+this.resolutionLevelsAsStr);
260+
261+
rangeSpatialX();
262+
rangeSpatialY();
263+
rangeSpatialZ();
264+
265+
//downscale factor w.r.t to the base factor
266+
final int dx = currentResLevel.resolutions.get(0) / rx;
267+
final int dy = currentResLevel.resolutions.get(1) / ry;
268+
final int dz = currentResLevel.resolutions.get(2) / rz;
269+
270+
//check the scaling is integer, or skip this scaling
271+
if (dx*rx != currentResLevel.resolutions.get(0)
272+
|| dy*ry != currentResLevel.resolutions.get(1)
273+
|| dz*rz != currentResLevel.resolutions.get(2))
274+
{
275+
myLogger.info("Cannot reach res level "+resLevelIdx+" from "+ resLevelIdx +" with integer-scaling.");
276+
} else {
277+
writeWithAType( Views.subsample(image, dx,dy,dz), image.firstElement() );
278+
}
279+
++resLevelIdx;
280+
}
281+
}
173282
}
174283
}
175284
}

src/main/java/cz/it4i/fiji/legacy/common/ImagePlusDialogHandler.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,19 @@ abstract class ImagePlusDialogHandler extends DynamicCommand {
4040
public String datasetLabel = "";
4141

4242
@Parameter(label="min X [px]:", min="0", callback = "rangeSpatialX")
43-
public int minX = -1;
43+
public int minX = -5;
4444
@Parameter(label="max X [px]:", min="0", callback = "rangeSpatialX")
45-
public int maxX = -1;
45+
public int maxX = -5;
4646

4747
@Parameter(label="min Y [px]:", min="0", callback = "rangeSpatialY")
48-
public int minY = -1;
48+
public int minY = -5;
4949
@Parameter(label="max Y [px]:", min="0", callback = "rangeSpatialY")
50-
public int maxY = -1;
50+
public int maxY = -5;
5151

5252
@Parameter(label="min Z [px]:", min="0", callback = "rangeSpatialZ")
53-
public int minZ = -1;
53+
public int minZ = -5;
5454
@Parameter(label="max Z [px]:", min="0", callback = "rangeSpatialZ")
55-
public int maxZ = -1;
55+
public int maxZ = -5;
5656

5757
@Parameter(label="time point:", min="0", callback = "rangeTPs",
5858
description="In units of the respective dataset.",
@@ -276,7 +276,8 @@ private void rangeSpatial(int cn,int cx, int nI,int xI, int blockSize, int maxx)
276276
//upper bound: align to block size
277277
if (max < 1) max = 1;
278278
max = (int)Math.ceil((double)max / (double)blockSize) * blockSize -1;
279-
if (max > maxx) max = maxx-1;
279+
if (max > maxx || max < 0) max = maxx-1;
280+
//NB: multiplication after ceil() can make 'max' overflow (and end up negative as a consequence)
280281

281282
//lower bound: align to block size
282283
if (min < 0) min = 0;

src/main/java/cz/it4i/fiji/legacy/common/ImagePlusTransferrer.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import net.imagej.Dataset;
44
import net.imagej.DefaultDataset;
55
import net.imagej.ImgPlus;
6+
import net.imglib2.RandomAccessibleInterval;
67
import net.imglib2.img.Img;
78
import net.imglib2.view.Views;
89
import net.imglib2.type.NativeType;
@@ -135,6 +136,21 @@ void printTransferPlan() {
135136
}
136137

137138

139+
// ----------------------------------------------
140+
public static
141+
<TR extends RealType<TR>, TNR extends NativeType<TNR> & RealType<TNR>>
142+
Img<TNR> checkForAndExtendWithNativeType(final Img<TR> image)
143+
throws IllegalArgumentException
144+
{
145+
if (!(image.firstElement() instanceof NativeType)) {
146+
throw new IllegalArgumentException("Provided type ("
147+
+ image.firstElement().getClass().getSimpleName()
148+
+ ") is not derived from NativeType.");
149+
}
150+
return (Img)image;
151+
}
152+
153+
138154
// ----------------------------------------------
139155
public <T extends NativeType<T> & RealType<T>>
140156
Dataset readWithAType() {
@@ -267,9 +283,14 @@ Dataset readWithAType() {
267283

268284
public <T extends NativeType<T> & RealType<T>>
269285
void writeWithAType(final Img<T> img) {
286+
writeWithAType(img, img.firstElement());
287+
}
288+
289+
public <T extends NativeType<T> & RealType<T>>
290+
void writeWithAType(final RandomAccessibleInterval<T> rai, final T ofThisType) {
270291
try {
271292
@SuppressWarnings("unchecked")
272-
final Imglib2Types.TypeHandler<T> th = Imglib2Types.getTypeHandler(img.firstElement());
293+
final Imglib2Types.TypeHandler<T> th = Imglib2Types.getTypeHandler(ofThisType);
273294

274295
//sanity check already at the client
275296
@SuppressWarnings("unchecked")
@@ -357,7 +378,7 @@ void writeWithAType(final Img<T> img) {
357378
pxData = new byte[blockLength];
358379

359380
//copy the current image block into the buffer
360-
th.imgIntervalIntoBlock( Views.interval(img,
381+
th.imgIntervalIntoBlock( Views.interval(rai,
361382
new long[]{x-minX, y-minY, z-minZ},
362383
new long[]{x-minX+ex-1, y-minY+ey-1, z-minZ+ez-1}),
363384
ex*ey*ez, pxData);

0 commit comments

Comments
 (0)