]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG4/macros/AddTaskJets.C
extra cut for clusters
[u/mrichter/AliRoot.git] / PWG4 / macros / AddTaskJets.C
index 62f2e91c3be58bf3f5309c5bcef19c3232a6dc1b..a4f909a33c0f2b0af93c8ec9fd695765a1922d5c 100644 (file)
-AliJetReader *CreateJetReader(Char_t *jr,UInt_t filterMask); // Common config\r
-AliJetFinder *CreateJetFinder(Char_t *jf,Float_t radius = -1);\r
-\r
-AliAnalysisTaskJets *AddTaskJets(Char_t *jr, Char_t *jf,Float_t radius = -1,UInt_t filterMask = 0); // for the new AF\r
-Int_t AddTaskJetsDelta(char *nonStdFile = "",UInt_t filterMask = 0,Bool_t kUseAODMC = kTRUE,UInt_t runFlag = 1|4|32|128|256);     \r
-AliAnalysisTaskJets *AddTaskJets(UInt_t filterMask = 0);\r
-\r
-AliAnalysisTaskJets *AddTaskJets(UInt_t filterMask ){\r
-  // fills the standard "jets" branch in the AOD\r
-  // need the ESDFilter to run before, to access the AODtracks\r
-  // Tracks selected by the first Filter (1<<0)\r
-  // needs to be adapted for different cuts\r
-  \r
-  // UA1 as standard chosen, since it is the most robust and simple JF\r
-  // R = 0.4 suffficient to provide accurate jet axis for correlation studies\r
-  // energy resolution suffers a little\r
-  // Acceptance of jets not limited by the Jet Finder but should be done\r
-  // by user to abs(eta) < 0.5 \r
-\r
-  return AddTaskJets("AOD","UA1",0.4,filterMask);\r
-\r
-}\r
-\r
-\r
-\r
-Int_t AddTaskJetsDelta(char *nonStdFile,UInt_t filterMask,Bool_t kUseAODMC,UInt_t runFlag){\r
-\r
-  // Adds a whole set of jet finders  all to be written\r
-  // to a delta AOD\r
-  \r
-  // this can in principle be done also with on the fly \r
-  // if we have an ESD input jet fidner task does automatically fetch the ouput aod\r
-\r
-   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();\r
-   if (!mgr) {\r
-      ::Error("AddTaskJetsDelta", "No analysis manager to connect to.");\r
-      return 0;\r
-   }  \r
-   \r
-   // Check the analysis type using the event handlers connected to the analysis manager.\r
-   //==============================================================================\r
-   if (!mgr->GetInputEventHandler()) {\r
-      ::Error("AddTaskJetsDelta", "This task requires an input event handler");\r
-      return 0;\r
-   }\r
-\r
-  AliAODHandler *aodh = (AliAODHandler*)mgr->GetOutputEventHandler();\r
-  if (!aodh) {\r
-    ::Error("AddTaskJetsDelta", "This task needs an output event handler");\r
-    return 0;\r
-  }   \r
-\r
-  TString outFile(nonStdFile);\r
-\r
-  AliAnalysisTaskJets *jetana = 0;\r
-  Int_t iCount = 0;\r
-\r
-  // Jet Fidners Selected by run flag first bit 2^0 second by 2^1 etc\r
-  const char *cJF[14]        = {"UA1","UA1","UA1", "CDF", "CDF","DA","DA","SISCONE","SISCONE","FASTJET","FASTJET","FASTKT","FASTKT","UA1LO"};\r
-  const Float_t radius[14]   = {  0.4,  0.7,  1.0,  0.4,    0.7, 0.4, 0.7,      0.4,     0.7,      0.4,       0.7,     0.4,     0.7,    0.4};\r
-  UInt_t  flag[14]           = {    6,    7,    7,    7,      7,   7,   7,        7,       7,        7,         7,       7,       7,      7};\r
-  // flag[5] = 0; // set siscone to 0 for proof mode...\r
-  // flag first bit AOD, second bit AODMC2 third bit AODMC2 third (8) bit AOODMC2b (limited acceptance)\r
-  // i.e. 7 all, 6 only MC2 and MC\r
-  // this stay at three\r
-  const char *cReader[4] = {"AOD","AODMC","AODMC2","AODMC2b"};  \r
-\r
-  \r
-\r
-  for(int i = 0; i< 14;i++){\r
-    if(!(runFlag&(1<<i)))continue;\r
-    if(!kUseAODMC)flag[i]&=1; // switch OFF MC if we do not have it\r
-    for(int ib = 0;ib<4;ib++){      \r
-      if(flag[i]&(1<<ib)){\r
-       jetana = AddTaskJets(cReader[ib],cJF[i],radius[i],filterMask);\r
-       if(jetana){\r
-         char *cRadius = "";\r
-         if(radius[i]>0)cRadius = Form("%02d",(int)((radius[i]+0.01)*10.)); // add an offset beacuse of precision\r
-         //      jetana->SetNonStdBranch(Form("jets%s_%s%s",cReader[ib],cJF[i],cRadius)); // done in addtask jets\r
-         if(outFile.Length()>0)jetana->SetNonStdOutputFile(outFile.Data());\r
-         iCount++;\r
-       }\r
-      }\r
-    }\r
-  }\r
-    \r
-  Printf("Added %d JetFinders",iCount);\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-AliAnalysisTaskJets *AddTaskJets(Char_t *jr, Char_t *jf, Float_t radius,UInt_t filterMask)\r
-{\r
-  // Creates a jet finder task, configures it and adds it to the analysis manager.\r
-\r
-   // Get the pointer to the existing analysis manager via the static access method.\r
-   //==============================================================================\r
-   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();\r
-   if (!mgr) {\r
-      ::Error("AddTaskJets", "No analysis manager to connect to.");\r
-      return NULL;\r
-   }  \r
-   \r
-   // Check the analysis type using the event handlers connected to the analysis manager.\r
-   //==============================================================================\r
-   if (!mgr->GetInputEventHandler()) {\r
-      ::Error("AddTaskJets", "This task requires an input event handler");\r
-      return NULL;\r
-   }\r
-\r
-  AliAODHandler *aodh = (AliAODHandler*)mgr->GetOutputEventHandler();\r
-  if (!aodh) {\r
-    ::Error("AddTaskJets", "This task needs an output event handler");\r
-    return NULL;\r
-  }   \r
-\r
-\r
-   // Create the task and configure it.\r
-   //===========================================================================\r
-   AliAnalysisTaskJets *jetana;\r
-   AliJetReader *er = CreateJetReader(jr,filterMask);\r
-    // Define jet header and jet finder\r
-   AliJetFinder *jetFinder = CreateJetFinder(jf,radius);\r
-\r
-   if (jetFinder){\r
-       if (er) jetFinder->SetJetReader(er);\r
-   }\r
-\r
-   char *cRadius = "";\r
-   if(radius>0)cRadius = Form("%02d",(int)((radius+0.01)*10.));\r
-\r
-   jetana = new AliAnalysisTaskJets(Form("JetAnalysis%s_%s%s",jr,jf,cRadius));\r
-\r
-   TString cAdd = "";\r
-   if(filterMask==16){\r
-     // this is the standard mask do not add anything\r
-     // should be changed after current train over all data is finished \r
-     // now needed for merging\r
-   }\r
-   else{\r
-     cAdd += Form("_Filter%05d",filterMask);\r
-   }\r
-\r
-   TString c_jr(jr);\r
-   c_jr.ToLower();\r
-   TString c_jf(jf);\r
-   c_jf.ToLower();\r
-\r
-   if(c_jf.CompareTo("ua1")==0 && TMath::Abs(radius-0.4) < 0.01 && c_jr.CompareTo("aod") == 0){\r
-     // do nothing, this is the standard jet finder R = 0.4, UA1 on AOD\r
-   }\r
-   else{\r
-     TString bName =  Form("jets%s_%s%s%s",jr,jf,cRadius,cAdd.Data());\r
-     jetana->SetNonStdBranch(bName.Data());\r
-     Printf("Set jet branchname \"%s\"",bName.Data());\r
-     \r
- }\r
-\r
-\r
-   AliAnalysisDataContainer *cout_jet = mgr->CreateContainer(\r
-                                                            Form("jethist_%s_%s%s%s",\r
-                                                                 c_jr.Data(),\r
-                                                                 c_jf.Data(),\r
-                                                                 cRadius,\r
-                                                                 cAdd.Data()), \r
-                                                            TList::Class(),\r
-                                                            AliAnalysisManager::kOutputContainer, \r
-                                                            Form("%s:PWG4_jethist_%s_%s%s",AliAnalysisManager::GetCommonFileName(),\r
-                                                                 c_jr.Data(),\r
-                                                                 c_jf.Data(),\r
-                                                                 cRadius,\r
-                                                                 cAdd.Data()));\r
-\r
-   // Connect jet finder to task.\r
-   jetana->SetJetFinder(jetFinder);\r
-   jetana->SetConfigFile("");\r
-   jetana->SetDebugLevel(2);\r
-   if(TMath::Abs((radius-0.4))< 0.02&&c_jf.Contains("fastjet")){\r
-     jetana->SetFilterPt(10.);\r
-   }\r
-\r
-\r
-   mgr->AddTask(jetana);\r
-\r
-\r
-   // Create ONLY the output containers for the data produced by the task.\r
-   // Get and connect other common input/output containers via the manager as below\r
-   //==============================================================================\r
-   mgr->ConnectInput  (jetana, 0, mgr->GetCommonInputContainer());\r
-// AOD output slot will be used in a different way in future\r
-   mgr->ConnectOutput (jetana, 0, mgr->GetCommonOutputContainer());\r
-   mgr->ConnectOutput (jetana, 1, cout_jet);\r
-   \r
-   return jetana;\r
-}\r
-\r
-AliJetFinder *CreateJetFinder(Char_t *jf,Float_t radius){\r
-  AliJetFinder *jetFinder = 0;\r
-\r
-  switch (jf) {\r
-  case "CDF":\r
-    AliCdfJetHeader *jh = new AliCdfJetHeader();\r
-    jh->SetRadius(0.7);\r
-    if(radius>0)jh->SetRadius(radius);    \r
-    jh->SetAODwrite(kTRUE);\r
-    jh->SetAODtracksWrite(kTRUE);\r
-    //    jh->SetDebugCDF(1);\r
-    jetFinder = new AliCdfJetFinder();\r
-    if (jh) jetFinder->SetJetHeader(jh);\r
-    break;\r
-\r
-  case "DA":\r
-    AliDAJetHeader *jh=new AliDAJetHeader();\r
-    jh->SetComment("DA jet code with default parameters");\r
-    jh->SelectJets(kTRUE);\r
-//    jh->SetNeff(200);\r
-//    jh->SetEtaEff(2.2);\r
-    if(radius>0)jh->SetRadius(radius);\r
-    jh->SetEtMin(5.);\r
-    jetFinder = new AliDAJetFinder();\r
-    if (jh) jetFinder->SetJetHeader(jh);\r
-    break;\r
-\r
-  case "FASTJET":\r
-    // DEFAULT is ANTI KT\r
-    AliFastJetHeaderV1 *jh = new AliFastJetHeaderV1();\r
-    jh->SetRparam(0.4); // setup parameters                                  \r
-    Double_t rBkg = 0.6;\r
-    if(radius>0)jh->SetRparam(radius);\r
-    jh->SetAlgorithm(2); // antikt from fastjet/JetDefinition.hh\r
-    jetFinder = new AliFastJetFinder();\r
-    jh->SetPtMin(1);\r
-    jh->SetRparamBkg(rBkg);\r
-    jh->SetGhostEtaMax(0.9+rBkg);\r
-    if (jh) jetFinder->SetJetHeader(jh);\r
-    break;\r
-\r
-  case "FASTKT":\r
-    AliFastJetHeaderV1 *jh = new AliFastJetHeaderV1();\r
-    jh->SetRparam(0.4); // setup parameters                                  \r
-    Double_t rBkg = 0.6;\r
-    if(radius>0)jh->SetRparam(radius);\r
-    jh->SetAlgorithm(0); // kt from fastjet/JetDefinition.hh\r
-    jh->SetPtMin(1);\r
-    jh->SetRparamBkg(rBkg);\r
-    jh->SetGhostEtaMax(0.9+rBkg);\r
-    jetFinder = new AliFastJetFinder();\r
-    if (jh) jetFinder->SetJetHeader(jh);\r
-    break;\r
-\r
-  case "SISCONE":\r
-    AliSISConeJetHeader * jh = new AliSISConeJetHeader();\r
-\r
-    jh->SetJetEtaMax(1.5);\r
-    jh->SetJetEtaMin(-1.5);\r
-\r
-    //siscone parameters\r
-    jh->SetConeRadius(0.4);                   // default cone radius\r
-    if(radius>0)jh->SetConeRadius(radius);   // cone radius\r
-\r
-    jh->SetOverlapThreshold(0.75);            // overlap parameter, between 0 and 1 excluded!! 0.75 value is advised\r
-    jh->SetPtProtojetMin(0);                  // pt min of protojets\r
-    jh->SetMinJetPt(5);                      // Ptmin of jets (GeV)\r
-\r
-    //do you want to subtract BG (0 = no, 1 = yes)\r
-    jh->SetBGMode(0);\r
-\r
-    //for background\r
-    jh->SetRapRange( -0.9, 0.9);              // rapidity range for subtracting background must be < ghostmaxrap-0.95*R\r
-    jh->SetPhiRange(0 , 2*TMath::Pi());       // phi range for subtracting background\r
-    \r
-    //to determine jets area\r
-    jh->SetBGAlgorithm(1);                    // algorithm for rho calculation : 0 = kT, 1 = Cambridge\r
-    jh->SetGhostEtaMax(4);                    // eta max where ghosts are generated \r
-    jh->SetGhostArea(0.05);                   // area of a ghost \r
-    jh->SetMeanGhostKt(1e-100);               // average transverse momentum of the ghosts.\r
-    jh->SetAreaTypeNumber(4);                 // from 1 to 5 : 1 = active_area, 2 = active_area_explicit_ghosts, 3 = one_ghost_passive_area, 4 = passive_area, 5 = voronoi_area\r
-    jetFinder = new AliSISConeJetFinder();\r
-    if (jh) jetFinder->SetJetHeader(jh);\r
-    break;\r
-\r
-  case "UA1":\r
-    AliUA1JetHeaderV1 *jh=new AliUA1JetHeaderV1();\r
-    jh->SetComment("UA1 jet code with default parameters");\r
-    jh->BackgMode(0);\r
-    jh->SetRadius(0.4);\r
-    if(radius>0)jh->SetRadius(radius);\r
-    jh->SetEtSeed(2.);\r
-    jh->SetNAcceptJets(6);\r
-    jh->SetLegoNbinPhi(432);\r
-    jh->SetLegoNbinEta(274);\r
-    jh->SetLegoEtaMin(-2);\r
-    jh->SetLegoEtaMax(+2);\r
-    jh->SetMinJetEt(5.);\r
-    jh->SetJetEtaMax(1.5);\r
-    jh->SetJetEtaMin(-1.5);\r
-\r
-    jetFinder = new AliUA1JetFinderV1();\r
-    if (jh) jetFinder->SetJetHeader(jh);\r
-    break;\r
-  case "UA1LO":\r
-    AliUA1JetHeaderV1 *jh=new AliUA1JetHeaderV1();\r
-    jh->SetComment("UA1 jet code with Lo Pt settings parameters");\r
-    jh->BackgMode(0);\r
-    jh->SetRadius(0.4);\r
-    if(radius>0)jh->SetRadius(radius);\r
-    jh->SetEtSeed(1.);\r
-    jh->SetNAcceptJets(6);\r
-    jh->SetLegoNbinPhi(432);\r
-    jh->SetLegoNbinEta(274);\r
-    jh->SetLegoEtaMin(-2);\r
-    jh->SetLegoEtaMax(+2);\r
-    jh->SetMinJetEt(1.);\r
-    jh->SetJetEtaMax(1.5);\r
-    jh->SetJetEtaMin(-1.5);\r
-\r
-    jetFinder = new AliUA1JetFinderV1();\r
-    if (jh) jetFinder->SetJetHeader(jh);\r
-    break;\r
-\r
-\r
-\r
-  case "UA1MC":\r
-    AliUA1JetHeaderV1 *jh=new AliUA1JetHeaderV1();\r
-    jh->SetComment("UA1 jet code with default MC parameters");\r
-    jh->BackgMode(0);\r
-    jh->SetRadius(1.0);\r
-    if(radius>0)jh->SetRadius(radius);\r
-    jh->SetEtSeed(4.);\r
-    jh->SetNAcceptJets(6);\r
-    jh->SetLegoNbinPhi(432);\r
-    jh->SetLegoNbinEta(274);\r
-    jh->SetLegoEtaMin(-2);\r
-    jh->SetLegoEtaMax(+2);\r
-    jh->SetMinJetEt(5.);\r
-    jh->SetJetEtaMax(1.5);\r
-    jh->SetJetEtaMin(-1.5);\r
-    jetFinder = new AliUA1JetFinderV1();\r
-    if (jh) jetFinder->SetJetHeader(jh);\r
-    break;\r
-  default:\r
-    Printf("\n >>>>>>> AddTaskJets Error Wrong jet finder selected\n");\r
-    break;\r
-  }\r
-\r
-  return jetFinder;\r
-\r
-}\r
-\r
-AliJetReader *CreateJetReader(Char_t *jr,UInt_t filterMask){\r
-  AliJetReader *er = 0;\r
-  const Float_t ptCut  = 0.15 ; // cut on track p_T\r
-  switch (jr) {\r
-  case "MC":\r
-    AliJetKineReaderHeader *jrh = new AliJetKineReaderHeader();\r
-    jrh->SetComment("MC full Kinematics");\r
-    jrh->SetFastSimTPC(kFALSE);\r
-    jrh->SetFastSimEMCAL(kFALSE);\r
-    jrh->SetPtCut(ptCut);\r
-    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0 .9                                                                             \r
-    // Define reader and set its header                                     \r
-    er = new AliJetKineReader();\r
-    er->SetReaderHeader(jrh);\r
-    break;\r
-  case "MC2":\r
-    AliJetKineReaderHeader *jrh = new AliJetKineReaderHeader();\r
-    jrh->SetComment("MC full Kinematics spearate config charged only");\r
-    jrh->SetFastSimTPC(kFALSE);\r
-    jrh->SetFastSimEMCAL(kFALSE);\r
-    jrh->SetChargedOnly(kTRUE);\r
-    jrh->SetPtCut(ptCut);\r
-    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0 .9                                                                             \r
-    // Define reader and set its header                                     \r
-    er = new AliJetKineReader();\r
-    er->SetReaderHeader(jrh);\r
-    break;\r
-  case "ESD":\r
-    AliJetESDReaderHeader *jrh = new AliJetESDReaderHeader();\r
-    jrh->SetComment("Testing");\r
-    jrh->SetFirstEvent(0.);\r
-    jrh->SetLastEvent(1000);\r
-    jrh->SetPtCut(ptCut);\r
-    jrh->SetReadSignalOnly(kFALSE);\r
-    // Define reader and set its header                                     \r
-    er = new AliJetESDReader();\r
-    er->SetReaderHeader(jrh);\r
-    break;\r
-\r
-  case "AOD":\r
-    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();\r
-    jrh->SetComment("AOD Reader");\r
-    jrh->SetPtCut(0.15); // set low p_T cut of to 150 MeV\r
-    jrh->SetTestFilterMask(16); // Change this one for a different set of cuts\r
-    if(filterMask>0)jrh->SetTestFilterMask(filterMask); \r
-    // Define reader and set its header\r
-    er = new AliJetAODReader();\r
-    er->SetReaderHeader(jrh);\r
-    break;\r
-  case "AODMC":\r
-    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();\r
-    jrh->SetComment("AOD MC Reader");\r
-    jrh->SetPtCut(ptCut);\r
-    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0.9\r
-    jrh->SetReadAODMC(1);// 1 all primary MC , 2 all primary charged\r
-    // Define reader and set its header\r
-    er = new AliJetAODReader();\r
-    er->SetReaderHeader(jrh);\r
-    break;\r
-  case "AODMC2":\r
-    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();\r
-    jrh->SetComment("AOD MC Reader");\r
-    jrh->SetPtCut(ptCut);\r
-    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0.9\r
-    jrh->SetReadAODMC(2);// 1 all primary MC , 2 all primary charged\r
-    // Define reader and set its header\r
-    er = new AliJetAODReader();\r
-    er->SetReaderHeader(jrh);\r
-    break;\r
-  case "AODMC2b":\r
-    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();\r
-    jrh->SetComment("AOD MC Reader");\r
-    jrh->SetPtCut(ptCut);\r
-    jrh->SetFiducialEta(-0.9,0.9); // to take all MC particles default is 0.9\r
-    jrh->SetReadAODMC(2);// 1 all primary MC , 2 all primary charged\r
-    // Define reader and set its header\r
-    er = new AliJetAODReader();\r
-    er->SetReaderHeader(jrh);\r
-    break;\r
-\r
-  default:\r
-    ::Error("AddTaskJets", "Wrong jet reader selected\n");\r
-    return 0;\r
-  }\r
-\r
-  return er;\r
-\r
-}\r
+AliJetReader *CreateJetReader(Char_t *jr,UInt_t filterMask); // Common config
+AliJetFinder *CreateJetFinder(Char_t *jf,Float_t radius = -1);
+
+AliAnalysisTaskJets *AddTaskJets(Char_t *jr, Char_t *jf,Float_t radius = -1,UInt_t filterMask = 0,Float_t ptTrackMin = 0.15,Int_t iBack = 0); // for the new AF
+Int_t AddTaskJetsDelta(char *nonStdFile = "",UInt_t filterMask = 0,Bool_t kUseAODMC = kTRUE,UInt_t runFlag = 1|4|32|128|256);     
+AliAnalysisTaskJets *AddTaskJets(UInt_t filterMask = 0);
+
+Float_t kPtTrackMin = 0.15;
+Int_t kBackgroundMode = 0;
+
+
+AliAnalysisTaskJets *AddTaskJets(UInt_t filterMask ){
+  // fills the standard "jets" branch in the AOD
+  // need the ESDFilter to run before, to access the AODtracks
+  // Tracks selected by the first Filter (1<<0)
+  // needs to be adapted for different cuts
+  
+  // UA1 as standard chosen, since it is the most robust and simple JF
+  // R = 0.4 suffficient to provide accurate jet axis for correlation studies
+  // energy resolution suffers a little
+  // Acceptance of jets not limited by the Jet Finder but should be done
+  // by user to abs(eta) < 0.5 
+
+  return AddTaskJets("AOD","UA1",0.4,filterMask);
+
+}
+
+
+
+Int_t AddTaskJetsDelta(char *nonStdFile,UInt_t filterMask,Bool_t kUseAODMC,UInt_t runFlag){
+
+  // Adds a whole set of jet finders  all to be written
+  // to a delta AOD
+  
+  // this can in principle be done also with on the fly 
+  // if we have an ESD input jet fidner task does automatically fetch the ouput aod
+
+   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+   if (!mgr) {
+      ::Error("AddTaskJetsDelta", "No analysis manager to connect to.");
+      return 0;
+   }  
+   
+   // Check the analysis type using the event handlers connected to the analysis manager.
+   //==============================================================================
+   if (!mgr->GetInputEventHandler()) {
+      ::Error("AddTaskJetsDelta", "This task requires an input event handler");
+      return 0;
+   }
+
+  AliAODHandler *aodh = (AliAODHandler*)mgr->GetOutputEventHandler();
+  if (!aodh) {
+    ::Error("AddTaskJetsDelta", "This task needs an output event handler");
+    return 0;
+  }   
+
+  TString outFile(nonStdFile);
+
+  AliAnalysisTaskJets *jetana = 0;
+  Int_t iCount = 0;
+
+  // Jet Fidners Selected by run flag first bit 2^0 second by 2^1 etc
+  const char *cJF[14]        = {"UA1","UA1","UA1", "CDF", "CDF","DA","DA","SISCONE","SISCONE","FASTJET","FASTJET","FASTKT","FASTKT","UA1LO"};
+  const Float_t radius[14]   = {  0.4,  0.7,  1.0,  0.4,    0.7, 0.4, 0.7,      0.4,     0.7,      0.4,       0.7,     0.4,     0.7,    0.4};
+  UInt_t  flag[14]           = {    6,    7,    7,    7,      7,   7,   7,        7,       7,        7,         7,       7,       7,      7};
+  // flag[5] = 0; // set siscone to 0 for proof mode...
+  // flag first bit AOD, second bit AODMC2 third bit AODMC2 third (8) bit AOODMC2b (limited acceptance)
+  // i.e. 7 all, 6 only MC2 and MC
+  // this stay at three
+  const char *cReader[4] = {"AOD","AODMC","AODMC2","AODMC2b"};  
+
+  
+
+  for(int i = 0; i< 14;i++){
+    if(!(runFlag&(1<<i)))continue;
+    if(!kUseAODMC)flag[i]&=1; // switch OFF MC if we do not have it
+    for(int ib = 0;ib<4;ib++){      
+      if(flag[i]&(1<<ib)){
+       jetana = AddTaskJets(cReader[ib],cJF[i],radius[i],filterMask);
+       if(jetana){
+         char *cRadius = "";
+         if(radius[i]>0)cRadius = Form("%02d",(int)((radius[i]+0.01)*10.)); // add an offset beacuse of precision
+         //      jetana->SetNonStdBranch(Form("jets%s_%s%s",cReader[ib],cJF[i],cRadius)); // done in addtask jets
+         if(outFile.Length()>0)jetana->SetNonStdOutputFile(outFile.Data());
+         iCount++;
+       }
+      }
+    }
+  }
+    
+  Printf("Added %d JetFinders",iCount);
+}
+
+
+
+
+
+AliAnalysisTaskJets *AddTaskJets(Char_t *jr, Char_t *jf, Float_t radius,UInt_t filterMask,float ptTrackMin,int iBack)
+{
+  // Creates a jet finder task, configures it and adds it to the analysis manager.
+
+  kPtTrackMin = ptTrackMin;
+  kBackgroundMode = iBack;
+  // Get the pointer to the existing analysis manager via the static access method.
+  //==============================================================================
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+  if (!mgr) {
+    ::Error("AddTaskJets", "No analysis manager to connect to.");
+    return NULL;
+  }  
+  
+  // Check the analysis type using the event handlers connected to the analysis manager.
+  //==============================================================================
+  if (!mgr->GetInputEventHandler()) {
+    ::Error("AddTaskJets", "This task requires an input event handler");
+    return NULL;
+   }
+  
+  AliAODHandler *aodh = (AliAODHandler*)mgr->GetOutputEventHandler();
+  if (!aodh) {
+    ::Error("AddTaskJets", "This task needs an output event handler");
+    return NULL;
+  }   
+  
+
+  // Create the task and configure it.
+  //===========================================================================
+  AliAnalysisTaskJets *jetana;
+   AliJetReader *er = CreateJetReader(jr,filterMask);
+   // Define jet header and jet finder
+   AliJetFinder *jetFinder = CreateJetFinder(jf,radius);
+
+   if (jetFinder){
+       if (er) jetFinder->SetJetReader(er);
+   }
+
+
+
+   TString cAdd = "";
+   cAdd += Form("%02d",(int)((radius+0.01)*10.));
+   cAdd += Form("_B%d",(int)((kBackgroundMode)));
+   cAdd += Form("_Filter%05d",filterMask);
+   cAdd += Form("_Cut%05d",(int)((1000.*kPtTrackMin)));
+   Printf("%s",cAdd.Data());
+   jetana = new AliAnalysisTaskJets(Form("JetAnalysis%s_%s%s",jr,jf,cAdd.Data()));
+
+
+   TString c_jr(jr);
+   c_jr.ToLower();
+   TString c_jf(jf);
+   c_jf.ToLower();
+
+   /*
+   if(c_jf.CompareTo("ua1")==0 && TMath::Abs(radius-0.4) < 0.01 && c_jr.CompareTo("aod") == 0){
+     // do nothing, this is the standard jet finder R = 0.4, UA1 on AOD
+   }
+   else{
+
+     
+ }
+   */
+   TString bName =  Form("jets%s_%s%s",jr,jf,cAdd.Data());
+   jetana->SetNonStdBranch(bName.Data());
+   Printf("Set jet branchname \"%s\"",bName.Data());
+
+
+   AliAnalysisDataContainer *cout_jet = mgr->CreateContainer(
+                                                            Form("jethist_%s_%s%s",
+                                                                 c_jr.Data(),
+                                                                 c_jf.Data(),
+                                                                 cAdd.Data()), 
+                                                            TList::Class(),
+                                                            AliAnalysisManager::kOutputContainer, 
+                                                            Form("%s:PWG4_jethist_%s_%s%s",AliAnalysisManager::GetCommonFileName(),
+                                                                 c_jr.Data(),
+                                                                 c_jf.Data(),
+                                                                 cAdd.Data()));
+
+   // Connect jet finder to task.
+   jetana->SetJetFinder(jetFinder);
+   jetana->SetConfigFile("");
+   jetana->SetDebugLevel(2);
+   if(TMath::Abs((radius-0.4))< 0.02&&c_jf.Contains("fastjet")){
+     //     jetana->SetFilterPt(20.);
+   }
+
+
+   mgr->AddTask(jetana);
+
+
+   // Create ONLY the output containers for the data produced by the task.
+   // Get and connect other common input/output containers via the manager as below
+   //==============================================================================
+   mgr->ConnectInput  (jetana, 0, mgr->GetCommonInputContainer());
+// AOD output slot will be used in a different way in future
+   mgr->ConnectOutput (jetana, 0, mgr->GetCommonOutputContainer());
+   mgr->ConnectOutput (jetana, 1, cout_jet);
+   
+   return jetana;
+}
+
+AliJetFinder *CreateJetFinder(Char_t *jf,Float_t radius){
+  AliJetFinder *jetFinder = 0;
+
+  switch (jf) {
+  case "CDF":
+    AliCdfJetHeader *jh = new AliCdfJetHeader();
+    jh->SetRadius(0.7);
+    if(radius>0)jh->SetRadius(radius);    
+    jh->SetAODwrite(kTRUE);
+    jh->SetAODtracksWrite(kTRUE);
+    //    jh->SetDebugCDF(1);
+    jetFinder = new AliCdfJetFinder();
+    if (jh) jetFinder->SetJetHeader(jh);
+    break;
+
+  case "DA":
+    AliDAJetHeader *jh=new AliDAJetHeader();
+    jh->SetComment("DA jet code with default parameters");
+    jh->SelectJets(kTRUE);
+//    jh->SetNeff(200);
+//    jh->SetEtaEff(2.2);
+    if(radius>0)jh->SetRadius(radius);
+    jh->SetEtMin(5.);
+    jetFinder = new AliDAJetFinder();
+    if (jh) jetFinder->SetJetHeader(jh);
+    break;
+
+  case "FASTJET":
+    // DEFAULT is ANTI KT
+    AliFastJetHeaderV1 *jh = new AliFastJetHeaderV1();
+    jh->SetRparam(0.4); // setup parameters                                  
+    Double_t rBkg = 0.6;
+    if(radius>0)jh->SetRparam(radius);
+    jh->SetAlgorithm(2); // antikt from fastjet/JetDefinition.hh
+    /*
+      $FASTJET/include/fastjet/JetDefinition.hh
+      enum JetAlgorithm {kt_algorithm, cambridge_algorithm,
+      antikt_algorithm, genkt_algorithm,
+      ee_kt_algorithm, ee_genkt_algorithm, ...};
+
+     */
+    jetFinder = new AliFastJetFinder();
+    jh->SetPtMin(1);
+    jh->SetRparamBkg(rBkg);
+    jh->SetGhostEtaMax(0.9+rBkg);
+    if (jh) jetFinder->SetJetHeader(jh);
+    break;
+
+  case "FASTKT":
+    AliFastJetHeaderV1 *jh = new AliFastJetHeaderV1();
+    jh->SetRparam(0.4); // setup parameters                                  
+    Double_t rBkg = 0.6;
+    if(radius>0)jh->SetRparam(radius);
+    jh->SetAlgorithm(0); // kt from fastjet/JetDefinition.hh
+    jh->SetPtMin(1);
+    jh->SetRparamBkg(rBkg);
+    jh->SetGhostEtaMax(0.9+rBkg);
+    jetFinder = new AliFastJetFinder();
+    if (jh) jetFinder->SetJetHeader(jh);
+    break;
+
+  case "SISCONE":
+    AliSISConeJetHeader * jh = new AliSISConeJetHeader();
+
+    jh->SetJetEtaMax(1.5);
+    jh->SetJetEtaMin(-1.5);
+
+    //siscone parameters
+    jh->SetConeRadius(0.4);                   // default cone radius
+    if(radius>0)jh->SetConeRadius(radius);   // cone radius
+
+    jh->SetOverlapThreshold(0.75);            // overlap parameter, between 0 and 1 excluded!! 0.75 value is advised
+    jh->SetPtProtojetMin(0);                  // pt min of protojets
+    jh->SetMinJetPt(5);                      // Ptmin of jets (GeV)
+
+    //do you want to subtract BG (0 = no, 1 = yes)
+    jh->SetBGMode(0); // if 1 set also the radius for the background determination..
+
+    //for background
+    jh->SetRapRange( -0.9, 0.9);              // rapidity range for subtracting background must be < ghostmaxrap-0.95*R
+    jh->SetPhiRange(0 , 2*TMath::Pi());       // phi range for subtracting background
+    
+    //to determine jets area
+    jh->SetBGAlgorithm(1);                    // algorithm for rho calculation : 0 = kT, 1 = Cambridge
+    jh->SetGhostEtaMax(4);                    // eta max where ghosts are generated 
+    jh->SetGhostArea(0.05);                   // area of a ghost 
+    jh->SetMeanGhostKt(1e-100);               // average transverse momentum of the ghosts.
+    jh->SetAreaTypeNumber(4);                 // from 1 to 5 : 1 = active_area, 2 = active_area_explicit_ghosts, 3 = one_ghost_passive_area, 4 = passive_area, 5 = voronoi_area
+    jetFinder = new AliSISConeJetFinder();
+    if (jh) jetFinder->SetJetHeader(jh);
+    break;
+
+  case "UA1":
+    AliUA1JetHeaderV1 *jh=new AliUA1JetHeaderV1();
+    jh->SetComment("UA1 jet code with default parameters");
+    jh->BackgMode(0);
+    jh->SetRadius(0.4);
+    if(radius>0)jh->SetRadius(radius);
+    jh->SetEtSeed(4.);
+    jh->SetNAcceptJets(6);
+    jh->SetLegoNbinPhi(432);
+    jh->SetLegoNbinEta(274);
+    jh->SetLegoEtaMin(-2);
+    jh->SetLegoEtaMax(+2);
+    jh->SetMinJetEt(5.);
+    jh->SetJetEtaMax(1.5);
+    jh->SetJetEtaMin(-1.5);
+    jh->BackgMode(kBackgroundMode);
+
+    jetFinder = new AliUA1JetFinderV1();
+    if (jh) jetFinder->SetJetHeader(jh);
+    break;
+  case "UA1LO":
+    AliUA1JetHeaderV1 *jh=new AliUA1JetHeaderV1();
+    jh->SetComment("UA1 jet code with Lo Pt settings parameters");
+    jh->BackgMode(0);
+    jh->SetRadius(0.4);
+    if(radius>0)jh->SetRadius(radius);
+    jh->SetEtSeed(1.);
+    jh->SetNAcceptJets(6);
+    jh->SetLegoNbinPhi(432);
+    jh->SetLegoNbinEta(274);
+    jh->SetLegoEtaMin(-2);
+    jh->SetLegoEtaMax(+2);
+    jh->SetMinJetEt(1.);
+    jh->SetJetEtaMax(1.5);
+    jh->SetJetEtaMin(-1.5);
+    jh->BackgMode(kBackgroundMode);
+
+    jetFinder = new AliUA1JetFinderV1();
+    if (jh) jetFinder->SetJetHeader(jh);
+    break;
+
+
+
+  case "UA1MC":
+    AliUA1JetHeaderV1 *jh=new AliUA1JetHeaderV1();
+    jh->SetComment("UA1 jet code with default MC parameters");
+    jh->BackgMode(0);
+    jh->SetRadius(1.0);
+    if(radius>0)jh->SetRadius(radius);
+    jh->SetEtSeed(4.);
+    jh->SetNAcceptJets(6);
+    jh->SetLegoNbinPhi(432);
+    jh->SetLegoNbinEta(274);
+    jh->SetLegoEtaMin(-2);
+    jh->SetLegoEtaMax(+2);
+    jh->SetMinJetEt(5.);
+    jh->SetJetEtaMax(1.5);
+    jh->SetJetEtaMin(-1.5);
+    jh->BackgMode(kBackgroundMode);
+    jetFinder = new AliUA1JetFinderV1();
+    if (jh) jetFinder->SetJetHeader(jh);
+    break;
+  default:
+    Printf("\n >>>>>>> AddTaskJets Error Wrong jet finder selected\n");
+    break;
+  }
+
+  return jetFinder;
+
+}
+
+AliJetReader *CreateJetReader(Char_t *jr,UInt_t filterMask){
+  AliJetReader *er = 0;
+  Float_t ptCut  = kPtTrackMin ; // cut on track p_T
+  switch (jr) {
+  case "MC":
+    AliJetKineReaderHeader *jrh = new AliJetKineReaderHeader();
+    jrh->SetComment("MC full Kinematics");
+    jrh->SetFastSimTPC(kFALSE);
+    jrh->SetFastSimEMCAL(kFALSE);
+    jrh->SetPtCut(ptCut);
+    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0 .9                                                                             
+    // Define reader and set its header                                     
+    er = new AliJetKineReader();
+    er->SetReaderHeader(jrh);
+    break;
+  case "MC2":
+    AliJetKineReaderHeader *jrh = new AliJetKineReaderHeader();
+    jrh->SetComment("MC full Kinematics spearate config charged only");
+    jrh->SetFastSimTPC(kFALSE);
+    jrh->SetFastSimEMCAL(kFALSE);
+    jrh->SetChargedOnly(kTRUE);
+    jrh->SetPtCut(ptCut);
+    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0 .9                                                                             
+    // Define reader and set its header                                     
+    er = new AliJetKineReader();
+    er->SetReaderHeader(jrh);
+    break;
+  case "ESD":
+    AliJetESDReaderHeader *jrh = new AliJetESDReaderHeader();
+    jrh->SetComment("Testing");
+    jrh->SetFirstEvent(0.);
+    jrh->SetLastEvent(1000);
+    jrh->SetPtCut(ptCut);
+    jrh->SetReadSignalOnly(kFALSE);
+    // Define reader and set its header                                     
+    er = new AliJetESDReader();
+    er->SetReaderHeader(jrh);
+    break;
+
+  case "AOD":
+    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();
+    jrh->SetComment("AOD Reader");
+    jrh->SetPtCut(ptCut); // set low p_T cut of to 150 MeV
+    jrh->SetTestFilterMask(32); // Change this one for a different set of cuts
+    if(filterMask>0)jrh->SetTestFilterMask(filterMask); 
+    // Define reader and set its header
+    er = new AliJetAODReader();
+    er->SetReaderHeader(jrh);
+    break;
+  case "AODMC":
+    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();
+    jrh->SetComment("AOD MC Reader");
+    jrh->SetPtCut(ptCut);
+    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0.9
+    jrh->SetReadAODMC(1);// 1 all primary MC , 2 all primary charged
+    // Define reader and set its header
+    er = new AliJetAODReader();
+    er->SetReaderHeader(jrh);
+    break;
+  case "AODMC2":
+    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();
+    jrh->SetComment("AOD MC Reader");
+    jrh->SetPtCut(ptCut);
+    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0.9
+    jrh->SetReadAODMC(2);// 1 all primary MC , 2 all primary charged
+    // Define reader and set its header
+    er = new AliJetAODReader();
+    er->SetReaderHeader(jrh);
+    break;
+  case "AODMC2b":
+    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();
+    jrh->SetComment("AOD MC Reader");
+    jrh->SetPtCut(ptCut);
+    jrh->SetFiducialEta(-0.9,0.9); // to take all MC particles default is 0.9
+    jrh->SetReadAODMC(2);// 1 all primary MC , 2 all primary charged
+    // Define reader and set its header
+    er = new AliJetAODReader();
+    er->SetReaderHeader(jrh);
+    break;
+  case "AODextra":
+    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();
+    jrh->SetComment("AOD Reader with extra branch");
+    jrh->SetPtCut(ptCut); // set low p_T cut of to ptCut
+    jrh->SetTestFilterMask(32); // Change this one for a different set of cuts
+    jrh->SetReadBranches(AliJetAODReaderHeader::kReadStdBranch | AliJetAODReaderHeader::kReadNonStdBranch);
+    jrh->SetNonStdBranch("aodExtraTracks");
+    if(filterMask>0)jrh->SetTestFilterMask(filterMask); 
+    // Define reader and set its header
+    er = new AliJetAODReader();
+    er->SetReaderHeader(jrh);
+    break;
+  case "AODextraonly":
+    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();
+    jrh->SetComment("AOD Reader with extra branch");
+    jrh->SetPtCut(ptCut); // set low p_T cut of to 150 MeV
+    jrh->SetTestFilterMask(32); // Change this one for a different set of cuts
+    jrh->SetReadBranches(AliJetAODReaderHeader::kReadNonStdBranch);
+    jrh->SetNonStdBranch("aodExtraTracks");
+    if(filterMask>0)jrh->SetTestFilterMask(filterMask); 
+    // Define reader and set its header
+    er = new AliJetAODReader();
+    er->SetReaderHeader(jrh);
+    break;
+  case "AODMCextra":
+    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();
+    jrh->SetComment("AOD MC Reader with extra branch");
+    jrh->SetPtCut(ptCut);
+    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0.9
+    jrh->SetReadAODMC(1);// 1 all primary MC , 2 all primary charged
+    jrh->SetReadBranches(AliJetAODReaderHeader::kReadStdBranch | AliJetAODReaderHeader::kReadNonStdBranch);
+    jrh->SetNonStdBranch("aodExtraMCparticles");
+    // Define reader and set its header
+    er = new AliJetAODReader();
+    er->SetReaderHeader(jrh);
+    break;
+  case "AODMC2extra":
+    AliJetAODReaderHeader *jrh = new AliJetAODReaderHeader();
+    jrh->SetComment("AOD MC Reader with extra branch");
+    jrh->SetPtCut(ptCut);
+    jrh->SetFiducialEta(-2.1,2.1); // to take all MC particles default is 0.9
+    jrh->SetReadAODMC(2);// 1 all primary MC , 2 all primary charged
+    jrh->SetReadBranches(AliJetAODReaderHeader::kReadStdBranch | AliJetAODReaderHeader::kReadNonStdBranch);
+    jrh->SetNonStdBranch("aodExtraMCparticles");
+    // Define reader and set its header
+    er = new AliJetAODReader();
+    er->SetReaderHeader(jrh);
+    break;
+  default:
+    ::Error("AddTaskJets", "Wrong jet reader selected\n");
+    return 0;
+  }
+
+  return er;
+
+}