Skip to content

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:

Schéma d'injection

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

Calibration de la carte test

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 discriminateur
  • Ctest_ch[i] Le switch d'injection sur le canal i
  • PA_gain toujours a 10
  • dac_threshold_m/lsb Le seuil par ASIC
  • EN-CLPS Mis à 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 , coarse par 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

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:

Zoom Pedestal scan carte 1

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

Pedestal scan carte 1

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

Injection 50 fC 1ns sur canal 30

Temps de montée 1ns, 150 mV

Q=150 fC, Canal 30

Injection 150 fC 1ns sur canal 30

Temps de montée 2ns, 50 mV

Q=50 fC, Canal 30

Injection 50 fC 2ns sur canal 30

Temps de montée 2ns, 150 mV

Q=150 fC, Canal 30

Injection 150 fC 2ns sur canal 30

Temps de montée 3ns, 50 mV

Q=50 fC, Canal 30

Injection 50 fC 3ns sur canal 30

Temps de montée 3ns, 150 mV

Q=150 fC, Canal 30

Injection 150 fC 3ns sur 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

Calibrations 1ns

On obtient l'intercepte et la pente de chaque canal Intercept et pente 1ns

que l'on peut analyser en fonction des canaux Intercept et pente vs channels 1ns

Temps de montée 2 ns

Calibrations 2ns

On obtient l'intercepte et la pente de chaque canal Intercept et pente 2ns

que l'on peut analyser en fonction des canaux Intercept et pente vs channels 2ns

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

Q 60 fC tau 1ns Q 60 fC tau 1ns  ves channels

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

Q 50 fC tau 1ns Q 50 fC tau 1ns  ves channels

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

Q 1 pC tau 1ns  vs THR

=1.5 ns

Q 1 pC tau 1.5ns  vs THR

=2 ns

Q 1 pC tau 2ns  vs THR

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.

Scan en charge 50-1000 fC 1ns

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

S vs Q

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

S vs Q

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

S vs Q

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

Piedestaux mode coarse

Piédestal à 537

Mode fine

Piedestaux 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

Canal 48 \tau 1ns

=1.5ns

Canal 48 \tau 1.5ns

=2ns

Canal 48 \tau 2ns

=4ns

Canal 48 \tau 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