User Tools

Site Tools


daq_control_python

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
daq_control_python [2020/07/10 06:55]
acqilc
daq_control_python [2021/07/10 23:21] (current)
Line 3: Line 3:
 This new DAQ control is purely based on python (version 3). The C++ run control (FDAQ/​FSLOW) is dropped and all application are directly controlled by python This new DAQ control is purely based on python (version 3). The C++ run control (FDAQ/​FSLOW) is dropped and all application are directly controlled by python
  
-Il est interface ​avec la base mongodb dans laquelle est stocke ​les configurations de processus et les informations sur chaque prise de donnee ​(run par setup avec commentaires)+Il est interfacé ​avec la base mongodb dans laquelle est stocké ​les configurations de processus et les informations sur chaque prise de donnée ​(run par setup avec commentaires)
  
-Pour plus d'​informations sur la base il faut se refferer ​la page [[mongoroc_doc|Documentation Mongo DB]]+Pour plus d'​informations sur la base il faut se refferer ​à la page [[mongoroc_doc|Documentation Mongo DB]]
  
-Le script mgjob permet de televerser ​ou de telecharger ​une configuration ainsi que visualiser les runs d'un setup donne.+Le script mgjob permet de téléverser ​ou de télécharger ​une configuration ainsi que visualiser les runs d'un setup donné. 
 + 
 +Afin d'​utiliser cet environnement il est nécessaire de définir 3 variables d'​environnement:​ 
 + 
 +   - MGDBLOGIN=monId/​monPasswd@mamachinedeDB:​27017@MaBase ​ , cette variable est également définie dans le fichier /​etc/​ljc.conf sur chaque machine 
 +   - DAQMONGO=maconfig:​maversion , c'est la configuration de processus qui sera utilisée 
 +   - DAQSETUP=Nom_de_lexperience , il sera utilisé pour avoir une série de numéros de runs unique par expérience (début à 1000) 
 + 
 + 
 +Le contrôle de la prise de donnée se fait en plusieurs étapes. Il faut créer un fichier de description des processus et le téléverser dans la base, gérer les processus d'​acquisition (création,​destruction,​paramètres) et enfin gérer l'​exécution séquentielle de la prise de donnée(Initialisiation,​ configuration,​ acquisition,​reset) 
 + 
 +==== Le fichier de description ==== 
 +Nous allons prendre comme exemple une acquisition lisant des DIFs USB via un raspberry, synchronisée par une SDCC. Trois processus ​ doivent être déclarés:​ 
 + 
 +  - le contrôle de la SDCC: CCCSERVER 
 +  - le contrôle des DIFs: DIFMANAGER 
 +  - le contrôle de l'​écriture : BUILDER 
 + 
 +Les 3 paragraphes suivants décrivent les paramètres nécessaires par processus 
 +=== SDCC === 
 +      { 
 +        "​ARGS":​ [],  
 +        "​ENV":​ [ 
 +          "​PATH=/​usr/​local/​sbin:/​usr/​local/​bin:/​usr/​sbin:/​usr/​bin:/​sbin:/​bin",​  
 +          "​LD_LIBRARY_PATH=/​usr/​lib:/​usr/​local/​lib:/​opt/​dhcal/​lib:​$LD_LIBRARY_PATH",​  
 +          "​WEBPORT=41000"​ 
 +        ],  
 +        "​NAME":​ "​CCCSERVER",​  
 +        "​PARAMETER":​ { 
 +          "​device":​ "​DCCCCC01" ​        <​=== FTDI name 
 +        },  
 +        "​PROGRAM":​ "/​opt/​dhcal/​bin/​lydaq_daemon_Sdcc"​ 
 +      } 
 +       
 +=== DIFManager ​ === 
 + 
 +      { 
 +        "​ARGS":​ [],  
 +        "​ENV":​ [ 
 +          "​PATH=/​opt/​dhcal/​bin:/​usr/​local/​sbin:/​usr/​local/​bin:/​usr/​sbin:/​usr/​bin:/​sbin:/​bin",​  
 +          "​LD_LIBRARY_PATH=/​usr/​lib:/​usr/​local/​lib:/​opt/​dhcal/​lib:​$LD_LIBRARY_PATH",​  
 +          "​PYTHONPATH=/​opt/​dhcal/​script/:​$PYTHONPATH",​  
 +          "​CONFDB_WEB=cmsLyon/​RPC_2008@ilcconfdb.ipnl.in2p3.fr",​  
 +          "​WEBPORT=40000",​  
 +          "​INSTANCE=0"​ 
 +        ],  
 +        "​NAME":​ "​DIFMANAGER",​  
 +        "​PARAMETER":​ { 
 +          "​detectorId":​ 100,     <​== Event builder detector id 
 +          "​dif":​ { 
 +            "​db":​ {              <== DB access description 
 +              "​mode":​ "​mongo",​  
 +              "​state":​ "​DIFTEST_DOME", ​  <​== ASICs DB state  
 +              "​version":​ 3               <​== ASICs DB version 
 +            } 
 +          },  
 +          "​publish":​ "​tcp://​lyosdhcal9:​5556" ​   <== data publication port (obsolete with ZDAQ Event builder) 
 +        },  
 +        "​PROGRAM":​ "/​opt/​dhcal/​bin/​lydaq_daemon_DIF"​ 
 +      } 
 +=== Builder === 
 +      { 
 +        "​ARGS":​ [], 
 +        "​ENV":​ [         
 +         "​LD_LIBRARY_PATH=/​usr/​lib:/​usr/​local/​lib:/​opt/​zdaq/​lib:/​opt/​zdaq/​example/​lib:​ 
 +         ​$LD_LIBRARY_PATH",​ 
 +          "​WEBPORT=46000",​ 
 +          "​INSTANCE=0"​ 
 +        ], 
 +        "​NAME":​ "​BUILDER",​ 
 +        "​PARAMETER":​ { 
 +          "​collectingPort":​ 5556,       <​== Port sur lequel le DIFMANAGER envoie les données 
 +          "​directory":​ "/​data/​local/​TELESCOPE",​ <== Repertoire d'​écriture 
 +          "​dummy":​ 0, <== 1 si les données ne sont pas écrites ​      
 +          "​processor":​ [ 
 +            "​binarywriter" ​  <​== Liste des pluggins d'​écriture et d'​analyse,​ binarywriter est fourni par ZDAQ 
 +          ], 
 +          "​stream":​ [ 
 +            "​tcp://​*:​5556" ​ <== Obsolete 
 +          ] 
 +        }, 
 +        "​PROGRAM":​ "/​opt/​dhcal/​bin/​zdaq_daemon_builder"​ 
 +      } 
 + 
 +=== Structure du fichier === 
 + 
 +Le fichier de configuration est un dictionnaire JSON avec 2 étiquettes  
 + 
 +   * HOSTS : Un dictionnaire des machines de la configuration 
 +   * NAME : Le nom de la configuration (typiquement nom_version) 
 + 
 +Chaque machine est étiquetée par son nom et contient une liste de description de processus, comme dans l'​exemple suivant  
 + 
 +  { 
 +  "​HOSTS":​ { 
 +    "​lyoilc17":​ [ 
 +      { 
 +        "​ARGS":​ [], 
 +        "​ENV":​ [ 
 +          "​LD_LIBRARY_PATH=/​usr/​lib:/​usr/​local/​lib:/​opt/​zdaq/​lib:/​opt/​zdaq/​example/​lib:​ 
 +          $LD_LIBRARY_PATH",​ 
 +          "​WEBPORT=46000",​ 
 +          "​INSTANCE=0"​ 
 +        ], 
 +        "​NAME":​ "​BUILDER",​ 
 +        "​PARAMETER":​ { 
 +          "​collectingPort":​ 5556, 
 +          "​directory":​ "/​data/​local/​TELESCOPE",​ 
 +          "​dsnumber":​ 2, 
 +          "​dummy":​ 0, 
 +          "​processor":​ [ 
 +            "​binarywriter"​ 
 +          ], 
 +          "​stream":​ [ 
 +            "​tcp://​*:​5556"​ 
 +          ] 
 +        }, 
 +        "​PROGRAM":​ "/​opt/​dhcal/​bin/​zdaq_daemon_builder"​ 
 +      } 
 +    ], 
 +    "​lyoilcrpi17":​ [ 
 +      { 
 +        "​ARGS":​ [], 
 +        "​ENV":​ [ 
 +          "​PATH=/​usr/​local/​sbin:/​usr/​local/​bin:/​usr/​sbin:/​usr/​bin:/​sbin:/​bin",​ 
 +          "​DIM_DNS_NODE=lyosdhcal10",​ 
 +          "​LD_LIBRARY_PATH=/​usr/​lib:/​usr/​local/​lib:/​opt/​dhcal/​levbdim/​lib:/​opt/​dhcal/​lib:​ 
 +          /​opt/​dhcal/​DQM4HEP/​lib:/​opt/​dhcal/​dim/​linux:/​opt/​dhcal/​DQM4HEP/​lib:/​opt/​dhcal/​root/​lib:​ 
 +          /​opt/​dhcal/​lcio/​v02-00/​lib/:​$LD_LIBRARY_PATH",​ 
 +          "​WEBPORT=42000"​ 
 +        ], 
 +        "​NAME":​ "​CCCSERVER",​ 
 +        "​PARAMETER":​ { 
 +          "​device":​ "​MDCC01",​ 
 +          "​spilloff":​ 1000000, 
 +          "​spillon":​ 20000, 
 +          "​spillregister":​ 64 
 +        }, 
 +        "​PROGRAM":​ "/​opt/​dhcal/​bin/​lydaq_daemon_Sdcc"​ 
 +      }, 
 +      { 
 +        "​ARGS":​ [], 
 +        "​ENV":​ [ 
 +          "​PATH=/​opt/​dhcal/​bin:/​usr/​local/​sbin:/​usr/​local/​bin:/​usr/​sbin:/​usr/​bin:/​sbin:/​bin",​ 
 +          "​LD_LIBRARY_PATH=/​usr/​lib:/​usr/​local/​lib:/​opt/​dhcal/​lib:​$LD_LIBRARY_PATH",​ 
 +          "​PYTHONPATH=/​opt/​dhcal/​script/:​$PYTHONPATH",​ 
 +          "​CONFDB_WEB=cmsLyon/​RPC_2008@ilcconfdb.ipnl.in2p3.fr",​ 
 +          "​WEBPORT=40000",​ 
 +          "​INSTANCE=0"​ 
 +        ], 
 +        "​NAME":​ "​DIFMANAGER",​ 
 +        "​PARAMETER":​ { 
 +          "​detectorId":​ 100, 
 +          "​dif":​ { 
 +            "​db":​ { 
 +              "​mode":​ "​mongo",​ 
 +              "​state":​ "​TELESCOPE_DOME",​ 
 +              "​version":​ 24 
 +            } 
 +          }, 
 +          "​publish":​ "​tcp://​lyoilc17:​5556"​ 
 +        }, 
 +        "​PROGRAM":​ "/​opt/​dhcal/​bin/​lydaq_daemon_DIF"​ 
 +      }, 
 +
 +        "​ARGS":​ [],  
 +        "​ENV":​ [ 
 +          "​PATH=/​usr/​local/​sbin:/​usr/​local/​bin:/​usr/​sbin:/​usr/​bin:/​sbin:/​bin",​  
 +          "​LD_LIBRARY_PATH=/​usr/​lib:/​usr/​local/​lib:/​opt/​dhcal/​lib:​$LD_LIBRARY_PATH",​  
 +          "​WEBPORT=41000"​ 
 +        ],  
 +        "​NAME":​ "​GPIOSERVER",​  
 +        "​PARAMETER":​ { 
 +          "​device":​ "​1"​ 
 +        },  
 +        "​PROGRAM":​ "/​opt/​dhcal/​bin/​lydaq_daemon_GPIO"​ 
 +      }  
 +    ] 
 +  }, 
 +  "​NAME":​ "​diftest_dome_4"​ 
 +  } 
 + 
 +Dans ce cas le PC lyoilc17 collecte les données et les écrit sur disque, le raspberry PI lyoilcrpi17 lit les DIFs, contrôle la synchronisation et contrôle des alimenations avec le processu GPIOSERVER 
 + 
 +==== Le contrôle des processus ==== 
 + 
 +Pour controller les processus un programme (daemon) doit être lancé sur chaque machine participant à l'​acquisition:​ 
 + 
 +  sudo /​opt/​dhcal/​bin/​ljcd status 
 +   
 +Si le programme n'est pas //running// il faut le lancer avec: 
 + 
 +  sudo /​opt/​dhcal/​bin/​ljcd start 
 +   
 +On vérifie son état avec un accès à http://​nomdemachine:​9999 
 + 
 + 
 +Ensuite sur la machine sur laquelle on va controller l'​acquisition on utilise le script **difdaq** 
 + 
 +  usage: difdaq [-h] 
 +              [--jc-create | --jc-kill | --jc-destroy | --jc-start | --jc-restart | --jc-status | --jc-info | --jc-appcreate | --daq-initialise | --daq-configure | --daq-startrun | --daq-stoprun | --daq-destroy | --daq-status | --daq-difstatus | --daq-evbstatus | --daq-downloaddb | --dif-ctrlreg] 
 +              [--config CONFIG] [--dbstate DBSTATE] [--dbversion DBVERSION] 
 +              [--clock CLOCK] [--directory DIRECTORY] [--vth VTH] 
 +              [--gain GAIN] [--tdc TDC] [--lines LINES] [--host HOST] 
 +              [--name NAME] [--jobname JOBNAME] [--jobpid JOBPID] 
 +              [--value VALUE] [--address ADDRESS] [-v] [--comment COMMENT] 
 +              [--ctrlreg CTRLREG] [-M METHOD] [-A APPLICATION] [-P PARAMETER] 
 +  optional arguments:​ 
 +  -h, --help ​           show this help message and exit 
 +  --jc-create ​          Loads configuration in all jobcontrol process 
 +  --jc-kill ​            kill all running processes 
 +  --jc-destroy ​         delete all jobcontrol configuration 
 +  --jc-start ​           start all controled processes described in $DAQCONFIG 
 +                        jsonfile variable 
 +  --jc-restart ​         restart one job with --jobname=name --jobpid=pid 
 +                        --host=hostname 
 +  --jc-status ​          show the status all controled processes or of the 
 +                        process specified in --name=PROC 
 +  --jc-info ​            show the status all controled processesof the host 
 +                        specified in --host=Host 
 +  --jc-appcreate ​       Create all ZDAQ app on all hosts 
 +  --daq-initialise ​     Initialise DAQ, data source discovery and Builder 
 +                        final configuration 
 +  --daq-configure ​      ​Configure FDAQ, front end ASICs configuration 
 +  --daq-startrun ​       start the run 
 +  --daq-stoprun ​        stop the run 
 +  --daq-destroy ​        ​destroy the readout, back to the CREATED state 
 +  --daq-status ​         display DAQ status of all processes 
 +  --daq-difstatus ​      ​display DAQ status of all FEBCMS TDC 
 +  --daq-evbstatus ​      ​display event builder status 
 +  --daq-downloaddb ​     download the dbstate specified in --dbstate=state 
 +                        --version=num 
 +  --dif-ctrlreg ​        Send CTRLREG to DIFMANAGER --ctrlreg=ctrl 
 +  --config CONFIG ​      json config file 
 +  --dbstate DBSTATE ​    set the dbstate 
 +  --dbversion DBVERSION 
 +                        DB state version 
 +  --clock CLOCK         set the number of 20 ns clock 
 +  --directory DIRECTORY 
 +                        shm publisher directory 
 +  --vth VTH             set the vth for chips 
 +  --gain GAIN           set the gain for chips 
 +  --tdc TDC             set the tdc instance 
 +  --lines LINES         set the number of lines to be dump 
 +  --host HOST           host for log 
 +  --name NAME           ​application name 
 +  --jobname JOBNAME ​    job name 
 +  --jobpid JOBPID ​      job pid 
 +  --value VALUE         value to pass 
 +  --address ADDRESS ​    ​address to pass 
 +  -v, --verbose ​        Raw Json output 
 +  --comment COMMENT ​    ​Comment for start run 
 +  --ctrlreg CTRLREG ​    ​Hexadecimal string ctrlreg 
 +  -M METHOD, --Method METHOD 
 +                        Command name 
 +  -A APPLICATION,​ --Application APPLICATION 
 +                        Application name 
 +  -P PARAMETER, --Parameter PARAMETER 
 +                        parameter set 
 + 
 +=== Gestion des processus === 
 + 
 +  - On charge la configuration dans les daemon: //difdaq --jc-create//​ 
 +  - On demarre les processus : //difdaq --jc-start//​ 
 +  - On peut tuer tous les process : //difdaq --jc-kill//​ 
 +  - Et eliminer la configuration des daemon: //difdaq --jc-destroy//​ 
 +  - On visualise les process : //difdaq --jc-info// (-v si on veut voir tous les parametres) 
 +  - On charge les parametres de toutes les applications:​ //difdaq --jc-appcreate//​ 
 + 
 + 
 +Avec //difdaq --jc-info// on a le PID de chaque processus créé, on peut accéder a ses log sur la machine correspondante dans **/​tmp/​fsmjobPID//#​pid//​.log** 
 + 
 +==== Controle de l'​acquisition === 
 + 
 +Je donne un exemple avec des DIFs version LAPP et une SDCC 
 +  
 +  - Initialiser les aplications://​difdaq --daq-init//​ 
 +  - Verifier le statut: //difdaq --daq-status//​ , toutes les DIFs doivent être INITIALISED,​ si ce n'est pas le cas il y a un problème de clock sur le FPGA de la DIF (HDMI ou cable plat) 
 +  - Charger le controle d'​acquistion:​ // difdaq --dif-ctrlreg --ctrlreg=0x815A1B00//​ 
 +  - Changer le state de base de données pour les ASICs://​difdaq --daq-download --dbstate TELESCOPE_DOME --dbversion=25//​ 
 +  - Configurer les ASICs://​difdaq --daq-configure//,​ un appel a //difdaq --daq-status// ​ doit donner toutes les DIF CONFIGURED et SLC OK, si ce n'est pas le cas il y a soit un problème de connecteur (DIF-ASU,​ASU-ASU) soit un ASIC defectueux 
 +  - Demarrer un run://​difdaq --daq-start --comment="​Mon commentaire"//​ ,Il faut ensuite verifier que les DIFs prennent des données et que l'​Event Builder les écrit avec  //difdaq --daq-status//​  
 +  - Arreter un run ://difdaq --daq-stop//​ 
 +  - Avant de debrancher/​rebrancher une DIF: //difdaq --daq-destroy//​ et on recommence en 1 
 + 
 +Pour rappel la liste des runs s'​obtient avec //mgjob --runs// 
 + 
 +Je crée souvent un fichier .daqsetup avec des alias vers ces commandes et la definition des variables dénvironnement:​ 
 + 
 +  source .daqsetup 
 +   
 +en se connectant doit suffire a les definir.
daq_control_python.1594364159.txt.gz · Last modified: 2021/07/10 23:20 (external edit)