Example #1
0
AliJJetTask* AddTaskJJet(
    // FIXME: Really need default values? Is this needed by AliROOT? Or, let's remove it to reduce mistakes
    Int_t       trigger           = AliVEvent::kEMCEJE,
    const char *taskname          = "AliJJetTask",
    int         debug             = 1,
    int         doRecoMCPartleJet = 0,  // if do Jet Reconstruction with MC Particle. only for MC
    int         doRecoTrackJet    = 1,  // if do Jet Reconstruction with Reconstructed track. both of MC,Data
    int         isMC              = 0,  // If this event is MC ( both of particle, track )
    int         nR                = 3,  //Number(1-3) of R parameters in order from list 0.4, 0.5, 0.6
    int         doBackgroundEst   = 0   // If user wants to do background estimation with kt-algorithm
    )
{  

  //==============================================================================
  // Get the pointer to the existing analysis manager via the static access method.
  //==============================================================================
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr)
  {
    ::Error("AddTaskJJet", "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("AddTaskJJet", "This task requires an input event handler");
    return NULL;
  }

  //-------------------------------------------------------
  // Init the task and do settings
  //-------------------------------------------------------

  TString name(taskname);
  //name += trigger; // FIXME: Why not? Could be

  //TString tracksName = "PicoTracks";
  //TString tracksName = "PicoTracks";
  //TString clustersName = "EmcCaloClusters";
  //TString clustersCorrName = "CaloClustersCorr";
  TString tracksName        = "tracks";
  TString clustersCorrName  = "caloClusters"; 
  TString tracksNameMC      = "mcparticles";  //Check these
  TString rhoName           = "";             // FIXME: Comment me  

  if(nR < 1) nR = 1;
  if(nR > 3) nR = 3;

  //-------------------------------------------------------
  // LOAD EMCALJetTasks and Variables
  //-------------------------------------------------------
  gROOT->LoadMacro("$ALICE_PHYSICS/PWGJE/EMCALJetTasks/macros/AddTaskEmcalJet.C");
  if(doRecoTrackJet){
    const int nTrackJetFinder       = 2*nR; 
  }else{
    const int nTrackJetFinder       = 0;
  }
  if(doRecoMCPartleJet){
    const int nMCParticleJetFinder  = 2*nR;
  }else{
    const int nMCParticleJetFinder  = 0;

  }
  const int nJetFinder              = nMCParticleJetFinder + nTrackJetFinder;

  if(doBackgroundEst){
      if(doRecoTrackJet){
          const int nktTrackFinders = 1;
      }
      else{
          const int nktTrackFinders = 0;
      }
      if(nMCParticleJetFinder){
          const int nktMCParticleFinders = 1;
      }
      else{
          const int nktMCParticleFinders = 0;
      }
      const int nktFinders = nktTrackFinders + nktMCParticleFinders;
  }
  else{
      const int nktFinders = 0;
  }


  int countJetFinder                = 0;  // Counter for number of current Jet Finders

  //-------------------------------------------------------
  // AliJJetTask , AliEmcalJetTask, AliJetContainer
  //-------------------------------------------------------
  AliJJetTask *jtTask = new AliJJetTask(name, nJetFinder + nktFinders);
  jtTask->SetMC( isMC ) ; // Set isMC explicitly. 
  jtTask->SetnR( nR ) ; // Set number of jet resolution parameters. 
  jtTask->Setnkt( nktFinders ) ; // Set information about if kt algorithm reconstruction was done or not. 
  jtTask->SetDebug( debug );
  jtTask->SelectCollisionCandidates( trigger ); // WARNING: default is AliVEvent::kEMCEJE. Double check it!

  AliEmcalJetTask *jetFinderTask[nJetFinder];
  for( int i=0;i<nJetFinder;i++ ) jetFinderTask[i] = NULL;

  AliJetContainer *jetCont[nJetFinder];
  for( int i=0;i<nJetFinder;i++ ) jetCont[i] = NULL;

  AliEmcalJetTask *ktFinderTask[nktFinders];
  for( int i=0;i<nktFinders;i++) ktFinderTask[i] = NULL;
  AliJetContainer *ktCont[nktFinders]; //0 for Data and 1 for MC. Implementation for different R left for later.
  for( int i=0;i<nktFinders;i++) ktCont[i] = NULL; 
  double  ktConeSizes[1]={  0.4};
  int     ktJetTypes [1]={    1};// 0:FullJet 1:Charged 
  TString ktTypes    [1]={"TCP"};// Check if 100% sure about this

  //-------------------------------------------------------
  // Reconstructed Track Jets : Both of Data, MC
  //-------------------------------------------------------
  if( doRecoTrackJet ){
    //================= Variables for array
    int iStart = countJetFinder;
    int iEnd   = countJetFinder += nTrackJetFinder;
    //================= AddTaskEmcalJet
    // We have 6 type of recos
    double   aConeSizes[6]={     0.4,     0.5,     0.6,   0.4,   0.5,   0.6 };
    int      aJetType  [6]={       0,       0,       0,     1,     1,     1 }; // 0 :FullJet  1:Charged
    TString  aType     [6]={ "EMCAL", "EMCAL", "EMCAL", "TPC", "TPC", "TPC" };

    double bConeSizes[3] = {0.4,0.5,0.6};
    int bJetType[2] = {0,1};
    int bType[2] = {"EMCAL","TPC"};

    //================= Containers : Track, Cluster
    AliTrackContainer* partCont = new AliTrackContainer(tracksName);
    partCont->SetFilterHybridTracks(kFALSE);
    //partCont->SetFilterHybridTracks(kTRUE);
    AliParticleContainer *trackCont = partCont; 
    trackCont->SetClassName("AliVTrack");
    //AliParticleContainer *trackCont  = jtTask->AddParticleContainer( tracksName );
    if (trackCont) jtTask->AdoptParticleContainer(trackCont);
    AliClusterContainer *clusterCont = jtTask->AddClusterContainer( clustersCorrName );
    clusterCont->SetClassName("AliAODCaloCluster");

    //================= LOOP for configuraion
    //for(int i=iStart ; i<iEnd; i++){
    for(int itype = 0; itype < 2; itype++){
      for(int iR = 0; iR < nR; iR++){
        int iF = iStart + itype*nR + iR;
        //== Variables
        //int iHere = iStart - countJetFinder; // array index based 0 in a block
        int iHere = i-iStart; // array index based 0 in a block
        //double consize = aConeSizes[iHere];
        //int jettype = aJetType  [iHere];
        //int type    = aType     [iHere];
        double consize = bConeSizes[iR];
        int jettype = bJetType[itype];
        int type = bType[itype];

        //== JetFinderTask, JetContainer
        TString _clustersCorrName = ( type == "EMCAL" ? clustersCorrName : "" ); // Check if it is EMCAL
        jetFinderTask[iF] = AddTaskEmcalJet( tracksName, _clustersCorrName, AliJetContainer::antikt_algorithm, consize, jettype, 0.15, 0.300, 0.005, 1, "Jet", 5. ); // anti-kt
        jetFinderTask[iF]->SelectCollisionCandidates(trigger);
        jtTask->SetTrackOrMCParticle( iF, AliJJetTask::kJRecoTrack ); // TODO: Move this to AddJetContainer
        cout << jetFinderTask[iF]->GetName() << endl;
        jetCont[iF] = jtTask->AddJetContainer( jetFinderTask[iF]->GetName(), type, consize ); // TODO: SetTrackOrMCParticle here

        if( jetCont[iF] ) {
          jetCont[iF]->SetRhoName( rhoName );
          jetCont[iF]->ConnectParticleContainer( trackCont );
          if ( type == "EMCAL" ) jetCont[iF]->ConnectClusterContainer( clusterCont );
            jetCont[iF]->SetZLeadingCut( 0.98, 0.98 ); // FIXME: Comments me and others
            jetCont[iF]->SetPercAreaCut( 0.6 );
            jetCont[iF]->SetJetPtCut( 5 );    
            jetCont[iF]->SetLeadingHadronType( 0 );
        }
      }
    } // for i
  } // if doRecoTrackJet

  //-------------------------------------------------------
  // MC Particles Jets
  //-------------------------------------------------------
  if( doRecoMCPartleJet ){
    //================= Variables for array
    int iStart = countJetFinder;
    int iEnd   = countJetFinder += nMCParticleJetFinder; // WARN: this is a real end + 1

    //================= AddTaskEmcalJet
    // We have 3 type of recos
    double   aConeSizesMC[6]={     0.4,     0.5,     0.6,   0.4,   0.5,   0.6 };
    int      aJetTypeMC  [6]={       0,       0,       0,     1,     1,     1 }; // 0 :FullJet  1:Charged
    TString  aTypeMC     [6]={ "TPC", "TPC", "TPC", "TPC", "TPC", "TPC" };  

    double bConeSizes[3] = {0.4,0.5,0.6};
    int bJetType[2] = {0,1};
    int bType[2] = {"EMCAL","TPC"};

    char *nrho = rhoName;

    //================= Containers : MC Particle
    AliMCParticleContainer *mcTrackCont = jtTask->AddMCParticleContainer(tracksNameMC);
    mcTrackCont->SelectPhysicalPrimaries(kTRUE);
    mcTrackCont->SetClassName("AliAODMCParticle");

    //================= LOOP for configuraion
    for(int itype = 0; itype < 2; itype++){
      for(int iR = 0; iR < nR; iR++){
        int iF = iStart + itype*nR + iR;
        //== Variables
        //int iHere = iStart - countJetFinder; // array index based 0 in a block
        //int iHere = i - iStart; // array index based 0 in a block
        //double consizeMC = aConeSizesMC[iHere];
        //int jettype = aJetTypeMC  [iHere];
        //int type    = aTypeMC     [iHere];
        double consizeMC = bConeSizes[iR];
        int jettype = bJetType[itype];
        int type = bType[itype];

        //== JetFinderTask, JetContainer
        TString _clustersCorrName = ( type == "EMCAL" ? clustersCorrName : "" ); // Check if it is EMCAL // FIXME: Good for MC particles also? //No clusters in mc particles?
        jetFinderTask[iF] = AddTaskEmcalJet( tracksNameMC, "", AliJetContainer::antikt_algorithm, consizeMC, jettype, 0.15, 0.300, 0.005, 1, "Jet", 5. ); // anti-kt
        jetFinderTask[iF]->SelectCollisionCandidates(trigger);
        cout << jetFinderTask[iF]->GetName() << endl;
        //jetFinderTask[i]->GetParticleContainer(0)->SelectPhysicalPrimaries(kTRUE); 
        // FIXME: DUPLICATION? not needed here, I think // FIXME: Why before ConnectParticleContainer? //I don't think the order matters
        // FIXME: Is this means, we don't need to make particle container manually?
        jtTask->SetTrackOrMCParticle( iF, AliJJetTask::kJMCParticle ); // TODO: Move this to AddJetContainer FIXME: Maybe not possible in easy
        jetCont[iF] = jtTask->AddJetContainer( jetFinderTask[iF]->GetName(), type, consizeMC ); // TODO: SetTrackOrMCParticle here

        if(jetCont[iF]) {
          jetCont[iF]->SetRhoName( rhoName );
          jetCont[iF]->ConnectParticleContainer( mcTrackCont );
          // if ( aType[iHere] == "EMCAL" ) jetCont[i]->ConnectClusterContainer( clusterCont );
          jetCont[iF]->SetZLeadingCut( 0.98, 0.98 ); // FIXME: Comments me and others
          jetCont[iF]->SetPercAreaCut( 0.6 );
          jetCont[iF]->SetJetPtCut( 5 );    
          jetCont[iF]->SetLeadingHadronType( 0 );
        }
      }
    } // for i
  } // if doRecoMCPartleJet

  //-------------------------------------------------------
  // kt-algorithm
  //-------------------------------------------------------
  if (doBackgroundEst) {
    double ktConeSize = ktConeSizes[0];
    int ktJetType  = ktJetTypes[0];
    TString ktType = ktTypes[0];
    if (doRecoTrackJet) {
      TString _clustersCorrName = ( ktType == "EMCAL" ? clustersCorrName : "" );
      ktFinderTask[0] = AddTaskEmcalJet( tracksName, _clustersCorrName, AliJetContainer::kt_algorithm, ktConeSize, ktJetType, 0.15, 0.300, 0.005, 1, "Jet", 5. ); // kt
      ktFinderTask[0]->SelectCollisionCandidates(trigger);
      jtTask->SetTrackOrMCParticle( iEnd, AliJJetTask::kJRecoTrack );
      cout << ktFinderTask[0]->GetName() << endl;
      ktCont[0] = jtTask->AddJetContainer( ktFinderTask[0]->GetName(), ktJetType, ktConeSize );

      if( ktCont[0] ) {
        ktCont[0]->SetRhoName( rhoName );
        ktCont[0]->ConnectParticleContainer( trackCont );
        if ( type == "EMCAL" ) ktCont[0]->ConnectClusterContainer( clusterCont );
          ktCont[0]->SetZLeadingCut( 0.98, 0.98 );
          ktCont[0]->SetPercAreaCut( 0.6 );
          ktCont[0]->SetJetPtCut( 5 );    
          ktCont[0]->SetLeadingHadronType( 0 );
      }
    } // if doRecoTrackJet
    if (doRecoMCPartleJet) {
      TString _clustersCorrName = ( ktType == "EMCAL" ? clustersCorrName : "" );
      ktFinderTask[1] = AddTaskEmcalJet( tracksNameMC, "", AliJetContainer::kt_algorithm, ktConeSize, ktJetType, 0.15, 0.300, 0.005, 1, "Jet", 5. ); // kt
      ktFinderTask[1]->SelectCollisionCandidates(trigger);
      jtTask->SetTrackOrMCParticle( iEnd+1, AliJJetTask::kJMCParticle );
      ktCont[1] = jtTask->AddJetContainer( ktFinderTask[1]->GetName(), ktJetType, ktConeSize );

      if( ktCont[1] ) {
        ktCont[1]->SetRhoName( rhoName );
        ktCont[1]->ConnectParticleContainer( trackCont );
        if ( type == "EMCAL" ) ktCont[0]->ConnectClusterContainer( clusterCont );
          ktCont[1]->SetZLeadingCut( 0.98, 0.98 );
          ktCont[1]->SetPercAreaCut( 0.6 );
          ktCont[1]->SetJetPtCut( 5 );    
          ktCont[1]->SetLeadingHadronType( 0 );
      }
    } // if doRecoTrackJet
  } // if doBackgroundEst

  //-------------------------------------------------------
  // Final settings, pass to manager and set the containers
  //-------------------------------------------------------
  Printf("name: %s",name.Data());

  mgr->AddTask(jtTask);

  // Create containers for input/output
  AliAnalysisDataContainer *cinput  = mgr->GetCommonInputContainer()  ;
  TString contname(name);
  contname += "_histos";
  cout << "Create container " << contname << endl;
  AliAnalysisDataContainer *coutput = mgr->CreateContainer(contname.Data(),
      TList::Class(),AliAnalysisManager::kOutputContainer,
      Form("%s", AliAnalysisManager::GetCommonFileName()));

  mgr->ConnectInput  (jtTask, 0,  cinput );
  mgr->ConnectOutput (jtTask, 1, coutput ); // MUST HAVE IT, DON"T KNOW WHY ??? maybe from EMCALJET code

  return jtTask;
  }
Example #2
0
void AddTaskEmcalQA()
{
  enum {
    kMinBias,
    
    //kEMCalL0,
    kEMCalL1G1,
    //kEMCalL1G2,
    kEMCalL1J1,
    //kEMCalL1J2,
    
    //kDCalL0,
    kDCalL1G1,
    //kDCalL1G2,
    kDCalL1J1,
    //kDCalL1J2,
    
    kLastTrig
  };

  TString gCaloTriggerNames[kLastTrig];
  gCaloTriggerNames[kMinBias] = "CINT7-B-NOPF-CENT";
  //gCaloTriggerNames[kEMCalL0] = "CEMC7-B-NOPF-CENTNOPMD";
  gCaloTriggerNames[kEMCalL1G1] = "CINT7EG1-B-NOPF-CENTNOPMD";
  //gCaloTriggerNames[kEMCalL1G2] = "CINT7EG2-B-NOPF-CENTNOPMD";
  gCaloTriggerNames[kEMCalL1J1] = "CINT7EJ1-B-NOPF-CENTNOPMD";
  //gCaloTriggerNames[kEMCalL1J2] = "CINT7EJ2-B-NOPF-CENTNOPMD";
  //gCaloTriggerNames[kDCalL0] = "CDMC7-B-NOPF-CENTNOPMD";
  gCaloTriggerNames[kDCalL1G1] = "CINT7DG1-B-NOPF-CENTNOPMD";
  //gCaloTriggerNames[kDCalL1G2] = "CINT7DG2-B-NOPF-CENTNOPMD";
  gCaloTriggerNames[kDCalL1J1] = "CINT7DJ1-B-NOPF-CENTNOPMD";
  //gCaloTriggerNames[kDCalL1J2] = "CINT7DJ2-B-NOPF-CENTNOPMD";

  TString gCaloTriggerLabels[kLastTrig];
  gCaloTriggerLabels[kMinBias] = "INT7";
  //gCaloTriggerLabels[kEMCalL0] = "EMC7";
  gCaloTriggerLabels[kEMCalL1G1] = "EMCEG1";
  //gCaloTriggerLabels[kEMCalL1G2] = "EMCEG2";
  gCaloTriggerLabels[kEMCalL1J1] = "EMCEJ1";
  //gCaloTriggerLabels[kEMCalL1J2] = "EMCEJ2";
  //gCaloTriggerLabels[kDCalL0] = "DMC7";
  gCaloTriggerLabels[kDCalL1G1] = "DMCEG1";
  //gCaloTriggerLabels[kDCalL1G2] = "DMCEG2";
  gCaloTriggerLabels[kDCalL1J1] = "DMCEJ1";
  //gCaloTriggerLabels[kDCalL1J2] = "DMCEJ2";

  gROOT->LoadMacro("$ALICE_PHYSICS/PWGJE/EMCALJetTasks/macros/AddTaskSAQA.C");
  gROOT->LoadMacro("$ALICE_PHYSICS/PWGJE/EMCALJetTasks/macros/AddTaskSAJF.C");
  gROOT->LoadMacro("$ALICE_PHYSICS/PWG/EMCAL/macros/AddTaskEmcalTriggerQA.C");
  gROOT->LoadMacro("$ALICE_PHYSICS/PWGJE/EMCALJetTasks/macros/AddTaskEmcalJet.C");
  gROOT->LoadMacro("$ALICE_PHYSICS/PWGJE/EMCALJetTasks/macros/AddTaskRho.C");

  AliEmcalJetTask* ktJetTask = AddTaskEmcalJet(AliEmcalJetTask::kKT | AliEmcalJetTask::kFullJet | AliEmcalJetTask::kR020Jet,
					       "", "CaloClusters", 0., 0.30, 0.005);

  AliEmcalJetTask* aktJetTask = AddTaskEmcalJet(AliEmcalJetTask::kAKT | AliEmcalJetTask::kFullJet | AliEmcalJetTask::kR020Jet,
						"", "CaloClusters", 0., 0.30, 0.005);

  AliAnalysisTaskRho* rhoTaskEMCal = AddTaskRho(ktJetTask->GetName(), "", "CaloClusters", "NeutralRhoEMCal", 0.2, "EMCAL", 0.01, 0, 0, 1, kTRUE, "EMCal");
  rhoTaskEMCal->SetUseNewCentralityEstimation(kTRUE);
  rhoTaskEMCal->SetNCentBins(5);
  rhoTaskEMCal->SetHistoBins(50, 0, 100);
  rhoTaskEMCal->GetJetContainer(0)->SetJetPtCut(0.1);

  AliAnalysisTaskRho* rhoTaskDCal = AddTaskRho(ktJetTask->GetName(), "", "CaloClusters", "NeutralRhoDCal", 0.2, "DCAL", 0.01, 0, 0, 1, kTRUE, "DCal");
  rhoTaskDCal->SetUseNewCentralityEstimation(kTRUE);
  rhoTaskDCal->SetNCentBins(5);
  rhoTaskDCal->SetHistoBins(50, 0, 100);
  rhoTaskDCal->GetJetContainer(0)->SetJetPtCut(0.1);

  for (Int_t i = 0; i < kLastTrig; i++) {
    TString suffix;

    AliEmcalTriggerQATask* pTriggerQA = AddTaskEmcalTriggerQA("EmcalTriggers", 0, 0, gCaloTriggerLabels[i]);
    pTriggerQA->SetEMCalTriggerMode(AliAnalysisTaskEmcal::kNoSpecialTreatment);
    pTriggerQA->SetTrigClass(gCaloTriggerNames[i]);
    pTriggerQA->SetUseNewCentralityEstimation(kTRUE);
    pTriggerQA->SetNCentBins(5);
    pTriggerQA->SetADCperBin(15);
    
    suffix = gCaloTriggerLabels[i];
    AliAnalysisTaskSAQA *pQATaskAfter = AddTaskSAQA("", "CaloClusters", "EMCALCells", "", "",
						    0, 0, 0, 0., 0., "TPC", suffix);
    pQATaskAfter->GetClusterContainer(0)->SetClusECut(0.);
    pQATaskAfter->GetClusterContainer(0)->SetClusPtCut(0.);
    pQATaskAfter->GetClusterContainer(0)->SetClusNonLinCorrEnergyCut(0.15);
    pQATaskAfter->SetDefaultClusterEnergy(AliVCluster::kNonLinCorr);
    pQATaskAfter->SetHistoBins(150, 0, 150);
    pQATaskAfter->SetEMCalTriggerMode(AliAnalysisTaskEmcal::kNoSpecialTreatment);
    pQATaskAfter->SetTrigClass(gCaloTriggerNames[i]);
    pQATaskAfter->SetVzRange(-999,999);
    pQATaskAfter->SetUseNewCentralityEstimation(kTRUE);
    pQATaskAfter->SetNCentBins(5);

    if (gCaloTriggerLabels[i] == "INT7" || gCaloTriggerLabels[i].BeginsWith("EMCE")) {
      suffix = gCaloTriggerLabels[i];
      AliAnalysisTaskSAJF *pJFTask = AddTaskSAJF("", "CaloClusters", aktJetTask->GetName(), "NeutralRhoDCal", 0.2, 1, 0., "EMCALfid", 1, suffix);
      pJFTask->SetEMCalTriggerMode(AliAnalysisTaskEmcal::kNoSpecialTreatment);
      pJFTask->SetTrigClass(gCaloTriggerNames[i]);
      pJFTask->SetVzRange(-999,999);
      pJFTask->SetUseNewCentralityEstimation(kTRUE);
      pJFTask->SetNCentBins(5);
      pJFTask->SetHistoBins(200,0,200);
    }

    if (gCaloTriggerLabels[i] == "INT7" || gCaloTriggerLabels[i].BeginsWith("DMCE")) {
      suffix = gCaloTriggerLabels[i];
      AliAnalysisTaskSAJF *pJFTask = AddTaskSAJF("", "CaloClusters", aktJetTask->GetName(), "NeutralRhoEMCal", 0.2, 1, 0., "DCALfid", 1, suffix);
      pJFTask->SetEMCalTriggerMode(AliAnalysisTaskEmcal::kNoSpecialTreatment);
      pJFTask->SetTrigClass(gCaloTriggerNames[i]);
      pJFTask->SetVzRange(-999,999);
      pJFTask->SetUseNewCentralityEstimation(kTRUE);
      pJFTask->SetNCentBins(5);
      pJFTask->SetHistoBins(200,0,200);
    }
  }
}
Example #3
0
AliAnalysisTaskEmcalDiJetAna* AddTaskEmcalDiJetAna(TString     kTracksName         = "PicoTracks", 
						   TString     kClusName           = "caloClusterCorr",
						   Double_t    R                   = 0.4, 
						   Double_t    ptminTrack          = 0.15, 
						   Double_t    etminClus           = 0.3, 
						   Int_t       rhoType             = 0,
						   TString     trigClass           = "",
						   const char *CentEst             = "V0A",
						   Int_t       pSel                = AliVEvent::kINT7,
						   Int_t       matchFullCh         = AliAnalysisTaskEmcalDiJetBase::kNoMatching,
						   Double_t    ptTrackBias         = 0.,
						   Int_t       corrType            = AliAnalysisTaskEmcalDiJetBase::kCorrelateTwo,
						   Float_t     nefCut              = 10.,
						   Int_t       nCentBins           = 5,
						   Double_t    scaleFact           = 1.28
						   ) {
  
  enum AlgoType {kKT, kANTIKT};
  enum JetType  {kFULLJETS, kCHARGEDJETS, kNEUTRALJETS};

  // #### Define manager and data container names
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) {
    ::Error("AddTaskEmcalDiJet", "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("AddTaskEmcalDiJet", "This task requires an input event handler");
      return NULL;
    }

  // #### Add necessary jet finder tasks
  gROOT->LoadMacro("$ALICE_PHYSICS/PWGJE/EMCALJetTasks/macros/AddTaskEmcalJet.C");

  AliEmcalJetTask* jetFinderTaskFull    = AddTaskEmcalJet(kTracksName, kClusName, kANTIKT, R, kFULLJETS, ptminTrack, etminClus,0.005,1,"Jet",1.);
  AliEmcalJetTask* jetFinderTaskCharged = AddTaskEmcalJet(kTracksName, kClusName, kANTIKT, R, kCHARGEDJETS, ptminTrack, etminClus,0.005,1,"Jet",1.);
  jetFinderTaskFull->SelectCollisionCandidates(AliVEvent::kAny);
  jetFinderTaskCharged->SelectCollisionCandidates(AliVEvent::kAny);


  TString strJetsFull = jetFinderTaskFull->GetName();
  TString strJetsCh   = jetFinderTaskCharged->GetName();

  // Add kt jet finder and rho task in case we want background subtraction
  gROOT->LoadMacro("$ALICE_PHYSICS/PWGJE/EMCALJetTasks/macros/AddTaskRhoSparse.C");
  AliEmcalJetTask *jetFinderKt;
  AliEmcalJetTask *jetFinderAKt;
  AliAnalysisTaskRhoSparse *rhoTask;
  if(rhoType==1) {
    jetFinderKt   = AddTaskEmcalJet(kTracksName, kClusName, kKT, R, kCHARGEDJETS, ptminTrack, etminClus,0.005,1,"Jet",0.);
    jetFinderAKt  = AddTaskEmcalJet(kTracksName, kClusName, kANTIKT, R, kCHARGEDJETS, ptminTrack, etminClus,0.005,1,"Jet",1.);
    jetFinderKt->SelectCollisionCandidates(AliVEvent::kAny);
    jetFinderAKt->SelectCollisionCandidates(AliVEvent::kAny);

    TF1 *fScale = new TF1("fScale","[0]",0.,100.);
    fScale->SetParameter(0,scaleFact);
    TString rhoSparseName = Form("RhoSparseR%03d",(int)(100*R));
    rhoTask = AddTaskRhoSparse(jetFinderKt->GetName(),
			       jetFinderAKt->GetName(),
			       kTracksName.Data(),
			       kClusName.Data(),
			       rhoSparseName.Data(),
			       R,
			       "TPC",
			       0.01,
			       0.15,
			       0,
			       fScale,
			       0,
			       kTRUE,
			       rhoSparseName.Data(),
			       kTRUE
			       );
    rhoTask->SetCentralityEstimator(CentEst);
 
  }
  TString wagonName = Form("DiJet_%s_%s_Rho%dTC%sMatch%dHadTrig%d",strJetsFull.Data(),strJetsCh.Data(),rhoType,trigClass.Data(),matchFullCh,(Int_t)(ptTrackBias));

  //Configure DiJet task
  AliAnalysisTaskEmcalDiJetAna *taskDiJet = NULL;
  taskDiJet = new AliAnalysisTaskEmcalDiJetAna(wagonName.Data());

  taskDiJet->SetUseAliAnaUtils(kTRUE);
  taskDiJet->SetVzRange(-10.,10.);
  taskDiJet->SetTriggerClass(trigClass.Data());

  if(ptminTrack==0.) {
    taskDiJet->SetIsPythia(kTRUE);
    taskDiJet->SetDoFullFull(kTRUE);
  }
  taskDiJet->SetJetCorrelationType(corrType);


  Printf("strJetsFull: %s",strJetsFull.Data());
  Printf("strJetsCh: %s",strJetsCh.Data());

  taskDiJet->AddParticleContainer(kTracksName.Data());
  taskDiJet->AddClusterContainer(kClusName.Data());
   
  taskDiJet->SetContainerFull(0);
  taskDiJet->SetContainerCharged(1);
  taskDiJet->AddJetContainer(strJetsFull.Data(),"EMCAL",R);
  taskDiJet->AddJetContainer(strJetsCh.Data(),"TPC",R);

  taskDiJet->SetZLeadingCut(0.98,0.98,0);
  taskDiJet->SetNEFCut(0.,nefCut,0);

  for(Int_t i=0; i<2; i++) {
    taskDiJet->SetPercAreaCut(0.6, i);
    taskDiJet->SetPtBiasJetTrack(ptTrackBias,i);
  }

  taskDiJet->SetRhoType(rhoType);
  if(rhoType==1) {
    taskDiJet->SetRhoName(rhoTask->GetOutRhoScaledName(),0);
    taskDiJet->SetRhoName(rhoTask->GetOutRhoName(),1);
  }

  taskDiJet->SetCentralityEstimator(CentEst);
  taskDiJet->SetCentRange(0.,100.);
  taskDiJet->SetNCentBins(nCentBins);

  taskDiJet->SelectCollisionCandidates(pSel);

  taskDiJet->SetFullChargedMatchingType(matchFullCh);

  taskDiJet->SetDoChargedCharged(kTRUE);
  taskDiJet->SetDoFullCharged(kTRUE);
  taskDiJet->SetMatchFullCharged(kFALSE);

  mgr->AddTask(taskDiJet);

  //Connnect input
  mgr->ConnectInput (taskDiJet, 0, mgr->GetCommonInputContainer() );

  //Connect output
  AliAnalysisDataContainer *coutput1 = 0x0;

  TString contName(wagonName);
  contName += "_histos";

  //  TString outputfile = Form("%s:%s",AliAnalysisManager::GetCommonFileName(),wagonName.Data());
  TString outputfile = Form("%s",AliAnalysisManager::GetCommonFileName());

  coutput1 = mgr->CreateContainer(contName.Data(), TList::Class(),AliAnalysisManager::kOutputContainer,outputfile);

  mgr->ConnectOutput(taskDiJet,1,coutput1);
  
  return taskDiJet;
}