ROOT logo
//--------------------------------------------------------------------------
// Macro compiled and launch by RunMuonResolution.C for submitting muon Resolution analysis locally or on CAF.
// See RunMuonResolution.C for more details
//
// Author: Philippe Pillot - SUBATECH Nantes
//--------------------------------------------------------------------------

#if !defined(__CINT__) || defined(__MAKECINT__)
// ROOT includes
#include <fstream>
#include <TString.h>
#include <TStopwatch.h>
#include <TMultiGraph.h>
#include <TSystem.h>
#include <TChain.h>
#include <TGraphErrors.h>
#include <TProof.h>
#include <TList.h>
#include <TCanvas.h>
#include <TFile.h>
#include <TGrid.h>
#include <TEnv.h>
#include <TROOT.h>
#include "TAxis.h"
#include "THashList.h"
#include <TAlienCollection.h>
#include <TGridCollection.h>
#include <TGridResult.h>

// STEER includes
#include "AliLog.h"
#include "AliCDBManager.h"
#include "AliAnalysisManager.h"
#include "AliESDInputHandler.h"
#include "AliTagAnalysis.h"
#include "AliRunTagCuts.h"
#include "AliLHCTagCuts.h"
#include "AliDetectorTagCuts.h"
#include "AliEventTagCuts.h"
#include "AliPhysicsSelectionTask.h"
#include "AliPhysicsSelection.h"
#include "AliBackgroundSelection.h"
#include "AliCentralitySelectionTask.h"
#include "AliAnalysisDataContainer.h"
#include "AliAnalysisTaskMuonResolution.h"

// MUON includes
#include "AliMpCDB.h"
#include "AliMpDetElement.h"
#include "AliMpDDLStore.h"
#include "AliMUONCalibParamND.h"
#include "AliMUON2DMap.h"
#include "AliMUONTrackerData.h"
#include "AliMUONPainterDataRegistry.h"
#include "AliMUONTrackerDataWrapper.h"

#include "AliMuonTrackCuts.h"

#include "AddTaskMuonResolution.C"

#endif

enum {kLocal, kInteractif_xml, kInteractif_ESDList, kProof};
Int_t nDE = 200;

Bool_t  Resume(Int_t &firstStep, Double_t clusterResNB[10], Double_t clusterResB[10],
	       Double_t clusterResNBErr[10], Double_t clusterResBErr[10],
	       Bool_t shiftHalfCh, Double_t halfChShiftNB[20], Double_t halfChShiftB[20],
	       Double_t halfChShiftNBErr[20], Double_t halfChShiftBErr[20],
	       Bool_t shiftDE, Double_t deShiftNB[200], Double_t deShiftB[200],
	       TGraphErrors* clusterResXVsStep[10], TGraphErrors* clusterResYVsStep[10],
	       TGraphErrors* halfChShiftXVsStep[20], TGraphErrors* halfChShiftYVsStep[20]);
void    LoadAlirootOnProof(TString& aaf, TString rootVersion, TString alirootVersion, TString& extraLibs, Int_t iStep);
AliAnalysisTaskMuonResolution* CreateAnalysisTrain(Int_t mode, Int_t iStep, Bool_t selectPhysics, Bool_t selectTrigger, Bool_t matchTrig,
						   Bool_t applyAccCut, Double_t minMomentum, Bool_t correctForSystematics, Int_t extrapMode,
						   Double_t clusterResNB[10], Double_t clusterResB[10],
						   Bool_t shiftHalfCh, Double_t halfChShiftNB[20], Double_t halfChShiftB[20],
						   Bool_t shiftDE, Double_t deShiftNB[200], Double_t deShiftB[200]);
Bool_t  GetChamberResolution(Int_t iStep, Double_t clusterResNB[10], Double_t clusterResB[10],
			     Double_t clusterResNBErr[10], Double_t clusterResBErr[10]);
Bool_t  AddHalfChShift(Int_t iStep, Double_t halfChShiftNB[20], Double_t halfChShiftB[20], Double_t halfChShiftNBErr[20], Double_t halfChShiftBErr[20]);
Bool_t  AddDEShift(Int_t iStep, Double_t deShiftNB[200], Double_t deShiftB[200]);
void    AddMCHViews(TFile* file);
AliMUONTrackerData* ConvertGraph(TGraphErrors& g, const char* name);
Int_t   GetMode(TString smode, TString input);
TChain* CreateChainFromCollection(const char *xmlfile);
TChain* CreateChainFromFile(const char *rootfile);
TChain* CreateChainFromESDList(const char *esdList);
TChain* CreateChain(Int_t mode, TString input);

//______________________________________________________________________________
void MuonResolution(TString smode, TString inputFileName, TString rootVersion, TString alirootVersion, Int_t nSteps,
		    Bool_t selectPhysics, Bool_t selectTrigger, Bool_t matchTrig, Bool_t applyAccCut,
		    Double_t minMomentum, Bool_t correctForSystematics, Int_t extrapMode,
		    Bool_t shiftHalfCh, Bool_t shiftDE, Int_t nevents, TString extraLibs)
{
  /// Compute the cluster resolution by studying cluster-track residual, deconvoluting from track resolution
  
  // timer start...
  TStopwatch* localTimer = new TStopwatch;
  
  // check parameters
  nSteps = TMath::Max(nSteps,1);
  if (extrapMode != 0 && extrapMode != 1) {
    Error("MuonResolution","incorrect extrapolation mode!");
    return;
  }
  
  // Check runing mode
  Int_t mode = GetMode(smode, inputFileName);
  if(mode < 0){
    Error("MuonResolution","Please provide either an ESD root file, a list of ESDs, a collection of ESDs or a dataset.");
    return;
  }
  
  // set starting chamber resolution (if -1 they will be loaded from recoParam in the task)
  Double_t clusterResNB[10] = {-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.};
  Double_t clusterResB[10] = {-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.};
  Double_t clusterResNBErr[10] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  Double_t clusterResBErr[10] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  Double_t halfChShiftNB[20] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  Double_t halfChShiftB[20] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  Double_t halfChShiftNBErr[20] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  Double_t halfChShiftBErr[20] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  Double_t deShiftNB[200];
  Double_t deShiftB[200];
  for (Int_t i=0; i<200; i++) {
    deShiftNB[i] = 0.;
    deShiftB[i] = 0.;
  }
  
  // output graphs
  TMultiGraph* mgClusterResXVsStep = new TMultiGraph("mgClusterResXVsStep","cluster X-resolution versus step;step;#sigma_{X} (cm)");
  TMultiGraph* mgClusterResYVsStep = new TMultiGraph("mgClusterResYVsStep","cluster Y-resolution versus step;step;#sigma_{Y} (cm)");
  TGraphErrors* clusterResXVsStep[10];
  TGraphErrors* clusterResYVsStep[10];
  for (Int_t i = 0; i < 10; i++) {
    clusterResXVsStep[i] = new TGraphErrors(nSteps+1);
    clusterResXVsStep[i]->SetName(Form("gResX_ch%d",i+1));
    clusterResXVsStep[i]->SetMarkerStyle(kFullDotMedium);
    clusterResXVsStep[i]->SetMarkerColor(i+1+i/9);
    mgClusterResXVsStep->Add(clusterResXVsStep[i],"lp");
    
    clusterResYVsStep[i] = new TGraphErrors(nSteps+1);
    clusterResYVsStep[i]->SetName(Form("gResY_ch%d",i+1));
    clusterResYVsStep[i]->SetMarkerStyle(kFullDotMedium);
    clusterResYVsStep[i]->SetMarkerColor(i+1+i/9);
    mgClusterResYVsStep->Add(clusterResYVsStep[i],"lp");
  }
  TMultiGraph* mgHalfChShiftXVsStep = new TMultiGraph("mgHalfChShiftXVsStep","half-chamber displacement in X direction versus step;step;#Delta_{X} (cm)");
  TMultiGraph* mgHalfChShiftYVsStep = new TMultiGraph("mgHalfChShiftYVsStep","half-chamber displacement in Y direction versus step;step;#Delta_{Y} (cm)");
  TGraphErrors* halfChShiftXVsStep[20];
  TGraphErrors* halfChShiftYVsStep[20];
  for (Int_t i = 0; i < 20; i++) {
    halfChShiftXVsStep[i] = new TGraphErrors(nSteps+1);
    halfChShiftXVsStep[i]->SetName(Form("gShiftX_hch%d",i+1));
    halfChShiftXVsStep[i]->SetMarkerStyle(kFullDotMedium);
    halfChShiftXVsStep[i]->SetMarkerColor(i+1+i/9+i/18);
    mgHalfChShiftXVsStep->Add(halfChShiftXVsStep[i],"lp");
    halfChShiftXVsStep[i]->SetPoint(0, 0, halfChShiftNB[i]);
    halfChShiftXVsStep[i]->SetPointError(0, 0., halfChShiftNBErr[i]);
    
    halfChShiftYVsStep[i] = new TGraphErrors(nSteps+1);
    halfChShiftYVsStep[i]->SetName(Form("gShiftY_hch%d",i+1));
    halfChShiftYVsStep[i]->SetMarkerStyle(kFullDotMedium);
    halfChShiftYVsStep[i]->SetMarkerColor(i+1+i/9+i/18);
    mgHalfChShiftYVsStep->Add(halfChShiftYVsStep[i],"lp");
    halfChShiftYVsStep[i]->SetPoint(0, 0, halfChShiftB[i]);
    halfChShiftYVsStep[i]->SetPointError(0, 0., halfChShiftBErr[i]);
  }
  
  // check for old output files
  Int_t firstStep = 0;
  char remove = '\0';
  if (!gSystem->Exec("ls chamberResolution_step*[0-9].root")) {
    cout<<"Above files already exist in the current directory. [d=delete, r=resume, e=exit] "<<flush;
    while (remove != 'd' && remove != 'r' && remove != 'e') cin>>remove;
    if (remove == 'y') gSystem->Exec("rm -f chamberResolution_step*[0-9].root");
    else if (remove == 'r' && !Resume(firstStep, clusterResNB, clusterResB, clusterResNBErr, clusterResBErr,
				      shiftHalfCh, halfChShiftNB, halfChShiftB, halfChShiftNBErr, halfChShiftBErr,
				      shiftDE, deShiftNB, deShiftB, clusterResXVsStep, clusterResYVsStep,
				      halfChShiftXVsStep, halfChShiftYVsStep)) return;
    else if (remove == 'e') return;
  }
  
  // Create input object
  TObject* inputObj = 0x0;
  if (mode == kProof) inputObj = new TObjString(inputFileName);
  else inputObj = CreateChain(mode, inputFileName);
  if (!inputObj) return;
  
  // loop over step
  for (Int_t iStep = firstStep; iStep < nSteps; iStep++) {
    cout<<"step "<<iStep+1<<"/"<<nSteps<<endl;
    
    // Connect to proof if needed and prepare environment
    if (mode == kProof) LoadAlirootOnProof(smode, rootVersion, alirootVersion, extraLibs, iStep-firstStep);
    
    // create the analysis train
    AliAnalysisTaskMuonResolution *muonResolution = CreateAnalysisTrain(mode, iStep, selectPhysics, selectTrigger,
				                        matchTrig, applyAccCut, minMomentum, correctForSystematics,
							extrapMode, clusterResNB, clusterResB, shiftHalfCh,
							halfChShiftNB, halfChShiftB, shiftDE, deShiftNB, deShiftB);
    if (!muonResolution) return;
    
    // start analysis
    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
    if (mgr->InitAnalysis()) {
      mgr->PrintStatus();
      if (mode == kProof) mgr->StartAnalysis("proof", static_cast<TObjString*>(inputObj)->GetName(), nevents);
      else mgr->StartAnalysis("local", static_cast<TChain*>(inputObj), nevents);
    }
    
    // save the summary canvases and mchview display
    if (muonResolution->GetCanvases()) {
      TFile* outFile = TFile::Open(Form("chamberResolution_step%d.root", iStep),"UPDATE");
      if (outFile && outFile->IsOpen()) {
	outFile->cd();
	muonResolution->GetCanvases()->Write();
	AddMCHViews(outFile);
	outFile->Close();
	delete outFile;
      }
    }
    
    // fill graphs with starting resolutions from the task at very first step
    if (iStep == 0) {
      muonResolution->GetStartingResolution(clusterResNB, clusterResB);
      for (Int_t i = 0; i < 10; i++) {
	clusterResXVsStep[i]->SetPoint(0, 0, clusterResNB[i]);
	clusterResXVsStep[i]->SetPointError(0, 0., clusterResNBErr[i]);
	clusterResYVsStep[i]->SetPoint(0, 0, clusterResB[i]);
	clusterResYVsStep[i]->SetPointError(0, 0., clusterResBErr[i]);
      }
    }
    
    // read the chamber resolution from the output file
    if (!GetChamberResolution(iStep, clusterResNB, clusterResB, clusterResNBErr, clusterResBErr)) return;
    
    // fill graphs with computed resolutions
    for (Int_t i = 0; i < 10; i++) {
      clusterResXVsStep[i]->SetPoint(iStep+1, iStep+1, clusterResNB[i]);
      clusterResXVsStep[i]->SetPointError(iStep+1, 0., clusterResNBErr[i]);
      clusterResYVsStep[i]->SetPoint(iStep+1, iStep+1, clusterResB[i]);
      clusterResYVsStep[i]->SetPointError(iStep+1, 0., clusterResBErr[i]);
    }
    
    // get the half-chamber displacements currently used and add the new measurements from the output file
    muonResolution->GetHalfChShift(halfChShiftNB, halfChShiftB);
    if (!AddHalfChShift(iStep, halfChShiftNB, halfChShiftB, halfChShiftNBErr, halfChShiftBErr)) return;
    
    // fill graphs with computed displacements
    for (Int_t i = 0; i < 20; i++) {
      halfChShiftXVsStep[i]->SetPoint(iStep+1, iStep+1, halfChShiftNB[i]);
      halfChShiftXVsStep[i]->SetPointError(iStep+1, 0., halfChShiftNBErr[i]);
      halfChShiftYVsStep[i]->SetPoint(iStep+1, iStep+1, halfChShiftB[i]);
      halfChShiftYVsStep[i]->SetPointError(iStep+1, 0., halfChShiftBErr[i]);
    }
    
    // get the DE displacements currently used and add the new measurements from the output file
    muonResolution->GetDEShift(deShiftNB, deShiftB);
    if (!AddDEShift(iStep, deShiftNB, deShiftB)) return;
    
    // clean memory
    mgr->SetAnalysisType(AliAnalysisManager::kLocalAnalysis); // to make sure that all output containers are deleted
    delete mgr;
    TObject::SetObjectStat(kFALSE);
    
  }
  
  // copy final results in results.root file
  gSystem->Exec(Form("cp chamberResolution_step%d.root results.root", nSteps-1));
  
  // display convergence of cluster resolution
  TCanvas* convergence1 = new TCanvas("convergenceRes","convergence of cluster resolution");
  convergence1->Divide(1,2);
  convergence1->cd(1);
  mgClusterResXVsStep->Draw("ap");
  convergence1->cd(2);
  mgClusterResYVsStep->Draw("ap");
  
  // display convergence of half-chamber displacements
  TCanvas* convergence2 = new TCanvas("convergenceShift","convergence of half-chamber displacements");
  convergence2->Divide(1,2);
  convergence2->cd(1);
  mgHalfChShiftXVsStep->Draw("ap");
  convergence2->cd(2);
  mgHalfChShiftYVsStep->Draw("ap");
  
  // save convergence plots
  TFile* outFile = TFile::Open("results.root","UPDATE");
  if (!outFile || !outFile->IsOpen()) return;
  outFile->cd();
  mgClusterResXVsStep->Write();
  mgClusterResYVsStep->Write();
  convergence1->Write();
  mgHalfChShiftXVsStep->Write();
  mgHalfChShiftYVsStep->Write();
  convergence2->Write();
  outFile->Close();
  delete outFile;
  
  // print final half-chamber displacements
  printf("\nhalf-chamber total displacements:\n");
  printf(" - non-bending:");
  for (Int_t i = 0; i < 20; i++) printf((i==0)?" %6.4f":", %6.4f", halfChShiftNB[i]);
  printf("\n -     bending:");
  for (Int_t i = 0; i < 20; i++) printf((i==0)?" %6.4f":", %6.4f", halfChShiftB[i]);
  printf("\n\n");
  
  // print final DE displacements
  printf("\nDE total displacements:\n");
  printf(" - non-bending:");
  for (Int_t i = 0; i < nDE; i++) printf((i==0)?" %6.4f":", %6.4f", deShiftNB[i]);
  printf("\n -     bending:");
  for (Int_t i = 0; i < nDE; i++) printf((i==0)?" %6.4f":", %6.4f", deShiftB[i]);
  printf("\n\n");
  
  // ...timer stop
  localTimer->Stop();
  localTimer->Print();
  delete localTimer;
  
}

//______________________________________________________________________________
Bool_t Resume(Int_t &firstStep, Double_t clusterResNB[10], Double_t clusterResB[10],
	      Double_t clusterResNBErr[10], Double_t clusterResBErr[10],
	      Bool_t shiftHalfCh, Double_t halfChShiftNB[20], Double_t halfChShiftB[20],
	      Double_t halfChShiftNBErr[20], Double_t halfChShiftBErr[20],
	      Bool_t shiftDE, Double_t deShiftNB[200], Double_t deShiftB[200],
	      TGraphErrors* clusterResXVsStep[10], TGraphErrors* clusterResYVsStep[10],
	      TGraphErrors* halfChShiftXVsStep[20], TGraphErrors* halfChShiftYVsStep[20])
{
  /// resume analysis from desired step
  
  while (kTRUE) {
    
    // Get the step to restart from
    cout<<"From which step (included) you want to resume? [#, e=exit] "<<flush;
    TString step = "";
    do {step.Gets(stdin,kTRUE);} while (!step.IsDigit() && step != "e");
    if (step == "e") return kFALSE;
    firstStep = step.Atoi();
    
    // restart from scratch if requested
    if (firstStep == 0) {
      gSystem->Exec("rm -f chamberResolution_step*[0-9].root");
      return kTRUE;
    }
    
    // look for results from the previous step
    if (gSystem->AccessPathName(Form("chamberResolution_step%d.root", firstStep-1))) {
      cout<<"No result found from the previous step ("<<firstStep-1<<"). Unable to resume from step "<<firstStep<<endl;
      continue;
    }
    
    // fill graph with starting resolutions
    for (Int_t i = 0; i < 10; i++) {
      clusterResXVsStep[i]->SetPoint(0, 0, clusterResNB[i]);
      clusterResXVsStep[i]->SetPointError(0, 0., clusterResNBErr[i]);
      clusterResYVsStep[i]->SetPoint(0, 0, clusterResB[i]);
      clusterResYVsStep[i]->SetPointError(0, 0., clusterResBErr[i]);
    }
    
    // loop over previous steps
    Bool_t missingInfo = kFALSE;
    for (Int_t iStep = 0; iStep < firstStep; iStep++) {
      
      // read the chamber resolution from the output file
      if (!GetChamberResolution(iStep, clusterResNB, clusterResB, clusterResNBErr, clusterResBErr) && iStep == firstStep-1) {
	missingInfo = kTRUE;
	break;
      }
      
      // fill graphs with computed resolutions
      for (Int_t i = 0; i < 10; i++) {
	clusterResXVsStep[i]->SetPoint(iStep+1, iStep+1, clusterResNB[i]);
	clusterResXVsStep[i]->SetPointError(iStep+1, 0., clusterResNBErr[i]);
	clusterResYVsStep[i]->SetPoint(iStep+1, iStep+1, clusterResB[i]);
	clusterResYVsStep[i]->SetPointError(iStep+1, 0., clusterResBErr[i]);
      }
      
      // reset the half-chamber displacements if not used and add the new measurements from the output file
      if (!shiftHalfCh) for (Int_t i=0; i<20; i++) {
	halfChShiftNB[i] = 0.; halfChShiftB[i] = 0.;
	halfChShiftNBErr[i] = 0.; halfChShiftBErr[i] = 0.;
      }
      if (!AddHalfChShift(iStep, halfChShiftNB, halfChShiftB, halfChShiftNBErr, halfChShiftBErr) && shiftHalfCh) {
	missingInfo = kTRUE;
	break;
      }
      
      // fill graphs with computed displacements
      for (Int_t i = 0; i < 20; i++) {
	halfChShiftXVsStep[i]->SetPoint(iStep+1, iStep+1, halfChShiftNB[i]);
	halfChShiftXVsStep[i]->SetPointError(iStep+1, 0., halfChShiftNBErr[i]);
	halfChShiftYVsStep[i]->SetPoint(iStep+1, iStep+1, halfChShiftB[i]);
	halfChShiftYVsStep[i]->SetPointError(iStep+1, 0., halfChShiftBErr[i]);
      }
      
      // add the new measurements of DE displacements from the output file if in use
      if (shiftDE && !AddDEShift(iStep, deShiftNB, deShiftB)) {
	missingInfo = kTRUE;
	break;
      }
      
    }
    
    // check if missing important results from previous steps
    if (missingInfo) continue;
    
    // keep previous steps and remove the others
    gSystem->Exec("mkdir __TMP__");
    for (Int_t iStep = 0; iStep < firstStep; iStep++)
      if (!gSystem->AccessPathName(Form("chamberResolution_step%d.root", iStep)))
	gSystem->Exec(Form("mv chamberResolution_step%d.root __TMP__", iStep));
    gSystem->Exec("rm -f chamberResolution_step*[0-9].root");
    gSystem->Exec("mv __TMP__/chamberResolution_step*[0-9].root .");
    gSystem->Exec("rm -rf __TMP__");
    
    return kTRUE;
  }
  
}

//______________________________________________________________________________
void LoadAlirootOnProof(TString& aaf, TString rootVersion, TString alirootVersion, TString& extraLibs, Int_t iStep)
{
  /// Load aliroot packages and set environment on Proof
  
  // set general environment and close previous session
  if (iStep == 0) gEnv->SetValue("XSec.GSI.DelegProxy","2");
  else gProof->Close("s");
  
  // connect
  TString location = (aaf == "caf") ? "alice-caf.cern.ch" : "nansafmaster.in2p3.fr"; //"localhost:1093"
  TString nWorkers = (aaf == "caf") ? "workers=80" : ""; //"workers=3x"
  TString user = (gSystem->Getenv("alien_API_USER") == NULL) ? "" : Form("%s@",gSystem->Getenv("alien_API_USER"));
  TProof::Mgr(Form("%s%s",user.Data(), location.Data()))->SetROOTVersion(Form("VO_ALICE@ROOT::%s",rootVersion.Data()));
  TProof::Open(Form("%s%s/?N",user.Data(), location.Data()), nWorkers.Data());
  if (!gProof) return;
  
  // set environment and load libraries on workers
  TList* list = new TList();
  list->Add(new TNamed("ALIROOT_MODE", ""));
  list->Add(new TNamed("ALIROOT_EXTRA_LIBS", extraLibs.Data()));
  if (!gSystem->AccessPathName("AliAnalysisTaskMuonResolution.cxx"))
    list->Add(new TNamed("ALIROOT_EXTRA_INCLUDES", "MUON:MUON/mapping"));
  gProof->EnablePackage(Form("VO_ALICE@AliRoot::%s",alirootVersion.Data()), list, kTRUE);
  
  // compile task on workers
  if (!gSystem->AccessPathName("AliAnalysisTaskMuonResolution.cxx"))
    gProof->Load("AliAnalysisTaskMuonResolution.cxx++g", kTRUE);
  
}

//______________________________________________________________________________
AliAnalysisTaskMuonResolution* CreateAnalysisTrain(Int_t mode, Int_t iStep, Bool_t selectPhysics, Bool_t selectTrigger, Bool_t matchTrig,
						   Bool_t applyAccCut, Double_t minMomentum, Bool_t correctForSystematics, Int_t extrapMode,
						   Double_t clusterResNB[10], Double_t clusterResB[10],
						   Bool_t shiftHalfCh, Double_t halfChShiftNB[20], Double_t halfChShiftB[20],
						   Bool_t shiftDE, Double_t deShiftNB[200], Double_t deShiftB[200])
{
  /// create the analysis train and configure it
  
  // Create the analysis manager
  AliAnalysisManager *mgr = new AliAnalysisManager("MuonResolutionAnalysis");
  //mgr->SetNSysInfo(100);
  
  // ESD input handler
  AliESDInputHandler* esdH = new AliESDInputHandler();
  esdH->SetReadFriends(kFALSE);
  esdH->SetInactiveBranches("*");
  esdH->SetActiveBranches("MuonTracks MuonClusters MuonPads AliESDRun. AliESDHeader. AliMultiplicity. AliESDFMD. AliESDVZERO. SPDVertex. PrimaryVertex. AliESDZDC.");
  mgr->SetInputEventHandler(esdH);
  
  // event selection
  if (selectPhysics) {
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
    if (!gROOT->ProcessLineFast("AddTaskPhysicsSelection()")) {
      Error("CreateAnalysisTrain","AliPhysicsSelectionTask not created!");
      return 0x0;
    }
  }
  
  // centrality selection
  gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
  if (!gROOT->ProcessLineFast("AddTaskCentrality()")) {
    Error("CreateAnalysisTrain","AliCentralitySelectionTask not created!");
    return 0x0;
  }
  
  // Muon Resolution analysis
  TString outputFileName = Form("chamberResolution_step%d.root", iStep);
  AliAnalysisManager::SetCommonFileName(outputFileName.Data());
  AliAnalysisTaskMuonResolution *muonResolution = AddTaskMuonResolution(selectPhysics, selectTrigger, matchTrig, applyAccCut, minMomentum, correctForSystematics, extrapMode);
  if (!muonResolution) {
    Error("CreateAnalysisTrain","AliAnalysisTaskMuonResolution not created!");
    return 0x0;
  }
  /*if (mode == kLocal) muonResolution->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
  else */muonResolution->SetDefaultStorage("raw://");
  if (mode != kProof) muonResolution->ShowProgressBar();
  muonResolution->PrintClusterRes(kTRUE, kTRUE);
  muonResolution->SetStartingResolution(clusterResNB, clusterResB);
  muonResolution->RemoveMonoCathodClusters(kTRUE, kFALSE);
//  muonResolution->FitResiduals(kFALSE);
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011","");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011", "alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align2");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align2");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBVanik");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBJavier");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBVanik2");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBJavier2");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBTest");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBJavierI");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBJavier2St345");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestQuadrant");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00as_x_CDB");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00as_x_CDB");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00asCDB");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00asCDB");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00as_xypxvzyvz_x015y015_CDB");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00as_xypxvzyvz_x015y015_CDB");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00as_xypxvzyvz_x010y015_CDB");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00as_xypxvzyvz_x010y015_CDB");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00as_gc5_x015y015_fix24zIO_CDB");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011", "alien://folder=/alice/cern.ch/user/j/jcastill/ReAligni00as_gc5_x015y015_fix24zIO_CDB");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBVanik2St345_B2");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBVanik2St345_B3");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBQuadrant_B2");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/MATFtestCDBQuadrant_B3");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011", "alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align2bis");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/p/ppillot/OCDB_BON_woConst");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/p/ppillot/OCDB_BON_wConst");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/p/ppillot/OCDB_BON_wConst_v2");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/s/shahoian/CorG4Fresmx05y015");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/s/shahoian/CorG4Gresmx05y015");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011", "alien://folder=/alice/cern.ch/user/s/shahoian/CorG4Gresmx05y015");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/p/ppillot/OCDB_RubenB0");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/j/jcastill/CorG4Fresmx05y015_BOff");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/j/jcastill/CorG4Fresmx05y015");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/j/jcastill/CorG4Gresmx05y015_BOff");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/j/jcastill/CorG4Gresmx05y015");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/j/jcastill/pbpb11wrk/CorG4Fresmx05y015_pp2PbPb");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "alien://folder=/alice/cern.ch/user/j/jcastill/pp11wrk/CorG4Fresmx05y015_pp2pp");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2011_Align1", "");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/pp12wrk/RAi00ab_p1_t1b_CDB");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/pp12wrk/RAi00ab_p1_t2b_CDB");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/pp12wrk/LHC12h_3ce");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/pp12wrk/LHC12h_4cf");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/pp12wrk/LHC12h_5cf");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/pp12wrk/LHC11Boffp2");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/pp12wrk/LHC12h_8dh");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/h/hupereir/CDB/LHC12_ReAlign_0");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/j/jcastill/pp12wrk/LHC12h_8di");
//  muonResolution->ReAlign("", "alien://folder=/alice/cern.ch/user/h/hupereir/CDB/LHC12_ReAlign_new_0");
//  muonResolution->ReAlign("alien://folder=/alice/cern.ch/user/p/ppillot/OCDB2012", "alien://folder=/alice/cern.ch/user/h/hupereir/CDB/LHC12_ReAlign_new_1");
  
  muonResolution->SetAlignStorage("alien://folder=/alice/simulation/2008/v4-15-Release/Residual");
  
  if (shiftHalfCh) {
    muonResolution->SetHalfChShift(halfChShiftNB, halfChShiftB);
    muonResolution->ShiftHalfCh();
    muonResolution->PrintHalfChShift();
  }
  if (shiftDE) {
    muonResolution->SetDEShift(deShiftNB, deShiftB);
    muonResolution->ShiftDE();
    muonResolution->PrintDEShift();
  }
//  muonResolution->ImproveTracks(kTRUE);
  AliMuonTrackCuts trackCuts("stdCuts", "stdCuts");
  trackCuts.SetAllowDefaultParams();
  trackCuts.SetIsMC();
  trackCuts.SetFilterMask(AliMuonTrackCuts::kMuPdca);
  muonResolution->SetMuonTrackCuts(trackCuts);
  
  return muonResolution;
  
}

//______________________________________________________________________________
Bool_t GetChamberResolution(Int_t iStep, Double_t clusterResNB[10], Double_t clusterResB[10], Double_t clusterResNBErr[10], Double_t clusterResBErr[10])
{
  /// read the chamber resolution from the output file
  
  TFile* outFile = TFile::Open(Form("chamberResolution_step%d.root", iStep),"READ");
  
  if (!outFile || !outFile->IsOpen()) {
    Error("GetChamberResolution","output file does not exist!");
    return kFALSE;
  }
  
  TObjArray* summary = static_cast<TObjArray*>(outFile->FindObjectAny("ChamberRes"));
  TGraphErrors* gCombinedResidualXPerChSigma = (summary) ? static_cast<TGraphErrors*>(summary->FindObject("gCombinedResidualXPerChSigma")) : 0x0;
  TGraphErrors* gCombinedResidualYPerChSigma = (summary) ? static_cast<TGraphErrors*>(summary->FindObject("gCombinedResidualYPerChSigma")) : 0x0;
  
  if (!gCombinedResidualXPerChSigma || !gCombinedResidualYPerChSigma) {
    Error("GetChamberResolution","resolution graphs do not exist!");
    return kFALSE;
  }
  
  Double_t dummy;
  for (Int_t i = 0; i < 10; i++) {
    gCombinedResidualXPerChSigma->GetPoint(i, dummy, clusterResNB[i]);
    gCombinedResidualYPerChSigma->GetPoint(i, dummy, clusterResB[i]);
    clusterResNBErr[i] = gCombinedResidualXPerChSigma->GetErrorY(i);
    clusterResBErr[i] = gCombinedResidualYPerChSigma->GetErrorY(i);
  }
  
  outFile->Close();
  //delete outFile;
  
  return kTRUE;
}

//______________________________________________________________________________
Bool_t AddHalfChShift(Int_t iStep, Double_t halfChShiftNB[20], Double_t halfChShiftB[20], Double_t halfChShiftNBErr[20], Double_t halfChShiftBErr[20])
{
  /// read the chamber resolution from the output file
  
  TFile* outFile = TFile::Open(Form("chamberResolution_step%d.root", iStep),"READ");
  
  if (!outFile || !outFile->IsOpen()) {
    Error("AddHalfChShift","output file does not exist!");
    return kFALSE;
  }
  
  TObjArray* summary = static_cast<TObjArray*>(outFile->FindObjectAny("ChamberRes"));
  TGraphErrors* gResidualXPerHalfChMean = (summary) ? static_cast<TGraphErrors*>(summary->FindObject("gResidualXPerHalfChMean_ClusterIn")) : 0x0;
  TGraphErrors* gResidualYPerHalfChMean = (summary) ? static_cast<TGraphErrors*>(summary->FindObject("gResidualYPerHalfChMean_ClusterIn")) : 0x0;
  
  if (!gResidualXPerHalfChMean || !gResidualYPerHalfChMean) {
    Error("AddHalfChShift","half-chamber shift graphs do not exist!");
    return kFALSE;
  }
  
  Double_t dummy, dx, dy;
  for (Int_t i = 0; i < 20; i++) {
    gResidualXPerHalfChMean->GetPoint(i, dummy, dx);
    halfChShiftNB[i] += dx;
    halfChShiftNBErr[i] = gResidualXPerHalfChMean->GetErrorY(i);
    gResidualYPerHalfChMean->GetPoint(i, dummy, dy);
    halfChShiftB[i] += dy;
    halfChShiftBErr[i] = gResidualYPerHalfChMean->GetErrorY(i);
  }
  
  outFile->Close();
  //delete outFile;
  
  return kTRUE;
}

//______________________________________________________________________________
Bool_t AddDEShift(Int_t iStep, Double_t deShiftNB[200], Double_t deShiftB[200])
{
  /// read the chamber resolution from the output file
  
  TFile* outFile = TFile::Open(Form("chamberResolution_step%d.root", iStep),"READ");
  
  if (!outFile || !outFile->IsOpen()) {
    Error("AddDEShift","output file does not exist!");
    return kFALSE;
  }
  
  TObjArray* summary = static_cast<TObjArray*>(outFile->FindObjectAny("ChamberRes"));
  TGraphErrors* gResidualXPerDEMean = (summary) ? static_cast<TGraphErrors*>(summary->FindObject("gResidualXPerDEMean_ClusterIn")) : 0x0;
  TGraphErrors* gResidualYPerDEMean = (summary) ? static_cast<TGraphErrors*>(summary->FindObject("gResidualYPerDEMean_ClusterIn")) : 0x0;
  
  if (!gResidualXPerDEMean || !gResidualYPerDEMean) {
    Error("AddDEShift","DE shift graphs do not exist!");
    return kFALSE;
  }
  
  Double_t dummy, dx, dy;
  nDE = gResidualXPerDEMean->GetN();
  for (Int_t i = 0; i < nDE; i++) {
    gResidualXPerDEMean->GetPoint(i, dummy, dx);
    deShiftNB[i] += dx;
    gResidualYPerDEMean->GetPoint(i, dummy, dy);
    deShiftB[i] += dy;
  }
  
  outFile->Close();
  //delete outFile;
  
  return kTRUE;
}

//______________________________________________________________________________
void AddMCHViews(TFile* file)
{
  /// Get from the file the graphs containing data per DE, convert them into mchview objects and save them
  
  if (  ! AliMpDDLStore::Instance(false) )
  {
    Warning("AddMCHViews","mapping was not loaded. Loading it from $ALICE_ROOT/OCDB");
    AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
    AliCDBManager::Instance()->SetRun(999999999);
  }
  
  AliMpCDB::LoadAll();
  
  TObjArray* summary = static_cast<TObjArray*>(file->FindObjectAny("ChamberRes"));
  if (!summary) {
    Error("AddMCHViews","resolution graphs do not exist!");
    return;
  }
  
  TGraphErrors* g = 0x0;
  g = static_cast<TGraphErrors*>(summary->FindObject("gCombinedResidualXPerDESigma"));
  if (g) {
    file->cd();
    AliMUONTrackerData* data = ConvertGraph(*g, "resoX");
    data->Write();
    delete data;
  }
  
  g = static_cast<TGraphErrors*>(summary->FindObject("gCombinedResidualYPerDESigma"));
  if (g) {
    file->cd();
    AliMUONTrackerData* data = ConvertGraph(*g, "resoY");
    data->Write();
    delete data;
  }
  
  g = static_cast<TGraphErrors*>(summary->FindObject("gResidualXPerDEMean_ClusterOut"));
  if (g) {
    file->cd();
    AliMUONTrackerData* data = ConvertGraph(*g, "shiftX");
    data->Write();
    delete data;
  }
  
  g = static_cast<TGraphErrors*>(summary->FindObject("gResidualYPerDEMean_ClusterOut"));
  if (g) {
    file->cd();
    AliMUONTrackerData* data = ConvertGraph(*g, "shiftY");
    data->Write();
    delete data;
  }
}

//______________________________________________________________________________
AliMUONTrackerData* ConvertGraph(TGraphErrors& g, const char* name)
{
  /// Convert graph containing data per DE into mchview object
  
  AliMUON2DMap deValues(kFALSE);
  
  for ( Int_t i = 0 ; i < g.GetN(); ++i ) 
  {
    double y = g.GetY()[i];
    double ey = g.GetEY()[i];
    int detElemId;
    sscanf(g.GetXaxis()->GetBinLabel(i+1),"%d",&detElemId);
    
    AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
    
    AliMUONVCalibParam* param = new AliMUONCalibParamND(5, 1, detElemId, 0);
    
    Double_t sumn = 1000.0;
    Double_t sumw = sumn*y;
    Double_t sumw2 = (sumn-1)*ey*ey+sumw*sumw/sumn;
    
    param->SetValueAsDouble(0,0,sumw);
    param->SetValueAsDouble(0,1,sumw2);
    param->SetValueAsDouble(0,2,sumn);
    param->SetValueAsDouble(0,3,de->NofChannels());
    param->SetValueAsDouble(0,4,1);
    
    deValues.Add(param);
  }
  
  AliMUONTrackerData* data = new AliMUONTrackerData(name,name,deValues,1);
  data->SetDimensionName(0,name);
  
  return data;
}

//______________________________________________________________________________
Int_t GetMode(TString smode, TString input)
{
  if (smode == "local") {
    if ( input.EndsWith(".xml") ) return kInteractif_xml;
    else if ( input.EndsWith(".txt") ) return kInteractif_ESDList;
    else if ( input.EndsWith(".root") ) return kLocal;    
  } else if (smode == "caf" || smode == "saf") return kProof;
  return -1;
}

//______________________________________________________________________________
TChain* CreateChainFromCollection(const char *xmlfile)
{
  // Create a chain from the collection of tags.
  if (!TGrid::Connect("alien://")) return NULL;
  
  TGridCollection* coll = TAlienCollection::Open(xmlfile);
  if (!coll) {
    Error("CreateChainFromCollection", "Cannot create the AliEn collection");
    return NULL;
  }
  
  TGridResult* tagResult = coll->GetGridResult("",kFALSE,kFALSE);
  AliTagAnalysis *tagAna = new AliTagAnalysis("ESD");
  tagAna->ChainGridTags(tagResult);
  
  AliRunTagCuts      *runCuts = new AliRunTagCuts();
  AliLHCTagCuts      *lhcCuts = new AliLHCTagCuts();
  AliDetectorTagCuts *detCuts = new AliDetectorTagCuts();
  AliEventTagCuts    *evCuts  = new AliEventTagCuts();
  
  // Check if the cuts configuration file was provided
  if (!gSystem->AccessPathName("ConfigureCuts.C"))
    gROOT->ProcessLine(Form(".x ConfigureCuts.C((AliRunTagCuts*)%p, (AliLHCTagCuts*)%p, (AliDetectorTagCuts*)%p,"
			    " (AliEventTagCuts*)%p)", runCuts, lhcCuts, detCuts, evCuts));
  
  TChain *chain = tagAna->QueryTags(runCuts, lhcCuts, detCuts, evCuts);
  if (!chain || !chain->GetNtrees()) return NULL;
  chain->ls();
  return chain;
}

//______________________________________________________________________________
TChain* CreateChainFromFile(const char *rootfile)
{
  // Create a chain using the root file.
  TChain* chain = new TChain("esdTree");
  chain->Add(rootfile);
  if (!chain->GetNtrees()) return NULL;
  chain->ls();
  return chain;
}

//______________________________________________________________________________
TChain* CreateChainFromESDList(const char *esdList)
{
  // Create a chain using tags from the run list.
  TChain* chain = new TChain("esdTree");
  ifstream inFile(esdList);
  TString inFileName;
  if (inFile.is_open()) {
    while (! inFile.eof() ) {
      inFileName.ReadLine(inFile,kFALSE);
      if(!inFileName.EndsWith(".root")) continue;
      chain->Add(inFileName.Data());
    }
  }
  inFile.close();
  if (!chain->GetNtrees()) return NULL;
  chain->ls();
  return chain;
}

//______________________________________________________________________________
TChain* CreateChain(Int_t mode, TString input)
{
  printf("*******************************\n");
  printf("*** Getting the Chain       ***\n");
  printf("*******************************\n");
  if(mode == kInteractif_xml) return CreateChainFromCollection(input.Data());
  else if (mode == kInteractif_ESDList) return CreateChainFromESDList(input.Data());
  else if (mode == kLocal) return CreateChainFromFile(input.Data());
  else return NULL;
}

 MuonResolution.C:1
 MuonResolution.C:2
 MuonResolution.C:3
 MuonResolution.C:4
 MuonResolution.C:5
 MuonResolution.C:6
 MuonResolution.C:7
 MuonResolution.C:8
 MuonResolution.C:9
 MuonResolution.C:10
 MuonResolution.C:11
 MuonResolution.C:12
 MuonResolution.C:13
 MuonResolution.C:14
 MuonResolution.C:15
 MuonResolution.C:16
 MuonResolution.C:17
 MuonResolution.C:18
 MuonResolution.C:19
 MuonResolution.C:20
 MuonResolution.C:21
 MuonResolution.C:22
 MuonResolution.C:23
 MuonResolution.C:24
 MuonResolution.C:25
 MuonResolution.C:26
 MuonResolution.C:27
 MuonResolution.C:28
 MuonResolution.C:29
 MuonResolution.C:30
 MuonResolution.C:31
 MuonResolution.C:32
 MuonResolution.C:33
 MuonResolution.C:34
 MuonResolution.C:35
 MuonResolution.C:36
 MuonResolution.C:37
 MuonResolution.C:38
 MuonResolution.C:39
 MuonResolution.C:40
 MuonResolution.C:41
 MuonResolution.C:42
 MuonResolution.C:43
 MuonResolution.C:44
 MuonResolution.C:45
 MuonResolution.C:46
 MuonResolution.C:47
 MuonResolution.C:48
 MuonResolution.C:49
 MuonResolution.C:50
 MuonResolution.C:51
 MuonResolution.C:52
 MuonResolution.C:53
 MuonResolution.C:54
 MuonResolution.C:55
 MuonResolution.C:56
 MuonResolution.C:57
 MuonResolution.C:58
 MuonResolution.C:59
 MuonResolution.C:60
 MuonResolution.C:61
 MuonResolution.C:62
 MuonResolution.C:63
 MuonResolution.C:64
 MuonResolution.C:65
 MuonResolution.C:66
 MuonResolution.C:67
 MuonResolution.C:68
 MuonResolution.C:69
 MuonResolution.C:70
 MuonResolution.C:71
 MuonResolution.C:72
 MuonResolution.C:73
 MuonResolution.C:74
 MuonResolution.C:75
 MuonResolution.C:76
 MuonResolution.C:77
 MuonResolution.C:78
 MuonResolution.C:79
 MuonResolution.C:80
 MuonResolution.C:81
 MuonResolution.C:82
 MuonResolution.C:83
 MuonResolution.C:84
 MuonResolution.C:85
 MuonResolution.C:86
 MuonResolution.C:87
 MuonResolution.C:88
 MuonResolution.C:89
 MuonResolution.C:90
 MuonResolution.C:91
 MuonResolution.C:92
 MuonResolution.C:93
 MuonResolution.C:94
 MuonResolution.C:95
 MuonResolution.C:96
 MuonResolution.C:97
 MuonResolution.C:98
 MuonResolution.C:99
 MuonResolution.C:100
 MuonResolution.C:101
 MuonResolution.C:102
 MuonResolution.C:103
 MuonResolution.C:104
 MuonResolution.C:105
 MuonResolution.C:106
 MuonResolution.C:107
 MuonResolution.C:108
 MuonResolution.C:109
 MuonResolution.C:110
 MuonResolution.C:111
 MuonResolution.C:112
 MuonResolution.C:113
 MuonResolution.C:114
 MuonResolution.C:115
 MuonResolution.C:116
 MuonResolution.C:117
 MuonResolution.C:118
 MuonResolution.C:119
 MuonResolution.C:120
 MuonResolution.C:121
 MuonResolution.C:122
 MuonResolution.C:123
 MuonResolution.C:124
 MuonResolution.C:125
 MuonResolution.C:126
 MuonResolution.C:127
 MuonResolution.C:128
 MuonResolution.C:129
 MuonResolution.C:130
 MuonResolution.C:131
 MuonResolution.C:132
 MuonResolution.C:133
 MuonResolution.C:134
 MuonResolution.C:135
 MuonResolution.C:136
 MuonResolution.C:137
 MuonResolution.C:138
 MuonResolution.C:139
 MuonResolution.C:140
 MuonResolution.C:141
 MuonResolution.C:142
 MuonResolution.C:143
 MuonResolution.C:144
 MuonResolution.C:145
 MuonResolution.C:146
 MuonResolution.C:147
 MuonResolution.C:148
 MuonResolution.C:149
 MuonResolution.C:150
 MuonResolution.C:151
 MuonResolution.C:152
 MuonResolution.C:153
 MuonResolution.C:154
 MuonResolution.C:155
 MuonResolution.C:156
 MuonResolution.C:157
 MuonResolution.C:158
 MuonResolution.C:159
 MuonResolution.C:160
 MuonResolution.C:161
 MuonResolution.C:162
 MuonResolution.C:163
 MuonResolution.C:164
 MuonResolution.C:165
 MuonResolution.C:166
 MuonResolution.C:167
 MuonResolution.C:168
 MuonResolution.C:169
 MuonResolution.C:170
 MuonResolution.C:171
 MuonResolution.C:172
 MuonResolution.C:173
 MuonResolution.C:174
 MuonResolution.C:175
 MuonResolution.C:176
 MuonResolution.C:177
 MuonResolution.C:178
 MuonResolution.C:179
 MuonResolution.C:180
 MuonResolution.C:181
 MuonResolution.C:182
 MuonResolution.C:183
 MuonResolution.C:184
 MuonResolution.C:185
 MuonResolution.C:186
 MuonResolution.C:187
 MuonResolution.C:188
 MuonResolution.C:189
 MuonResolution.C:190
 MuonResolution.C:191
 MuonResolution.C:192
 MuonResolution.C:193
 MuonResolution.C:194
 MuonResolution.C:195
 MuonResolution.C:196
 MuonResolution.C:197
 MuonResolution.C:198
 MuonResolution.C:199
 MuonResolution.C:200
 MuonResolution.C:201
 MuonResolution.C:202
 MuonResolution.C:203
 MuonResolution.C:204
 MuonResolution.C:205
 MuonResolution.C:206
 MuonResolution.C:207
 MuonResolution.C:208
 MuonResolution.C:209
 MuonResolution.C:210
 MuonResolution.C:211
 MuonResolution.C:212
 MuonResolution.C:213
 MuonResolution.C:214
 MuonResolution.C:215
 MuonResolution.C:216
 MuonResolution.C:217
 MuonResolution.C:218
 MuonResolution.C:219
 MuonResolution.C:220
 MuonResolution.C:221
 MuonResolution.C:222
 MuonResolution.C:223
 MuonResolution.C:224
 MuonResolution.C:225
 MuonResolution.C:226
 MuonResolution.C:227
 MuonResolution.C:228
 MuonResolution.C:229
 MuonResolution.C:230
 MuonResolution.C:231
 MuonResolution.C:232
 MuonResolution.C:233
 MuonResolution.C:234
 MuonResolution.C:235
 MuonResolution.C:236
 MuonResolution.C:237
 MuonResolution.C:238
 MuonResolution.C:239
 MuonResolution.C:240
 MuonResolution.C:241
 MuonResolution.C:242
 MuonResolution.C:243
 MuonResolution.C:244
 MuonResolution.C:245
 MuonResolution.C:246
 MuonResolution.C:247
 MuonResolution.C:248
 MuonResolution.C:249
 MuonResolution.C:250
 MuonResolution.C:251
 MuonResolution.C:252
 MuonResolution.C:253
 MuonResolution.C:254
 MuonResolution.C:255
 MuonResolution.C:256
 MuonResolution.C:257
 MuonResolution.C:258
 MuonResolution.C:259
 MuonResolution.C:260
 MuonResolution.C:261
 MuonResolution.C:262
 MuonResolution.C:263
 MuonResolution.C:264
 MuonResolution.C:265
 MuonResolution.C:266
 MuonResolution.C:267
 MuonResolution.C:268
 MuonResolution.C:269
 MuonResolution.C:270
 MuonResolution.C:271
 MuonResolution.C:272
 MuonResolution.C:273
 MuonResolution.C:274
 MuonResolution.C:275
 MuonResolution.C:276
 MuonResolution.C:277
 MuonResolution.C:278
 MuonResolution.C:279
 MuonResolution.C:280
 MuonResolution.C:281
 MuonResolution.C:282
 MuonResolution.C:283
 MuonResolution.C:284
 MuonResolution.C:285
 MuonResolution.C:286
 MuonResolution.C:287
 MuonResolution.C:288
 MuonResolution.C:289
 MuonResolution.C:290
 MuonResolution.C:291
 MuonResolution.C:292
 MuonResolution.C:293
 MuonResolution.C:294
 MuonResolution.C:295
 MuonResolution.C:296
 MuonResolution.C:297
 MuonResolution.C:298
 MuonResolution.C:299
 MuonResolution.C:300
 MuonResolution.C:301
 MuonResolution.C:302
 MuonResolution.C:303
 MuonResolution.C:304
 MuonResolution.C:305
 MuonResolution.C:306
 MuonResolution.C:307
 MuonResolution.C:308
 MuonResolution.C:309
 MuonResolution.C:310
 MuonResolution.C:311
 MuonResolution.C:312
 MuonResolution.C:313
 MuonResolution.C:314
 MuonResolution.C:315
 MuonResolution.C:316
 MuonResolution.C:317
 MuonResolution.C:318
 MuonResolution.C:319
 MuonResolution.C:320
 MuonResolution.C:321
 MuonResolution.C:322
 MuonResolution.C:323
 MuonResolution.C:324
 MuonResolution.C:325
 MuonResolution.C:326
 MuonResolution.C:327
 MuonResolution.C:328
 MuonResolution.C:329
 MuonResolution.C:330
 MuonResolution.C:331
 MuonResolution.C:332
 MuonResolution.C:333
 MuonResolution.C:334
 MuonResolution.C:335
 MuonResolution.C:336
 MuonResolution.C:337
 MuonResolution.C:338
 MuonResolution.C:339
 MuonResolution.C:340
 MuonResolution.C:341
 MuonResolution.C:342
 MuonResolution.C:343
 MuonResolution.C:344
 MuonResolution.C:345
 MuonResolution.C:346
 MuonResolution.C:347
 MuonResolution.C:348
 MuonResolution.C:349
 MuonResolution.C:350
 MuonResolution.C:351
 MuonResolution.C:352
 MuonResolution.C:353
 MuonResolution.C:354
 MuonResolution.C:355
 MuonResolution.C:356
 MuonResolution.C:357
 MuonResolution.C:358
 MuonResolution.C:359
 MuonResolution.C:360
 MuonResolution.C:361
 MuonResolution.C:362
 MuonResolution.C:363
 MuonResolution.C:364
 MuonResolution.C:365
 MuonResolution.C:366
 MuonResolution.C:367
 MuonResolution.C:368
 MuonResolution.C:369
 MuonResolution.C:370
 MuonResolution.C:371
 MuonResolution.C:372
 MuonResolution.C:373
 MuonResolution.C:374
 MuonResolution.C:375
 MuonResolution.C:376
 MuonResolution.C:377
 MuonResolution.C:378
 MuonResolution.C:379
 MuonResolution.C:380
 MuonResolution.C:381
 MuonResolution.C:382
 MuonResolution.C:383
 MuonResolution.C:384
 MuonResolution.C:385
 MuonResolution.C:386
 MuonResolution.C:387
 MuonResolution.C:388
 MuonResolution.C:389
 MuonResolution.C:390
 MuonResolution.C:391
 MuonResolution.C:392
 MuonResolution.C:393
 MuonResolution.C:394
 MuonResolution.C:395
 MuonResolution.C:396
 MuonResolution.C:397
 MuonResolution.C:398
 MuonResolution.C:399
 MuonResolution.C:400
 MuonResolution.C:401
 MuonResolution.C:402
 MuonResolution.C:403
 MuonResolution.C:404
 MuonResolution.C:405
 MuonResolution.C:406
 MuonResolution.C:407
 MuonResolution.C:408
 MuonResolution.C:409
 MuonResolution.C:410
 MuonResolution.C:411
 MuonResolution.C:412
 MuonResolution.C:413
 MuonResolution.C:414
 MuonResolution.C:415
 MuonResolution.C:416
 MuonResolution.C:417
 MuonResolution.C:418
 MuonResolution.C:419
 MuonResolution.C:420
 MuonResolution.C:421
 MuonResolution.C:422
 MuonResolution.C:423
 MuonResolution.C:424
 MuonResolution.C:425
 MuonResolution.C:426
 MuonResolution.C:427
 MuonResolution.C:428
 MuonResolution.C:429
 MuonResolution.C:430
 MuonResolution.C:431
 MuonResolution.C:432
 MuonResolution.C:433
 MuonResolution.C:434
 MuonResolution.C:435
 MuonResolution.C:436
 MuonResolution.C:437
 MuonResolution.C:438
 MuonResolution.C:439
 MuonResolution.C:440
 MuonResolution.C:441
 MuonResolution.C:442
 MuonResolution.C:443
 MuonResolution.C:444
 MuonResolution.C:445
 MuonResolution.C:446
 MuonResolution.C:447
 MuonResolution.C:448
 MuonResolution.C:449
 MuonResolution.C:450
 MuonResolution.C:451
 MuonResolution.C:452
 MuonResolution.C:453
 MuonResolution.C:454
 MuonResolution.C:455
 MuonResolution.C:456
 MuonResolution.C:457
 MuonResolution.C:458
 MuonResolution.C:459
 MuonResolution.C:460
 MuonResolution.C:461
 MuonResolution.C:462
 MuonResolution.C:463
 MuonResolution.C:464
 MuonResolution.C:465
 MuonResolution.C:466
 MuonResolution.C:467
 MuonResolution.C:468
 MuonResolution.C:469
 MuonResolution.C:470
 MuonResolution.C:471
 MuonResolution.C:472
 MuonResolution.C:473
 MuonResolution.C:474
 MuonResolution.C:475
 MuonResolution.C:476
 MuonResolution.C:477
 MuonResolution.C:478
 MuonResolution.C:479
 MuonResolution.C:480
 MuonResolution.C:481
 MuonResolution.C:482
 MuonResolution.C:483
 MuonResolution.C:484
 MuonResolution.C:485
 MuonResolution.C:486
 MuonResolution.C:487
 MuonResolution.C:488
 MuonResolution.C:489
 MuonResolution.C:490
 MuonResolution.C:491
 MuonResolution.C:492
 MuonResolution.C:493
 MuonResolution.C:494
 MuonResolution.C:495
 MuonResolution.C:496
 MuonResolution.C:497
 MuonResolution.C:498
 MuonResolution.C:499
 MuonResolution.C:500
 MuonResolution.C:501
 MuonResolution.C:502
 MuonResolution.C:503
 MuonResolution.C:504
 MuonResolution.C:505
 MuonResolution.C:506
 MuonResolution.C:507
 MuonResolution.C:508
 MuonResolution.C:509
 MuonResolution.C:510
 MuonResolution.C:511
 MuonResolution.C:512
 MuonResolution.C:513
 MuonResolution.C:514
 MuonResolution.C:515
 MuonResolution.C:516
 MuonResolution.C:517
 MuonResolution.C:518
 MuonResolution.C:519
 MuonResolution.C:520
 MuonResolution.C:521
 MuonResolution.C:522
 MuonResolution.C:523
 MuonResolution.C:524
 MuonResolution.C:525
 MuonResolution.C:526
 MuonResolution.C:527
 MuonResolution.C:528
 MuonResolution.C:529
 MuonResolution.C:530
 MuonResolution.C:531
 MuonResolution.C:532
 MuonResolution.C:533
 MuonResolution.C:534
 MuonResolution.C:535
 MuonResolution.C:536
 MuonResolution.C:537
 MuonResolution.C:538
 MuonResolution.C:539
 MuonResolution.C:540
 MuonResolution.C:541
 MuonResolution.C:542
 MuonResolution.C:543
 MuonResolution.C:544
 MuonResolution.C:545
 MuonResolution.C:546
 MuonResolution.C:547
 MuonResolution.C:548
 MuonResolution.C:549
 MuonResolution.C:550
 MuonResolution.C:551
 MuonResolution.C:552
 MuonResolution.C:553
 MuonResolution.C:554
 MuonResolution.C:555
 MuonResolution.C:556
 MuonResolution.C:557
 MuonResolution.C:558
 MuonResolution.C:559
 MuonResolution.C:560
 MuonResolution.C:561
 MuonResolution.C:562
 MuonResolution.C:563
 MuonResolution.C:564
 MuonResolution.C:565
 MuonResolution.C:566
 MuonResolution.C:567
 MuonResolution.C:568
 MuonResolution.C:569
 MuonResolution.C:570
 MuonResolution.C:571
 MuonResolution.C:572
 MuonResolution.C:573
 MuonResolution.C:574
 MuonResolution.C:575
 MuonResolution.C:576
 MuonResolution.C:577
 MuonResolution.C:578
 MuonResolution.C:579
 MuonResolution.C:580
 MuonResolution.C:581
 MuonResolution.C:582
 MuonResolution.C:583
 MuonResolution.C:584
 MuonResolution.C:585
 MuonResolution.C:586
 MuonResolution.C:587
 MuonResolution.C:588
 MuonResolution.C:589
 MuonResolution.C:590
 MuonResolution.C:591
 MuonResolution.C:592
 MuonResolution.C:593
 MuonResolution.C:594
 MuonResolution.C:595
 MuonResolution.C:596
 MuonResolution.C:597
 MuonResolution.C:598
 MuonResolution.C:599
 MuonResolution.C:600
 MuonResolution.C:601
 MuonResolution.C:602
 MuonResolution.C:603
 MuonResolution.C:604
 MuonResolution.C:605
 MuonResolution.C:606
 MuonResolution.C:607
 MuonResolution.C:608
 MuonResolution.C:609
 MuonResolution.C:610
 MuonResolution.C:611
 MuonResolution.C:612
 MuonResolution.C:613
 MuonResolution.C:614
 MuonResolution.C:615
 MuonResolution.C:616
 MuonResolution.C:617
 MuonResolution.C:618
 MuonResolution.C:619
 MuonResolution.C:620
 MuonResolution.C:621
 MuonResolution.C:622
 MuonResolution.C:623
 MuonResolution.C:624
 MuonResolution.C:625
 MuonResolution.C:626
 MuonResolution.C:627
 MuonResolution.C:628
 MuonResolution.C:629
 MuonResolution.C:630
 MuonResolution.C:631
 MuonResolution.C:632
 MuonResolution.C:633
 MuonResolution.C:634
 MuonResolution.C:635
 MuonResolution.C:636
 MuonResolution.C:637
 MuonResolution.C:638
 MuonResolution.C:639
 MuonResolution.C:640
 MuonResolution.C:641
 MuonResolution.C:642
 MuonResolution.C:643
 MuonResolution.C:644
 MuonResolution.C:645
 MuonResolution.C:646
 MuonResolution.C:647
 MuonResolution.C:648
 MuonResolution.C:649
 MuonResolution.C:650
 MuonResolution.C:651
 MuonResolution.C:652
 MuonResolution.C:653
 MuonResolution.C:654
 MuonResolution.C:655
 MuonResolution.C:656
 MuonResolution.C:657
 MuonResolution.C:658
 MuonResolution.C:659
 MuonResolution.C:660
 MuonResolution.C:661
 MuonResolution.C:662
 MuonResolution.C:663
 MuonResolution.C:664
 MuonResolution.C:665
 MuonResolution.C:666
 MuonResolution.C:667
 MuonResolution.C:668
 MuonResolution.C:669
 MuonResolution.C:670
 MuonResolution.C:671
 MuonResolution.C:672
 MuonResolution.C:673
 MuonResolution.C:674
 MuonResolution.C:675
 MuonResolution.C:676
 MuonResolution.C:677
 MuonResolution.C:678
 MuonResolution.C:679
 MuonResolution.C:680
 MuonResolution.C:681
 MuonResolution.C:682
 MuonResolution.C:683
 MuonResolution.C:684
 MuonResolution.C:685
 MuonResolution.C:686
 MuonResolution.C:687
 MuonResolution.C:688
 MuonResolution.C:689
 MuonResolution.C:690
 MuonResolution.C:691
 MuonResolution.C:692
 MuonResolution.C:693
 MuonResolution.C:694
 MuonResolution.C:695
 MuonResolution.C:696
 MuonResolution.C:697
 MuonResolution.C:698
 MuonResolution.C:699
 MuonResolution.C:700
 MuonResolution.C:701
 MuonResolution.C:702
 MuonResolution.C:703
 MuonResolution.C:704
 MuonResolution.C:705
 MuonResolution.C:706
 MuonResolution.C:707
 MuonResolution.C:708
 MuonResolution.C:709
 MuonResolution.C:710
 MuonResolution.C:711
 MuonResolution.C:712
 MuonResolution.C:713
 MuonResolution.C:714
 MuonResolution.C:715
 MuonResolution.C:716
 MuonResolution.C:717
 MuonResolution.C:718
 MuonResolution.C:719
 MuonResolution.C:720
 MuonResolution.C:721
 MuonResolution.C:722
 MuonResolution.C:723
 MuonResolution.C:724
 MuonResolution.C:725
 MuonResolution.C:726
 MuonResolution.C:727
 MuonResolution.C:728
 MuonResolution.C:729
 MuonResolution.C:730
 MuonResolution.C:731
 MuonResolution.C:732
 MuonResolution.C:733
 MuonResolution.C:734
 MuonResolution.C:735
 MuonResolution.C:736
 MuonResolution.C:737
 MuonResolution.C:738
 MuonResolution.C:739
 MuonResolution.C:740
 MuonResolution.C:741
 MuonResolution.C:742
 MuonResolution.C:743
 MuonResolution.C:744
 MuonResolution.C:745
 MuonResolution.C:746
 MuonResolution.C:747
 MuonResolution.C:748
 MuonResolution.C:749
 MuonResolution.C:750
 MuonResolution.C:751
 MuonResolution.C:752
 MuonResolution.C:753
 MuonResolution.C:754
 MuonResolution.C:755
 MuonResolution.C:756
 MuonResolution.C:757
 MuonResolution.C:758
 MuonResolution.C:759
 MuonResolution.C:760
 MuonResolution.C:761
 MuonResolution.C:762
 MuonResolution.C:763
 MuonResolution.C:764
 MuonResolution.C:765
 MuonResolution.C:766
 MuonResolution.C:767
 MuonResolution.C:768
 MuonResolution.C:769
 MuonResolution.C:770
 MuonResolution.C:771
 MuonResolution.C:772
 MuonResolution.C:773
 MuonResolution.C:774
 MuonResolution.C:775
 MuonResolution.C:776
 MuonResolution.C:777
 MuonResolution.C:778
 MuonResolution.C:779
 MuonResolution.C:780
 MuonResolution.C:781
 MuonResolution.C:782
 MuonResolution.C:783
 MuonResolution.C:784
 MuonResolution.C:785
 MuonResolution.C:786
 MuonResolution.C:787
 MuonResolution.C:788
 MuonResolution.C:789
 MuonResolution.C:790
 MuonResolution.C:791
 MuonResolution.C:792
 MuonResolution.C:793
 MuonResolution.C:794
 MuonResolution.C:795
 MuonResolution.C:796
 MuonResolution.C:797
 MuonResolution.C:798
 MuonResolution.C:799
 MuonResolution.C:800
 MuonResolution.C:801
 MuonResolution.C:802
 MuonResolution.C:803
 MuonResolution.C:804
 MuonResolution.C:805
 MuonResolution.C:806
 MuonResolution.C:807
 MuonResolution.C:808
 MuonResolution.C:809
 MuonResolution.C:810
 MuonResolution.C:811
 MuonResolution.C:812
 MuonResolution.C:813
 MuonResolution.C:814
 MuonResolution.C:815
 MuonResolution.C:816
 MuonResolution.C:817
 MuonResolution.C:818
 MuonResolution.C:819
 MuonResolution.C:820
 MuonResolution.C:821
 MuonResolution.C:822
 MuonResolution.C:823
 MuonResolution.C:824
 MuonResolution.C:825
 MuonResolution.C:826
 MuonResolution.C:827
 MuonResolution.C:828
 MuonResolution.C:829
 MuonResolution.C:830
 MuonResolution.C:831
 MuonResolution.C:832
 MuonResolution.C:833
 MuonResolution.C:834
 MuonResolution.C:835
 MuonResolution.C:836
 MuonResolution.C:837
 MuonResolution.C:838
 MuonResolution.C:839
 MuonResolution.C:840
 MuonResolution.C:841
 MuonResolution.C:842
 MuonResolution.C:843
 MuonResolution.C:844
 MuonResolution.C:845
 MuonResolution.C:846
 MuonResolution.C:847
 MuonResolution.C:848
 MuonResolution.C:849
 MuonResolution.C:850
 MuonResolution.C:851
 MuonResolution.C:852
 MuonResolution.C:853
 MuonResolution.C:854
 MuonResolution.C:855
 MuonResolution.C:856
 MuonResolution.C:857
 MuonResolution.C:858
 MuonResolution.C:859
 MuonResolution.C:860
 MuonResolution.C:861
 MuonResolution.C:862
 MuonResolution.C:863
 MuonResolution.C:864
 MuonResolution.C:865
 MuonResolution.C:866
 MuonResolution.C:867
 MuonResolution.C:868
 MuonResolution.C:869