Various minor fixes
authorcholm <cholm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Nov 2012 00:39:09 +0000 (00:39 +0000)
committercholm <cholm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Nov 2012 00:39:09 +0000 (00:39 +0000)
12 files changed:
PWGLF/FORWARD/analysis2/AddTaskCentraldNdeta.C
PWGLF/FORWARD/analysis2/AliBasedNdetaTask.cxx
PWGLF/FORWARD/analysis2/AliCentralMultiplicityTask.cxx
PWGLF/FORWARD/analysis2/AliFMDEventInspector.cxx
PWGLF/FORWARD/analysis2/AliForwardUtil.cxx
PWGLF/FORWARD/analysis2/AliForwardUtil.h
PWGLF/FORWARD/analysis2/DrawAODSummary.C
PWGLF/FORWARD/analysis2/ForwardAODConfig.C
PWGLF/FORWARD/analysis2/corrs/ExtractAcceptance.C
PWGLF/FORWARD/analysis2/corrs/ExtractELoss.C
PWGLF/FORWARD/analysis2/corrs/ExtractMCCorr.C
PWGLF/FORWARD/analysis2/gridAnalysis.sh

index e55684f..50e2ff3 100644 (file)
@@ -33,7 +33,7 @@ AddTaskCentraldNdeta(const char* trig      = "INEL",
                     Bool_t      cutEdges  = false,
                     Double_t    trigEff   = 1, 
                     Double_t    trigEff0  = 1,
-                    Bool_t      corrEmpty = false,
+                    Bool_t      corrEmpty = true,
                     const char* mcanalysisfilename = "none")
 {
   // --- Load libraries ----------------------------------------------
index f511e7b..51cc171 100644 (file)
@@ -358,6 +358,10 @@ AliBasedNdetaTask::UserCreateOutputObjects()
   InitializeCentBins();
   if (fCentAxis) fSums->Add(fCentAxis);
 
+  fSums->Add(AliForwardUtil::MakeParameter("alirootRev", 
+                                          AliForwardUtil::AliROOTRevision()));
+  fSums->Add(AliForwardUtil::MakeParameter("alirootBranch", 
+                                          AliForwardUtil::AliROOTBranch()));
 
   // Centrality histogram 
   fCent = new TH1D("cent", "Centrality", 100, 0, 100);
index 0882014..467918c 100644 (file)
@@ -218,11 +218,11 @@ AliCentralMultiplicityTask::GetESDEvent()
     //AliInfo("Manager of corrections in AliCentralMultiplicityTask init");
   }
   Bool_t ok = true;
-  if (!GetManager().HasSecondaryCorrection()) {
+  if (/*fUseSecondary &&*/ !GetManager().HasSecondaryCorrection()) {
     ok = false;
     AliError("No secondary correction defined!");
   }
-  if (!GetManager().HasAcceptanceCorrection()) {
+  if (/*fUseAcceptance &&*/ !GetManager().HasAcceptanceCorrection()) {
     ok = false;
     AliError("No acceptance correction defined!");
   }
index 9696ca8..d5ff9c0 100644 (file)
@@ -569,6 +569,11 @@ AliFMDEventInspector::StoreInformation(Int_t runNo)
   fList->Add(AliForwardUtil::MakeParameter("v0and",fUseV0AND));
   fList->Add(AliForwardUtil::MakeParameter("nPileUp", fMinPileupContrib));
   fList->Add(AliForwardUtil::MakeParameter("dPileup", fMinPileupDistance));
+  fList->Add(AliForwardUtil::MakeParameter("alirootRev", 
+                                          AliForwardUtil::AliROOTRevision()));
+  fList->Add(AliForwardUtil::MakeParameter("alirootBranch", 
+                                          AliForwardUtil::AliROOTBranch()));
+
 }
 
 //____________________________________________________________________
index 85e2292..0e6e306 100644 (file)
@@ -3,6 +3,7 @@
 // 
 //
 #include "AliForwardUtil.h"
+//#include <ARVersion.h>
 #include <AliAnalysisManager.h>
 #include "AliAODForwardMult.h"
 #include <AliLog.h>
 #include <TROOT.h>
 
 //====================================================================
+ULong_t AliForwardUtil::AliROOTRevision()
+{
+#ifdef ALIROOT_SVN_REVISION
+  return ALIROOT_SVN_REVISION;
+#else 
+  return 0;
+#endif
+}
+//____________________________________________________________________
+ULong_t AliForwardUtil::AliROOTBranch()
+{
+#ifdef ALIROOT_SVN_BRANCH
+  static ULong_t ret = 0;
+  if (ret != 0) return ret;
+  
+  TString str(ALIROOT_SVN_BRANCH);
+  if (str[0] == 'v') str.Remove(0,1);
+  if (str.EqualTo("trunk")) return ret = 0xFFFFFFFF;
+
+  TObjArray*   tokens = str.Tokenize("-");
+  TObjString*  pMajor = static_cast<TObjString*>(tokens->At(0));
+  TObjString*  pMinor = static_cast<TObjString*>(tokens->At(1));
+  TObjString*  pRelea = static_cast<TObjString*>(tokens->At(2));
+  TObjString* pAn     = (tokens->GetEntries() > 3 ? 
+    static_cast<TObjString*>(tokens->At(3)) : 0);
+  TString sMajor = pMajor->String().Strip(TString::kLeading, '0');
+  TString sMinor = pMinor->String().Strip(TString::kLeading, '0');
+  TString sRelea = pRelea->String().Strip(TString::kLeading, '0');
+  
+  ret = (((sMajor.Atoi() & 0xFF) << 12) |
+    ((sMinor.Atoi() & 0xFF) <<  8) |
+    ((sRelea.Atoi() & 0xFF) <<  4) |
+    (pAn ? 0xAA : 0));
+  
+  return ret;
+#else 
+  return 0;
+#endif
+}
+
+//====================================================================
 UShort_t
 AliForwardUtil::ParseCollisionSystem(const char* sys)
 {
@@ -275,6 +317,13 @@ TObject* AliForwardUtil::MakeParameter(const Char_t* name, Int_t value)
   return ret;
 }
 //_____________________________________________________________________
+TObject* AliForwardUtil::MakeParameter(const Char_t* name, ULong_t value)
+{
+  TParameter<Long_t>* ret = new TParameter<Long_t>(name, value);
+  ret->SetUniqueID(value);
+  return ret;
+}
+//_____________________________________________________________________
 TObject* AliForwardUtil::MakeParameter(const Char_t* name, Double_t value)
 {
   TParameter<double>* ret = new TParameter<double>(name, value);
@@ -304,6 +353,12 @@ void AliForwardUtil::GetParameter(TObject* o, Int_t& value)
   value = o->GetUniqueID();
 }
 //_____________________________________________________________________
+void AliForwardUtil::GetParameter(TObject* o, ULong_t& value)
+{
+  if (!o) return;
+  value = o->GetUniqueID();
+}
+//_____________________________________________________________________
 void AliForwardUtil::GetParameter(TObject* o, Double_t& value)
 {
   if (!o) return;
index 6a61ddc..d286fe4 100644 (file)
@@ -50,6 +50,29 @@ public:
   //==================================================================
   /** 
    * @{ 
+   * @name AliROOT version
+   */
+  /** 
+   * Get the revision number of AliROOT
+   * 
+   * @return Subversion revision number of AliROOT used
+   */
+  static ULong_t AliROOTRevision();
+  /**
+   * Get the branch identifier of AliROOT.  In case of trunk, return
+   * 0xFFFFFFFF, while for @b vM-N-R{-S}, we get
+   *
+   * @code 
+   *    ((M & 0xFF) << 12 | (N & 0xFF) << 8 | (R & 0xFF) << 3 | (X))
+   * @endcode 
+   * where @c X is 0xAA if @b S is specified (e.g., analysis tag). 
+   *
+   * @return branch identifer encoded in bits 
+   */
+  static ULong_t AliROOTBranch();
+  //==================================================================
+  /** 
+   * @{ 
    * @name Collision/run parameters 
    */
   /**                                          
@@ -232,10 +255,12 @@ public:
   static TObject* MakeParameter(const char* name, Int_t value);
   static TObject* MakeParameter(const char* name, Double_t value);
   static TObject* MakeParameter(const char* name, Bool_t value);
+  static TObject* MakeParameter(const char* name, ULong_t value);
   static void GetParameter(TObject* o, UShort_t& value);
   static void GetParameter(TObject* o, Int_t& value);
   static void GetParameter(TObject* o, Double_t& value);
   static void GetParameter(TObject* o, Bool_t& value);
+  static void GetParameter(TObject* o, ULong_t& value);
   /* @} */
 
   /** 
index 3db7438..48a28a4 100644 (file)
@@ -7,7 +7,35 @@
  * 
  * 
  */
-
+#ifndef __CINT__
+# include <THStack.h>
+# include <TH1.h>
+# include <TH2.h>
+# include <TParameter.h>
+# include <TCanvas.h>
+# include <TList.h>
+# include <TFile.h>
+# include <TError.h>
+# include <TLatex.h>
+# include <TLegend.h>
+# include <TLegendEntry.h>
+# include <TMath.h>
+# include <TString.h>
+# include <TStyle.h>
+# include <TSystem.h>
+# include <TProfile.h>
+# include <TGaxis.h>
+#else
+class THStack;
+class TH1;
+class TH2;
+class TCollection;
+class TCanvas;
+class TVirtualPad;
+class TLatex;
+#endif
+
+bool fgPause = false;
 //____________________________________________________________________
 /** 
  * Find an object in a collection
@@ -62,7 +90,7 @@ TObject* GetObject(const TDirectory* parent, const TString& name)
     return 0;
   }
   // --- Find the object ---------------------------------------------
-  TObject* o = parent->Get(name);
+  TObject* o = const_cast<TDirectory*>(parent)->Get(name);
   if (!o) {
     Warning("GetObject", "Object \"%s\" not found in parent \"%s\"",
            name.Data(), parent->GetName());
@@ -365,8 +393,7 @@ void CloseCanvas(TCanvas* c)
  * @param c      Canvas 
  * @param title  Title 
  */
-void PrintCanvas(TCanvas* c, const TString& title, 
-                Float_t size=.7, Bool_t pause=false)
+void PrintCanvas(TCanvas* c, const TString& title, Float_t size=.7)
 {
   // Info("PrintCanvas", "Printing page %s", title.Data());
   TString tit;
@@ -389,7 +416,7 @@ void PrintCanvas(TCanvas* c, const TString& title,
   gSystem->RedirectOutput(0);
   
   // std::cin.peek();
-  if (pause) Pause();
+  if (fgPause) Pause();
 
   ClearCanvas(c);
 }
@@ -448,6 +475,70 @@ void DrawInPad(TVirtualPad* c, Int_t padNo, TObject* h, Option_t* opts="",
   p->cd();
 }
 //____________________________________________________________________
+void DrawTwoInPad(TVirtualPad* c, Int_t padNo, TH1* h1, TH1* h2,
+                 Option_t* opts="", UShort_t flags=0x0)
+{
+  // Info("DrawInPad", "Drawing %p in pad # %d of %p w/options %s, flags 0x%x", 
+  //      h, padNo, c, opts, flags);
+  TVirtualPad* p = c->cd(padNo);
+  if (!p) { 
+    Warning("DrawInPad", "Pad # %d not found in %s", padNo, c->GetName());
+    return;
+  }
+  if (flags & 0x1) p->SetLogx();
+  if (flags & 0x2) p->SetLogy();
+  if (flags & 0x4) p->SetLogz();
+  p->SetFillColor(0);
+
+  TString o(opts);
+  o.ToLower();
+  TString fopts(o);
+  Bool_t e3 = o.Contains("e3");
+  if (e3) {
+    fopts.ReplaceAll("e3", " same");
+  }
+
+  h1->GetYaxis()->SetLabelSize(0);
+  h1->GetYaxis()->SetTicks("");
+  h1->GetYaxis()->SetNdivisions(0);
+  h1->DrawCopy(o); // First draw with opts 
+  if (e3) h1->DrawCopy(fopts);
+  p->Update();
+
+  // Make axis 
+  Double_t m1 = 1.05 * h1->GetMaximum();
+  TGaxis*  a1 = new TGaxis(p->GetUxmin(), p->GetUymin(), 
+                          p->GetUxmin(), p->GetUymax(), 
+                          0, m1, 510);
+  a1->SetLineColor(h1->GetLineColor());
+  a1->Draw();
+  
+  o.Append(" same");
+  Double_t m2    = 1.1 * h2->GetMaximum();
+  Double_t scale = m1 / m2;
+  h2->Scale(scale);
+  h2->DrawCopy(o);
+  if (e3) h2->DrawCopy(fopts);
+
+  TGaxis*  a2 = new TGaxis(p->GetUxmax(), p->GetUymin(), 
+                          p->GetUxmax(), p->GetUymax(), 
+                          0, m2, 510, "+L");
+  a2->SetLineColor(h2->GetLineColor());
+  a2->Draw();
+  
+  if (flags& 0x10) { 
+    TLegend* l = p->BuildLegend();
+    l->SetFillColor(0);
+    l->SetFillStyle(0);
+    l->SetBorderSize(0);
+  }
+  p->Modified();
+  p->Update();
+  p->cd();
+}  
+  
+
+//____________________________________________________________________
 void CreateTemplates(TLatex*& name, TLatex*& value, Float_t size=.03)
 {
   Double_t x1 = .1;
@@ -490,18 +581,21 @@ void DrawEventInspector(const TCollection* forward, TCanvas* can)
   CreateTemplates(name, value);
 
   Int_t sys, sNN, field, runNo, lowFlux, nPileUp;
+  Int_t aliRev, aliBra;
   Bool_t fpVtx, v0and;
   Double_t dPileUp;
   
-  GetParameter(c, "sys",     sys);
-  GetParameter(c, "sNN",     sNN);
-  GetParameter(c, "field",   field);
-  GetParameter(c, "runNo",   runNo);
-  GetParameter(c, "lowFlux", lowFlux);
-  GetParameter(c, "fpVtx",   fpVtx);
-  GetParameter(c, "v0and",   v0and);
-  GetParameter(c, "nPileUp", nPileUp);
-  GetParameter(c, "dPileup", dPileUp);
+  GetParameter(c, "sys",           sys);
+  GetParameter(c, "sNN",           sNN);
+  GetParameter(c, "field",         field);
+  GetParameter(c, "runNo",         runNo);
+  GetParameter(c, "lowFlux",       lowFlux);
+  GetParameter(c, "fpVtx",         fpVtx);
+  GetParameter(c, "v0and",         v0and);
+  GetParameter(c, "nPileUp",       nPileUp);
+  GetParameter(c, "dPileup",       dPileUp);
+  GetParameter(c, "alirootRev",    aliRev);
+  GetParameter(c, "alirootBranch", aliBra);
 
   DrawParameter(name, value, y, "System", (sys == 1 ? "pp" : 
                                           sys == 2 ? "PbPb" : 
@@ -516,6 +610,8 @@ void DrawEventInspector(const TCollection* forward, TCanvas* can)
                Form("%d", nPileUp));
   DrawParameter(name, value, y, "Least distance of pile-up vertex", 
                Form("%fcm", dPileUp));
+  DrawParameter(name, value, y, "AliROOT", 
+               Form("%7lu/0x%8lx", ULong_t(aliRev), ULong_t(aliBra)));
 
   PrintCanvas(can, "Event Inspector");
 
@@ -524,9 +620,16 @@ void DrawEventInspector(const TCollection* forward, TCanvas* can)
 
   TH1*    nEventsTr    = GetH1(c, "nEventsTr");
   TH1*    nEventsTrVtx = GetH1(c, "nEventsTrVtx");
+  TH1*    vertex       = GetH1(c, "vertex");
+  Bool_t  mc           = (vertex != 0);
   if (nEventsTr)    nEventsTr->Rebin(2);
   if (nEventsTrVtx) nEventsTrVtx->Rebin(2);
+  if (vertex) {
+    // vertex->Rebin(2);
+    vertex->SetFillColor(kMagenta+2);
+  }
   DrawInPad(body, 1, nEventsTr);
+  DrawInPad(body, 1, vertex, "same");
   DrawInPad(body, 1, nEventsTrVtx, "same"); 
   DrawInPad(body, 1, GetH1(c, "nEventsAccepted"), "same", 0x10);
 
@@ -540,6 +643,63 @@ void DrawEventInspector(const TCollection* forward, TCanvas* can)
   DrawInPad(body, 8, GetH2(c, "centVsQuality"), "colz", 0x4);
 
   PrintCanvas(can, "EventInspector - Histograms");  
+
+  if (!mc) return; // not MC 
+  
+  TH1* phiR         = GetH1(c, "phiR");
+  TH1* b            = GetH1(c, "b");
+  TH2* bVsNpart     = GetH2(c, "bVsParticipants");
+  TH2* bVsNbin      = GetH2(c, "bVsBinary");
+  TH2* bVsCent      = GetH2(c, "bVsCentrality");
+  TH2* vzComparison = GetH2(c, "vzComparison");
+  TH2* centVsNpart  = GetH2(c, "centralityVsParticipans");// Spelling!
+  TH2* centVsNbin   = GetH2(c, "centralityVsBinary");
+  
+  body = can->cd(2);
+  body->Divide(2,3);
+
+  DrawInPad(body, 1, phiR);
+  DrawInPad(body, 2, vzComparison, "colz", 0x4);
+  DrawInPad(body, 3, b);
+
+  TProfile* nPartB = bVsNpart->ProfileX("nPartB",1,-1,"s");
+  TProfile* nBinB  = bVsNbin->ProfileX("nBinB",1,-1,"s");
+  nPartB->SetMarkerColor(kBlue+2);
+  nPartB->SetMarkerStyle(20);
+  nPartB->SetLineColor(kBlue+2);
+  nPartB->SetFillColor(kBlue-10);
+  nPartB->SetFillStyle(1001);
+  nPartB->SetMarkerSize(0.7);
+  nBinB->SetMarkerColor(kRed+2);
+  nBinB->SetMarkerStyle(21);
+  nBinB->SetLineColor(kRed+2);
+  nBinB->SetFillColor(kRed-10);
+  nBinB->SetMarkerSize(0.7);
+  nBinB->SetFillStyle(1001);
+
+  DrawTwoInPad(body, 4, nPartB, nBinB, "e3 p", 0x10);
+
+  DrawInPad(body, 5, bVsCent, "colz", 0x4);
+
+  TProfile* nPartC = centVsNpart->ProfileY("nPartC",1,-1,"s");
+  TProfile* nBinC  = centVsNbin->ProfileY("nBinC",1,-1,"s");
+  nPartC->SetMarkerColor(kBlue+2);
+  nPartC->SetMarkerStyle(20);
+  nPartC->SetLineColor(kBlue+2);
+  nPartC->SetFillColor(kBlue-10);
+  nPartC->SetFillStyle(1001);
+  nPartC->SetMarkerSize(0.7);
+  nBinC->SetMarkerColor(kRed+2);
+  nBinC->SetMarkerStyle(21);
+  nBinC->SetLineColor(kRed+2);
+  nBinC->SetFillColor(kRed-10);
+  nBinC->SetMarkerSize(0.7);
+  nBinC->SetFillStyle(1001);
+
+  DrawTwoInPad(body, 6, nPartC, nBinC, "e3 p", 0x10);
+
+  PrintCanvas(can, "EventInspector - Monte-Carlo");  
+  
 }
 
 //____________________________________________________________________
@@ -591,7 +751,7 @@ void DrawSharingFilter(const TCollection* forward, TCanvas* can)
     DrawInPad(body, 4, GetH1(sc, "distanceBefore"), "",     0x2);
     DrawInPad(body, 4, GetH1(sc, "distanceAfter"),  "same", 0x12);
 
-    TH2D* nB = GetH2(sc, "neighborsBefore");
+    TH2* nB = GetH2(sc, "neighborsBefore");
     if (nB) { 
       nB->GetXaxis()->SetRangeUser(0,8); 
       nB->GetYaxis()->SetRangeUser(0,8); 
@@ -603,12 +763,43 @@ void DrawSharingFilter(const TCollection* forward, TCanvas* can)
     PrintCanvas(can, Form("Sharing filter - %s", *ptr));
     ptr++;
   }
+
+  TCollection* cc = GetCollection(c, "esd_mc_comparion"); // Spelling!
+  if (!cc) return; // Not MC 
+
+  body = can->cd(2);
+  body->Divide(2,3);
+  DrawInPad(body, 1, GetH2(cc, "FMD1i_corr"), "colz", 0x4);
+  DrawInPad(body, 3, GetH2(cc, "FMD2i_corr"), "colz", 0x4);
+  DrawInPad(body, 4, GetH2(cc, "FMD2o_corr"), "colz", 0x4);
+  DrawInPad(body, 5, GetH2(cc, "FMD3i_corr"), "colz", 0x4);
+  DrawInPad(body, 6, GetH2(cc, "FMD3o_corr"), "colz", 0x4);
+
+  PrintCanvas(can, "Sharing filter - MC vs Reco");
+
+  TCollection* mc = GetCollection(c, "mcTrackDensity"); // Spelling!
+  if (!mc) return; // Not MC 
+
+  body = can->cd(2);
+  body->Divide(2,3);
+  DrawInPad(body, 1, GetH2(mc, "binFlow"),    "colz", 0x4);
+  DrawInPad(body, 2, GetH2(mc, "binFlowEta"), "colz", 0x4);
+  DrawInPad(body, 3, GetH2(mc, "binFlowPhi"), "colz", 0x4);
+  DrawInPad(body, 4, GetH1(mc, "nRefs"),       "",    0x2);
+  DrawInPad(body, 4, GetH1(mc, "clusterRefs"), "same");
+  DrawInPad(body, 4, GetH1(mc, "clusterSize"), "same");
+  DrawInPad(body, 4, GetH1(mc, "nClusters"),    "same", 0x10);
+  DrawInPad(body, 5, GetH2(mc, "clusterVsRefs"),"colz", 0x4);
+
+
+  PrintCanvas(can, "Sharing filter - MC");
+  
 }
 
 //____________________________________________________________________
 void DrawDensityCalculator(const TCollection* forward, TCanvas* can)
 {
-  Info("DrawEventInspector", "Drawing density calculator from %p", 
+  Info("DrawDensityCalculator", "Drawing density calculator from %p", 
        forward);
   TCollection* c = GetCollection(forward, "fmdDensityCalculator");
   if (!c) return;
@@ -638,7 +829,7 @@ void DrawDensityCalculator(const TCollection* forward, TCanvas* can)
   DrawParameter(name, value, y, "Recalculate #phi",(recalcPhi ? "yes" : "no")); 
   DrawParameter(name, value, y, "#phi acceptance method", 
                (phiAcceptance == 1 ? "N_{ch}" : 
-                phiAcceptance == 2 ? "#DeltaE" : none));
+                phiAcceptance == 2 ? "#DeltaE" : "none"));
   DrawParameter(name, value, y, "Region size (sector#timesstrip)", 
                Form("%2d #times %2d", phiLumping, etaLumping));
 
@@ -646,9 +837,15 @@ void DrawDensityCalculator(const TCollection* forward, TCanvas* can)
   // p->Divide(3,1);
 
   TH1* accI = GetH1(c, "accI");
-  if (accI) { accI->SetMaximum(60); accI->SetMinimum(0); }
+  TH1* accO = GetH1(c, "accO");
+  if (accI) { 
+    Double_t scale = 1./accI->GetMaximum();
+    accI->Scale(scale); 
+    accO->Scale(scale);
+    accI->SetMinimum(0); 
+  }
   DrawInPad(p, 2, accI); 
-  DrawInPad(p, 2, GetH1(c, "accO"), "same", 0x10); 
+  DrawInPad(p, 2, accO, "same", 0x10); 
   DrawInPad(p, 3, GetH2(c, "lowCuts"), "colz");
   DrawInPad(p, 4, GetH2(c, "maxWeights"), "colz");
   
@@ -660,7 +857,7 @@ void DrawDensityCalculator(const TCollection* forward, TCanvas* can)
     TCollection* sc = GetCollection(c, *ptr);
     if (!sc) { ptr++; continue; }
     
- body = can->cd(2);
+    body = can->cd(2);
     body->Divide(2,3);
     
     DrawInPad(body, 1, GetH2(sc, "elossVsPoisson"), "colz",   0x4);
@@ -682,12 +879,30 @@ void DrawDensityCalculator(const TCollection* forward, TCanvas* can)
     PrintCanvas(can, Form("Density calculator - %s", *ptr));
     ptr++;    
   }
+
+  TCollection* cc = GetCollection(c, "esd_mc_comparison"); 
+  if (!cc) return; // Not MC 
+
+  body = can->cd(2);
+  body->Divide(2,5);
+  DrawInPad(body, 1, GetH2(cc, "FMD1I_corr_mc_esd"), "colz", 0x4);
+  DrawInPad(body, 3, GetH2(cc, "FMD2I_corr_mc_esd"), "colz", 0x4);
+  DrawInPad(body, 5, GetH2(cc, "FMD2O_corr_mc_esd"), "colz", 0x4);
+  DrawInPad(body, 7, GetH2(cc, "FMD3O_corr_mc_esd"), "colz", 0x4);
+  DrawInPad(body, 9, GetH2(cc, "FMD3I_corr_mc_esd"), "colz", 0x4);
+  DrawInPad(body, 2,  GetH1(cc, "FMD1I_diff_mc_esd"), "", 0x2);
+  DrawInPad(body, 4,  GetH1(cc, "FMD2I_diff_mc_esd"), "", 0x2);
+  DrawInPad(body, 6,  GetH1(cc, "FMD2O_diff_mc_esd"), "", 0x2);
+  DrawInPad(body, 8,  GetH1(cc, "FMD3O_diff_mc_esd"), "", 0x2);
+  DrawInPad(body, 10, GetH1(cc, "FMD3I_diff_mc_esd"), "", 0x2);
+
+  PrintCanvas(can, "Density calculator - MC vs Reco");
 }
 
 //____________________________________________________________________
 void DrawCorrector(const TCollection* forward, TCanvas* can)
 {
-  Info("DrawEventInspector", "Drawing corrector from %p", forward);
+  Info("DrawCorrector", "Drawing corrector from %p", forward);
   TCollection* c = GetCollection(forward, "fmdCorrector");
   if (!c) return;
   
@@ -711,12 +926,25 @@ void DrawCorrector(const TCollection* forward, TCanvas* can)
   DrawParameter(name, value, y, "Merging eff.", merging ? "yes" : "no");
     
   PrintCanvas(can, "Corrector");
+
+  TCollection* cc = GetCollection(c, "esd_mc_comparison"); 
+  if (!cc) return; // Not MC 
+
+  body = can->cd(2);
+  body->Divide(2,3);
+  DrawInPad(body, 1, GetH2(cc, "FMD1I_esd_vs_mc"), "colz", 0x0);
+  DrawInPad(body, 3, GetH2(cc, "FMD2I_esd_vs_mc"), "colz", 0x0);
+  DrawInPad(body, 4, GetH2(cc, "FMD2O_esd_vs_mc"), "colz", 0x0);
+  DrawInPad(body, 5, GetH2(cc, "FMD3O_esd_vs_mc"), "colz", 0x0);
+  DrawInPad(body, 6, GetH2(cc, "FMD3I_esd_vs_mc"), "colz", 0x0);
+
+  PrintCanvas(can, "Corrector - MC vs Reco");
 }
 
 //____________________________________________________________________
 void DrawHistCollector(const TCollection* forward, TCanvas* can)
 {
-  Info("DrawEventInspector", "Drawing histogram collector from %p", forward);
+  Info("DrawHistCollector", "Drawing histogram collector from %p", forward);
   TCollection* c = GetCollection(forward, "fmdHistCollector");
   if (!c) return;
 
@@ -730,7 +958,7 @@ void DrawHistCollector(const TCollection* forward, TCanvas* can)
   CreateTemplates(name, value, .05);
   
   Int_t nCutBins, fiducial, merge, skipRings;
-  Float_t fiducialCut;
+  Double_t fiducialCut;
   Bool_t  bgAndHits;
 
   GetParameter(c, "nCutBins",       nCutBins);
@@ -738,7 +966,8 @@ void DrawHistCollector(const TCollection* forward, TCanvas* can)
   GetParameter(c, "bgAndHits",      bgAndHits);
   GetParameter(c, "merge",          merge);
   GetParameter(c, "fiducial",       fiducial);
-  GetParameter(c, "correctionCut",  fiducialCut);
+  // GetParameter(c, "correctionCut",  fiducialCut);
+  GetParameter(c, "fiducialCut",  fiducialCut);
 
   DrawParameter(name, value, y, "# of bins to cut",      Form("%d", nCutBins));
   DrawParameter(name, value, y, "Bg & hit maps stored.", bgAndHits?"yes":"no");
@@ -761,11 +990,35 @@ void DrawHistCollector(const TCollection* forward, TCanvas* can)
                 
   DrawInPad(body, 2, GetH2(c, "sumRings"), "colz"); 
   DrawInPad(body, 3, GetH2(c, "coverage"), "colz");
-  
+
+  body->cd(1)->Modified();
+  body->cd(2)->Modified();
+  body->cd(3)->Modified();
+  body->cd(1)->Update();
+  body->cd(2)->Update();
+  body->cd(3)->Update();
   PrintCanvas(can, "Histogram collector");
 }
   
 //____________________________________________________________________
+void AddToAll(THStack* all, const THStack* stack, Int_t curr, Int_t step)
+{
+  if (!stack) return;
+
+  TIter   next(stack->GetHists());
+  TH1*    h = 0;
+  while ((h = static_cast<TH1*>(next()))) {
+    TH1* copy = static_cast<TH1*>(h->Clone(Form("%s_copy", h->GetName())));
+    copy->SetDirectory(0);
+    if (curr != step) {
+      copy->SetMarkerColor(kGray);
+      copy->SetLineColor(kGray);
+    }
+    all->Add(copy);
+  }
+}
+
+//____________________________________________________________________
 void DrawStep(THStack*     delta, 
              THStack*     nchs, 
              THStack*     prims, 
@@ -775,13 +1028,15 @@ void DrawStep(THStack*     delta,
              Int_t        step)
 {
   THStack* all = 0;
+  TH1* res = 0;
   if (step < 6) {
     all = new THStack;
     if (step != 1) AddToAll(all, delta,  step, 1);
     if (step != 2) AddToAll(all, nchs,   step, 2);
     if (step != 3) AddToAll(all, prims,  step, 3);
     if (step != 4) AddToAll(all, rings,  step, 4);
-    TH1* res = static_cast<TH1*>(dndeta->Clone("dNdeta"));
+
+    res = static_cast<TH1*>(dndeta->Clone("dNdeta"));
     res->SetTitle("dN/d#eta");
     res->SetMarkerColor(step == 5 ? kBlack : kGray);
     res->SetLineColor(step == 5 ? kBlack : kGray);  
@@ -882,7 +1137,7 @@ void DrawStep(THStack*     delta,
     case 6: 
       break;
     default: 
-      Error("DrawStep", "Unknown step: %d (must be in 1-4)");
+      Error("DrawStep", "Unknown step: %d (must be in 1-6)", step);
       break;
     }
   }
@@ -909,23 +1164,6 @@ void FixStack(THStack* stack, const TString& title, Int_t marker)
   while ((h = static_cast<TH1*>(next())))  h->SetMarkerStyle(marker);
 }
 //____________________________________________________________________
-void AddToAll(THStack* all, const THStack* stack, Int_t curr, Int_t step)
-{
-  if (!stack) return;
-
-  TIter   next(stack->GetHists());
-  TH1*    h = 0;
-  while ((h = static_cast<TH1*>(next()))) {
-    TH1* copy = static_cast<TH1*>(h->Clone(Form("%s_copy", h->GetName())));
-    copy->SetDirectory(0);
-    if (curr != step) {
-      copy->SetMarkerColor(kGray);
-      copy->SetLineColor(kGray);
-    }
-    all->Add(copy);
-  }
-}
-//____________________________________________________________________
 void DrawSteps(const TCollection* forward, TCanvas* can)
 {
   // MakeChapter(can, "Steps");
@@ -966,20 +1204,43 @@ void DrawResults(const TCollection* forward,
   if (!c) return;
   
   DrawInPad(body, 1, GetStack(c, "all"), "nostack");
+
   DrawInPad(body, 2, GetH1(forwardRes, "dNdeta"));
   DrawInPad(body, 3, GetH1(forwardRes, "dNdeta_"));
   DrawInPad(body, 4, GetH1(forwardRes, "norm"));
   DrawInPad(body, 4, GetH1(forwardRes, "phi"), "same", 0x10);
   DrawInPad(body, 5, GetH1(forward,    "d2Ndetadphi"), "colz");
+
+  TCollection* mc = GetCollection(forwardRes, "mcRingResults");
+  if (mc) {
+    THStack* sMc = new THStack;
+    sMc->SetTitle("MC dN/d#eta per Ring");
+    const char* subs[] = { "FMD1I", "FMD2I", "FMD2O", "FMD3O", "FMD3I", 0 };
+    const char** ptr   = subs;
+    while (*ptr) { 
+      TCollection* sc = GetCollection(mc, *ptr);
+      if (!sc) { ptr++; continue; }
+      
+      TH1* h = GetH1(sc, "dndeta_eta");
+      if (!h) { ptr++; continue; }
+      sMc->Add(h);
+      ptr++;
+    }
+    DrawInPad(body, 1, sMc, "nostack same", 0x10);
+  }
+
   
   PrintCanvas(can, "Results");
+
 }
   
   
 //____________________________________________________________________
-void DrawAODSummary(const TString& filename="forward.root")
+void DrawAODSummary(const char* fname="forward.root",
+                   UShort_t what=0x7F)
 {
   // --- Open the file -----------------------------------------------
+  TString filename(fname);
   TFile* file = TFile::Open(filename.Data(), "READ");
   if (!file) { 
     Error("DrawAODSummary", "Failed to open \"%s\"", filename.Data());
@@ -996,19 +1257,21 @@ void DrawAODSummary(const TString& filename="forward.root")
 
   TCanvas* c = CreateCanvas(pdfName);
 
+  fgPause = what & 0x80;
+
   // --- Do each sub-algorithm ---------------------------------------
-  DrawEventInspector(forward,c);
-  DrawSharingFilter(forward,c);
-  DrawDensityCalculator(forward, c);
-  DrawCorrector(forward, c);
-  DrawHistCollector(forward, c);
+  if (what & 0x01) DrawEventInspector(forward,c);
+  if (what & 0x02) DrawSharingFilter(forward,c);
+  if (what & 0x04) DrawDensityCalculator(forward, c);
+  if (what & 0x08) DrawCorrector(forward, c);
+  if (what & 0x10) DrawHistCollector(forward, c);
   
   // --- Do the results ----------------------------------------------
   TCollection* forwardRes = GetCollection(file, "ForwardResults");
   if (!forwardRes) return;
 
-  DrawSteps(forwardRes, c);
-  DrawResults(forward, forwardRes, c);
+  if (what & 0x20) DrawSteps(forwardRes, c);
+  if (what & 0x40) DrawResults(forward, forwardRes, c);
   
   CloseCanvas(c);
 }
index ac8d94c..771fd91 100644 (file)
@@ -30,17 +30,16 @@ ForwardAODConfig(AliForwardMultiplicityBase* task)
   // Whether to enable low flux specific code 
   task->SetEnableLowFlux(kFALSE);
 
+  // --- Cuts --------------------------------------------------------
   // Would like to use dynamic cast but CINT interprets that as a 
   // static cast - sigh!
-  Bool_t   mc  = (task->IsA() == AliForwardMCMultiplicityTask::Class());
-  Double_t nXi = mc ? 2 : 2;   //HHD test
+  Bool_t   mc           = (task->IsA()==AliForwardMCMultiplicityTask::Class());
+  Double_t nXi          = 2; 
   Bool_t   includeSigma = false; //true;
-
   // Sharing cut
   AliFMDMultCuts cSharing;
   Double_t factor = 1.;
   cSharing.SetMultCuts(0.3, 0.3, 0.3, 0.3, 0.3);
   // Density cut
   AliFMDMultCuts cDensity;
   cDensity.SetMultCuts(0.3, 0.3, 0.3, 0.3, 0.3);
@@ -95,6 +94,8 @@ ForwardAODConfig(AliForwardMultiplicityBase* task)
   task->GetDensityCalculator().SetCuts(cDensity);
   // Set lumping (nEta,nPhi)
   task->GetDensityCalculator().SetLumping(32,4);
+  // Recalculate phi taking (x,y) offset of IP into account 
+  task->GetDensityCalculator().SetRecalculatePhi(true);
   // Set whether or not to use the phi acceptance
   //   AliFMDDensityCalculator::kPhiNoCorrect
   //   AliFMDDensityCalculator::kPhiCorrectNch
index fefd7e1..279d85f 100644 (file)
@@ -196,6 +196,7 @@ void ExtractAcceptance(Int_t   runNo=121526,
   f << "// Generated by ExtractAcceptance.C\n"
     << "void Upload(const TUrl& url)\n"
     << "{\n"
+    << "  gEnv->SetValue(\"XSec.GSI.DelegProxy\", \"2\");\n"
     << "  if (TString(\"alien\").EqualTo(url.GetProtocol())) {\n"
     << "    if (!TGrid::Connect(\"alien://\")) {\n"
     << "      Error(\"Upload\", \"Failed to connect to AliEn\");\n"
index 93418f0..a60a175 100644 (file)
@@ -26,7 +26,7 @@
  */
 void
 ExtractELoss(const char* fname="forward_eloss.root", Bool_t mc=false,
-            UShort_t sys=1, UShort_t sNN=900, Short_t field=5)
+            UShort_t sys=0, UShort_t sNN=0, Short_t field=0)
 {
 #ifdef __CINT__
   gROOT->Macro("$ALICE_ROOT/PWGLF/FORWARD/analysis2/scripts/LoadLibs.C");
@@ -97,6 +97,7 @@ ExtractELoss(const char* fname="forward_eloss.root", Bool_t mc=false,
   f << "// Generated by ExtractELoss.C\n"
     << "void Upload(const TUrl& url)\n"
     << "{\n"
+    << "  gEnv->SetValue(\"XSec.GSI.DelegProxy\", \"2\");\n"
     << "  if (TString(\"alien\").EqualTo(url.GetProtocol())) {\n"
     << "    if (!TGrid::Connect(\"alien://\")) {\n"
     << "      Error(\"Upload\", \"Failed to connect to AliEn\");\n"
index 0200325..0776b0a 100644 (file)
@@ -57,7 +57,7 @@ ExtractMCCorr(const char* fname = "forward_mccorr.root",
     if (oSNN) sNN   = oSNN->GetUniqueID();
     if (oFld) field = oFld->GetUniqueID();
   }
-  if (sys <= 0 || sys > 3) {
+  if (sys < 0 || sys > 3) {
     Error("ExtractMCCorr", "Couldn't get system type (%d), "
          "collision energy (%d), "
          "and/or field strength (%d)", sys, sNN, field);
@@ -83,6 +83,7 @@ void WriteUploadScript(UShort_t sys, UShort_t sNN, Short_t field)
   f << "// Generated by ExtractMCCorr.C\n"
     << "void Upload(const TUrl& url)\n"
     << "{\n"
+    << "  gEnv->SetValue(\"XSec.GSI.DelegProxy\", \"2\");\n"
     << "  if (TString(\"alien\").EqualTo(url.GetProtocol())) {\n"
     << "    if (!TGrid::Connect(\"alien://\")) {\n"
     << "      Error(\"Upload\", \"Failed to connect to AliEn\");\n"
index 13ff48c..059ab2e 100755 (executable)
 # 
 # Then, one needs to run this script in set-up mode e.g., 
 # 
-#   $0 --what setup  \
+#   $0 --what=setup  \
 #       --name=LHC10h --sys=pbpb --snn=2760 --field=5 \
 #       --real-dir=/alice/data/2010/LHC10h \
 #       --real-pattern=ESDs/pass2/*/AliESDs.root \
-#       --mc-dir=/alice/sim/LHC11a7 \
+#       --mc-dir=/alice/sim/LHC10h11 \
 #       --mc-pattern=*/AliESDs.root \
-#       --runs=runs.list --par
+#       --runs=LHC10.list --par
 # 
 # Note, all the settings are written to the file .config in the
 # current directory, so you do not need to give the parameters at
 # 
 # Next, we need to generate the corrections.  Do 
 # 
-#   $0 --what corrs 
+#   $0 --what=corrs 
 # 
 # and then monitor output on MonAlisa.  When enough has finished, execute 
 # 
-#   $0 --what corrs --step terminate 
+#   $0 --what=corrs --step=terminate 
 # 
-# enough times to get the final merged result.  Next, we need to download 
-# the results
-# 
-#   $0 --what corrs --step download 
-# 
-# and extract and upload the corrections to our local corrections folder
+# enough times to get the final merged result.  Next, we need to
+# extract and upload the corrections to our local corrections folder
 # 
-#   $0 --what corrs --step upload 
+#   $0 --what=corrs --step=upload 
 # 
 # Now we can submit our AOD generation jobs.  Do 
 # 
-#   $0 --what aods 
+#   $0 --what=aods 
 # 
 # and then monitor output on MonAlisa.  When enough has finished, execute 
 # 
-#   $0 --what aods --step terminate 
-# 
-# enough times to get the final merged result.  Next, we need to download 
-# the results
-# 
-#   $0 --what aods --step download 
+#   $0 --what=aods --step=terminate 
 # 
-# and we can draw the summary results 
+# enough times to get the final merged result.  Next, we need to
+# download the results and we draw the summary results
 # 
-#   $0 --what aods --step draw 
+#   $0 --what aods --step=draw 
 # 
 # Now, we should do the dN/deta analysis.  Do 
 # 
-#   $0 --what dndetas
+#   $0 --what=dndetas
 # 
 # and then monitor output on MonAlisa.  When enough has finished, execute 
 # 
-#   $0 --what dndetas --step terminate 
+#   $0 --what=dndetas --step=terminate 
 # 
 # enough times to get the final merged result.  Next, we need to download 
-# the results
+# the results and we can draw the summary and final plot
 # 
-#   $0 --what dndetas --step download 
-# 
-# and we can draw the final results 
-# 
-#   $0 --what dndetas --step draw 
+#   $0 --what=dndetas --step=draw 
 # 
 # Enjoy
 # 
@@ -93,14 +81,16 @@ par=0
 noact=0
 aliroot="&aliroot=v5-03-75pATF-AN"
 # root="root=v5-34-02-1"
+fwd_dir=$ALICE_ROOT/PWGLF/FORWARD/analysis2
 
 real_dir=
 real_pat=
 mc_dir=
 mc_pat=
-my_real_dir=/alice/cern.ch/users/
+my_real_dir=
 my_mc_dir=
 
+# === Various functions ==============================================
 # --- Usage ----------------------------------------------------------
 usage()
 {
@@ -135,9 +125,8 @@ and must be executed in that order.  STEP is one of
 
   full        Run the analysis 
   terminate   Terminate the job (may need iterations)
-  download    Download results 
-  upload      Upload corrections (only for OPERATION=corrs)
-  draw        Draw (partial) results
+  upload      Upload corrections (only for TRAINS=corrs)
+  draw        Draw (partial) results (not for TRAINS=corrs)
 EOF
 }
 
@@ -149,6 +138,84 @@ manual()
        sed -e '/\(BEGIN\|END\)_MANUAL/ d' -e 's/^# //' -e "s,\$0,$0,"
 }
 
+# === Utilities to execute scripts ===================================
+# --- Run script -----------------------------------------------------
+script()
+{
+    local scr=$1 ; shift 
+    local args=$1 ; shift
+    echo "Will run aliroot -l -b -q $scr($args)"
+    if test $noact -gt 0 ; then return ; fi
+    aliroot -l -b <<EOF
+.x $scr($args)
+.q
+EOF
+}
+# --- Run acceptance generation --------------------------------------
+accGen()
+{
+    local run=$1 
+    script ${fwd_dir}/corrs/ExtractAcceptance.C \
+       "${run},${sys},${snn},${field}"
+}
+
+# --- Extract corrections --------------------------------------------
+terminate()
+{
+    script Terminate.C 
+}
+# --- Extract corrections --------------------------------------------
+download()
+{
+    test -f .download && return 0 
+    script Download.C 
+    touch .download
+}
+# --- Extract corrections --------------------------------------------
+extract()
+{
+    test -f .extract && return 0 
+    script Extract.C 
+    touch .extract
+}
+# --- Upload a file --------------------------------------------------
+upload()
+{
+    test -f .upload && return 0 
+    script Upload.C \"file://${here}/${name}_corrs_${now}\"
+    touch .upload 
+}
+# --- Extract and upload ---------------------------------------------
+extract_upload()
+{
+    echo "Download, extract, and uploade in `basename $PWD`"
+    download
+    for i in *.zip ; do 
+       if test ! -f $i ; then continue ; fi 
+       echo "Extracting and uploading from $i"
+       if test $noact -gt 0 ; then continue ; fi
+       rm -rf tmp
+       (mkdir -p tmp && \
+           cd tmp && \ 
+           unzip ../$i && \
+               script ../Extract.C "" "" && 
+           upload)
+    done
+}
+
+# --- Draw -----------------------------------------------------------
+draw()
+{
+    local scr=$1 
+    download 
+    for i in *.zip ; do 
+       d=`basename $i .zip` 
+       mkdir -p $d 
+       unzip $i -d $d
+       (cd $d && script $scr)
+    done
+}
+
 # --- Get the grid home dir ------------------------------------------
 outputs()
 {
@@ -158,11 +225,64 @@ TGrid::Connect("alien://");
 gSystem->RedirectOutput(0);
 std::cout << gGrid->GetHomeDirectory() << std::endl;
 EOF`
-
     my_real_dir="$l/${name}_${now}_aod/output"
     my_mc_dir="$l/${name}_${now}_mcaod/output"
 }
 
+# === Trains =========================================================
+# --- Run set-ups ----------------------------------------------------
+setup()
+{
+    run_for_acc=`cat $runs | awk '{FS=" \n\t"}{printf "%d", $1}' | head -n 1` 
+    if test x$run_for_acc = "x" || test $run_for_acc -lt 1; then 
+       echo "No run for acceptance correction specified" > /dev/stderr 
+       exit 1
+    fi
+
+   now=`date '+%Y%m%d_%H%M'` 
+   outputs
+
+    # Write settings to a file, which we later can source 
+    cat > ${dotconf} <<EOF
+name="$name"
+runs=${runs}
+sys=$sys
+snn=$snn
+field=$field
+real_dir=${real_dir}
+real_pat=${real_pat}
+mc_dir=${mc_dir}
+mc_pat=${mc_pat}
+my_real_dir=${my_real_dir}
+my_mc_dir=${my_mc_dir}
+par=${par}
+now=${now}
+EOF
+
+    if test $noact -lt 1 ; then 
+       mkdir -p ${name}_acc_${now}
+    fi
+    echo "Make acceptance corrections" 
+    (cd ${name}_acc_${now} && \
+       accGen $run_for_acc && \
+       upload )
+}    
+
+# --- Run set-ups ----------------------------------------------------
+cleanup()
+{
+    rm -rf \
+       ${name}_acc_${now} \
+       ${name}_mccorr_${now} \
+       ${name}_mceloss_${now} \
+       ${name}_eloss_${now} \
+       ${name}_mcaod_${now} \
+       ${name}_aod_${now} \
+       ${name}_mcdndeta_${now} \
+       ${name}_dndeta_${now} \
+       ${name}_corrs_${now}
+}
+
 # --- Check settings -------------------------------------------------
 check()
 {
@@ -231,115 +351,6 @@ Date & time:            ${now}
 
 EOF
 }
-   
-# --- Run script -----------------------------------------------------
-script()
-{
-    scr=$1 ; shift 
-    args=$1 
-    echo "Will run aliroot -l -b -q $scr($args)"
-    if test $noact -gt 0 ; then return ; fi
-    aliroot -l -b <<EOF
-.x $scr($args)
-.q
-EOF
-}
-# --- Run acceptance generation --------------------------------------
-accGen()
-{
-    local run=$1 
-    script $ALICE_ROOT/PWGLF/FORWARD/analysis2/corrs/ExtractAcceptance.C \
-       "${run},${sys},${snn},${field}"
-}
-
-# --- Extract corrections --------------------------------------------
-terminate()
-{
-    script Terminate.C 
-}
-# --- Extract corrections --------------------------------------------
-download()
-{
-    script Download.C 
-}
-# --- Extract corrections --------------------------------------------
-extract()
-{
-    script Extract.C 
-}
-# --- Upload a file --------------------------------------------------
-upload()
-{
-    script Upload.C \"file://${here}/${corrs}\"
-}
-# --- Extract and upload ---------------------------------------------
-extract_upload()
-{
-  for i in *.zip ; do 
-      if test ! -f $i ; then continue ; fi 
-      echo "Extracting and uploading from $i"
-      if test $noact -gt 0 ; then continue ; fi
-      rm -rf tmp
-      (mkdir -p tmp && \
-         cd tmp && \ 
-         unzip ../$i && \
-             script ../Extract.C && 
-         upload)
-  done
-}
-
-# --- Run set-ups ----------------------------------------------------
-cleanup()
-{
-    rm -rf ${name}_acc \
-       ${name}_mccorr \
-       ${name}_mceloss \
-       ${name}_eloss \
-       ${name}_mcaod \
-       ${name}_aod \
-       ${name}_mcdndeta \
-       ${name}_dndeta \
-       tmp \
-       ${corrs}
-}
-
-# --- Run set-ups ----------------------------------------------------
-setup()
-{
-    run_for_acc=`cat $runs | awk '{FS=" \n\t"}{printf "%d", $1}' | head -n 1` 
-    if test x$run_for_acc = "x" || test $run_for_acc -lt 1; then 
-       echo "No run for acceptance correction specified" > /dev/stderr 
-       exit 1
-    fi
-
-   now=`date '+%Y%m%d_%H%M'` 
-   outputs
-
-    # Write settings to a file, which we later can source 
-    cat > ${dotconf} <<EOF
-name="$name"
-runs=${runs}
-sys=$sys
-snn=$snn
-field=$field
-real_dir=${real_dir}
-real_pat=${real_pat}
-mc_dir=${mc_dir}
-mc_pat=${mc_pat}
-my_real_dir=${my_real_dir}
-my_mc_dir=${my_mc_dir}
-par=${par}
-now=${now}
-EOF
-
-    if test $noact -lt 1 ; then 
-       mkdir -p ${name}_acc
-    fi
-    echo "Make acceptance corrections" 
-    (cd ${name}_acc && \
-       accGen $run_for_acc && \
-       upload )
-}    
 
 # --- Run the train --------------------------------------------------
 # Usage:
@@ -364,11 +375,12 @@ allAboard()
        *corr)  cl=MakeMCCorrTrain ; mc=1 ;;
        *eloss) cl=MakeFMDELossTrain ;;  
        *aod)   cl=MakeAODTrain 
-           opts="--corr=../${corrs} --sys=${sys} --snn=${snn} --field=${field}"
+           opts="--corr=../${name}_corrs_${now} --sys=${sys} --snn=${snn} --field=${field}"
            ;;
        *dndeta) cl=MakedNdetaTrain 
            tree=aodTree 
            uopt="&concat"
+           opts="${opts}"
            ;;
        *) echo "$0: Unknown type of train: $type" > /dev/stderr ; exit 1 ;;
     esac
@@ -389,6 +401,12 @@ allAboard()
            fi
            ;;
     esac
+    case $type in 
+       *aod|*dndeta) 
+           if test $sys -gt 1 ; then opts="${opts} --cent" ; fi ;; 
+       *)
+           ;;
+    esac
     if test $par -gt 0 ; then 
        uopt="${uopt}&par"
     fi
@@ -419,7 +437,7 @@ EOF
 Then, do 
 
   (cd ${nme}_${now} && aliroot -l -b -q Extract.C)
-  (cd ${nme}_${now} && aliroot -l -b -q 'Upload.C("local://${here}/${corrs}")')
+  (cd ${nme}_${now} && aliroot -l -b -q 'Upload.C("local://${here}/${name}_corrs_${now}")')
 
 to upload the results to our local corrections store. 
 EOF
@@ -428,7 +446,7 @@ EOF
            cat <<EOF
 Then, do 
  
-  (cd ${nme}_${now} && aliroot -l $ALICE_ROOT/PWGLF/FORWARD/analysis2/DrawAODSummary.C)
+  (cd ${nme}_${now} && aliroot -l ${fwd_dir}/DrawAODSummary.C)
 
 to get a PDF of the diagnostics histograms
 EOF
@@ -437,7 +455,7 @@ EOF
            cat <<EOF
 Then, do 
  
-  (cd ${nme}_${now} && aliroot -l $ALICE_ROOT/PWGLF/FORWARD/analysis2/DrawdNdetaSummary.C)
+  (cd ${nme}_${now} && aliroot -l ${fwd_dir}/DrawdNdetaSummary.C)
 
 to get a PDF of the diagnostics histograms, and 
 
@@ -450,6 +468,7 @@ EOF
 }
 
 
+# === Wrappers =======================================================
 # --- Run all correction jobs ----------------------------------------
 corrs()
 {
@@ -463,12 +482,6 @@ corrs_terminate()
     (cd ${name}_mceloss_${now} && terminate)
     (cd ${name}_eloss_${now}   && terminate)
 }
-corrs_download() 
-{
-    (cd ${name}_mccorr_${now}  && download)
-    (cd ${name}_mceloss_${now} && download)
-    (cd ${name}_eloss_${now}   && download)
-}
 corrs_upload() 
 {
     (cd ${name}_mccorr_${now}  && extract_upload)
@@ -490,21 +503,14 @@ aods_terminate()
     (cd ${name}_mcaod_${now} && terminate)
     (cd ${name}_aod_${now}   && terminate)
 }
-aods_download() 
-{
-    (cd ${name}_mcaod_${now} && download)
-    (cd ${name}_aod_${now}   && download)
-}
 aods_upload()
 {
     echo "Upload does not make sense for AOD jobs"
 }
 aods_draw() 
 {
-    (cd ${name}_mcaod_${now} && \
-       script $ALICE_ROOT/PWGLF/FORWARD/analysis2/DrawAODSummary.C)
-    (cd ${name}_aod_${now} && \
-       script $ALICE_ROOT/PWGLF/FORWARD/analysis2/DrawAODSummary.C)
+    (cd ${name}_mcaod_${now} && draw ${fwd_dir}/DrawAODSummary.C)
+    (cd ${name}_aod_${now}   && draw ${fwd_dir}/DrawAODSummary.C)
 }
 
 # --- Run all dN/deta jobs -------------------------------------------
@@ -518,25 +524,19 @@ dndetas_terminate()
     (cd ${name}_mcdndeta_${now} && terminate)
     (cd ${name}_dndeta_${now}   && terminate)
 }
-dndetas_download() 
-{
-    (cd ${name}_mcdndeta_${now} && download)
-    (cd ${name}_dndeta_${now}   && download)
-}
 dndetas_upload()
 {
     echo "Upload does not make sense for dN/deta jobs"
 }
 dndetas_draw() 
 {
-    (cd ${name}_mcdndeta_${now} && \
-       script $ALICE_ROOT/PWGLF/FORWARD/analysis2/DrawdNdetaSummary.C && \
+    (cd ${name}_mcdndeta_${now} && draw ${fwd_dir}/DrawdNdetaSummary.C && \
        script draw.C)
-    (cd ${name}_dndeta_${now} && \
-       script $ALICE_ROOT/PWGLF/FORWARD/analysis2/DrawdNdetaSummary.C && \
+    (cd ${name}_dndeta_${now}   && draw ${fwd_dir}/DrawdNdetaSummary.C && \
        script draw.C)
 }
 
+# === Executable code
 # --- Source settings if found ---------------------------------------
 if test -f $dotconf ; then 
     source $dotconf 
@@ -596,12 +596,12 @@ case $what in
     *) echo "$0: Unknown operation: $what" > /dev/stderr ; exit 1 ;;
 esac
     
-case $step in 
-    full) ;; 
-    term*) func=${func}_terminate ;; 
-    down*) func=${func}_download ;; 
-    up*)   func=${func}_upload ;; 
-    dr*)   func=${func}_draw ;;
+case x$step in 
+    x|xfull) ;; 
+    xterm*) func=${func}_terminate ;; 
+    xup*)   func=${func}_upload ;; 
+    xdr*)   func=${func}_draw ;;
+    *) echo "$0: Unknown step $step" > /dev/stderr ; exit 1 ;;
 esac
 
 echo "Will execute $func"