Dear List,
I'm using TrakEM2 to analyze huge multi-channel confocal reconstructions. I'm importing the channels as separate 8-bit patches with the antigen specified within the patch name, apply a LUT with "adjust image filters" and set the composite mode to Add. To switch on and off a channel I'm using the "select all that match function". Nonetheless, this method is very slow, and it would be much better if one could define keyboard shortcuts for that. I wrote this simple script to toggle visibility of patches based on their names, but I can't figure out how I could call it from a keyboard shortcut inside TraKEM2. Any hint will be greatly appreciated Thank you very much! Federico Here is an example of the script: from ini.trakem2.display import * for layer in Display.getFront().getLayerSet().getLayers(): patches = layer.getDisplayables(Patch) for patch in patches: if "DCX" in patch.title: if patch.visible == True: patch.visible = False else: patch.visible = True -- Federico Luzzati, PhD Assistant Professor University of Turin, Dept. LIfe Sciences and Systems Biology (DBIOS) Via Accademia Albertina, 13 - 10123 Torino - IT Researcher at Neuroscience Institute Cavalieri Ottolenghi (NICO) Regione Gonzole, 10 - 10043 Orbassano (To) - IT tel. +39-0116704683/ -6631 http://www.nico.ottolenghi.unito.it/index.php/it/adult-neurogenesis Sostieni con il tuo 5xmille il NICO e la ricerca sulle malattie neurodegenerative Firma nel riquadro "Finanziamento della ricerca scientifica e dell'Università" CF 97564560015 -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
Hi Federico,
Basically, you can create your own KeyListener and attach it to the TrakEM2 window canvas, and react upon its keyPressed KeyEvent. The canvas element you can get from Display.getFront().getCanvas(). Would be something like this: from java.awt import KeyAdapter class MyKeyListener(KeyAdapter): def keyPressed(self, event): # Run your code here ... Display.getFront().getCanvas().addKeyListener(MyKeyListener()) Best, Albert 2016-04-11 17:05 GMT-04:00 Federico Luzzati <[hidden email]>: > Dear List, > I'm using TrakEM2 to analyze huge multi-channel confocal reconstructions. > I'm > importing the channels as separate 8-bit patches with the antigen specified > within the patch name, apply a LUT with "adjust image filters" and set the > composite mode to Add. > To switch on and off a channel I'm using the "select all that match > function". Nonetheless, this method is very slow, and it would be much > better if one could define keyboard shortcuts for that. > I wrote this simple script to toggle visibility of patches based on their > names, but I can't figure out how I could call it from a keyboard shortcut > inside TraKEM2. > > Any hint will be greatly appreciated > Thank you very much! > > Federico > > Here is an example of the script: > > from ini.trakem2.display import * > > for layer in Display.getFront().getLayerSet().getLayers(): > patches = layer.getDisplayables(Patch) > for patch in patches: > if "DCX" in patch.title: > if patch.visible == True: > patch.visible = False > else: > patch.visible = True > > > > -- > Federico Luzzati, PhD > Assistant Professor > University of Turin, > Dept. LIfe Sciences and Systems Biology (DBIOS) > Via Accademia Albertina, 13 - 10123 Torino - IT > > Researcher at > Neuroscience Institute Cavalieri Ottolenghi (NICO) > Regione Gonzole, 10 - 10043 Orbassano (To) - IT > > tel. +39-0116704683/ -6631 > http://www.nico.ottolenghi.unito.it/index.php/it/adult-neurogenesis > > Sostieni con il tuo 5xmille il NICO e la ricerca sulle malattie > neurodegenerative > Firma nel riquadro "Finanziamento della ricerca scientifica e > dell'Università" > CF 97564560015 > > -- > ImageJ mailing list: http://imagej.nih.gov/ij/list.html > -- http://albert.rierol.net http://www.janelia.org/lab/cardona-lab http://www.ini.uzh.ch/~acardona/ -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
Dear Albert,
thank you very much for your answer, the code works fine (you'll see it at the bottom of this mail)! unfortunately however while scrolling back and forth through the sections it suddenly and randomly stop working; the System Log shows this message if KeyEvent.VK_1 == keyCode: NameError: global name 'KeyEvent' is not defined Running again the script is ineffective, closing and re-opening the canvas is the only way, but this is very annoying! Thank you very much for your help, and for your work. Federico from java.awt.event import KeyEvent, KeyAdapter from ini.trakem2.display import Display, Patch class MyKeyListener(KeyAdapter): def keyPressed(self, event): keyCode = event.getKeyCode() if KeyEvent.VK_1 == keyCode: for layer in Display.getFront().getLayerSet().getLayers(): patches = layer.getDisplayables(Patch) for patch in patches: if "NFL" in patch.title: if patch.visible == True: patch.visible = False else: patch.visible = True elif KeyEvent.VK_2 == keyCode: for layer in Display.getFront().getLayerSet().getLayers(): patches = layer.getDisplayables(Patch) for patch in patches: if "GFP" in patch.title: if patch.visible == True: patch.visible = False else: patch.visible = True elif KeyEvent.VK_3 == keyCode: for layer in Display.getFront().getLayerSet().getLayers(): patches = layer.getDisplayables(Patch) for patch in patches: if "Ki67" in patch.title: if patch.visible == True: patch.visible = False else: patch.visible = True elif KeyEvent.VK_4 == keyCode: for layer in Display.getFront().getLayerSet().getLayers(): patches = layer.getDisplayables(Patch) for patch in patches: if "DCX" in patch.title: if patch.visible == True: patch.visible = False else: patch.visible = True Display.getFront().getCanvas().addKeyListener(MyKeyListener()) 2016-04-11 21:31 GMT-04:00 Albert Cardona <[hidden email]>: > Hi Federico, > > Basically, you can create your own KeyListener and attach it to the TrakEM2 > window canvas, and react upon its keyPressed KeyEvent. > > The canvas element you can get from Display.getFront().getCanvas(). > > Would be something like this: > > from java.awt import KeyAdapter > > class MyKeyListener(KeyAdapter): > def keyPressed(self, event): > # Run your code here > ... > > Display.getFront().getCanvas().addKeyListener(MyKeyListener()) > > Best, > > Albert > > 2016-04-11 17:05 GMT-04:00 Federico Luzzati <[hidden email]>: > > > Dear List, > > I'm using TrakEM2 to analyze huge multi-channel confocal reconstructions. > > I'm > > importing the channels as separate 8-bit patches with the antigen > specified > > within the patch name, apply a LUT with "adjust image filters" and set > the > > composite mode to Add. > > To switch on and off a channel I'm using the "select all that match > > function". Nonetheless, this method is very slow, and it would be much > > better if one could define keyboard shortcuts for that. > > I wrote this simple script to toggle visibility of patches based on their > > names, but I can't figure out how I could call it from a keyboard > shortcut > > inside TraKEM2. > > > > Any hint will be greatly appreciated > > Thank you very much! > > > > Federico > > > > Here is an example of the script: > > > > from ini.trakem2.display import * > > > > for layer in Display.getFront().getLayerSet().getLayers(): > > patches = layer.getDisplayables(Patch) > > for patch in patches: > > if "DCX" in patch.title: > > if patch.visible == True: > > patch.visible = False > > else: > > patch.visible = True > > > > > > > > -- > > Federico Luzzati, PhD > > Assistant Professor > > University of Turin, > > Dept. LIfe Sciences and Systems Biology (DBIOS) > > Via Accademia Albertina, 13 - 10123 Torino - IT > > > > Researcher at > > Neuroscience Institute Cavalieri Ottolenghi (NICO) > > Regione Gonzole, 10 - 10043 Orbassano (To) - IT > > > > tel. +39-0116704683/ -6631 > > http://www.nico.ottolenghi.unito.it/index.php/it/adult-neurogenesis > > > > Sostieni con il tuo 5xmille il NICO e la ricerca sulle malattie > > neurodegenerative > > Firma nel riquadro "Finanziamento della ricerca scientifica e > > dell'Università" > > CF 97564560015 > > > > -- > > ImageJ mailing list: http://imagej.nih.gov/ij/list.html > > > > > > -- > http://albert.rierol.net > http://www.janelia.org/lab/cardona-lab > http://www.ini.uzh.ch/~acardona/ > > -- > ImageJ mailing list: http://imagej.nih.gov/ij/list.html > -- Federico Luzzati, PhD Assistant Professor University of Turin, Dept. LIfe Sciences and Systems Biology (DBIOS) Via Accademia Albertina, 13 - 10123 Torino - IT Researcher at Neuroscience Institute Cavalieri Ottolenghi (NICO) Regione Gonzole, 10 - 10043 Orbassano (To) - IT tel. +39-0116704683/ -6631 http://www.nico.ottolenghi.unito.it/index.php/it/adult-neurogenesis Sostieni con il tuo 5xmille il NICO e la ricerca sulle malattie neurodegenerative Firma nel riquadro "Finanziamento della ricerca scientifica e dell'Università" CF 97564560015 -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
Dear Federico,
Glad to hear that it works for you, and sorry to hear about the error. While the error seems puzzling given the code that you wrote, perhaps it has to do with the fact that the thread context within which your code executes is different, to which perhaps the older versions of jython have trouble with (just speculating here). Something to try: either import the java.awt.KeyEvent within your function call (it is a split second operation, only performed when there is a key event anyway), or rewrite it in another language like beanshell, clojure, ruby. Another, perhaps easier workaround would be to declare a variable within the MyKeyListener constructor and refer to the KeyEvent in that way, like: class MyKeyListener(KeyAdapter): def __init__(self, *args, **kwargs): super(MyKeyListener, self).__init__(*args, **kwargs) self.KeyEvent = KeyEvent def keyPressed(self, event): # rest of the code here # Use self.KeyEvent instead of KeyEvent Best, Albert 2016-04-11 23:34 GMT-04:00 Federico Luzzati <[hidden email]>: > Dear Albert, > thank you very much for your answer, the code works fine (you'll see it at > the bottom of this mail)! > unfortunately however while scrolling back and forth through the sections > it suddenly and randomly stop working; the System Log shows this message > > if KeyEvent.VK_1 == keyCode: > NameError: global name 'KeyEvent' is not defined > > Running again the script is ineffective, closing and re-opening the canvas > is the only way, but this is very annoying! > > Thank you very much for your help, and for your work. > > Federico > > > from java.awt.event import KeyEvent, KeyAdapter > from ini.trakem2.display import Display, Patch > > class MyKeyListener(KeyAdapter): > def keyPressed(self, event): > keyCode = event.getKeyCode() > if KeyEvent.VK_1 == keyCode: > for layer in Display.getFront().getLayerSet().getLayers(): > patches = layer.getDisplayables(Patch) > for patch in patches: > if "NFL" in patch.title: > if patch.visible == True: > patch.visible = False > else: > patch.visible = True > elif KeyEvent.VK_2 == keyCode: > for layer in Display.getFront().getLayerSet().getLayers(): > patches = layer.getDisplayables(Patch) > for patch in patches: > if "GFP" in patch.title: > if patch.visible == True: > patch.visible = False > else: > patch.visible = True > > elif KeyEvent.VK_3 == keyCode: > for layer in Display.getFront().getLayerSet().getLayers(): > patches = layer.getDisplayables(Patch) > for patch in patches: > if "Ki67" in patch.title: > if patch.visible == True: > patch.visible = False > else: > patch.visible = True > > elif KeyEvent.VK_4 == keyCode: > for layer in Display.getFront().getLayerSet().getLayers(): > patches = layer.getDisplayables(Patch) > for patch in patches: > if "DCX" in patch.title: > if patch.visible == True: > patch.visible = False > else: > patch.visible = True > > > Display.getFront().getCanvas().addKeyListener(MyKeyListener()) > > > > > > > 2016-04-11 21:31 GMT-04:00 Albert Cardona <[hidden email]>: > > > Hi Federico, > > > > Basically, you can create your own KeyListener and attach it to the > TrakEM2 > > window canvas, and react upon its keyPressed KeyEvent. > > > > The canvas element you can get from Display.getFront().getCanvas(). > > > > Would be something like this: > > > > from java.awt import KeyAdapter > > > > class MyKeyListener(KeyAdapter): > > def keyPressed(self, event): > > # Run your code here > > ... > > > > Display.getFront().getCanvas().addKeyListener(MyKeyListener()) > > > > Best, > > > > Albert > > > > 2016-04-11 17:05 GMT-04:00 Federico Luzzati <[hidden email]>: > > > > > Dear List, > > > I'm using TrakEM2 to analyze huge multi-channel confocal > reconstructions. > > > I'm > > > importing the channels as separate 8-bit patches with the antigen > > specified > > > within the patch name, apply a LUT with "adjust image filters" and set > > the > > > composite mode to Add. > > > To switch on and off a channel I'm using the "select all that match > > > function". Nonetheless, this method is very slow, and it would be much > > > better if one could define keyboard shortcuts for that. > > > I wrote this simple script to toggle visibility of patches based on > their > > > names, but I can't figure out how I could call it from a keyboard > > shortcut > > > inside TraKEM2. > > > > > > Any hint will be greatly appreciated > > > Thank you very much! > > > > > > Federico > > > > > > Here is an example of the script: > > > > > > from ini.trakem2.display import * > > > > > > for layer in Display.getFront().getLayerSet().getLayers(): > > > patches = layer.getDisplayables(Patch) > > > for patch in patches: > > > if "DCX" in patch.title: > > > if patch.visible == True: > > > patch.visible = False > > > else: > > > patch.visible = True > > > > > > > > > > > > -- > > > Federico Luzzati, PhD > > > Assistant Professor > > > University of Turin, > > > Dept. LIfe Sciences and Systems Biology (DBIOS) > > > Via Accademia Albertina, 13 - 10123 Torino - IT > > > > > > Researcher at > > > Neuroscience Institute Cavalieri Ottolenghi (NICO) > > > Regione Gonzole, 10 - 10043 Orbassano (To) - IT > > > > > > tel. +39-0116704683/ -6631 > > > http://www.nico.ottolenghi.unito.it/index.php/it/adult-neurogenesis > > > > > > Sostieni con il tuo 5xmille il NICO e la ricerca sulle malattie > > > neurodegenerative > > > Firma nel riquadro "Finanziamento della ricerca scientifica e > > > dell'Università" > > > CF 97564560015 > > > > > > -- > > > ImageJ mailing list: http://imagej.nih.gov/ij/list.html > > > > > > > > > > > -- > > http://albert.rierol.net > > http://www.janelia.org/lab/cardona-lab > > http://www.ini.uzh.ch/~acardona/ > > > > -- > > ImageJ mailing list: http://imagej.nih.gov/ij/list.html > > > > > > -- > Federico Luzzati, PhD > Assistant Professor > University of Turin, > Dept. LIfe Sciences and Systems Biology (DBIOS) > Via Accademia Albertina, 13 - 10123 Torino - IT > > Researcher at > Neuroscience Institute Cavalieri Ottolenghi (NICO) > Regione Gonzole, 10 - 10043 Orbassano (To) - IT > > tel. +39-0116704683/ -6631 > http://www.nico.ottolenghi.unito.it/index.php/it/adult-neurogenesis > > Sostieni con il tuo 5xmille il NICO e la ricerca sulle malattie > neurodegenerative > Firma nel riquadro "Finanziamento della ricerca scientifica e > dell'Università" > CF 97564560015 > > -- > ImageJ mailing list: http://imagej.nih.gov/ij/list.html > -- http://albert.rierol.net http://www.janelia.org/lab/cardona-lab http://www.ini.uzh.ch/~acardona/ -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
Dear Albert,
thank you very much for taking the time to help the non-coders! Actually, the python workaround that you proposed didn't worked in my hands, I attach below the code (I may have made some errors). Importing the java.awt.KeyEvent do not change the problem while in the other solution the keys press is not working (I do not receive any error). I'll possibly try the other languages, but this will likely take me some time.. In any case, I'm really convinced that TrakEM2 can be a very useful software for the annotation and manual/semiautmatic segmentation of big stacks not only of EM but also of multichannel fluorescence (or confocal ) microscopy images. To this aim I have now defenetly abandoned Reconstruct in favour of TrakEM2, nonetheless its main limit for me is still the difficulty in quickly toggling the visibility of the different channels. Ciao Federico Here the code calling the variable in the constructor from java.awt.event import KeyEvent, KeyAdapter from ini.trakem2.display import Display, Patch class MyKeyListener(KeyAdapter): def __init__(self,*args,**kwargs): super(MyKeyListener,self).__init__(*args,**kwargs) self.KeyEvent =KeyEvent def keyPressed(self, event): keyCode = event.getKeyCode() if self.KeyEvent.VK_1 == keyCode: for layer in Display.getFront().getLayerSet().getLayers(): patches = layer.getDisplayables(Patch) for patch in patches: if "C=0" in patch.title: if patch.visible == True: patch.visible = False else: patch.visible = True Display.getFront().getCanvas().addKeyListener(MyKeyListener()) 2016-04-18 13:50 GMT-04:00 Albert Cardona <[hidden email]>: > Dear Federico, > > Glad to hear that it works for you, and sorry to hear about the error. > While the error seems puzzling given the code that you wrote, perhaps it > has to do with the fact that the thread context within which your code > executes is different, to which perhaps the older versions of jython have > trouble with (just speculating here). Something to try: either import the > java.awt.KeyEvent within your function call (it is a split second > operation, only performed when there is a key event anyway), or rewrite it > in another language like beanshell, clojure, ruby. Another, perhaps easier > workaround would be to declare a variable within the MyKeyListener > constructor and refer to the KeyEvent in that way, like: > > class MyKeyListener(KeyAdapter): > def __init__(self, *args, **kwargs): > super(MyKeyListener, self).__init__(*args, **kwargs) > self.KeyEvent = KeyEvent > def keyPressed(self, event): > # rest of the code here > # Use self.KeyEvent instead of KeyEvent > > > Best, > > Albert > > 2016-04-11 23:34 GMT-04:00 Federico Luzzati <[hidden email]>: > >> Dear Albert, >> thank you very much for your answer, the code works fine (you'll see it at >> the bottom of this mail)! >> unfortunately however while scrolling back and forth through the sections >> it suddenly and randomly stop working; the System Log shows this message >> >> if KeyEvent.VK_1 == keyCode: >> NameError: global name 'KeyEvent' is not defined >> >> Running again the script is ineffective, closing and re-opening the canvas >> is the only way, but this is very annoying! >> >> Thank you very much for your help, and for your work. >> >> Federico >> >> >> from java.awt.event import KeyEvent, KeyAdapter >> from ini.trakem2.display import Display, Patch >> >> class MyKeyListener(KeyAdapter): >> def keyPressed(self, event): >> keyCode = event.getKeyCode() >> if KeyEvent.VK_1 == keyCode: >> for layer in Display.getFront().getLayerSet().getLayers(): >> patches = layer.getDisplayables(Patch) >> for patch in patches: >> if "NFL" in patch.title: >> if patch.visible == True: >> patch.visible = False >> else: >> patch.visible = True >> elif KeyEvent.VK_2 == keyCode: >> for layer in Display.getFront().getLayerSet().getLayers(): >> patches = layer.getDisplayables(Patch) >> for patch in patches: >> if "GFP" in patch.title: >> if patch.visible == True: >> patch.visible = False >> else: >> patch.visible = True >> >> elif KeyEvent.VK_3 == keyCode: >> for layer in Display.getFront().getLayerSet().getLayers(): >> patches = layer.getDisplayables(Patch) >> for patch in patches: >> if "Ki67" in patch.title: >> if patch.visible == True: >> patch.visible = False >> else: >> patch.visible = True >> >> elif KeyEvent.VK_4 == keyCode: >> for layer in Display.getFront().getLayerSet().getLayers(): >> patches = layer.getDisplayables(Patch) >> for patch in patches: >> if "DCX" in patch.title: >> if patch.visible == True: >> patch.visible = False >> else: >> patch.visible = True >> >> >> Display.getFront().getCanvas().addKeyListener(MyKeyListener()) >> >> >> >> >> >> >> 2016-04-11 21:31 GMT-04:00 Albert Cardona <[hidden email]>: >> >> > Hi Federico, >> > >> > Basically, you can create your own KeyListener and attach it to the >> TrakEM2 >> > window canvas, and react upon its keyPressed KeyEvent. >> > >> > The canvas element you can get from Display.getFront().getCanvas(). >> > >> > Would be something like this: >> > >> > from java.awt import KeyAdapter >> > >> > class MyKeyListener(KeyAdapter): >> > def keyPressed(self, event): >> > # Run your code here >> > ... >> > >> > Display.getFront().getCanvas().addKeyListener(MyKeyListener()) >> > >> > Best, >> > >> > Albert >> > >> > 2016-04-11 17:05 GMT-04:00 Federico Luzzati <[hidden email] >> >: >> > >> > > Dear List, >> > > I'm using TrakEM2 to analyze huge multi-channel confocal >> reconstructions. >> > > I'm >> > > importing the channels as separate 8-bit patches with the antigen >> > specified >> > > within the patch name, apply a LUT with "adjust image filters" and set >> > the >> > > composite mode to Add. >> > > To switch on and off a channel I'm using the "select all that match >> > > function". Nonetheless, this method is very slow, and it would be much >> > > better if one could define keyboard shortcuts for that. >> > > I wrote this simple script to toggle visibility of patches based on >> their >> > > names, but I can't figure out how I could call it from a keyboard >> > shortcut >> > > inside TraKEM2. >> > > >> > > Any hint will be greatly appreciated >> > > Thank you very much! >> > > >> > > Federico >> > > >> > > Here is an example of the script: >> > > >> > > from ini.trakem2.display import * >> > > >> > > for layer in Display.getFront().getLayerSet().getLayers(): >> > > patches = layer.getDisplayables(Patch) >> > > for patch in patches: >> > > if "DCX" in patch.title: >> > > if patch.visible == True: >> > > patch.visible = False >> > > else: >> > > patch.visible = True >> > > >> > > >> > > >> > > -- >> > > Federico Luzzati, PhD >> > > Assistant Professor >> > > University of Turin, >> > > Dept. LIfe Sciences and Systems Biology (DBIOS) >> > > Via Accademia Albertina, 13 - 10123 Torino - IT >> > > >> > > Researcher at >> > > Neuroscience Institute Cavalieri Ottolenghi (NICO) >> > > Regione Gonzole, 10 - 10043 Orbassano (To) - IT >> > > >> > > tel. +39-0116704683/ -6631 >> > > http://www.nico.ottolenghi.unito.it/index.php/it/adult-neurogenesis >> > > >> > > Sostieni con il tuo 5xmille il NICO e la ricerca sulle malattie >> > > neurodegenerative >> > > Firma nel riquadro "Finanziamento della ricerca scientifica e >> > > dell'Università" >> > > CF 97564560015 >> > > >> > > -- >> > > ImageJ mailing list: http://imagej.nih.gov/ij/list.html >> > > >> > >> > >> > >> > -- >> > http://albert.rierol.net >> > http://www.janelia.org/lab/cardona-lab >> > http://www.ini.uzh.ch/~acardona/ >> > >> > -- >> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html >> > >> >> >> >> -- >> Federico Luzzati, PhD >> Assistant Professor >> University of Turin, >> Dept. LIfe Sciences and Systems Biology (DBIOS) >> Via Accademia Albertina, 13 - 10123 Torino - IT >> >> Researcher at >> Neuroscience Institute Cavalieri Ottolenghi (NICO) >> Regione Gonzole, 10 - 10043 Orbassano (To) - IT >> >> tel. +39-0116704683/ -6631 >> http://www.nico.ottolenghi.unito.it/index.php/it/adult-neurogenesis >> >> Sostieni con il tuo 5xmille il NICO e la ricerca sulle malattie >> neurodegenerative >> Firma nel riquadro "Finanziamento della ricerca scientifica e >> dell'Università" >> CF 97564560015 >> >> -- >> ImageJ mailing list: http://imagej.nih.gov/ij/list.html >> > > > > -- > http://albert.rierol.net > http://www.janelia.org/lab/cardona-lab > http://www.ini.uzh.ch/~acardona/ > -- Federico Luzzati, PhD Assistant Professor University of Turin, Dept. LIfe Sciences and Systems Biology (DBIOS) Via Accademia Albertina, 13 - 10123 Torino - IT Researcher at Neuroscience Institute Cavalieri Ottolenghi (NICO) Regione Gonzole, 10 - 10043 Orbassano (To) - IT tel. +39-0116704683/ -6631 http://www.nico.ottolenghi.unito.it/index.php/it/adult-neurogenesis Sostieni con il tuo 5xmille il NICO e la ricerca sulle malattie neurodegenerative Firma nel riquadro "Finanziamento della ricerca scientifica e dell'Università" CF 97564560015 -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
Free forum by Nabble | Edit this page |