ROOT logo
#ifndef __CINT__
#include <AliAnalysisManager.h>
#include <PWGLF/RESONANCES/AliRsnCutPrimaryVertex.h>
#include <PWGLF/RESONANCES/AliRsnValuePair.h>
#include <PWGLF/RESONANCES/AliRsnListOutput.h>
#include <PWGLF/RESONANCES/AliRsnPairDef.h>
#include <PWGLF/RESONANCES/AliRsnLoopPair.h>
#include <PWGLF/RESONANCES/AliRsnAnalysisTask.h>
#include <PWGLF/RESONANCES/AliRsnLoopDaughter.h>
#include <PWGLF/RESONANCES/AliRsnValueDaughter.h>
#include <PWGLF/RESONANCES/AliRsnMiniAnalysisTask.h>
#include <PWGLF/RESONANCES/AliRsnCutMiniPair.h>
#include <PWGLF/RESONANCES/AliRsnInputHandler.h>
#include <PWGLF/RESONANCES/AliRsnMiniMonitor.h>
#include <PWGLF/RESONANCES/AliRsnValueEvent.h>
#include <AliRsnMiniMonitorTask.h>
#include <TROOT.h>
#endif

Bool_t RsnConfig(AliAnalysisTaskSE *task,Bool_t isMC,Bool_t isMixing,AliRsnInputHandler *rsnIH=0,TList *listRsn=0) {

   if (!task) return kFALSE;

   if (!listRsn) {
      return kFALSE;
   }
   Bool_t valid;
   Int_t isRsnMini = AliAnalysisManager::GetGlobalInt("rsnUseMiniPackage",valid);
   TString rsnCutOptCommon = AliAnalysisManager::GetGlobalStr("rsnLegoTrainCommonCutOption",valid);
   Int_t cutIndex = 0;
   Int_t numOfCuts = 0;

   // set commol eventCuts

   if (!RsnLoadMacroFromConfig("AddRsnCommonEventCuts.C")) return kFALSE;
   AliRsnCutSet *commonEventCuts = AddRsnCommonEventCuts(task);

   if (!RsnLoadMacroFromConfig("AddRsnCommonPairCuts.C")) return kFALSE;
   AliRsnCutSet *commonPairCuts = AddRsnCommonPairCuts();
   
   TIter next(listRsn);
   TNamed *rsnObj=0;
   TString rsnName,rsnNameOpt,rsnNameOptFull,rsnCutName,rsnCutOpt,rsnCutNameOptFull;
   while ((rsnObj = (TNamed *)next())) {
      GetOptionFromString(rsnObj->GetName(),rsnName,rsnNameOpt);
      rsnNameOptFull=rsnName;
      if (!rsnNameOpt.IsNull()) rsnNameOptFull += Form("_%s",rsnNameOpt.Data());

      GetOptionFromString(rsnObj->GetTitle(),rsnCutName,rsnCutOpt);
      rsnCutNameOptFull=rsnCutName;
      if (!rsnCutOpt.IsNull())rsnCutNameOptFull += Form("_%s",rsnCutOpt.Data());

      if (!rsnCutOptCommon.IsNull()) {
         if (!rsnCutOpt.IsNull()) rsnCutOpt += "_";
         rsnCutOpt += rsnCutOptCommon.Data();
      }

      if (!RsnLoadMacroFromConfig(Form("AddRsnDaughterCuts%s.C",rsnCutName.Data()))) return kFALSE;
      if (!RsnLoadMacroFromConfig(Form("AddRsnPairs%s.C",rsnName.Data()))) return kFALSE;

      rsnNameOptFull.ToLower();
      rsnName.ToLower();
      // add cuts
      if (!rsnName.CompareTo("phi")) {
         numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kKaon,\"%s\",%d,(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),isRsnMini,rsnIH, task));
         if (numOfCuts) {
            if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            AddRsnPairsPhi(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kKaon,cutIndex,commonEventCuts,commonPairCuts,Form("%s.%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            cutIndex+=numOfCuts;
         }
      } else if (!rsnName.CompareTo("kstar")) {
         numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kPion,\"%s\",%d,(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),isRsnMini,rsnIH,task));
         if (numOfCuts) {
            if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s_pi",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            AddRsnPairsKStar(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kPion,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s.%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            cutIndex+=numOfCuts;
         }
      } else if (!rsnName.CompareTo("rho")) {
         numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kPion,AliPID::kPion,\"%s\",%d,(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),isRsnMini,rsnIH,task));
         if (numOfCuts) {
            if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_pi",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            AddRsnPairsRho(task,isMC,isMixing,AliPID::kPion,cutIndex,AliPID::kPion,cutIndex,commonEventCuts,commonPairCuts,Form("%s.%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            cutIndex+=numOfCuts;
         }
      } else if (!rsnName.CompareTo("lambda")) {
         numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kProton,AliPID::kKaon,\"%s\",%d,(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),isRsnMini,rsnIH,task));
         if (numOfCuts) {
            if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_p",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            AddRsnPairsLambda(task,isMC,isMixing,AliPID::kProton,cutIndex,AliPID::kKaon,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s.%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
            cutIndex+=numOfCuts;
         }
      } else {
         Printf("Error : Particle %s is not supported !!!!",rsnName.Data());
         return kFALSE;
      }

   }

   return kTRUE;
}

Bool_t RsnLoadMacroFromConfig(TString macro,TString path="") {

   Bool_t valid;
   TString lego_path = AliAnalysisManager::GetGlobalStr("rsnLegoTrainPath",valid);
   if (!valid) lego_path = "$ALICE_ROOT/PWGLF/RESONANCES/macros/lego_train";

   if (!gSystem->AccessPathName(macro.Data())) {
      Int_t ret = gROOT->LoadMacro(macro.Data());
      Printf("Macro loaded from %s/%s [%d]...",gSystem->pwd(),macro.Data(),ret);
      return kTRUE;
   }

   if (!gSystem->AccessPathName(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())))) {
      gROOT->LoadMacro(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
      Printf("Macro loaded from %s ...",gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
      return kTRUE;
   }

   Printf("Error loading %s",macro.Data());

   return kFALSE;
}

void GetOptionFromString(TString str,TString &outStr1,TString &outStr2,TString d=":") {
   //   TStringO
   TObjArray *tokens = str.Tokenize(d.Data());
   TObjString *objStr =  (TObjString *)tokens->At(0);
   if (!objStr) {
      outStr1 = "err";
      outStr2 = "";
      return;
   }
   outStr1 = objStr->GetString();

   objStr =  (TObjString *) tokens->At(1);
   if (!objStr) {
      outStr2 = "";
      return;
   }
   outStr2 = objStr->GetString();

}

Bool_t AddPair(AliAnalysisTaskSE *task, Bool_t isMC,Bool_t isMixing, AliPID::EParticleType pType1,Int_t listID1, AliPID::EParticleType pType2,Int_t listID2, Int_t pdgMother,Double_t massMother, AliRsnCutSet *commonEventCuts=0,AliRsnCutSet *commonPairCuts=0, TString name = "") {

   Bool_t valid;
   Int_t useMCMomentum = AliAnalysisManager::GetGlobalInt("rsnUseMCMomentum",valid);
   Bool_t typeSame = (pType1 == pType2);

   Printf("------------- id1=%d id2=%d",pType1,pType2);

   TList *listLoops = new TList;

   // pair definition
   AliRsnPairDef  *pairDefPM         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);
   AliRsnPairDef  *pairDefMP         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
   AliRsnPairDef  *pairDefPP         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
   AliRsnPairDef  *pairDefMM         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);

   // loop object creation
   AliRsnLoopPair *lp = 0;

   // sets +-
   lp = new AliRsnLoopPair(Form("%s.RecPM", name.Data()), pairDefPM, kFALSE);
   listLoops->Add(lp);

   if (!typeSame) {
      lp = new AliRsnLoopPair(Form("%s.RecMP", name.Data()), pairDefMP, kFALSE);
      listLoops->Add(lp);
   }

   // sets +- TRUE pairs
   if (isMC) {
      lp = new AliRsnLoopPair(Form("%s.RecPM_RecMother", name.Data()), pairDefPM, kFALSE);
      lp->SetOnlyTrue(kTRUE);
      lp->SetCheckDecay(kTRUE);
      listLoops->Add(lp);
      if (!typeSame) {
         lp = new AliRsnLoopPair(Form("%s.RecMP_RecMother", name.Data()), pairDefMP, kFALSE);
         lp->SetOnlyTrue(kTRUE);
         lp->SetCheckDecay(kTRUE);
         listLoops->Add(lp);
      }
      // sets +- TRUE paris (MC is used for momentum)
      lp = new AliRsnLoopPair(Form("%s.GenPM_RecMother", name.Data()), pairDefPM, kFALSE);
      lp->SetTrueMC(kTRUE);
      listLoops->Add(lp);
      if (!typeSame) {
         // sets +- TRUE paris (MC is used for momentum)
         lp = new AliRsnLoopPair(Form("%s.GenMP_RecMother", name.Data()), pairDefMP, kFALSE);
         lp->SetTrueMC(kTRUE);
         listLoops->Add(lp);
      }
   }

   // sets ++
   lp = new AliRsnLoopPair(Form("%s.RecPP", name.Data()), pairDefPP, kFALSE);
   listLoops->Add(lp);

   // sets --
   lp = new AliRsnLoopPair(Form("%s.RecMM", name.Data()), pairDefMM, kFALSE);
   listLoops->Add(lp);

   if (isMixing) {
      // sets +- Mixing (NOT mini)
      lp = new AliRsnLoopPair(Form("%s.RecPM_mix", name.Data()), pairDefPM, kTRUE);
      listLoops->Add(lp);

      // sets -+ Mixing (NOT mini)
      lp = new AliRsnLoopPair(Form("%s.RecMP_mix", name.Data()), pairDefMP, kTRUE);
      listLoops->Add(lp);

      // sets ++ Mixing (NOT mini)
      lp = new AliRsnLoopPair(Form("%s.RecPP_mix", name.Data()), pairDefPP, kTRUE);
      listLoops->Add(lp);

      // sets -- Mixing (NOT mini)
      lp = new AliRsnLoopPair(Form("%s.RecMM_mix", name.Data()), pairDefMM, kTRUE);
      listLoops->Add(lp);
   }


   // loops over all AliRsnLoops and sets everything (don't touch it if you don't know what you are doing)
   TIter next(listLoops);
   while ((lp = (AliRsnLoopPair *)next.Next())) {
      lp->SetListID(0, listID1);
      lp->SetListID(1, listID2);
      lp->SetMCRefInfo(useMCMomentum);
      if (commonPairCuts) lp->SetPairCuts(commonPairCuts);
      if (commonEventCuts) lp->SetEventCuts(commonEventCuts);
      if (name.Contains("phi")) AddPairOutputPhi(lp);
      else if (name.Contains("kstar")) AddPairOutputKStar(lp);
      else if (name.Contains("rho")) AddPairOutputRho(lp);
      else if (name.Contains("lambda")) AddPairOutputLambda(lp);
      else if (name.Contains("sigma")) AddPairOutputSigma(lp);
      else continue;
      ((AliRsnAnalysisTask *)task)->AddLoop(lp);
   }
   return kTRUE;
}

void AddMonitorOutput(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *lm=0)
{

   Bool_t valid;
   Int_t useMCMon = AliAnalysisManager::GetGlobalInt("rsnUseMCMonitoring",valid);
//     if (useMCMon) return;

   // dEdx tpc
   AliRsnValueDaughter *axisMomTPC = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
   AliRsnValueDaughter *axisSigTPC = new AliRsnValueDaughter("sTPC", AliRsnValueDaughter::kTPCsignal);
   //axisMomTPC->SetBins(0.0,5.0,0.01);
   axisMomTPC->SetBins(0.0,12.0,0.05);
   axisSigTPC->SetBins(0.0,500.0,2.0);

   // output: 2D histogram of TPC signal vs. TPC momentum
   AliRsnListOutput *outMonitordEdxTPC = new AliRsnListOutput("dEdx", AliRsnListOutput::kHistoDefault);
   outMonitordEdxTPC->AddValue(axisMomTPC);
   outMonitordEdxTPC->AddValue(axisSigTPC);

   // add outputs to loop
   if (mon) mon->Add(outMonitordEdxTPC);
   if (lm) lm->AddOutput(outMonitordEdxTPC);

   // dEdx tpc
   AliRsnValueDaughter *axisMomTPCForTOF = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
   AliRsnValueDaughter *axisSigTOF = new AliRsnValueDaughter("sTOF", AliRsnValueDaughter::kTOFsignal);
   //axisMomTPCForTOF->SetBins(0.0,5.0,0.01);
   //axisSigTOF->SetBins(0.0,500.0,2.0);
   axisMomTPCForTOF->SetBins(0.0,12.0,0.05);
   axisSigTOF->SetBins(0.0,5.e5,1.e3);

   // output: 2D histogram of TPC signal vs. TPC momentum
   AliRsnListOutput *outMonitordEdxTOF = new AliRsnListOutput("TOF", AliRsnListOutput::kHistoDefault);
   outMonitordEdxTOF->AddValue(axisMomTPCForTOF);
   outMonitordEdxTOF->AddValue(axisSigTOF);

   // add outputs to loop
   if (mon) mon->Add(outMonitordEdxTOF);
   if (lm) lm->AddOutput(outMonitordEdxTOF);


   // Momentum
   AliRsnValueDaughter *axisMomP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kP);
   //axisMomP->SetBins(0.0,5.0,0.01);
   axisMomP->SetBins(0.0,12.0,0.05);

   // output: 2D histogram of TPC signal vs. TPC momentum
   AliRsnListOutput *outMonitorP = new AliRsnListOutput("P", AliRsnListOutput::kHistoDefault);
   outMonitorP->AddValue(axisMomP);

   // add outputs to loop
   if (mon) mon->Add(outMonitorP);
   if (lm) lm->AddOutput(outMonitorP);


   if (useMCMon) {
      AliRsnValueDaughter *axisMomPMC = new AliRsnValueDaughter("pMC", AliRsnValueDaughter::kP);
      axisMomPMC->SetUseMCInfo(kTRUE);
      //axisMomPMC->SetBins(0.0,5.0,0.01);
      axisMomPMC->SetBins(0.0,12.0,0.05);

      // output: 2D histogram of TPC signal vs. TPC momentum
      AliRsnListOutput *outMonitorPMC = new AliRsnListOutput("PMC", AliRsnListOutput::kHistoDefault);
      outMonitorPMC->AddValue(axisMomPMC);

      // add outputs to loop
      if (mon) mon->Add(outMonitorPMC);
      if (lm) lm->AddOutput(outMonitorPMC);
   }


   // Momentum Pt
   AliRsnValueDaughter *axisMomPt = new AliRsnValueDaughter("pt", AliRsnValueDaughter::kPt);
   //axisMomPt->SetBins(0.0,5.0,0.01);
   axisMomPt->SetBins(0.0,12.0,0.05);

   // output: 2D histogram of TPC signal vs. TPC momentum
   AliRsnListOutput *outMonitorPt = new AliRsnListOutput("Pt", AliRsnListOutput::kHistoDefault);
   outMonitorPt->AddValue(axisMomPt);

   // add outputs to loop
   if (mon) mon->Add(outMonitorPt);
   if (lm) lm->AddOutput(outMonitorPt);
   if (useMCMon) {
      // Momentum Pt
      AliRsnValueDaughter *axisMomPtMC = new AliRsnValueDaughter("ptMC", AliRsnValueDaughter::kPt);
      axisMomPtMC->SetUseMCInfo(kTRUE);
      //axisMomPtMC->SetBins(0.0,5.0,0.01);
      axisMomPtMC->SetBins(0.0,12.0,0.05);

      // output: 2D histogram of TPC signal vs. TPC momentum
      AliRsnListOutput *outMonitorPtMC = new AliRsnListOutput("PtMC", AliRsnListOutput::kHistoDefault);
      outMonitorPtMC->AddValue(axisMomPtMC);

      // add outputs to loop
      if (mon) mon->Add(outMonitorPtMC);
      if (lm) lm->AddOutput(outMonitorPtMC);
   }

   // Eta
   AliRsnValueDaughter *axisMomEta = new AliRsnValueDaughter("eta", AliRsnValueDaughter::kEta);
   axisMomEta->SetBins(-1.0,1.0,0.01);

   // output: 2D histogram of TPC signal vs. TPC momentum
   AliRsnListOutput *outMonitorEta = new AliRsnListOutput("Eta", AliRsnListOutput::kHistoDefault);
   outMonitorEta->AddValue(axisMomEta);

   // add outputs to loop
   if (mon) mon->Add(outMonitorEta);
   if (lm) lm->AddOutput(outMonitorEta);

   if (useMCMon) {
      // Eta
      AliRsnValueDaughter *axisMomEtaMC = new AliRsnValueDaughter("etaMC", AliRsnValueDaughter::kEta);
      axisMomEtaMC->SetUseMCInfo(kTRUE);
      axisMomEtaMC->SetBins(-1.0,1.0,0.01);

      // output: 2D histogram of TPC signal vs. TPC momentum
      AliRsnListOutput *outMonitorEtaMC = new AliRsnListOutput("EtaMC", AliRsnListOutput::kHistoDefault);
      outMonitorEtaMC->AddValue(axisMomEtaMC);

      // add outputs to loop
      if (mon) mon->Add(outMonitorEtaMC);
      if (lm) lm->AddOutput(outMonitorEtaMC);
   }

   AliRsnValueDaughter *axisPtBig = new AliRsnValueDaughter("pt", AliRsnValueDaughter::kPt);
   axisPtBig->SetBins(0.0,12.0,0.5);

   // kTOFnsigmaK
   AliRsnValueDaughter *axisTPCnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTPCnsigmaK);
   axisTPCnsigmaK->SetBins(1001,-100,100);

   // output: 2D histogram of TPC signal vs. TPC momentum
   AliRsnListOutput *outMonitorTPCnsigmaK = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
   outMonitorTPCnsigmaK->AddValue(axisTPCnsigmaK);
   outMonitorTPCnsigmaK->AddValue(axisPtBig);

   // add outputs to loop
   if (mon) mon->Add(outMonitorTPCnsigmaK);
   if (lm) lm->AddOutput(outMonitorTPCnsigmaK);

   // kTPCnsigmaPi
   AliRsnValueDaughter *axisTPCnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTPCnsigmaPi);
   axisTPCnsigmaPi->SetBins(1001,-100,100);

   // output: 2D histogram of TPC signal vs. TPC momentum
   AliRsnListOutput *outMonitorTPCnsigmaPi = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
   outMonitorTPCnsigmaPi->AddValue(axisTPCnsigmaPi);
   outMonitorTPCnsigmaPi->AddValue(axisPtBig);

   // add outputs to loop
   if (mon) mon->Add(outMonitorTPCnsigmaPi);
   if (lm) lm->AddOutput(outMonitorTPCnsigmaPi);

   // kTPCnsigmaP
   AliRsnValueDaughter *axisTPCnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTPCnsigmaP);
   axisTPCnsigmaP->SetBins(1001,-100,100);

   // output: 2D histogram of TPC signal vs. TPC momentum
   AliRsnListOutput *outMonitorTPCnsigmaP = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
   outMonitorTPCnsigmaP->AddValue(axisTPCnsigmaP);
   outMonitorTPCnsigmaP->AddValue(axisPtBig);

   // add outputs to loop
   if (mon) mon->Add(outMonitorTPCnsigmaP);
   if (lm) lm->AddOutput(outMonitorTPCnsigmaP);


   if (!opt.Contains("NoTOFSIGMA")) {

      // kTOFnsigmaK
      AliRsnValueDaughter *axisTOFnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTOFnsigmaK);
      axisTOFnsigmaK->SetBins(1001,-100,100);

      // output: 2D histogram of TPC signal vs. TPC momentum
      AliRsnListOutput *outMonitorTOFnsigmaK = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
      outMonitorTOFnsigmaK->AddValue(axisTOFnsigmaK);
      outMonitorTOFnsigmaK->AddValue(axisPtBig);

      // add outputs to loop
      if (mon) mon->Add(outMonitorTOFnsigmaK);
      if (lm) lm->AddOutput(outMonitorTOFnsigmaK);

      // kTOFnsigmaPi
      AliRsnValueDaughter *axisTOFnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTOFnsigmaPi);
      axisTOFnsigmaPi->SetBins(1001,-100,100);

      // output: 2D histogram of TPC signal vs. TPC momentum
      AliRsnListOutput *outMonitorTOFnsigmaPi = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
      outMonitorTOFnsigmaPi->AddValue(axisTOFnsigmaPi);
      outMonitorTOFnsigmaPi->AddValue(axisPtBig);

      // add outputs to loop
      if (mon) mon->Add(outMonitorTOFnsigmaPi);
      if (lm) lm->AddOutput(outMonitorTOFnsigmaPi);

      // kTOFnsigmaP
      AliRsnValueDaughter *axisTOFnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTOFnsigmaP);
      axisTOFnsigmaP->SetBins(1001,-100,100);

      // output: 2D histogram of TPC signal vs. TPC momentum
      AliRsnListOutput *outMonitorTOFnsigmaP = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
      outMonitorTOFnsigmaP->AddValue(axisTOFnsigmaP);
      outMonitorTOFnsigmaP->AddValue(axisPtBig);

      // add outputs to loop
      if (mon) mon->Add(outMonitorTOFnsigmaP);
      if (lm) lm->AddOutput(outMonitorTOFnsigmaP);
   }


   // nITCcluster
   AliRsnValueDaughter *axisITSnClusters = new AliRsnValueDaughter("ITS", AliRsnValueDaughter::kNITSclusters);
   axisITSnClusters->SetBins(10,0,10);

   AliRsnListOutput *outMonitorITSnClusters = new AliRsnListOutput("nClusters", AliRsnListOutput::kHistoDefault);
   outMonitorITSnClusters->AddValue(axisITSnClusters);
   // add outputs to loop
   if (mon) mon->Add(outMonitorITSnClusters);
   if (lm) lm->AddOutput(outMonitorITSnClusters);

   // nTPCcluster
   AliRsnValueDaughter *axisTPCnClusters = new AliRsnValueDaughter("TPC", AliRsnValueDaughter::kNTPCclusters);
   axisTPCnClusters->SetBins(300,0,300);

   AliRsnListOutput *outMonitorTPCnClusters = new AliRsnListOutput("nClusters", AliRsnListOutput::kHistoDefault);
   outMonitorTPCnClusters->AddValue(axisTPCnClusters);
   // add outputs to loop
   if (mon) mon->Add(outMonitorTPCnClusters);
   if (lm) lm->AddOutput(outMonitorTPCnClusters);

   // ITSchi2
   AliRsnValueDaughter *axisITSchi2 = new AliRsnValueDaughter("ITS", AliRsnValueDaughter::kITSchi2);
   axisITSchi2->SetBins(10,0,10);

   AliRsnListOutput *outMonitorITSchi2 = new AliRsnListOutput("chi2", AliRsnListOutput::kHistoDefault);
   outMonitorITSchi2->AddValue(axisITSchi2);
   // add outputs to loop
   if (mon) mon->Add(outMonitorITSchi2);
   if (lm) lm->AddOutput(outMonitorITSchi2);

   // TPCchi2
   AliRsnValueDaughter *axisTPCchi2 = new AliRsnValueDaughter("TPC", AliRsnValueDaughter::kTPCchi2);
   axisTPCchi2->SetBins(10,0,10);

   AliRsnListOutput *outMonitorTPCchi2 = new AliRsnListOutput("chi2", AliRsnListOutput::kHistoDefault);
   outMonitorTPCchi2->AddValue(axisTPCchi2);
   // add outputs to loop
   if (mon) mon->Add(outMonitorTPCchi2);
   if (lm) lm->AddOutput(outMonitorTPCchi2);

   // DCAXY
   AliRsnValueDaughter *axisDCAXY = new AliRsnValueDaughter("XY", AliRsnValueDaughter::kDCAXY);
   axisDCAXY->SetBins(200,-1,1);

   AliRsnListOutput *outMonitorDCAXY = new AliRsnListOutput("DCA", AliRsnListOutput::kHistoDefault);
   outMonitorDCAXY->AddValue(axisDCAXY);
   // add outputs to loop
   if (mon) mon->Add(outMonitorDCAXY);
   if (lm) lm->AddOutput(outMonitorDCAXY);

   // DCAZ
   AliRsnValueDaughter *axisDCAZ = new AliRsnValueDaughter("Z", AliRsnValueDaughter::kDCAZ);
   axisDCAZ->SetBins(200,-1,1);

   AliRsnListOutput *outMonitorDCAZ = new AliRsnListOutput("DCA", AliRsnListOutput::kHistoDefault);
   outMonitorDCAZ->AddValue(axisDCAZ);
   // add outputs to loop
   if (mon) mon->Add(outMonitorDCAZ);
   if (lm) lm->AddOutput(outMonitorDCAZ);

   AliRsnListOutput *outMonitorPTvsMult = new AliRsnListOutput("PTvsMult",AliRsnListOutput::kHistoDefault);
   AliRsnValueDaughter *vd1 = new AliRsnValueDaughter("pt",AliRsnValueDaughter::kPt);
   vd1->SetBins(0.0,5.0,0.01);
   outMonitorPTvsMult->AddValue(vd1);

   AliRsnValueEvent *ve1 = new AliRsnValueEvent("mult",AliRsnValueEvent::kMult);
   ve1->SetBins(0.0,100.0,1);
   outMonitorPTvsMult->AddValue(ve1);
   if (mon) mon->Add(outMonitorPTvsMult);
   if (lm) lm->AddOutput(outMonitorPTvsMult);
   
//    AliRsnListOutput *outMonitorMult = new AliRsnListOutput("EventMult",AliRsnListOutput::kHistoDefault);
// 
//    AliRsnValueEvent *ve1Multi = new AliRsnValueEvent("centrality",AliRsnValueEvent::kCentralityV0);
//    ve1Multi->SetBins(0.0,100,10.0);
//    outMonitorMult->AddValue(ve1Multi);
//    if (mon) mon->Add(outMonitorMult);
//    if (lm) lm->AddOutput(outMonitorMult);
}

void AddMonitorOutputMini(AliRsnMiniMonitorTask *task,Int_t listID1,TString name = "",Char_t charge='0')
{
   TString chargeName="all";
   if ( charge == '+' ) chargeName = "pos";
   if ( charge == '-' ) chargeName = "neg";

   AliRsnMiniMonitor *mondEdx = task->CreateMonitor(Form("%s_dEdx_pTPC_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kdEdxTPCvsP, listID1);
   mondEdx->SetCharge(charge);
   AliRsnMiniMonitor *monPt = task->CreateMonitor(Form("%s_Pt_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kTrackPt, listID1);
   monPt->SetCharge(charge);
}

void AddParticleMonitor(AliAnalysisTaskSE *task, Bool_t isMC, Int_t listID1,AliRsnCutSet *commonEventCuts=0,AliRsnCutSet *cutPair=0,TString name = "")
{
   Bool_t valid;
   Int_t isRsnMini = AliAnalysisManager::GetGlobalInt("rsnUseMiniPackage",valid);
   Int_t useMCMon = AliAnalysisManager::GetGlobalInt("rsnUseMCMonitoring",valid);

   if (isRsnMini) {
//       Printf("Monitoring by mini is not supported now. It will be soon !!!");
//       return ;
      AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
      AliRsnMiniMonitorTask *monTask = new AliRsnMiniMonitorTask(name.Data(),useMCMon);
      AddMonitorOutputMini(monTask,listID1,name);
//       AddMonitorOutputMini(monTask,listID1,name,'+');
//       AddMonitorOutputMini(monTask,listID1,name,'-');
      mgr->AddTask(monTask);
      // connect input container according to source choice
      mgr->ConnectInput(monTask, 0, mgr->GetCommonInputContainer());

      // create paths for the output in the common file
      TString commonPath = AliAnalysisManager::GetCommonFileName();

      // create containers for output
      AliAnalysisDataContainer *output = mgr->CreateContainer(Form("RsnMonMini%s", name.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, commonPath.Data());

      mgr->ConnectOutput(monTask, 1, output);



   } else {

      TList *listLoops = new TList;
      // monitor definition
      AliRsnDaughterDef *tracksAll = new AliRsnDaughterDef(AliRsnDaughter::kTrack /*'+' or '-'*/);
// //       AliRsnDaughterDef *tracksPos = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'+');
// //       AliRsnDaughterDef *tracksNeg = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'-');
//
      AliRsnLoopDaughter *lm =0;
//       // loop object
      listLoops->Add(new AliRsnLoopDaughter(Form("ALL_%s", name.Data()), listID1, tracksAll));
//
// //       listLoops->Add(new AliRsnLoopDaughter(Form("%s_pos", name.Data()), listID1, tracksPos));
// //       listLoops->Add(new AliRsnLoopDaughter(Form("%s_neg", name.Data()), listID1, tracksNeg));
//
      TIter next(listLoops);
      while ((lm = (AliRsnLoopDaughter *)next.Next())) {
//          if (commonEventCuts) lm->SetEventCuts(commonEventCuts);
         AddMonitorOutput(0,"mc_loop",lm);
         ((AliRsnAnalysisTask *)task)->AddLoop(lm);
      }
   }
}

 RsnConfig.C:1
 RsnConfig.C:2
 RsnConfig.C:3
 RsnConfig.C:4
 RsnConfig.C:5
 RsnConfig.C:6
 RsnConfig.C:7
 RsnConfig.C:8
 RsnConfig.C:9
 RsnConfig.C:10
 RsnConfig.C:11
 RsnConfig.C:12
 RsnConfig.C:13
 RsnConfig.C:14
 RsnConfig.C:15
 RsnConfig.C:16
 RsnConfig.C:17
 RsnConfig.C:18
 RsnConfig.C:19
 RsnConfig.C:20
 RsnConfig.C:21
 RsnConfig.C:22
 RsnConfig.C:23
 RsnConfig.C:24
 RsnConfig.C:25
 RsnConfig.C:26
 RsnConfig.C:27
 RsnConfig.C:28
 RsnConfig.C:29
 RsnConfig.C:30
 RsnConfig.C:31
 RsnConfig.C:32
 RsnConfig.C:33
 RsnConfig.C:34
 RsnConfig.C:35
 RsnConfig.C:36
 RsnConfig.C:37
 RsnConfig.C:38
 RsnConfig.C:39
 RsnConfig.C:40
 RsnConfig.C:41
 RsnConfig.C:42
 RsnConfig.C:43
 RsnConfig.C:44
 RsnConfig.C:45
 RsnConfig.C:46
 RsnConfig.C:47
 RsnConfig.C:48
 RsnConfig.C:49
 RsnConfig.C:50
 RsnConfig.C:51
 RsnConfig.C:52
 RsnConfig.C:53
 RsnConfig.C:54
 RsnConfig.C:55
 RsnConfig.C:56
 RsnConfig.C:57
 RsnConfig.C:58
 RsnConfig.C:59
 RsnConfig.C:60
 RsnConfig.C:61
 RsnConfig.C:62
 RsnConfig.C:63
 RsnConfig.C:64
 RsnConfig.C:65
 RsnConfig.C:66
 RsnConfig.C:67
 RsnConfig.C:68
 RsnConfig.C:69
 RsnConfig.C:70
 RsnConfig.C:71
 RsnConfig.C:72
 RsnConfig.C:73
 RsnConfig.C:74
 RsnConfig.C:75
 RsnConfig.C:76
 RsnConfig.C:77
 RsnConfig.C:78
 RsnConfig.C:79
 RsnConfig.C:80
 RsnConfig.C:81
 RsnConfig.C:82
 RsnConfig.C:83
 RsnConfig.C:84
 RsnConfig.C:85
 RsnConfig.C:86
 RsnConfig.C:87
 RsnConfig.C:88
 RsnConfig.C:89
 RsnConfig.C:90
 RsnConfig.C:91
 RsnConfig.C:92
 RsnConfig.C:93
 RsnConfig.C:94
 RsnConfig.C:95
 RsnConfig.C:96
 RsnConfig.C:97
 RsnConfig.C:98
 RsnConfig.C:99
 RsnConfig.C:100
 RsnConfig.C:101
 RsnConfig.C:102
 RsnConfig.C:103
 RsnConfig.C:104
 RsnConfig.C:105
 RsnConfig.C:106
 RsnConfig.C:107
 RsnConfig.C:108
 RsnConfig.C:109
 RsnConfig.C:110
 RsnConfig.C:111
 RsnConfig.C:112
 RsnConfig.C:113
 RsnConfig.C:114
 RsnConfig.C:115
 RsnConfig.C:116
 RsnConfig.C:117
 RsnConfig.C:118
 RsnConfig.C:119
 RsnConfig.C:120
 RsnConfig.C:121
 RsnConfig.C:122
 RsnConfig.C:123
 RsnConfig.C:124
 RsnConfig.C:125
 RsnConfig.C:126
 RsnConfig.C:127
 RsnConfig.C:128
 RsnConfig.C:129
 RsnConfig.C:130
 RsnConfig.C:131
 RsnConfig.C:132
 RsnConfig.C:133
 RsnConfig.C:134
 RsnConfig.C:135
 RsnConfig.C:136
 RsnConfig.C:137
 RsnConfig.C:138
 RsnConfig.C:139
 RsnConfig.C:140
 RsnConfig.C:141
 RsnConfig.C:142
 RsnConfig.C:143
 RsnConfig.C:144
 RsnConfig.C:145
 RsnConfig.C:146
 RsnConfig.C:147
 RsnConfig.C:148
 RsnConfig.C:149
 RsnConfig.C:150
 RsnConfig.C:151
 RsnConfig.C:152
 RsnConfig.C:153
 RsnConfig.C:154
 RsnConfig.C:155
 RsnConfig.C:156
 RsnConfig.C:157
 RsnConfig.C:158
 RsnConfig.C:159
 RsnConfig.C:160
 RsnConfig.C:161
 RsnConfig.C:162
 RsnConfig.C:163
 RsnConfig.C:164
 RsnConfig.C:165
 RsnConfig.C:166
 RsnConfig.C:167
 RsnConfig.C:168
 RsnConfig.C:169
 RsnConfig.C:170
 RsnConfig.C:171
 RsnConfig.C:172
 RsnConfig.C:173
 RsnConfig.C:174
 RsnConfig.C:175
 RsnConfig.C:176
 RsnConfig.C:177
 RsnConfig.C:178
 RsnConfig.C:179
 RsnConfig.C:180
 RsnConfig.C:181
 RsnConfig.C:182
 RsnConfig.C:183
 RsnConfig.C:184
 RsnConfig.C:185
 RsnConfig.C:186
 RsnConfig.C:187
 RsnConfig.C:188
 RsnConfig.C:189
 RsnConfig.C:190
 RsnConfig.C:191
 RsnConfig.C:192
 RsnConfig.C:193
 RsnConfig.C:194
 RsnConfig.C:195
 RsnConfig.C:196
 RsnConfig.C:197
 RsnConfig.C:198
 RsnConfig.C:199
 RsnConfig.C:200
 RsnConfig.C:201
 RsnConfig.C:202
 RsnConfig.C:203
 RsnConfig.C:204
 RsnConfig.C:205
 RsnConfig.C:206
 RsnConfig.C:207
 RsnConfig.C:208
 RsnConfig.C:209
 RsnConfig.C:210
 RsnConfig.C:211
 RsnConfig.C:212
 RsnConfig.C:213
 RsnConfig.C:214
 RsnConfig.C:215
 RsnConfig.C:216
 RsnConfig.C:217
 RsnConfig.C:218
 RsnConfig.C:219
 RsnConfig.C:220
 RsnConfig.C:221
 RsnConfig.C:222
 RsnConfig.C:223
 RsnConfig.C:224
 RsnConfig.C:225
 RsnConfig.C:226
 RsnConfig.C:227
 RsnConfig.C:228
 RsnConfig.C:229
 RsnConfig.C:230
 RsnConfig.C:231
 RsnConfig.C:232
 RsnConfig.C:233
 RsnConfig.C:234
 RsnConfig.C:235
 RsnConfig.C:236
 RsnConfig.C:237
 RsnConfig.C:238
 RsnConfig.C:239
 RsnConfig.C:240
 RsnConfig.C:241
 RsnConfig.C:242
 RsnConfig.C:243
 RsnConfig.C:244
 RsnConfig.C:245
 RsnConfig.C:246
 RsnConfig.C:247
 RsnConfig.C:248
 RsnConfig.C:249
 RsnConfig.C:250
 RsnConfig.C:251
 RsnConfig.C:252
 RsnConfig.C:253
 RsnConfig.C:254
 RsnConfig.C:255
 RsnConfig.C:256
 RsnConfig.C:257
 RsnConfig.C:258
 RsnConfig.C:259
 RsnConfig.C:260
 RsnConfig.C:261
 RsnConfig.C:262
 RsnConfig.C:263
 RsnConfig.C:264
 RsnConfig.C:265
 RsnConfig.C:266
 RsnConfig.C:267
 RsnConfig.C:268
 RsnConfig.C:269
 RsnConfig.C:270
 RsnConfig.C:271
 RsnConfig.C:272
 RsnConfig.C:273
 RsnConfig.C:274
 RsnConfig.C:275
 RsnConfig.C:276
 RsnConfig.C:277
 RsnConfig.C:278
 RsnConfig.C:279
 RsnConfig.C:280
 RsnConfig.C:281
 RsnConfig.C:282
 RsnConfig.C:283
 RsnConfig.C:284
 RsnConfig.C:285
 RsnConfig.C:286
 RsnConfig.C:287
 RsnConfig.C:288
 RsnConfig.C:289
 RsnConfig.C:290
 RsnConfig.C:291
 RsnConfig.C:292
 RsnConfig.C:293
 RsnConfig.C:294
 RsnConfig.C:295
 RsnConfig.C:296
 RsnConfig.C:297
 RsnConfig.C:298
 RsnConfig.C:299
 RsnConfig.C:300
 RsnConfig.C:301
 RsnConfig.C:302
 RsnConfig.C:303
 RsnConfig.C:304
 RsnConfig.C:305
 RsnConfig.C:306
 RsnConfig.C:307
 RsnConfig.C:308
 RsnConfig.C:309
 RsnConfig.C:310
 RsnConfig.C:311
 RsnConfig.C:312
 RsnConfig.C:313
 RsnConfig.C:314
 RsnConfig.C:315
 RsnConfig.C:316
 RsnConfig.C:317
 RsnConfig.C:318
 RsnConfig.C:319
 RsnConfig.C:320
 RsnConfig.C:321
 RsnConfig.C:322
 RsnConfig.C:323
 RsnConfig.C:324
 RsnConfig.C:325
 RsnConfig.C:326
 RsnConfig.C:327
 RsnConfig.C:328
 RsnConfig.C:329
 RsnConfig.C:330
 RsnConfig.C:331
 RsnConfig.C:332
 RsnConfig.C:333
 RsnConfig.C:334
 RsnConfig.C:335
 RsnConfig.C:336
 RsnConfig.C:337
 RsnConfig.C:338
 RsnConfig.C:339
 RsnConfig.C:340
 RsnConfig.C:341
 RsnConfig.C:342
 RsnConfig.C:343
 RsnConfig.C:344
 RsnConfig.C:345
 RsnConfig.C:346
 RsnConfig.C:347
 RsnConfig.C:348
 RsnConfig.C:349
 RsnConfig.C:350
 RsnConfig.C:351
 RsnConfig.C:352
 RsnConfig.C:353
 RsnConfig.C:354
 RsnConfig.C:355
 RsnConfig.C:356
 RsnConfig.C:357
 RsnConfig.C:358
 RsnConfig.C:359
 RsnConfig.C:360
 RsnConfig.C:361
 RsnConfig.C:362
 RsnConfig.C:363
 RsnConfig.C:364
 RsnConfig.C:365
 RsnConfig.C:366
 RsnConfig.C:367
 RsnConfig.C:368
 RsnConfig.C:369
 RsnConfig.C:370
 RsnConfig.C:371
 RsnConfig.C:372
 RsnConfig.C:373
 RsnConfig.C:374
 RsnConfig.C:375
 RsnConfig.C:376
 RsnConfig.C:377
 RsnConfig.C:378
 RsnConfig.C:379
 RsnConfig.C:380
 RsnConfig.C:381
 RsnConfig.C:382
 RsnConfig.C:383
 RsnConfig.C:384
 RsnConfig.C:385
 RsnConfig.C:386
 RsnConfig.C:387
 RsnConfig.C:388
 RsnConfig.C:389
 RsnConfig.C:390
 RsnConfig.C:391
 RsnConfig.C:392
 RsnConfig.C:393
 RsnConfig.C:394
 RsnConfig.C:395
 RsnConfig.C:396
 RsnConfig.C:397
 RsnConfig.C:398
 RsnConfig.C:399
 RsnConfig.C:400
 RsnConfig.C:401
 RsnConfig.C:402
 RsnConfig.C:403
 RsnConfig.C:404
 RsnConfig.C:405
 RsnConfig.C:406
 RsnConfig.C:407
 RsnConfig.C:408
 RsnConfig.C:409
 RsnConfig.C:410
 RsnConfig.C:411
 RsnConfig.C:412
 RsnConfig.C:413
 RsnConfig.C:414
 RsnConfig.C:415
 RsnConfig.C:416
 RsnConfig.C:417
 RsnConfig.C:418
 RsnConfig.C:419
 RsnConfig.C:420
 RsnConfig.C:421
 RsnConfig.C:422
 RsnConfig.C:423
 RsnConfig.C:424
 RsnConfig.C:425
 RsnConfig.C:426
 RsnConfig.C:427
 RsnConfig.C:428
 RsnConfig.C:429
 RsnConfig.C:430
 RsnConfig.C:431
 RsnConfig.C:432
 RsnConfig.C:433
 RsnConfig.C:434
 RsnConfig.C:435
 RsnConfig.C:436
 RsnConfig.C:437
 RsnConfig.C:438
 RsnConfig.C:439
 RsnConfig.C:440
 RsnConfig.C:441
 RsnConfig.C:442
 RsnConfig.C:443
 RsnConfig.C:444
 RsnConfig.C:445
 RsnConfig.C:446
 RsnConfig.C:447
 RsnConfig.C:448
 RsnConfig.C:449
 RsnConfig.C:450
 RsnConfig.C:451
 RsnConfig.C:452
 RsnConfig.C:453
 RsnConfig.C:454
 RsnConfig.C:455
 RsnConfig.C:456
 RsnConfig.C:457
 RsnConfig.C:458
 RsnConfig.C:459
 RsnConfig.C:460
 RsnConfig.C:461
 RsnConfig.C:462
 RsnConfig.C:463
 RsnConfig.C:464
 RsnConfig.C:465
 RsnConfig.C:466
 RsnConfig.C:467
 RsnConfig.C:468
 RsnConfig.C:469
 RsnConfig.C:470
 RsnConfig.C:471
 RsnConfig.C:472
 RsnConfig.C:473
 RsnConfig.C:474
 RsnConfig.C:475
 RsnConfig.C:476
 RsnConfig.C:477
 RsnConfig.C:478
 RsnConfig.C:479
 RsnConfig.C:480
 RsnConfig.C:481
 RsnConfig.C:482
 RsnConfig.C:483
 RsnConfig.C:484
 RsnConfig.C:485
 RsnConfig.C:486
 RsnConfig.C:487
 RsnConfig.C:488
 RsnConfig.C:489
 RsnConfig.C:490
 RsnConfig.C:491
 RsnConfig.C:492
 RsnConfig.C:493
 RsnConfig.C:494
 RsnConfig.C:495
 RsnConfig.C:496
 RsnConfig.C:497
 RsnConfig.C:498
 RsnConfig.C:499
 RsnConfig.C:500
 RsnConfig.C:501
 RsnConfig.C:502
 RsnConfig.C:503
 RsnConfig.C:504
 RsnConfig.C:505
 RsnConfig.C:506
 RsnConfig.C:507
 RsnConfig.C:508
 RsnConfig.C:509
 RsnConfig.C:510
 RsnConfig.C:511
 RsnConfig.C:512
 RsnConfig.C:513
 RsnConfig.C:514
 RsnConfig.C:515
 RsnConfig.C:516
 RsnConfig.C:517
 RsnConfig.C:518
 RsnConfig.C:519
 RsnConfig.C:520
 RsnConfig.C:521
 RsnConfig.C:522
 RsnConfig.C:523
 RsnConfig.C:524
 RsnConfig.C:525
 RsnConfig.C:526
 RsnConfig.C:527
 RsnConfig.C:528
 RsnConfig.C:529
 RsnConfig.C:530
 RsnConfig.C:531
 RsnConfig.C:532
 RsnConfig.C:533
 RsnConfig.C:534
 RsnConfig.C:535
 RsnConfig.C:536
 RsnConfig.C:537
 RsnConfig.C:538
 RsnConfig.C:539
 RsnConfig.C:540
 RsnConfig.C:541
 RsnConfig.C:542
 RsnConfig.C:543
 RsnConfig.C:544
 RsnConfig.C:545
 RsnConfig.C:546
 RsnConfig.C:547
 RsnConfig.C:548
 RsnConfig.C:549
 RsnConfig.C:550
 RsnConfig.C:551
 RsnConfig.C:552
 RsnConfig.C:553
 RsnConfig.C:554
 RsnConfig.C:555
 RsnConfig.C:556
 RsnConfig.C:557
 RsnConfig.C:558
 RsnConfig.C:559
 RsnConfig.C:560
 RsnConfig.C:561
 RsnConfig.C:562
 RsnConfig.C:563
 RsnConfig.C:564
 RsnConfig.C:565
 RsnConfig.C:566
 RsnConfig.C:567
 RsnConfig.C:568
 RsnConfig.C:569
 RsnConfig.C:570
 RsnConfig.C:571
 RsnConfig.C:572
 RsnConfig.C:573
 RsnConfig.C:574
 RsnConfig.C:575
 RsnConfig.C:576
 RsnConfig.C:577
 RsnConfig.C:578
 RsnConfig.C:579
 RsnConfig.C:580
 RsnConfig.C:581
 RsnConfig.C:582
 RsnConfig.C:583
 RsnConfig.C:584
 RsnConfig.C:585
 RsnConfig.C:586
 RsnConfig.C:587
 RsnConfig.C:588
 RsnConfig.C:589
 RsnConfig.C:590
 RsnConfig.C:591
 RsnConfig.C:592
 RsnConfig.C:593
 RsnConfig.C:594
 RsnConfig.C:595
 RsnConfig.C:596
 RsnConfig.C:597
 RsnConfig.C:598
 RsnConfig.C:599
 RsnConfig.C:600
 RsnConfig.C:601