File indexing completed on 2025-08-05 08:19:43
0001
0002 #include "mbd/MbdCalib.h"
0003 #include "mbd/MbdGeomV2.h"
0004
0005
0006 R__LOAD_LIBRARY(libmbd.so)
0007 R__LOAD_LIBRARY(libmbd_io.so)
0008
0009 int nruns = 0;
0010 MbdCalib *mcal{nullptr};
0011 MbdGeomV2 *mbdgeom{nullptr};
0012
0013 void read_calibgains(const char *fname)
0014 {
0015 mcal = new MbdCalib();
0016 mcal->Download_Gains( fname );
0017 }
0018
0019
0020 TGraphErrors *g_gains{nullptr};
0021 TGraphErrors *g_gainsbyhv[16]{nullptr};
0022
0023 double gmean(TGraph *g)
0024 {
0025 int n = g->GetN();
0026 Double_t *y = g->GetY();
0027 double sum = 0.;
0028 for (int i=0; i<n; i++)
0029 {
0030 sum += y[i];
0031 }
0032 double avg = sum / n;
0033
0034 return avg;
0035 }
0036
0037
0038
0039 void calcnew_gainsbyhvgroup(const char *fname = "results/54935/mbd_qfit.calib")
0040 {
0041 mbdgeom = new MbdGeomV2();
0042
0043 read_calibgains(fname);
0044
0045 TString name;
0046
0047 for (int ihv=0; ihv<16; ihv++)
0048 {
0049 name = "g_gainsbyhv"; name += ihv;
0050 g_gainsbyhv[ihv] = new TGraphErrors();
0051 g_gainsbyhv[ihv]->SetName( name );
0052 g_gainsbyhv[ihv]->SetLineColor( ihv%8 + 1 );
0053 g_gainsbyhv[ihv]->SetMarkerColor( ihv%8 + 1 );
0054
0055
0056
0057
0058
0059
0060
0061 g_gainsbyhv[ihv]->SetMarkerStyle( 20 );
0062 g_gainsbyhv[ihv]->GetHistogram()->SetXTitle( "hv groups" );
0063 g_gainsbyhv[ihv]->GetHistogram()->SetYTitle( "gain [ADC/mip]" );
0064 }
0065
0066
0067 int npmts = 0;
0068 std::array<double,16> gmin;
0069 std::array<double,16> gmax;
0070 std::array<int,16> minpmt;
0071 std::array<int,16> maxpmt;
0072 gmin.fill(1e9);
0073 gmax.fill(0);
0074 minpmt.fill(-1);
0075 maxpmt.fill(-1);
0076 std::multimap hvmap = mbdgeom->get_hvmap();
0077 for ( auto hv : hvmap )
0078 {
0079 int hvmod = hv.first;
0080 int pmt = hv.second;
0081 double gain = mcal->get_qgain( pmt );
0082 cout << hvmod << "\t" << pmt << "\t" << gain << endl;
0083
0084 int n = g_gainsbyhv[hvmod]->GetN();
0085 g_gainsbyhv[hvmod]->SetPoint(n,(double)npmts,gain);
0086
0087 if ( gain>gmax[hvmod] )
0088 {
0089 gmax[hvmod] = gain;
0090 maxpmt[hvmod] = pmt;
0091 }
0092 if ( gain<gmin[hvmod] )
0093 {
0094 gmin[hvmod] = gain;
0095 minpmt[hvmod] = pmt;
0096 }
0097
0098 npmts++;
0099 }
0100
0101 double& overall_gmin = *std::min_element(gmin.begin(), gmin.end());
0102 double& overall_gmax = *std::max_element(gmax.begin(), gmax.end());
0103
0104
0105 TCanvas *ac = new TCanvas("c_gainsbyhvmod","Gains by HV Mod",1250,600);
0106 g_gainsbyhv[0]->Draw("ap");
0107 g_gainsbyhv[0]->GetXaxis()->SetLimits(0,128);
0108 g_gainsbyhv[0]->SetMaximum( overall_gmax*1.1 );
0109 g_gainsbyhv[0]->SetMinimum( overall_gmin*0.9 );
0110 gPad->Modified();
0111 gPad->Update();
0112 for (int ihv=1; ihv<16; ihv++)
0113 {
0114 g_gainsbyhv[ihv]->Draw("p");
0115 }
0116
0117
0118
0119
0120 std::array<double,16> means;
0121 means.fill(0.);
0122
0123 cout << "means in each hv group" << endl;
0124 std::array<double,16> new_gmin;
0125 std::array<double,16> new_gmax;
0126 std::array<double,16> newscale;
0127 double overall_newgmin{1e9};
0128 double overall_newgmax{0};
0129 int minhvmod = -1;
0130 int maxhvmod = -1;
0131 for (int ihv=0; ihv<16; ihv++)
0132 {
0133 means[ihv] = gmean( g_gainsbyhv[ihv] );
0134 newscale[ihv] = means[0]/means[ihv];
0135 new_gmin[ihv] = gmin[ihv]*newscale[ihv];
0136 new_gmax[ihv] = gmax[ihv]*newscale[ihv];
0137 cout << ihv << "\t" << means[ihv] << "\t" << newscale[ihv] << "\t" << new_gmin[ihv] << endl;
0138
0139 if ( new_gmax[ihv]>overall_newgmax )
0140 {
0141 overall_newgmax = new_gmax[ihv];
0142 maxhvmod = ihv;
0143 }
0144 if ( new_gmin[ihv]<overall_newgmin )
0145 {
0146 overall_newgmin = new_gmin[ihv];
0147 minhvmod = ihv;
0148 }
0149 }
0150
0151 cout << "MIN " << minpmt[minhvmod] << "\t" << minhvmod << "\t" << new_gmin[minhvmod] << endl;
0152 cout << "MAX " << maxpmt[maxhvmod] << "\t" << maxhvmod << "\t" << new_gmax[maxhvmod] << endl;
0153 cout << "SPREAD " << new_gmax[maxhvmod]/new_gmin[minhvmod] << endl;
0154
0155
0156
0157
0158 double minscale = 80./overall_newgmin;
0159
0160 cout << "new means in each hv group" << endl;
0161 cout << "hvmod\tnewscale\tnew means [ADC/mip]" << endl;
0162 for (int ihv=0; ihv<16; ihv++)
0163 {
0164 newscale[ihv] *= minscale;
0165 cout << ihv << "\t" << newscale[ihv] << "\t" << means[ihv]*newscale[ihv] << endl;
0166 }
0167
0168
0169
0170 TCanvas *bc = new TCanvas("c_gaincurvesbyhvmod","Gain curves by hvmod",1200,1200);
0171 bc->Divide(4,4);
0172 TFile *gcurvefile = new TFile("SCAN/mbdlaser_202405151654.root");
0173 TGraphErrors *g_norm_laserscan[128]{nullptr};
0174 TGraph *ginv_norm_laserscan[128]{nullptr};
0175 for (int ipmt=0; ipmt<128; ipmt++)
0176 {
0177 name = "g_norm_laserscan"; name += ipmt;
0178 g_norm_laserscan[ipmt] = (TGraphErrors*)gcurvefile->Get( name );
0179 int n = g_norm_laserscan[ipmt]->GetN();
0180 double *x = g_norm_laserscan[ipmt]->GetX();
0181 double *y = g_norm_laserscan[ipmt]->GetY();
0182 ginv_norm_laserscan[ipmt] = new TGraph(n,y,x);
0183 name = "ginv_norm_laserscan"; name += ipmt;
0184 ginv_norm_laserscan[ipmt]->SetName( name );
0185 }
0186
0187 std::array<double,16> ref_hvsetting {
0188 0.758629, 0.762746, 0.804495, 0.7953, 0.766233, 0.818163, 0.797741, 0.775627,
0189 0.819641, 0.798468, 0.860734, 0.798129, 0.874018, 0.793739, 0.873797, 0.852621
0190 };
0191
0192 std::array<double,16> sumsetting;
0193 sumsetting.fill(0.);
0194 std::array<int,16> npmts_in_hvmod;
0195 npmts_in_hvmod.fill(0.);
0196 std::array<double,16> newsetting;
0197 newsetting.fill(0.);
0198
0199 for ( auto hv : hvmap )
0200 {
0201 int hvmod = hv.first;
0202 int pmt = hv.second;
0203
0204 bc->cd( hvmod+1 );
0205 if ( npmts_in_hvmod[hvmod] == 0 ) g_norm_laserscan[pmt]->Draw("acp");
0206 else g_norm_laserscan[pmt]->Draw("cp");
0207 ++npmts_in_hvmod[hvmod];
0208
0209
0210 double ref_gain = g_norm_laserscan[pmt]->Eval( ref_hvsetting[hvmod] );
0211 double target_gain = newscale[hvmod]*ref_gain;
0212
0213 sumsetting[hvmod] += ginv_norm_laserscan[pmt]->Eval( target_gain );
0214
0215 }
0216
0217 cout << "New Settings" << endl;
0218 for (int ihv=0; ihv<16; ihv++)
0219 {
0220 newsetting[ihv] = sumsetting[ihv]/npmts_in_hvmod[ihv];
0221 cout << ihv << "\t" << newsetting[ihv] << endl;
0222 }
0223
0224
0225 cout << "hvscale = [ ";
0226
0227 for (int ihv=8; ihv<16; ihv++)
0228 {
0229 cout << newsetting[ihv] << ", ";
0230 }
0231 for (int ihv=0; ihv<8; ihv++)
0232 {
0233 cout << newsetting[ihv] << ", ";
0234 }
0235 cout << " ]" << endl;
0236 }