Belle II Software  release-08-01-10
CDCDedxInjectionTime.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <reconstruction/dbobjects/CDCDedxInjectionTime.h>
10 
11 using namespace Belle2;
12 
13 void CDCDedxInjectionTime::printCorrection(std::string svar, std::string sfx) const
14 {
15 
16  if (svar != "mean" && svar != "reso") {
17  B2WARNING("wrong variable input, choose mean or reso");
18  return;
19  }
20 
21  std::string sring[2] = {"ler", "her"};
22  TCanvas* cdraw = new TCanvas("cdraw", "cdraw", 900, 500);
23  cdraw->cd();
24  cdraw->SetGridy(1);
25 
26  for (int ir = 0; ir < 2; ir++) {
27 
28  unsigned int iv = ir * 3 + 1 ;
29  if (svar == "reso") iv = ir * 3 + 2 ;
30 
31  unsigned int sizev = m_injectionvar[iv].size(); //mean or reso
32  unsigned int sizet = m_injectionvar[ir * 3].size(); //time
33  if (sizev == 0 || sizet == 0) {
34  B2ERROR("empty calibration vector");
35  break;
36  }
37 
38  std::vector<unsigned int> tedges(sizet); //time edges array
39  std::copy(m_injectionvar[ir * 3].begin(), m_injectionvar[ir * 3].end(), tedges.begin());
40 
41  std::string hname = Form("hconst_%s_%s_%s", svar.data(), sring[ir].data(), sfx.data());
42  std::string title = Form("%s corrections;injection-time (#mu-sec);%s", svar.data(), svar.data());
43  TH1F hconst(hname.data(), title.data(), sizet - 1, 0, sizet - 1);
44 
45  for (unsigned int ib = 0; ib < sizev; ib++) {
46 
47  double corr = m_injectionvar[iv].at(ib);
48  double ledge = tedges[ib];
49  double uedge = tedges[ib + 1];
50 
51  std::string label;
52  if (ledge < 2e4)label = Form("%0.01f-%0.01fK", ledge / 1e3, uedge / 1e3);
53  else if (ledge < 1e5)label = Form("%0.00f-%0.00fK", ledge / 1e3, uedge / 1e3);
54  else label = Form("%0.01f-%0.01fM", ledge / 1e6, uedge / 1e6);
55 
56  hconst.SetBinContent(ib + 1, corr);
57  hconst.SetBinError(ib + 1, corr * 0.001);
58  hconst.GetXaxis()->SetBinLabel(ib + 1, Form("%s", label.data()));
59  B2INFO("ring: " << sring[ir] << ", time (" << ledge << "-" << uedge << "), mean: " << corr << "");
60  }
61 
62  hconst.SetStats(0);
63  hconst.SetMarkerColor(ir + 1);
64  hconst.SetMarkerSize(1.05);
65  hconst.SetMarkerStyle(24);
66  hconst.GetXaxis()->SetLabelOffset(-0.055);
67  hconst.GetYaxis()->SetRangeUser(0.60, 1.10);
68  if (svar == "reso")hconst.GetYaxis()->SetRangeUser(0.01, 0.20);
69 
70  if (ir == 0)hconst.DrawCopy("");
71  else hconst.DrawCopy(" same");
72  }
73 
74  cdraw->SaveAs(Form("cdcdedx_timeinject_const_%s_%s.pdf", svar.data(), sfx.data()));
75  delete cdraw;
76 
77 }
78 
79 
80 double CDCDedxInjectionTime::getCorrection(std::string svar, unsigned int ring, unsigned int time) const
81 {
82  if (svar != "mean" && svar != "reso") {
83  B2ERROR("wrong var input, choose mean or reso");
84  return 1.0;
85  }
86 
87  if (std::isnan(ring) || std::isnan(time))return 1.0;
88 
89  if (ring > 1) {
90  B2ERROR("wrong ring input, choose 0 or 1");
91  return 1.0;
92  }
93 
94  unsigned int iv = ring * 3 + 1 ;
95  if (svar == "reso") iv = ring * 3 + 2 ;
96 
97  unsigned int sizev = m_injectionvar[iv].size(); //mean or reso
98  unsigned int sizet = m_injectionvar[ring * 3].size(); //time
99  if (sizet == 0 || sizev == 0) {
100  B2ERROR("calibration vectors are empty");
101  return 1.0;
102  }
103 
104  std::vector<unsigned int> tedges(sizet); //time edges array
105  std::copy(m_injectionvar[ring * 3].begin(), m_injectionvar[ring * 3].end(), tedges.begin());
106 
107  if (time >= 5e6)time = 5e6 - 10;
108 
109  unsigned int it = getTimeBin(tedges, time);
110  double center = 0.5 * (m_injectionvar[ring * 3].at(it) + m_injectionvar[ring * 3].at(it + 1));
111 
112  //no corr before veto bin (usually one or two starting bin)
113  //intrapolation for entire range except
114  //--extrapolation (for first half and last half of intended bin)
115  int thisbin = it, nextbin = it;
116  if (center != time && it > 0) {
117 
118  if (time < center) {
119  thisbin = it - 1;
120  } else {
121  if (it < sizet - 2)nextbin = it + 1;
122  else thisbin = it - 1;
123  }
124 
125  if (it <= 2) {
126  double diff = m_injectionvar[iv].at(2) - m_injectionvar[iv].at(1) ;
127  if (diff < -0.015) { //difference above 1.0%
128  thisbin = it;
129  if (it == 1) nextbin = it;
130  else nextbin = it + 1;
131  } else {
132  if (it == 1) {
133  thisbin = it;
134  nextbin = it + 1;
135  }
136  }
137  }
138  }
139 
140  double thisdedx = m_injectionvar[iv].at(thisbin);
141  double nextdedx = m_injectionvar[iv].at(nextbin);
142 
143  double thistime = 0.5 * (m_injectionvar[ring * 3].at(thisbin) + m_injectionvar[ring * 3].at(thisbin + 1));
144  double nexttime = 0.5 * (m_injectionvar[ring * 3].at(nextbin) + m_injectionvar[ring * 3].at(nextbin + 1));
145 
146  double newdedx = m_injectionvar[iv].at(it);
147  if (thisbin != nextbin)
148  newdedx = thisdedx + ((nextdedx - thisdedx) / (nexttime - thistime)) * (time - thistime);
149 
150  return newdedx;
151 }
unsigned int getTimeBin(const std::vector< unsigned int > &array, unsigned int value) const
Return time bin for the given time array.
void printCorrection(std::string svar, std::string sfx) const
Return dE/dx mean or norm-reso value for the given time and ring.
double getCorrection(std::string svar, unsigned int ring, unsigned int time) const
Return dE/dx mean or norm-reso value for the given time and ring.
std::vector< std::vector< double > > m_injectionvar
CDC dE/dx injection time payloads for dEdx mean and reso.
Abstract base class for different kinds of events.