62 std::cout <<
"init init" << std::endl;
64 FairRootManager* rm = FairRootManager::Instance();
76 fPmt = (TClonesArray*)rm->GetObject(
"NeulandCalData");
87 for (Int_t pmt = 0; pmt < 2; pmt++)
90 std::ostringstream oss;
91 oss <<
"r3b:nl:hv:p" << pln + 1 <<
"b" << bar + 1 <<
"t" << pmt + 1;
93 auto vmon = oss.str() +
":vmon";
94 auto vtarget = oss.str() +
":vtarget";
96 auto& entry =
ca[pln][bar][pmt];
97 entry.group =
epics.CreateGroup();
99 entry.vmon = entry.group->CreateChannel(
vmon);
100 entry.vtarget = entry.group->CreateChannel(
vtarget);
103 entry.group->Fetch();
104 hv[pln][bar][pmt] = entry.vmon->Get();
107 std::ostringstream hss;
108 hss <<
"h_p" << pln + 1 <<
"b" << bar + 1 <<
"t" << pmt + 1;
110 TString hname = hss.str();
111 hCosmicPeak[pln][bar][pmt] =
new TH1F(hname, hname, 300, 0, 600);
114 esum[pln][bar][pmt] = 0.;
115 ealt[pln][bar][pmt] = 0.;
130 Double_t maxhv = 1400;
144 Int_t nHits =
fPmt->GetEntries();
146 Int_t checkiteration = 0;
152 for (Int_t pmt = 0; pmt < 2; pmt++)
154 if (
iteration[pln][bar][pmt] == MAX_STEPS)
172 for (Int_t i = 0; i < nHits; i++)
180 Int_t iPlane = (hit->
GetBarId() - 1) / 50;
181 Int_t iBar = (hit->
GetBarId() - 1) % 50;
182 Int_t iSide = hit->
GetSide() - 1;
183 Double_t fCharge = hit->
GetQdc();
190 iteration[iPlane][iBar][iSide] < MAX_STEPS)
192 Int_t a =
hCosmicPeak[iPlane][iBar][iSide]->GetEntries();
193 Int_t b =
iteration[iPlane][iBar][iSide];
194 std::cout <<
"Iteration: " <<
iteration[iPlane][iBar][iSide] << std::endl;
196 std::ofstream hv_file(
"gainmatched_hv.txt", std::ios::app);
201 auto& hventry =
ca[iPlane][iBar][iSide];
206 xtarget = xtargetp1 * 1.16;
213 if (e == xtarget - 10000)
216 if (
hv[iPlane][iBar][iSide] < starthv &&
hv[iPlane][iBar][iSide] >= starthv - 200)
218 std::cout <<
"failed, try again with same hv" << std::endl;
222 hv[iPlane][iBar][iSide] = starthv;
223 std::cout <<
"failed, back to start hv: " <<
hv[iPlane][iBar][iSide] << std::endl;
229 if (
hv[iPlane][iBar][iSide] >= 0 &&
hv[iPlane][iBar][iSide] <= maxhv)
231 hventry.vtarget->Set(
hv[iPlane][iBar][iSide]);
232 hventry.group->Commit();
237 else if ((e <= xtarget * accuracy) && (e >= -xtarget * accuracy))
240 newhv =
hv[iPlane][iBar][iSide];
241 std::cout <<
"Matching for this pm finished. New HV: " << newhv << std::endl;
242 iteration[iPlane][iBar][iSide] = MAX_STEPS;
247 esum[iPlane][iBar][iSide] =
esum[iPlane][iBar][iSide] + e;
248 hventry.group->Fetch();
249 std::cout <<
"old hv: " << hventry.vmon->Get() << std::endl;
250 std::cout <<
"p" << iPlane + 1 <<
"b" << iBar + 1 <<
"t" << iSide + 1 <<
" e: " << e
251 <<
" esum: " <<
esum[iPlane][iBar][iSide] <<
" ealt: " <<
ealt[iPlane][iBar][iSide]
254 hv[iPlane][iBar][iSide] =
hv[iPlane][iBar][iSide] + Kp * e + Ki * Ta *
esum[iPlane][iBar][iSide] +
255 Kd * (e -
ealt[iPlane][iBar][iSide]) / Ta;
256 ealt[iPlane][iBar][iSide] = e;
257 std::cout <<
"new hv: " <<
hv[iPlane][iBar][iSide] << std::endl;
261 if (
hv[iPlane][iBar][iSide] >= 0 &&
hv[iPlane][iBar][iSide] <= maxhv)
263 hventry.vtarget->Set(
hv[iPlane][iBar][iSide]);
264 hventry.group->Commit();
269 if (
iteration[iPlane][iBar][iSide] == MAX_STEPS)
274 if ((e <= xtarget * accuracy * 5) && (e >= -xtarget * accuracy * 5))
277 <<
"Reached max steps but last check was already inside 5% accuracy. Taking last hv value."
279 newhv =
hv[iPlane][iBar][iSide];
283 std::cout <<
"Error, check matching by hand. Voltage set to default value" << std::endl;
285 hventry.vtarget->Set(newhv);
286 hventry.group->Commit();
289 hv_file <<
"caput r3b:nl:hv:p" << iPlane + 1 <<
"b" << iBar + 1 <<
"t" << iSide + 1 <<
":vtarget "
290 << newhv <<
" " <<
peakmethod <<
" " << b << std::endl;
307 for (Int_t q = 0; q < 5; q++)
327 hin->GetXaxis()->SetRange(LGETCOS, HGETCOS);
328 max = hin->GetMaximumBin();
329 for (
int k = 0; k < 5; k++)
331 fitgaus =
new TF1(
"fitgaus",
"gaus(0)", max - (10 + k * 3), max + (40 + k * 5));
332 fitgaus->SetParameters(200, max, 20);
333 hin->Fit(
"fitgaus",
"QR0");
334 xpf = fitgaus->GetParameter(1);
335 sig = fitgaus->GetParameter(2);
337 if (70 < xpf && xpf < 180 && 10 < sig && sig < 50)
340 std::cout <<
"Found cosmic peak by gaus fitting at x = " << xp << std::endl;
347 if (70 < max && max < 180)
350 std::cout <<
"Using maximum bin as cosmic peak position at x = " << xp << std::endl;
354 hin->GetXaxis()->SetRange(1, 600);
364 TSpectrum* s =
new TSpectrum(3);
365 Int_t nfound = s->Search(hin, width,
"", 0.05);
366 std::cout <<
"searchcosmicpeak: Found " << nfound <<
" candidate peaks" << std::endl;
368 Double_t* xpeaks = s->GetPositionX();
369 for (Int_t p = 0; p < nfound; p++)
372 if (75 < xpeaks[p] && xpeaks[p] < 180)
375 std::cout <<
"searchcosmicpeak: Found cosmic peak at x = " << xp << std::endl;
386 Int_t max = hin->GetMaximumBin();
387 hin->GetXaxis()->SetRange(LSEARCHNB, HSEARCHNB);
389 TSpectrum* s =
new TSpectrum(3);
390 Int_t nfound = s->Search(hin, width,
"nobackground new", 0.05);
394 std::cout <<
"searchcosmicpeakNB: Found " << nfound <<
" candidate peaks" << std::endl;
395 std::cout <<
"searchcosmicpeakNB: maximum bin content at = " << max << std::endl;
396 Double_t* xpeaks = s->GetPositionX();
397 for (Int_t p = 0; p < nfound; p++)
399 std::cout <<
"Peak " << p <<
" at x=" << xpeaks[p] << std::endl;
400 if (LSEARCHNB < xpeaks[p] && xpeaks[p] < HSEARCHNB)
403 diff = abs(xpeaks[p] - max);
404 std::cout <<
"searchcosmicpeakNB: diff = " << diff << std::endl;
413 std::cout <<
"searchcosmicpeakNB: diff = " << diff << std::endl;
414 std::cout <<
"searchcosmicpeakNB: difflast = " << difflast << std::endl;
423 std::cout <<
"searchcosmicpeakNB: Chose cosmic peak at x = " << xp << std::endl;
426 hin->GetXaxis()->SetRange(1, 600);