http://2014.igem.org/wiki/index.php?title=Special:Contributions&feed=atom&limit=50&target=Mjoppich&year=&month=2014.igem.org - User contributions [en]2024-03-28T21:02:51ZFrom 2014.igem.orgMediaWiki 1.16.5http://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOnTeam:Aachen/Notebook/Engineering/WatsOn2014-10-18T03:55:52Z<p>Mjoppich: /* Software */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
= ''WatsOn'' =<br />
<br />
This page contains technical details and construction manuals for our measurement device ''WatsOn'' as well as information on the software controlling the hardware. For more details, please click on the respective tile. For the image analysis software, please visit our [https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty ''Measurarty''] page.<br />
<br />
<html><br />
<center><br />
<ul class="team-grid" style="width:inherit;"><br />
<!-- Overview --><br />
<br />
<li style="margin-right:20px;margin-left:20px;"><br />
<a href="https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonhardware" style="color:black"><br />
<div class="team-item team-info" ><br />
<div class="menukachel">Hardware</div><br />
<!-- <br />
<br/><br/><br />
<b>Hardware</b><br />
<br/><br/><br />
click for more information --><br />
</div><br />
<div class="team-item team-img" style="background: url(https://static.igem.org/mediawiki/2014/5/59/Aachen_14-10-16_Hardware_button_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"> </div></a><br />
</li><br />
<br />
<br />
<li style="margin-right:20px;margin-left:20px;"><br />
<a href="https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware" style="color:black"><br />
<div class="team-item team-info" ><br />
<div class="menukachel">Software</div><br />
<!-- <br/><br><br />
<b>Software</b><br />
<br/><br/><br />
click for more information --><br />
</div><br />
<div class="team-item team-img" style="background: url(https://static.igem.org/mediawiki/2014/1/13/Aachen_14-10-16_Software_button_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"> </div></a><br />
</li><br />
<br />
<li style="margin-right:20px;margin-left:20px;"><br />
<a href="https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsondiy" style="color:black"><br />
<div class="team-item team-info" ><br />
<div class="menukachel">DIY</div><br />
<!-- <br/><br/><br />
<b>DIY</b><br />
<br/><br/><br />
click for more information --><br />
</div><br />
<div class="team-item team-img" style="background: url(https://static.igem.org/mediawiki/2014/9/9e/Aachen_14-10-15_DIY_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"> </div></a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
= Hardware =<br />
<span class="anchor" id="watsonhardware"></span><br />
<br />
{{Team:Aachen/FigureFloat|Aachen_Device_11.jpg|title=''WatsOn''|subtitle= |width=200px}}<br />
<br />
Our hardware consists of the casing and the electronical components. The casing which can be seen on the left was built from laser cut acrylic glass. A detailed description of the assembly is described in the section [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsondiy Build your own ''WatsOn].<br />
<br />
The connection between the different electronical elements is visualized below.<br />
<br />
{{Team:Aachen/Figure|Aachen_Device_Hardware_Graphics.png|title=Interaction of electronical components||width=750px}}<br />
<br />
* '''Raspberry Pi''' : The [http://www.raspberrypi.org/ Raspberry Pi] is a small single-board computer which runs a Linux operating system from an inserted SD card. The steps which are required to set up a fully working system are described in the [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#pisetup DIY section] of this page. The main purpose of the Raspberry Pi is to run the software described above, to control the attached camera and to show the GUI on the display. The big advantage of this board is that it is very powerful, cheap and therefore perfectly fit for our needs.<br />
<br />
* '''Raspberry Pi camera''': The camera is directly connected to the Raspberry Pi board and takes the images of the chips.<br />
<br />
* '''Arduino''': The [http://www.arduino.cc/ Arduino] board is also a single-board computer with less computing power than the Raspberry Pi but with a greater focus on controlling electronical components. Therefore, it is used to control the LEDs and the Peltier heater.<br />
<br />
* '''Relay''': The 2-channel relay works like two light switches which are either turned on or off. They control the 450&nbsp;nm and 480&nbsp;nm LEDs. The channels are connected and turned on and off by the Arduino board.<br />
<br />
* '''Peltier element''': A Peltier component transforms an applied power into a temperature gradient which leads to a hot surface on one side of the element and a cooler one on the other side. The Peltier element connected to the aluminum block heats up the interior of the device to incubate the sensing cells at 37°C.<br />
<br />
* '''USB WiFi stick''': The USB WiFi stick connects the Raspberry Pi to a local network.<br />
<br />
* '''Display''': A 8-digit display is connected to the Arduino board and shows the current interior temperature<br />
<br />
{{Team:Aachen/FigureFloatRight|Aachen_Filter_010.png|title=010|subtitle=|width=70px}}<br />
{{Team:Aachen/FigureFloatRight|Aachen_Filter_505.png|title=505|subtitle=|width=70px}}<br />
<br />
* '''Filter slides''': To block the undesired wavelenghts emitted from the LEDs a filter slide is placed in front of the camera. This step is taken to get a clear fluorescence signal from the chips. The characteristic of the filter slide is selected depending on the frequency of the LEDs which are either 450&nbsp;nm or 480&nbsp;nm ones. We used '505 Sally Green' for the 450&nbsp;nm and '010 Medium Yellow' for the 480&nbsp;nm LEDs. The filters are shown on the right.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
= Software =<br />
<span class="anchor" id="watsonsoftware"></span><br />
<br />
The software consists of several parts which provide an user interface and manage the connection to the hardware. It is also hosted in the [https://github.com/igemsoftware/AachenSoftProject2014 github igemsoftware] repository.<br />
<br />
===GUI (Graphical User Interface)===<br />
On the graphical interface, the user can take images and time lapses of the chips inside the device. The software is written in C++. It makes use of the [http://qt-project.org/ Qt-Library] to provide a clear interface and a comfortable way to manage various software aspects such as handling images and establishing network connections. An advantage resulting from the utilization of Qt-Library is the multi-platform support for Windows, MacOS and Linux. Additionally, Qt is available with an Open Source license which can be used for free. The software can be used locally on the Raspberry Pi or remotely from a device in the same network.<br />
<br />
The scheme below shows the different components of the software:<br />
<br />
[[File:Aachen_Device_GUI.png|center|800px]]<br />
<br />
Features of the GUI include:<br />
* Change settings [1]:<br />
** The user can specify the iso-value and the shutter speed of the camera.<br />
** Custom settings can be labeled and saved for future reference.<br />
** Existing settings can be updated or deleted unless they are default configurations.<br />
* Take image/s [2]: <br />
** The excitation wavelength of GFP (480&nbsp;nm) and iLOV (450&nbsp;nm) can be selected.<br />
** The GUI offers two possibilities to take images:<br />
*** Take a single image with the active camera settings.<br />
*** Take time lapse shootings with the active camera settings and the specified interval. When activated, the images are saved automatically to a user defined directory with ascending filenames.<br />
** The last image which was taken by the camera is shown in the GUI, information containing the time stamp and used camera settings are displayed next to the image [3]. Previous images can be selected with the arrow buttons.<br />
* Analyze image [4]:<br />
** The image is analyzed by an image segmentation algorithm and shows whether the pathogen ''Pseudomonas&nbsp;aeruginosa'' is present on the chip or not<br />
<br />
''Download the GUI sourcecode:'' [https://static.igem.org/mediawiki/2014/9/90/Aachen_WatsOn_GUI.zip Download]<br />
<br />
===Backend===<br />
The backend is a software that runs on the Raspberry Pi and is responsible for the connection between the GUI and the hardware. If the user interface is executed on another device, e.g. a notebook, it has to be in the same network as the Raspberry Pi. The backend works like a web server that receives commands and acts according to the submitted parameters. It can take images and returns them to the GUI.<br />
<br />
Before an image is taken, the backend turns on the specified LEDs by sending a command to the connected Arduino board. Subsequently, the LEDs are turned off using the same mechanism. These steps are repeated in the given interval for a time lapse shooting.<br />
<br />
''Download the backend sourcecode:'' [https://static.igem.org/mediawiki/2014/7/77/Aachen_Device_Backend.zip Download]<br />
<html><br></html><br />
<br />
{{Team:Aachen/Figure|Aachen_Device_SoftwareBackend.png|title=Sample connection between GUI and backend for taking an image|subtitle= |width=900px}}<br />
<br />
===Arduino===<br />
The software on the Arduino board sets the power and thus controls the temperature of the Peltier heater. The power is set by evaluating the received values from the temperature sensors for the interior of the device and the aluminum block. Additionally, the Arduino receives commands from the Raspberry Pi to turn the LEDs on and off.<br />
<br />
''Download the Arduino sourcecode:'' [https://static.igem.org/mediawiki/2014/c/cd/Aachen_WatsOn_arduino.zip Download] <br />
<br />
===Measurarty===<br />
We have developed our own image analysis pipeline ''Measurarty''. Please go to the [https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty ''Measurarty''] project page for further information.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_14-10-15_DIY_Cellocks_iNB.png|right|150px]]<br />
<br />
= DIY: How To Build Your Own ''WatsOn'' =<br />
<span class="anchor" id="watsondiy"></span><br />
<br />
==Technical Components==<br />
If you want to create your own ''WatsOn'' first take a look at the following list of necessary components. All parts except the laser cut acrylic glass can be readily purchased and do not require further adjustments.<br />
<br />
''Download the laser cutting plan here: [https://static.igem.org/mediawiki/2014/f/fd/Aachen_WatsOn_laser_cut.svg.zip Download] (for acrylic glass with a height of 6&nbsp;mm)<br />
<br />
'''All needed components, their quantities and prices for creating your own ''WatsOn'''''<br />
{| class="wikitable sortable"<br />
! align="center" |'''''WatsOn'''''<br />
!! align="center" | <br />
!! align="center" |''' 1€='''<br />
!! align="center" |''' $1.27'''<br />
!! align="center" |''' on 14/10/2014'''<br />
!! align="center" | <br />
|- class="unsortable"<br />
!Quantity !! Component !! Costs [€]!! Costs [$]!! Final [€]!! Final [$]<br />
|-<br />
| 1|| [http://www.prolighting.de/Zubehoer/Farbfilter/Lee-Filter_HT/Lee-Filters_Musterheft_Designer_Edition_i174_3965_0.htm filter slides] (medium yellow 010, sally green 505)||1.57||2.00||1.57||2.00<br />
|-<br />
| 1|| [http://www.dx.com/p/uno-r3-development-board-microcontroller-mega328p-atmega16u2-compat-for-arduino-blue-black-215600 Arduino UNO R3]||9.17||11.65||9.17||11.65<br />
|-<br />
| 1|| [http://www.dx.com/p/arduino-2-channel-relay-shield-module-red-144140 2-channel relay shield]||2.72||3.46||2.72||3.46<br />
|-<br />
| 40||jumper-wire cable||2.35||2.99||2.35||2.99<br />
|-<br />
| 1|| [http://www.dx.com/p/2-54mm-1x40-pin-breakaway-straight-male-header-10-piece-pack-144191 40er male header (10-Piece Pack)]||2.14||2.72||2.14||2.72<br />
|-<br />
| 1|| [http://www.dx.com/p/jtron-2-54mm-40-pin-single-row-seat-single-row-female-header-black-10-pcs-278953 40er female header (10-Piece Pack)]||2.05||2.60||2.05||2.60<br />
|-<br />
| 1|| [http://www.dx.com/p/prototype-universal-printed-circuit-board-breadboard-brown-5-piece-pack-130926 circuit board]||2.35||2.99||2.35||2.99<br />
|-<br />
| 1|| [http://www.newark.com/pro-signal/rp006/audio-video-cable-hdmi-1m-black/dp/96T7446 HDMI cable]||1.47||1.87||1.47||1.87<br />
|-<br />
| 1|| [http://www.dx.com/p/hd-053-high-speed-usb-2-0-7-port-hub-black-174817 7 port USB hub]||5.28||6.71||5.28||6.71<br />
|-<br />
| 1||[http://www.dx.com/p/dx-original-ultra-mini-usb-2-0-802-11n-b-g-150mbps-wi-fi-wlan-wireless-network-adapter-black-252716 USB WiFi stick]||4.21||5.35||4.21||5.35<br />
|-<br />
| 1||USB mouse and keyboard||9.84||12.50||9.84||12.50<br />
|-<br />
| 1|| [http://corporate.evonik.com/en/products/pages/default.aspx case acrylic glass XT 6mm~0.5<sup>2</sup>]||39.88||50.65||39.88||50.65<br />
|-<br />
| 1|| black spray paint for acrylic glass||5.15||6.54||5.15||6.54<br />
|-<br />
| 1|| [http://www.newark.com/raspberry-pi/raspberry-modb-512m/raspberry-pi-model-b-board/dp/68X0155 Raspberry Pi model B board]||27.56||35.00||27.56||35.00<br />
|-<br />
| 1||[http://www.newark.com/raspberry-pi/rpi-camera-board/add-on-brd-camera-module-raspberry/dp/69W0689 Raspberry Pi camera module]||19.69||25.00||19.69||25.00<br />
|-<br />
| 1||[http://www.pollin.de/shop/dt/NzUwOTc4OTk-/ 7” display]||39.35||49.97||39.35||49.97<br />
|-<br />
| 1||[http://www.dx.com/p/diy8-x-seven-segment-displays-module-for-arduino-595-driver-250813 8-segment display]||3.04||3.86||3.04||3.86<br />
|-11.81<br />
| 2|| [http://www.dx.com/p/arduino-dht11-digital-temperature-humidity-sensor-138531 digital temperature sensor DHT-22]||5.91||7.50||11.82||15.00<br />
|-<br />
| 1 ||aluminum block 100x100x15 mm||11.20||14.23||11.20||14.23<br />
|-<br />
| 1|| [http://www.dx.com/p/tec1-12706-semiconductor-thermoelectric-cooler-peltier-white-157283 Peltier heater 12V 60W]||3.54||4.49||3.54||4.49<br />
|-<br />
| 1||power supply||25.90||32.89||25.90||32.89<br />
|-<br />
| 6|| [http://www.leds.de/Low-Mid-Power-LEDs/SuperFlux-LEDs/Nichia-Superflux-LED-blau-3lm-100-NSPBR70BSS.html superflux LED 480nm]||0.99||1.26||5.94||7.54<br />
|-<br />
| 16||LED 450nm||0.37||0.47||5.94||7.54<br />
|-<br />
| 2|| Resistor 40 Ohm||0.12||0.15||0.24||0.30<br />
|-<br />
| 4|| Resistor 100 Ohm||0.12||0.15||0.48||0.60<br />
|-<br />
| 1||cupboard button||0.98||1.24||0.98||1.24<br />
|- class="sortbottom" style="background:#cfe2f4; border-top:2px #808080 solid; font-weight:bold"<br />
| -||Total||-||-||243.88||309.70<br />
|}<br />
<br />
You can find more economical information about ''WatsOn'' and the project on our [https://2014.igem.org/Team:Aachen/PolicyPractices/Economics Economical View] page.<br />
<br />
<br />
For building our '''''WatsOn''''' we used some tools that are not included in the list of necessary components because we assume that they are already available. We used a soldering iron to solder the resistors to the LEDs and fix the headers on the mount of the LEDs. For building electrical circuits our multimeter was very helpful. Furthermore, we applied special glue for plastic to hold the acrylic glass in place. All other components were fixed with tape or hot glue which is versatile and can be removed quickly during alignment of components.<br />
<br />
==Breadboard==<br />
<br />
{{Team:Aachen/Figure|Aachen_Device_Fritzing.png|align=center|title=Wiring of our device||width=900px}}<br />
<br />
==Construction Manual==<br />
<br />
{| class="wikitable centered"<br />
|-<br />
| [[File:Aachen_Device_1.jpg|300px]] || Start building your own ''WatsOn'' by assembling the base plate, the sides and the interior wall.<br />
|-style="border-top: 2px #808080 solid;"<br />
| [[File:Aachen_Device_2_3.jpg|350px] [File:Aachen_Device_.3jpg|300px]] || Fix the Peltier heater on the back of the aluminum block and place it in the hole of the interior wall.<html><br/></html>Arrange the 4x4 450&nbsp;nm LEDs and the 2x3 480&nbsp;nm LEDs<br />
|-style="border-top: 2px #808080 solid;"<br />
| [[File:Aachen_Device_7.jpg|350px]] || Assemble the camera holder with the camera and the corresponding filter slide on the lower part. Above the camera, you can place the temperature sensor for measuring the indoor temperature. Finally, put the fan on the back of the camera holder. <br />
|-style="border-top: 2px #808080 solid;"<br />
| [[File:Aachen_Device_8.jpg|350px]] || Connect the electronic components on the outside and the inside according to the wiring diagramm.<br />
|-style="border-top: 2px #808080 solid;"<br />
| [[File:Aachen_Device_4.jpg|350px]] || Put together the drawer.<br />
|-style="border-top: 2px #808080 solid;"<br />
| [[File:Aachen_Device_9.jpg|350px]] || Position the front panel and insert the drawer.<br />
|-style="border-top: 2px #808080 solid;"<br />
| [[File:Aachen_Device_10.jpg|350px]] || Place the temperature sensor measuring the aluminum block temperature directly on the block and put the back panel in front of it.<br />
|-style="border-top: 2px #808080 solid;"<br />
| [[File:Aachen_Device_6.jpg|350px]] || Setup the power supply<sup>[https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#fn1 1]</sup> and connect all devices to either 5&nbsp;V or 12&nbsp;V. For security reasons it has been placed into an aluminium casing. Plug the USB hub connector into the Raspberry. If you use the GUI locally on the device a mouse and a keyboard need to be attached to the USB hub to navigate on the user interface. Follow the steps described in the section [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#pisetup Raspberry Pi - Setup].<br />
|-style="border-top: 2px #808080 solid;"<br />
| [[File:Aachen_Device_11.jpg|350px]] || Mount the device on top of the power supply casing. Add the display and apply some stickers to enjoy your custom-made ''WatsOn''.<br />
|}<br />
<br />
<span class="anchor" id="fn1"></span><br />
<sup>1</sup>By German law only certified electricians may work on 230&nbsp;V electronics. Therefore, the electrical workshop at our institute created the power supply specifically for our design.<br />
<br />
== Raspberry Pi - Setup ==<br />
<span class="anchor" id="pisetup"></span><br />
<br />
In order to get a running linux system on the Raspberry Pi which includes all required components and configurations the following steps have to be considered:<br />
<br />
* The Raspberry Pi needs an SD card on which the operating system will be installed. Go to the [http://www.raspberrypi.org/downloads/ download page of the Raspberry Pi Foundation] and select an operating system of your choice - we used Raspbian - or just download the NOOBS package which offers all different operating systems during setup. <br />
* Follow the specific image installation guidelines to install the downloaded system onto your SD card.<br />
* Once finished, insert the SD card in the slot on the Raspberry Pi board, connect a monitor over HDMI, plug in a USB mouse and keyboard and start the Raspberry Pi by connecting it to the micro USB power supply. Follow the installation instructions; these should be straightforward. After the installation you will be shown the desktop of your new system.<br />
* To be able to use the Raspberry Pi camera you need activate it over a terminal. Search for a desktop icon labeled "LxTerminal", double click it and a terminal will appear where you can enter commands which will be executed after you press Return. Enter "raspi-config", press Return and activate the camera with the displayed corresponding option.<br />
* To check if the camera works, enter "raspistill -t 5000 -o camera_test.jpg" in the terminal. An overlay shows a 5 second preview from the camera on the screen, then an image is taken and saved as "camera_test.jpg" in the current directory.<br />
* An issue concerning the Raspberry Pi camera is that it supports just a fixed-focus which is per default set to infinity. This can be solved by removing the glue dots fixing the lense und unscrewing it until the required distance is focused.<br />
* Download the source files for the backend server and the graphical user interface (GUI). To be able to compile the GUI, you need to install the Qt5-libraries. Follow [http://qt-project.org/wiki/Native_Build_of_Qt5_on_a_Raspberry_Pi this guide] on how to get the Qt source code, compile it and setup your environment correctly. Make sure that your Raspberry Pi is constantly running, since this process takes some time and must not be interrupted.<br />
* With the Qt-libraries installed, open a terminal and change to the directory where you put the source for the GUI (command "cd [path to source]"). Call "qmake" followed by "make" and you will start compilation of the program. When finished, you can launch the GUI with the command "./igem_GUI".<br />
* The backend - that will establish the connection between hardware and the user interface - requires you to install additional packages for Python which is a high-level general-purpose programming language and an interpreter that will ship with your system. Open the README in the "Backend" directory and follow the instructions.<br />
* You now should be able to launch the backend by calling "python takeimageserver.py &" from the terminal.<br />
* Now start the GUI. An input dialog will show up asking you to provide the IP address of the backend server or the Raspberry Pi, respectively. Since you are running the GUI and the backend on the same device, just press Enter to select the default entry which is the IP of the local host. After a few seconds, when the connection to the backend server has been established, the user interface gets enabled and you can start to take images and time lapse shootings. If the image is not focused you need to adjust the lense in front of the camera by rotating it. For the full list of features refer to the [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware Software section] of this page.<br />
<br />
In case you want to run the GUI on a remote machine, e.g. your notebook, follow these additional steps:<br />
<br />
* Install the [http://qt-project.org/ Qt-libraries and QtCreator] on your system. This is just an installation - you do not have to compile it. Get the source code for the GUI and open the ".pro" file with QtCreator. After importing the project and selecting a built directory, click the green arrow on the left side. Compilation is started and as soon as it is finished the GUI will start. <br />
* In order to be able to connect to the Raspberry Pi you need to be connected to the same network. Therefore, make sure the Raspberry Pi USB wifi stick is working properly (see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#pitrouble Troubleshooting & Useful Links]), and that you reside in the same network. Start the backend server on the Raspberry Pi. It will print the IP address on start up which you must enter in the GUI on your device running the GUI. Now you should be able to use all the features as if running the GUI on the Raspberry Pi.<br />
<br />
=== Troubleshooting & Useful Links ===<br />
<span class="anchor" id="pitrouble"></span><br />
<br />
* Display resolution: If your connected display is not working properly you may refer to<br />
** http://elinux.org/RPiconfig#Video<br />
** http://www.raspberrypi.org/forums/viewtopic.php?f=29&t=24679<br />
<br />
* Raspberry Pi Camera Module<br />
** http://elinux.org/Rpi_Camera_Module<br />
<br />
* Network configuration:<br />
** http://www.raspberrypi.org/documentation/configuration/wireless/README.md<br />
<br />
* General<br />
** [http://elinux.org/R-Pi_Troubleshooting Raspberry Pi Troubleshooting]<br />
** [http://raspberrywebserver.com/linux-basics/ Linux basics]<br />
** [http://www.raspberrypi.org/ Raspberry Pi Foundation]<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/File:Aachen_WatsOn_GUI.zipFile:Aachen WatsOn GUI.zip2014-10-18T03:46:37Z<p>Mjoppich: uploaded a new version of &quot;File:Aachen WatsOn GUI.zip&quot;</p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/File:Aachen_WatsOn_GUI.zipFile:Aachen WatsOn GUI.zip2014-10-18T03:44:11Z<p>Mjoppich: uploaded a new version of &quot;File:Aachen WatsOn GUI.zip&quot;</p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T03:29:12Z<p>Mjoppich: /* Achievements */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by ''Measurarty'' algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally, there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=Regions created with SRM clustering|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
If you apply this HSV masking code to the SRMed test image, the following is created:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_masked.png|title=Masked image|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code, we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be implemented for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
This code actually creates two intermediate images from which the similarity index is calculated.<br />
First the smoothed (disk-filter) input image is created and stored:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smoothed.png|title=Smoothed image|width=700px}}<br />
<br />
Only white regions are candidate regions.<br />
After smoothing, the similarity index is calculated. As expected, edges are detected and limit the area from which the target region can be selected.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smiliarity.png|title=Smoothness Index|width=700px}}<br />
<br />
Finally the selected pathogen region is selected by the black area in the following picture:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_mask.png|title=Selected region|width=700px}}<br />
<br />
Combined with the input image, the final segmentation is received:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_final.png|title=Final the analyzed image|width=700px}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results are convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_sizes.png|title=Pixel count of the detected pathogenic region versus time after induction.|width=700px}}<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
<center><br />
<div class="figure" style="float:{{{align|center}}}; margin: 0px 10px 10px 0px; border:{{{border|0px solid #aaa}}};width:{{{width|960px}}};padding:10px 10px 0px 0px;"><br />
{|<br />
|<html> <img src="https://static.igem.org/mediawiki/2014/f/fc/Aachen_Measurarty_combined_slow.gif" width="960px"></html><br />
|-<br />
|'''{{{title|Detecting ''P. aeroginosa'' with K131026}}}'''<br />{{{subtitle|The left half shows the original images from the device and the right half shows the same pictures with the detected pathogenic region analyzed by ''Measurarty''.}}}<br />
|}<br />
</div><br />
</center><br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM software repository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* [https://static.igem.org/mediawiki/2014/6/6e/Aachen_measurarty.zip MATLAB code]<br />
* link [https://github.com/igemsoftware/AachenSoftProject2014/tree/master/measurarty github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T03:26:42Z<p>Mjoppich: /* Source Code */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by ''Measurarty'' algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally, there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=Regions created with SRM clustering|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
If you apply this HSV masking code to the SRMed test image, the following is created:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_masked.png|title=Masked image|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code, we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be implemented for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
This code actually creates two intermediate images from which the similarity index is calculated.<br />
First the smoothed (disk-filter) input image is created and stored:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smoothed.png|title=Smoothed image|width=700px}}<br />
<br />
Only white regions are candidate regions.<br />
After smoothing, the similarity index is calculated. As expected, edges are detected and limit the area from which the target region can be selected.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smiliarity.png|title=Smoothness Index|width=700px}}<br />
<br />
Finally the selected pathogen region is selected by the black area in the following picture:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_mask.png|title=Selected region|width=700px}}<br />
<br />
Combined with the input image, the final segmentation is received:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_final.png|title=Final the analyzed image|width=700px}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_sizes.png|title=Pixel count of the detected pathogenic region versus time after induction.|width=700px}}<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
<center><br />
<div class="figure" style="float:{{{align|center}}}; margin: 0px 10px 10px 0px; border:{{{border|0px solid #aaa}}};width:{{{width|960px}}};padding:10px 10px 0px 0px;"><br />
{|<br />
|<html> <img src="https://static.igem.org/mediawiki/2014/f/fc/Aachen_Measurarty_combined_slow.gif" width="960px"></html><br />
|-<br />
|'''{{{title|Detecting ''P. aeroginosa'' with K131026}}}'''<br />{{{subtitle|The left half shows the original images from the device and the right half shows the same pictures with the detected pathogenic region analyzed by ''Measurarty''.}}}<br />
|}<br />
</div><br />
</center><br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM software repository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* [https://static.igem.org/mediawiki/2014/6/6e/Aachen_measurarty.zip MATLAB code]<br />
* link [https://github.com/igemsoftware/AachenSoftProject2014/tree/master/measurarty github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T02:53:42Z<p>Mjoppich: /* Automatic Classification */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=regions created with SRM clustering|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
If you apply this HSV masking code to the SRMed test image, the following is created:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_masked.png|title=masked image|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
This code actually creates two intermediate images from which the similarity index is calculated.<br />
First the smoothed (disk-filter) input image is created and stored:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smoothed.png|title=smoothed image|width=700px}}<br />
<br />
Only white regions are candidate regions.<br />
After smoothing, the similarity index is calculated. As expected, edges are detected and limit the area from which the target region can be selected.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smiliarity.png|title=Smoothness Index|width=700px}}<br />
<br />
Finally the selected pathogen region is selected by the black area in the following picture:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_mask.png|title=selected region|width=700px}}<br />
<br />
Combined with the input image, the final segmentation is received:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_final.png|title=final analyzed image|width=700px}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_sizes.png|title=Pixel count of the detected pathogenic region versus time after induction.|width=700px}}<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
<center><br />
<div class="figure" style="float:{{{align|center}}}; margin: 0px 10px 10px 0px; border:{{{border|0px solid #aaa}}};width:{{{width|960px}}};padding:10px 10px 0px 0px;"><br />
{|<br />
|<html> <img src="https://static.igem.org/mediawiki/2014/f/fc/Aachen_Measurarty_combined_slow.gif" width="960px"></html><br />
|-<br />
|'''{{{title|Detecting ''P. aeroginosa'' with K131026}}}'''<br />{{{subtitle|The left half shows the original images from the device and the right half shows the same pictures with the detected pathogenic region analyzed by ''Measurarty''.}}}<br />
|}<br />
</div><br />
</center><br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM software repository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* [https://static.igem.org/mediawiki/2014/6/6e/Aachen_measurarty.zip MATLAB code]<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T02:52:40Z<p>Mjoppich: /* Source Code */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=regions created with SRM clustering|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
If you apply this HSV masking code to the SRMed test image, the following is created:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_masked.png|title=masked image|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
This code actually creates two intermediate images from which the similarity index is calculated.<br />
First the smoothed (disk-filter) input image is created and stored:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smoothed.png|title=smoothed image|width=700px}}<br />
<br />
Only white regions are candidate regions.<br />
After smoothing, the similarity index is calculated. As expected, edges are detected and limit the area from which the target region can be selected.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smiliarity.png|title=detected edges|width=700px}}<br />
<br />
Finally the selected pathogen region is selected by the black area in the following picture:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_mask.png|title=selected region|width=700px}}<br />
<br />
Combined with the input image, the final segmentation is received:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_final.png|title=final analyzed image|width=700px}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_sizes.png|title=Pixel count of the detected pathogenic region versus time after induction.|width=700px}}<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
<center><br />
<div class="figure" style="float:{{{align|center}}}; margin: 0px 10px 10px 0px; border:{{{border|0px solid #aaa}}};width:{{{width|960px}}};padding:10px 10px 0px 0px;"><br />
{|<br />
|<html> <img src="https://static.igem.org/mediawiki/2014/f/fc/Aachen_Measurarty_combined_slow.gif" width="960px"></html><br />
|-<br />
|'''{{{title|Detecting ''P. aeroginosa'' with K131026}}}'''<br />{{{subtitle|The left half shows the original images from the device and the right half shows the same pictures with the detected pathogenic region analyzed by ''Measurarty''.}}}<br />
|}<br />
</div><br />
</center><br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM software repository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* [https://static.igem.org/mediawiki/2014/6/6e/Aachen_measurarty.zip MATLAB code]<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/File:Aachen_measurarty.zipFile:Aachen measurarty.zip2014-10-18T02:51:45Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T00:30:37Z<p>Mjoppich: /* Achievements */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=regions created with SRM clustering|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
If you apply this HSV masking code to the SRMed test image, the following is created:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_masked.png|title=masked image|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
This code actually creates two intermediate images from which the similarity index is calculated.<br />
First the smoothed (disk-filter) input image is created and stored:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smoothed.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Only white regions are candidate regions.<br />
After smoothing, the similarity index is calculated. As expected, edges are detected and limit the area from which the target region can be selected.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smiliarity.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Finally the selected pathogen region is selected by the white area in the following picture:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_mask.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Combined with the input image, the final segmentation is received:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_final.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_sizes.png|title=Pixel count of the detected pathogenic region versus time after induction.|width=700px}}<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
<center><br />
<div class="figure" style="float:{{{align|center}}}; margin: 0px 10px 10px 0px; border:{{{border|0px solid #aaa}}};width:{{{width|960px}}};padding:10px 10px 0px 0px;"><br />
{|<br />
|<html> <img src="https://static.igem.org/mediawiki/2014/f/fc/Aachen_Measurarty_combined_slow.gif" width="960px"></html><br />
|-<br />
|'''{{{title|Detecting ''P. aeroginosa'' with K131026}}}'''<br />{{{subtitle|The two chips on the left are the original images from the device and on the right are the same pictures with the overlay of the fluorescence analyzed by ''Measurarty''.}}}<br />
|}<br />
</div><br />
</center><br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM softwarerepository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* MATLAB code<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T00:28:42Z<p>Mjoppich: /* Achievements */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=regions created with SRM clustering|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
If you apply this HSV masking code to the SRMed test image, the following is created:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_masked.png|title=masked image|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
This code actually creates two intermediate images from which the similarity index is calculated.<br />
First the smoothed (disk-filter) input image is created and stored:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smoothed.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Only white regions are candidate regions.<br />
After smoothing, the similarity index is calculated. As expected, edges are detected and limit the area from which the target region can be selected.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smiliarity.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Finally the selected pathogen region is selected by the white area in the following picture:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_mask.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Combined with the input image, the final segmentation is received:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_final.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
*include image here<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
<center><br />
<div class="figure" style="float:{{{align|center}}}; margin: 0px 10px 10px 0px; border:{{{border|0px solid #aaa}}};width:{{{width|960px}}};padding:10px 10px 0px 0px;"><br />
{|<br />
|<html> <img src="https://static.igem.org/mediawiki/2014/f/fc/Aachen_Measurarty_combined_slow.gif" width="960px"></html><br />
|-<br />
|'''{{{title|Detecting ''P. aeroginosa'' with K131026}}}'''<br />{{{subtitle|The two chips on the left are the original images from the device and on the right are the same pictures with the overlay of the fluorescence analyzed by ''Measurarty''.}}}<br />
|}<br />
</div><br />
</center><br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM softwarerepository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* MATLAB code<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/File:Aachen_meas_sizes.pngFile:Aachen meas sizes.png2014-10-18T00:24:44Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/File:Aachen_meas_final.pngFile:Aachen meas final.png2014-10-18T00:22:29Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T00:20:23Z<p>Mjoppich: /* Classification */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=regions created with SRM clustering|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
If you apply this HSV masking code to the SRMed test image, the following is created:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_masked.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
This code actually creates two intermediate images from which the similarity index is calculated.<br />
First the smoothed (disk-filter) input image is created and stored:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smoothed.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Only white regions are candidate regions.<br />
After smoothing, the similarity index is calculated. As expected, edges are detected and limit the area from which the target region can be selected.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smiliarity.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Finally the selected pathogen region is selected by the white area in the following picture:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_mask.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Combined with the input image, the final segmentation is received:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_final.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
*include image here<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM softwarerepository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* MATLAB code<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/File:Aachen_meas_mask.pngFile:Aachen meas mask.png2014-10-18T00:17:33Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T00:11:32Z<p>Mjoppich: /* Automatic Classification */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
If you apply this HSV masking code to the SRMed test image, the following is created:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_masked.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
This code actually creates two intermediate images from which the similarity index is calculated.<br />
First the smoothed (disk-filter) input image is created and stored:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smoothed.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
Only white regions are candidate regions.<br />
After smoothing, the similarity index is calculated. As expected, edges are detected and limit the area from which the target region can be selected.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_smiliarity.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
*include image here<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM softwarerepository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* MATLAB code<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T00:06:16Z<p>Mjoppich: /* Segmentation */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
If you apply this HSV masking code to the SRMed test image, the following is created:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_masked.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
*include image here<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM softwarerepository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* MATLAB code<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T00:04:56Z<p>Mjoppich: /* SRM Clustering */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.png|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
* image of masked bit<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
*include image here<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM softwarerepository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* MATLAB code<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T00:04:30Z<p>Mjoppich: /* SRM Clustering */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
Finally, if applied to our test-image, regions are created and homogenoues regions form:<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_srmed.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
* image of masked bit<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
*include image here<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM softwarerepository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* MATLAB code<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/Notebook/Software/MeasurartyTeam:Aachen/Notebook/Software/Measurarty2014-10-18T00:02:01Z<p>Mjoppich: /* Measurarty - An Introduction */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<br />
<html><br />
<link rel="stylesheet" href="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.default.css?action=raw&ctype=text/css"><br />
<script src="https://2014.igem.org/Team:Aachen/Scripts/highlight.pack.js?action=raw&ctype=text/javascript"></script><br />
<script>hljs.initHighlightingOnLoad();</script><br />
</html><br />
<br />
= ''Measurarty'' =<br />
<br />
''Measurarty'' is the evil player in the game of ''Cellock Holmes'' and ''WatsOn''.<br />
''Measurarty'' is the pathogen detection logic behind our project.<br />
Using our ''Measurarty'' algorithm, we want to automatically detect pathogens from the chip photos delivered by WatsOn, without human interaction.<br />
Besides reducing the risk of human errors, this makes our device usable by almost everyone.<br />
<br />
<html><br />
<center><br />
<ul class="menusmall-grid"><br />
<!-- Overview --><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#intro" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Intro</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/1/1b/Aachen_Measurarty_Intro_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#SRM" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">SRM!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/2/2d/Aachen_Puzzels_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#segment" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Segment!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/e1/Aachen_SEgment_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#classification" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Classify!</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/f/f9/Aachen_Classify_button.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
<li style="width: 156px;margin-left: 8px;margin-right: 8px;"><br />
<a class="menulink" href="https://2014.igem.org/Team:Aachen/Notebook/Software/Measurarty#measurartyachievements" style="color:black"><br />
<div class="menusmall-item menusmall-info" ><div class="menukachel">Achieve-<br/>ments</div></div><br />
<div class="menusmall-item menusmall-img" style="background: url(https://static.igem.org/mediawiki/2014/e/ef/Aachen_14-10-15_Medal_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%"><br />
</div><br />
</a><br />
</li><br />
<br />
</ul><br />
</center><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Measurarty_Intro_button.png|right|150px]]<br />
<br />
== ''Measurarty'' - An Introduction ==<br />
<span class="anchor" id="intro"></span><br />
<br />
Our [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware device control software] is able to take images of incubated chips inside WatsOn. Yet, that does not bring the user closer to the answer of the question:<br />
<br />
<center>'''What's on the chip?'''</center><br />
<br />
In fact, answering this question seems trivial for a human: Just check whether a colony grown has grown on the chip and you're done. This task is even easier with our chip system, because these show fluorescence wherever a pathogen has been detected.<br />
<br />
But is this an easy task for a computer? Actually not. The task of automatic detection is tried by several disciplines in computer science, from pattern recognition over machine learning to by medical imaging chairs.<br />
<br />
Here, we would like to present a pipeline for this task that makes use of '''easy segmentation and classification algorithms'''.<br />
First, ''Measurarty'' segments the target image using '''Statistical Region Merging (SRM)''' in order to find regions of similar properties. After this step, we can segment the picture using '''histogram thresholding''' in [http://en.wikipedia.org/wiki/HSL_and_HSV HSV color space] to find candidate regions for pathogens.<br />
Finally, a classification algorithm can detect the pathogen on our chips.<br />
<br />
To demonstrate the algorithm, the following sample image will be discussed.<br />
<br />
{{Team:Aachen/Figure|align=center|Aachen_meas_test.jpg|title=Image taken from WatsOn to be analyzed by Measurarty algorithm|width=700px}}<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Puzzels_button.png|right|150px]]<br />
<br />
== Statistical Region Merging (SRM) ==<br />
<span class="anchor" id="SRM"></span><br />
<br />
Before briefly introducing Statistical Region Merging (SRM), we would like to explain why we need this step, and why this algorithm is an ideal choice.<br />
<br />
Compared to other clustering algorithms, SRM is quite leight weight, yet delivers ''deterministic'' results and is not dependent on a certain seed (like ''k''-means, for example).<br />
<br />
On the other hand, it can create as many refinements as one wants and is thus flexible enough for the our purposes. Finally there's already been knowledge about this algorithm in the group.<br />
<br />
Statistical Region Merging (SRM) (Nook and Nielson, 2004) is a clustering technique also used directly for image segmentation.<br />
A region $R$ is a set of pixels and the cardinality $\lvert R \rvert$ determines how many pixels are in one region.<br />
Starting with a sorted set of connected regions (w. r. t. some distance function $f$), two regions $R$ and $R'$ are merged if the qualification criteria $\vert \overline{R'}-\overline{R} \vert \leq \sqrt{b^2(R)+b^2(R')}$ with $b(R) = g \cdot \sqrt{\frac{\ln \frac{\mathcal{R}_{\lvert R \rvert}}{\delta}}{2Q\lvert R \rvert}}$ is fulfilled.<br />
Therefore, $\mathcal{R}_{\lvert R \rvert}$ is the set of regions with $\lvert R \rvert$ pixels.<br />
Typically $Q$ is chosen as $Q \in \lbrack 256, 1\rbrack$ and $\delta = \frac{1}{\lvert I \rvert^2}$.<br />
<br />
The $Q$ parameter mainly influences the merging process. For an example, see the figure ''SRM Regions'' below. The lower the chosen value for $Q$, more coarse the regions become. Using a union-find structure, the segmentation does not need to be recalculated for each $Q$ level. For the step from $q$ to $\frac{q}{2}$, just the qualification criteria needs to be applied to the regions from the $q$ result. A MATLAB implementation is also available (Boltz, 2009).<br />
<br />
{{Team:Aachen/FigureDual|Aachen_srm_regions_3.PNG|Aachen_srm_regions_2.PNG|title1=SRM regions in random colors|title2=SRM regions (average color)|subtitle1=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned a random color.|subtitle2=Different regions from an SRM run starting at $Q=256$ (top left) and going to $Q=1$ (bottom right). Each region is assigned the average color of that region.|width=425px}} <br />
<br />
=== SRM Clustering ===<br />
<br />
In our project, we used Statistical Region Merging for clustering. In contrast to other algorithms, such as ''k-means'', this approach is highly deterministic.<br />
For our purposes we only have one SRM run for $Q=256$.<br />
<br />
In MATLAB, we use the previously mentioned code from MATLAB Fileexchange (Boltz, 2009).<br />
For our Qt-based GUI we implemented the SRM method ourselves.<br />
<br />
The SRM clustering reduces the amount of different colors in the image and hence eases the recognition of parts belonging together.<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
Qlevel = 256;<br />
[maps,images]=singlesrm(double(image),Qlevel);<br />
</code></pre><br />
</div><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_SEgment_button.png|right|150px]]<br />
<br />
== Segmentation ==<br />
<span class="anchor" id="segment"></span><br />
<br />
In the segmentation stage all background regions are removed. This task is quite crucial. If one removes too few, the final stage of finding pathogens might get irritated.<br />
On the other hand, if one removes too many regions, positive hits might get removed early before detection. This surely must be avoided.<br />
<br />
We opted for a simple thresholding step because it showed that while being easy, it is an effective weapon against the uniform background. In fact, the good image quality we wanted to reach with our device allows now less sophisticated methods.<br />
Also the less computational intensive the steps are, the better they might even run directly on the Raspberry Pi in our device!<br />
<br />
The HSV thresholding is performed on each component seperately. For more information on the HSV color space we refer to [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia]. The first component is the hue which we select to be inbetween $0.462$ and $0.520$ to select any blue-greenish color. We will not see bright green due to the filter selection in our device.<br />
The saturation value must be high, between $0.99$ and $1.0$.<br />
Moreover, the value component of the HSV image has to lie between $0.25$ and $0.32$, which assumes a relatively dark color.<br />
<br />
Indeed, these values are not problem specific, but specific for each setup and therefore have to be determined empirically.<br />
<br />
The remainder of this stage creates a mask of pixels that fulfill the conditions.<br />
<br />
* image of masked bit<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
% Auto-generated by colorThresholder app on 15-Oct-2014<br />
%-------------------------------------------------------<br />
function [maskedRGBImage] = createMask(srmimg)<br />
RGB = srmimg;<br />
<br />
% Convert RGB image to chosen color space<br />
I = rgb2hsv(RGB);<br />
<br />
% Define thresholds for channel 1 based on histogram settings<br />
channel1Min = 0.462;<br />
channel1Max = 0.520;<br />
<br />
% Define thresholds for channel 2 based on histogram settings<br />
channel2Min = 0.99;<br />
channel2Max = 1.000;<br />
<br />
% Define thresholds for channel 3 based on histogram settings<br />
channel3Min = 0.25;<br />
channel3Max = 0.32;<br />
<br />
% Create mask based on chosen histogram thresholds<br />
BW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...<br />
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...<br />
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);<br />
<br />
% Initialize output masked image based on input image.<br />
maskedRGBImage = RGB;<br />
<br />
% Set background pixels where BW is false to zero.<br />
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;<br />
<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_Classify_button.png|right|150px]]<br />
<br />
== Classification ==<br />
<span class="anchor" id="classification"></span><br />
<br />
=== Smoothness Index ===<br />
<br />
For position prediction in virtual environments, jitter or noise in the output signal is not wanted though often present.<br />
Since discovering smooth areas is a similar problem to jitter detection, a simple method for determining jitter can be used to measure non-jitter, smoothness (Joppich, Rausch and Kuhlen, 2013).<br />
It is assumed that jitter-free areas of a position signal do not differ in velocity.<br />
<br />
Smooth areas do not differ in intensity, and therefore only low changes in velocity (intensity change) can be recorded.<br />
For the reduction of noise, this operation is performed on the smoothed input image.<br />
Then the smoothness $s$ of a pixel $p$ in its k-neighbourhood $\mathcal{N}_k$ can be determined as:<br />
\begin{equation}<br />
s(p) = \sum\limits_{p' \in \mathcal{N}_k} \nabla(p') / \arg\max\limits_{p} s(p)<br />
\end{equation}<br />
<br />
Using thresholding, $TS_l \leq s(p) \leq TS_u \wedge TI_l \leq I \leq TI_u$, different areas, such as background or pathogen, can be selected.<br />
<br />
For the empirical choice of thresholds, it can be argued that these are tailored to the specific case.<br />
While this surely is true to a certain extent, the here presented method has been successfully tested on images from a completely different domain, and no changes to the thresholds have been made to make it work.<br />
A proper theoretical evaluation is emphasized, however, is probably not the aim of the iGEM competition.<br />
<br />
Finally, selecting for the red region, this delivers the location of possible pathogens.<br />
Since the size of the agar chips is variable but fixed a quantitative analysis can be performed by counting pixels for instance.<br />
<br />
=== Empirical Evaluation ===<br />
<br />
Using our MATLAB code we found the lower threshold for the smoothness index to be $TS_l = 0.85$ and the upper threshold $TS_u = \infty$.<br />
Similarly, for $TI_l = 235$ and $TI_u = \infty$.<br />
<br />
Using these settings, we can find a response already in images taken after 42&nbsp;minutes.<br />
<br />
Ideally, one would rate the quality of the image segmentation using some ground truth, such as manual delineations. This still has to be done for our method.<br />
However, from visual observations, our method is showing promising results.<br />
<br />
* image of smoothness index<br />
<br />
=== Automatic Classification ===<br />
<br />
<br />
<html><br />
<div class="codediv"><br />
<pre><code class="matlab"><br />
function [mask, seg] = automaticseeds(im)<br />
<br />
imc = im;<br />
<br />
%% to grayscale and filtering<br />
Z = double(rgb2gray(im));<br />
Z = 255 * Z / max(max(Z));<br />
<br />
filtertype = 'disk';<br />
Z = filter2(fspecial(filtertype), Z);<br />
Z = filter2(fspecial(filtertype), filter2(fspecial(filtertype), Z));<br />
Z = 255 * Z / max(max(Z)); <br />
<br />
%% calculating similarity score/smoothness index<br />
k=4;<br />
sSI = similarity(Z,k);<br />
sSI = sSI / max(max(sSI)); <br />
<br />
%% classify<br />
pathogene = ((sSI > 0.85) == 1) & ((Z > 235) == 1); <br />
<br />
mask = ones( size(imc) );<br />
seg = zeros( size(imc) );<br />
<br />
<br />
%% output<br />
for i=1:size(im,1)<br />
for j=1:size(im,2)<br />
<br />
if (pathogene(i,j) == 1)<br />
seg(i,j,1:3) = [255 0 0];<br />
mask(i, j, 1:3) = [0 0 0];<br />
end<br />
end<br />
end<br />
end<br />
</code></pre><br />
</div><br />
</html><br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
[[File:Aachen_14-10-15_Medal_Cellocks_iNB.png|right|150px]]<br />
<br />
== Achievements ==<br />
<span class="anchor" id="measurartyachievements"></span><br />
<br />
''Measurarty'' is the image analysis logic behind our project.<br />
It is comprised of simple constructs put together into a pipeline, that is clearly laid out, easily maintainable and - if needed - easily adaptable.<br />
For example, changing from green to red fluorescence, only means to change the ''createMask'' function to select another target area.<br />
<br />
Overall the results look convincing. We have not yet performed a comparison to a manual delineation, however, by eye the results look promising and have a low error.<br />
<br />
Talking about computational complexity, the MATLAB code of course performs better than our own C++ implementation, which must be regarded as a proof-of-principle.<br />
<br />
Space-wise, the code depends heavily on the image size $O( x \cdot y)$ (width $x$, height $y$, which also limits the number of edges in SRM between regions, as each pixel is one region to start with. However, it cannot take less memory, as the image is stored in an uncompressed format.<br />
<br />
On the computational side, the thresholding, image conversion and gradient steps are linear in the number of pixels, and are thus in $O(x \cdot y)$.<br />
Unfortunately, the summation of the gradient for the smoothness index adds a heavy factor to it (k-neighbourhood for smoothness index).<br />
Due to the merging step in our C++-SRM algorithm implementation, our code has to do $O(x^2 \cdot y^2)$ comparisons, which then finally results in a runtime complexity of $O( x^2 \cdot y^2)$.<br />
<br />
*include image here<br />
<br />
From the above figure it can also be seen that the detected amount of pathogenic-area correlates with time after induction.<br />
The lag-phase can be explained first by the lag-phase of the cells, which first need to generate a response to the pathogen, and on the other hand, by too low fluorescence which is not detectable.<br />
The pixel count also meets the expectation when looking at the sample files by eye.<br />
<br />
It can be concluded that the ''Measurarty'' pipeline defines a robustly working chip-analysis algorithm which can detect pathogens from images supplied by ''WatsOn''.<br />
Therefore, this algorithm closes the gap between our biology, detection hardware and the user who wants easy-to-interpret results.<br />
<br />
For future prospects, it would be interesting to do a proper performance analysis on our code, to find hotspots and optimize the code. Many ''for''-loops leave plenty of room for vectorization and loop-unrolling. Parallelization, specifically with respect to embedded hardware such as the Raspberry Pi or Odroid U3, is limited to the extend that the overhead created would probably eliminate the improvements.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== Source Code ==<br />
<span class="anchor" id="source"></span><br />
<br />
''Measuarty'' is the image analysis logic behind our project. It has been prototyped and developed in [http://www.mathworks.de/academia/student-competitions/igem/ MATLAB], and only later been ported into our ''WatsOn'' GUI.<br />
<br />
We are happy to provide you with a zip-ped download of our MATLAB code here, as well as on the iGEM softwarerepository on [https://github.com/orgs/igemsoftware/teams/aachen2014 github].<br />
<br />
* MATLAB code<br />
* link [https://github.com/orgs/igemsoftware/teams/aachen2014 github]<br />
<br />
For the C++ conversion please see [https://2014.igem.org/Team:Aachen/Notebook/Engineering/WatsOn#watsonsoftware our ''WatsOn'' Software] section.<br />
<br />
=== Using the MATLAB Code ===<br />
<br />
In general, please follow the included ''README.MD'' file. Our package comes with a set of test files from one of our experiments.<br />
After installing the Statistical Region Merging code (see readme), you can simply run ''igem_srm_demo.m''. Select your current folder, and MATLAB will automatically segment and classify the included jpg-images.<br />
<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
== References ==<br />
<span class="anchor" id="measurartyrefs"></span><br />
<br />
* Boltz, S. (2009, October 20). Image segmentation using statistical region merging - File Exchange - MATLAB Central. Image segmentation using statistical region merging. Retrieved December 12, 2013, from http://www.mathworks.com/matlabcentral/fileexchange/25619-image-segmentation-using-statistical-region-merging<br />
<br />
* Joppich, M., Rausch, D., & Kuhlen, T. (2013). Adaptive human motion prediction using multiple model approaches.. Virtuelle und erweiterte Realität (p. 169–180). 10. Workshop der GI-Fachgruppe VR/AR: Shaker.<br />
<br />
* Nock, R., & Nielsen, F. (2004). Statistical region merging. IEEE Transactions on Pattern Analysis and Machine Intelligence, 26(11), 1452-1458.<br />
<br />
<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/File:Aachen_meas_masked.pngFile:Aachen meas masked.png2014-10-18T00:01:38Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/File:Aachen_meas_smiliarity.pngFile:Aachen meas smiliarity.png2014-10-18T00:01:27Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/File:Aachen_meas_smoothed.pngFile:Aachen meas smoothed.png2014-10-18T00:01:12Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/File:Aachen_meas_srmed.pngFile:Aachen meas srmed.png2014-10-18T00:00:59Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/File:Aachen_meas_test.jpgFile:Aachen meas test.jpg2014-10-18T00:00:46Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:50:35Z<p>Mjoppich: /* Mr. Holmes Secret Logbook */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr. Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this website exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.JPG]]</span><br />
<br />
... or software.<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
... but we had those cool moment where stuff really worked out ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
... and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg|900px]]</span><br />
<br />
== '''+++Newsticker from Wikifreezenight+++''' ==<br />
* Congratuatlions - you deleted everything.<br />
* Fail!<br />
* That looks interesting o.O<br />
* One page does not take the newest editing: who created a second header file?!<br />
* Why is there a link to www.example.com on our landing page??<br />
* Nina: I just broke our landing page.<br />
* *coffee smell in the air* - did someone just fetch coffee without fetching me one?? - *evil face*<br />
* i just want to quickly delete our css<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:49:22Z<p>Mjoppich: /* +++Newsticker from Wikifreezenight+++ */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr. Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this website exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.JPG]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg|900px]]</span><br />
<br />
== '''+++Newsticker from Wikifreezenight+++''' ==<br />
* Congratuatlions - you deleted everything.<br />
* Fail!<br />
* That looks interesting o.O<br />
* One page does not take the newest editing: who created a second header file?!<br />
* Why is there a link to www.example.com on our landing page??<br />
* Nina: I just broke our landing page.<br />
* *coffee smell in the air* - did someone just fetch coffee without fetching me one?? - *evil face*<br />
* i just want to quickly delete our css<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:46:52Z<p>Mjoppich: /* +++Newsticker from Wikifreezenight+++ */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr. Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this website exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.JPG]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg|900px]]</span><br />
<br />
== '''+++Newsticker from Wikifreezenight+++''' ==<br />
* Congratuatlions - you deleted everything.<br />
* Fail!<br />
* That looks interesting o.O<br />
* One page does not take the newest editing: who created a second header file?!<br />
* Why is there a link to www.example.com on our landing page??<br />
* Nina: I just broke our landing page :(<br />
* *coffee smell in the air* - did someone just fetch coffee without fetching me one?? - *evil face*<br />
* i just want to quickly delete our css<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Template:Team:Aachen/HeaderFrontTemplate:Team:Aachen/HeaderFront2014-10-17T23:46:16Z<p>Mjoppich: </p>
<hr />
<div>{{CSS/Main}}<br />
<html><br />
<style><br />
#contentSub, #footer-box, #catlinks, #search-controls, #p-logo, .printfooter, .firstHeading,.visualClear {display: none;}, table/*-- hides default wiki settings --*/<br />
</style><br />
<br />
<style type="text/css"><br />
<br />
.codediv {<br />
text-align: left;<br />
margin: 0 40px 0 40px;<br />
}<br />
<br />
.menukachel {<br />
top: 35%;<br />
position: relative;<br />
font-size: 22px;<br />
font-weight:bold;<br />
text-decoration: none;<br />
text-align: center;<br />
}<br />
<br />
.menulink {<br />
text-decoration: none;<br />
}<br />
.menulink:hover {<br />
text-decoration: none;<br />
}<br />
.menulink:visited {<br />
text-decoration: none;<br />
}<br />
<br />
table.wikitable.centered {<br />
margin: 40px 40px 40px 40px;<br />
}<br />
<br />
table.wikitable {<br />
padding: 0.5em;<br />
border: 2px #808080 solid;<br />
background: white !important;<br />
margin-left: 40px;<br />
margin-right: 40px;<br />
}<br />
table.wikitable th {<br />
border: 2px #808080 solid;<br />
padding: 0.5em;<br />
background: #cfe2f4 !important;<br />
text-align: left;<br />
}<br />
table.wikitable td{<br />
border-right: 2px solid #808080;<br />
border-left: 2px solid #808080;<br />
border-top: 0px;<br />
border-bottom: 0px;<br />
padding: 0.5em;<br />
<br />
}<br />
<br />
/*<br />
MENU<br />
*/<br />
.navDiv {<br />
width: 100%;<br />
background: #0069b3;<br />
box-shadow: 0px 0px 9px rgba(0,0,0,0.15);<br />
}<br />
<br />
span.anchor {display: block; position: relative; top: -140px; visibility: hidden;}<br />
<br />
nav ul li a {<br />
font-size: 20px;<br />
}<br />
<br />
nav ul li ul li a {<br />
font-size: 16px;<br />
}<br />
<br />
nav {<br />
margin: auto auto; <br />
text-align: center;<br />
background: #0069b3; <br />
font-weight: bold;<br />
font-size: 16px;<br />
text-align: center;<br />
<br />
}<br />
<br />
nav ul ul {<br />
display: none;<br />
}<br />
<br />
nav ul li:hover > ul {<br />
display: block;<br />
}<br />
<br />
<br />
nav ul {<br />
background: #0069b3; <br />
padding: 0 0px;<br />
border-radius: 0px; <br />
list-style: none;<br />
position: relative;<br />
margin: 0 0 0 0!important;<br />
display: inline-table;<br />
margin-bottom: 0!important;<br />
<br />
}<br />
nav ul:after {<br />
content: ""; clear: both; display: block;<br />
}<br />
<br />
nav ul li {<br />
float: left;<br />
margin-bottom: 0!important;<br />
height:50px;<br />
}<br />
nav ul li:hover {<br />
background: #8ebae5;<br />
}<br />
nav ul li:hover a {<br />
color: #fff;<br />
}<br />
<br />
nav ul li a {<br />
display: block; padding: 14px 20px;<br />
color: #ffffff;<br />
text-decoration: none!important;<br />
height: 25px;<br />
}<br />
<br />
nav ul li a:visited {<br />
display: block; padding: 14px 20px;<br />
color: #ffffff;<br />
text-decoration: none!important;<br />
<br />
}<br />
<br />
<br />
nav ul ul {<br />
background: #8ebae5; border-radius: 0px; padding: 0;<br />
position: absolute; top: 100%;<br />
}<br />
nav ul ul li {<br />
float: none; <br />
position: relative;<br />
text-align: left;<br />
<br />
}<br />
nav ul ul li a {<br />
padding: 0px 20px;<br />
color: #fff;<br />
} <br />
nav ul ul li a:hover {<br />
background: #0069b3;<br />
}<br />
<br />
nav ul ul ul {<br />
position: absolute; left: 100%; top:0;<br />
}<br />
<br />
nav ul li ul li {<br />
height:25px;<br />
}<br />
nav ul li ul li:hover {<br />
height:25px;<br />
}<br />
<br />
<br />
/*<br />
WEBSITE<br />
*/<br />
<br />
* {<br />
font-family: Verdana, Geneva, sans-serif !important;/* <-- fonts */<br />
}<br />
<br />
#top-section {<br />
margin-left: auto!important;<br />
margin-right: auto!important;<br />
width: 100%!important;<br />
position:fixed!important;<br />
left: 0%!important;<br />
}<br />
<br />
body {<br />
background-image:url(https://static.igem.org/mediawiki/2014/8/82/Aachen_14-10-13_Wiki_background_blue_cell_iNB.png) !important;<br />
background-size: cover !important;<br />
background-attachment: fixed !important;<br />
position: absolute;<br />
top: 0;<br />
bottom: 0;<br />
left: 0;<br />
right: 0;<br />
width: 100%;<br />
height: 100%;<br />
font-family:'Arial';<br />
}<br />
<br />
<br />
.topbgcolor {<br />
background: #66B5FF!important;<br />
background-color: #66B5FF!important;<br />
}<br />
<br />
.fullWidth {<br />
width: 1100px;<br />
background-color: #8ebae5;<br />
}<br />
<br />
.contentWidth {<br />
width: 1100px;<br />
}<br />
<br />
.lastrow {<br />
width: 160px;<br />
}<br />
<br />
<br />
td.menu { color:#8ebae5; background-color:#0069b3; width:126px; }<br />
td.menu:hover { color:#ff0; background-color:#8ebae5; }<br />
<br />
td.menu a {<br />
display: inherit;<br />
width: 125px;<br />
height: 50px;<br />
text-align:center; <br />
vertical-align:middle;<br />
font-weight: bold;<br />
text-decoration:none;<br />
color:#FFFFFF;<br />
}<br />
<br />
a.menu, a.menu:hover, a.menu:visited, a.menu:link, a.menu:active<br />
{<br />
text-decoration: none;<br />
color:#FFFFFF;<br />
}<br />
<br />
td.topbt { color:#000000; background-color:#A1DBB2; opacity: 0.6 }<br />
td.topbt:hover { color:#506d59; background-color:#A1DBB2; opacity: 0.3}<br />
<br />
td.topbt a {<br />
display: inherit;<br />
width: 1100px;<br />
height: 20px;<br />
text-align:center; <br />
vertical-align:middle;<br />
font-weight: bold;<br />
text-decoration:none;<br />
background-color: #A1DBB2;<br />
color:#808080;<br />
font-family:'Arial';<br />
font-size:200%;}<br />
<br />
tr.topbt {<br />
display: block;<br />
width: 100%;<br />
height: 55px;<br />
text-align:center; <br />
vertical-align:middle;<br />
font-weight: bold;<br />
text-decoration:none;<br />
}<br />
<br />
a.topbt , a.topbt:hover, a.topbt:visited, a.topbt:link, a.topbt:active<br />
{<br />
text-decoration: none;<br />
color:#506d59;<br />
}<br />
<br />
table {<br />
border-color:rgba(255,255,255,0.5);<br />
}<br />
<br />
.contentcell {<br />
background-color: rgba(255,255,255,1.0);<br />
height: 200px;<br />
}<br />
<br />
p, p ul li, p ol li, td ul li, td ol li {<br />
text-align:justify;<br />
font-size:14px;<br />
margin-left: 40px;<br />
margin-right: 40px;<br />
margin-top: 15px;<br />
}<br />
<br />
backuptdul {<br />
text-align:justify;<br />
font-size:14px;<br />
margin-left: 8px;<br />
margin-right: 8px;<br />
line-height: 1.5em;<br />
}<br />
<br />
.contentcell {<br />
<br />
-moz-box-shadow: 0 0 10px #000;<br />
-webkit-box-shadow: 0 0 10px #000;<br />
box-shadow: 0 0 10px #000;<br />
<br />
}<br />
<br />
<br />
.transbg { color:#000000!important; background-color:rgba(0,0,0,0)!important; margin-top:15px;margin-bottom:15px;}<br />
.highmenu{ color:#000000!important; background-color:rgba(0,0,0,0)!important; }<br />
.lowmenu{ color:#000000!important; background-color:rgba(142,186,229,0.9)!important; }<br />
<br />
<br />
.block1 { color:#FFFFFF!important; background-color:#0069b3!important; }<br />
.block2 { color:#FFFFFF!important; background-color:#8ebae5!important; }<br />
.block3 { color:#FFFFFF!important; background-color:#FEE5AD!important; }<br />
<br />
.centerfloat {<br />
margin-left:auto; <br />
margin-right:auto;<br />
}<br />
<br />
.imgshadow {<br />
-moz-box-shadow: 10px 10px 5px #555;<br />
-webkit-box-shadow: 10px 10px 5px #555;<br />
box-shadow: 10px 10px 5px #555;<br />
<br />
margin-bottom:25px;<br />
margin-right:25px;<br />
margin-left:25px;<br />
}<br />
.shadow<br />
{<br />
display:block;<br />
position:relative;<br />
}<br />
<br />
.shadow:before<br />
{<br />
display:block;<br />
content:'';<br />
position:absolute;<br />
width:100%;<br />
height:100%;<br />
box-shadow: inset 15px 15px 7px rgba(0, 0, 0, 0.3);<br />
-moz-box-shadow: 15px 15px 7px rgba(0, 0, 0, 0.3);<br />
-webkit-box-shadow: 15px 15px 7px rgba(0, 0, 0, 0.3);<br />
}<br />
<br />
h1, h2, h3, h4, h5, h6 {<br />
color: black;<br />
background: none;<br />
font-weight: normal;<br />
padding-top: .5em;<br />
padding-bottom: .3em;<br />
border-bottom: 7px solid #0069b3;<br />
text-align: left;<br />
margin-left: 40px;<br />
margin-right: 40px;<br />
margin-top: 1.5em;<br />
}<br />
<br />
h1 { font-size: 188%; }<br />
h2 { font-size: 150%; }<br />
h3, h4, h5, h6 {<br />
border-bottom: none;<br />
font-weight: bold;<br />
}<br />
h3 { font-size: 132%; }<br />
h4 { font-size: 116%; }<br />
h5 { font-size: 100%; }<br />
h6 { font-size: 80%; }<br />
<br />
.editsection {<br />
float: right;<br />
margin-left: 5px;<br />
margin-right: -5px;<br />
font-size: 9pt;<br />
color: transparent;<br />
}<br />
<br />
<br />
<br />
</style><br />
<br />
<link href="https://2014.igem.org/Template:Team:Aachen/Scripts/jquery.skitter.styles?action=raw&ctype=text/css" type="text/css" media="all" rel="stylesheet" /> <br />
<script type="text/javascript" src="https://2014.igem.org/Template:Team:Aachen/Scripts/jquery-1.6.3.min?action=raw&ctype=text/javascript"></script><br />
<script type="text/javascript" src="https://2014.igem.org/Template:Team:Aachen/Scripts/jquery.easing.1.3?action=raw&ctype=text/javascript"></script><br />
<script type="text/javascript" src="https://2014.igem.org/Template:Team:Aachen/Scripts/jquery.skitter.min?action=raw&ctype=text/javascript"></script><br />
<br />
<!-- MathJax (LaTeX for the web) --><br />
<!-- This part is only if you want to use $...$ delimiters --><br />
<script type="text/x-mathjax-config"><br />
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});<br />
</script><br />
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><br />
<br />
<div class="navDiv" style="top:14px; position:fixed; z-index: 1; border-bottom-style: solid; border-bottom-width: 3px; border-bottom-color: #bf1521;"><br />
<nav style="width: 1250px;"><br />
<!-- style="border-bottom-style: solid; border-bottom-width: 10px; border-bottom-color: #bf1521;" --><br />
<ul align="left" style=""><br />
<li style="padding: 0 0!important;"><a href="https://2014.igem.org/Team:Aachen" style="padding: 0 0!important;"> <img src="https://static.igem.org/mediawiki/2014/thumb/6/68/Aachen_Team_Logo_01.png/150px-Aachen_Team_Logo_01.png" height="50px"></a><br />
<ul><br />
<li style="width:123px"><a href="https://2014.igem.org/Team:Aachen/Help">Help</a></li><br />
</ul><br />
</li><br />
<li style="width:129px"><a href="https://2014.igem.org/Team:Aachen/Project">Project</a><br />
<ul style="width:345px"><br />
<li><a href="https://2014.igem.org/Team:Aachen/Project/2D_Biosensor">2D Biosensor</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Project/FRET_Reporter">The REACh Construct</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Project/Model">Modeling</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Project/Measurement_Device"><i>WatsOn</i></a></li><br />
<li style="border-bottom:2px solid; border-bottom-color: white;"><a href="https://2014.igem.org/Team:Aachen/Project/Gal3">Galectin-3</a></li><br />
<li style="border-bottom:2px solid; border-bottom-color: white;"><a href="https://2014.igem.org/Team:Aachen/OD/F device">OD/F Device</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Parts">Parts</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Achievements">Achievements</a></li><br />
<br />
</ul><br />
</li><br />
<li style="width:216px"><a href="https://2014.igem.org/Team:Aachen/Interlab_Study">Interlab Study</a><br />
<br />
<li style="width:250px"><a href="https://2014.igem.org/Team:Aachen/PolicyPractices">Policy & Practices</a><br />
<ul><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Kaiser-Karls-Gymnasium">Kaiser-Karls-Gymnasium</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Neanderlab">NEAnderLab</a></li><br />
<li style="border-bottom:2px solid; border-bottom-color: white;"><a href="https://2014.igem.org/Team:Aachen/Collaborations/MakerFaire">MakerFaire</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Safety">Safety</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/PolicyPractices/Economics">Economical View</a></li> <br />
<li style="border-bottom:2px solid; border-bottom-color: white;"><a href="https://2014.igem.org/Team:Aachen/PolicyPractices/BioBrickIntellectualProperty">BBa Intellectual Property</a></li><br />
<br />
<li><a href="https://2014.igem.org/Team:Aachen/Blog">Blog</a></li><br />
<br />
</ul><br />
</li><br />
</li><br />
<br />
<br />
<li style="width:215px"><a href="https://2014.igem.org/Team:Aachen/Collaborations">Collaborations</a><br />
<ul style="width:215px"><br />
<li><a href="https://2014.igem.org/Team:Aachen/Meetup">Aachen Meetup</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Bielefeld">Bielefeld</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Methane_Sensor">Braunschweig</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Freiburg">Freiburg</a></li><br />
<br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Heidelberg">Heidelberg</a></li> <br />
</ul><br />
</li><br />
<br />
<li style="width:157px"><a href="https://2014.igem.org/Team:Aachen/Notebook">Notebook</a><br />
<ul style="width:157px"><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Wetlab">Wetlab</a></li><br />
<br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Protocols">Protocols</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Engineering">Engineering</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Software">Software</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/LabEquipment">Equipment</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Index">Abbreviations</a></li><br />
</ul><br />
</li><br />
<br />
<li style="width:109px"><a href="https://2014.igem.org/Team:Aachen/Attributions">Team</a><br />
<ul style="width:142px"><br />
<li><a href="https://2014.igem.org/Team:Aachen/Attributions#members">Members</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Attributions#instructors">Instructors</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Attributions#partners">Partners</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Attributions#support">Support</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/SecretHappenings"><i>Mr Holmes</i></a></li><br />
</ul><br />
</li><br />
<li style="padding: 0 0!important;"><a href="https://igem.org/Main_Page" style="padding: 0 0!important;"> <img src="https://static.igem.org/mediawiki/2014/thumb/5/58/IGEM_basic_logo_white.png/100px-IGEM_basic_logo_white.png" height="50px"></a></li><br />
</ul><br />
</nav><br />
</div><br />
<br />
<!-- end of menu --><br />
<br />
<br />
<div class="loadBG"></div><br />
<style><br />
#contentSub, #footer-box, #catlinks, #search-controls, #p-logo, .printfooter, .firstHeading,.visualClear {display: none;} /*-- hides default wiki settings --*/<br />
</style><br />
<!--0px; margin-top: 125px; --><br />
<div id="contentdiv" style="margin-left: auto; margin-right: auto; width: 100%; position: absolute; bottom: 15px; top: 60px;"><br />
<br />
<!-- here ends the section that changes the default wiki template to a white full width background --><br />
<br />
<!--====================================================================--><br />
<!--====================================================================--><br />
<!--==================== 1ST BLOCK STARTS ==============================--><br />
<table class="transbg" width="100%" cellspacing="0"> <!-- style="padding-top: 80px" --><br />
<!--<tr><td height="80px"><td/></tr>--><br />
<tr><br />
<td style="min-width: 150px;"></td><br />
<td class="contentWidth" align="center"><br />
<br />
<table class="transbg" width="100%" cellspacing="0"><br />
<tr><br />
<td class="contentcell" width="95%" align="justify"> <br />
<!--====================================================================--><br />
<!--====================================================================--><br />
<!--==================== TEXT STARTS HERE ==============================--><br />
</html></div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:42:36Z<p>Mjoppich: /* +++Newsticker from Wikifreezenight+++ */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr. Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this website exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.JPG]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg|900px]]</span><br />
<br />
== '''+++Newsticker from Wikifreezenight+++''' ==<br />
* Congratuatlions - you deleted everything.<br />
* Fail!<br />
* That looks interesting o.O<br />
* One page does not take the newest editing: who created a second header file?!<br />
* Why is there a link to www.example.com on our landing page??<br />
* Nina: I just broke our landing page :(<br />
* *coffee smell in the air* - did someone just fetch coffee without fetching me one?? - *evil face*<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:41:38Z<p>Mjoppich: /* Mr. Holmes Secret Logbook */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr. Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this website exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.JPG]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg|900px]]</span><br />
<br />
== '''+++Newsticker from Wikifreezenight+++''' ==<br />
* Congratuatlions - you deleted everything.<br />
* Fail!<br />
* That looks interesting o.O<br />
* One page does not take the newest editing: who created a second header file?!<br />
* Why is there a link to www.example.com on our landing page??<br />
* Nina: I just broke our landing page :(<br />
* *coffee smell in the air* - did someone just fetch coffee without asking me? - *evil face*<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:32:20Z<p>Mjoppich: /* Mr Holmes Secret Logbook */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.JPG]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg|900px]]</span><br />
<br />
+++Newsticker from Wikifreezenight+++<br />
* Congratuatlions - you deleted everything.<br />
* Fail!<br />
* That looks interesting o.O<br />
* One page does not take the newest editing: who created a second header file?!<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:30:03Z<p>Mjoppich: /* Mr Holmes Secret Logbook */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.JPG]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg|900px]]</span><br />
<br />
+++Newsticker from Wikifreezenight+++<br />
* Congratuatlions - you deleted everything.<br />
* Fail!<br />
* That looks interesting o.O<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:04:19Z<p>Mjoppich: </p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.JPG]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg|900px]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:AachenTeam:Aachen2014-10-17T23:03:19Z<p>Mjoppich: </p>
<hr />
<div>[http://www.example.com link title]__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/HeaderFront}}<br />
<br />
<!-- [[File:Aachen_Cellock_rand.png|left|250px]] --><br />
<center><br />
<span style="font-size:300%;">Cellock Holmes - A Case of Identity</span><br/><br/><br />
'''Welcome to the Aachen 2014 iGEM Wiki!''' <br />
</center><br />
<br />
<html><br />
<ul class="team-grid" style="width:840px;margin-right:22px;float:right"><br />
<br />
<li style="width:230px;margin-left: 20px;margin-right: 10px;margin-bottom: 30px;margin-top: 0px;"><br />
<a href="https://2014.igem.org/Team:Aachen/Project" style="color:black"><br />
<div class="team-item team-info" style="width:224px;height:224px;" ><br />
<div class="menukachel">Project</div><br />
<!-- <br/><br/><br />
<b>Principle of Operation</br><br />
<br/><br/><br />
click for more information --><br />
</div><br />
<div class="team-item team-img" style="background: url(https://static.igem.org/mediawiki/2014/5/55/Aachen_14-10-16_Project_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%;width:224px;height:224px;"> </div></a><br />
</li><br />
<br />
<li style="width:230px;margin-left: 20px;margin-right: 10px;margin-bottom: 30px;margin-top: 0px;"><br />
<a href="https://2014.igem.org/Team:Aachen/Interlab_Study" style="color:black"><br />
<div class="team-item team-info" style="width:224px;height:224px;" ><br />
<div class="menukachel">Interlab Study</div><br />
<!-- <br/><br/><br />
<b>Principle of Operation</br><br />
<br/><br/><br />
click for more information --><br />
</div><br />
<div class="team-item team-img" style="background: url(https://static.igem.org/mediawiki/2014/3/39/Aachen_Interlab_Cellocks.png); norepeat scroll 0% 0% transparent; background-size:100%;width:224px;height:224px;"> </div></a><br />
</li><br />
<br />
<li style="width:230px;margin-left: 20px;margin-right: 10px;margin-bottom: 30px;margin-top: 0px;"><br />
<a href="https://2014.igem.org/Team:Aachen/PolicyPractices" style="color:black"><br />
<div class="team-item team-info" style="width:224px;height:224px;" ><br />
<div class="menukachel">Policy & Practices</div><br />
<!-- <br/><br/><br />
<b>Principle of Operation</br><br />
<br/><br/><br />
click for more information --><br />
</div><br />
<div class="team-item team-img" style="background: url(https://static.igem.org/mediawiki/2014/b/b7/Aachen_14-10-16_PolicyPractices_main_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%;width:224px;height:224px;"> </div></a><br />
</li><br />
<br />
<li style="width:230px;margin-left: 20px;margin-right: 10px;margin-bottom: 30px;margin-top: 0px;"><br />
<a href="https://2014.igem.org/Team:Aachen/Collaborations" style="color:black"><br />
<div class="team-item team-info" style="width:224px;height:224px;" ><br />
<div class="menukachel">Collaborations</div><br />
<!-- <br/><br/><br />
<b>Principle of Operation</br><br />
<br/><br/><br />
click for more information --><br />
</div><br />
<div class="team-item team-img" style="background: url(https://static.igem.org/mediawiki/2014/8/81/Aachen_14-10-15_Collaborating_Cellocks_iNB.png); norepeat scroll 0% 0% transparent; background-size:100%;width:224px;height:224px;"> </div></a><br />
</li><br />
<br />
<li style="width:230px;margin-left: 20px;margin-right: 10px;margin-bottom: 30px;margin-top: 0px;"><br />
<a href="https://2014.igem.org/Team:Aachen/Notebook" style="color:black"><br />
<div class="team-item team-info" style="width:224px;height:224px;" ><br />
<div class="menukachel">Notebook</div><br />
<!-- <br/><br/><br />
<b>Principle of Operation</br><br />
<br/><br/><br />
click for more information --><br />
</div><br />
<div class="team-item team-img" style="background: url(https://static.igem.org/mediawiki/2014/4/42/Aachen_14-10-14_NotebookiFG.png); norepeat scroll 0% 0% transparent; background-size:100%;width:224px;height:224px;"> </div></a><br />
</li><br />
<br />
<li style="width:230px;margin-left: 20px;margin-right: 10px;margin-bottom: 30px;margin-top: 0px;"><br />
<a href="https://2014.igem.org/Team:Aachen/Attributions" style="color:black"><br />
<div class="team-item team-info" style="width:224px;height:224px;" ><br />
<div class="menukachel">Team</div><br />
<!-- <br/><br/><br />
<b>Principle of Operation</br><br />
<br/><br/><br />
click for more information --><br />
</div><br />
<div class="team-item team-img" style="background: url(https://static.igem.org/mediawiki/2014/c/cf/Aachen_main_Team.png); norepeat scroll 0% 0% transparent; background-size:100%;width:224px;height:224px;"> </div></a><br />
</li><br />
</ul><br />
</html><br />
<br />
<br />
Current techniques for pathogen detection have many disadvantages as they require expensive equipment, trained personnel or labourious routines. <br />
<br />
To overcome the drawbacks of these techniques, the iGEM team Aachen 2014 developed a novel biosensor system called ''Cellock Holmes'' that is rapid, inexpensive and mobile. <br />
<br />
Our project represents a unique way of combining Open Source biology, software and hardware.<br />
<br />
<!-- As a proof-of concept for''Cellock Holmes'', we successfully detected the pathogen ''Pseudomonas aeruginosa''. Through the use of our special genetic construct we could significantly enhance the detection speed as compared to a traditional biosensor.<br />
<br />
All design choices were made in accordance to the "Open Source" principle, resulting a fast, mobile and inexpensive biosensor. Our technology is an ideal fit for low-budget institutions such as schools and community labs as well as the biohacking scene.--><br />
<br />
{{Team:Aachen/BlockSeparatorFront}}<br />
<br />
<center><br />
<html><br />
<a href="https://2014.igem.org/Team:Aachen/Team"><img src="https://static.igem.org/mediawiki/2014/d/d2/Aachen_Team_Aachen_Teamfoto_small.jpg" width="1012px" style="border: 3px solid #0069B3; border-radius: 20px; "></a><br />
</html><br />
</center><br />
<br />
{|cellpadding="12"<br />
|[[File:Logo_Buergerstiftung-Aachen_hoch.jpg|80px|center|link=http://www.buergerstiftung-aachen.de|Bürgerstiftung Aachen]]<br />
|[[File:Aachen_Niersverband_Firmenlogo.jpg|159px|link=http://www.niersverband.de/|Niersverband]]<br />
|[[File:Aachen_Genscript_Logo.png|120px|link=http://www.genscript.com/|Genscript]]<br />
|[[File:Aachen_Eurofinsgenomics.png|97px|link=http://www.eurofinsgenomics.eu/|Eurofins Genomics]]<br />
|[[File:Aachen_Labomedic_Logo.jpg|128px|link=http://www.labomedic.de/|Labomedic]]<br />
|}<br />
<br />
{|cellpadding="18"<br />
|[[File:Aachen_bmbf.jpg|163px|link=http://www.bmbf.de/de/24140.php|BMBF]]<br />
|[[File:Aachen_idt_.png|109px|link=http://www.idt-biologika.de/|IDT]]<br />
|[[File:M2p_labs_logo.jpg|52px|link=http://www.m2p-labs.com/|m2p labs]]<br />
|[[File:Aachen_Roth_Logo.png|55px|link=http://www.carlroth.com/pages/index/COM/index.jsp?market=COM&lang=en-com|Carl Roth]]<br />
|[[File:Aachen_ProRWTH_logo.png|62px|link=http://www.prorwth.de/|pro RWTH]]<br />
|}<br />
{|cellpadding="13"<br />
|[[File:Aachen_Logo_iAMB.png|115px|link=http://www.iamb.rwth-aachen.de|Institute of Applied Microbiology - iAMB]]<br />
|[[File:Aachen_Logo_bio7.png|115px|link=http://www.molbiotech.rwth-aachen.de|Institute for Molecular Biotechnology]]<br />
|[[File:Aachen_Logo_HISynBio.png|123px|link=http://www.helmholtz.de/en/about_us/initiating_and_networking/assuring_excellence/synthetic_biology|Helmholtz Association - Initiative on Synthetic Biology]]<br />
|[[File:Aachen_Logo_ABBt.png|105px|link=http://www.biologie.rwth-aachen.de|Aachen Biology and Biotechnology - ABBt]]<br />
|[[File:Aachen_juelich.png|120px|link=http://www.fz-juelich.de/|Forschungszentrum Jülich]]<br />
|[[File:Aachen_FabLabAachenLogo.jpg|105px|link=http://hci.rwth-aachen.de/fablab|Fab Lab Aachen]]<br />
|[[File:Aachen_Schwaneberg_Group.png|75px|link=http://www.biotec.rwth-aachen.de|Schwaneberg Group]]<br />
|}<br />
<div><br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:01:58Z<p>Mjoppich: /* Mr Holmes Secret Logbook */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.jpg]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg|900px]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T23:01:32Z<p>Mjoppich: </p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.jpg]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_Team_Aachen_Teamfoto_small.jpg]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/File:Aachen_Team_Aachen_Teamfoto_small.jpgFile:Aachen Team Aachen Teamfoto small.jpg2014-10-17T23:01:12Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T22:58:36Z<p>Mjoppich: </p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-align: center;<br />
}<br />
<br />
.secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.jpg]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_si_10.jpg]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T22:58:09Z<p>Mjoppich: </p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
<br />
.secretimg {<br />
display: block;<br />
text-algin: center;<br />
}<br />
<br />
secretimg img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.jpg]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_si_10.jpg]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T22:57:20Z<p>Mjoppich: </p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
secretimg {<br />
display: block;<br />
text-algin: center;<br />
}<br />
<br />
secretimg.p.img {<br />
border: 3px solid #0069B3;<br />
border-radius: 20px;<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.jpg]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_si_10.jpg]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T22:56:21Z<p>Mjoppich: </p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
.secretimg {<br />
<br />
display: block;<br />
text-algin: center;<br />
<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.jpg]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_si_10.jpg]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T22:55:55Z<p>Mjoppich: </p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
img.secretimg {<br />
<br />
display: block;<br />
text-algin: center;<br />
<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.jpg]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_si_10.jpg]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T22:54:44Z<p>Mjoppich: </p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
img.secretimg {<br />
<br />
display: block;<br />
margin-left: auto;<br />
margin-right: auto<br />
<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.jpg]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_si_10.jpg]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T22:54:19Z<p>Mjoppich: /* Mr Holmes Secret Logbook */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
.img {<br />
<br />
display: block;<br />
margin-left: auto;<br />
margin-right: auto<br />
<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
<span class="secretimg">[[File:Aachen_si_1.jpg]]</span><br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
<span class="secretimg">[[File:Aachen_si_2.jpg]]</span><br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
<span class="secretimg">[[File:Aachen_si_3.jpg]]</span><br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
<span class="secretimg">[[File:Aachen_si_4.jpg]]</span><br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
<span class="secretimg">[[File:Aachen_si_5.jpg]]</span><br />
<br />
or software<br />
<br />
<span class="secretimg">[[File:Aachen_si_6.jpg]]</span><br />
<br />
At times we really wanted to kill each other,<br />
<br />
<span class="secretimg">[[File:Aachen_si_7.jpg]]</span><br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
<span class="secretimg">[[File:Aachen_si_8.jpg]]</span><br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
<span class="secretimg">[[File:Aachen_si_9.jpg]]</span><br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
<span class="secretimg">[[File:Aachen_si_10.jpg]]</span><br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/File:Aachen_si_9.jpgFile:Aachen si 9.jpg2014-10-17T22:52:33Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T22:51:58Z<p>Mjoppich: </p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
<html><br />
<style type="text/css"><br />
.img {<br />
<br />
display: block;<br />
margin-left: auto;<br />
margin-right: auto<br />
<br />
}<br />
</style><br />
</html><br />
= ''Mr Holmes Secret Logbook'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
[[File:Aachen_si_1.jpg]]<br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
[[File:Aachen_si_2.jpg]]<br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
[[File:Aachen_si_3.jpg]]<br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
[[File:Aachen_si_4.jpg]]<br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
[[File:Aachen_si_5.jpg]]<br />
<br />
or software<br />
<br />
[[File:Aachen_si_6.jpg]]<br />
<br />
At times we really wanted to kill each other,<br />
<br />
[[File:Aachen_si_7.jpg]]<br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
[[File:Aachen_si_8.jpg]]<br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
[[File:Aachen_si_9.jpg]]<br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
[[File:Aachen_si_10.jpg]]<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/Template:Team:Aachen/HeaderTemplate:Team:Aachen/Header2014-10-17T22:50:48Z<p>Mjoppich: </p>
<hr />
<div>{{CSS/Main}}<br />
<html><br />
<style><br />
#contentSub, #footer-box, #catlinks, #search-controls, #p-logo, .printfooter, .firstHeading,.visualClear {display: none;}, table/*-- hides default wiki settings --*/<br />
</style><br />
<br />
<style type="text/css"><br />
<br />
.codediv {<br />
text-align: left;<br />
margin: 0 40px 0 40px;<br />
}<br />
<br />
.menukachel {<br />
top: 35%;<br />
position: relative;<br />
font-size: 22px;<br />
font-weight:bold;<br />
text-decoration: none;<br />
text-align: center;<br />
}<br />
<br />
.menulink {<br />
text-decoration: none;<br />
}<br />
.menulink:hover {<br />
text-decoration: none;<br />
}<br />
.menulink:visited {<br />
text-decoration: none;<br />
}<br />
<br />
table.wikitable.centered {<br />
margin: 40px 40px 40px 40px;<br />
}<br />
<br />
table.wikitable {<br />
padding: 0.5em;<br />
border: 2px #808080 solid;<br />
background: white !important;<br />
margin-left: 40px;<br />
margin-right: 40px;<br />
}<br />
table.wikitable th {<br />
border: 2px #808080 solid;<br />
padding: 0.5em;<br />
background: #cfe2f4 !important;<br />
text-align: left;<br />
}<br />
table.wikitable td{<br />
border-right: 2px solid #808080;<br />
border-left: 2px solid #808080;<br />
border-top: 0px;<br />
border-bottom: 0px;<br />
padding: 0.5em;<br />
<br />
}<br />
<br />
/*<br />
MENU<br />
*/<br />
.navDiv {<br />
width: 100%;<br />
background: #0069b3;<br />
box-shadow: 0px 0px 9px rgba(0,0,0,0.15);<br />
}<br />
<br />
span.anchor {display: block; position: relative; top: -140px; visibility: hidden;}<br />
<br />
nav ul li a {<br />
font-size: 20px;<br />
}<br />
<br />
nav ul li ul li a {<br />
font-size: 16px;<br />
}<br />
<br />
nav {<br />
margin: auto auto; <br />
text-align: center;<br />
background: #0069b3; <br />
font-weight: bold;<br />
font-size: 16px;<br />
text-align: center;<br />
<br />
}<br />
<br />
nav ul ul {<br />
display: none;<br />
}<br />
<br />
nav ul li:hover > ul {<br />
display: block;<br />
}<br />
<br />
<br />
nav ul {<br />
background: #0069b3; <br />
padding: 0 0px;<br />
border-radius: 0px; <br />
list-style: none;<br />
position: relative;<br />
margin: 0 0 0 0!important;<br />
display: inline-table;<br />
margin-bottom: 0!important;<br />
<br />
}<br />
nav ul:after {<br />
content: ""; clear: both; display: block;<br />
}<br />
<br />
nav ul li {<br />
float: left;<br />
margin-bottom: 0!important;<br />
height:50px;<br />
}<br />
nav ul li:hover {<br />
background: #8ebae5;<br />
}<br />
nav ul li:hover a {<br />
color: #fff;<br />
}<br />
<br />
nav ul li a {<br />
display: block; padding: 14px 20px;<br />
color: #ffffff;<br />
text-decoration: none!important;<br />
height: 25px;<br />
}<br />
<br />
nav ul li a:visited {<br />
display: block; padding: 14px 20px;<br />
color: #ffffff;<br />
text-decoration: none!important;<br />
<br />
}<br />
<br />
<br />
nav ul ul {<br />
background: #8ebae5; border-radius: 0px; padding: 0;<br />
position: absolute; top: 100%;<br />
}<br />
nav ul ul li {<br />
float: none; <br />
position: relative;<br />
text-align: left;<br />
<br />
}<br />
nav ul ul li a {<br />
padding: 0px 20px;<br />
color: #fff;<br />
} <br />
nav ul ul li a:hover {<br />
background: #0069b3;<br />
}<br />
<br />
nav ul ul ul {<br />
position: absolute; left: 100%; top:0;<br />
}<br />
<br />
nav ul li ul li {<br />
height:25px;<br />
}<br />
nav ul li ul li:hover {<br />
height:25px;<br />
}<br />
<br />
<br />
/*<br />
WEBSITE<br />
*/<br />
<br />
* {<br />
font-family: Verdana, Geneva, sans-serif !important;/* <-- fonts */<br />
}<br />
<br />
#top-section {<br />
margin-left: auto!important;<br />
margin-right: auto!important;<br />
width: 100%!important;<br />
position:fixed!important;<br />
left: 0%!important;<br />
}<br />
<br />
body {<br />
background-image:url(https://static.igem.org/mediawiki/2014/8/82/Aachen_14-10-13_Wiki_background_blue_cell_iNB.png) !important;<br />
background-size: cover !important;<br />
background-attachment: fixed !important;<br />
position: absolute;<br />
top: 0;<br />
bottom: 0;<br />
left: 0;<br />
right: 0;<br />
width: 100%;<br />
height: 100%;<br />
font-family:'Arial';<br />
}<br />
<br />
<br />
.topbgcolor {<br />
background: #66B5FF!important;<br />
background-color: #66B5FF!important;<br />
}<br />
<br />
.fullWidth {<br />
width: 1100px;<br />
background-color: #8ebae5;<br />
}<br />
<br />
.contentWidth {<br />
width: 1100px;<br />
}<br />
<br />
.lastrow {<br />
width: 160px;<br />
}<br />
<br />
<br />
td.menu { color:#8ebae5; background-color:#0069b3; width:126px; }<br />
td.menu:hover { color:#ff0; background-color:#8ebae5; }<br />
<br />
td.menu a {<br />
display: inherit;<br />
width: 125px;<br />
height: 50px;<br />
text-align:center; <br />
vertical-align:middle;<br />
font-weight: bold;<br />
text-decoration:none;<br />
color:#FFFFFF;<br />
}<br />
<br />
a.menu, a.menu:hover, a.menu:visited, a.menu:link, a.menu:active<br />
{<br />
text-decoration: none;<br />
color:#FFFFFF;<br />
}<br />
<br />
td.topbt { color:#000000; background-color:#A1DBB2; opacity: 0.6 }<br />
td.topbt:hover { color:#506d59; background-color:#A1DBB2; opacity: 0.3}<br />
<br />
td.topbt a {<br />
display: inherit;<br />
width: 1100px;<br />
height: 20px;<br />
text-align:center; <br />
vertical-align:middle;<br />
font-weight: bold;<br />
text-decoration:none;<br />
background-color: #A1DBB2;<br />
color:#808080;<br />
font-family:'Arial';<br />
font-size:200%;}<br />
<br />
tr.topbt {<br />
display: block;<br />
width: 100%;<br />
height: 55px;<br />
text-align:center; <br />
vertical-align:middle;<br />
font-weight: bold;<br />
text-decoration:none;<br />
}<br />
<br />
a.topbt , a.topbt:hover, a.topbt:visited, a.topbt:link, a.topbt:active<br />
{<br />
text-decoration: none;<br />
color:#506d59;<br />
}<br />
<br />
table {<br />
border-color:rgba(255,255,255,0.5);<br />
}<br />
<br />
.contentcell {<br />
background-color: rgba(255,255,255,1.0);<br />
height: 200px;<br />
}<br />
<br />
p, p ul li, p ol li, td ul li, td ol li {<br />
text-align:justify;<br />
font-size:14px;<br />
margin-left: 40px;<br />
margin-right: 40px;<br />
margin-top: 15px;<br />
}<br />
<br />
backuptdul {<br />
text-align:justify;<br />
font-size:14px;<br />
margin-left: 8px;<br />
margin-right: 8px;<br />
line-height: 1.5em;<br />
}<br />
<br />
.contentcell {<br />
<br />
-moz-box-shadow: 0 0 10px #000;<br />
-webkit-box-shadow: 0 0 10px #000;<br />
box-shadow: 0 0 10px #000;<br />
<br />
}<br />
<br />
<br />
.transbg { color:#000000!important; background-color:rgba(0,0,0,0)!important; margin-top:15px;margin-bottom:15px;}<br />
.highmenu{ color:#000000!important; background-color:rgba(0,0,0,0)!important; }<br />
.lowmenu{ color:#000000!important; background-color:rgba(142,186,229,0.9)!important; }<br />
<br />
<br />
.block1 { color:#FFFFFF!important; background-color:#0069b3!important; }<br />
.block2 { color:#FFFFFF!important; background-color:#8ebae5!important; }<br />
.block3 { color:#FFFFFF!important; background-color:#FEE5AD!important; }<br />
<br />
.centerfloat {<br />
margin-left:auto; <br />
margin-right:auto;<br />
}<br />
<br />
.imgshadow {<br />
-moz-box-shadow: 10px 10px 5px #555;<br />
-webkit-box-shadow: 10px 10px 5px #555;<br />
box-shadow: 10px 10px 5px #555;<br />
<br />
margin-bottom:25px;<br />
margin-right:25px;<br />
margin-left:25px;<br />
}<br />
.shadow<br />
{<br />
display:block;<br />
position:relative;<br />
}<br />
<br />
.shadow:before<br />
{<br />
display:block;<br />
content:'';<br />
position:absolute;<br />
width:100%;<br />
height:100%;<br />
box-shadow: inset 15px 15px 7px rgba(0, 0, 0, 0.3);<br />
-moz-box-shadow: 15px 15px 7px rgba(0, 0, 0, 0.3);<br />
-webkit-box-shadow: 15px 15px 7px rgba(0, 0, 0, 0.3);<br />
}<br />
<br />
h1, h2, h3, h4, h5, h6 {<br />
color: black;<br />
background: none;<br />
font-weight: normal;<br />
padding-top: .5em;<br />
padding-bottom: .3em;<br />
border-bottom: 7px solid #0069b3;<br />
text-align: left;<br />
margin-left: 40px;<br />
margin-right: 40px;<br />
margin-top: 1.5em;<br />
}<br />
<br />
h1 { font-size: 188%; }<br />
h2 { font-size: 150%; }<br />
h3, h4, h5, h6 {<br />
border-bottom: none;<br />
font-weight: bold;<br />
}<br />
h3 { font-size: 132%; }<br />
h4 { font-size: 116%; }<br />
h5 { font-size: 100%; }<br />
h6 { font-size: 80%; }<br />
<br />
.editsection {<br />
float: right;<br />
margin-left: 5px;<br />
margin-right: -5px;<br />
font-size: 9pt;<br />
color: transparent;<br />
}<br />
<br />
<br />
<br />
</style><br />
<br />
<link href="https://2014.igem.org/Template:Team:Aachen/Scripts/jquery.skitter.styles?action=raw&ctype=text/css" type="text/css" media="all" rel="stylesheet" /> <br />
<script type="text/javascript" src="https://2014.igem.org/Template:Team:Aachen/Scripts/jquery-1.6.3.min?action=raw&ctype=text/javascript"></script><br />
<script type="text/javascript" src="https://2014.igem.org/Template:Team:Aachen/Scripts/jquery.easing.1.3?action=raw&ctype=text/javascript"></script><br />
<script type="text/javascript" src="https://2014.igem.org/Template:Team:Aachen/Scripts/jquery.skitter.min?action=raw&ctype=text/javascript"></script><br />
<br />
<!-- MathJax (LaTeX for the web) --><br />
<!-- This part is only if you want to use $...$ delimiters --><br />
<script type="text/x-mathjax-config"><br />
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});<br />
</script><br />
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><br />
<br />
<div class="navDiv" style="top:14px; position:fixed; z-index: 1;"><br />
<nav style="width: 1250px;"><br />
<!-- style="border-bottom-style: solid; border-bottom-width: 10px; border-bottom-color: #bf1521;" --><br />
<ul align="left" style="border-bottom-style: solid; border-bottom-width: 3px; border-bottom-color: #bf1521;"><br />
<li style="padding: 0 0!important;"><a href="https://2014.igem.org/Team:Aachen" style="padding: 0 0!important;"> <img src="https://static.igem.org/mediawiki/2014/thumb/6/68/Aachen_Team_Logo_01.png/150px-Aachen_Team_Logo_01.png" height="50px"></a><br />
<ul><br />
<li style="width:123px"><a href="https://2014.igem.org/Team:Aachen/Help">Help</a></li><br />
</ul><br />
</li><br />
<li style="width:129px"><a href="https://2014.igem.org/Team:Aachen/Project">Project</a><br />
<ul style="width:345px"><br />
<li><a href="https://2014.igem.org/Team:Aachen/Project/2D_Biosensor">2D Biosensor</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Project/FRET_Reporter">The REACh Construct</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Project/Model">Modeling</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Project/Measurement_Device"><i>WatsOn</i></a></li><br />
<li style="border-bottom:2px solid; border-bottom-color: white;"><a href="https://2014.igem.org/Team:Aachen/Project/Gal3">Galectin-3</a></li><br />
<li style="border-bottom:2px solid; border-bottom-color: white;"><a href="https://2014.igem.org/Team:Aachen/OD/F device">OD/F Device</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Parts">Parts</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Achievements">Achievements</a></li><br />
<br />
</ul><br />
</li><br />
<li style="width:216px"><a href="https://2014.igem.org/Team:Aachen/Interlab_Study">Interlab Study</a><br />
<br />
<li style="width:250px"><a href="https://2014.igem.org/Team:Aachen/PolicyPractices">Policy & Practices</a><br />
<ul><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Kaiser-Karls-Gymnasium">Kaiser-Karls-Gymnasium</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Neanderlab">NEAnderLab</a></li><br />
<li style="border-bottom:2px solid; border-bottom-color: white;"><a href="https://2014.igem.org/Team:Aachen/Collaborations/MakerFaire">MakerFaire</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Safety">Safety</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/PolicyPractices/Economics">Economical View</a></li> <br />
<li style="border-bottom:2px solid; border-bottom-color: white;"><a href="https://2014.igem.org/Team:Aachen/PolicyPractices/BioBrickIntellectualProperty">BBa Intellectual Property</a></li><br />
<br />
<li><a href="https://2014.igem.org/Team:Aachen/Blog">Blog</a></li><br />
<br />
</ul><br />
</li><br />
</li><br />
<br />
<br />
<li style="width:215px"><a href="https://2014.igem.org/Team:Aachen/Collaborations">Collaborations</a><br />
<ul style="width:215px"><br />
<li><a href="https://2014.igem.org/Team:Aachen/Meetup">Aachen Meetup</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Bielefeld">Bielefeld</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Methane_Sensor">Braunschweig</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Freiburg">Freiburg</a></li><br />
<br />
<li><a href="https://2014.igem.org/Team:Aachen/Collaborations/Heidelberg">Heidelberg</a></li> <br />
</ul><br />
</li><br />
<br />
<li style="width:157px"><a href="https://2014.igem.org/Team:Aachen/Notebook">Notebook</a><br />
<ul style="width:157px"><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Wetlab">Wetlab</a></li><br />
<br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Protocols">Protocols</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Engineering">Engineering</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Software">Software</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/LabEquipment">Equipment</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Notebook/Index">Abbreviations</a></li><br />
</ul><br />
</li><br />
<br />
<li style="width:109px"><a href="https://2014.igem.org/Team:Aachen/Attributions">Team</a><br />
<ul style="width:142px"><br />
<li><a href="https://2014.igem.org/Team:Aachen/Attributions#members">Members</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Attributions#instructors">Instructors</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Attributions#partners">Partners</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/Attributions#support">Support</a></li><br />
<li><a href="https://2014.igem.org/Team:Aachen/SecretHappenings"><i>Mr Holmes</i></a></li><br />
</ul><br />
</li><br />
<li style="padding: 0 0!important;"><a href="https://igem.org/Main_Page" style="padding: 0 0!important;"> <img src="https://static.igem.org/mediawiki/2014/thumb/5/58/IGEM_basic_logo_white.png/100px-IGEM_basic_logo_white.png" height="50px"></a></li><br />
</ul><br />
</nav><br />
</div><br />
<br />
<!-- end of menu --><br />
<br />
<br />
<div class="loadBG"></div><br />
<style><br />
#contentSub, #footer-box, #catlinks, #search-controls, #p-logo, .printfooter, .firstHeading,.visualClear {display: none;} /*-- hides default wiki settings --*/<br />
</style><br />
<!--0px; margin-top: 125px; --><br />
<div id="contentdiv" style="margin-left: auto; margin-right: auto; width: 100%; position: absolute; bottom: 15px; top: 60px;"><br />
<br />
<!-- here ends the section that changes the default wiki template to a white full width background --><br />
<br />
<!--====================================================================--><br />
<!--====================================================================--><br />
<!--==================== 1ST BLOCK STARTS ==============================--><br />
<table class="transbg" width="100%" cellspacing="0"> <!-- style="padding-top: 80px" --><br />
<!--<tr><td height="80px"><td/></tr>--><br />
<tr><br />
<td></td><br />
<td class="contentWidth" align="center"><br />
<br />
<table class="transbg" width="100%" cellspacing="0"><br />
<tr><br />
<td class="contentcell" width="95%" align="justify"> <br />
<!--====================================================================--><br />
<!--====================================================================--><br />
<!--==================== TEXT STARTS HERE ==============================--><br />
</html></div>Mjoppichhttp://2014.igem.org/Team:Aachen/SecretHappeningsTeam:Aachen/SecretHappenings2014-10-17T22:49:51Z<p>Mjoppich: /* Secret Happenings */</p>
<hr />
<div>__NOTOC__<br />
{{CSS/Main}}<br />
{{Team:Aachen/Stylesheet}}<br />
{{Team:Aachen/Header}}<br />
= ''Secret Happenings'' =<br />
<br />
<span style="font-size: 22px">Please, please do not take this sub-page serious. It's probably everything - but not serious.</span><br />
<br />
In fact, most team members know that this websites exists. But it silently documents all the funny aspects of our project.<br />
<br />
{{Team:Aachen/BlockSeparator}}<br />
<br />
First, even we as team Aachen 2014 - we're actually the first team of our university - performed experiments that didn't end well.<br />
<br />
[[File:Aachen_si_1.jpg]]<br />
<br />
It's never a good sign if already the blank rather tries to escape than to stay.<br />
<br />
Especially with our own-minded experiments we had some rainy days in the lab<br />
<br />
[[File:Aachen_si_2.jpg]]<br />
<br />
but also some bright moments, where we could spread peace, love and happiness :)<br />
<br />
[[File:Aachen_si_3.jpg]]<br />
<br />
How many biologists does a computer scientist need to nail a camera?<br />
<br />
[[File:Aachen_si_4.jpg]]<br />
<br />
Exact. 3.<br />
<br />
But not only the biological experiments created a high level of frustration, but also the hardware<br />
<br />
[[File:Aachen_si_5.jpg]]<br />
<br />
or software<br />
<br />
[[File:Aachen_si_6.jpg]]<br />
<br />
At times we really wanted to kill each other,<br />
<br />
[[File:Aachen_si_7.jpg]]<br />
<br />
but we had those cool moment where stuff really worked out<br />
<br />
[[File:Aachen_si_8.jpg]]<br />
<br />
and just some other bright moments.<br />
<br />
Now at the day of wiki-freeze we're really tired ...<br />
<br />
[[File:Aachen_si_9.jpg]]<br />
<br />
... but really, overall we had a fun time with our igem and loved to stand together for our project<br />
<br />
[[File:Aachen_si_10.jpg]]<br />
<br />
{{Team:Aachen/Footer}}</div>Mjoppichhttp://2014.igem.org/File:Aachen_si_8.jpgFile:Aachen si 8.jpg2014-10-17T22:47:39Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/File:Aachen_si_7.jpgFile:Aachen si 7.jpg2014-10-17T22:47:23Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppichhttp://2014.igem.org/File:Aachen_si_6.jpgFile:Aachen si 6.jpg2014-10-17T22:47:00Z<p>Mjoppich: </p>
<hr />
<div></div>Mjoppich