This page contains information on operating the semiconductor laser set-up in H040.

General information

The set-up consists of a light-tight enclosure with a movable X-Y stage for the Device Under Test (DUT). The three lasers are small diode lasers with a wavelength of 660, 980 or 1060 nm and a maximum output power of about 1 mW. The output of the laser is guided via an optical fibre and focuser (spot size 9 um) to a movable Z-stage.

Laser Safety

All three lasers are class IIIb lasers which means that directly looking into the laser beam can lead to permanent damage of the retina. Quoting Wikipedia: A Class 3B laser is hazardous if the eye is exposed directly, but diffuse reflections such as from paper or other matte surfaces are not harmful. Continuous lasers in the wavelength range from 315 nm to far infrared are limited to 0.5 W. For pulsed lasers between 400 and 700 nm, the limit is 30 mW. Other limits apply to other wavelengths and to ultrashort pulsed lasers. Protective eyewear is typically required where direct viewing of a class 3B laser beam may occur. Class-3B lasers must be equipped with a key switch and a safety interlock.

Our set-up is protected with an interlock on the door of the enclosure which switches off the electrical signal (pulse) to the laser driver. Laser glasses are available in case you must work with the laser on while the door is open (bypassing the interlock). This is however only allowed after consulting a permanent staff member of the R&D group. Note that different laser safety glasses are needed for the different laser wavelengths: red light: 660 nm or infrared light: 980 and 1060 nm

List of Components

Movable stages

All 3 axes are controlled via the Micos SMC-Corvus motion controller. The Corvus has two different operating modes: manual and terminal, which both speak for themselves. For manual mode, the joystick needs to be attached on startup, and for terminal mode, the Corvus needs to be connected to a computer via the RS323 connection on the back. For this connection you need to know a few settings:

  • Baudrate: depends on the first two switches on the back (see manual Corvus_Manual_eng_2_3.pdf ), most likely it is a 115200 bits/s
  • Data bits: 8
  • Stop bits: 1
  • Parity: None
  • Flow control: None
The computer can send commands of the serial port via e.g. PuTTY or any other program that sends commands to the serial port of the computer. These commands must be sent in the command language for the Corvus called Venus. See below for a few useful commands. On Linux, the device is most likely /dev/ttyS0.

Useful Venus commands

Checking status of the Corvus

ge: returns any error that was encountered
gme: returns any machine error that was encountered
st: returns the status of the Corvus in a decimal number, for further explanation see manual

Calibrating the motion stages

cal: moves the axes to the furthest negative position until they reach their cal-switch, this now is 0, 0, 0
rm: moves the axes to the furthest positive position until they reach their rm-switch, this sets the range in which the stages can move

Moving the motion stages
NOTE: on startup the "brake" on the z-axis is active, to disable this brake use 1 1 setsout and to enable it again 0 1 setsout
NOTE: Ctrl+c in PuTTY will always stop the current move

delta_x delta_y delta_y r: moves the stages relative to the current position, e.g. 1000 0 -10 r (the unit is normally in um, one can check this with: -1 getunit)
x y z m: moves the stages to coordinate x, y, z

Further useful commands

0 j: disables manual mode
1 j: enables manual mode
-1 getswst: returns the state of the 6 switches (cal + rm switch per axis)
-1 getunit: returns the unit of each axis (nm, Ám, etc.)

Programs to take data and control the motion stage

On Anthias there is a folder with a bunch of python scripts to control the motion stage and collect data. These scripts are located in /home/ptr/Desktop/CorvusController/Scripts/*. Below, a list of scripts and their usage is given. To execute the scritps go to this directory and type: python3.6, where you replace with the name of the script you want to execute. Before using any of the scripts listed below, make sure that there is a configuration file for the sensor that is used in /home/ptr/Desktop/CorvusController/Configs/*. If there is not, copy the example.txt and rename it to chipID.txt (e.g. W0013_K05.txt). The table below lists the settings and there options that should be in the config file. Note that there should always be 1 whitespace between the : and the setting.

Option name Possible settings Explanation
Chip type Timepix3  
Collecting mode e / h e if the chip collects electrons and h if the chip collects holes
Connecting mode 10 / 100  
Pitch Any number The pitch of the sensor in um
Number of columns Any number  
Number of rows Any number  
40MHz clock internal / external  

Send commands to the Corvus
Like the name says, this command sends the commands that you type to the Corvus, much like PuTTY would do. It is named When the program is started it asks for a command, after pressing enter it sends it to the Corvus. Type "exit" to quit the program.

Showing measurement
A convenient python script is availible to show a measurement to visually determine the position and size of the laser spot. This program is called This program performs a measurement for 5 seconds, makes a root file from the dat file, and finally shows a hitmap as well as the average ToT for each pixel.

Moving centre-of-gravity of laser spot to a specific pixel
ATTENTION: make sure the laser spot is around 1 pixel is diameter (not too big, so not 10, but 5 is oke)

The program can be used by "python3.6". The arguments needed can be found using "python3.6 -h". It first performs a coarse move to desired pixel, not using the centre-of-gravity but only looking at the position of the hits. When this is finished the centre-of-gravity of the ToT will be aligned to the desired pixel.

Scan z-axis to find focus point of the laser
This program is called, and takes some arguments. These arguments can be found by typing "python3.6 -h". The folder is defined with respect to /localstore/TPX3/DATA/CHIP0/Test/. For each z-position it will determine the cluster size of the spot on the detector and plot this value. From this plot it can manually be determined at which z-position the focal point is

Aligning the laser spot with the pixel-matrix
To align the laser with the middle of each pixel of the pixel matrix, a python script is used. Before using this script, one must be sure that the spot size is < 1.5 pixel, otherwise the alignment will fail.
This script will find the middle of the pixels by finding the position within the pixel for which the ToT is the highest. It will do this for a scan that only changes the column and a scan that only changes the row. The script will print the distance in um that is needed to go up 1 row (delta_y change in row and delta_x_0 change in column position) and to move 1 column higher (delta_x change in column and delta_y_0 change in row position). It also returns the coordinates of pixel 0, 0 such that every pixel can be extrapolated. It can be used by calling "", while giving as an argument the number of points that will be scanned per line (minimum of 2).
It is also possible to find the middle of a single pixel. Use "" to align the laser with the centre of the current pixel.

Measuring the delay of the pixel-matrix
This script will move the motion stage in such a way that it will scan the complete pixel-matrix while in the mean time measuring. This script is called "", and requires 2 arguments to be passed along: the name of the folder in /localstore/TPX3/DATA/CHIP0/Test/ in which the measurement will be placed, and the number of columns you want to increment per vertical scan. Before starting this script, the alignment from above should be performed. The result of this should be copied in the python file as a list align = [ ], before running it. An example of the calling the script is "python3.6 scan1 0.3". After the program is finished, the raw data can be found in /localstore/TPX3/DATA/CHIP0/Test/*folder*/. To process this data into a root file, first go to the folder ("cd /localstore/TPX3/DATA/CHIP0/Test/*folder*/"), after this start ROOT ("root -l") and load the macro: ".L make_tree_folder.cpp++". Now run this macro: "make_tree_folder("/localstore/TPX3/DATA/CHIP0/Test/*folder*/")". The next step is to process the root file that was just created to find the delay per pixel. A macro is also written to do this, to use this macro, first go to /CorvusController/Analysis/. Now start ROOT and load the macro: ".L matrix_delay.cpp++". Now type "matrix_delay("/localstore/TPX3/DATA/CHIP0/Test/*folder*/", #name of new root file#.root)", here #name of new root file# should be replaced by the name you want to give the new ROOT file. This new ROOT file will be located in /CorvusController/Results/, and will contain things such as the average delay per pixel.

Measuring the fToA bin size for a single pixel
The pulse generator PG-1072 was during previous scans and thus the script relies on this generator being used.
First ensure that the pulse generator is connected to Anthias via a network cable. Check if p4p2 is configured correctly (IP should be: If not run (as root): ifup p4p2 and ifconfig p4p2 netmask

Now that the connection between the pulse generator and Anthias is established, the pulse generator can be controlled via the pc. Now ensure that the spot size that is achieved on the sensor is just 1 pixel, and that it is positioned on the correct pixel. The program can be started using "python3.6". The program takes three arguments that can be found using "python3.6 -h". It takes three arguments: start delay (ns), length of scan (ns), step size (ns). The output of the script is located in /CorvusController/Output/FToAScan.txt, this text file contains for each delay value the fraction of hits measured in each fToA bin

Utility programs

Per pixel timewalk calibration
Connect chip to SPIDR and apply desired bias
Make sure that Ikrum and threshold are set correctly (timewalk depends on them)
cd /localstore/TPX3/SPIDR/software/trunk/Release/
./TpTimewalk "Folder name"
After program is finished, move this folder to Sparida in /localstore/TPX3/DATA/CHIP0/TestPulse/
Go to /localstore/TPX3/user/robgeer/scripts/ and edit TpAnalyse vr.cpp and set the correct folder there
Load this in root: _.L TpAnalyse _vr.cpp++
and run start("name")
After this is finished edit timewalk.cpp and set the correct values in this script
Load and run: .L timewalk.cpp++ and timewalk()
Now there should be a text file as well as a root file with the per pixel timewalk curve variable, if the values look wrong, you can change the limits on the fit to find better values.

How to use this calibration
This calibration should be used as a relative correction on the delay per ToT, for example correct the delay from every ToT to ToT=100. This can be done by:

correction [ns] = (25/16)* [var1 / (ToT - var2) - var1/ (100 - var2)]

Measuring TDC bin sizes
The pulse generator PG-1072 was during previous scans and thus the script relies on this generator being used.
First ensure that the pulse generator is connected to Anthias via a network cable. Check if p4p2 is configured correctly (IP should be: If not run (as root): ifup p4p2 and ifconfig p4p2 netmask

Now that the connection between the pulse generator and Anthias is established, the pulse generator can be controlled via the pc. To run the TDC scan, use "python3.6". In this program, the startDelay and deltaT should be changed to the desired values for this. When the program is finished, TriggerScan.txt file is created in the Output directory. For each step this file has the delay, TDC bin, fraction as a value in it. This file can be used to generate the desired plots.

Error codes encountered in the past

Machine error code 10: faulty 12V power supply
This error code showed up along with status (st) 136. This error code resulted in the motors not being powered, and the switches in on state. The origin of the error really was a faulty power supply. On the PCB in the Corvus, a diode had broken, which resulted in a shorted 12V power supply. The solution was to replace this diode (SB360-E3/73). The switching regulator (LM2575HVT-12) could be replaced as well, however this is not necessary to do.

Details about lasers

Timepix3 assemblies without metalization

The known Timepix3 assemblies without metalization are listed here. Any information that is know about them is placed here as well.

Assembly Sensor thickness (μm) V breakdown (V) V Depletion (V) IV Curve Chipboard # Remarks
W0002-H10 ? +? +?   ? CERN chipboard, cannot reach full depletion
W0013-K05 300? ? ?   40  
W0013-C03 300 ? ?   66  
W0020-J07 200 <-200 115?     Partly removed metalization

How to remove part of the metalization

A part of the aluminium metalization on the chips can be removed with acid. The procedure to do so is described in detail below.

Stuff you will need:

  • A drop of acid (how to make the acid is described below)
    • 1 parts nitric acid (fuming or 70%)
    • 2 parts distilled water
    • 16 parts phosphoric acid
  • Isopropanol
  • 2 pipettes
  • A lot of cotton wool/swabs
  • Fumehood
Making the acid
Be really carefull while making the acid, especially if you are working with fuming nitric acid. Always do this in a fumehood! Or, preferably, ask somebody from Amolf (Nanocenter), to make it for you. If you do want to mix it yourself, first add the water, then the nitric acid, and after that the phosphoric acid. Be aware that the solution can get very hot by adding the the acid to the water.


Use nitrile gloves during the procedure! Do not reuse them!

Be really careful while doing this, the wirebonds and parts under the chip are made of aluminum as well, and will thus also dissolve if the acid touches it. It is good practice to first make an IV-curve of the sensor in the dark before and after the etching procedure to check for any damage.

First place the sensor on a flat surface. Otherwise the acid can run off the chip. Now with the first pipette take a little bit of the acid mixture and move it to about the middle of chip. Now lightly push in the pipette to form a drop that still is attached to the pipette and is not touching the chip. With this drop attached to the pipette, slowly move the pipette down until the drop is in contact with the chip. At this point the drop should spread out a bit on the chip. If the drop is smaller than the area that you want to remove, bring the pipette in contact with the drop on the chip (not with the sensor itself!), and slowly move the pipette to around to drag the acid to create a larger area. Now leave the acid on the chip for about 2 hours. The acid will only dissolve the aluminum and not the silicon-oxide of the chip, and will thus stop at the aluminum-silicon interface. During this process, the area covert in the acid will turn black (silicon looks black). After 2 hours, lightly touch the acid drop with the cotton wool ball such that the cotton wool will absorb the acid. Continue using new cotton wool balls until you do not see any acid. Now take a fresh cotton wool ball, and put (a lot) of isopropanol on it using the second pipette. Lightly rub this cotton wool over the part of the chip that was covert in acid, and be very very careful that you do not touch and damage the wirebonds. Do this a few times, every time using a new cotton wool ball. At this point there should not be any acid left on the chip, however it is a good practice to take a picture of the chip at this point and check the next day/week if there is still any aluminum disappearing.

Pulse Generator for Laser

The lasers need an input signal from e.g. a pulse generator to start lasering. For this, the Agilent 33220A can be used if the pulse length is above ~20ns. Make sure that the output impedance on the pulse generator is set to 25Ω if a splitter is used to view the pulse on an oscilloscope.

Topic attachments
I Attachment Action Size Date Who Comment
PDFpdf DY3.pdf manage 104.5 K 2011-11-15 - 17:42 MartinVanBeuzekom  
PDFpdf FG1.pdf manage 96.9 K 2011-11-15 - 17:50 MartinVanBeuzekom  
PDFpdf collimators_focusers.pdf manage 413.8 K 2012-03-12 - 15:19 MartinVanBeuzekom  
JPEGjpg laser_spec_1060nm.jpg manage 360.3 K 2012-03-09 - 12:55 MartinVanBeuzekom  
JPEGjpg laser_spec_660nm.jpg manage 304.9 K 2012-03-09 - 12:54 MartinVanBeuzekom  
JPEGjpg laser_spec_980nm.jpg manage 425.5 K 2012-03-09 - 12:55 MartinVanBeuzekom  
PDFpdf laser_spotsize_etc.pdf manage 387.0 K 2012-03-12 - 15:19 MartinVanBeuzekom  
Topic revision: r36 - 2020-08-20 - MartinVanBeuzekom
This site is powered by the TWiki collaboration platform Powered by Perl This site is powered by the TWiki collaboration platformCopyright © 2008-2021 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback