Logbook des test de la carte PICMIC
La carte Liroc+PicoTdc
Historique
Avec la carte test du Liroc et celle du PicoTDC nous utilisions la configuration suivante
{"asics": [{"address": "0.0.0.1", "dif": 1, "num": 1, "slc":
{"CLPS_bsize": 4,
"Ctest": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"DAC_local": [49, 56, 45, 41, 48, 49, 29, 37, 43, 41, 46, 40, 47, 59, 47, 62, 53, 64, 64, 62, 53, 56, 50, 59, 45, 66, 57, 43, 52, 48, 56, 56, 72, 86, 72, 64, 76, 88, 71, 79, 75, 89, 82, 66, 78, 79, 78, 58, 64, 77, 75, 76, 82, 99, 66, 83, 73, 88, 83, 73, 75, 85, 87, 76],
"DAC_threshold": 472,
"DC_pa": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"EN_10bDAC": 1,
"EN_7b": 1,
"EN_bg": 1,
"EN_differential": 1,
"EN_disc": 1,
"EN_pa": 1,
"EN_pre_emphasis": 0,
"EN_probe": 1,
"Forced_ValEvt": 0,
"Hysteresys": 0,
"Ibi_probe": 2,
"Ibo_probe": 32,
"Mask": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"MillerComp": 4,
"PA_gain": 15,
"PP_10bDAC": 0,
"PP_7b": 0,
"PP_bg": 0,
"PP_differential": 0,
"PP_disc": 0,
"PP_pa": 0,
"PP_probe": 0,
"Polarity": 0,
"Pre_emphasis_delay": 0}}],
"state": "LIBOARD_TEST", "version": 22}
Le piédestal était vers 520 et la DAC_threshold à 540 pour une calibration à 50 fC environ. A priori l'injection était négative avec une terminaison 50 + 100 nF en série
Par contre il n'y avait pas de capacité en série avant le LIROC:

Et la calibration donnait pour un temps de montée de 2ns

Software
La base du software est le driver en python développé par Loup. Il est sur gitlab et peut être installé par
git clone https://gitlab.in2p3.fr/picmic/liroc-picotdc/liroc_picotdc_daq.git
Le software se trouve dans le répertoire software et l'accès au driver python peut se faire par modification du python PATH
export PYTHONPATH=/home/ilc/acqilc/liroc_picotdc_daq/software/:$PYTHONPATH
Plusieurs procédure d'alignement des piédestaux ou de test se trouve dans les répertoires software et software/test
En parallèle, j'ai développé des procédures de calibration analogues à celle écrites pour le FEBV2. Ce software est distribué avec pmdaq dans le répertoire picmic . Il est basé sur les procédures de Loup avec une utilisation de la base de donnée pour le stockage des paramètres et des résultats.
Base de donnée
La configuration de la carte se fait à partir d'un fichier CSV: liroc_picotdc_daq/software/febconfig/example_config.csv
Il contient deux parties, une pour les paramètres du LIROC, l'autre pour ceux du PICOTDC. Dans ma version j'ai séparé 2 fichiers d'exemples
- default_liroc.csv: les paramètres sur lesquels on a agi sont
DC_PA_ch[i]Le niveau DC d'entrée du canal i (laissé à 0 par défaut)DAC_local_ch[i]Le DAC pour le canal i avant le discriminateurCtest_ch[i]Le switch d'injection sur le canal iPA_gaintoujours a 10dac_threshold_m/lsbLe seuil par ASICEN-CLPSMis à 15
"Parameter","Value"
"LIROC","LIROC"
"DC_PA_ch0",0
"Ctest_ch0",0
"Mask_ch0",0
"DAC_local_ch0",64
"DC_PA_ch1",0
"Ctest_ch1",0
"Mask_ch1",0
"DAC_local_ch1",64
"DC_PA_ch2",0
"Ctest_ch2",0
"Mask_ch2",0
"DAC_local_ch2",64
"EN_pa",1
"PP_pa",0
"PA_gain",10
"EN_7b",1
"PP_7b",0
"PA_comp",2
"EN_disc",1
"PP_disc",0
"Polarity",0
"Cmd_hysteresis",0
"EN_bg",1
"PP_bg",0
"EN_10bDAC",1
"PP_10bDAC",0
"dac_threshold_msb","0b10"
"dac_threshold_lsb","0b110000"
"EN-CLPS",0xf
"EN-pE",0
"PE-delay",0
"EN_Rx",1
"PP_Rx",0
"Forced_ValEvt",0
"EN_NOR64",0
"EN_probe",0
"PP_probe",0
"MillerComp",4
"Ibi_probe","0b10"
"Ibo_probe","0b100000"
-
default_pico.csv: Pour le PICOTDC les paramètres importants sont ceux liés
-
au filtrage des signaux d'entrée
"hrx_top_delay",0xf
"hrx_top_bias","0xf"
"hrx_top_filter_trailing",1
"hrx_top_filter_leading",1
"hrx_top_en_r",1
"hrx_top_en",1
"hrx_bot_delay",0xf
"hrx_bot_bias","0xf"
"hrx_bot_filter_trailing",1
"hrx_bot_filter_leading",1
"hrx_bot_en_r",1
"hrx_bot_en",1
- à la polarité des fronts
"falling_en",0
- à la résolution ,
coarsepar exemple
"tg_bot_nen_fine",1
"tg_bot_nen_coarse",0
"tg_top_nen_fine",1
"tg_top_nen_coarse",0
"highres_en",0
Le code de création de setup et de modification est identique à celui des FEBs
import picmic_register_access as pr
s=pr.instance()
s.create_setup("TOTO")
pr=pr.picmic_registers(f_id=12)
pr.load_defaults(fnp="../etc/default_pico.csv",fnl="../etc/default_liroc.csv")
s.setup.add_picmic(pr)
s.upload_changes("un test de creation")
On peut aussi avoir la liste des setups et en télécharger un
python3
Python 3.11.2 (main, Apr 28 2025, 14:11:48) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import picmic_register_access as pr
>>> s=pr.instance()
>>> s.list_setups()
TEST_PIC_DB / 1 | Essai d'insertion | Previous 0
TEST1_PIC_DB / 1 | Essai d'insertion | Previous 0
TEST2_PIC_DB / 1 | Essai d'insertion | Previous 0
TEST3_PIC_DB / 1 | Essai d'insertion | Previous 0
TEST3_PIC_DB / 2 | Alignment | Previous 1
TEST3_PIC_DB / 3 | Alignment 2nd pass | Previous 2
TEST3_PIC_DB / 4 | all on all aligned | Previous 3
TEST3_PIC_DB / 5 | Un nouvel essai d alignement | Previous 1
TEST3_PIC_DB / 6 | 2eme pass nouvel essai d alignement | Previous 5
PICMIC_TEST_JUNE / 1 | First version in June | Previous 0
PICMIC_TEST_JUNE / 2 | un test | Previous 1
TOTO / 1 | un test de creation | Previous 0
>>> s.download_setup("TOTO",1)
>>> s.to_csv_files()
On crée ainsi le fichier /dev/shm/board_csv/TOTO_1_f_12_config_picmic.csv
On peut évidemment modifié n'importe quel paramètre avec:
target=800
filtering=True
tlsb=target&0xFF
tmsb=(target>>8)&0xFF
s.setup.boards[0].picmic.set("dac_threshold_lsb",tlsb)
s.setup.boards[0].picmic.set("dac_threshold_msb",tmsb)
#Maximal filtering
if (filtering):
s.setup.boards[0].picmic.set("hrx_top_delay",0xF)
s.setup.boards[0].picmic.set("hrx_top_bias",0xF)
s.setup.boards[0].picmic.set("hrx_top_filter_trailing",1)
s.setup.boards[0].picmic.set("hrx_top_filter_leading",1)
s.setup.boards[0].picmic.set("hrx_bot_delay",0xF)
s.setup.boards[0].picmic.set("hrx_bot_bias",0xF)
s.setup.boards[0].picmic.set("hrx_bot_filter_trailing",1)
s.setup.boards[0].picmic.set("hrx_bot_filter_leading",1)
else:
s.setup.boards[0].picmic.set("hrx_top_filter_leading",0)
s.setup.boards[0].picmic.set("hrx_bot_filter_leading",0)
s.setup.boards[0].picmic.set("hrx_top_filter_trailing",0)
s.setup.boards[0].picmic.set("hrx_bot_filter_trailing",0)
# Falling ?
s.setup.boards[0].picmic.set("falling_en",0)
# ValEvt
s.setup.boards[0].picmic.set("Forced_ValEvt",0)
# Polarity
s.setup.boards[0].picmic.set("Polarity",0)
# DC_PA
for ch in range(64):
if (dc_pa!=0):
self.setup.boards[0].picmic.set('DC_PA_ch',dc_pa,ch)
# creation d'une version temporaire 998
s.setup.version=998
s.to_csv_files()
On crée ainsi le fichier /dev/shm/board_csv/TOTO_998_f_12_config_picmic.csv avec les paramètres modifiés
On peut également faire un appel à upload_changes pour créer la version 2 de TOTO
Procédures de piédestaux
Les piedestaux ne sont alignés qu'en jounat sur le DAC_local_ch[i] et en scannant le seuil global dac_threshold_m/lsb. La procédure réalise un scan grossier des S-Curves calcule la médiane et ajuste la valuer du DAC local avec
où est la valeur à mi-hauteur de la S-Curve du canal i (Turn on)
Deux approches sont possibles:
liroc_picotdc_daq/software/align_pedestal.py: Iterations jusqu'à ce que les corrections soient nulles.pmdaq/picmic/bin/scurve_one_shot: scan autour de la valeur estimée de la correction () et choix de la valeur la plus proche de la médiane.
C'est cette dernière mèthode qui a été utilisée pour les études suivantes.
Alignement
On obtient pour les piédestaux sur la première carte:

en zoomant on voit que l'alignement est contenu dans moins de 2 coups de DAC

Calibration des TDCs
Pour l'instant nous n'avons pas encore mis en place de procédures pour mesurer précisément la résolution intrinsèque du picoTDC (injection décalée du même signal sur des canaux digitaux)
Résolution fine
Résolution grossière
Tests d'injection
Setup
On utilise le générateur Agilent 81160 en injectant soit directement sur CTEST avec un pont diviseur de 2, soit à travers une Capacité de 10 pF précédée d'un atténuateur de 20 dB.
Premiers tests avec injection sur une C=10 pF
On compare la réponse sur le même canal pour 3 temps de montée différents et 2 charges 50 fC et 150 fC.
Temps de montée 1ns, 50 mV
Q=50 fC, Canal 30

Temps de montée 1ns, 150 mV
Q=150 fC, Canal 30

Temps de montée 2ns, 50 mV
Q=50 fC, Canal 30

Temps de montée 2ns, 150 mV
Q=150 fC, Canal 30

Temps de montée 3ns, 50 mV
Q=50 fC, Canal 30

Temps de montée 3ns, 150 mV
Q=150 fC, Canal 30

Calibration
Pour calibrer on utilise l'entrée CTEST qui est suivi d'une résistance de 50 Ohm série qui divise par 2 le signal injecté Sauf sur le canal 48 où la terminaison a été retirée=> Ne Pas dépasser 1.2 V
On a noté une diaphonie de l'injection lorsque l'on dépasse 0.6 V (30 fC)
On scanne 20 points de 50 mV à 600 mV (2.5-30 fC). Dans tous les cas, seul le canal injecté est actif et seul sa capacité CTEST est activée.
Temps de montée 1 ns

On obtient l'intercepte et la pente de chaque canal

que l'on peut analyser en fonction des canaux

Temps de montée 2 ns

On obtient l'intercepte et la pente de chaque canal

que l'on peut analyser en fonction des canaux

Remarques importantes
- Le piédestal ainsi déterminé est 20 coups de DAC plus bas que celui déterminé avec les Scurves. Cela indique clairement une non linéarité à basse charge. Il faut répéter cette mesures sur des canaux en injectant de 50 à 500 fC directement sur les entrées et calculer l'intercepte.
- La réponse n'est pas uniforme par canal, spécialement sur les 30 premiers canaux. Vu que l'on ne peut pas adapter le gain par canal, il serait raisonnable d'aligner les Scurves sur une injection (50 fC?) avec CTEST pour pouvoir appliquer un seuil commun à tous les canaux
- Une des possibilités pour expliquer cette dépendance est l'atténuation de la charge injectée en fonction du canal. Ceci semble être confirmé par les études suivantes.
Résolution temporelle
Dans cette première étude on mesure la réponse en temps des canaux avec une injection sur CTEST de 1.2 V (60 fC).
Le délai du pulse par rapport au déclenchement est de 85 ns. Le seuil est fixé à DAC=610 pour un piédestal à 564 (Scurves) ou 547 (injection) soit un seuil
| Piédestal | ns | ns |
|---|---|---|
| Scurves | ||
| CTEST |
Vu la variation du seuil selon le temps de montée et suivant que l'on considère l'un ou l'autre des piédestaux mesurés on s'attend à de gros effets de timewalk ce que l'on note sur les 2 tests suivants où on remarque également que la charge injectée décroît avec le numéro de canal.
Temps de montée ns, Charge injectée Q=60 fC

Temps de montée ns, Charge injectée Q=50 fC

Dépendance au seuil
A partir des mesures suivantes l'injection ne se fait que sur une seule piste (LIROC canal 45) et à travers la capacité de 10 pF et l'atténuateur de 20 dB
On fait une injection de 1V (Q= 1pC) pour 3 temps de montée: 1, 1.5 et 2 ns. On note a la fois un effet de timewalk attendu mais aussi une détérioration de la résolution si le seuil est trop bas...
=1 ns

=1.5 ns

=2 ns

Dépendance en charge
Pour un temps de montée de =1 ns, nous avons essayé d'adapter le seuil à la charge injectée et fait varier cette injection entre 50 fC et 1 pC. On réduit ainsi le timewalk et on retrouve une dépendance de la résolution attendue. Celle-ci est plus mauvaise que celle clamée pour le LIROC et provient principalement de la gigue du signal de déclenchement du générateur. Cet effet est supprimé dans l´étude suivante.

Suppression de la gigue du déclenchement
Pour éliminer la gigue de l'injection, on mesure la différence entre une injection numérique sur le canal 0 directement reliée au picoTDC et une injection sur le canal Liroc 45.
On a répété 3 fois le balayage de 0.2 V à 2.5 V (soit 200 fC à 2.5 pC) avec un seuil fixe à 650 et un temps de montée ns
- Premier balayage 20000 événements , pause de 30 minute
- Second balayage 80000 événements
- Troisième balayage 240 000 événements
La résolution optimale se stabilise vers 11 ps, pour une charge Q=1 pC injectée.
Time scan timing_vscan_f45_l45_v2.5_t650_d130000_r1000un_lun
timing_vscan_f45_l45_v2.5_t650_d130000_r1000un_lun
| V inj (V) | Channel | T (ps) | |
|---|---|---|---|
| 0.2 | 45 | 55.857 | 51.79 |
| 0.315 | 45 | 55.823 | 36.34 |
| 0.43 | 45 | 55.868 | 27.79 |
| 0.545 | 45 | 55.885 | 23.43 |
| 0.66 | 45 | 55.905 | 19.91 |
| 0.775 | 45 | 55.891 | 17.61 |
| 0.89 | 45 | 55.872 | 15.49 |
| 1.005 | 45 | 55.860 | 19.22 |
| 1.12 | 45 | 55.852 | 22.11 |
| 1.235 | 45 | 55.846 | 22.65 |
| 1.35 | 45 | 55.870 | 21.83 |
| 1.465 | 45 | 55.871 | 15.51 |
| 1.58 | 45 | 55.856 | 13.25 |
| 1.695 | 45 | 55.827 | 13.27 |
| 1.81 | 45 | 55.800 | 14.70 |
| 1.925 | 45 | 55.774 | 15.13 |
| 2.04 | 45 | 55.750 | 14.45 |
| 2.155 | 45 | 55.730 | 13.39 |
| 2.27 | 45 | 55.711 | 12.61 |
| 2.385 | 45 | 55.694 | 12.25 |
| 2.5 | 45 | 55.679 | 12.01 |

Time scan timing_vscan_f45_l45_v2.5_t650_d130000_r1000deux_lun_80k
timing_vscan_f45_l45_v2.5_t650_d130000_r1000deux_lun_80k
| V inj (V) | Channel | T (ps) | |
|---|---|---|---|
| 0.2 | 45 | 55.972 | 43.07 |
| 0.315 | 45 | 55.899 | 27.32 |
| 0.43 | 45 | 55.923 | 21.86 |
| 0.545 | 45 | 55.925 | 18.52 |
| 0.66 | 45 | 55.937 | 15.75 |
| 0.775 | 45 | 55.914 | 13.87 |
| 0.89 | 45 | 55.890 | 12.71 |
| 1.005 | 45 | 55.871 | 11.90 |
| 1.12 | 45 | 55.861 | 11.38 |
| 1.235 | 45 | 55.853 | 11.01 |
| 1.35 | 45 | 55.876 | 11.07 |
| 1.465 | 45 | 55.874 | 10.98 |
| 1.58 | 45 | 55.859 | 10.88 |
| 1.695 | 45 | 55.829 | 11.21 |
| 1.81 | 45 | 55.802 | 12.68 |
| 1.925 | 45 | 55.775 | 13.21 |
| 2.04 | 45 | 55.751 | 12.37 |
| 2.155 | 45 | 55.730 | 11.51 |
| 2.27 | 45 | 55.712 | 11.07 |
| 2.385 | 45 | 55.695 | 10.95 |
| 2.5 | 45 | 55.680 | 10.83 |

Time scan timing_vscan_f45_l45_v2.5_t650_d130000_r1000trois_lun_240k
timing_vscan_f45_l45_v2.5_t650_d130000_r1000trois_lun_240k
| V inj (V) | Channel | T (ps) | |
|---|---|---|---|
| 0.2 | 45 | 55.980 | 42.64 |
| 0.315 | 45 | 55.904 | 27.01 |
| 0.43 | 45 | 55.924 | 21.78 |
| 0.545 | 45 | 55.927 | 18.49 |
| 0.66 | 45 | 55.937 | 15.78 |
| 0.775 | 45 | 55.914 | 13.95 |
| 0.89 | 45 | 55.890 | 12.81 |
| 1.005 | 45 | 55.872 | 11.99 |
| 1.12 | 45 | 55.861 | 11.43 |
| 1.235 | 45 | 55.854 | 11.16 |
| 1.35 | 45 | 55.876 | 11.27 |
| 1.465 | 45 | 55.875 | 11.20 |
| 1.58 | 45 | 55.860 | 11.05 |
| 1.695 | 45 | 55.831 | 11.45 |
| 1.81 | 45 | 55.802 | 13.16 |
| 1.925 | 45 | 55.775 | 13.47 |
| 2.04 | 45 | 55.752 | 12.70 |
| 2.155 | 45 | 55.731 | 11.86 |
| 2.27 | 45 | 55.713 | 11.38 |
| 2.385 | 45 | 55.696 | 11.28 |
| 2.5 | 45 | 55.681 | 11.10 |

Nouvelles mesures Fin Octobre 2025 avec la nouvelle carte d'alimentation
Carte numéro 2
La deuxieme carte a été montée avec seule l'entrée dig2 et le canal 48 connecté.
L'alimentation se fait désormais en 4 et 2 V à travers la carte de Christophe.
Piedestaux
Pour les peiedestaux on observe une grosse différence entre le picoTDC en mode coarse ou fine. On doit étudier ce qu'il se passe au niveaux des alimentations.
Mode coarse

Piédestal à 537
Mode fine

Piédestal à 507 , 5-6 canaux non alignés
Calibrations
On injecte en 2 et 15 mV (0.2 à 0.5 V 40 dB) sur une Capa de 11 pF sur le canal 48. Le mode est coarse et on fait varier le rise time de 1 à 4 ns
=1ns

=1.5ns

=2ns

=4ns

Pour une coupure à 20 DAC au-dessus du piedestal on obtient une charge minimal:
| (ns) | Slope (DAC/fC) | |
|---|---|---|
| 1 | 1.302 | 15.4 |
| 1.5 | 1.031 | 19.4 |
| 2 | 0.775 | 25.8 |
| 4 | 0.341 | 58.7 |