131 cout <<
"CbmRichMirrorSortingAlignment: Event #" <<
fEventNb << endl;
132 TVector3 momentum, outPos;
133 Double_t constantePMT = 0., trackX = 0., trackY = 0.;
134 vector<Double_t> vect(2, 0), ptM(3, 0), ptC(3, 0), ptCIdeal(3, 0), ptR1(3, 0), ptR2Center(3, 0), ptR2Mirr(3, 0),
135 ptPR2(3, 0), ptPMirr(3, 0), normalPMT(3, 0);
137 ptC.at(0) = 0., ptC.at(1) = 132.594000, ptC.at(2) = 54.267226;
138 TVector3 mirrorPoint, dirCos,
pos;
139 Double_t nx = 0., ny = 0., nz = 0.;
144 cout <<
"Nb of rings in evt = " <<
fRichRings->GetEntriesFast() << endl << endl;
148 for (Int_t iGlobalTrack = 0; iGlobalTrack <
fGlobalTracks->GetEntriesFast(); iGlobalTrack++) {
157 cout <<
"Error richInd < 0" << endl;
162 cout <<
"Error ring == NULL!" << endl;
169 if (NULL == cbmRichTrackMatch) {
172 cout <<
"Nof true hits = " << cbmRichTrackMatch->
GetNofTrueHits() << endl;
173 cout <<
"Nof wrong hits = " << cbmRichTrackMatch->
GetNofWrongHits() << endl;
177 if (mcRichTrackId < 0)
continue;
179 if (mcStsTrackId != mcRichTrackId) {
180 cout <<
"Error StsTrackIndex and TrackIndex from Ring do not match!" << endl;
184 if (!mcTrack)
continue;
196 FairTrackParam* point = (FairTrackParam*)
fTrackParams->At(stsInd);
198 cout <<
"CbmRichMirrorSortingAlignment::Exec : pr = NULL." << endl;
201 trackX = pr->GetX(), trackY = pr->GetY();
202 cout <<
"Track: " << trackX <<
", " << trackY << endl;
208 Int_t pdg = TMath::Abs(mcTrack->
GetPdgCode());
209 if (trackMotherId == -1) {
212 for (Int_t iMirrPt = 0; iMirrPt <
fMirrorPoints->GetEntriesFast(); iMirrPt++) {
214 if (mirrPoint == 0) {
218 if (mirrPoint->GetTrackID() == mcRichTrackId) {
222 ptM.at(0) = mirrPoint->GetX(), ptM.at(1) = mirrPoint->GetY(), ptM.at(2) = mirrPoint->GetZ();
223 cout <<
"mirrPoint: {" << mirrPoint->GetX() <<
", " << mirrPoint->GetY() <<
", " << mirrPoint->GetZ() <<
"}"
226 mirrNode = gGeoManager->FindNode(ptM.at(0), ptM.at(1), ptM.at(2));
227 cout <<
"Mirror node name: " << mirrNode->GetName() <<
" and full path " << gGeoManager->GetPath() << endl;
228 string str1 = gGeoManager->GetPath(), str2 =
"mirror_tile_", str3 =
"";
229 cout <<
"str1 before CbmRichNavigationUtil::FindIntersection: " << str1 << endl;
232 cout <<
"str1 after CbmRichNavigationUtil::FindIntersection: " << str1 << endl;
234 std::size_t found = str1.find(str2);
235 if (found != std::string::npos) {
237 Int_t end = str2.length() + 3;
238 str3 = str1.substr(found, end);
240 cout <<
"Mirror ID: " << str3 << endl;
244 TGeoNavigator* navi = gGeoManager->GetCurrentNavigator();
246 ptCIdeal.at(0) = navi->GetCurrentMatrix()->GetTranslation()[0];
247 ptCIdeal.at(1) = navi->GetCurrentMatrix()->GetTranslation()[1];
248 ptCIdeal.at(2) = navi->GetCurrentMatrix()->GetTranslation()[2];
249 cout <<
"Sphere center coordinates of the aligned mirror tile, "
251 << ptCIdeal.at(0) <<
", " << ptCIdeal.at(1) <<
", " << ptCIdeal.at(2) <<
"}" << endl;
252 for (Int_t iRefPt = 0; iRefPt <
fRefPlanePoints->GetEntriesFast(); iRefPt++) {
255 if (refPlanePoint->GetTrackID() == mcRichTrackId) {
259 ptR1.at(0) = refPlanePoint->GetX(), ptR1.at(1) = refPlanePoint->GetY(), ptR1.at(2) = refPlanePoint->GetZ();
260 cout <<
"Refl plane point coo = {" << ptR1[0] <<
", " << ptR1[1] <<
", " << ptR1[2] <<
"}" << endl;
261 ComputeR2(ptR2Center, ptR2Mirr, ptM, ptC, ptR1, navi,
"Uncorrected");
262 ComputeP(ptPMirr, ptPR2, normalPMT, ptM, ptR2Mirr, constantePMT);
263 TVector3 inPos(ptPMirr.at(0), ptPMirr.at(1), ptPMirr.at(2));
264 cout <<
"inPos vector: " << inPos.x() <<
", " << inPos.y() <<
", " << inPos.z() << endl;
266 cout <<
"New PMT points coordinates = {" << outPos.x() <<
", " << outPos.y() <<
", " << outPos.z() <<
"}"
272 cout <<
"No mirror points registered." << endl;
276 cout <<
"Not a mother particle." << endl;
280 cout <<
"Key str: " << mirrorObject->
getMirrorId() << endl
288 cout <<
"CbmRichMirrorSortingAlignment::Exec No rings in event were found." << endl;
296 Int_t pmtTrackID, pmtMotherID;
297 Double_t buffNormX = 0., buffNormY = 0., buffNormZ = 0., k = 0., scalarProd = 0.;
298 Double_t pmtPt[] = {0., 0., 0.};
299 Double_t a[] = {0., 0., 0.}, b[] = {0., 0., 0.}, c[] = {0., 0., 0.};
307 for (Int_t iPmt = 0; iPmt < NofPMTPoints; iPmt++) {
309 pmtTrackID = pmtPoint->GetTrackID();
312 a[0] = pmtPoint->GetX(), a[1] = pmtPoint->GetY(), a[2] = pmtPoint->GetZ();
316 for (Int_t iPmt = 0; iPmt < NofPMTPoints; iPmt++) {
318 pmtTrackID = pmtPoint->GetTrackID();
322 if (TMath::Sqrt(TMath::Power(a[0] - pmtPoint->GetX(), 2) + TMath::Power(a[1] - pmtPoint->GetY(), 2)
323 + TMath::Power(a[2] - pmtPoint->GetZ(), 2))
325 b[0] = pmtPoint->GetX(), b[1] = pmtPoint->GetY(), b[2] = pmtPoint->GetZ();
330 for (Int_t iPmt = 0; iPmt < NofPMTPoints; iPmt++) {
332 pmtTrackID = pmtPoint->GetTrackID();
336 if (TMath::Sqrt(TMath::Power(a[0] - pmtPoint->GetX(), 2) + TMath::Power(a[1] - pmtPoint->GetY(), 2)
337 + TMath::Power(a[2] - pmtPoint->GetZ(), 2))
339 && TMath::Sqrt(TMath::Power(b[0] - pmtPoint->GetX(), 2) + TMath::Power(b[1] - pmtPoint->GetY(), 2)
340 + TMath::Power(b[2] - pmtPoint->GetZ(), 2))
342 c[0] = pmtPoint->GetX(), c[1] = pmtPoint->GetY(), c[2] = pmtPoint->GetZ();
348 k = (b[0] - a[0]) / (c[0] - a[0]);
349 if ((b[1] - a[1]) - (k * (c[1] - a[1])) == 0 || (b[2] - a[2]) - (k * (c[2] - a[2])) == 0) {
350 cout <<
"Error in normal calculation, vect_AB and vect_AC are collinear." << endl;
353 buffNormX = (b[1] - a[1]) * (c[2] - a[2]) - (b[2] - a[2]) * (c[1] - a[1]);
354 buffNormY = (b[2] - a[2]) * (c[0] - a[0]) - (b[0] - a[0]) * (c[2] - a[2]);
355 buffNormZ = (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
357 buffNormX / TMath::Sqrt(TMath::Power(buffNormX, 2) + TMath::Power(buffNormY, 2) + TMath::Power(buffNormZ, 2));
359 buffNormY / TMath::Sqrt(TMath::Power(buffNormX, 2) + TMath::Power(buffNormY, 2) + TMath::Power(buffNormZ, 2));
361 buffNormZ / TMath::Sqrt(TMath::Power(buffNormX, 2) + TMath::Power(buffNormY, 2) + TMath::Power(buffNormZ, 2));
365 scalarProd = normalPMT.at(0) * (pmtPoint1->GetX() - a[0]) + normalPMT.at(1) * (pmtPoint1->GetY() - a[1])
366 + normalPMT.at(2) * (pmtPoint1->GetZ() - a[2]);
371 * (normalPMT.at(0) * pmtPoint1->GetX() + normalPMT.at(1) * pmtPoint1->GetY() + normalPMT.at(2) * pmtPoint1->GetZ());
373 scalarProd = normalPMT.at(0) * (pmtPoint2->GetX() - a[0]) + normalPMT.at(1) * (pmtPoint2->GetY() - a[1])
374 + normalPMT.at(2) * (pmtPoint2->GetZ() - a[2]);
377 scalarProd = normalPMT.at(0) * (pmtPoint3->GetX() - a[0]) + normalPMT.at(1) * (pmtPoint3->GetY() - a[1])
378 + normalPMT.at(2) * (pmtPoint3->GetZ() - a[2]);
383 vector<Double_t> ptM, vector<Double_t> ptC, vector<Double_t> ptR1,
384 TGeoNavigator* navi, TString s)
388 vector<Double_t> normalMirr(3), ptCNew(3), ptTileCenter(3);
389 Double_t t1 = 0., t2 = 0., t3 = 0.;
391 if (s ==
"Corrected") {
394 vector<Double_t> outputFit(4);
397 TString str =
fOutputDir +
"/correction_table/correction_param.txt";
399 if (corrFile.is_open()) {
400 for (Int_t i = 0; i < 4; i++) {
401 corrFile >> outputFit.at(i);
406 cout <<
"Error in CbmRichCorrection: unable to open parameter file!" << endl;
407 cout <<
"Parameter file path = " << str << endl << endl;
414 ptCNew.at(0) = ptC.at(0) + outputFit.at(3);
415 ptCNew.at(1) = ptC.at(1) + outputFit.at(2);
416 ptCNew.at(2) = ptC.at(2);
417 ptTileCenter.at(0) = navi->GetMotherMatrix()->GetTranslation()[0];
418 ptTileCenter.at(1) = navi->GetMotherMatrix()->GetTranslation()[1];
419 ptTileCenter.at(2) = navi->GetMotherMatrix()->GetTranslation()[2];
421 Double_t
x = 0.,
y = 0., z = 0., dist = 0., dist2 = 0., z2 = 0.;
422 x = TMath::Power(ptCNew.at(0) - ptTileCenter.at(0), 2);
423 y = TMath::Power(ptCNew.at(1) - ptTileCenter.at(1), 2);
424 z = TMath::Power(ptCNew.at(2) - ptTileCenter.at(2), 2);
425 dist = TMath::Sqrt(
x +
y + z);
426 z2 = ptTileCenter.at(2) - TMath::Sqrt(TMath::Power(300, 2) -
x -
y) - ptCNew.at(2);
428 dist2 = TMath::Sqrt(
x +
y + TMath::Power(z2 - ptTileCenter.at(2), 2));
433 else if (s ==
"Uncorrected") {
444 normalMirr.at(0) = (ptCNew.at(0) - ptM.at(0))
445 / TMath::Sqrt(TMath::Power(ptCNew.at(0) - ptM.at(0), 2) + TMath::Power(ptCNew.at(1) - ptM.at(1), 2)
446 + TMath::Power(ptCNew.at(2) - ptM.at(2), 2));
447 normalMirr.at(1) = (ptCNew.at(1) - ptM.at(1))
448 / TMath::Sqrt(TMath::Power(ptCNew.at(0) - ptM.at(0), 2) + TMath::Power(ptCNew.at(1) - ptM.at(1), 2)
449 + TMath::Power(ptCNew.at(2) - ptM.at(2), 2));
450 normalMirr.at(2) = (ptCNew.at(2) - ptM.at(2))
451 / TMath::Sqrt(TMath::Power(ptCNew.at(0) - ptM.at(0), 2) + TMath::Power(ptCNew.at(1) - ptM.at(1), 2)
452 + TMath::Power(ptCNew.at(2) - ptM.at(2), 2));
455 t1 = ((ptR1.at(0) - ptM.at(0)) * (ptCNew.at(0) - ptM.at(0)) + (ptR1.at(1) - ptM.at(1)) * (ptCNew.at(1) - ptM.at(1))
456 + (ptR1.at(2) - ptM.at(2)) * (ptCNew.at(2) - ptM.at(2)))
457 / (TMath::Power(ptCNew.at(0) - ptM.at(0), 2) + TMath::Power(ptCNew.at(1) - ptM.at(1), 2)
458 + TMath::Power(ptCNew.at(2) - ptM.at(2), 2));
459 ptR2Center.at(0) = 2 * (ptM.at(0) + t1 * (ptCNew.at(0) - ptM.at(0))) - ptR1.at(0);
460 ptR2Center.at(1) = 2 * (ptM.at(1) + t1 * (ptCNew.at(1) - ptM.at(1))) - ptR1.at(1);
461 ptR2Center.at(2) = 2 * (ptM.at(2) + t1 * (ptCNew.at(2) - ptM.at(2))) - ptR1.at(2);
463 ((ptR1.at(0) - ptCNew.at(0)) * (ptCNew.at(0) - ptM.at(0)) + (ptR1.at(1) - ptCNew.at(1)) * (ptCNew.at(1) - ptM.at(1))
464 + (ptR1.at(2) - ptCNew.at(2)) * (ptCNew.at(2) - ptM.at(2)))
465 / (TMath::Power(ptCNew.at(0) - ptM.at(0), 2) + TMath::Power(ptCNew.at(1) - ptM.at(1), 2)
466 + TMath::Power(ptCNew.at(2) - ptM.at(2), 2));
467 ptR2Mirr.at(0) = 2 * (ptCNew.at(0) + t2 * (ptCNew.at(0) - ptM.at(0))) - ptR1.at(0);
468 ptR2Mirr.at(1) = 2 * (ptCNew.at(1) + t2 * (ptCNew.at(1) - ptM.at(1))) - ptR1.at(1);
469 ptR2Mirr.at(2) = 2 * (ptCNew.at(2) + t2 * (ptCNew.at(2) - ptM.at(2))) - ptR1.at(2);
484 vector<Double_t> normalPMT, vector<Double_t> ptM,
485 vector<Double_t> ptR2Mirr, Double_t constantePMT)
489 Double_t k1 = 0., k2 = 0., checkCalc1 = 0., checkCalc2 = 0.;
492 * ((normalPMT.at(0) * ptM.at(0) + normalPMT.at(1) * ptM.at(1) + normalPMT.at(2) * ptM.at(2) + constantePMT)
493 / (normalPMT.at(0) * (ptR2Mirr.at(0) - ptM.at(0)) + normalPMT.at(1) * (ptR2Mirr.at(1) - ptM.at(1))
494 + normalPMT.at(2) * (ptR2Mirr.at(2) - ptM.at(2))));
495 ptPMirr.at(0) = ptM.at(0) + k1 * (ptR2Mirr.at(0) - ptM.at(0));
496 ptPMirr.at(1) = ptM.at(1) + k1 * (ptR2Mirr.at(1) - ptM.at(1));
497 ptPMirr.at(2) = ptM.at(2) + k1 * (ptR2Mirr.at(2) - ptM.at(2));
499 * ((normalPMT.at(0) * ptR2Mirr.at(0) + normalPMT.at(1) * ptR2Mirr.at(1) + normalPMT.at(2) * ptR2Mirr.at(2)
501 / (normalPMT.at(0) * (ptR2Mirr.at(0) - ptM.at(0)) + normalPMT.at(1) * (ptR2Mirr.at(1) - ptM.at(1))
502 + normalPMT.at(2) * (ptR2Mirr.at(2) - ptM.at(2))));
503 ptPR2.at(0) = ptR2Mirr.at(0) + k2 * (ptR2Mirr.at(0) - ptM.at(0));
504 ptPR2.at(1) = ptR2Mirr.at(1) + k2 * (ptR2Mirr.at(1) - ptM.at(1));
505 ptPR2.at(2) = ptR2Mirr.at(2) + k2 * (ptR2Mirr.at(2) - ptM.at(2));
510 ptPMirr.at(0) * normalPMT.at(0) + ptPMirr.at(1) * normalPMT.at(1) + ptPMirr.at(2) * normalPMT.at(2) + constantePMT;
514 ptPR2.at(0) * normalPMT.at(0) + ptPR2.at(1) * normalPMT.at(1) + ptPR2.at(2) * normalPMT.at(2) + constantePMT;
519 std::map<string, TH2D*>& histoMap)
522 Double_t phi = 0., theta0 = 0., thetaCh = 0.;
524 for (std::map<
string, vector<CbmRichMirror*>>::iterator it = mirrorMap.begin(); it != mirrorMap.end(); ++it) {
526 string curMirrorId = it->first;
527 cout <<
"curMirrorId: '" << curMirrorId <<
"' and vector size: " << it->second.size() << endl;
528 vector<CbmRichMirror*> mirror = it->second;
529 if (curMirrorId !=
"" && it->second.size() >
fThreshold) {
530 histoMap[it->first] =
new TH2D(
string(
"CherenkovHitsDistribReduced_" + it->first).c_str(),
531 "CherenkovHitsDistribReduced;#Phi_{Ch} "
532 "[rad];#theta_{Ch}-#theta_{0} [cm];Entries",
533 200, -3.4, 3.4, 500, -6., 6.);
534 histoMap[it->first]->GetXaxis()->SetTitleSize(0.05);
535 histoMap[it->first]->GetXaxis()->SetTitleOffset(0.75);
536 histoMap[it->first]->GetYaxis()->SetTitleSize(0.04);
537 histoMap[it->first]->GetYaxis()->SetTitleOffset(1.2);
538 histoMap[it->first]->GetZaxis()->SetTitleSize(0.03);
539 histoMap[it->first]->GetZaxis()->SetTitleOffset(0.6);
540 for (
int i = 0; i < it->second.size(); i++) {
544 vector<Double_t> projHit = mirr->
getProjHit();
552 for (Int_t iH = 0; iH < ringL.
GetNofHits(); iH++) {
559 thetaCh =
sqrt(TMath::Power(projHit[0] - hit.
fX, 2) + TMath::Power(projHit[1] - hit.
fY, 2));
563 histoMap[it->first]->Fill(phi, thetaCh - theta0);
578 std::map<string, TH2D*> histoMap)
581 Double_t p1 = 0, p2 = 0, p3 = 0, chi2 = 0, focalLength = 150., q = 0., A = 0., alpha = 0., mis_x = 0., mis_y = 0.;
585 for (std::map<string, TH2D*>::iterator it = histoMap.begin(); it != histoMap.end(); ++it) {
586 if (it->first !=
"") {
587 TCanvas* can =
new TCanvas(
"can");
591 gStyle->SetOptStat(0);
593 TH2D* histo = it->second;
594 for (Int_t y_bin = 1; y_bin <= 500; y_bin++) {
595 for (Int_t x_bin = 1; x_bin <= 200; x_bin++) {
596 if (histo->GetBinContent(x_bin, y_bin) < thresh) {
597 histo->SetBinContent(x_bin, y_bin, 0);
602 histo->FitSlicesY(0, 0, -1, 1);
606 string histoName =
"CherenkovHitsDistribReduced_" + it->first +
"_1";
608 TH1D* histo_1 = gDirectory->Get<TH1D>((histoName).c_str());
609 histo_1->GetXaxis()->SetTitle(
"#Phi_{Ch} [rad]");
610 histo_1->GetYaxis()->SetTitle(
"#theta_{Ch}-#theta_{0} [cm]");
611 histo_1->GetXaxis()->SetTitleSize(0.05);
612 histo_1->GetXaxis()->SetTitleOffset(0.75);
613 histo_1->GetYaxis()->SetTitleSize(0.04);
614 histo_1->GetYaxis()->SetTitleOffset(1.2);
615 histo_1->Draw(
"HIST");
626 TF1* f1 =
new TF1(
"f1",
"[2]+[0]*cos(x)+[1]*sin(x)", -3.5, 3.5);
627 f1->SetParameters(0, 0, 0);
628 f1->SetParNames(
"Delta_phi",
"Delta_lambda",
"Offset");
629 histo_1->Fit(
"f1",
"",
"");
630 TF1* fit = histo_1->GetFunction(
"f1");
631 p1 = fit->GetParameter(
"Delta_phi"), p2 = fit->GetParameter(
"Delta_lambda"), p3 = fit->GetParameter(
"Offset"),
632 chi2 = fit->GetChisquare();
633 f1->SetParameters(fit->GetParameter(0), fit->GetParameter(1));
639 cout << setprecision(6) << endl;
640 q = TMath::ATan(fit->GetParameter(0) / fit->GetParameter(1));
643 A = fit->GetParameter(1) / TMath::Cos(q);
646 TMath::ATan(A / 1.5) * 0.5
651 mis_x = TMath::ATan(fit->GetParameter(1) / focalLength) * 0.5 * TMath::Power(10, 3);
652 mis_y = TMath::ATan(fit->GetParameter(0) / focalLength) * 0.5 * TMath::Power(10, 3);
653 cout <<
"Horizontal displacement = " << mis_x <<
" [mrad] and vertical displacement = " << mis_y <<
" [mrad]."
656 TLegend* LEG =
new TLegend(0.15, 0.25, 0.84, 0.4);
657 LEG->SetBorderSize(1);
658 LEG->SetFillColor(0);
660 LEG->SetTextSize(0.04);
661 sprintf(leg,
"Fitted sinusoid");
662 LEG->AddEntry(f1, leg,
"l");
663 sprintf(leg,
"Rotation angle around X = %.3f", -1 * mis_x);
664 LEG->AddEntry(
"", leg,
"l");
665 sprintf(leg,
"Rotation angle around Y = %.3f", mis_y);
666 LEG->AddEntry(
"", leg,
"l");
667 sprintf(leg,
"Offset = %.3f", fit->GetParameter(2));
668 LEG->AddEntry(
"", leg,
"l");
672 anglesMap[it->first].push_back(fit->GetParameter(1));
673 anglesMap[it->first].push_back(fit->GetParameter(0));
674 anglesMap[it->first].push_back(mis_x);
675 anglesMap[it->first].push_back(mis_y);
682 std::map<string, TH2D*> histoMap;
684 std::map<string, vector<Double_t>> anglesMap;
694 TString str_correction =
fOutputDir +
"/correction_table/correction_param_array.txt";
697 TString pathToCorrectionTable =
fOutputDir +
"/correction_table/";
698 gSystem->mkdir(pathToCorrectionTable,
true);
701 corrFile.open(str_correction, std::ofstream::trunc);
702 if (corrFile.is_open()) {
706 cout <<
"Error in CbmRichMirrorSortingAlignment::Finish ; unable to open "
712 for (std::map<
string, vector<Double_t>>::iterator it = anglesMap.begin(); it != anglesMap.end(); ++it) {
713 string mirrorId = it->first;
714 cout <<
"curMirrorId: " << mirrorId << endl;
715 vector<Double_t> misAngles = it->second;
716 cout <<
"mirror correction parameters infos: {" << misAngles[0] <<
", " << misAngles[1] <<
"}" << endl;
717 corrFile.open(str_correction, std::ofstream::app);
718 if (corrFile.is_open()) {
719 corrFile << mirrorId <<
"\n";
720 corrFile << setprecision(7) << misAngles[0] <<
"\n";
721 corrFile << setprecision(7) << misAngles[1] <<
"\n";
723 cout <<
"Wrote correction parameters to: " << str_correction << endl;
726 cout <<
"Error in CbmRichMirrorSortingAlignment::Finish ; unable to open "
733 TString str_angles =
fOutputDir +
"/correction_table/reconstructed_angles_array.txt";
735 anglesFile.open(str_angles, std::ofstream::trunc);
736 if (anglesFile.is_open()) {
740 cout <<
"Error in CbmRichMirrorSortingAlignment::Finish ; unable to open "
746 for (std::map<
string, vector<Double_t>>::iterator it = anglesMap.begin(); it != anglesMap.end(); ++it) {
747 string mirrorId = it->first;
748 cout <<
"curMirrorId: " << mirrorId << endl;
749 vector<Double_t> misAngles = it->second;
750 cout <<
"mirror reconstructed angles infos: {" << misAngles[2] <<
", " << misAngles[3] <<
"}" << endl;
751 anglesFile.open(str_angles, std::ofstream::app);
752 if (anglesFile.is_open()) {
753 anglesFile << mirrorId <<
"\n";
754 anglesFile << setprecision(7) << misAngles[2] <<
"\n";
755 anglesFile << setprecision(7) << misAngles[3] <<
"\n";
757 cout <<
"Wrote reconstructed angles to: " << str_angles << endl;
760 cout <<
"Error in CbmRichMirrorSortingAlignment::Finish ; unable to open "