CbmRoot
Loading...
Searching...
No Matches
CbmMcbm2019CheckDigisSts.cxx
Go to the documentation of this file.
1/* Copyright (C) 2020-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau [committer] */
4
6
7#include "CbmDigiManager.h"
8#include "CbmStsDigi.h"
9
10#include "FairRootManager.h"
11#include "FairRunOnline.h"
12#include <Logger.h>
13
14#include "TClonesArray.h"
15#include "TH1.h"
16#include "TH2.h"
17#include "THttpServer.h"
18#include <TDirectory.h>
19#include <TFile.h>
20
21#include <iomanip>
22#include <iostream>
23using std::fixed;
24using std::setprecision;
25
26// ---- Default constructor -------------------------------------------
27CbmMcbm2019CheckDigisSts::CbmMcbm2019CheckDigisSts() : FairTask("CbmMcbm2019CheckDigisSts") {}
28
29// ---- Destructor ----------------------------------------------------
31
32// ---- Initialisation ----------------------------------------------
34{
35 // Load all necessary parameter containers from the runtime data base
36 /*
37 FairRunAna* ana = FairRunAna::Instance();
38 FairRuntimeDb* rtdb=ana->GetRuntimeDb();
39
40 <CbmMcbm2019CheckDigisStsDataMember> = (<ClassPointer>*)
41 (rtdb->getContainer("<ContainerName>"));
42 */
43}
44
45// ---- Init ----------------------------------------------------------
47{
48 // Digi Manager
50 fDigiMan->Init();
51
52 // Get a pointer to the previous already existing data level
53 if (!fDigiMan->IsPresent(ECbmModuleId::kSts)) { LOG(info) << "No TClonesArray with STS digis found."; }
54
56
57 return kSUCCESS;
58}
59
60
62{
63 Double_t dZoomDuration = (fuStopTs - fuStartTs) * fdTsLength;
64 fDigisPerAsicEvo = new TH2F("fDigisPerAsicEvo", "Digis per Asic evo; Time [ ns ]; ASIC []", dZoomDuration / 1000, 0,
65 dZoomDuration, kuMaxNbAsics, 0, kuMaxNbAsics);
66
67 for (UInt_t uAsic = 0; uAsic < kuMaxNbAsics; ++uAsic)
68 for (UInt_t uChan = 0; uChan < kuNbChansAsic; ++uChan) {
69 fdLastStsDigi[uAsic][uChan] = 0.0;
70 fdLastStsDigiPulser[uAsic][uChan] = 0.0;
71 } // loop on channel and asic
72
74 new TH2F("fSameChanDigisDistEvo", "Time dist of digis in same chan evo; Time [ ns ]; Same chan dist [ ns ]", 5000,
75 0, 500000., 1000, 0., 10000.);
76
77 std::cout << Form("TS with jump %5u, first TS time off %12.0f, start TS %5u "
78 "stop TS %5u, TS length %9.0f Start time %12.0f",
80 << std::endl;
81}
82// ---- ReInit -------------------------------------------------------
83InitStatus CbmMcbm2019CheckDigisSts::ReInit() { return kSUCCESS; }
84
85// ---- Exec ----------------------------------------------------------
86void CbmMcbm2019CheckDigisSts::Exec(Option_t* /*option*/)
87{
88 LOG(debug) << "executing TS " << fNrTs;
89
90 if (0 < fNrTs && 0 == fNrTs % 1000) LOG(info) << Form("Processing TS %6d", fNrTs);
91
93 if (fNrTs < fuStartTs || fuStopTs < fNrTs) {
94 fNrTs++;
95 return;
96 } // if( fNrTs < fuStartTs || fuStopTs < fNrTs )
97
99 LOG(debug) << "StsDigis: " << nrStsDigis;
100
101
102 for (Int_t iSts = 0; iSts < nrStsDigis; ++iSts) {
103
104 const CbmStsDigi* Digi = fDigiMan->Get<CbmStsDigi>(iSts);
105
106 Double_t dTime = Digi->GetTime();
107 Double_t dAdc = Digi->GetCharge();
108 UInt_t uChan = Digi->GetChannel();
109 UInt_t uAsic = uChan / kuNbChansAsic;
110 uChan %= kuNbChansAsic;
111
112 Double_t dTimeSinceStart = dTime - fdStartTime;
113 fDigisPerAsicEvo->Fill(dTimeSinceStart, uAsic);
114
115 if (0 == iSts)
116 std::cout << Form("Much first hit in TS %5d: asic %2u chan %3u time "
117 "%12.0f Bmon time %12.0f check time %12.0f ADC %2.0f",
118 fNrTs, uAsic, uChan, dTime, dTime - fdFirstTsOffs, dTimeSinceStart, dAdc)
119 << std::endl;
120
121 if (fdDigiDistStart < dTimeSinceStart && dTimeSinceStart < fdDigiDistStop) {
122 // std::cout << Form( "Sts hit in TS %5d: asic %2u chan %3u Bmon time %12.0f ADC %2.0f",
123 // fNrTs, uAsic, uChan, (dTimeSinceStart - fdDigiDistStart), dAdc )
124 // << std::endl;
125 Double_t dTimeDistLastDigi = dTimeSinceStart - fdLastStsDigi[uAsic][uChan];
126 fSameChanDigisDistEvo->Fill(dTimeSinceStart - fdDigiDistStart,
127 dTimeDistLastDigi < 10000 ? dTimeDistLastDigi : 9999);
128 }
129 /*
130 if( 0.0 == fdLastStsDigi[ uAsic ][ uChan ] )
131 std::cout << Form( "Sts first hit in TS %5d: asic %2u chan %3u Bmon time %12.0f ADC %2.0f",
132 fNrTs, uAsic, uChan, dTime - fdFirstTsOffs, dAdc )
133 << std::endl;
134*/
135 fdLastStsDigi[uAsic][uChan] = dTimeSinceStart;
136
137 // if( 9 != uAsic )
138 if (9 != uAsic || uChan < 63) continue;
139 if (fuMaxAdcPulserSts < Digi->GetCharge() || Digi->GetCharge() < fuMinAdcPulserSts) continue;
140
141 std::cout << Form("Sts pulser in TS %5d: chan %3u Bmon time %12.0f time "
142 "start %12.0f ADC %2.0f dt %12.0f",
143 fNrTs, uChan, dTime, dTimeSinceStart, dAdc, dTime - fdLastStsDigiPulser[uAsic][uChan])
144 << std::endl;
145 fdLastStsDigiPulser[uAsic][uChan] = dTime;
146 } // for (Int_t iSts = 0; iSts < nrStsDigis; ++iSts)
147
148 fNrTs++;
149}
150
151// ---- Finish --------------------------------------------------------
153
155{
156 TFile* oldFile = gFile;
157 TDirectory* oldDir = gDirectory;
158
159 TFile* outfile = TFile::Open(fOutFileName, "RECREATE");
160
161 fDigisPerAsicEvo->Write();
162 fSameChanDigisDistEvo->Write();
163
164 outfile->Close();
165 delete outfile;
166
167 gFile = oldFile;
168 gDirectory = oldDir;
169}
170
ClassImp(CbmConverterManager)
@ kSts
Silicon Tracking System.
int Int_t
static Int_t GetNofDigis(ECbmModuleId systemId)
static Bool_t IsPresent(ECbmModuleId systemId)
Presence of a digi branch.
InitStatus Init()
Initialisation.
const Digi * Get(Int_t index) const
Get a digi object.
static CbmDigiManager * Instance()
Static instance.
Double_t fdLastStsDigiPulser[kuMaxNbAsics][kuNbChansAsic]
Double_t fdLastStsDigi[kuMaxNbAsics][kuNbChansAsic]
Data class for a single-channel message in the STS.
Definition CbmStsDigi.h:40
XPU_D uint16_t GetChannel() const
Channel number in module @value Channel number.
Definition CbmStsDigi.h:93