diff --git a/Detectors/MUON/MCH/Align/src/AlignmentSpec.cxx b/Detectors/MUON/MCH/Align/src/AlignmentSpec.cxx index 948ac1bda9117..8a1df9c98bb9b 100644 --- a/Detectors/MUON/MCH/Align/src/AlignmentSpec.cxx +++ b/Detectors/MUON/MCH/Align/src/AlignmentSpec.cxx @@ -208,11 +208,21 @@ class AlignmentTask auto doEvaluation = ic.options().get("do-evaluation"); mAlign.SetDoEvaluation(doEvaluation); + // Variation range for parameters - mAlign.SetAllowedVariation(0, 2.0); - mAlign.SetAllowedVariation(1, 0.3); - mAlign.SetAllowedVariation(2, 0.002); - mAlign.SetAllowedVariation(3, 2.0); + auto AllowX = ic.options().get("variation-x"); + auto AllowY = ic.options().get("variation-y"); + auto AllowPhi = ic.options().get("variation-phi"); + auto AllowZ = ic.options().get("variation-z"); + mAlign.SetAllowedVariation(0, AllowX); + mAlign.SetAllowedVariation(1, AllowY); + mAlign.SetAllowedVariation(2, AllowPhi); + mAlign.SetAllowedVariation(3, AllowZ); + + // Sigma XY + auto SigmaX = ic.options().get("sigma-x"); + auto SigmaY = ic.options().get("sigma-y"); + mAlign.SetSigmaXY(SigmaX, SigmaY); // Configuration for track fitter const auto& trackerParam = TrackerParam::Instance(); @@ -223,14 +233,28 @@ class AlignmentTask mImproveCutChi2 = 2. * trackerParam.sigmaCutForImprovement * trackerParam.sigmaCutForImprovement; // Fix chambers - auto input_fixchambers = ic.options().get("fix-chamber"); - std::stringstream string_chambers(input_fixchambers); - string_chambers >> std::ws; - while (string_chambers.good()) { - string substr; - std::getline(string_chambers, substr, ','); - LOG(info) << Form("%s%d", "Fixing chamber: ", std::stoi(substr)); - mAlign.FixChamber(std::stoi(substr)); + TString chambersString = ic.options().get("fix-chamber"); + std::unique_ptr objArray(chambersString.Tokenize(",")); + if (objArray->GetEntries() > 0) { + for (int iVar = 0; iVar < objArray->GetEntries(); ++iVar) { + LOG(info) << Form("%s%d", "Fixing chamber: ", std::stoi(objArray->At(iVar)->GetName())); + mAlign.FixChamber(std::stoi(objArray->At(iVar)->GetName())); + } + } + + // Fix DEs + TString DEString = ic.options().get("fix-de"); + TString MaskDEString = ic.options().get("mask-fix-de"); + std::unique_ptr objArrayDE(DEString.Tokenize(",")); + std::unique_ptr objArrayMask(MaskDEString.Tokenize(",")); + if (objArrayDE->GetEntries() > 0) { + if (objArrayDE->GetEntries() != objArrayMask->GetEntries()) { + LOG(fatal) << "Inconsistent size of DEs and Masks!"; + } + for (int iVar = 0; iVar < objArrayDE->GetEntries(); ++iVar) { + LOG(info) << Form("%s%d%s%d", "Fixing DE: ", std::stoi(objArrayDE->At(iVar)->GetName()), " with mask: ", std::stoi(objArrayMask->At(iVar)->GetName())); + mAlign.FixDetElem(std::stoi(objArrayDE->At(iVar)->GetName()), std::stoi(objArrayMask->At(iVar)->GetName())); + } } doMatched = ic.options().get("matched"); @@ -902,6 +926,14 @@ o2::framework::DataProcessorSpec getAlignmentSpec(bool disableCCDB) {"matched", VariantType::Bool, false, {"Switch for using MCH-MID matched tracks"}}, {"fix-chamber", VariantType::String, "", {"Chamber fixing, ex 1,2,3"}}, {"use-record", VariantType::Bool, false, {"Option for directly using record in alignment if provided"}}, + {"variation-x", VariantType::Float, 2.0, {"Allowed variation for x axis in cm"}}, + {"variation-y", VariantType::Float, 0.3, {"Allowed variation for y axis in cm"}}, + {"variation-phi", VariantType::Float, 0.002, {"Allowed variation for phi axis in rad"}}, + {"variation-z", VariantType::Float, 2.0, {"Allowed variation for z axis in cm"}}, + {"sigma-x", VariantType::Float, 1000.0, {"Sigma cut along X"}}, + {"sigma-y", VariantType::Float, 1000.0, {"Sigma cut along Y"}}, + {"fix-de", VariantType::String, "", {"DE fixing, ex 101,1019"}}, + {"mask-fix-de", VariantType::String, "", {"Mask for DE d.o.f fixing, ex 0,2,4"}}, {"output", VariantType::String, "Alignment", {"Option for name of output file"}}}}; }