94 const int fgSNDetElemCh[11] = {0, 4, 8, 12, 16, 34, 52, 78, 104, 130, 156};
96 9, 9, 9, 13, 13, 13, 13, 13, 13, 13, 13};
97 const int fgSNDetElemHalfCh[21] = {0, 3, 6, 9, 12, 15, 18, 21, 24, 34, 44, 54, 64,
98 78, 92, 106, 120, 134, 148, 162, 176};
101 {100, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
102 {101, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
104 {200, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
105 {201, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
107 {300, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
108 {301, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
110 {400, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
111 {401, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
113 {500, 501, 502, 503, 504, 514, 515, 516, 517, 0, 0, 0, 0},
114 {505, 506, 507, 508, 509, 510, 511, 512, 513, 0, 0, 0, 0},
116 {600, 601, 602, 603, 604, 614, 615, 616, 617, 0, 0, 0, 0},
117 {605, 606, 607, 608, 609, 610, 611, 612, 613, 0, 0, 0, 0},
119 {700, 701, 702, 703, 704, 705, 706, 720, 721, 722, 723, 724, 725},
120 {707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719},
122 {800, 801, 802, 803, 804, 805, 806, 820, 821, 822, 823, 824, 825},
123 {807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819},
125 {900, 901, 902, 903, 904, 905, 906, 920, 921, 922, 923, 924, 925},
126 {907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919},
128 {1000, 1001, 1002, 1003, 1004, 1005, 1006, 1020, 1021, 1022, 1023, 1024, 1025},
129 {1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019}
136 constexpr double pi() {
return 3.14159265358979323846; }
145 LOG(info) <<
"Initializing aligner";
148 int numberOfGlobalParam = 624;
149 double default_value = 0;
150 params = std::vector<double>(numberOfGlobalParam, default_value);
151 errors = std::vector<double>(numberOfGlobalParam, default_value);
152 pulls = std::vector<double>(numberOfGlobalParam, default_value);
156 LOG(info) <<
"Alignment mode";
158 LOG(info) <<
"No alignment mode, only residuals will be stored";
161 doReAlign = ic.
options().
get<
bool>(
"do-realign");
164 LOG(info) <<
"Loading magnetic field and reference geometry from CCDB";
168 LOG(info) <<
"Loading magnetic field and reference geometry from input files";
170 auto grpFile = ic.
options().
get<
string>(
"grp-file");
171 if (std::filesystem::exists(grpFile)) {
178 LOG(fatal) <<
"No GRP file";
181 IdealGeoFileName = ic.
options().
get<
string>(
"geo-file-ideal");
182 if (std::filesystem::exists(IdealGeoFileName)) {
185 for (
int i = 0;
i < 156;
i++) {
186 int iDEN = GetDetElemId(
i);
187 transformIdeal[iDEN] = transformation(iDEN);
190 LOG(fatal) <<
"No ideal geometry";
193 RefGeoFileName = ic.
options().
get<
string>(
"geo-file-ref");
194 if (std::filesystem::exists(RefGeoFileName)) {
197 for (
int i = 0;
i < 156;
i++) {
198 int iDEN = GetDetElemId(
i);
199 transformRef[iDEN] = transformation(iDEN);
202 LOG(fatal) <<
"No reference geometry";
206 LOG(info) <<
"Re-alignment mode";
207 LOG(info) <<
"Loading re-alignment geometry";
208 NewGeoFileName = ic.
options().
get<
string>(
"geo-file-new");
209 if (std::filesystem::exists(NewGeoFileName)) {
212 for (
int i = 0;
i < 156;
i++) {
213 int iDEN = GetDetElemId(
i);
214 transformNew[iDEN] = transformation(iDEN);
217 LOG(fatal) <<
"No re-alignment geometry";
222 auto doEvaluation = ic.
options().
get<
bool>(
"do-evaluation");
226 auto AllowX = ic.
options().
get<
float>(
"variation-x");
227 auto AllowY = ic.
options().
get<
float>(
"variation-y");
228 auto AllowPhi = ic.
options().
get<
float>(
"variation-phi");
229 auto AllowZ = ic.
options().
get<
float>(
"variation-z");
236 auto SigmaX = ic.
options().
get<
float>(
"sigma-x");
237 auto SigmaY = ic.
options().
get<
float>(
"sigma-y");
243 trackFitter.
setChamberResolution(trackerParam.chamberResolutionX, trackerParam.chamberResolutionY);
246 mImproveCutChi2 = 2. * trackerParam.sigmaCutForImprovement * trackerParam.sigmaCutForImprovement;
249 TString chambersString = ic.
options().
get<
string>(
"fix-chamber");
250 std::unique_ptr<TObjArray> objArray(chambersString.Tokenize(
","));
251 if (objArray->GetEntries() > 0) {
252 for (
int iVar = 0; iVar < objArray->GetEntries(); ++iVar) {
253 LOG(info) << Form(
"%s%d",
"Fixing chamber: ", std::stoi(objArray->At(iVar)->GetName()));
254 mAlign.
FixChamber(std::stoi(objArray->At(iVar)->GetName()));
259 TString DEString = ic.
options().
get<
string>(
"fix-de");
260 TString MaskDEString = ic.
options().
get<
string>(
"mask-fix-de");
261 std::unique_ptr<TObjArray> objArrayDE(DEString.Tokenize(
","));
262 std::unique_ptr<TObjArray> objArrayMask(MaskDEString.Tokenize(
","));
263 if (objArrayDE->GetEntries() > 0) {
264 if (objArrayDE->GetEntries() != objArrayMask->GetEntries()) {
265 LOG(fatal) <<
"Inconsistent size of DEs and Masks!";
267 for (
int iVar = 0; iVar < objArrayDE->GetEntries(); ++iVar) {
268 LOG(info) << Form(
"%s%d%s%d",
"Fixing DE: ", std::stoi(objArrayDE->At(iVar)->GetName()),
" with mask: ", std::stoi(objArrayMask->At(iVar)->GetName()));
269 mAlign.
FixDetElem(std::stoi(objArrayDE->At(iVar)->GetName()), std::stoi(objArrayMask->At(iVar)->GetName()));
273 doMatched = ic.
options().
get<
bool>(
"matched");
274 outFileName = ic.
options().
get<
string>(
"output");
275 readFromRec = ic.
options().
get<
bool>(
"use-record");
279 LOG(info) <<
"Reading records as input";
284 LOG(info) <<
"Alignment duration = " << mElapsedTime.count() <<
" s";
301 LOG(info) <<
"Loading reference geometry from CCDB";
303 for (
int i = 0;
i < 156;
i++) {
304 int iDEN = GetDetElemId(
i);
305 transformRef[iDEN] = transformation(iDEN);
313 vector<dataformats::TrackMCHMID>& muonTracks)
316 for (
const auto& mchROF :
mchROFs) {
318 for (
int iMCHTrack = mchROF.getFirstIdx();
319 iMCHTrack <= mchROF.getLastIdx(); ++iMCHTrack) {
321 if (!FindMuon(iMCHTrack, muonTracks)) {
325 auto mchTrack = mchTracks.at(iMCHTrack);
326 int id_track = iMCHTrack;
327 int nb_clusters = mchTrack.getNClusters();
330 if (nb_clusters <= 9) {
335 mch::Track convertedTrack = MCHFormatConvert(mchTrack, mchClusters, doReAlign);
338 if (RemoveTrack(convertedTrack)) {
343 mAlign.
ProcessTrack(convertedTrack, transformation, doAlign, weightRecord);
353 for (
const auto& mchROF :
mchROFs) {
355 for (
int iMCHTrack = mchROF.getFirstIdx();
356 iMCHTrack <= mchROF.getLastIdx(); ++iMCHTrack) {
358 auto mchTrack = mchTracks.at(iMCHTrack);
359 int id_track = iMCHTrack;
360 int nb_clusters = mchTrack.getNClusters();
363 if (nb_clusters <= 9) {
368 Track convertedTrack = MCHFormatConvert(mchTrack, mchClusters, doReAlign);
371 if (RemoveTrack(convertedTrack)) {
376 mAlign.
ProcessTrack(convertedTrack, transformation, doAlign, weightRecord);
384 auto tStart = std::chrono::high_resolution_clock::now();
385 LOG(info) <<
"Starting alignment process";
387 LOG(info) <<
"Using MCH-MID matched tracks";
391 LOG(info) <<
"Checking CCDB updates with processing context";
394 auto geoIdeal = pc.
inputs().
get<TGeoManager*>(
"geomIdeal");
395 LOG(info) <<
"Loading ideal geometry from CCDB";
397 for (
int i = 0;
i < 156;
i++) {
398 int iDEN = GetDetElemId(
i);
399 transformIdeal[iDEN] = transformation(iDEN);
405 LOG(info) <<
"Loading MCH tracks";
406 auto [fMCH, mchReader] = LoadData(mchFileName,
"o2sim");
407 TTreeReaderValue<vector<ROFRecord>>
mchROFs = {*mchReader,
"trackrofs"};
408 TTreeReaderValue<vector<TrackMCH>> mchTracks = {*mchReader,
"tracks"};
409 TTreeReaderValue<vector<Cluster>> mchClusters = {*mchReader,
"trackclusters"};
412 LOG(info) <<
"Loading MID tracks";
413 auto [fMUON, muonReader] = LoadData(muonFileName.c_str(),
"o2sim");
414 TTreeReaderValue<vector<dataformats::TrackMCHMID>> muonTracks = {*muonReader,
"tracks"};
415 int nTF = muonReader->GetEntries(
false);
416 if (mchReader->GetEntries(
false) != nTF) {
417 LOG(error) << mchFileName <<
" and " << muonFileName <<
" do not contain the same number of TF";
421 LOG(info) <<
"Starting track processing";
422 while (mchReader->Next() && muonReader->Next()) {
423 int id_event = mchReader->GetCurrentEntry();
427 LOG(info) <<
"Starting track processing";
428 while (mchReader->Next()) {
429 int id_event = mchReader->GetCurrentEntry();
439 auto tEnd = std::chrono::high_resolution_clock::now();
440 mElapsedTime = tEnd - tStart;
445 LOG(info) <<
"Generating aligned geometry using global parameters";
446 vector<detectors::AlignParam> ParamAligned;
449 TFile* FileAlign = TFile::Open(
"AlignParam.root",
"RECREATE");
451 FileAlign->WriteObjectAny(&ParamAligned,
"std::vector<o2::detectors::AlignParam>",
"alignment");
457 Geo_file = Form(
"%s%s",
"o2sim_geometry_ReAlign",
".root");
459 Geo_file = Form(
"%s%s",
"o2sim_geometry_Align",
".root");
463 gGeoManager->Export(Geo_file.c_str());
469 TransRef(ParamAligned);
480 void TransRef(vector<detectors::AlignParam>& ParamsTrack)
482 LOG(info) <<
"Transforming align params to the frame of ideal geometry";
483 vector<o2::detectors::AlignParam> ParamsRef;
486 for (
int hc = 0; hc < 20; hc++) {
495 LOG(
debug) << Form(
"%s%s",
"Processing DET Elem: ", (param_Track.
getSymName()).c_str());
497 TGeoHMatrix delta_track;
498 TGeoRotation
r(
"Rotation/Track", param_Track.
getPsi() /
pi() * 180.0, param_Track.
getTheta() /
pi() * 180.0, param_Track.
getPhi() /
pi() * 180.0);
499 delta_track.SetRotation(
r.GetRotationMatrix());
500 delta_track.SetDx(param_Track.
getX());
501 delta_track.SetDy(param_Track.
getY());
502 delta_track.SetDz(param_Track.
getZ());
504 TGeoHMatrix transRef = transformIdeal[iDEN];
505 TGeoHMatrix transTrack = doReAlign ? transformNew[iDEN] : transformRef[iDEN];
506 TGeoHMatrix transRefTrack = transTrack * transRef.Inverse();
507 TGeoHMatrix delta_ref = delta_track * transRefTrack;
512 ParamsRef.emplace_back(param_Ref);
516 TFile* fOut = TFile::Open(
"AlignParam@ideal.root",
"RECREATE");
517 fOut->WriteObjectAny(&ParamsRef,
"std::vector<o2::detectors::AlignParam>",
"alignment");
522 Track MCHFormatConvert(TrackMCH& mchTrack, vector<Cluster>& mchClusters,
bool doReAlign)
528 int id_cluster_first = mchTrack.getFirstClusterIdx();
529 int id_cluster_last = mchTrack.getLastClusterIdx();
531 for (
int id_cluster = id_cluster_first;
532 id_cluster < id_cluster_last + 1; ++id_cluster) {
534 Cluster* cluster = &(mchClusters.at(id_cluster));
535 const int DEId_cluster = cluster->getDEId();
536 const int CId_cluster = cluster->getChamberId();
537 const int ind_cluster = cluster->getClusterIndex();
545 master.SetXYZ(cluster->getX(), cluster->getY(), cluster->getZ());
547 transformRef[cluster->getDEId()].MasterToLocal(master, local);
548 transformNew[cluster->getDEId()].LocalToMaster(local, master);
550 cluster->
x = master.x();
551 cluster->
y = master.y();
552 cluster->z = master.z();
554 convertedTrack.createParamAtCluster(*cluster);
557 return Track(convertedTrack);
561 bool RemoveTrack(Track& track)
564 bool removeTrack =
false;
567 trackFitter.
fit(track,
false);
568 }
catch (exception
const& e) {
573 auto itStartingParam = std::prev(track.rend());
578 trackFitter.
fit(track,
true,
false, (itStartingParam == track.rbegin()) ?
nullptr : &itStartingParam);
579 }
catch (exception
const&) {
584 double worstLocalChi2 = -1.0;
586 track.tagRemovableClusters(0x1F,
false);
588 auto itWorstParam = track.end();
590 for (
auto itParam = track.begin(); itParam != track.end(); ++itParam) {
591 if (itParam->getLocalChi2() > worstLocalChi2) {
592 worstLocalChi2 = itParam->getLocalChi2();
593 itWorstParam = itParam;
597 if (worstLocalChi2 < mImproveCutChi2) {
601 if (!itWorstParam->isRemovable()) {
607 auto itNextParam = track.removeParamAtCluster(itWorstParam);
608 auto itNextToNextParam = (itNextParam == track.end()) ? itNextParam :
std::next(itNextParam);
609 itStartingParam = track.rbegin();
611 if (track.getNClusters() < 10) {
615 while (itNextToNextParam != track.end()) {
616 if (itNextToNextParam->getClusterPtr()->getChamberId() != itNextParam->getClusterPtr()->getChamberId()) {
617 itStartingParam = std::make_reverse_iterator(++itNextParam);
626 for (
auto&
param : track) {
627 param.setParameters(
param.getSmoothParameters());
628 param.setCovariances(
param.getSmoothCovariances());
636 void drawHisto(std::vector<double>&
params, std::vector<double>&
errors, std::vector<double>&
pulls,
string outFileName)
639 TH1F* hPullX =
new TH1F(
"hPullX",
"hPullX", 201, -10, 10);
640 TH1F* hPullY =
new TH1F(
"hPullY",
"hPullY", 201, -10, 10);
641 TH1F* hPullZ =
new TH1F(
"hPullZ",
"hPullZ", 201, -10, 10);
642 TH1F* hPullPhi =
new TH1F(
"hPullPhi",
"hPullPhi", 201, -10, 10);
644 double deNumber[156];
649 double alignPhi[156];
655 for (
int iDEN = 0; iDEN < 156; iDEN++) {
656 deNumber[iDEN] = iDEN + 0.5;
657 alignX[iDEN] =
params[iDEN * 4];
658 alignY[iDEN] =
params[iDEN * 4 + 1];
659 alignZ[iDEN] =
params[iDEN * 4 + 3];
660 alignPhi[iDEN] =
params[iDEN * 4 + 2];
661 pullX[iDEN] =
pulls[iDEN * 4];
662 pullY[iDEN] =
pulls[iDEN * 4 + 1];
663 pullZ[iDEN] =
pulls[iDEN * 4 + 3];
664 pullPhi[iDEN] =
pulls[iDEN * 4 + 2];
667 hPullX->Fill(
pulls[iDEN * 4]);
668 hPullY->Fill(
pulls[iDEN * 4 + 1]);
669 hPullZ->Fill(
pulls[iDEN * 4 + 3]);
670 hPullPhi->Fill(
pulls[iDEN * 4 + 2]);
674 TGraph* graphAlignX =
new TGraph(156, deNumber, alignX);
675 TGraph* graphAlignY =
new TGraph(156, deNumber, alignY);
676 TGraph* graphAlignZ =
new TGraph(156, deNumber, alignZ);
677 TGraph* graphAlignPhi =
new TGraph(156, deNumber, alignPhi);
680 TGraph* graphPullX =
new TGraph(156, deNumber, pullX);
681 TGraph* graphPullY =
new TGraph(156, deNumber, pullY);
682 TGraph* graphPullZ =
new TGraph(156, deNumber, pullZ);
683 TGraph* graphPullPhi =
new TGraph(156, deNumber, pullPhi);
685 graphAlignX->SetMarkerStyle(24);
686 graphPullX->SetMarkerStyle(25);
690 graphAlignY->SetMarkerStyle(24);
691 graphPullY->SetMarkerStyle(25);
695 graphAlignZ->SetMarkerStyle(24);
696 graphPullZ->SetMarkerStyle(25);
699 graphAlignPhi->SetMarkerStyle(24);
700 graphPullPhi->SetMarkerStyle(25);
706 string PlotFiles_name = Form(
"%s%s", outFileName.c_str(),
"_results.root");
707 TFile* PlotFiles = TFile::Open(PlotFiles_name.c_str(),
"RECREATE");
708 PlotFiles->WriteObjectAny(hPullX,
"TH1F",
"hPullX");
709 PlotFiles->WriteObjectAny(hPullY,
"TH1F",
"hPullY");
710 PlotFiles->WriteObjectAny(hPullZ,
"TH1F",
"hPullZ");
711 PlotFiles->WriteObjectAny(hPullPhi,
"TH1F",
"hPullPhi");
712 PlotFiles->WriteObjectAny(graphAlignX,
"TGraph",
"graphAlignX");
713 PlotFiles->WriteObjectAny(graphAlignY,
"TGraph",
"graphAlignY");
714 PlotFiles->WriteObjectAny(graphAlignZ,
"TGraph",
"graphAlignZ");
717 TCanvas* cvn1 =
new TCanvas(
"cvn1",
"cvn1", 1200, 1600);
720 TLine limLine(4, -5, 4, 5);
721 TH1F* aHisto =
new TH1F(
"aHisto",
"AlignParam", 161, 0, 160);
722 aHisto->SetXTitle(
"Det. Elem. Number");
723 for (
int i = 1;
i < 5;
i++) {
725 double Range[4] = {5.0, 1.0, 5.0, 0.01};
728 aHisto->SetYTitle(
"#delta_{#X} (cm)");
729 aHisto->GetYaxis()->SetRangeUser(-5.0, 5.0);
730 aHisto->DrawCopy(
"goff");
731 graphAlignX->Draw(
"Psame goff");
732 limLine.DrawLine(4, -Range[
i - 1], 4, Range[
i - 1]);
733 limLine.DrawLine(8, -Range[
i - 1], 8, Range[
i - 1]);
734 limLine.DrawLine(12, -Range[
i - 1], 12, Range[
i - 1]);
735 limLine.DrawLine(16, -Range[
i - 1], 16, Range[
i - 1]);
736 limLine.DrawLine(16 + 18, -Range[
i - 1], 16 + 18, Range[
i - 1]);
737 limLine.DrawLine(16 + 2 * 18, -Range[
i - 1], 16 + 2 * 18, Range[
i - 1]);
738 limLine.DrawLine(16 + 2 * 18 + 26, -Range[
i - 1], 16 + 2 * 18 + 26, Range[
i - 1]);
739 limLine.DrawLine(16 + 2 * 18 + 2 * 26, -Range[
i - 1], 16 + 2 * 18 + 2 * 26, Range[
i - 1]);
740 limLine.DrawLine(16 + 2 * 18 + 3 * 26, -Range[
i - 1], 16 + 2 * 18 + 3 * 26, Range[
i - 1]);
743 aHisto->SetYTitle(
"#delta_{#Y} (cm)");
744 aHisto->GetYaxis()->SetRangeUser(-1.0, 1.0);
745 aHisto->DrawCopy(
"goff");
746 graphAlignY->Draw(
"Psame goff");
747 limLine.DrawLine(4, -Range[
i - 1], 4, Range[
i - 1]);
748 limLine.DrawLine(8, -Range[
i - 1], 8, Range[
i - 1]);
749 limLine.DrawLine(12, -Range[
i - 1], 12, Range[
i - 1]);
750 limLine.DrawLine(16, -Range[
i - 1], 16, Range[
i - 1]);
751 limLine.DrawLine(16 + 18, -Range[
i - 1], 16 + 18, Range[
i - 1]);
752 limLine.DrawLine(16 + 2 * 18, -Range[
i - 1], 16 + 2 * 18, Range[
i - 1]);
753 limLine.DrawLine(16 + 2 * 18 + 26, -Range[
i - 1], 16 + 2 * 18 + 26, Range[
i - 1]);
754 limLine.DrawLine(16 + 2 * 18 + 2 * 26, -Range[
i - 1], 16 + 2 * 18 + 2 * 26, Range[
i - 1]);
755 limLine.DrawLine(16 + 2 * 18 + 3 * 26, -Range[
i - 1], 16 + 2 * 18 + 3 * 26, Range[
i - 1]);
758 aHisto->SetYTitle(
"#delta_{#Z} (cm)");
759 aHisto->GetYaxis()->SetRangeUser(-5.0, 5.0);
760 aHisto->DrawCopy(
"goff");
761 graphAlignZ->Draw(
"Psame goff");
762 limLine.DrawLine(4, -Range[
i - 1], 4, Range[
i - 1]);
763 limLine.DrawLine(8, -Range[
i - 1], 8, Range[
i - 1]);
764 limLine.DrawLine(12, -Range[
i - 1], 12, Range[
i - 1]);
765 limLine.DrawLine(16, -Range[
i - 1], 16, Range[
i - 1]);
766 limLine.DrawLine(16 + 18, -Range[
i - 1], 16 + 18, Range[
i - 1]);
767 limLine.DrawLine(16 + 2 * 18, -Range[
i - 1], 16 + 2 * 18, Range[
i - 1]);
768 limLine.DrawLine(16 + 2 * 18 + 26, -Range[
i - 1], 16 + 2 * 18 + 26, Range[
i - 1]);
769 limLine.DrawLine(16 + 2 * 18 + 2 * 26, -Range[
i - 1], 16 + 2 * 18 + 2 * 26, Range[
i - 1]);
770 limLine.DrawLine(16 + 2 * 18 + 3 * 26, -Range[
i - 1], 16 + 2 * 18 + 3 * 26, Range[
i - 1]);
773 aHisto->SetYTitle(
"#delta_{#varphi} (cm)");
774 aHisto->GetYaxis()->SetRangeUser(-0.01, 0.01);
775 aHisto->DrawCopy(
"goff");
776 graphAlignPhi->Draw(
"Psame goff");
777 limLine.DrawLine(4, -Range[
i - 1], 4, Range[
i - 1]);
778 limLine.DrawLine(8, -Range[
i - 1], 8, Range[
i - 1]);
779 limLine.DrawLine(12, -Range[
i - 1], 12, Range[
i - 1]);
780 limLine.DrawLine(16, -Range[
i - 1], 16, Range[
i - 1]);
781 limLine.DrawLine(16 + 18, -Range[
i - 1], 16 + 18, Range[
i - 1]);
782 limLine.DrawLine(16 + 2 * 18, -Range[
i - 1], 16 + 2 * 18, Range[
i - 1]);
783 limLine.DrawLine(16 + 2 * 18 + 26, -Range[
i - 1], 16 + 2 * 18 + 26, Range[
i - 1]);
784 limLine.DrawLine(16 + 2 * 18 + 2 * 26, -Range[
i - 1], 16 + 2 * 18 + 2 * 26, Range[
i - 1]);
785 limLine.DrawLine(16 + 2 * 18 + 3 * 26, -Range[
i - 1], 16 + 2 * 18 + 3 * 26, Range[
i - 1]);
790 PlotFiles->WriteObjectAny(cvn1,
"TCanvas",
"AlignParam");
795 tuple<TFile*, TTreeReader*> LoadData(
const string fileName,
const string treeName)
799 TFile*
f = TFile::Open(fileName.c_str(),
"READ");
800 if (!
f ||
f->IsZombie()) {
801 LOG(error) <<
"Opening file " << fileName <<
" failed";
805 TTreeReader*
r =
new TTreeReader(treeName.c_str(),
f);
807 LOG(error) <<
"Tree " << treeName <<
" not found";
811 return std::make_tuple(
f,
r);
815 bool FindMuon(
int iMCHTrack, vector<dataformats::TrackMCHMID>& muonTracks)
818 for (
const auto& muon : muonTracks) {
820 if (muon.getMCHRef().getIndex() == iMCHTrack) {
828 int GetDetElemNumber(
int iDetElemId)
832 const int iCh = iDetElemId / 100;
833 const int iDet = iDetElemId % 100;
836 if (!(iCh > 0 && iCh <= 10 && iDet <
fgNDetElemCh[iCh - 1])) {
837 LOG(fatal) <<
"Invalid detector element id: " << iDetElemId;
845 int GetDetElemId(
int iDetElemNumber)
850 LOG(fatal) <<
"Invalid detector element number: " << iDetElemNumber;
856 for (
int i = 1;
i <= 10;
i++) {
865 if (!(iCh > 0 && iCh <= 10 && iDet <
fgNDetElemCh[iCh - 1])) {
866 LOG(fatal) <<
"Invalid detector element id: " << 100 * iCh + iDet;
870 return 100 * iCh + iDet;
873 const string mchFileName{
"mchtracks.root"};
874 const string muonFileName{
"muontracks.root"};
875 string outFileName{
"Alignment"};
876 string IdealGeoFileName{
""};
877 string RefGeoFileName{
""};
878 string NewGeoFileName{
""};
880 bool doReAlign{
false};
881 bool doMatched{
false};
882 bool readFromRec{
false};
883 const double weightRecord{1.0};
885 shared_ptr<base::GRPGeomRequest> mCCDBRequest{};
887 map<int, math_utils::Transform3D> transformRef{};
888 map<int, math_utils::Transform3D> transformNew{};
889 map<int, math_utils::Transform3D> transformIdeal{};
892 TrackFitter trackFitter{};
893 double mImproveCutChi2{};
895 std::chrono::duration<double> mElapsedTime{};