DxHFE macros updated (Matthias)
authorarossi <arossi@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 21 Jan 2013 11:29:48 +0000 (11:29 +0000)
committerarossi <arossi@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 21 Jan 2013 11:29:48 +0000 (11:29 +0000)
- fixed single file local analysis mode
- added support for single AOD files
- propagation of argument string to analysis task
- setup of event mixing analysis added
- cut for HFE selection updated

PWGHF/correlationHF/macros/AddTaskDxHFECorrelation.C
PWGHF/correlationHF/macros/run-single-task.C
PWGHF/correlationHF/macros/setupDxHFE.C

index 04e4660..7e49630 100644 (file)
 #include "TDirectory.h"
 #include "TROOT.h"
 #include "AliRDHFCutsD0toKpi.h"
+#include "AliHFAssociatedTrackCuts.h"
 using namespace std;
 #endif
 
+const char* poolInfoName="PoolInfo";
+AliAnalysisCuts* createDefaultPoolConfig();
+
 /// @file   AddTaskDxHFECorrelation.C
 /// @author Matthias.Richter@ift.uib.no
 /// @date   2012-05-09
@@ -35,6 +39,10 @@ void AddTaskDxHFECorrelation(Bool_t bUseMC=kFALSE, TString analysisName="PWGHFco
   }
 
   TString ofilename;
+  Int_t system=0;
+  Bool_t bEventMixing=kFALSE;
+  TString poolConfigFile="";
+  TString taskOptions;
 
   // look for configuration arguments
   if (gDirectory) {
@@ -55,8 +63,22 @@ void AddTaskDxHFECorrelation(Bool_t bUseMC=kFALSE, TString analysisName="PWGHFco
            argument.ReplaceAll("name=", "");
            analysisName=argument;
          }
+         if (argument.BeginsWith("cutname=")) {
+           argument.ReplaceAll("cutname=", "");
+           poolConfigFile=argument;
+         }
          if (argument.BeginsWith("mc")) {
            bUseMC=kTRUE;
+           taskOptions+=" mc";
+         }
+         if (argument.BeginsWith("event-mixing") ||
+             argument.BeginsWith("mixing")/*deprecated, to be removed later*/) {
+           bEventMixing=kTRUE;
+           taskOptions+=" event-mixing";
+         }
+         if (argument.BeginsWith("PbPb")) {
+           system=1;
+           taskOptions+=" PbPb";
          }
        }
        delete tokens;
@@ -84,40 +106,21 @@ void AddTaskDxHFECorrelation(Bool_t bUseMC=kFALSE, TString analysisName="PWGHFco
     ::Info("AddTaskDxHFECorrelation", Form("PID task '%s' already existing", pidTaskName));
   }
 
-  TString cutname="cutsD0Corr";
-
   if (ofilename.IsNull()) ofilename=AliAnalysisManager::GetCommonFileName();
   ofilename+=":"+analysisName;
 
-  ::Info("AddTaskDxHFECorrelation", Form("\ninitializing analysis '%s'%s, output file '%s'\n", analysisName.Data(), bUseMC?" (using MC)":"", ofilename.Data()));
-    
+  ///______________________________________________________________________
+  /// Cuts For D0
+
   AliRDHFCutsD0toKpi* RDHFD0toKpi=new AliRDHFCutsD0toKpi();
   RDHFD0toKpi->SetStandardCutsPP2010();
 
+  ///______________________________________________________________________
+  /// Cuts for HFE
   AliHFEcuts *hfecuts = new AliHFEcuts("hfeCutsTPCTOF","HFE Standard Cuts");
   hfecuts->CreateStandardCuts();
-  ///______________________________________________________________________
-  /// Standard Cuts defined by the HFE Group
-  /*   
-  **********STANDARD CUTS DESCRIPTION****************
-  SetRequireProdVertex();
-  fProdVtx[0] = 0;
-  fProdVtx[1] = 3;
-  fProdVtx[2] = 0;
-  fProdVtx[3] = 3;
-  fMinClustersTPC = 80;
-  fMinClustersITS = 4;
-  fMinTrackletsTRD = 0;
-  SetRequireITSPixel();
-  fCutITSPixel = AliHFEextraCuts::kFirst;
-  fMaxChi2clusterITS = -1.;
-  fMaxChi2clusterTPC = 4.;
-  fMinClusterRatioTPC = 0.6;
-  fPtRange[0] = 0.1;
-  fPtRange[1] = 20.;
-  SetRequireKineMCCuts();
-  *************************************************** */
-  hfecuts->SetTPCmodes(AliHFEextraCuts::kFound, AliHFEextraCuts::kFoundOverFindable);  
+
+  hfecuts->SetTPCmodes(AliHFEextraCuts::kFound,AliHFEextraCuts::kFoundOverFindable);
   hfecuts->SetMinNClustersTPC(120);    //Default = 80
   hfecuts->SetMinNClustersTPCPID(80);  //Default = 80
   hfecuts->SetMinRatioTPCclusters(0.6);        //Default = 0.6
@@ -129,13 +132,45 @@ void AddTaskDxHFECorrelation(Bool_t bUseMC=kFALSE, TString analysisName="PWGHFco
   hfecuts->SetMinNClustersITS(4);                                      //Default = 4
        
   ///TOF
-  //hfecuts->SetTOFPIDStep(kTRUE);
+  hfecuts->SetTOFPIDStep(kTRUE);
                
   ///Additional Cuts
   hfecuts->SetPtRange(0.30, 10.5);
   hfecuts->SetMaxImpactParam(1.,2.);
   hfecuts->SetVertexRange(10.);
 
+  ///______________________________________________________________________
+  /// Info for Pool
+  // TODO: Don't think we need the MC part of AliHFCorrelator, needs to be checked
+  AliAnalysisCuts* poolConfiguration=NULL;
+  if (poolConfigFile.IsNull()) {
+    // load the default configuration from below if no file is specified
+    poolConfiguration=createDefaultPoolConfig();
+  } else {
+    // load configuration from file, and abort if something goes wrong
+    TFile* filePoolConfiguration=TFile::Open(poolConfigFile.Data());
+    if(!filePoolInfo){
+      ::Error("AddTaskDxHFECorrelation", Form("Pool configuration object file %s not found, exiting", poolConfigFile.Data()));
+      return;
+    }
+    TObject* pObj=filePoolInfo->Get(poolInfoName);
+    if (!pObj) {
+      ::Error("AddTaskDxHFECorrelation", Form("No Pool configuration object with name '%s' found in file %s, exiting", poolInfoName, poolConfigFile.Data()));
+      return;
+    }
+    poolConfiguration = dynamic_cast<AliHFAssociatedTrackCuts*>(pObj);
+    if (!poolConfiguration) {
+      ::Error("AddTaskDxHFECorrelation", Form("Pool configuration object '%s' has inconsistent class type %s, exiting", poolInfoName, pObj->ClassName()));
+      return;
+    }
+  }
+
+  if(!poolConfiguration){
+    ::Error("AddTaskDxHFECorrelation", Form("Pool configuration not found"));
+    return;
+  } 
+  poolConfiguration->Print();
+
   const char* taskName=AliAnalysisTaskDxHFECorrelation::Class()->GetName();
   if (pManager->GetTask(taskName)) {
     ::Warning("AddTaskDxHFECorrelation", Form("task '%s' already existing, skipping ...",
@@ -151,18 +186,75 @@ void AddTaskDxHFECorrelation(Bool_t bUseMC=kFALSE, TString analysisName="PWGHFco
   pTask->SetFillOnlyD0D0bar(1); //0=both, 1=D0 only, 2=D0bar only
   pTask->SetCutsD0(RDHFD0toKpi);
   pTask->SetCutsHFE(hfecuts);
+  pTask->SetCuts(poolConfiguration);
   pTask->SetUseMC(bUseMC);
+  pTask->SetUseEventMixing(bEventMixing);
+  pTask->SetSystem(system);
+  // TODO: the switches above can be consolidated and collected in the options
+  pTask->SetOption(taskOptions);
+
   pManager->AddTask(pTask);
 
   TString listName="DxHFElist";
+  TString cutnameD0="cutsD0Corr";
+  TString cutnameEl="cutsElCorr";
+  TString cutnamePool="PoolInfo";
+
+  // The AnalysisManager handles the output file name in the following way:
+  // The output file names are set by the function SetOutputFiles
+  // If the file name given to the container begins with one of the initialized
+  // file names, the data is stored in the corresponding file in a folder with
+  // the full name specified to the container
+  // E.g. output file has been set to "myanalysis", the container is created with
+  // file name "myanalysis_A", data ends up in file "myanalysis" in folder
+  // "myanalysis_A"
+  // IMPORTANT: choosing a file name with a different stem at this point will
+  // probably lead to an empty file.
+  if(bEventMixing){ 
+    ofilename+="ME";
+    listName+="ME";
+    cutnameD0+="ME";
+    cutnameEl+="ME";
+    cutnamePool+="ME";
+  }
+
+  if(bEventMixing) ::Info("AddTaskDxHFECorrelation", Form("\ninitializing analysis '%s'%s, output file '%s', Event Mixing Analysis\n", analysisName.Data(), bUseMC?" (using MC)":"", ofilename.Data()));
+  if(!bEventMixing)  ::Info("AddTaskDxHFECorrelation", Form("\ninitializing analysis '%s'%s, output file '%s', Single Event Analysis\n", analysisName.Data(), bUseMC?" (using MC)":"", ofilename.Data()));
+
 
-  //Should also add container with HFEcuts. PID?
   AliAnalysisDataContainer *pContainer=pManager->CreateContainer(listName, TList::Class(), AliAnalysisManager::kOutputContainer, ofilename.Data());    
-  AliAnalysisDataContainer *pContainer2=pManager->CreateContainer(cutname,AliRDHFCutsD0toKpi::Class(),AliAnalysisManager::kOutputContainer, ofilename.Data()); //cuts
+  AliAnalysisDataContainer *pContainer2=pManager->CreateContainer(cutnameD0,AliRDHFCutsD0toKpi::Class(),AliAnalysisManager::kOutputContainer, ofilename.Data()); //cuts D0
+  AliAnalysisDataContainer *pContainer3=pManager->CreateContainer(cutnameEl,AliHFEcuts::Class(),AliAnalysisManager::kOutputContainer, ofilename.Data()); //cuts El
+  AliAnalysisDataContainer *pContainer4=pManager->CreateContainer(cutnamePool,AliHFAssociatedTrackCuts::Class(),AliAnalysisManager::kOutputContainer, ofilename.Data()); //cuts El
 
   pManager->ConnectInput(pTask,0,pManager->GetCommonInputContainer());
   pManager->ConnectOutput(pTask,1,pContainer);
   pManager->ConnectOutput(pTask,2,pContainer2);
+  pManager->ConnectOutput(pTask,3,pContainer3);
+  pManager->ConnectOutput(pTask,4,pContainer4);
 
   return;
 }
+
+AliAnalysisCuts* createDefaultPoolConfig()
+{
+  AliHFAssociatedTrackCuts* HFCorrelationCuts=new AliHFAssociatedTrackCuts();
+  HFCorrelationCuts->SetName("PoolInfo");
+  HFCorrelationCuts->SetTitle("Info on Pool for EventMixing");
+
+  // NEED to check this
+  HFCorrelationCuts->SetMaxNEventsInPool(200);
+  HFCorrelationCuts->SetMinNTracksInPool(100);
+  HFCorrelationCuts->SetMinEventsToMix(8);
+  HFCorrelationCuts->SetNofPoolBins(5,5);
+  Double_t MBins[]={0,20,40,60,80,500};
+  Double_t * MultiplicityBins = MBins;
+  Double_t ZBins[]={-10,-5,-2.5,2.5,5,10};
+  Double_t *ZVrtxBins = ZBins;
+  HFCorrelationCuts->SetPoolBins(ZVrtxBins,MultiplicityBins);
+
+  TString description = "Info on Pool for EventMixing";   
+  HFCorrelationCuts->AddDescription(description);
+
+  return HFCorrelationCuts;
+}
index 6a42b2d..369b77f 100644 (file)
@@ -8,15 +8,23 @@
 ///
 /// Helper macro to run a single task either locally or on Grid
 /// Usage:
-/// aliroot -b -q -l run-single-task.C'("mode", "run", "tasks", "name", useMC, events, "path", "pattern", "friendPattern", "outputDir", "user")'
+/// aliroot -b -q -l run-single-task.C'("mode", "input", "tasks", "name", "options", events, "path", "pattern", "friendPattern", "outputDir", "user")'
 ///  arguments
 ///   mode:    local, full, test
-///   run:     list of run numbers. Or if using AODs with predefined list/AODs in same folder, specifiy as "AOD"
-///   tasks:   list of class names/source or header files of task
+///   input:   In grid mode a list of run numbers. 
+///            In local mode:
+///             - ESD file AliESDs.root
+///             - a list of ESD files in a text file <choose-file-name>.txt
+///             - AOD file AliAOD.root
+///             - AODs with predefined list/AODs in same folder, specifiy as "AOD"
+///
+///   tasks:   list of class names/source or header files of task, or AddTask-Macro
 ///
 ///  optional arguments
 ///   name:    analysis name (default 'myanalysis')
-///   useMC:   MC analysis enabled if true (default false')
+///   options: optional arguments passed onto the task, e.g. 'mc', 'event-mixing'
+///            options of run-single-task:
+///              'mcData' -> the run numbers indicate MC Data, no '000' prepended
 ///   events:  number of events to be processed (default -1 -> all)
 ///   path:    data search path for grid analysis (default from configuration file)
 ///   pattern: data search pattern (default from configuration file)
@@ -45,6 +53,9 @@
 /// <pre>
 /// for f in <search path>; do ln -s $f; done
 /// </pre>
+/// If there are dependencies (include headers) which are not available in the working
+/// directory, the macro searches for the aliroot libraries implementing them, and adds
+/// the libraries if found to the setup.
 ///
 /// Local analysis:
 /// requires only the path to the input file and the task class name. If the specified file is
 /// parameter.
 ///
 /// 
+/// Suggestions:
+/// Feedback appreciated: Matthias.Richter@cern.ch
+/// If you find this macro useful but not applicable without patching it, let me know
+/// your changes and use cases.
+
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 //
@@ -96,7 +112,7 @@ void run_single_task(const char* mode,
                     const char* input,
                     const char* tasknames,
                     const char* analysisName=defaultAnalysisName,
-                    Bool_t useMC=kFALSE,
+                    const char* arguments="",
                     int nevents=-1,
                     const char* gridDataDir=NULL,
                     const char* dataPattern=NULL,
@@ -153,10 +169,11 @@ void run_single_task(const char* mode,
     if (friendDataPattern==NULL) friendDataPattern=defaultFriendDataPattern;
   } else if (bRunLocal) {
     if (dataPattern==NULL) {
+      // thats a very crude logic, I guess it can fail in some special cases
       TString strin=input;
-      if (strin.EndsWith("AOD"))
+      if (strin.Contains("AOD"))
        dataPattern="AOD";
-      else if (strin.EndsWith("ESD"))
+      else if (strin.Contains("ESD"))
        dataPattern="ESD";
     }
   }
@@ -169,6 +186,31 @@ void run_single_task(const char* mode,
   ///////////////////////////////////////////////////////////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////////////////////////////////////
   //
+  // argument settings
+  //
+  bool mcData=false;
+  TString strArguments(arguments);
+  TObjArray* tokens=strArguments.Tokenize(" ");
+  if (tokens) {
+    for (int iToken=0; iToken<tokens->GetEntriesFast(); iToken++) {
+      TObject* token=tokens->At(iToken);
+      if (!token) continue;
+      TString arg=token->GetName();
+      const char* key=NULL;
+
+      key="mcData";
+      if (arg.CompareTo(key)==0) {
+       strArguments.ReplaceAll(key, "");
+       mcData=true;
+      }
+    }
+    delete tokens;
+  }
+
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  //
   // make the analysis manager
   //
   AliAnalysisManager *pManager  = new AliAnalysisManager("AnalysisManager");
@@ -321,6 +363,10 @@ void run_single_task(const char* mode,
     //
     // local analysis
     //
+    if (strInput.BeginsWith("alien://")) {
+      // file on Grid -> connect to AliEn
+      TGrid::Connect("alien://");
+    }
     if(strInput.EndsWith("AliESDs.root")){
       // suppose it's a single ESD file
       chain = new TChain("esdTree"); 
@@ -331,7 +377,7 @@ void run_single_task(const char* mode,
       gROOT->LoadMacro("$ALICE_ROOT/PWG0/CreateESDChain.C");
       // chain can contain up to 200 files, value can be modified to 
       // include a subset of what the *txt file contains
-      chain = CreateESDChainf(strInput.Data(),200); 
+      chain = CreateESDChain(strInput.Data(),200); 
 
       // check if the files are on grid
       TIter next(chain->GetListOfFiles());
@@ -343,6 +389,23 @@ void run_single_task(const char* mode,
          break;
        }
       }
+    } else if(strInput.EndsWith("ESD")){
+      // fetch esd tree from the setup macro
+      if (gDirectory!=NULL) {
+       const char* esdTreeName="esdTree";
+       TObject* chainObject=gDirectory->FindObject(esdTreeName);
+       if (chainObject) {
+         chain=dynamic_cast<TChain*>(chainObject);
+       }
+      }
+      if (!chain) {
+       ::Error("run_single_task", Form("failed to fetch esd tree object from setup; the chain with name '%s' has to be created before calling this macro", esdTreeName));
+       return;
+      }
+    } else if(strInput.EndsWith("AliAOD.root")){
+      // single local AOD file
+      chain = new TChain("aodTree"); 
+      chain->Add(strInput);
     } else if(strInput.EndsWith("AOD")){
       // fetch aod tree from the setup macro
       if (gDirectory!=NULL) {
@@ -421,7 +484,7 @@ void run_single_task(const char* mode,
 
     if (bSetRun) {
       // only set if input is a run number
-      if (!useMC && !strInput.BeginsWith("000"))
+      if (!mcData && !strInput.BeginsWith("000"))
        alienHandler->SetRunPrefix("000");   // real data
 
       alienHandler->AddRunNumber(input);
@@ -539,7 +602,7 @@ void run_single_task(const char* mode,
     for (int iTaskMacroToken=0; iTaskMacroToken<taskMacroTokens->GetEntriesFast(); iTaskMacroToken++) {
       taskSource+="+g";
       TString configuration;
-      configuration.Form("name=%s file=%s %s", analysisName, ofile.Data(), useMC?"mc":"");
+      configuration.Form("name=%s file=%s %s", analysisName, ofile.Data(), strArguments.Data());
       if (gDirectory) gDirectory->Add(new TNamed("run_single_task_configuration", configuration.Data()));
       gROOT->Macro(taskMacroTokens->At(iTaskMacroToken)->GetName());
     }
@@ -566,6 +629,34 @@ void run_single_task(const char* mode,
   }
 }
 
+// method for backward compatibility
+void run_single_task(const char* mode,
+                    const char* input,
+                    const char* tasknames,
+                    const char* analysisName,
+                    Bool_t useMC,
+                    int nevents=-1,
+                    const char* gridDataDir=NULL,
+                    const char* dataPattern=NULL,
+                    const char* friendDataPattern=NULL,
+                    TString odir="",
+                    const char* user=NULL
+                    )
+{
+  run_single_task(mode,
+                 input,
+                 taskname,
+                 analysisName,
+                 useMC?"mc":"",
+                 nevents,
+                 gridDataDir,
+                 dataPattern,
+                 friendDataPattern,
+                 odir,
+                 user
+                 );
+}
+
 TString GetIncludeHeaders(const char* filename, TString& headers, TString& libs, bool loadClass)
 {
   // scan the file and add all include headers found by path
index 6478ae2..ca7f725 100644 (file)
@@ -44,8 +44,12 @@ const char* libraryDependencies=
   "libCORRFW.so "
   "libPWGHFvertexingHF.so "
   "libPWGHFhfe.so "
-  "libPWGHFcorrelationHF.so "
   ;
+// Note: "libPWGHFcorrelationHF.so " shouldn't be added here. If the library is
+// loaded already, compilation of source files by Cint does not have any effect.
+// The already existing class implementations are not overidden. To just load
+// all necessary libraries to make the classes available in aliroot use macro
+// LoadLibraries.C
 
 void setupDxHFE(const char* localAodDirectory, int nofDirectories, const char* lhcPeriod, const char* mcProd="")
 {