Belle II Software  release-05-01-25
CDCInitialT0Determination.cc
1 #include "cdc/modules/cdcInitialT0Determination/CDCInitialT0Determination.h"
2 #include <cdc/dataobjects/CDCHit.h>
3 #include <cdc/geometry/CDCGeometryPar.h>
4 #include <framework/datastore/StoreArray.h>
5 #include <framework/gearbox/Const.h>
6 #include "TF1.h"
7 #include "TDirectory.h"
8 #include "TFile.h"
9 #include "TGraphErrors.h"
10 #include "vector"
11 #include "TROOT.h"
12 
13 using namespace std;
14 using namespace Belle2;
15 using namespace CDC;
16 REG_MODULE(CDCInitialT0Determination);
17 
18 CDCInitialT0DeterminationModule::CDCInitialT0DeterminationModule() : Module()
19 {
20  setDescription("Module to determine crude t0");
21  setPropertyFlags(c_ParallelProcessingCertified); // specify this flag if you need parallel processing
22  addParam("OutputFileName", m_outputFileName, "t0 file output file", std::string("t0.dat"));
23  addParam("LowTDC", m_tdcMin, "lower boundary of tdc histogram", m_tdcMin);
24  addParam("UpTDC", m_tdcMax, "Upper boundary of tdc histogram", m_tdcMax);
25  addParam("InitialT0", m_initT0, "initial t0 for fitting", 3579.);
26  addParam("Cosmic", m_cosmic, "true; tof negative for upper part of cdc", true);
27  addParam("Zoffset", m_zOffset, "z offset", 0.);
28  addParam("ADCCut", m_adcMin, "threshold of ADC", m_adcMin);
29  addParam("StoreFittedHisto", m_storeFittedHisto, "Store fitted histogram for each channel or not", true);
30  addParam("HistoFileName", m_histoFileName, "file contain TDC histo", std::string("TDC.root"));
31  addParam("MinEntries", m_minEntries, "minimum entries per channel", m_minEntries);
32 }
33 
35 {
36 }
37 
38 
40 {
41  static CDCGeometryPar& cdcgeo = CDCGeometryPar::Instance();
42  for (int il = 0; il < 56; ++il) {
43  for (unsigned short w = 0; w < cdcgeo.nWiresInLayer(il); ++w) {
44  m_hTDC[il][w] = new TH1D(Form("hLay%d_ch%d", il, w), "tdc", m_tdcMax - m_tdcMin, m_tdcMin, m_tdcMax);
45  }
46  }
47  for (int ib = 0; ib < 300; ++ib) {
48  m_hTDCBoard[ib] = new TH1D(Form("hTDCBoard%d", ib), "", m_tdcMax - m_tdcMin, m_tdcMin, m_tdcMax);
49  }
50  m_hT0All = new TH1D("hT0All", "", 8500, 0, 8500);
51 
52 }
54 {
55  static CDCGeometryPar& cdcgeo = CDCGeometryPar::Instance();
56  StoreArray<CDCHit> cdcHits;
57  for (const auto& hit : cdcHits) {
58  WireID wireid(hit.getID());
59  unsigned short lay = wireid.getICLayer();
60  unsigned short w = wireid.getIWire();
61  if (hit.getADCCount() > m_adcMin) {
62  m_hTDC[lay][w]->Fill(hit.getTDCCount());
63  m_hTDCBoard[cdcgeo.getBoardID(WireID(lay, w))]->Fill(hit.getTDCCount());
64  }
65  }
66 }
68 {
69  gROOT->SetBatch(1);
70  std::vector<double> sb;
71  std::vector<double> dsb;
72  std::vector<double> t0b;
73  std::vector<double> dt0b;
74  std::vector<double> b;
75  std::vector<double> db;
76  TH1D* hs = new TH1D("hs", "sigma", 100, 0, 20);
77 
78  static CDCGeometryPar& cdcgeo = CDCGeometryPar::Instance();
79  TF1* f1 = new TF1("f1", "[0]+[1]*(exp([2]*(x-[3]))/(1+exp(-([4]-x)/[5])))", m_tdcMin, m_tdcMax);
80  f1->SetParLimits(0, 0., 1000.);
81  f1->SetLineColor(kRed);
82  double tdcBinWidth = cdcgeo.getTdcBinWidth();
83  double bflag[300];
84  for (int ib = 1; ib < 300; ++ib) {
85  if (m_hTDCBoard[ib]->GetEntries() < m_minEntries) {
86  B2DEBUG(199, "Warning: this board low statistic: " << m_hTDCBoard[ib]->GetEntries());
87  bflag[ib] = 0;
88  m_t0b[ib] = m_initT0;
89  continue;
90  }
91  double p3 = m_hTDCBoard[ib]->GetXaxis()->GetBinCenter(m_hTDCBoard[ib]->GetMaximumBin());
92  f1->SetParameters(0, m_hTDCBoard[ib]->GetMaximum(), -0.001, p3, m_initT0, 2.5);
93  m_hTDCBoard[ib]->Fit("f1", "QM", "", m_initT0 - 60, m_initT0 + 60);
94 
95  if ((fabs(f1->GetParameter(4) - m_initT0) > 100)
96  || (fabs(f1->GetParameter(5)) < 0.01)
97  || (fabs(f1->GetParameter(5)) > 16)) {
98 
99  bflag[ib] = 0;
100  m_t0b[ib] = m_initT0;
101  continue;
102  }
103 
104  bflag[ib] = 1;
105  m_t0b[ib] = f1->GetParameter(4) * tdcBinWidth;
106 
107  sb.push_back(f1->GetParameter(5));
108  dsb.push_back(f1->GetParError(5));
109  t0b.push_back(f1->GetParameter(4));
110  dt0b.push_back(f1->GetParError(4));
111  b.push_back(ib);
112  db.push_back(0);
113  }
114 
115  for (int il = 0; il < 56; ++il) {
116  for (unsigned short w = 0; w < cdcgeo.nWiresInLayer(il); ++w) {
117  B2DEBUG(99, "fitting for channel: " << il << " - " << w);
118  B2DEBUG(99, "number of entries" << m_hTDC[il][w]->GetEntries());
119  m_t0[il][w] = m_initT0 * tdcBinWidth;
120  int bid = cdcgeo.getBoardID(WireID(il, w));
121  if (m_hTDC[il][w]->GetEntries() < m_minEntries) {
122  B2DEBUG(99, "Warning: low statistic channel: " << m_hTDC[il][w]->GetEntries());
123  if (bflag[bid] != 0) {
124  m_t0[il][w] = m_t0b[bid];
125  m_flag[il][w] = true;
126  } else {m_flag[il][w] = false;}
127  } else {
128  double p3 = m_hTDC[il][w]->GetXaxis()->GetBinCenter(m_hTDC[il][w]->GetMaximumBin());
129  f1->SetParameters(0, m_hTDC[il][w]->GetMaximum(), -0.001, p3, m_initT0, 2.5);
130  m_hTDC[il][w]->Fit("f1", "QM", "", m_initT0 - 60, m_initT0 + 60);
131  B2DEBUG(99, "prob of fit : " << f1->GetProb());
132  if ((f1->GetProb() < 1E-150) || (fabs(f1->GetParameter(4) - m_initT0) > 100) || (f1->GetParameter(5) < 0.1)
133  || (f1->GetParameter(5) > 20)) {
134  if (bflag[bid] != 0) {
135  m_t0[il][w] = m_t0b[bid];
136  m_flag[il][w] = true;
137  } else {m_flag[il][w] = false;}
138  } else {
139  m_t0[il][w] = f1->GetParameter(4) * tdcBinWidth;
140  hs->Fill(f1->GetParameter(5));
141  m_flag[il][w] = true;
142  }
143  }
144  B2DEBUG(99, "P4 = " << m_t0[il][w]);
145  if (m_cosmic && cdcgeo.wireBackwardPosition(il, w).Y() > 0) {
146  m_t0[il][w] -= cdcgeo.senseWireR(il) / Const::speedOfLight;
147  } else {
148  m_t0[il][w] += cdcgeo.senseWireR(il) / Const::speedOfLight;
149  }
150  m_t0[il][w] += (m_zOffset - cdcgeo.wireBackwardPosition(il, w).Z()) / 27.25;
151  m_t0[il][w] += 6.122;
152  m_hT0All->Fill(m_t0[il][w]);
153  // m_hT0b[cdcgeo.getBoardID(WireID(il, w))]->Fill(m_t0[il][w]);
154  }
155  }
156 
157  //check t0, and add t0 for low static channel
158  ofstream ofs(m_outputFileName.c_str());
159  for (int il = 0; il < 56; ++il) {
160  for (unsigned short w = 0; w < cdcgeo.nWiresInLayer(il); ++w) {
161  if (m_flag[il][w] != true) {
162  m_t0[il][w] = m_hT0All->GetMean();
163  }
164  ofs << il << "\t" << w << "\t" << m_t0[il][w] << endl;
165  }
166  }
167  ofs.close();
168  if (m_storeFittedHisto) {
169  TFile* fhist = new TFile(m_histoFileName.c_str(), "recreate");
170  fhist->cd();
171  TDirectory* top = gDirectory;
172  TDirectory* Direct[56];
173  for (int il = 0; il < 56; ++il) {
174  top->cd();
175  Direct[il] = gDirectory->mkdir(Form("lay_%d", il));
176  Direct[il]->cd();
177  for (unsigned short w = 0; w < cdcgeo.nWiresInLayer(il); ++w) {
178  if (m_flag[il][w] == true) {
179  m_hTDC[il][w]->Write();
180  }
181  }
182  }
183  top->cd();
184  TDirectory* board = gDirectory->mkdir("board");
185  board->cd();
186  for (int ib = 0; ib < 300; ++ib) {
187  if (m_hTDCBoard[ib]) {
188  m_hTDCBoard[ib]->Write();
189  }
190  }
191  top->cd();
192  m_hT0All->Write();
193  hs->Write();
194  if (b.size() > 20) {
195  TGraphErrors* gr = new TGraphErrors(b.size(), &b.at(0), &sb.at(0), &db.at(0), &dsb.at(0));
196  gr->SetName("reso");
197  gr->Write();
198  TGraphErrors* grT0b = new TGraphErrors(b.size(), &b.at(0), &t0b.at(0), &db.at(0), &dt0b.at(0));
199  grT0b->SetName("T0Board");
200  grT0b->Write();
201  }
202  fhist->Close();
203  }
204 }
205 
Belle2::CDCInitialT0DeterminationModule::initialize
void initialize() override
Initializes the Module.
Definition: CDCInitialT0Determination.cc:39
Belle2::CDCInitialT0DeterminationModule::m_hTDCBoard
TH1D * m_hTDCBoard[300]
T0 distribution of each board.
Definition: CDCInitialT0Determination.h:65
Belle2::CDCInitialT0DeterminationModule::m_cosmic
bool m_cosmic
for cosmic case, tof of upper sector will be negative
Definition: CDCInitialT0Determination.h:76
Belle2::WireID
Class to identify a wire inside the CDC.
Definition: WireID.h:44
Belle2::CDCInitialT0DeterminationModule::~CDCInitialT0DeterminationModule
virtual ~CDCInitialT0DeterminationModule()
Destructor.
Definition: CDCInitialT0Determination.cc:34
Belle2::Module::setDescription
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:216
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::Module::c_ParallelProcessingCertified
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:82
Belle2::CDCInitialT0DeterminationModule::m_tdcMax
unsigned short m_tdcMax
Upper boundary TDC histogram.
Definition: CDCInitialT0Determination.h:71
Belle2::CDCInitialT0DeterminationModule::m_tdcMin
unsigned short m_tdcMin
Lower boundary TDC histogram.
Definition: CDCInitialT0Determination.h:70
Belle2::CDCInitialT0DeterminationModule::m_minEntries
unsigned short m_minEntries
min entries per histo.
Definition: CDCInitialT0Determination.h:73
Belle2::CDCInitialT0DeterminationModule::m_hTDC
TH1D * m_hTDC[56][400]
TDC distribution histo.
Definition: CDCInitialT0Determination.h:64
Belle2::CDC::CDCGeometryPar::getTdcBinWidth
double getTdcBinWidth() const
Return TDC bin width (nsec).
Definition: CDCGeometryPar.h:732
Belle2::CDCInitialT0DeterminationModule::m_storeFittedHisto
bool m_storeFittedHisto
Store fitted histogram or not.
Definition: CDCInitialT0Determination.h:77
Belle2::CDCInitialT0DeterminationModule::terminate
void terminate() override
Termination action, fit t0 and store histograms.
Definition: CDCInitialT0Determination.cc:67
Belle2::CDCInitialT0DeterminationModule::m_flag
bool m_flag[56][400]
flag =1 for good, =0 for low statistic or bad fit
Definition: CDCInitialT0Determination.h:69
Belle2::CDCInitialT0DeterminationModule::m_hT0All
TH1D * m_hT0All
T0 distribution of all channel.
Definition: CDCInitialT0Determination.h:66
Belle2::CDCInitialT0DeterminationModule::m_initT0
double m_initT0
initial t0, use int fitting
Definition: CDCInitialT0Determination.h:74
Belle2::Module
Base class for Modules.
Definition: Module.h:74
Belle2::Module::setPropertyFlags
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:210
Belle2::Const::speedOfLight
static const double speedOfLight
[cm/ns]
Definition: Const.h:568
Belle2::CDC::CDCGeometryPar
The Class for CDC Geometry Parameters.
Definition: CDCGeometryPar.h:75
Belle2::CDCInitialT0DeterminationModule::event
void event() override
Event action (main routine).
Definition: CDCInitialT0Determination.cc:53
Belle2::CDC::CDCGeometryPar::senseWireR
double senseWireR(int layerId) const
Returns radius of sense wire in each layer.
Definition: CDCGeometryPar.h:1231
Belle2::CDC::CDCGeometryPar::wireBackwardPosition
const TVector3 wireBackwardPosition(int layerId, int cellId, EWirePosition set=c_Base) const
Returns the backward position of the input sense wire.
Definition: CDCGeometryPar.cc:1662
Belle2::CDC::CDCGeometryPar::Instance
static CDCGeometryPar & Instance(const CDCGeometry *=nullptr)
Static method to get a reference to the CDCGeometryPar instance.
Definition: CDCGeometryPar.cc:41
Belle2::CDCInitialT0DeterminationModule::m_outputFileName
std::string m_outputFileName
output file name of t0 file.
Definition: CDCInitialT0Determination.h:78
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::CDCInitialT0DeterminationModule::m_histoFileName
std::string m_histoFileName
output file to store TDC histo after fit
Definition: CDCInitialT0Determination.h:79
Belle2::CDC::CDCGeometryPar::getBoardID
unsigned short getBoardID(const WireID &wID) const
Returns frontend board id. corresponding to the wire id.
Definition: CDCGeometryPar.h:576
Belle2::Module::addParam
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:562
Belle2::CDC::CDCGeometryPar::nWiresInLayer
unsigned nWiresInLayer(int layerId) const
Returns wire numbers in a layer.
Definition: CDCGeometryPar.h:1211
Belle2::CDCInitialT0DeterminationModule::m_adcMin
unsigned short m_adcMin
ADC cut to reject noise.
Definition: CDCInitialT0Determination.h:72
Belle2::StoreArray
Accessor to arrays stored in the data store.
Definition: ECLMatchingPerformanceExpertModule.h:33
Belle2::CDCInitialT0DeterminationModule::m_t0b
double m_t0b[300]
T0 for each board.
Definition: CDCInitialT0Determination.h:67
Belle2::CDCInitialT0DeterminationModule::m_zOffset
double m_zOffset
z offset for calculate prop time, it is position of trigger counter,
Definition: CDCInitialT0Determination.h:75
Belle2::CDCInitialT0DeterminationModule::m_t0
double m_t0[56][400]
T0 of each channel.
Definition: CDCInitialT0Determination.h:68