ROOT logo

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