2 Int_t qaConfig(TTree* tree, TString* returnStrings)
4 Float_t entryFrac=0.8, nsigmaOutlier=6., nsigmaWarning=3., epsilon=1.0e-6;
7 // specify all variables for which the status aliases shall be defined.
8 // only for these variables the lines in the trending plots can be computed and plotted.
10 TString sTrendVars="meanTPCncl;meanTPCnclF;meanMIP;resolutionMIP;meanVertX;meanVertY;meanVertZ;meanMultPos;meanMultNeg;";
11 sTrendVars+=";tpcItsMatchA;tpcItsMatchC;tpcItsMatchHighPtA;tpcItsMatchHighPtC;lambdaPull;ptPull;yPull;zPull;";
12 sTrendVars+=";tpcConstrainPhiA;tpcConstrainPhiC;deltaPt;";
13 sTrendVars+=";offsetdRA;offsetdZA;offsetdRC;offsetdZC;dcarAP0;dcarAP1;dcarCP0;dcarCP1;";
14 sTrendVars+=";dcar_posA_0;dcar_posA_1;dcar_posA_2;dcaz_posA_0;dcaz_posA_1;dcaz_posA_2;";
15 sTrendVars+=";dcar_posC_0;dcar_posC_1;dcar_posC_2;dcaz_posC_0;dcaz_posC_1;dcaz_posC_2;";
16 sTrendVars+=";dcar_negA_0;dcar_negA_1;dcar_negA_2;dcaz_negA_0;dcaz_negA_1;dcaz_negA_2;";
17 sTrendVars+=";dcar_negC_0;dcar_negC_1;dcar_negC_2;dcaz_negC_0;dcaz_negC_1;dcaz_negC_2;";
21 // name them '..._combN' with N being the number of combined variables!
23 tree->SetAlias("meanMult_comb2" , "((meanMultPos+meanMultNeg)/2.)");
24 tree->SetAlias("tpcItsMatch_comb4" , "((tpcItsMatchA+tpcItsMatchC+tpcItsMatchHighPtA+tpcItsMatchHighPtC)/4)"); // mean of all 4.
25 tree->SetAlias("itsTpcPulls_comb4" , "(TMath::Sqrt(lambdaPull**2+ptPull**2+yPull**2+zPull**2))");
26 tree->SetAlias("tpcConstrainPhi_comb2" , "(TMath::Sqrt(tpcConstrainPhiA**2+tpcConstrainPhiC**2))"); // sqrt of quadr. sum ok because it's a bias.
27 tree->SetAlias("offsetd_comb4" , "(TMath::Sqrt(offsetdRA**2+offsetdZA**2+offsetdRC**2+offsetdZC**2))");
28 tree->SetAlias("dcarFitpar_comb4" , "((dcarAP0+dcarAP1+dcarCP0+dcarCP1)/4)"); // mean of 4.
29 tree->SetAlias("dcar0_comb4" , "(TMath::Sqrt(dcar_posA_0**2+dcar_posC_0**2+dcar_negA_0**2+dcar_negC_0**2))");
30 tree->SetAlias("dcar1_comb4" , "(TMath::Sqrt(dcar_posA_1**2+dcar_posC_1**2+dcar_negA_1**2+dcar_negC_1**2))");
31 tree->SetAlias("dcar2_comb4" , "(TMath::Sqrt(dcar_posA_2**2+dcar_posC_2**2+dcar_negA_2**2+dcar_negC_2**2))");
32 tree->SetAlias("dcaz0_comb4" , "(TMath::Sqrt(dcaz_posA_0**2+dcaz_posC_0**2+dcaz_negA_0**2+dcaz_negC_0**2))");
33 tree->SetAlias("dcaz1_comb4" , "(TMath::Sqrt(dcaz_posA_1**2+dcaz_posC_1**2+dcaz_negA_1**2+dcaz_negC_1**2))");
34 tree->SetAlias("dcaz2_comb4" , "(TMath::Sqrt(dcaz_posA_2**2+dcaz_posC_2**2+dcaz_negA_2**2+dcaz_negC_2**2))");
36 // add all combined variables to sTrendVars!
37 // only then the statistics aliases will be computed for them as well.
39 sTrendVars+=";meanMult_comb2;tpcItsMatch_comb4;itsTpcPulls_comb4;tpcConstrainPhi_comb2;";
40 sTrendVars+=";offsetd_comb4;dcarFitpar_comb4;dcar0_comb4;dcar1_comb4;dcar2_comb4;dcaz0_comb4;dcaz1_comb4;dcaz2_comb4;";
43 // specify criterion to mark runs with enough statistics.
44 // these runs are the basis for the computation of the outlier criteria.
45 // -> robust mean and rms are computed from given entry fraction (EF) of these runs!
47 tree->SetAlias("statisticOK", "(meanTPCncl>0)");
50 // creation of aliases for Outliers, Warnings, PhysicsAcceptable ...
51 // upper and lower limits needed separately to retrieve the numerical values for the line positions.
52 // for that reason the aliases are expected to be computable expressions.
54 TObjArray* oaTrendVars = sTrendVars.Tokenize(",;");
55 for (Int_t vari=0; vari<oaTrendVars->GetEntriesFast(); vari++)
57 TString sVar( oaTrendVars->At(vari)->GetName() );
59 // outliers, warnings and robust mean are set for all variables identically.
60 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_OutlierMin:(MeanEF-%f*RMSEF-%f):%f", nsigmaOutlier, epsilon, entryFrac));
61 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_OutlierMax:(MeanEF+%f*RMSEF+%f):%f", nsigmaOutlier, epsilon, entryFrac));
62 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_WarningMin:(MeanEF-%f*RMSEF-%f):%f", nsigmaWarning, epsilon, entryFrac));
63 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_WarningMax:(MeanEF+%f*RMSEF+%f):%f", nsigmaWarning, epsilon, entryFrac));
64 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_RobustMean:(MeanEF+0):%f", entryFrac));
66 // physics acceptable should be set for each type of variable individually.
67 // some sets of variables are already set here, the rest should be set appropriately after the loop!
69 if (sVar.Contains("_comb")) {
70 TString last = sVar(sVar.Last('b')+1, sVar.Length());
71 combfac = TMath::Sqrt( atoi(last.Data()) );
73 if (sVar.Contains("dca")) {
74 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_PhysAccMin:(MeanEF-%f+0)", 0.2*combfac)); // 2 mm around mean
75 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_PhysAccMax:(MeanEF+%f+0)", 0.2*combfac)); // 2 mm around mean
77 else if (sVar.Contains("Pull")) {
78 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_PhysAccMin:(MeanEF-%f+0)", 1.0*combfac));
79 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_PhysAccMax:(MeanEF+%f+0)", 1.0*combfac));
81 else { // other variables set to +- 5% of the mean as default to avoid crashes:
82 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_PhysAccMin:(MeanEF-%f*MeanEF):%f", 0.05*combfac, entryFrac));
83 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "statisticOK", Form("varname_PhysAccMax:(MeanEF+%f*MeanEF):%f", 0.05*combfac, entryFrac));
89 // all aliases can just be overwritten here...
90 // PhysAcc should be set to relative or absolute values appropriately!
92 TStatToolkit::SetStatusAlias(tree, "meanTPCncl", "statisticOK", Form("varname_PhysAccMin:(MeanEF-%f*MeanEF):%f", 0.05, entryFrac));
93 TStatToolkit::SetStatusAlias(tree, "meanTPCncl", "statisticOK", Form("varname_PhysAccMax:(MeanEF+%f*MeanEF):%f", 0.05, entryFrac));
94 TStatToolkit::SetStatusAlias(tree, "meanMIP", "statisticOK", Form("varname_PhysAccMin:(MeanEF-%f*MeanEF):%f", 0.01, entryFrac));
95 TStatToolkit::SetStatusAlias(tree, "meanMIP", "statisticOK", Form("varname_PhysAccMax:(MeanEF+%f*MeanEF):%f", 0.01, entryFrac));
96 TStatToolkit::SetStatusAlias(tree, "resolutionMIP", "statisticOK", Form("varname_PhysAccMin:(MeanEF-%f*MeanEF):%f", 0.10, entryFrac));
97 TStatToolkit::SetStatusAlias(tree, "resolutionMIP", "statisticOK", Form("varname_PhysAccMax:(MeanEF+%f*MeanEF):%f", 0.10, entryFrac));
98 TStatToolkit::SetStatusAlias(tree, "meanVertZ", "statisticOK", Form("varname_PhysAccMin:(%f+0)",-1.0 ));
99 TStatToolkit::SetStatusAlias(tree, "meanVertZ", "statisticOK", Form("varname_PhysAccMax:(%f+0)", 1.0 ));
100 // TStatToolkit::SetStatusAlias(tree, "tpcItsMatchA", "statisticOK", Form("varname_PhysAccMin:(%f+0)", 0.7 )); // TODO: set to +-3% after multiplicity correction (see wiki)
101 // TStatToolkit::SetStatusAlias(tree, "tpcItsMatchA", "statisticOK", Form("varname_PhysAccMax:(%f+0)", 1.0 ));
102 // TStatToolkit::SetStatusAlias(tree, "tpcItsMatchC", "statisticOK", Form("varname_PhysAccMin:(%f+0)", 0.7 ));
103 // TStatToolkit::SetStatusAlias(tree, "tpcItsMatchC", "statisticOK", Form("varname_PhysAccMax:(%f+0)", 1.0 ));
106 // now the actual criteria for each variable are set automatically.
108 for (Int_t vari=0; vari<oaTrendVars->GetEntriesFast(); vari++)
110 TString sVar( oaTrendVars->At(vari)->GetName() );
111 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "", Form("varname_Outlier:(varname>varname_OutlierMax||varname<varname_OutlierMin)"));
112 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "", Form("varname_Warning:(varname>varname_WarningMax||varname<varname_WarningMin)"));
113 TStatToolkit::SetStatusAlias(tree, sVar.Data(), "", Form("varname_PhysAcc:(varname>varname_PhysAccMin&&varname<varname_PhysAccMax)"));
120 // combined MIP quality
121 tree->SetAlias("MIPquality_Outlier", "(meanMIP_Outlier||resolutionMIP_Outlier)");
122 tree->SetAlias("MIPquality_Warning", "(meanMIP_Warning||resolutionMIP_Warning)");
123 tree->SetAlias("MIPquality_PhysAcc", "(meanMIP_PhysAcc&&resolutionMIP_PhysAcc)");
125 // combined matching efficiency
126 tree->SetAlias("tpcItsMatch_Outlier", "(tpcItsMatchA_Outlier||tpcItsMatchC_Outlier||tpcItsMatchHighPtA_Outlier||tpcItsMatchHighPtC_Outlier)");
127 tree->SetAlias("tpcItsMatch_Warning", "(tpcItsMatchA_Warning||tpcItsMatchC_Warning||tpcItsMatchHighPtA_Warning||tpcItsMatchHighPtC_Warning)");
128 tree->SetAlias("tpcItsMatch_PhysAcc", "(tpcItsMatchA_PhysAcc&&tpcItsMatchC_PhysAcc&&tpcItsMatchHighPtA_PhysAcc&&tpcItsMatchHighPtC_PhysAcc)");
130 // combined matching quality (lambdaPull ptPull yPull zPull)
131 tree->SetAlias("itsTpcPulls_Outlier", "(lambdaPull_Outlier||ptPull_Outlier||yPull_Outlier||zPull_Outlier)");
132 tree->SetAlias("itsTpcPulls_Warning", "(lambdaPull_Warning||ptPull_Warning||yPull_Warning||zPull_Warning)");
133 tree->SetAlias("itsTpcPulls_PhysAcc", "(lambdaPull_PhysAcc&&ptPull_PhysAcc&&yPull_PhysAcc&&zPull_PhysAcc)");
135 // combined DCA R and Z
136 tree->SetAlias("dcar0_Outlier", "(dcar_posA_0_Outlier||dcar_posC_0_Outlier||dcar_negA_0_Outlier||dcar_negC_0_Outlier)");
137 tree->SetAlias("dcar1_Outlier", "(dcar_posA_1_Outlier||dcar_posC_1_Outlier||dcar_negA_1_Outlier||dcar_negC_1_Outlier)");
138 tree->SetAlias("dcar2_Outlier", "(dcar_posA_2_Outlier||dcar_posC_2_Outlier||dcar_negA_2_Outlier||dcar_negC_2_Outlier)");
139 tree->SetAlias("dcar_Outlier" , "(dcar0_Outlier||dcar1_Outlier||dcar2_Outlier)");
140 tree->SetAlias("dcaz0_Outlier", "(dcaz_posA_0_Outlier||dcaz_posC_0_Outlier||dcaz_negA_0_Outlier||dcaz_negC_0_Outlier)");
141 tree->SetAlias("dcaz1_Outlier", "(dcaz_posA_1_Outlier||dcaz_posC_1_Outlier||dcaz_negA_1_Outlier||dcaz_negC_1_Outlier)");
142 tree->SetAlias("dcaz2_Outlier", "(dcaz_posA_2_Outlier||dcaz_posC_2_Outlier||dcaz_negA_2_Outlier||dcaz_negC_2_Outlier)");
143 tree->SetAlias("dcaz_Outlier" , "(dcaz0_Outlier||dcaz1_Outlier||dcaz2_Outlier)");
145 tree->SetAlias("dcar0_Warning", "(dcar_posA_0_Warning||dcar_posC_0_Warning||dcar_negA_0_Warning||dcar_negC_0_Warning)");
146 tree->SetAlias("dcar1_Warning", "(dcar_posA_1_Warning||dcar_posC_1_Warning||dcar_negA_1_Warning||dcar_negC_1_Warning)");
147 tree->SetAlias("dcar2_Warning", "(dcar_posA_2_Warning||dcar_posC_2_Warning||dcar_negA_2_Warning||dcar_negC_2_Warning)");
148 tree->SetAlias("dcar_Warning" , "(dcar0_Warning||dcar1_Warning||dcar2_Warning)");
149 tree->SetAlias("dcaz0_Warning", "(dcaz_posA_0_Warning||dcaz_posC_0_Warning||dcaz_negA_0_Warning||dcaz_negC_0_Warning)");
150 tree->SetAlias("dcaz1_Warning", "(dcaz_posA_1_Warning||dcaz_posC_1_Warning||dcaz_negA_1_Warning||dcaz_negC_1_Warning)");
151 tree->SetAlias("dcaz2_Warning", "(dcaz_posA_2_Warning||dcaz_posC_2_Warning||dcaz_negA_2_Warning||dcaz_negC_2_Warning)");
152 tree->SetAlias("dcaz_Warning" , "(dcaz0_Warning||dcaz1_Warning||dcaz2_Warning)");
154 tree->SetAlias("dcar0_PhysAcc", "(dcar_posA_0_PhysAcc&&dcar_posC_0_PhysAcc&&dcar_negA_0_PhysAcc&&dcar_negC_0_PhysAcc)");
155 tree->SetAlias("dcar1_PhysAcc", "(dcar_posA_1_PhysAcc&&dcar_posC_1_PhysAcc&&dcar_negA_1_PhysAcc&&dcar_negC_1_PhysAcc)");
156 tree->SetAlias("dcar2_PhysAcc", "(dcar_posA_2_PhysAcc&&dcar_posC_2_PhysAcc&&dcar_negA_2_PhysAcc&&dcar_negC_2_PhysAcc)");
157 tree->SetAlias("dcar_PhysAcc" , "(dcar0_PhysAcc&&dcar1_PhysAcc&&dcar2_PhysAcc)");
158 tree->SetAlias("dcaz0_PhysAcc", "(dcaz_posA_0_PhysAcc&&dcaz_posC_0_PhysAcc&&dcaz_negA_0_PhysAcc&&dcaz_negC_0_PhysAcc)");
159 tree->SetAlias("dcaz1_PhysAcc", "(dcaz_posA_1_PhysAcc&&dcaz_posC_1_PhysAcc&&dcaz_negA_1_PhysAcc&&dcaz_negC_1_PhysAcc)");
160 tree->SetAlias("dcaz2_PhysAcc", "(dcaz_posA_2_PhysAcc&&dcaz_posC_2_PhysAcc&&dcaz_negA_2_PhysAcc&&dcaz_negC_2_PhysAcc)");
161 tree->SetAlias("dcaz_PhysAcc" , "(dcaz0_PhysAcc&&dcaz1_PhysAcc&&dcaz2_PhysAcc)");
165 // specify the variables which shall be included in the status bar.
166 // give them meaningful names for the y axis of the status bar!
168 TString sStatusbarVars ("MIPquality;dcaz;dcar;tpcItsMatch;itsTpcPulls;meanTPCncl;global");
169 TString sStatusbarNames("MIP mean&rms;v_drift(DCAZ);space p.(DCAR);TPC-ITS m.eff.;ITS-TPC m.qual.;mean TPC Ncl;global result");
172 // global descision is made automatically from the other entries in the status bar.
174 TString sVarsNoGlobal = sStatusbarVars;
175 sVarsNoGlobal.Remove(sVarsNoGlobal.Last(';'), sVarsNoGlobal.Length()); // remove last item (';global')
177 TString sGlobalCriterion = sVarsNoGlobal;
178 sGlobalCriterion.ReplaceAll(";","_PhysAcc&&"); sGlobalCriterion.Append("_PhysAcc");
179 cout << "global PhysAcc: " << sGlobalCriterion.Data() << endl;
180 tree->SetAlias("global_PhysAcc" , sGlobalCriterion.Data());
183 TObjArray* oaVarsNoGlobal = sVarsNoGlobal.Tokenize(";");
184 for (Int_t vari=0; vari<oaVarsNoGlobal->GetEntriesFast(); vari++)
186 TString sVar( oaVarsNoGlobal->At(vari)->GetName() );
187 sGlobalCriterion+=Form("(%s_Outlier&&!%s_PhysAcc)", sVar.Data(), sVar.Data());
188 if (vari<oaVarsNoGlobal->GetEntriesFast()-1) sGlobalCriterion+="||";
190 cout << "global Outlier: " << sGlobalCriterion.Data() << endl;
191 tree->SetAlias("global_Outlier" , sGlobalCriterion.Data());
193 sGlobalCriterion.ReplaceAll("_Outlier","_Warning");
194 cout << "global Warning: " << sGlobalCriterion.Data() << endl;
195 tree->SetAlias("global_Warning" , sGlobalCriterion.Data());
198 // set Boolean criteria to be checked for the markers in the status bar:
199 // separate them by colon ":" (1) = true --> first marker always plotted
201 TString sCriteria("(1):(statisticOK):(varname_Warning):(varname_Outlier):(varname_PhysAcc)"); // or to just show vetos: (varname_PhysAcc&&varname_Warning)
203 returnStrings[0] = sStatusbarVars;
204 returnStrings[1] = sStatusbarNames;
205 returnStrings[2] = sCriteria;