tbsw

Code for testbeam data reconstruction and analysis

https://github.com/benjaminschwenker/tbsw

Science Score: 57.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
    Found 7 DOI reference(s) in README
  • Academic publication links
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (15.0%) to scientific vocabulary
Last synced: 6 months ago · JSON representation ·

Repository

Code for testbeam data reconstruction and analysis

Basic Info
  • Host: GitHub
  • Owner: BenjaminSchwenker
  • Language: C++
  • Default Branch: master
  • Size: 5.63 MB
Statistics
  • Stars: 3
  • Watchers: 1
  • Forks: 0
  • Open Issues: 0
  • Releases: 0
Created over 3 years ago · Last pushed over 2 years ago
Metadata Files
Readme License Citation

README.md

Introduction to the test beam software framework (tbsw)

The test beam software framework (tbsw) deals with the reconstruction and analysis of test beam data obtained with the EUDET/AIDA reference telescope. Test beams are all about learning about a device under test, or DUT, installed in the centre of the reference telescope. The device under test is position sensitive detector, typically a pixel or strip silicon sensor. The idea is to probe the device under test with charged tracks crossing the DUT at known times and precisely estimated kinematic parameters.

The tbsw framework is designed to run on local machines (Desktop / Laptop) to enable detector groups doing their own data analysis right during the beam test (or shortly afterwards). Some effort was invested to make this as smooth and simple as possible. The installation of the framework is covered in INSTALL.

A testbeam paper describing also the algorithms behind tbsw in some detail can be found here: https://doi.org/10.1016/j.nima.2020.164978

For the impatient reader: The text below is a step by step instruction how to run the code on raw data

After installation, the root directory of tbsw contains a 'workspace' folder. The first step to analyse data from a new beam test is to make a working copy of this folder. For example:

$ cp -r workspace ~/workspace-my-beam-test

The idea of the folder 'workspace-my-beam-test' is to collect all steering files and analysis results from a specific beam test. Please replace the 'my-beam-test' part with something more specific like 'desyoctober2016' or similar. For simplicity, we will call this folder just workspace in the following.

It is a good idea to copy the workspace to some place outside of the tbsw installation. In case you want to reprocess your data with a new (different) version of tbsw, you typically just have to make sure the environment variables in 'init_tbsw.sh' point to the desired installation.

Raw data files (.raw) should not be stored directly in your workspace folder. Again, this simplifies switching versions of tbsw. It is advised collect all raw data files in a seperate folder.

For example:

$ mkdir path-to-big-disk/rawdata-my-beam-test

Raw data from a one week beam test is typically ~1TB and fits on most Desktop PCs or laptops.

Next, go to your new workspace folder and setup all environment variables.

$ . init_tbsw.sh

A test beam with the EUDET/AIDA telescope results in a number of .raw files. Each raw file corresponds to a particular run having a specific test beam geometry, beam energy and DUT configuration. Before we can start with the reconstruction and analysis of data, we need to prepare a set of steering files to describe this situation.

In order to have an introductory example, we will perform a simulation experiment. In this way, we do not need access to real test beam data but generate the raw data for one run by our own. The added benefit of this approach is that we can compare the reconstructed data with the simulated truth data. The steerfiles folder 'workspace/steering-files/depfet-tb/' contains:

  • geardesyW11OF2.xml: Telescope geometry file, describes a Belle II PXD sensor installed in the EUDET telescope (6x M26 planes and a FEI4 timing plane)

The Python script example.py runs us through all steps of the example which includes the generation of simulated data, the calibration of telescope data and the full reconstruction with final calibration constants.

You can run the script by typing:

$ python example.py

In case the script is working, your console should display messages like:

``` benjamin@benjamin-ThinkPad-T470s:~/Desktop/TBSW/tbsw/workspace$ python example.py [INFO] Misalign position of plane with ID 0 [INFO] Misalign position of plane with ID 1 [INFO] Misalign position of plane with ID 2 [INFO] Misalign position of plane with ID 3 [INFO] Misalign position of plane with ID 4 [INFO] Misalign position of plane with ID 5 [INFO] Misalign position of plane with ID 21 [INFO] Misalign position of plane with ID 7 [INFO] Misalign position of plane with ID 6 [INFO] Starting to simulate a test beam run ... [INFO] Marlin sim.xml is done ('[INFO] Created new caltag ', 'default') ('[INFO] Created new caltag ', 'simulation') [INFO] Starting to calibrate file /home/benjamin/Desktop/TBSW/tbsw/workspace/simrun.slcio ... [INFO] Marlin maskpath.xml is done [INFO] Marlin clusterizerpath.xml is done [INFO] Marlin correlatorpath.xml is done [INFO] Marlin prealignerpath.xml is done [INFO] Marlin alignerpath.xml is done [INFO] Marlin alignerpath.xml is done [INFO] Marlin alignerpath.xml is done [INFO] Marlin dqmpath.xml is done [INFO] Marlin preclustercalpath.xml is done [INFO] Marlin alignerdbpath.xml is done [INFO] Marlin alignerdbpath.xml is done [INFO] Marlin clustercalpath.xml is done [INFO] Marlin clustercalpath.xml is done [INFO] Marlin clustercalpath.xml is done [INFO] Marlin clustercalpath.xml is done [INFO] Marlin clustercalpath.xml is done [INFO] Marlin clustercalpath.xml is done [INFO] Marlin alignerdbpath.xml is done [INFO] Marlin alignerdbpath.xml is done [INFO] Marlin dqmdbpath.xml is done ('[INFO] Created new caltag ', 'simrun-test') [INFO] Done processing file /home/benjamin/Desktop/TBSW/tbsw/workspace/simrun.slcio [INFO] Starting to reconstruct file /home/benjamin/Desktop/TBSW/tbsw/workspace/simrun.slcio ... [INFO] Marlin recopath.xml is done [INFO] Done processing file /home/benjamin/Desktop/TBSW/tbsw/workspace/simrun.slcio

```

All calibration data is collected in the folder 'workspace/localDB' and root files with reconstructed tracks and hits are collected in the folder 'workspace/root-files'. The structure of the root trees for tracks hits and evenst is explained in the next section. The example script creates two root files with simple residual histograms ('Example-Residuals.root') and DUT hit efficiency plots ('Example-Efficiency.root') to show what can be done using the hit and track trees.

What is the input/output data format of tbsw?

The tbsw framework uses Marlin[1] and LCIO[2] to organize the calibration and reconstruction of test beam data into a Path of small steps handled by so called Processors. In order to read in raw files from EUDAQ a part of the EUDAQ 1 code base [3] is hosted to read files and convert event raw data into LCIO collections for further processing. The reconstruction path from the example script can illustrate the situation:

```

!python

Create a path for full reconstruction of telescope data

recopath = Env.createpath('reco_path')

Read input data from simulated raw file in lcio format

The file contains zero suppressed digits for all sensor

recopath.setglobals(params={'GearXMLFile': gearfile , 'MaxRecordNumber' : nevents, 'LCIOInputFiles': rawfile })

Create a precessor for clustering of telescope data

m26clust = Processor(name="M26Clusterizer",proctype="PixelClusterizer")

Now you can set various parameters of the processor

You can obtain a full list of all processor types with

all their parameters and default values by executing

the following command in a shell:

$MARLIN/bin/Marlin -x

All parameters can be overriding from the python script

Set the path to the hotpixel mask (generated in the calibration before)

m26clust.param("NoiseDBFileName","localDB/NoiseDB-M26.root")

Set the name of the input collection containing the m26 digits

m26clust.param("SparseDataCollectionName","zsdata_m26")

Set the name of the output collection with with clusters

m26clust.param("ClusterCollectionName","zscluster_m26")

Add the processor to the path

recopath.addprocessor(m26clust)

Create a processor for clustering pxd data

pxdclust = Processor(name="PXDClusterizer",proctype="PixelClusterizer")
pxdclust.param("NoiseDBFileName","localDB/NoiseDB-PXD.root") pxdclust.param("SparseDataCollectionName","zsdatapxd") pxdclust.param("ClusterCollectionName","zsclusterpxd") recopath.addprocessor(pxdclust)

Create center of gravity hits from m26 clusters

m26hitmaker = Processor(name="M26CogHitMaker",proctype="CogHitMaker") m26hitmaker.param("ClusterCollection","zsclusterm26") m26hitmaker.param("HitCollectionName","hitm26") recopath.addprocessor(m26hitmaker)

Create center of gravity hits for pxd clusters

pxdhitmaker = Processor(name="PXDCogHitMaker",proctype="CogHitMaker") pxdhitmaker.param("ClusterCollection","zsclusterpxd") pxdhitmaker.param("HitCollectionName","hitpxd") recopath.addprocessor(pxdhitmaker)

Make similar steps for the data from the FEI4 timing plane.

You can easily extend to include more sensors.

Create (find/fit)tracks from M26 and FEI4 and extrapolate to PXD.

trackfinder = Processor(name="TrackFinder",proctype="FastTracker")

Use hits from the following collections. You can add additional collections

as needed.

trackfinder.param("InputHitCollectionNameVec","hitm26 hitfei4")

Set the file from which to take the alignment. Computed during calibration.

trackfinder.param("AlignmentDBFileName","localDB/alignmentDB.root")

PXD hits (plane 3 in geometry file) are explicitely from

the trackfinding to avoid bias in measuring PXD efficiency

resolution.

This is not strictly necessary here, because the PXD hits are not

in the input hit collection list. But one can use this to measure

a specific M26 plane, for example

trackfinder.param("ExcludeDetector", "3")

Add to path

recopath.addprocessor(trackfinder)

Create a processor to compute out root file for a specific device under

test (DUT). Here, the DUT is the Belle II sensor at plane 3.

pxdanalyzer = Processor(name="PXDAnalyzer",proctype="PixelDUTAnalyzer") pxdanalyzer.param("HitCollection","hitpxd")
pxd
analyzer.param("DigitCollection","zsdatapxd") pxdanalyzer.param("AlignmentDBFileName","localDB/alignmentDB.root") pxdanalyzer.param("DUTPlane","3") recopath.addprocessor(pxdanalyzer)

```

The last processor in this reconstruction path create the output root data for studying the performance of the device under test. The root file Histos-PXD.root in workspace/root-files will contain three TTree's called Hit, Track and Event. These trees will be filled with reference tracks interpolated to the third plane along the beam line, i.e. the position of the DUT sensor in our example. The main advantage of this choice is that we can always work in the local uvw coordinates of our device under test.

  • Origin of local coordinate system is center of the sensitive volume
  • u,v,w positions are always in millimeters (mm)
  • u axis points in direction of increasing ucells
  • v axis points in direction of increasing vcells
  • w axis completes a right handed cartesian coordinate system
  • The interpolated track state does not include information from the DUT hit

The structure of the root trees is defined at the end of the document in Appendix 1.

A toy simulation example script for simulation, calibration (alignment), reconstruction and analysis of a depfet testbeam is part of the workspace folder.

The next script runs simulation, calibration and reconstruction:

python example.py

The output of this script is a root file root-files/Histos-PXD-simrun-test-reco.root containing flat tuples for further analysis. A simple way to get a pdf withplots is:

python histo-plotter.py --ifile=root-files/Histos-PXD-simrun-test-reco.root

The tbsw repo also ships a full script for processing of a depfet test beam November 2018 at Desy. This script shows the calibration and reconstruction process for testbeam data starting from .raw files.

An example .raw file from this test beam can be downloaded:

wget -O run001286.raw https://owncloud.gwdg.de/index.php/s/vphTqcJfwyyIHiZ/download

The steering files for in order to process this test beam is shipped with tbsw and can be found at steering-files/depfet-tb.

python depfet-reco.py python histo-plotter.py

Recently the option was added to read hit tables from different subdetectors in csv format as input into tbsw. A working example can be found here:

https://github.com/BenjaminSchwenker/tbswworkspacetjmp2_desy

Have fun with test beams ;)

benjamin.schwenker@phys.uni-goettingen.de

Bug Report / Feature Request / Question

Please use the issue tracker of the repository: https://github.com/BenjaminSchwenker/tbsw

Or contact me directly: benjamin.schwenker@phys.uni-goettingen.de

Phd theses

The software tbsw was develped and applied in the following (incomplete) list of Phd theses:

B. Schwenker, 2014 Development and validation of a model for the response of the Belle II vertex detector, Ph.D. thesis, http://cds.cern.ch/record/1967035 U. Göttingen, Göttingen, Germany

U. Stolzenberg, 2020 Radiation length measurements with high-resolution telescopes, Ph.D. thesis, http://cds.cern.ch/record/2690257, U.~Göttingen Göttingen, Germany

H. C. Beck, 2019 Development of Pixel Module Assembly Processes for the Phase 2 Upgrade of the ATLAS Detector and Test Beam Measurements with Diamond Pixel Detectors, Ph.D. thesis, https://ediss.uni-goettingen.de/handle/21.11130/00-1735-0000-0005-1337-8?locale-attribute=en , U.~Göttingen Göttingen, Germany

Proceedings and papers

U. Stolzenberg, A. Frey, B. Schwenker, P. Wieduwilt, C. Marinas and F. Lütticke, 2017, Radiation length imaging with high resolution telescopes, https://doi.org/10.1016/j.nima.2016.06.086 Nucl. Instrum. Meth. A 845 173 [1609.02402]

T. Obermanna, T. Hemperek, F. Hügging, H. Krüger, D.-L. Pohl, B. Schwenker and N. Wermes, 2017, Depleted Monolithic Pixels (DMAPS) in a 150 nm technology: lab and beam results, https://doi.org/10.1088%2F1748-0221%2F12%2F01%2Fc01062, JINST 2017

P. Wieduwilt,∗, B. Paschen,∗, H. Schreeck, B. Schwenker, Performance of production modules of the Belle II pixel detector in a high-energy particle beam, https://doi.org/10.1016/j.nima.2020.164978, Nucl. Inst. Meth. A 991 (2021) 164978

Further references

[1] F. Gaede, Marlin and LCCD: Software tools for the ILC, Nucl.Instrum.Meth. A559 (2006) 177–180.

[2] S. Aplin, J. Engels, F. Gaede, N. A. Graf, T. Johnson, et al., LCIO: A Persistency Framework and Event Data Model for HEP, SLAC-PUB-15296

[3] https://eudaq.github.io/

Appendix 1: Definition of output tuples

```c // Hit Tree filled once per hit (potentially multiple times per event) rootHitTree = new TTree("Hit","Hit info"); _rootHitTree->Branch("iRun" ,&rootRunNumber ,"iRun/I"); // Run number from lcio file rootHitTree->Branch("iEvt" ,&rootEventNumber ,"iEvt/I"); // Event number from lcio file rootHitTree->Branch("sensorID" ,&rootSensorID ,"sensorID/I"); // DUT SensorID rootHitTree->Branch("nTelTracks" ,&rootNTelTracks ,"nTelTracks/I"); // Number of tracks in same event rootHitTree->Branch("nDutDigits" ,&rootNDUTDigits ,"nDutDigits/I"); // Number of DUT digits in the same event
rootHitTree->Branch("hasTestPixels" ,&rootDUTHasTestPixels, "hasTestPixels/O");// Flag if DUT sent test digits in event rootHitTree->Branch("isGoodEvent" ,&rootDUTGoodEvent, "isGoodEvent/O"); // Flag if DUT unpacking w/o errors
rootHitTree->Branch("clusterQuality" ,&rootHitQuality ,"clusterQuality/I"); // GoodCluster == 0, BadCluster != 0 rootHitTree->Branch("uhit" ,&rootHitU ,"uhit/D"); // Hit coordinate u from DUT cluster in mm
rootHitTree->Branch("vhit" ,&rootHitV ,"vhit/D"); // Hit coordinate v from DUT cluster in mm
rootHitTree->Branch("clusterCharge" ,&rootHitClusterCharge ,"clusterCharge/D");// Sum over all charges in the cluster rootHitTree->Branch("seedCharge" ,&rootHitSeedCharge ,"seedCharge/D"); // Highest charge in cluster rootHitTree->Branch("sizeU" ,&rootHitSizeU ,"sizeU/I"); // Number of hit pixels projected on u direction rootHitTree->Branch("sizeV" ,&rootHitSizeV ,"sizeV/I"); // Number of hit pixels projected on v direction rootHitTree->Branch("size" ,&rootHitSize ,"size/I"); // Number of hit pixels in cluster rootHitTree->Branch("pixeltype" ,&rootHitSeedPixelType ,"pixeltype/I"); // PixelType of seed pixel cell rootHitTree->Branch("cellUhit" ,&rootHitCellU ,"cellUhit/I"); // Hit u coordinate lies on this u cell rootHitTree->Branch("cellVhit" ,&rootHitCellV ,"cellVhit/I"); // Hit v coordinate lies on this v cell rootHitTree->Branch("cellUseed" ,&rootHitSeedCellU ,"cellUseed/I"); // Seed pixel has this u cell rootHitTree->Branch("cellVseed" ,&rootHitSeedCellV ,"cellVseed/I"); // Seed pixel has this u cell rootHitTree->Branch("hasTrack" ,&rootHitHasTrack ,"hasTrack/I"); // Hit can be matched to track (== 0)
rootHitTree->Branch("hasTrackWithRefHit", &rootHitHasTrackWithRefHit,"hasTrackWithRefHit/I"); // Number of tracks with hit on reference plane in same event rootHitTree->Branch("ufit" ,&rootHitFitU ,"ufit/D"); // Estimated track intersection u coordinate in mm, defautls to -1 when HasTrack!=0
rootHitTree->Branch("vfit" ,&rootHitFitV ,"vfit/D"); // Estimated track intersection v coordinate in mm, defautls to -1 when HasTrack!=0
rootHitTree->Branch("dudwfit" ,&rootHitFitdUdW ,"dudwfit/D"); // Estimated track slope du/dw in radians, defautls to -1 when HasTrack!=0
rootHitTree->Branch("dvdwfit" ,&rootHitFitdVdW ,"dvdwfit/D"); // Estimated track slope dv/dw in radians, defautls to -1 when HasTrack!=0
rootHitTree->Branch("momentum" ,&rootHitFitMomentum ,"momentum/D"); // Estimated track momentum from fit, defautls to -1 when HasTrack!=0 rootHitTree->Branch("ufiterr" ,&rootHitFitErrorU ,"ufiterr/D"); // Estimated 1x sigma uncertainty for track intersection u coordinate, defautls to -1 when HasTrack!=0 rootHitTree->Branch("vfiterr" ,&rootHitFitErrorV ,"vfiterr/D"); // Estimated 1x sigma uncertainty for track intersection v coordinate, defautls to -1 when HasTrack!=0 rootHitTree->Branch("pullresu" ,&rootHitPullResidualU ,"pullresu/D"); // Standardized residual in u direction, defautls to -1 when HasTrack!=0 rootHitTree->Branch("pullresv" ,&rootHitPullResidualV ,"pullresv/D"); // Standardized residual in v direction, defautls to -1 when HasTrack!=0 rootHitTree->Branch("cellUfit" ,&rootHitFitCellU ,"cellUfit/I"); // Estimated track intersection u coordinate lies on this u cell, defautls to -1 when HasTrack!=0
rootHitTree->Branch("cellVfit" ,&rootHitFitCellV ,"cellVfit/I"); // Estimated track intersection v coordinate lies on this v cell, defautls to -1 when HasTrack!=0
rootHitTree->Branch("cellUCenterfit" ,&rootHitFitCellUCenter ,"cellUCenterfit/D"); // Central coordinate of cell 'FitCellU' in mm, defautls to -1 when HasTrack!=0
rootHitTree->Branch("cellVCenterfit" ,&rootHitFitCellVCenter ,"cellVCenterfit/D"); // Central coordinate of cell 'FitCellV' in mm, defautls to -1 when HasTrack!=0
rootHitTree->Branch("trackChi2" ,&rootHitTrackChi2 ,"trackChi2/D"); // Chi2 value from fit of reference track, defautls to -1 when HasTrack!=0
rootHitTree->Branch("trackNdof" ,&rootHitTrackNDF ,"trackNdof/I"); // Number of degrees of freedom of track fit, defautls to -1 when HasTrack!=0
rootHitTree->Branch("trackNHits" ,&rootHitTrackNHits ,"trackNHits/I"); // Number of telescope hits used for track fitting, defautls to -1 when HasTrack!=0
rootHitTree->Branch("localChi2" ,&rootHitLocalChi2 ,"localChi2/D"); // Chi2 value from hit-track residual on device under test, defautls to -1 when HasTrack!=0

// Track Tree filled once per track (potentially multiple times per event) rootTrackTree = new TTree("Track","Track info"); _rootTrackTree->Branch("iRun" ,&rootRunNumber ,"iRun/I"); // Run number from lcio file rootTrackTree->Branch("iEvt" ,&rootEventNumber ,"iEvt/I"); // Event number from lcio file rootTrackTree->Branch("sensorID" ,&rootSensorID ,"sensorID/I"); // DUT SensorID rootTrackTree->Branch("nTelTracks" ,&rootNTelTracks ,"nTelTracks/I"); // Number of tracks in same event rootTrackTree->Branch("nDutDigits" ,&rootNDUTDigits ,"nDutDigits/I"); // Number of DUT digits in the same event
rootTrackTree->Branch("isGoodEvent" ,&rootDUTGoodEvent, "isGoodEvent/O"); // Flag if DUT unpacking w/o errors
rootTrackTree->Branch("hasTestPixels" ,&rootDUTHasTestPixels, "hasTestPixels/O"); // Flag if DUT sent test digits in event rootTrackTree->Branch("hasRefHit" ,&rootTrackWithRefHit ,"hasRefHit/I"); // Track has hit on reference plane (== 0) rootTrackTree->Branch("trackChi2" ,&rootTrackChi2 ,"trackChi2/D"); // Chi2 value from fit of reference track rootTrackTree->Branch("trackNdof" ,&rootTrackNDF ,"trackNdof/I"); // Number of degrees of freedom of track fit rootTrackTree->Branch("trackNHits" ,&rootTrackNHits ,"trackNHits/I"); // Number of telescope hits used for track fitting rootTrackTree->Branch("momentum" ,&rootTrackFitMomentum ,"momentum/D"); // Estimated track momentum from fit (GeV)
rootTrackTree->Branch("ufit" ,&rootTrackFitU ,"ufit/D"); // Estimated track intersection u coordimate in mm rootTrackTree->Branch("vfit" ,&rootTrackFitV ,"vfit/D"); // Estimated track intersection v coordimate in mm rootTrackTree->Branch("dudwfit" ,&rootTrackFitdUdW ,"dudwfit/D"); // Estimated track slope du/dw in radians rootTrackTree->Branch("dvdwfit" ,&rootTrackFitdVdW ,"dvdwfit/D"); // Estimated track slope dv/dw in radians, rootTrackTree->Branch("cellUfit" ,&rootTrackFitCellU ,"cellUfit/I"); // Estimated track intersection u coordinate lies on this u cell
rootTrackTree->Branch("cellVfit" ,&rootTrackFitCellV ,"cellVfit/I"); // Estimated track intersection v coordinate lies on this v cell
rootTrackTree->Branch("cellUCenterfit" ,&rootTrackFitCellUCenter ,"cellUCenterfit/D"); // Central coordinate of cell 'FitCellU' in mm rootTrackTree->Branch("cellVCenterfit" ,&rootTrackFitCellVCenter ,"cellVCenterfit/D"); // Central coordinate of cell 'FitCellV' in mm rootTrackTree->Branch("hasHit" ,&rootTrackHasHit ,"hasHit/I"); // Track can be matched to a DUT hit (== 0) rootTrackTree->Branch("localChi2" ,&rootTrackLocalChi2 ,"localChi2/D"); // Chi2 value from hit-track residual on device under test
rootTrackTree->Branch("seedCharge" ,&rootTrackSeedCharge ,"seedCharge/D"); // Highest charge in cluster, only filled if cluster matched rootTrackTree->Branch("pixeltype" ,&rootTrackPixelType ,"pixeltype/I"); // PixelType of pixel cell intersected by track rootTrackTree->Branch("maskedPixel" ,&rootTrackPixelMasked ,"maskedPixel/I"); // Track intersects a masked pixel (masked!=0) or unmasked pixel (masked=0)

// Event Summay Tree filled once per event rootEventTree = new TTree("Event","Event info"); _rootEventTree->Branch("iRun" ,&rootRunNumber ,"iRun/I"); // Run number from lcio file rootEventTree->Branch("iEvt" ,&rootEventNumber ,"iEvt/I"); // Event number from lcio file rootEventTree->Branch("sensorID" ,&rootSensorID ,"sensorID/I"); // DUT SensorID
rootEventTree->Branch("nTelTracks" ,&rootNTelTracks ,"nTelTracks/I"); // Number of tracks rootEventTree->Branch("nTelTracksWithRefHit" ,&rootNTelTracksWithRefHit ,"nTelTracksWithRefHit/I"); // Number of tracks with reference hit rootEventTree->Branch("nDutDigits" ,&rootNDUTDigits ,"nDutDigits/I"); // Number of DUT digits rootEventTree->Branch("hasTestPixels" ,&rootDUTHasTestPixels, "hasTestPixels/O"); // Flag if DUT sent test digits rootEventTree->Branch("isGoodEvent" ,&rootDUTGoodEvent, "isGoodEvent/O"); // Flag if DUT unpacking w/o errors

```

Owner

  • Name: BenjaminSchwenker
  • Login: BenjaminSchwenker
  • Kind: user
  • Location: Göttingen
  • Company: Georg-August Universität Göttingen

Citation (CITATION.cff)

cff-version: 1.2.0
message: "If you use this software, please cite it as below."
authors:
- family-names: "Schwenker"
  given-names: "Benjamin"
  orcid: "https://orcid.org/0000-0002-7120-3732"
title: "tbsw"
version: 1.0.0
doi: 10.5281/zenodo.1234
date-released: 2022-08-22
url: "https://github.com/BenjaminSchwenker/tbsw"

GitHub Events

Total
Last Year