189 for (int32_t iSmType = 0; iSmType < iNbSmTypes; iSmType++) {
192 fvCPTOff[iSmType].resize(iNbSm * iNbRpc);
195 fvCPWalk[iSmType].resize(iNbSm * iNbRpc);
196 fvCPTOffY[iSmType].resize(iNbSm * iNbRpc);
199 for (int32_t iSm = 0; iSm < iNbSm; iSm++) {
200 for (int32_t iRpc = 0; iRpc < iNbRpc; iRpc++) {
214 int32_t iNbChan =
fDigiBdfPar->GetNbChan(iSmType, iRpc);
215 fvCPTOff[iSmType][iSm * iNbRpc + iRpc].resize(iNbChan);
216 fvCPTotGain[iSmType][iSm * iNbRpc + iRpc].resize(iNbChan);
217 fvCPTotOff[iSmType][iSm * iNbRpc + iRpc].resize(iNbChan);
218 fvCPWalk[iSmType][iSm * iNbRpc + iRpc].resize(iNbChan);
219 int32_t nbSide = 2 -
fDigiBdfPar->GetChanType(iSmType, iRpc);
220 for (int32_t iCh = 0; iCh < iNbChan; iCh++) {
221 fvCPTOff[iSmType][iSm * iNbRpc + iRpc][iCh].resize(nbSide);
222 fvCPTotGain[iSmType][iSm * iNbRpc + iRpc][iCh].resize(nbSide);
223 fvCPTotOff[iSmType][iSm * iNbRpc + iRpc][iCh].resize(nbSide);
224 fvCPWalk[iSmType][iSm * iNbRpc + iRpc][iCh].resize(nbSide);
225 for (int32_t iSide = 0; iSide < nbSide; iSide++) {
226 fvCPTOff[iSmType][iSm * iNbRpc + iRpc][iCh][iSide] = 0.;
227 fvCPTotGain[iSmType][iSm * iNbRpc + iRpc][iCh][iSide] = 1.;
228 fvCPTotOff[iSmType][iSm * iNbRpc + iRpc][iCh][iSide] = 0.;
231 fvCPWalk[iSmType][iSm * iNbRpc + iRpc][iCh][iSide][iWx] = 0.;
238 LOG(info) <<
"CbmTaskTofClusterizerParWrite::InitCalibParameter: defaults set";
246 TFile* oldFile = gFile;
247 TDirectory* oldDir = gDirectory;
249 LOG(info) <<
"CbmTaskTofClusterizerParWrite::InitCalibParameter: read histos from "
256 if (NULL == calParFile) {
262 if (NULL == calParFile)
263 LOG(fatal) <<
"CbmTaskTofClusterizerParWrite::InitCalibParameter: "
268 LOG(fatal) <<
"Calibration parameter file not existing!";
271 for (int32_t iSmType = 0; iSmType < iNbSmTypes; iSmType++) {
274 TProfile*
hSvel = (TProfile*) gDirectory->FindObjectAny(Form(
"cl_SmT%01d_Svel", iSmType));
275 for (int32_t iSm = 0; iSm < iNbSm; iSm++)
276 for (int32_t iRpc = 0; iRpc < iNbRpc; iRpc++) {
278 std::vector<std::vector<double>>& vCPTotGain =
fvCPTotGain[iSmType][iSm * iNbRpc + iRpc];
279 std::vector<std::vector<double>>& vCPTOff =
fvCPTOff[iSmType][iSm * iNbRpc + iRpc];
280 std::vector<std::vector<double>>& vCPTotOff =
fvCPTotOff[iSmType][iSm * iNbRpc + iRpc];
281 std::vector<std::vector<std::vector<double>>>& vCPWalk =
fvCPWalk[iSmType][iSm * iNbRpc + iRpc];
283 std::vector<double>& vCPTOffY =
fvCPTOffY[iSmType][iSm * iNbRpc + iRpc];
285 double& vCPTOffYRange =
fvCPTOffYRange[iSmType][iSm * iNbRpc + iRpc];
289 double Vscal =
hSvel->GetBinContent(iSm * iNbRpc + iRpc + 1);
290 if (Vscal == 0.) Vscal = 1.;
293 LOG(info) <<
"Modify " << iSmType << iSm << iRpc <<
" Svel by " << Vscal <<
" to "
297 (TH2D*) gDirectory->FindObjectAny(Form(
"cl_CorSmT%01d_sm%03d_rpc%03d_Pos_pfx", iSmType, iSm, iRpc));
298 TH2D* htempTOff_pfx =
299 (TH2D*) gDirectory->FindObjectAny(Form(
"cl_CorSmT%01d_sm%03d_rpc%03d_TOff_pfx", iSmType, iSm, iRpc));
300 TH1D* htempTot_Mean =
301 (TH1D*) gDirectory->FindObjectAny(Form(
"cl_CorSmT%01d_sm%03d_rpc%03d_Tot_Mean", iSmType, iSm, iRpc));
303 (TH1D*) gDirectory->FindObjectAny(Form(
"cl_CorSmT%01d_sm%03d_rpc%03d_Tot_Off", iSmType, iSm, iRpc));
304 if (NULL != htempPos_pfx && NULL != htempTOff_pfx && NULL != htempTot_Mean && NULL != htempTot_Off) {
305 int32_t iNbCh =
fDigiBdfPar->GetNbChan(iSmType, iRpc);
307 for (int32_t iCh = 0; iCh < iNbCh; iCh++) {
308 for (int32_t iSide = 0; iSide < 2; iSide++) {
309 double TotMean = htempTot_Mean->GetBinContent(iCh * 2 + 1 + iSide);
310 if (0.001 < TotMean) {
311 vCPTotGain[iCh][iSide] *=
fdTTotMean / TotMean;
313 vCPTotOff[iCh][iSide] = htempTot_Off->GetBinContent(iCh * 2 + 1 + iSide);
315 double YMean = ((TProfile*) htempPos_pfx)->GetBinContent(iCh + 1);
316 double TMean = ((TProfile*) htempTOff_pfx)->GetBinContent(iCh + 1);
317 if (std::isnan(YMean) || std::isnan(TMean)) {
318 LOG(warn) <<
"Invalid calibration for TSRC " << iSmType << iSm << iRpc << iCh <<
", use default!";
321 double dTYOff = YMean /
fDigiBdfPar->GetSigVel(iSmType, iSm, iRpc);
322 if (5 == iSmType || 8 == iSmType) dTYOff = 0.;
323 vCPTOff[iCh][0] += -dTYOff + TMean;
324 vCPTOff[iCh][1] += +dTYOff + TMean;
326 if (5 == iSmType || 8 == iSmType) {
327 vCPTOff[iCh][1] = vCPTOff[iCh][0];
328 vCPTotGain[iCh][1] = vCPTotGain[iCh][0];
329 vCPTotOff[iCh][1] = vCPTotOff[iCh][0];
332 if (iSmType == 0 && iSm == 2 && iRpc == 0)
334 LOG(info) <<
"InitCalibParameter:"
335 <<
" TSRC " << iSmType << iSm << iRpc << iCh
336 << Form(
": YMean %6.3f, TYOff %6.3f, TMean %6.3f", YMean, dTYOff, TMean) <<
" -> "
337 << Form(
" TOff %f, %f, TotG %f, %f ", vCPTOff[iCh][0], vCPTOff[iCh][1], vCPTotGain[iCh][0],
340 TH1D* htempWalk0 = (TH1D*) gDirectory->FindObjectAny(
341 Form(
"Cor_SmT%01d_sm%03d_rpc%03d_Ch%03d_S0_Walk_px", iSmType, iSm, iRpc, iCh));
342 TH1D* htempWalk1 = (TH1D*) gDirectory->FindObjectAny(
343 Form(
"Cor_SmT%01d_sm%03d_rpc%03d_Ch%03d_S1_Walk_px", iSmType, iSm, iRpc, iCh));
344 if (NULL == htempWalk0 && NULL == htempWalk1) {
346 htempWalk0 =
new TH1D(Form(
"Cor_SmT%01d_sm%03d_rpc%03d_Ch%03d_S0_Walk_px", iSmType, iSm, iRpc, iCh),
347 Form(
"Walk in SmT%01d_sm%03d_rpc%03d_Ch%03d_S%01d_Walk; Tot [a.u.]; #DeltaT [ns]",
348 iSmType, iSm, iRpc, iCh, iSide),
351 htempWalk1 =
new TH1D(Form(
"Cor_SmT%01d_sm%03d_rpc%03d_Ch%03d_S0_Walk_px", iSmType, iSm, iRpc, iCh),
352 Form(
"Walk in SmT%01d_sm%03d_rpc%03d_Ch%03d_S%01d_Walk; Tot [a.u.]; #DeltaT [ns]",
353 iSmType, iSm, iRpc, iCh, iSide),
356 if (NULL != htempWalk0 && NULL != htempWalk1) {
357 LOG(debug) <<
"Initialize Walk correction for "
358 << Form(
" SmT%01d_sm%03d_rpc%03d_Ch%03d", iSmType, iSm, iRpc, iCh);
360 LOG(error) <<
"CbmTaskTofClusterizerParWrite::InitCalibParameter: "
361 "Inconsistent Walk histograms";
363 vCPWalk[iCh][0][iBin] = htempWalk0->GetBinContent(iBin + 1);
364 vCPWalk[iCh][1][iBin] = htempWalk1->GetBinContent(iBin + 1);
365 if (iSmType == 0 && iSm == 0 && iRpc == 2 && iCh == 15)
366 LOG(info) << Form(
"Read new SmT%01d_sm%03d_rpc%03d_Ch%03d bin %d cen %f walk %f %f", iSmType, iSm,
367 iRpc, iCh, iBin, htempWalk0->GetBinCenter(iBin + 1), vCPWalk[iCh][0][iBin],
368 vCPWalk[iCh][1][iBin]);
369 if (5 == iSmType || 8 == iSmType) {
370 if (vCPWalk[iCh][1][iBin] != vCPWalk[iCh][0][iBin]) {
371 LOG(fatal) <<
"Inconsisten walk values for TSRC " << iSmType << iSm << iRpc << iCh <<
", Bin "
372 << iBin <<
": " << vCPWalk[iCh][0][iBin] <<
", " << vCPWalk[iCh][1][iBin];
374 vCPWalk[iCh][1][iBin] = vCPWalk[iCh][0][iBin];
375 htempWalk1->SetBinContent(iBin + 1, vCPWalk[iCh][1][iBin]);
380 LOG(info) <<
"No Walk histograms for TSRC " << iSmType << iSm << iRpc << iCh;
384 LOG(info) <<
"Check for TCorY in " << gDirectory->GetName();
386 (TH1*) gDirectory->FindObjectAny(Form(
"calXY_SmT%d_sm%03d_rpc%03d_TOff_z_all_TcorY", iSmType, iSm, iRpc));
387 if (NULL != hTCorY) {
388 vCPTOffYBinWidth = hTCorY->GetBinWidth(0);
389 vCPTOffYRange = hTCorY->GetXaxis()->GetXmax();
390 LOG(info) <<
"Initialize TCorY: TSR " << iSmType << iSm << iRpc <<
", Bwid " << vCPTOffYBinWidth
391 <<
", Range " << vCPTOffYRange;
392 vCPTOffY.resize(hTCorY->GetNbinsX());
393 for (
int iB = 0; iB < hTCorY->GetNbinsX(); iB++) {
394 vCPTOffY[iB] = hTCorY->GetBinContent(iB + 1);
399 LOG(warning) <<
" Calibration histos " << Form(
"cl_SmT%01d_sm%03d_rpc%03d_XXX", iSmType, iSm, iRpc)
409 LOG(info) <<
"CbmTaskTofClusterizerParWrite::InitCalibParameter: initialization done";
421 gGeoManager->CdTop();
426 std::map<uint32_t, uint32_t> detIdIndexMap;
427 for (int32_t ind = 0; ind <
fDigiBdfPar->GetNbDet(); ind++) {
429 detIdIndexMap[iUniqueId] = ind;
435 setup.
rpcs.resize(iNbSmTypes);
437 for (int32_t iSmType = 0; iSmType < iNbSmTypes; iSmType++) {
441 setup.
NbSm.push_back(iNbSm);
442 setup.
NbRpc.push_back(iNbRpc);
444 setup.
rpcs[iSmType].resize(iNbSm * iNbRpc);
446 for (int32_t iSm = 0; iSm < iNbSm; iSm++) {
447 for (int32_t iRpc = 0; iRpc < iNbRpc; iRpc++) {
455 if (channelInfo ==
nullptr) {
460 gGeoManager->FindNode(channelInfo->
GetX(), channelInfo->
GetY(), channelInfo->
GetZ());
461 const double* tra_ptr = gGeoManager->MakePhysicalNode()->GetMatrix()->GetTranslation();
462 const double* rot_ptr = gGeoManager->GetCurrentMatrix()->GetRotationMatrix();
464 memcpy(par.
cell.
rotation.data(), rot_ptr, 9 *
sizeof(
double));
472 const int32_t iDetIndx = detIdIndexMap[iDetId];
484 int32_t iNbChan =
fDigiBdfPar->GetNbChan(iSmType, iRpc);
487 for (int32_t iCh = 0; iCh < iNbChan; iCh++) {
493 setup.
rpcs[iSmType][iSm * iNbRpc + iRpc] = par;
501 calib.
rpcs.resize(iNbSmTypes);
503 for (int32_t iSmType = 0; iSmType < iNbSmTypes; iSmType++) {
506 calib.
NbSm.push_back(iNbSm);
507 calib.
NbRpc.push_back(iNbRpc);
508 calib.
rpcs[iSmType].resize(iNbSm * iNbRpc);
510 for (int32_t iSm = 0; iSm < iNbSm; iSm++) {
511 for (int32_t iRpc = 0; iRpc < iNbRpc; iRpc++) {
520 int32_t iNbChan =
fDigiBdfPar->GetNbChan(iSmType, iRpc);
523 for (int32_t iCh = 0; iCh < iNbChan; iCh++) {
531 calib.
rpcs[iSmType][iSm * iNbRpc + iRpc] = par;
539 namespace fs = boost::filesystem;
543 std::ofstream fout((dirPath /
"TofHitfinderPar.yaml").
string());
547 std::ofstream fcalout((dirPath /
"TofCalibratePar.yaml").
string());
548 fcalout << dump(calib);