Some more mods for SAF filtering
[u/mrichter/AliRoot.git] / PWG / muon / CpMacroWithFilter.C
index 2728af1..b1eb3f0 100644 (file)
 //
 //  CpMacroWithFilter.C
 //
-//  Created by Laurent Aphecetche on 30-sep-2013.
+//  Created by Laurent Aphecetche
 //
 
+#if !defined(__CINT__) || defined(__MAKECINT__)
+
+#include "Riostream.h"
+#include "TString.h"
+#include "TSystem.h"
+#include "TROOT.h"
+#include "TGrid.h"
+#include "TFile.h"
+#include "TObjString.h"
+
+#endif
+
 Int_t CpMacroWithFilter(TString from, TString to)
 {
   /// Copy one file from url "from" into url "to".
   ///
   /// If from contains one of the filter keywords
-  /// (in the form of e.g. AliAOD.FILTER_ZZZZ.root)
+  /// (in the form of e.g. AliAOD.FILTER_ZZZZ_WITH_ALIROOT_YYYY.root)
   /// then we call the external filter macro
   ///
   /// otherwise we do a simple TFile::Cp(from,to)
   ///
+
+  const char* swBaseDir = "/cvmfs/alice.cern.ch/x86_64-2.6-gnu-4.1.2/Packages/AliRoot";
   
-  if (from.IsNull() || to.IsNull()) return 1;
+  if (from.IsNull() || to.IsNull()) return -1;
   
   std::cout << Form("Entering CpMacroWithFilter(\"%s\",\"%s\")",from.Data(),to.Data()) << std::endl;
   
-  TObjArray filters;
-  filters.SetOwner(kTRUE);
-  
-  filters.Add(new TObjString("FILTER_AODMUONWITHTRACKLETS"));
-  filters.Add(new TObjString("FILTER_RAWMUON"));
-  
-  TIter next(&filters);
-  TObjString* s;
-  TString filter;
+  TString filterName;
+  TString alirootVersion;
+  TString alirootPath(swBaseDir);
+  TString filterMacroFullPath;
+  TString filterRootLogonFullPath;
+
+  Int_t ix = from.Index("FILTER_");
   
-  while ( ( s = static_cast<TObjString*>(next())) )
+  if ( ix > 0)
   {
-      if ( from.Contains(s->String()) )
-      {
-        filter = s->String();
-        break;
-      }
-  }
-  
-  if (from.Contains("alien:\/\/")) TGrid::Connect("alien:\/\/");
+    TString part = from(ix,from.Length()-ix+1);
+    TObjArray* tmp = part.Tokenize(".");
+    TObjString* ostr = static_cast<TObjString*>(tmp->First());
+    if (!ostr)
+    {
+      std::cerr << "Could not get filter ??? Filename does not look right !!!" << std::endl;
+      return -2;
+    }
+    filterName = ostr->String();
+    delete tmp;
+    ix = filterName.Index("_WITH_");
+    if ( ix > 0 )
+    {
+      alirootVersion = filterName(ix+strlen("_WITH_ALIROOT_"),part.Length()-ix-strlen("_WITH_ALIROOT_"));
+      filterName = filterName(0,ix);
+    }
 
-  if ( filter.Length() > 0 )
-  {
-    // check the required filter is actually available
-    
-    from.ReplaceAll(filter.Data(),"");
-    from.ReplaceAll("..",".");
-    
-    if ( gSystem->AccessPathName(Form("%s/etc/%s.C",gSystem->Getenv("XRDDMSYS"),filter.Data()) ) )
+    alirootPath += "/";
+    alirootPath += alirootVersion;
+
+    // check the aliroot version required actually exists on cvmfs...
+    if ( gSystem->AccessPathName(alirootPath.Data()) ) 
     {
-      std::cout << Form("ERROR: could not find a filter named %s.C",filter.Data()) << std::endl;
-      return 2;
+       std::cerr << "Requested AliRoot version not found (looking into " << alirootPath.Data() << ")" << std::endl;
+       return -2;
     }
-    else
+
+    // check the filter required actually exists
+    filterMacroFullPath.Form("%s/PWG/muon/%s.C",alirootPath.Data(),filterName.Data());
+   
+    if ( gSystem->AccessPathName(filterMacroFullPath.Data()) )
     {
-      // check also we have a companion macro (to load the relevant libraries and
-      // set the additional include paths, if needed)
-      
-      if ( gSystem->AccessPathName(Form("%s/etc/%s_rootlogon.C",gSystem->Getenv("XRDDMSYS"),filter.Data()) ) )
-      {
-        std::cout << Form("ERROR: could not find the companion macro %s_rootlogon.C for the filter named %s.C",filter.Data(),filter.Data()) << std::endl;
-        return 3;
-      }
-
-      else
-      {
-        // most probably the filter will require AliRoot libs, so add the dynamic path here
-        // as well as the include path and the macro path.
-        //
-        gSystem->AddDynamicPath(Form("%s/aliroot/lib/tgt_%s",gSystem->Getenv("ALICE_PROOF_AAF_DIR"),gSystem->GetBuildArch()));
-        gSystem->SetIncludePath(Form("-I%s/etc -I%s/aliroot/include",gSystem->Getenv("XRDDMSYS"),gSystem->Getenv("ALICE_PROOF_AAF_DIR")));
-        gROOT->SetMacroPath(Form("%s:%s/etc",gROOT->GetMacroPath(),gSystem->Getenv("XRDDMSYS")));
-        
-//        gSystem->AddDynamicPath(Form("/pool/PROOF-AAF/aliroot/lib/tgt_%s",gSystem->GetBuildArch()));
-//        gSystem->SetIncludePath("-I/pool/PROOF-AAF/xrootd_1.0.50/etc -I/pool/PROOF-AAF/aliroot/include");
-//        gROOT->SetMacroPath(Form("%s:%s/etc",gROOT->GetMacroPath(),gSystem->Getenv("XRDDMSYS")));
+      std::cerr << "Could not find requested filter macro (looking into " << filterMacroFullPath.Data() << ")" << std::endl;
+      return -3;
+    }
+
+    // check that the companion macro (to load the relevant libraries 
+    // and set the additional include paths, if needed) exists
+
+    filterRootLogonFullPath.Form("%s/PWG/muon/%s_rootlogon.C",alirootPath.Data(),filterName.Data());
+
+    if ( gSystem->AccessPathName(filterRootLogonFullPath.Data()) )
+    {
+      std::cerr << "Could not find requested filter companion macro (looking into " << filterRootLogonFullPath.Data() << ")" << std::endl;
+      return -4;
+    }
 
-        // execute the companion macro
+    from.ReplaceAll(filterName.Data(),"");
+    from.ReplaceAll("_WITH_ALIROOT_","");
+    from.ReplaceAll(alirootVersion,"");
+    from.ReplaceAll("..",".");
 
-        std::cout << Form("Will load companion macro %s_rootlogon.C(\"%s\",\"%s\")",filter.Data(),from.Data(),to.Data()) << std::endl;
+    std::cout << "Will filter file=" << from.Data() << std::endl;
+  }
+  
+  if (from.Contains("alien://")) TGrid::Connect("alien://");
 
-        gROOT->Macro(Form("%s_rootlogon.C",filter.Data()));
+  if (!gGrid)
+    {
+      std::cerr << "Cannot get gGrid !" << std::endl;
+      return -5;
+    }
+
+  if ( !filterName.IsNull() ) 
+  {
+    // most probably the filter will require AliRoot libs, so add the dynamic path here
+    // as well as the include path and the macro path.
+    //
+    gSystem->AddDynamicPath(Form("%s/lib/tgt_%s",alirootPath.Data(),gSystem->GetBuildArch()));
+    gSystem->SetIncludePath(Form("-I%s/include -I%s/PWG/muon",alirootPath.Data(),alirootPath.Data()));
+    gROOT->SetMacroPath(Form("%s:%s/PWG/muon",gROOT->GetMacroPath(),alirootPath.Data()));
         
-        std::cout << gSystem->GetIncludePath() << std::endl;
+    // execute the companion macro
+    std::cout << Form("Will load companion macro %s(\"%s\",\"%s\")",filterRootLogonFullPath.Data(),from.Data(),to.Data()) << std::endl;
+
+    gROOT->Macro(filterRootLogonFullPath.Data());
         
-        // finally delegate the work to the required filter
+    std::cout << gSystem->GetIncludePath() << std::endl;
+        
+    // finally delegate the work to the required filter
       
-        std::cout << Form("Will compile filter %s.C+(\"%s\",\"%s\")",filter.Data(),from.Data(),to.Data()) << std::endl;
+    std::cout << Form("Will compile filter %s+(\"%s\",\"%s\")",filterMacroFullPath.Data(),from.Data(),to.Data()) << std::endl;
 
-        Int_t fail = gROOT->LoadMacro(Form("%s.C+",filter.Data()));
+    Int_t fail = gROOT->LoadMacro(Form("%s.C+",filterName.Data()));
       
-        if ( fail )
-        {
-          std::cout << Form("Failed to load/compile macro %s.C+",filter.Data()) << std::endl;
-          return 4;
-        }
+    if ( fail )
+    {
+      std::cout << Form("Failed to load/compile macro %s+",filterMacroFullPath.Data()) << std::endl;
+      return -6;
+    }
         
-        std::cout << Form("Will execute filter %s(\"%s\",\"%s\")",filter.Data(),from.Data(),to.Data()) << std::endl;
+    std::cout << Form("Will execute filter %s(\"%s\",\"%s\")",filterName.Data(),from.Data(),to.Data()) << std::endl;
 
-        return (Int_t)gROOT->ProcessLine(Form("%s(\"%s\",\"%s\")",filter.Data(),from.Data(),to.Data()));
-      }
-    }
+    return (Int_t)gROOT->ProcessLine(Form("%s(\"%s\",\"%s\")",filterName.Data(),from.Data(),to.Data()));
   }
   else
   {