Awesome. Forgot this. Thanks! J
> On Oct 3, 2014, at 5:36 PM, Curtis Rueden <ctrue...@wisc.edu> wrote: > > Hi Jay, > > > is there the potential to create a OpService#run method that would > > take, for example, alternating strings and objects to allow calls to > > be "more explicit" or "transparent" > > All Ops are Modules, and the ModuleService has this feature: > > http://jenkins.imagej.net/job/SciJava-common-javadoc/javadoc/org/scijava/command/CommandService.html#run(java.lang.Class,%20boolean,%20java.lang.Object...) > > Or more type-safe using a Map<String, Object>: > > http://jenkins.imagej.net/job/SciJava-common-javadoc/javadoc/org/scijava/command/CommandService.html#run(java.lang.Class,%20boolean,%20java.util.Map) > > Regards, > Curtis > >> On Fri, Oct 3, 2014 at 5:25 PM, Jay Warrick <warr...@wisc.edu> wrote: >> Very helpful. Thanks. >> >> Not that I need this capability, but is there the potential to create a >> OpService#run method that would take, for example, alternating strings and >> objects to allow calls to be "more explicit" or "transparent" (i.e., >> OpService#runExplicit("myOp", "max", max, "min", min) and potentially more >> extensible in case order of arguments change or there end up being >> additional optional arguments. Obviously you link yourself to names as >> opposed to order. I guess there is always a give and take with these things. >> >> I could try and draft up such a method if you think it useful and doesn't go >> against what you are trying to shoot for. >> >> Cheers, >> >> Jay >> >> >> >>> On Oct 3, 2014, at 12:39 PM, Curtis Rueden <ctrue...@wisc.edu> wrote: >>> >>> Hi Jay, >>> >>> > 1) When should we use the "Command" style method of doing things where >>> > all information is specified using the @Parameter methodology and run >>> > via the "run" method, and when should we use the "Function" style of >>> > things with a typed input and output "compute" method? >>> > Advantages/disadvantages of each? Can you get by with either? >>> >>> We started OPS with the "Command" paradigm, then found that for the vast >>> majority of ops, there was one "special" input over which you want to >>> iterate (either per pixel, or in a multi-threaded context, or both), and >>> one main output of the op. That common case is a Function (you extend >>> either AbstractStrictFunction or AbstractOutputFunction, depending on >>> whether you want to force the caller to pass in a preallocated output or >>> not). >>> >>> In short: use Function if you want your op to usable by the "map" op to >>> execute it iteratively over an entire image (e.g., an Iterable or >>> IterableInterval). Use a plain Op if you don't need that, don't care or are >>> lazy. >>> >>> As always in programming: model your code after existing code ("when in >>> Rome") for best results. >>> >>> > 2) I couldn't see how some of the @Parameter objects would be or are >>> > injected or set. >>> >>> Calling OpService#run to execute the op automatically finds the best >>> matching op, and then injects the parameter values in the specified order. >>> >>> > how are potential ambiguities resolved when trying to set two >>> > parameters of the same type? >>> ... >>> > Order that it is listed in the Op class def and order of args provided >>> > to the ops.run() methods? >>> >>> Yes. The order defined in the class must match the order of arguments given >>> to the OpService#run method. >>> >>> Call OpService#help(String) for a full list of ops with the given name, >>> including expected parameters. >>> >>> Regards, >>> Curtis >>> >>>> On Thu, Oct 2, 2014 at 4:53 PM, Jay Warrick <warr...@wisc.edu> wrote: >>>> Curtis - Sweet! I like it. I can see myself making small packages of Ops >>>> for things we do in our research that we could easily make available for >>>> others. It's also a great way for us to reuse capabilities across >>>> different JEX functions we create that allows us to share them with the >>>> rest of the community instead of just creating static methods hoarded in >>>> various "utility classes" in our software, not that we would ever do that >>>> :-) >>>> >>>> Curtis and everyone else :-) - First of all, thanks to all for their hard >>>> work to lay the foundation for this really useful Ops package. 2 things, >>>> though, I would appreciate some help with. Although I've looked at most of >>>> the Ops and the tutorials on creating and using Ops, I still have a couple >>>> questions. >>>> >>>> 1) When should we use the "Command" style method of doing things where all >>>> information is specified using the @Parameter methodology and run via the >>>> "run" method, and when should we use the "Function" style of things with a >>>> typed input and output "compute" method? Advantages/disadvantages of each? >>>> Can you get by with either? >>>> >>>> 2) I couldn't see how some of the @Parameter objects would be or are >>>> injected or set. What is the "sleekest" method for setting these >>>> parameters if I wanted to use these Ops in my own program without >>>> resorting to setting private Parameter fields accessible etc (e.g., the >>>> @Parameter private T threshold;" of the ApplyConstantThreshold.java Op)? >>>> Am I forgetting some tool/method for easily injecting/setting Op/Command >>>> parameters? It seems like calls to ij.op().<whatever> only pass parameters >>>> to compute method and don't do any @Parameter object injection/setting. Am >>>> I wrong? Or, eventually, would these Ops have getters and setters. Are >>>> getters and setters automatically generated already that I'm not aware of >>>> by just looking over the code? >>>> >>>> Thanks, >>>> >>>> Jay >>>> >>>> >>>> >>>> >>>>> On Oct 2, 2014, at 12:35 PM, Curtis Rueden <ctrue...@wisc.edu> wrote: >>>>> >>>>> Hi Jay, >>>>> >>>>> > Am I right that Ops sort of occupies the niche between ImgLib2 and >>>>> > ImageJ Plugins... something that makes it easier to do the image >>>>> > manipulations but can be reused a bit more easily given they don't >>>>> > require many of the Service parameters and preprocessors that many of >>>>> > the plugins take/need? >>>>> >>>>> Yes, OPS is intended for pure image processing operations and functions. >>>>> The rule of thumb is that they be deterministic, and have no side >>>>> effects. So you give same inputs, you get same outputs, every time. Many >>>>> of them are also multithreadable, though that is not a requirement. And >>>>> OPS are also supposed to be "static" rather than dynamic -- i.e., they >>>>> shouldn't have a variable number of input or output parameters, unlike >>>>> commands in general. >>>>> >>>>> That said, OPS are still allowed to depend on services, but it is >>>>> expected that the service methods you call will not compromise the >>>>> determinism of the op -- i.e., only utility methods of services should >>>>> really be used. Perhaps in the future we could add annotations to each >>>>> service method indicating what sort of method it is, and hence where it >>>>> is "safe" to use. >>>>> >>>>> I want to thank you for your feedback and discussion from a few months >>>>> ago, regarding reuse of ImageJ2 commands in JEX. Your perspective >>>>> provided some of the inspiration for the design of OPS, because it became >>>>> clear that we need a "pure functional" layer for image processing that >>>>> does not rely on side effects from services, etc. The idea is that KNIME >>>>> Image Processing, CellProfiler, OMERO, JEX, etc., can all consume and >>>>> expose the ops with the assumption that they will behave well (work >>>>> headless, etc.). >>>>> >>>>> Regards, >>>>> Curtis >>>>> >>>>> >>>>>> On Thu, Oct 2, 2014 at 12:08 PM, Jay Warrick <warr...@wisc.edu> wrote: >>>>>> Looks promising. Am I right that Ops sort of occupies the niche between >>>>>> ImgLib2 and ImageJ Plugins... something that makes it easier to do the >>>>>> image manipulations but can be reused a bit more easily given they don't >>>>>> require many of the Service parameters and preprocessors that many of >>>>>> the plugins take/need? >>>>>> >>>>>>> On Oct 1, 2014, at 4:58 PM, Curtis Rueden <ctrue...@wisc.edu> wrote: >>>>>>> >>>>>>> Hi everyone, >>>>>>> >>>>>>> The ImageJ2 and KNIME Image Processing teams met in Madison during the >>>>>>> week of September 15 - 19, to work on ImageJ OPS, which seeks to be a >>>>>>> unifying library for scientific image processing. >>>>>>> >>>>>>> On behalf of the OPS development team, I am pleased to announce the >>>>>>> results of that hackathon, including accomplishments, project goals and >>>>>>> milestones. See the news post for full details: >>>>>>> >>>>>>> http://imagej.net/2014-10-01_-_ImageJ_OPS_Hackathon >>>>>>> >>>>>>> Regards, >>>>>>> Curtis Rueden >>>>>>> ImageJ2 project lead >>>>>>> _______________________________________________ >>>>>>> ImageJ-devel mailing list >>>>>>> ImageJ-devel@imagej.net >>>>>>> http://imagej.net/mailman/listinfo/imagej-devel >
_______________________________________________ ImageJ-devel mailing list ImageJ-devel@imagej.net http://imagej.net/mailman/listinfo/imagej-devel