62 std::cout <<
"init init" << std::endl;
64 FairRootManager* rm = FairRootManager::Instance();
76 fPmt = (TClonesArray*)rm->GetObject(
"NeulandCalData");
83 for (Int_t pln = 0; pln < fNofPlanes; pln++)
85 for (Int_t bar = 0; bar < fNofBarsPerPlane; bar++)
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);
113 iteration[pln][bar][pmt] = 0;
114 esum[pln][bar][pmt] = 0.;
115 ealt[pln][bar][pmt] = 0.;
130 Double_t maxhv = 1400;
138 if (header->GetTrigger() != fTrigger)
144 Int_t nHits = fPmt->GetEntries();
146 Int_t checkiteration = 0;
148 for (Int_t pln = 0; pln < fNofPlanes; pln++)
150 for (Int_t bar = 0; bar < fNofBarsPerPlane; bar++)
152 for (Int_t pmt = 0; pmt < 2; pmt++)
154 if (iteration[pln][bar][pmt] == MAX_STEPS)
164 if (checkiteration == fNofPMTs)
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();
186 hCosmicPeak[iPlane][iBar][iSide]->Fill(fCharge);
189 if (hCosmicPeak[iPlane][iBar][iSide]->GetEntries() > fNEventsNeeded &&
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;
212 Double_t e = xtarget - getcosmicpeak(hCosmicPeak[iPlane][iBar][iSide]);
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();
234 hCosmicPeak[iPlane][iBar][iSide]->Reset();
235 iteration[iPlane][iBar][iSide]++;
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();
266 hCosmicPeak[iPlane][iBar][iSide]->Reset();
267 iteration[iPlane][iBar][iSide]++;
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;