Doc updates
authorcholm <cholm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 17 Jan 2011 12:09:11 +0000 (12:09 +0000)
committercholm <cholm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 17 Jan 2011 12:09:11 +0000 (12:09 +0000)
12 files changed:
PWG2/FORWARD/analysis2/AddTaskFMD.C
PWG2/FORWARD/analysis2/AliFMDEnergyFitterTask.cxx
PWG2/FORWARD/analysis2/AnalyseAOD.C
PWG2/FORWARD/analysis2/MakeELossFits.C
PWG2/FORWARD/analysis2/Run.sh
PWG2/FORWARD/analysis2/scripts/DrawELossFits.C
PWG2/FORWARD/analysis2/scripts/DrawFits.C
PWG2/FORWARD/analysis2/scripts/ExtractELoss.C
PWG2/FORWARD/analysis2/scripts/FitELoss.C
PWG2/FORWARD/analysis2/scripts/MakeELossFit.C
PWG2/FORWARD/analysis2/scripts/RunMakeELossFit.C
PWG2/FORWARD/analysis2/scripts/RunViaPlugin.C [new file with mode: 0644]

index 57ff483..06cc038 100644 (file)
@@ -16,6 +16,8 @@
 AliAnalysisTask*
 AddTaskFMD(Bool_t mc)
 {
+  gSystem->Load("libPWG2forward2");
+
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   if (!mgr) {
     Error("AddTaskFMD", "No analysis manager to connect to.");
index 8bc5a99..e72d4ef 100644 (file)
@@ -230,6 +230,7 @@ AliFMDEnergyFitterTask::Terminate(Option_t*)
   // Parameters:
   //    option Not used 
   //
+  AliInfo(Form("Running terminate of %s", GetName()));
   TList* list = dynamic_cast<TList*>(GetOutputData(1));
   if (!list) {
     AliError(Form("No output list defined (%p)", GetOutputData(1)));
@@ -249,6 +250,7 @@ AliFMDEnergyFitterTask::Terminate(Option_t*)
     list->ls();
     return;
   }
+  AliInfo("Fitting energy loss spectra");
   fEnergyFitter.Fit(list);
 }
 
index 88fa341..b2e167c 100644 (file)
@@ -908,9 +908,10 @@ public:
 
     // Finally, rebin the histogram, and set new content
     h->Rebin(rebin);
+    h->Reset();
     for(Int_t i =1;i<=nBinsNew; i++) {
       h->SetBinContent(i,tmp->GetBinContent(i));
-      // h->SetBinError(i,tmp->GetBinError(i));
+      h->SetBinError(i,tmp->GetBinError(i));
     }
     
     delete tmp;
index 02a8f36..400c98a 100644 (file)
  * @ingroup pwg2_forward_scripts
  */
 void MakeELossFits(const char* esddir, 
-                   Int_t       nEvents=1000, 
-                   Bool_t      mc=false,
-                   Bool_t      proof=false)
+                  Int_t       nEvents=1000, 
+                  Int_t       proof=0,
+                  Bool_t      mc=false)
 {
   // --- Libraries to load -------------------------------------------
   gROOT->Macro("$ALICE_ROOT/PWG2/FORWARD/analysis2/scripts/LoadLibs.C");
 
   // --- Check for proof mode, and possibly upload pars --------------
-  if (proof) 
-    gROOT->Macro("$ALICE_ROOT/PWG2/FORWARD/analysis2/scripts/LoadPars.C");
+  if (proof > 0) {
+    gROOT->LoadMacro("$ALICE_ROOT/PWG2/FORWARD/analysis2/scripts/LoadPars.C");
+    LoadPars(proof);
+  }
   
   // --- Our data chain ----------------------------------------------
   gROOT->LoadMacro("$ALICE_ROOT/PWG2/FORWARD/analysis2/scripts/MakeESDChain.C");
-  TChain* chain = MakeESDChain(esddir, mc);
+  TChain* chain = MakeESDChain(esddir, true);
   // If 0 or less events is select, choose all 
   if (nEvents <= 0) nEvents = chain->GetEntries();
   Info("MakeELossFits", "Will analyse %d events", nEvents);
@@ -53,7 +55,6 @@ void MakeELossFits(const char* esddir,
   aodHandler->SetOutputFileName("AliAODs.root");
 
   // --- Add tasks ---------------------------------------------------
-  gROOT->LoadMacro("$ALICE_ROOT/PWG2/FORWARD/analysis2/AddTaskFMD.C");
   gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
   AddTaskPhysicsSelection(mc, kTRUE, kTRUE);
   AliFMDEnergyFitterTask* task = new AliFMDEnergyFitterTask("fmdEnergyFitter");
@@ -114,12 +115,12 @@ void MakeELossFits(const char* esddir,
   // Some informative output 
   mgr->PrintStatus();
   // mgr->SetDebugLevel(3);
-  if (mgr->GetDebugLevel() < 1 && !proof) mgr->SetUseProgressBar(kTRUE);
+  if (mgr->GetDebugLevel() < 1 && proof <= 0) mgr->SetUseProgressBar(kTRUE);
 
   // Run the train 
   t.Start();
   Printf("=== RUNNING ANALYSIS ==================================");
-  mgr->StartAnalysis(proof ? "proof" : "local", chain, nEvents);
+  mgr->StartAnalysis(proof > 0 ? "proof" : "local", chain, nEvents);
   t.Stop();
   t.Print();
 }
index db6ff8b..3e550c7 100755 (executable)
@@ -16,6 +16,7 @@ cms=900
 hhd=1
 comp=1
 tit=
+pass1=Pass1.C
 
 usage()
 {
@@ -41,6 +42,7 @@ Options:
        -g,--gdb                Run in GDB mode            ($gdb)
        -H,--hhd                Do comparison to HHD       ($hhd)
        -O,--other              Do comparison to other     ($comp)
+       -E,--eloss              Run energy loss script     
 
 TYPE is a comma or space separated list of 
  
@@ -75,6 +77,7 @@ while test $# -gt 0 ; do
        -V|--vz-max)         vzmax=$2         ; shift ;; 
        -e|--energy)         cms=$2           ; shift ;;
        -S|--title)          tit="$2"         ; shift ;;
+       -E|--eloss)          pass1=MakeELossFits.C ; nodraw=1 ;;
        -t|--type)           
            if test "x$type" = "x" ; then type=$2 ; else type="$type|$2"; fi
            shift ;;
@@ -106,17 +109,20 @@ if test $noanal -lt 1 ; then
     if test $gdb -gt 0 ; then 
        export PROOF_WRAPPERCMD="gdb -batch -x $ALICE_ROOT/PWG2/FORWARD/analysis2/gdb_cmds --args"
     fi
-    echo "Running aliroot ${opts} ${opts1} ${ana}/Pass1.C\(\".\",$nev,$proof,$mc\) $redir"
+    echo "Running aliroot ${opts} ${opts1} ${ana}/${pass1}\(\".\",$nev,$proof,$mc\) $redir"
     if test $batch -gt 0 ; then 
-       aliroot $opts $opts1 ${ana}/Pass1.C\(\".\",$nev,$proof,$mc\) 2>&1 | tee ${base}.log
+       aliroot $opts $opts1 ${ana}/${pass1}\(\".\",$nev,$proof,$mc\) 2>&1 | tee ${base}.log
     else 
-       aliroot $opts $opts1 ${ana}/Pass1.C\(\".\",$nev,$proof,$mc\)
+       aliroot $opts $opts1 ${ana}/${pass1}\(\".\",$nev,$proof,$mc\)
     fi
+    fail=$?
     rm -f event_stat.root \
        EventStat_temp.root \
        outputs_valid \
        `printf %09d.stat $nev` 
-    if test ! -f AnalysisResults.root || test ! -f AliAODs.root ; then 
+    if  test $fail -gt 0               || \
+       test ! -f AnalysisResults.root || \
+       test ! -f AliAODs.root ; then 
        echo "Analysis failed" 
        exit 1
     fi
index 41bb86e..401bd90 100644 (file)
@@ -1,3 +1,17 @@
+/**
+ * @file 
+ * 
+ * Scripts to draw energy loss fits from correction object file 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+ */
+/** 
+ * Clear canvas 
+ * 
+ * @param c Canvas to clear 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void
 ClearCanvas(TCanvas* c)
 {
@@ -8,9 +22,28 @@ ClearCanvas(TCanvas* c)
   c->Clear();
 }
 
+/** 
+ * Draw energy loss fits to a multi-page PDF. 
+ *
+ * @par Input: 
+ * The input file is expected to contain a AliFMDCorrELossFit object
+ * named @i elossfits in the top level directory
+ * 
+ * @para Output: 
+ * A multi-page PDF.  Note, that the PDF generated by ROOT in this way
+ * is broken (cannot be read by Acrobat Reader on Windows and MacOSX)
+ * and one should pass it through a filter to correct these problems.
+ * 
+ * @param fname   File name 
+ * @param option  Drawing options 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void
 DrawELossFits(const char* fname, const char* option="err")
 {
+  //__________________________________________________________________
+  // Load libraries and object 
   gROOT->Macro("$ALICE_ROOT/PWG2/FORWARD/analysis2/scripts/LoadLibs.C");
 
   TFile* file = TFile::Open(fname, "READ");
@@ -28,6 +61,8 @@ DrawELossFits(const char* fname, const char* option="err")
     return;
   }
 
+  //__________________________________________________________________
+  // Create a canvas
   TCanvas* c = new TCanvas("c", "c", 800 / TMath::Sqrt(2), 800);
   c->SetFillColor(0);
   c->SetBorderSize(0);
@@ -47,7 +82,8 @@ DrawELossFits(const char* fname, const char* option="err")
   gStyle->SetFrameBorderMode(1);
 
   ClearCanvas(c);
-
+  //__________________________________________________________________
+  // Create a title page 
   TLatex* ll = new TLatex(.5,.8, fname);
   ll->SetTextAlign(22);
   ll->SetTextSize(0.05);
@@ -84,14 +120,20 @@ DrawELossFits(const char* fname, const char* option="err")
 
   ClearCanvas(c);
 
+  //__________________________________________________________________
+  // Draw overview page 
   fits->Draw(option);
   c->Print(pname.Data(), "Title:Fit overview");
 
   ClearCanvas(c);
 
+  //__________________________________________________________________
+  // Draw relative parameter errors 
   fits->Draw("rel");
   c->Print(pname.Data(), "Title:Relative parameter errors");
 
+  //__________________________________________________________________
+  // Draw all fits individually
   Int_t nPad = 6;
   for (UShort_t d=1; d<=3; d++) { 
     UShort_t nQ = (d == 1 ? 1 : 2);
@@ -127,5 +169,10 @@ DrawELossFits(const char* fname, const char* option="err")
     }
   }
 
+  //__________________________________________________________________
+  // Close output file 
   c->Print(Form("%s]", pname.Data()));
 }
+//
+// EOF
+//
index 8aaf0ad..55d242e 100644 (file)
@@ -1,5 +1,6 @@
 /**
- * Script to draw the energy loss fits 
+ * Script to draw the energy loss fits from the output file of 
+ * AliFMDELossFitter(Task). 
  * 
  * @ingroup pwg2_forward_analysis_scripts
  */
@@ -21,6 +22,36 @@ TCanvas* canvas = 0;
 const char* pdfName = "FitResults.pdf";
 
 //____________________________________________________________________
+/** 
+ * Open a file.  The file is expected to contain the directory 
+ * structure 
+ *
+ * @verbatim 
+ *  file
+ *   +- Forward 
+ *       +- fmdEnergyFitter 
+ *           +- chi2   (THStack)
+ *           +- c      (THStack)
+ *           +- delta  (THStack)
+ *           +- xi     (THStack)
+ *           +- sigma  (THStack)
+ *           +- sigman (THStack)
+ *           +- n      (THStack)
+ *           +- a2     (THStack)
+ *           +- ...    (THStack)
+ *           +- an     (THStack)
+ *           +- FMD1I (TList)
+ *           |   +- FMD1I_edist (TH1)
+ *           |   +- EDists      (TList)
+ *           ...
+ * @endverbatim
+ * 
+ * @param fname File to open  
+ * 
+ * @return Pointer to the list of objects 
+ * 
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 TList* OpenFile(const char* fname)
 {
   TFile* file = TFile::Open(fname, "READ");
@@ -44,6 +75,15 @@ TList* OpenFile(const char* fname)
   return fitter;
 }
 //____________________________________________________________________
+/** 
+ * Open file if not done already 
+ * 
+ * @param fname File to open
+ * 
+ * @return List of fits 
+ * 
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 TList* CheckFitter(const char* fname="AnalysisResults.root")
 {
   if (!fitter) return OpenFile(fname);
@@ -51,6 +91,14 @@ TList* CheckFitter(const char* fname="AnalysisResults.root")
 }
 
 //____________________________________________________________________
+/** 
+ * Make canvas if not done already 
+ * 
+ * 
+ * @return Canvas 
+ * 
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 TCanvas* CheckCanvas()
 {
   if (canvas) return canvas;
@@ -82,6 +130,13 @@ TCanvas* CheckCanvas()
 }
   
 //____________________________________________________________________
+/** 
+ * Draw summary 
+ * 
+ * @param fname 
+ * 
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void DrawSummary(const char* fname="AnalysisResults.root")
 {
   if (!CheckFitter(fname)) {
@@ -176,6 +231,13 @@ void DrawSummary(const char* fname="AnalysisResults.root")
 }
 
 //____________________________________________________________________
+/** 
+ * Draw ring fits 
+ * 
+ * @param fname 
+ * 
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void DrawRings(const char* fname="AnalysisResults.root")
 {
   if (!CheckFitter(fname)) {
@@ -230,6 +292,13 @@ void DrawRings(const char* fname="AnalysisResults.root")
 }
 
 //____________________________________________________________________
+/** 
+ * Draw fits in eta bins 
+ * 
+ * @param fname 
+ * 
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void DrawEtaBins(const char* fname="AnalysisResults.root")
 {
   if (!CheckFitter(fname)) {
@@ -294,6 +363,37 @@ void DrawEtaBins(const char* fname="AnalysisResults.root")
 }   
 
 //____________________________________________________________________
+/** 
+ * Draw energy loss fits to a multi-page PDF
+ *
+ * The input file is the result of running AliFMDELossFitter - 
+ * either directly via AliFMDELossFitterTask or as part of a larger 
+ * train (AliForwardMultiplicityTask or AliForwardMCMultiplicityTask). 
+ * 
+ * @verbatim 
+ *  file
+ *   +- Forward 
+ *       +- fmdEnergyFitter 
+ *           +- chi2   (THStack)
+ *           +- c      (THStack)
+ *           +- delta  (THStack)
+ *           +- xi     (THStack)
+ *           +- sigma  (THStack)
+ *           +- sigman (THStack)
+ *           +- n      (THStack)
+ *           +- a2     (THStack)
+ *           +- ...    (THStack)
+ *           +- an     (THStack)
+ *           +- FMD1I (TList)
+ *           |   +- FMD1I_edist (TH1)
+ *           |   +- EDists      (TList)
+ *           ...
+ * @endverbatim
+ *
+ * @param fname 
+ * 
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void
 DrawFits(const char* fname="AnalysisResults.root")
 {
@@ -307,3 +407,6 @@ DrawFits(const char* fname="AnalysisResults.root")
   DrawEtaBins(fname);
   canvas->Print(Form("%s]", pdfName));
 }
+//
+// EOF
+//
index 2ff53e2..1459232 100644 (file)
 #endif 
 
 //____________________________________________________________________
+/** 
+ * Extract the energy loss correction object from file and rename it 
+ * according to the settings 
+ * 
+ * @param fname  File to extract from 
+ * @param sys    Collision system (pp, PbPb)
+ * @param sNN    Center of mass energy (in GeV) per nucleon
+ * @param field  L3 magnetic field (-5,0,5) in kGaus
+ * @param mc     Whether this is from MC data or not 
+ * 
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void
 ExtractELoss(const char* fname="energyFits.root", 
             UShort_t sys=1, UShort_t sNN=900, Short_t field=5, Bool_t mc=false)
@@ -77,17 +89,30 @@ ExtractELoss(const char* fname="energyFits.root",
     
   
 //____________________________________________________________________
+/** 
+ * Extract the energy loss correction object from file and rename it 
+ * according to the settings 
+ * 
+ * @param fname  File to extract from 
+ * @param sys    Collision system (pp, PbPb)
+ * @param sNN    Center of mass energy (in GeV) per nucleon
+ * @param field  L3 magnetic field (-5,0,5) in kGaus
+ * @param mc     Whether this is from MC data or not 
+ * 
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void
 ExtractELoss(const char* fname="energyFits.root", 
             const char* sys="p-p", 
             Float_t     sNN=900, 
-            Float_t     field=5)
+            Float_t     field=5,
+            Bool_t      mc=false)
 {
   UShort_t uSys   = AliForwardUtil::ParseCollisionSystem(sys);
   UShort_t usNN   = AliForwardUtil::ParseCenterOfMassEnergy(uSys,sNN);
   Short_t  sField = AliForwardUtil::ParseMagneticField(field);
 
-  ExtractELoss(fname, uSys, usNN, sField);
+  ExtractELoss(fname, uSys, usNN, sField, mc);
 }
 
 //____________________________________________________________________
index 8bb4a9e..b30f384 100644 (file)
@@ -1,6 +1,9 @@
 /**
  * Test script to fit the energy loss spectra 
  * 
+ * @deprecated
+ * This is a simple test script 
+ *
  * @ingroup pwg2_forward_analysis_scripts
  */
 #ifndef __CINT__
@@ -23,6 +26,21 @@ class TF1;
 #endif
 
 //____________________________________________________________________
+/** 
+ * 
+ * 
+ * @param ef 
+ * @param d 
+ * @param r 
+ * @param etabin 
+ * 
+ * @return 
+ *
+ * @deprecated
+ * This is a simple test script 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 TH1* GetEDist(TList* ef, UShort_t d, Char_t r, UShort_t etabin)
 {
   TList* dL = static_cast<TList*>(ef->FindObject(Form("FMD%d%c",d,r)));
@@ -57,6 +75,21 @@ TH1* GetEDist(TList* ef, UShort_t d, Char_t r, UShort_t etabin)
 }
 
 //____________________________________________________________________
+/** 
+ * 
+ * 
+ * @param ef 
+ * @param d 
+ * @param r 
+ * @param eta 
+ * 
+ * @return  
+ *
+ * @deprecated
+ * This is a simple test script 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+*/
 TH1* GetEDist(TList* ef, UShort_t d, Char_t r, Float_t eta)
 {
   if (!ef) { 
@@ -80,6 +113,18 @@ TH1* GetEDist(TList* ef, UShort_t d, Char_t r, Float_t eta)
 }
 
 //____________________________________________________________________
+/** 
+ * 
+ * 
+ * @param file 
+ * 
+ * @return 
+ *
+ * @deprecated
+ * This is a simple test script 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 TList* GetEF(TFile* file) 
 {
   TList* forward = static_cast<TList*>(file->Get("PWG2forwardDnDeta/Forward"));
@@ -100,6 +145,17 @@ TList* GetEF(TFile* file)
 TList* ef = 0;
 
 //____________________________________________________________________
+/** 
+ * 
+ * 
+ * 
+ * @return 
+ *
+ * @deprecated
+ * This is a simple test script 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 TList*  CheckEF()
 {
   if (ef) return ef;
@@ -116,6 +172,17 @@ TList*  CheckEF()
 TCanvas* c = 0;
 
 //____________________________________________________________________
+/** 
+ * 
+ * 
+ * 
+ * @return 
+ *
+ * @deprecated
+ * This is a simple test script 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 TCanvas* CheckC()
 {
   if (c) return c;
@@ -146,6 +213,16 @@ TCanvas* CheckC()
 }
 
 //____________________________________________________________________
+/** 
+ * 
+ * 
+ * @param f 
+ *
+ * @deprecated
+ * This is a simple test script 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void PrintFit(TF1* f)
 {
   Int_t    nu     = f->GetNDF();
@@ -163,6 +240,19 @@ void PrintFit(TF1* f)
 }
   
 //____________________________________________________________________
+/** 
+ * 
+ * 
+ * @param n 
+ * @param d 
+ * @param r 
+ * @param eta 
+ *
+ * @deprecated
+ * This is a simple test script 
+ *
+ * @ingroup pwg2_forward_analysis_scripts
+ */
 void FitELoss(Int_t n, UShort_t d, Char_t r, Float_t eta)
 {
   TList* ef1 = CheckEF();
@@ -210,3 +300,6 @@ void FitELoss(Int_t n, UShort_t d, Char_t r, Float_t eta)
 
   c1->cd();
 }
+//
+// EOF
+//
index e8509ab..719d225 100644 (file)
@@ -45,6 +45,10 @@ class TH1;
  * @endverbatim 
  * and stored in SVN for later use. 
  *
+ * @depcrecated 
+ * The class AliFMDELossFitter automatically generates the
+ * AliFMDCorrELossFit object.
+ *
  * @ingroup pwg2_forward_analysis_scripts
  */
 
index 6ffb77a..8054c2d 100644 (file)
@@ -8,6 +8,11 @@
  * @param filename  Input file name 
  *
  * @ingroup pwg2_forward_analysis_scripts
+ *
+ * @depcrecated 
+ * The class AliFMDELossFitter automatically generates the
+ * AliFMDCorrELossFit object.
+ *
  */
 void
 RunMakeELossFit(UShort_t    sys, 
diff --git a/PWG2/FORWARD/analysis2/scripts/RunViaPlugin.C b/PWG2/FORWARD/analysis2/scripts/RunViaPlugin.C
new file mode 100644 (file)
index 0000000..a1f60e9
--- /dev/null
@@ -0,0 +1,235 @@
+class AliAnalysisAlien;
+
+//____________________________________________________________________
+// Forward declarations 
+AliAnalysisAlien*
+CreateAlienHandler(const TString& runMode,
+                  const TString& dataDir,
+                  const TString& anaSource,
+                  const TString& addLibs,
+                  const TString& anaName,
+                  const TString& aliceTag, 
+                  const TString& rootTag, 
+                  const TString& apiTag);
+
+//____________________________________________________________________
+void
+RunViaPlugin(const Char_t* runMode="", 
+            const Char_t* dataDir=".", 
+            Long64_t      nEvents=-1, 
+            Bool_t        mc=false)
+{
+  gSystem->Load("libANALYSIS");
+  gSystem->Load("libANALYSISalice");
+
+  // --- Creating the manager and handlers ---------------------------
+  AliAnalysisManager *mgr  = new AliAnalysisManager("Analysis Train", 
+                                                   "FMD analysis train");
+
+  // --- ESD input handler -------------------------------------------
+  AliESDInputHandler *esdHandler = new AliESDInputHandler();
+  esdHandler->SetInactiveBranches("AliESDACORDE "
+                                 "AliRawDataErrorLogs "
+                                 "CaloClusters "
+                                 "Cascades "
+                                 "EMCALCells "
+                                 "EMCALTrigger "
+                                 "Kinks "
+                                 "Cascades "
+                                 "MuonTracks "
+                                 "TrdTracks "
+                                 "HLTGlobalTrigger");
+  mgr->SetInputEventHandler(esdHandler);      
+       
+  // --- Monte Carlo handler -----------------------------------------
+  if (mc) {
+    AliMCEventHandler* mcHandler = new AliMCEventHandler();
+    mgr->SetMCtruthEventHandler(mcHandler);
+    mcHandler->SetReadTR(true);    
+  }
+
+  // --- AOD output handler ------------------------------------------
+  AliAODHandler* aodHandler   = new AliAODHandler();
+  mgr->SetOutputEventHandler(aodHandler);
+  aodHandler->SetOutputFileName("AliAODs.root");
+
+  // --- Add tasks ---------------------------------------------------
+  // Physics selection 
+  gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
+  AddTaskPhysicsSelection(mc, kTRUE, kTRUE);
+
+  // FMD 
+  gROOT->LoadMacro("$ALICE_ROOT/PWG2/FORWARD/analysis2/AddTaskFMD.C");
+  AddTaskFMD(mc);
+
+  // --- Create the plug-in object -----------------------------------
+  TString mode(runMode);
+  TString dir(dataDir);
+  TString anaSource("");
+  TString addLibs("");
+  TString anaName("FMD");
+  TString aliceTag("v4-21-04-AN");
+  TString rootTag("v5-27-06b");
+  TString apiTag("V1.1x");
+  AliAnalysisAlien* alienHandler = CreateAlienHandler(mode,
+                                                     dir,
+                                                     anaSource,
+                                                     addLibs,
+                                                     anaName,
+                                                     aliceTag, 
+                                                     rootTag, 
+                                                     apiTag);
+  if (!alienHandler) { 
+    Error("RunViaPlugin.C", "Failed to make plugin");
+    return;
+  }
+  mgr->SetGridHandler(alienHandler);
+
+  // --- final job setup and execution -------------------------------
+  // Enable debug printouts
+  // mgr->SetDebugLevel(2);
+  if (!mgr->InitAnalysis()) {
+    Error("RunViaPlugin.C", "Failed to initialise the train");
+    return;
+  }
+  if (nEvents <= 0) nEvents = 1234567890;
+  TString amode("grid");
+  mode.ToLower();
+  if (mode.Contains("test")) amode = local;
+
+  mgr->PrintStatus();
+  mgr->StartAnalysis(amode.Data(), nEvents);  
+}
+
+//____________________________________________________________________
+/** 
+ * Create an AliAnalysisGrid parameter object 
+ * 
+ * @param runMode     Running mode (full, test, terminate, submit, offline)
+ * @param dataDir     Input data directory 
+ * @param anaSource   Possible source to compile on worker node 
+ *                    (must also be compiled and addet to train on 
+ *                    submitter machine)
+ * @param addLibs     Extra libraries to add 
+ * @param anaName     Analysis name (i.e., script created)
+ * @param aliceTag    Tag on AliROOT
+ * @param rootTag     Tag on ROOT
+ * @param apiTag      AliEN tag
+ * 
+ * @return Valid object or null
+ */
+AliAnalysisAlien*
+CreateAlienHandler(const TString& runMode,
+                  const TString& dataDir,
+                  const TString& anaSource,
+                  const TString& addLibs,
+                  const TString& anaName,
+                  const TString& aliceTag, 
+                  const TString& rootTag, 
+                  const TString& apiTag) 
+{
+  AliAnalysisAlien *plugin = new AliAnalysisAlien();
+
+  // Overwrite all generated files, datasets and output 
+  // results from a previous session
+  plugin->SetOverwriteMode();
+
+  // Set the running mode 
+  plugin->SetRunMode(runMode.Data());
+
+  // Add path to our headers 
+  plugin->AddIncludePath("-I$ALICE_ROOT/PWG2/FORWARD/analysis2");
+
+  // Set versions of used packages
+  plugin->SetAPIVersion(apiTag);
+  plugin->SetROOTVersion(rootTag);
+  plugin->SetAliROOTVersion(aliceTag);
+
+  // Define production directory LFN
+  plugin->SetGridDataDir(dataDir.Data());
+
+  // Set data search pattern
+  plugin->SetDataPattern("*ESDs*.root");
+  
+  // Use ESD tags (same applies for AOD's)
+  //plugin->SetDataPattern("*tag.root");  
+
+  // File used in test mode 
+  plugin->SetFileForTestMode("testFiles");
+
+  // ...then add run numbers to be considered
+  // If not set all runs proccessed
+  //plugin->AddRunNumber(126437); 
+
+  // Set events to run over for each file !!!
+  //plugin->SetRunRange(0, 10); 
+  
+  // Define alien work directory where all files will be copied. 
+  // Relative to alien $HOME.
+  plugin->SetGridWorkingDir("work");
+  
+  // Declare alien output directory. Relative to working directory.
+  TString outputDir = anaName;
+  outputDir += "_out";
+  plugin->SetGridOutputDir(outputDir.Data());
+  
+  // Declare the analysis source files names separated by blancs. 
+  // To be compiled runtime using ACLiC on the worker nodes.
+  if (!anaSource.IsNull())
+    plugin->SetAnalysisSource(anaSource.Data());
+  
+  // Declare all libraries (other than the default ones for the framework. 
+  // These will be loaded by the generated analysis macro. 
+  // Add all extra files (task .cxx/.h) here.
+  if (!addLibs.IsNull()) 
+    plugin->SetAdditionalLibs(addLibs.Data());
+  
+  // No need for output file names. Procedure is automatic.
+  // It's works better this way
+  plugin->SetDefaultOutputs(kTRUE);
+
+  // Set a name for the generated analysis macro (default MyAnalysis.C).
+  // Make this unique !!!
+  TString macroName = anaName;
+  macroName += "Task.C";
+  plugin->SetAnalysisMacro(macroName.Data());
+  
+  // Optionally set maximum number of input files/subjob (default 100,
+  // put 0 to ignore)
+  plugin->SetSplitMaxInputFileNumber(100);
+
+  // Optionally set number of failed jobs that will trigger killing
+  // waiting sub-jobs.
+  plugin->SetMaxInitFailed(5);
+
+  // Optionally resubmit threshold.
+  plugin->SetMasterResubmitThreshold(90);
+
+  // Optionally set time to live (default 30000 sec)
+  plugin->SetTTL(20000);
+
+  // Optionally set input format (default xml-single)
+  plugin->SetInputFormat("xml-single");
+
+  // Optionally modify the name of the generated JDL (default analysis.jdl)
+  TString jdlName = anaName;
+  jdlName += ".jdl";
+  plugin->SetJDLName(jdlName.Data());
+  
+  // Optionally modify job price (default 1)
+  plugin->SetPrice(1); 
+  
+  // Optionally modify split mode (default 'se')    
+  plugin->SetSplitMode("se"); 
+  
+  // connect to manager 
+  // AliAnalysisManager* mgr = AliAnalysisManager::Instance();
+  // mgr->SetGridHandler(plugin);
+  
+  return plugin;
+}
+     
+//____________________________________________________________________
+//
+// EOF
+//