1010import cz .it4i .fiji .legacy .common .ImagePlusTransferrer ;
1111import cz .it4i .fiji .rest .util .DatasetInfo ;
1212import net .imglib2 .img .Img ;
13+ import net .imglib2 .view .Views ;
1314import net .imglib2 .type .NativeType ;
1415import net .imglib2 .type .numeric .RealType ;
1516import 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}
0 commit comments