ROOT logo
//-*- Mode: C++ -*-
// $Id$

#ifndef __CINT__
//#include "AliESDtrackCuts.h"
//#include "AliAnalysisCuts.h"
//#include "AliFlowTrackSimple.h"      // added as hint for hidden library dependency to libPWGflowBase
//#include "AliFlowCandidateTrack.h"   // added as hint for hidden library dependency to libPWGflowTasks
//#include "AliCFContainer.h"          // added as hint for hidden library dependency to libCORRFW
//#include "AliAODRecoDecayHF2Prong.h" // added as hint for hidden library dependency to libPWGHFvertexingHF

#include "AliAnalysisTaskDxHFECorrelation.h"
#include "AliDxHFECorrelation.h"
#incldue "AliReducedParticle.h"
#include "AliHFCorrelator.h"
#include "AliHFAssociatedTrackCuts.h"
#include "AliAnalysisManager.h"
#include "AliAnalysisDataContainer.h"
#include "AliHFEcuts.h"
#include "AliLog.h"
#include "TObject.h"
#include "TClass.h"
#include "TDirectory.h"
#include "TROOT.h"
#include "AliRDHFCutsD0toKpi.h"
#include "AliHFEextraCuts.h"
using namespace std;
#endif

const char* poolInfoName="PoolInfo";
AliAnalysisCuts* createDefaultPoolConfig();
AliAnalysisCuts* createPbPbPoolConfig();

/// @file   AddTaskDxHFECorrelation.C
/// @author Matthias.Richter@ift.uib.no
/// @date   2012-05-09
/// @brief  Add the D0-HFE correlation task to the manager
///
int AddTaskDxHFECorrelation(TString configuration="", TString analysisName="PWGHFcorrelationDxHF")
{
  //First check to see if user wants to see help
  if (configuration.BeginsWith("help") || 
      configuration.BeginsWith("--help") || 
      configuration.BeginsWith("-h") || 
      configuration.BeginsWith("options") ) {
    cout <<"\n\n============================================" << endl;
    cout << "Keywords for AddTaskDxHFECorrelation.C:\n"
	 << "file=                         - Filename to store output in\n"
	 << "name=                         - Name of analysis, will correspond to directory inside the file \n"
	 << "cutname=                      - Filename where information on event pool for event-mixing is stored (if use external file)\n"
	 << "runD0MassReference            - If you also want to include D2H task for D0selection (for comparison purposes)\n"
	 << "mc                            - Run on MC\n"
	 << "usekine                       - To run on kinematical level \n"
	 << "event-mixing/mixing           - Whether to also run event-mixing (NB! Use AddTaskDxHFECorrelationME.C for eventmixing)\n"
	 << "trigger=D/D0/electron         - Which particle to trigger on \n"
	 << "\nD0 settings: \n"
	 << "fillD0scheme=both/D0/D0bar    - Which fillsheme to use for D0\n"
	 << "\nelectron settings: \n"
	 << "useinvmasscut                 - If you want to use invariant mass cut (default is 100MeV/c)\n" 
	 << "invmasscut=                   - If you want to specify a different invariant mass cut \n"
	 << "extraname=                    - extraname for directory and list if you run several tasks at once\n"
	 << "tpcclusters=                  - How many TPC clusters to use on single track cuts for electrons (default=120)\n"
	 << "itsclusters=                  - How many itsclusters to be used in single track cuts for electrons (default=4) \n"
	 << "itsreq=                       - (kFirst,kAny,kNone) Which ITSpixel requirement you want to impose\n"
	 << "elmcreco=                     - (aftertrackcuts/aftertofpid/afterfullpid) Where you want to stop in track selection to look for electrons for mc \n\n";

    return;
  }
  TString ofilename;
  Int_t system=0;
  Bool_t bUseMC=kFALSE;
  Bool_t bEventMixing=kFALSE;
  Bool_t bRunD0MassReference=kFALSE;
  TString poolConfigFile="";
  // TODO: revise the logic for task options in order to forward every option
  // by default and filter out the options meant for the macro, that allows
  // to introduce new task options without the need to specifically forward them
  TString taskOptions;
  Int_t NrTPCclusters=120; // quick fix for problem sending hfe track cut object to addtask
  Int_t NrITSclusters=4;
  Int_t ITSreq=AliHFEextraCuts::kFirst;
  Int_t triggerParticle=AliDxHFECorrelation::kD;
  Bool_t bUseMCReco=kFALSE;
  Bool_t bUseKine=kFALSE;
  TString extraname="";

  cout << endl << "===============================================" << endl;
  cout << "Setting up Correlation task: " << configuration << endl;

  // look for configuration arguments if nothing specified
  // in the function call
  if (configuration.IsNull() && gDirectory) {
    const char* confObjectName="run_single_task_configuration";
    TObject* confObject=gDirectory->FindObject(confObjectName);
    if (confObject) {
      configuration=confObject->GetTitle();
    }
  }
  {// deprecated, but keep for formatting
    {// deprecated, but keep for formatting
      TObjArray* tokens=configuration.Tokenize(" ");
      if (tokens) {
	TIter next(tokens);
	TObject* token;
	while ((token=next())) {
	  TString argument=token->GetName();
	  if (argument.BeginsWith("file=")) {
	    argument.ReplaceAll("file=", "");
	    ofilename=argument;
	  }
	  else if (argument.BeginsWith("name=")) {
	    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("tpcclusters=")){
	    argument.ReplaceAll("tpcclusters=", "");
	    NrTPCclusters=argument.Atoi();
	    ::Info("AddTaskDxHFEParticleSelection",Form("Setting nr TPC clusters to %d",NrTPCclusters));
	  }
	  if (argument.BeginsWith("usekine") ||argument.BeginsWith("kine")) {
	    bUseKine=kTRUE;
	    taskOptions+=" usekine";
	  }
	  if (argument.BeginsWith("event-mixing") ||
	      argument.BeginsWith("mixing")/*deprecated, to be removed later*/) {
	    bEventMixing=kTRUE;
	    taskOptions+=" event-mixing";
	  }
	  if (argument.BeginsWith("PbPb") ||
	      argument.BeginsWith("system=1") ||
	      argument.BeginsWith("Pb-Pb")) {
	    system=1;
	    taskOptions+=" system=Pb-Pb";
	  }
	  if (argument.BeginsWith("fillD0scheme=")){
	    taskOptions+=" "+argument;
	  }
	  if(argument.BeginsWith("elmcreco")){
	    bUseMCReco=kTRUE;
	    taskOptions+=" "+argument;
	  }
	  if (argument.BeginsWith("trigger=")) {
	    taskOptions+=" "+argument;
	    argument.ReplaceAll("trigger=","");
	    if (argument.CompareTo("D0")==0) triggerParticle=AliDxHFECorrelation::kD;
	    else if (argument.CompareTo("D")==0) triggerParticle=AliDxHFECorrelation::kD;
	    else if (argument.CompareTo("electron")==0) triggerParticle=AliDxHFECorrelation::kElectron;
	  }
	  if (argument.CompareTo("runD0MassReference")==0){
	    bRunD0MassReference=kTRUE;
	  }
	  if(argument.BeginsWith("useinvmasscut"))
	    taskOptions+=" "+argument;
	  if(argument.BeginsWith("twoselectedinvmasscut"))
	    taskOptions+=" "+argument;
	  if(argument.BeginsWith("invmasscut="))
	    taskOptions+=" "+argument;
	  if(argument.BeginsWith("impactparamcut"))
	    taskOptions+=" "+argument;
	  if(argument.BeginsWith("etacut"))
	    taskOptions+=" "+argument;
	  if(argument.BeginsWith("storelastcutstep"))
	    taskOptions+=" "+argument;
	  if(argument.BeginsWith("extraname=")){
	    argument.ReplaceAll("extraname=", "");
	    extraname=argument;
	  }
	  if(argument.BeginsWith("itsclusters=")){
	    argument.ReplaceAll("itsclusters=", "");
	    NrITSclusters=argument.Atoi();
	   }
	  if(argument.BeginsWith("itsreq=")){
	    argument.ReplaceAll("itsreq=", "");
	    if(argument.CompareTo("kFirst")==0) ITSreq=AliHFEextraCuts::kFirst;
	    else if(argument.CompareTo("kAny")==0) ITSreq=AliHFEextraCuts::kAny;
	    else if(argument.CompareTo("kNone")==0) ITSreq=AliHFEextraCuts::kNone;
	  }
	  
	}	
      }
      delete tokens;
    }
  }

  AliAnalysisManager *pManager = AliAnalysisManager::GetAnalysisManager();
  if (!pManager) {
    ::Error("AddTaskDxHFECorrelation", "No analysis manager to connect to.");
    return;
  }

  if(bUseMCReco && bUseKine) {
    ::Fatal("AddTaskDxHFECorrelation","CAN'T SET BOTH usekine AND elmcreco AT THE SAME TIME");
    return;
  }
  
  
  // check for existence of PID task and add if not available
  const char* pidTaskName="PIDResponseTask";
  const char* pidTaskMacro="$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C";
  AliAnalysisTask* pidTask=pManager->GetTask(pidTaskName);
  if (!pidTask) {
    gROOT->LoadMacro(pidTaskMacro);
    TString pidFunction;
    pidFunction.Form("AddTaskPIDResponse(%d, %d)", bUseMC, kTRUE);
    gROOT->ProcessLine(pidFunction);
    if (pManager->GetTask(pidTaskName)==NULL) {
      ::Error("AddTaskDxHFECorrelation", Form("failed to add PID task '%s' from macro '%s'",
					      pidTaskName, pidTaskMacro));
      return 0;
    }
  } else {
    // TODO: would like to check if the PID task was set up
    // with consistent parameters, however there are no getters at the moment
    ::Info("AddTaskDxHFECorrelation", Form("PID task '%s' already existing", pidTaskName));
  }

  // optionally add D0Mass task for reference analysis
  if (bRunD0MassReference && !bEventMixing) {

    TString path("AddTaskD0Mass.C");
    if (gSystem->AccessPathName(path)!=0) {
      // first try local macro, than AliRoot default path
      path="$ALICE_ROOT/PWGHF/vertexingHF/macros/AddTaskD0Mass.C";
    }
    if (gSystem->AccessPathName(path)==0) {
      cout << "Setting up D0Mass reference task " << path << endl;
    } else {
      cout << "Can not find D0Mass reference task " << path << endl;
    }
    gROOT->LoadMacro(path);

    const char* taskName=AliAnalysisTaskSED0Mass::Class()->GetName();
    if (pManager->GetTask(taskName)) {
      ::Warning("AddTaskDxHFECorrelation", Form("task '%s' already existing, skipping ...",
						taskName));
    }
    else{
      //flag, readMC,filldistr,cutonDistr, system, flagD0D0bar,minC,maxC,finDirname,finname, finObjname,flagAOD049,FillMassPt, FillImptPar
      AliAnalysisTaskSED0Mass *d0massTask = AddTaskD0Mass(0,bUseMC,kTRUE,kTRUE, 0, 0, 0, 0, "", "","D0toKpiCuts", kFALSE, false, false);
    }
  }

  if(triggerParticle==AliDxHFECorrelation::kElectron)
    analysisName="HFExD";
  if (ofilename.IsNull()) ofilename=AliAnalysisManager::GetCommonFileName();
  ofilename+=":"+analysisName;

  ///______________________________________________________________________
  /// Cuts For D0

  AliRDHFCutsD0toKpi* RDHFD0toKpi=new AliRDHFCutsD0toKpi();
  // TODO: we might want to move this to separate functions if more data
  // sets are going to be handled
  if (system==0) {
  RDHFD0toKpi->SetStandardCutsPP2010();
  } else {
  // TODO: think about p-Pb
  RDHFD0toKpi->SetStandardCutsPbPb2011();

  // For centrality 0-10%, add centrality flattening
  //NB! NEED FOR THE MOMENT THE FILE!
  TFile *fFlat=TFile::Open("CentrDistrBins005.root","READ");
  TCanvas *c=fFlat->Get("cintegral");
  TH1F *hfl=(TH1F*)c->FindObject("hint");
  RDHFD0toKpi->SetHistoForCentralityFlattening(hfl,0.,10.,0.,0);
  //  RDHFD0toKpi->SetUseCentrality(AliRDHFCuts::kCentV0M);

  RDHFD0toKpi->SetMinCentrality(0.);// 40.*1.01
  RDHFD0toKpi->SetMaxCentrality(10.);// 80.*1.01
  }

  ///______________________________________________________________________
  /// Cuts for HFE
  TString hfeCutsName;
  if (system==0) hfeCutsName="HFE Standard Cuts";
  else hfeCutsName="HFE Cuts PbPb";
  AliHFEcuts *hfecuts = new AliHFEcuts("hfeCutsTPCTOF", hfeCutsName);
  hfecuts->CreateStandardCuts();

  hfecuts->SetTPCmodes(AliHFEextraCuts::kFound,AliHFEextraCuts::kFoundOverFindable);
  hfecuts->SetMinNClustersTPC(NrTPCclusters);	//Default = 80
  hfecuts->SetMinNClustersTPCPID(80);	//Default = 80
  hfecuts->SetMinRatioTPCclusters(0.6); 	//Default = 0.6
	
  ///ITS
  hfecuts->SetCutITSpixel(ITSreq);        	//Cut on SPD
  //hfecuts->SetCutITSdrift(AliHFEextraCuts::kAny); 	//Cut on SDD
  //hfecuts->SetCheckITSLayerStatus(kFALSE);
  hfecuts->SetMinNClustersITS(NrITSclusters); //Default = 4
	
  ///TOF
  hfecuts->SetTOFPIDStep(kTRUE);
		
  ///Additional Cuts
  hfecuts->SetPtRange(0.30, 10.5);
  hfecuts->SetMaxImpactParam(1.,2.);
  hfecuts->SetVertexRange(10.);

  //
  // PID for HFE
  // PID for Only TOF
  AliHFEpid *fPIDOnlyTOF = new AliHFEpid("hfePidTOF");
  if(!fPIDOnlyTOF->GetNumberOfPIDdetectors()) { 
    fPIDOnlyTOF->AddDetector("TOF",0);
  }
  fPIDOnlyTOF->ConfigureTOF(3); // number of sigma TOF
  fPIDOnlyTOF->InitializePID();
  
  // PID object for TPC and TOF combined
  AliHFEpid *fPID = new AliHFEpid("hfePid");
  if(!fPID->GetNumberOfPIDdetectors()) { 
    fPID->AddDetector("TOF",0);
    fPID->AddDetector("TPC",1);
  }
  //Add settings for asymmetric cut on nSigma TPC
  const int paramSize=4;
  Double_t params[paramSize];
  memset(params, 0, sizeof(Double_t)*paramSize);
  params[0]=-1.;
  fPID->ConfigureTPCdefaultCut(NULL, params, 3.);
  fPID->InitializePID();

  // PID for Only TPC
  AliHFEpid *fPIDOnlyTPC = new AliHFEpid("hfePidTPC");
  if(!fPIDOnlyTPC->GetNumberOfPIDdetectors()) { 
    fPIDOnlyTPC->AddDetector("TPC",0);
  }
  fPIDOnlyTPC->ConfigureTPCdefaultCut(NULL, params, 3.);
  fPIDOnlyTPC->InitializePID();

  //Create TList of HFE pid and track cuts
  TList *listHFE = new TList;
  listHFE->SetName("cut objects HFE");
  listHFE->Add(hfecuts);
  listHFE->Add(fPID);
  listHFE->Add(fPIDOnlyTOF);


  ///______________________________________________________________________
  /// 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
    if (system==0) poolConfiguration=createDefaultPoolConfig();
    else poolConfiguration=createPbPbPoolConfig();
  } else {
    // load configuration from file, and abort if something goes wrong
    TFile* filePoolConfiguration=TFile::Open(poolConfigFile.Data());
    if(!filePoolConfiguration){
      ::Error("AddTaskDxHFECorrelation", Form("Pool configuration object file %s not found, exiting", poolConfigFile.Data()));
      return 0;
    }
    TObject* pObj=filePoolConfiguration->Get(poolInfoName);
    if (!pObj) {
      ::Error("AddTaskDxHFECorrelation", Form("No Pool configuration object with name '%s' found in file %s, exiting", poolInfoName, poolConfigFile.Data()));
      return 0;
    }
    poolConfiguration = dynamic_cast<AliHFAssociatedTrackCuts*>(pObj);
    if (!poolConfiguration) {
      ::Error("AddTaskDxHFECorrelation", Form("Pool configuration object '%s' has inconsistent class type %s, exiting", poolInfoName, pObj->ClassName()));
      return 0;
    }
  }

  if(!poolConfiguration){
    ::Fatal("AddTaskDxHFECorrelation", Form("Pool configuration not found"));
    return 0;
  } 
  poolConfiguration->Print();

  //Taken out, causes problem when adding more than one task
  /*const char* taskName=AliAnalysisTaskDxHFECorrelation::Class()->GetName();
    if (pManager->GetTask(taskName)) {
    ::Warning("AddTaskDxHFECorrelation", Form("task '%s' already existing, skipping ...",
    taskName));
    return 0;
    }*/
  
  AliAnalysisTaskDxHFECorrelation *pTask=new AliAnalysisTaskDxHFECorrelation(taskOptions);
  if (!pTask) {
    ::Error("AddTaskDxHFECorrelation", "failed to create task.");
    return 0;
  }
  //TODO: Could also consider putting RDHFD0toKpi in a list (ParticleSelectionD0 allows it)
  pTask->SetCutsD0(RDHFD0toKpi);
  pTask->SetCutsHFE(listHFE);
  pTask->SetCuts(poolConfiguration);

  pManager->AddTask(pTask);

  // 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.

  TString listName;
  TString cutnameD0="cutsD0Corr";
  TString cutnameEl="cutsElCorr";
  TString cutnamePool="PoolInfo";
  if(triggerParticle==AliDxHFECorrelation::kElectron){
    cutnameD0+="Eltrigg";
    cutnameEl+="Eltrigg";
    cutnamePool+="Eltrigg";
    listName="HFExDlist";
  }
  else listName="DxHFElist";

  listName+=extraname;
  cutnameD0+=extraname;
  cutnameEl+=extraname;
  cutnamePool+=extraname;


  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()));


  AliAnalysisDataContainer *pContainer=pManager->CreateContainer(listName, TList::Class(), AliAnalysisManager::kOutputContainer, ofilename.Data());    
  AliAnalysisDataContainer *pContainer2=pManager->CreateContainer(cutnameD0,AliRDHFCutsD0toKpi::Class(),AliAnalysisManager::kOutputContainer, ofilename.Data()); //cuts D0
  AliAnalysisDataContainer *pContainer3=pManager->CreateContainer(cutnameEl,TList::Class(),AliAnalysisManager::kOutputContainer, ofilename.Data()); //cuts El
  AliAnalysisDataContainer *pContainer4=pManager->CreateContainer(cutnamePool,AliHFAssociatedTrackCuts::Class(),AliAnalysisManager::kOutputContainer, ofilename.Data()); // contains event pool info

  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 1;
}

// old signature kept for backward compatibility
int AddTaskDxHFECorrelation(Bool_t bUseMC, TString analysisName)
{
  TString arguments(bUseMC?"mc":"");
  if (!analysisName.IsNull()) {
    arguments+=Form(" name=%s", analysisName.Data())
  }
  AddTaskDxHFECorrelation(arguments)
}

// Note: AliHFAssociatedTrackCuts keeps an instance of the external
// pointer, the arrays thus need to be global
// TODO: try a proper implementation of AliHFAssociatedTrackCuts later
const Int_t    nofMBins=5;
const Double_t MBins[nofMBins+1]={0,20,40,60,80,500};
const Double_t * MultiplicityBins = MBins;
const Int_t    nofZBins=5;
const Double_t ZBins[nofZBins+1]={-10,-5,-2.5,2.5,5,10};
const Double_t *ZVrtxBins = ZBins;

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(nofZBins,nofMBins); // Note: the arrays have dimension x+1
  HFCorrelationCuts->SetPoolBins(ZVrtxBins,MultiplicityBins);

  TString description = "Info on Pool for EventMixing";   
  HFCorrelationCuts->AddDescription(description);

  return HFCorrelationCuts;
}

AliAnalysisCuts* createPbPbPoolConfig()
{
  AliHFAssociatedTrackCuts* HFCorrelationCuts=new AliHFAssociatedTrackCuts();
  HFCorrelationCuts->SetName("PoolInfo");
  HFCorrelationCuts->SetTitle("Info on Pool for EventMixing");

  // NEED to check this
  HFCorrelationCuts->SetMaxNEventsInPool(250);
  HFCorrelationCuts->SetMinNTracksInPool(80);
  HFCorrelationCuts->SetMinEventsToMix(5);
  HFCorrelationCuts->SetNofPoolBins(nofZBins,nofMBins); // Note: the arrays have dimension x+1
  HFCorrelationCuts->SetPoolBins(ZVrtxBins,MultiplicityBins);

  TString description = "Info on Pool for EventMixing";   
  HFCorrelationCuts->AddDescription(description);

  return HFCorrelationCuts;
}
 AddTaskDxHFECorrelation.C:1
 AddTaskDxHFECorrelation.C:2
 AddTaskDxHFECorrelation.C:3
 AddTaskDxHFECorrelation.C:4
 AddTaskDxHFECorrelation.C:5
 AddTaskDxHFECorrelation.C:6
 AddTaskDxHFECorrelation.C:7
 AddTaskDxHFECorrelation.C:8
 AddTaskDxHFECorrelation.C:9
 AddTaskDxHFECorrelation.C:10
 AddTaskDxHFECorrelation.C:11
 AddTaskDxHFECorrelation.C:12
 AddTaskDxHFECorrelation.C:13
 AddTaskDxHFECorrelation.C:14
 AddTaskDxHFECorrelation.C:15
 AddTaskDxHFECorrelation.C:16
 AddTaskDxHFECorrelation.C:17
 AddTaskDxHFECorrelation.C:18
 AddTaskDxHFECorrelation.C:19
 AddTaskDxHFECorrelation.C:20
 AddTaskDxHFECorrelation.C:21
 AddTaskDxHFECorrelation.C:22
 AddTaskDxHFECorrelation.C:23
 AddTaskDxHFECorrelation.C:24
 AddTaskDxHFECorrelation.C:25
 AddTaskDxHFECorrelation.C:26
 AddTaskDxHFECorrelation.C:27
 AddTaskDxHFECorrelation.C:28
 AddTaskDxHFECorrelation.C:29
 AddTaskDxHFECorrelation.C:30
 AddTaskDxHFECorrelation.C:31
 AddTaskDxHFECorrelation.C:32
 AddTaskDxHFECorrelation.C:33
 AddTaskDxHFECorrelation.C:34
 AddTaskDxHFECorrelation.C:35
 AddTaskDxHFECorrelation.C:36
 AddTaskDxHFECorrelation.C:37
 AddTaskDxHFECorrelation.C:38
 AddTaskDxHFECorrelation.C:39
 AddTaskDxHFECorrelation.C:40
 AddTaskDxHFECorrelation.C:41
 AddTaskDxHFECorrelation.C:42
 AddTaskDxHFECorrelation.C:43
 AddTaskDxHFECorrelation.C:44
 AddTaskDxHFECorrelation.C:45
 AddTaskDxHFECorrelation.C:46
 AddTaskDxHFECorrelation.C:47
 AddTaskDxHFECorrelation.C:48
 AddTaskDxHFECorrelation.C:49
 AddTaskDxHFECorrelation.C:50
 AddTaskDxHFECorrelation.C:51
 AddTaskDxHFECorrelation.C:52
 AddTaskDxHFECorrelation.C:53
 AddTaskDxHFECorrelation.C:54
 AddTaskDxHFECorrelation.C:55
 AddTaskDxHFECorrelation.C:56
 AddTaskDxHFECorrelation.C:57
 AddTaskDxHFECorrelation.C:58
 AddTaskDxHFECorrelation.C:59
 AddTaskDxHFECorrelation.C:60
 AddTaskDxHFECorrelation.C:61
 AddTaskDxHFECorrelation.C:62
 AddTaskDxHFECorrelation.C:63
 AddTaskDxHFECorrelation.C:64
 AddTaskDxHFECorrelation.C:65
 AddTaskDxHFECorrelation.C:66
 AddTaskDxHFECorrelation.C:67
 AddTaskDxHFECorrelation.C:68
 AddTaskDxHFECorrelation.C:69
 AddTaskDxHFECorrelation.C:70
 AddTaskDxHFECorrelation.C:71
 AddTaskDxHFECorrelation.C:72
 AddTaskDxHFECorrelation.C:73
 AddTaskDxHFECorrelation.C:74
 AddTaskDxHFECorrelation.C:75
 AddTaskDxHFECorrelation.C:76
 AddTaskDxHFECorrelation.C:77
 AddTaskDxHFECorrelation.C:78
 AddTaskDxHFECorrelation.C:79
 AddTaskDxHFECorrelation.C:80
 AddTaskDxHFECorrelation.C:81
 AddTaskDxHFECorrelation.C:82
 AddTaskDxHFECorrelation.C:83
 AddTaskDxHFECorrelation.C:84
 AddTaskDxHFECorrelation.C:85
 AddTaskDxHFECorrelation.C:86
 AddTaskDxHFECorrelation.C:87
 AddTaskDxHFECorrelation.C:88
 AddTaskDxHFECorrelation.C:89
 AddTaskDxHFECorrelation.C:90
 AddTaskDxHFECorrelation.C:91
 AddTaskDxHFECorrelation.C:92
 AddTaskDxHFECorrelation.C:93
 AddTaskDxHFECorrelation.C:94
 AddTaskDxHFECorrelation.C:95
 AddTaskDxHFECorrelation.C:96
 AddTaskDxHFECorrelation.C:97
 AddTaskDxHFECorrelation.C:98
 AddTaskDxHFECorrelation.C:99
 AddTaskDxHFECorrelation.C:100
 AddTaskDxHFECorrelation.C:101
 AddTaskDxHFECorrelation.C:102
 AddTaskDxHFECorrelation.C:103
 AddTaskDxHFECorrelation.C:104
 AddTaskDxHFECorrelation.C:105
 AddTaskDxHFECorrelation.C:106
 AddTaskDxHFECorrelation.C:107
 AddTaskDxHFECorrelation.C:108
 AddTaskDxHFECorrelation.C:109
 AddTaskDxHFECorrelation.C:110
 AddTaskDxHFECorrelation.C:111
 AddTaskDxHFECorrelation.C:112
 AddTaskDxHFECorrelation.C:113
 AddTaskDxHFECorrelation.C:114
 AddTaskDxHFECorrelation.C:115
 AddTaskDxHFECorrelation.C:116
 AddTaskDxHFECorrelation.C:117
 AddTaskDxHFECorrelation.C:118
 AddTaskDxHFECorrelation.C:119
 AddTaskDxHFECorrelation.C:120
 AddTaskDxHFECorrelation.C:121
 AddTaskDxHFECorrelation.C:122
 AddTaskDxHFECorrelation.C:123
 AddTaskDxHFECorrelation.C:124
 AddTaskDxHFECorrelation.C:125
 AddTaskDxHFECorrelation.C:126
 AddTaskDxHFECorrelation.C:127
 AddTaskDxHFECorrelation.C:128
 AddTaskDxHFECorrelation.C:129
 AddTaskDxHFECorrelation.C:130
 AddTaskDxHFECorrelation.C:131
 AddTaskDxHFECorrelation.C:132
 AddTaskDxHFECorrelation.C:133
 AddTaskDxHFECorrelation.C:134
 AddTaskDxHFECorrelation.C:135
 AddTaskDxHFECorrelation.C:136
 AddTaskDxHFECorrelation.C:137
 AddTaskDxHFECorrelation.C:138
 AddTaskDxHFECorrelation.C:139
 AddTaskDxHFECorrelation.C:140
 AddTaskDxHFECorrelation.C:141
 AddTaskDxHFECorrelation.C:142
 AddTaskDxHFECorrelation.C:143
 AddTaskDxHFECorrelation.C:144
 AddTaskDxHFECorrelation.C:145
 AddTaskDxHFECorrelation.C:146
 AddTaskDxHFECorrelation.C:147
 AddTaskDxHFECorrelation.C:148
 AddTaskDxHFECorrelation.C:149
 AddTaskDxHFECorrelation.C:150
 AddTaskDxHFECorrelation.C:151
 AddTaskDxHFECorrelation.C:152
 AddTaskDxHFECorrelation.C:153
 AddTaskDxHFECorrelation.C:154
 AddTaskDxHFECorrelation.C:155
 AddTaskDxHFECorrelation.C:156
 AddTaskDxHFECorrelation.C:157
 AddTaskDxHFECorrelation.C:158
 AddTaskDxHFECorrelation.C:159
 AddTaskDxHFECorrelation.C:160
 AddTaskDxHFECorrelation.C:161
 AddTaskDxHFECorrelation.C:162
 AddTaskDxHFECorrelation.C:163
 AddTaskDxHFECorrelation.C:164
 AddTaskDxHFECorrelation.C:165
 AddTaskDxHFECorrelation.C:166
 AddTaskDxHFECorrelation.C:167
 AddTaskDxHFECorrelation.C:168
 AddTaskDxHFECorrelation.C:169
 AddTaskDxHFECorrelation.C:170
 AddTaskDxHFECorrelation.C:171
 AddTaskDxHFECorrelation.C:172
 AddTaskDxHFECorrelation.C:173
 AddTaskDxHFECorrelation.C:174
 AddTaskDxHFECorrelation.C:175
 AddTaskDxHFECorrelation.C:176
 AddTaskDxHFECorrelation.C:177
 AddTaskDxHFECorrelation.C:178
 AddTaskDxHFECorrelation.C:179
 AddTaskDxHFECorrelation.C:180
 AddTaskDxHFECorrelation.C:181
 AddTaskDxHFECorrelation.C:182
 AddTaskDxHFECorrelation.C:183
 AddTaskDxHFECorrelation.C:184
 AddTaskDxHFECorrelation.C:185
 AddTaskDxHFECorrelation.C:186
 AddTaskDxHFECorrelation.C:187
 AddTaskDxHFECorrelation.C:188
 AddTaskDxHFECorrelation.C:189
 AddTaskDxHFECorrelation.C:190
 AddTaskDxHFECorrelation.C:191
 AddTaskDxHFECorrelation.C:192
 AddTaskDxHFECorrelation.C:193
 AddTaskDxHFECorrelation.C:194
 AddTaskDxHFECorrelation.C:195
 AddTaskDxHFECorrelation.C:196
 AddTaskDxHFECorrelation.C:197
 AddTaskDxHFECorrelation.C:198
 AddTaskDxHFECorrelation.C:199
 AddTaskDxHFECorrelation.C:200
 AddTaskDxHFECorrelation.C:201
 AddTaskDxHFECorrelation.C:202
 AddTaskDxHFECorrelation.C:203
 AddTaskDxHFECorrelation.C:204
 AddTaskDxHFECorrelation.C:205
 AddTaskDxHFECorrelation.C:206
 AddTaskDxHFECorrelation.C:207
 AddTaskDxHFECorrelation.C:208
 AddTaskDxHFECorrelation.C:209
 AddTaskDxHFECorrelation.C:210
 AddTaskDxHFECorrelation.C:211
 AddTaskDxHFECorrelation.C:212
 AddTaskDxHFECorrelation.C:213
 AddTaskDxHFECorrelation.C:214
 AddTaskDxHFECorrelation.C:215
 AddTaskDxHFECorrelation.C:216
 AddTaskDxHFECorrelation.C:217
 AddTaskDxHFECorrelation.C:218
 AddTaskDxHFECorrelation.C:219
 AddTaskDxHFECorrelation.C:220
 AddTaskDxHFECorrelation.C:221
 AddTaskDxHFECorrelation.C:222
 AddTaskDxHFECorrelation.C:223
 AddTaskDxHFECorrelation.C:224
 AddTaskDxHFECorrelation.C:225
 AddTaskDxHFECorrelation.C:226
 AddTaskDxHFECorrelation.C:227
 AddTaskDxHFECorrelation.C:228
 AddTaskDxHFECorrelation.C:229
 AddTaskDxHFECorrelation.C:230
 AddTaskDxHFECorrelation.C:231
 AddTaskDxHFECorrelation.C:232
 AddTaskDxHFECorrelation.C:233
 AddTaskDxHFECorrelation.C:234
 AddTaskDxHFECorrelation.C:235
 AddTaskDxHFECorrelation.C:236
 AddTaskDxHFECorrelation.C:237
 AddTaskDxHFECorrelation.C:238
 AddTaskDxHFECorrelation.C:239
 AddTaskDxHFECorrelation.C:240
 AddTaskDxHFECorrelation.C:241
 AddTaskDxHFECorrelation.C:242
 AddTaskDxHFECorrelation.C:243
 AddTaskDxHFECorrelation.C:244
 AddTaskDxHFECorrelation.C:245
 AddTaskDxHFECorrelation.C:246
 AddTaskDxHFECorrelation.C:247
 AddTaskDxHFECorrelation.C:248
 AddTaskDxHFECorrelation.C:249
 AddTaskDxHFECorrelation.C:250
 AddTaskDxHFECorrelation.C:251
 AddTaskDxHFECorrelation.C:252
 AddTaskDxHFECorrelation.C:253
 AddTaskDxHFECorrelation.C:254
 AddTaskDxHFECorrelation.C:255
 AddTaskDxHFECorrelation.C:256
 AddTaskDxHFECorrelation.C:257
 AddTaskDxHFECorrelation.C:258
 AddTaskDxHFECorrelation.C:259
 AddTaskDxHFECorrelation.C:260
 AddTaskDxHFECorrelation.C:261
 AddTaskDxHFECorrelation.C:262
 AddTaskDxHFECorrelation.C:263
 AddTaskDxHFECorrelation.C:264
 AddTaskDxHFECorrelation.C:265
 AddTaskDxHFECorrelation.C:266
 AddTaskDxHFECorrelation.C:267
 AddTaskDxHFECorrelation.C:268
 AddTaskDxHFECorrelation.C:269
 AddTaskDxHFECorrelation.C:270
 AddTaskDxHFECorrelation.C:271
 AddTaskDxHFECorrelation.C:272
 AddTaskDxHFECorrelation.C:273
 AddTaskDxHFECorrelation.C:274
 AddTaskDxHFECorrelation.C:275
 AddTaskDxHFECorrelation.C:276
 AddTaskDxHFECorrelation.C:277
 AddTaskDxHFECorrelation.C:278
 AddTaskDxHFECorrelation.C:279
 AddTaskDxHFECorrelation.C:280
 AddTaskDxHFECorrelation.C:281
 AddTaskDxHFECorrelation.C:282
 AddTaskDxHFECorrelation.C:283
 AddTaskDxHFECorrelation.C:284
 AddTaskDxHFECorrelation.C:285
 AddTaskDxHFECorrelation.C:286
 AddTaskDxHFECorrelation.C:287
 AddTaskDxHFECorrelation.C:288
 AddTaskDxHFECorrelation.C:289
 AddTaskDxHFECorrelation.C:290
 AddTaskDxHFECorrelation.C:291
 AddTaskDxHFECorrelation.C:292
 AddTaskDxHFECorrelation.C:293
 AddTaskDxHFECorrelation.C:294
 AddTaskDxHFECorrelation.C:295
 AddTaskDxHFECorrelation.C:296
 AddTaskDxHFECorrelation.C:297
 AddTaskDxHFECorrelation.C:298
 AddTaskDxHFECorrelation.C:299
 AddTaskDxHFECorrelation.C:300
 AddTaskDxHFECorrelation.C:301
 AddTaskDxHFECorrelation.C:302
 AddTaskDxHFECorrelation.C:303
 AddTaskDxHFECorrelation.C:304
 AddTaskDxHFECorrelation.C:305
 AddTaskDxHFECorrelation.C:306
 AddTaskDxHFECorrelation.C:307
 AddTaskDxHFECorrelation.C:308
 AddTaskDxHFECorrelation.C:309
 AddTaskDxHFECorrelation.C:310
 AddTaskDxHFECorrelation.C:311
 AddTaskDxHFECorrelation.C:312
 AddTaskDxHFECorrelation.C:313
 AddTaskDxHFECorrelation.C:314
 AddTaskDxHFECorrelation.C:315
 AddTaskDxHFECorrelation.C:316
 AddTaskDxHFECorrelation.C:317
 AddTaskDxHFECorrelation.C:318
 AddTaskDxHFECorrelation.C:319
 AddTaskDxHFECorrelation.C:320
 AddTaskDxHFECorrelation.C:321
 AddTaskDxHFECorrelation.C:322
 AddTaskDxHFECorrelation.C:323
 AddTaskDxHFECorrelation.C:324
 AddTaskDxHFECorrelation.C:325
 AddTaskDxHFECorrelation.C:326
 AddTaskDxHFECorrelation.C:327
 AddTaskDxHFECorrelation.C:328
 AddTaskDxHFECorrelation.C:329
 AddTaskDxHFECorrelation.C:330
 AddTaskDxHFECorrelation.C:331
 AddTaskDxHFECorrelation.C:332
 AddTaskDxHFECorrelation.C:333
 AddTaskDxHFECorrelation.C:334
 AddTaskDxHFECorrelation.C:335
 AddTaskDxHFECorrelation.C:336
 AddTaskDxHFECorrelation.C:337
 AddTaskDxHFECorrelation.C:338
 AddTaskDxHFECorrelation.C:339
 AddTaskDxHFECorrelation.C:340
 AddTaskDxHFECorrelation.C:341
 AddTaskDxHFECorrelation.C:342
 AddTaskDxHFECorrelation.C:343
 AddTaskDxHFECorrelation.C:344
 AddTaskDxHFECorrelation.C:345
 AddTaskDxHFECorrelation.C:346
 AddTaskDxHFECorrelation.C:347
 AddTaskDxHFECorrelation.C:348
 AddTaskDxHFECorrelation.C:349
 AddTaskDxHFECorrelation.C:350
 AddTaskDxHFECorrelation.C:351
 AddTaskDxHFECorrelation.C:352
 AddTaskDxHFECorrelation.C:353
 AddTaskDxHFECorrelation.C:354
 AddTaskDxHFECorrelation.C:355
 AddTaskDxHFECorrelation.C:356
 AddTaskDxHFECorrelation.C:357
 AddTaskDxHFECorrelation.C:358
 AddTaskDxHFECorrelation.C:359
 AddTaskDxHFECorrelation.C:360
 AddTaskDxHFECorrelation.C:361
 AddTaskDxHFECorrelation.C:362
 AddTaskDxHFECorrelation.C:363
 AddTaskDxHFECorrelation.C:364
 AddTaskDxHFECorrelation.C:365
 AddTaskDxHFECorrelation.C:366
 AddTaskDxHFECorrelation.C:367
 AddTaskDxHFECorrelation.C:368
 AddTaskDxHFECorrelation.C:369
 AddTaskDxHFECorrelation.C:370
 AddTaskDxHFECorrelation.C:371
 AddTaskDxHFECorrelation.C:372
 AddTaskDxHFECorrelation.C:373
 AddTaskDxHFECorrelation.C:374
 AddTaskDxHFECorrelation.C:375
 AddTaskDxHFECorrelation.C:376
 AddTaskDxHFECorrelation.C:377
 AddTaskDxHFECorrelation.C:378
 AddTaskDxHFECorrelation.C:379
 AddTaskDxHFECorrelation.C:380
 AddTaskDxHFECorrelation.C:381
 AddTaskDxHFECorrelation.C:382
 AddTaskDxHFECorrelation.C:383
 AddTaskDxHFECorrelation.C:384
 AddTaskDxHFECorrelation.C:385
 AddTaskDxHFECorrelation.C:386
 AddTaskDxHFECorrelation.C:387
 AddTaskDxHFECorrelation.C:388
 AddTaskDxHFECorrelation.C:389
 AddTaskDxHFECorrelation.C:390
 AddTaskDxHFECorrelation.C:391
 AddTaskDxHFECorrelation.C:392
 AddTaskDxHFECorrelation.C:393
 AddTaskDxHFECorrelation.C:394
 AddTaskDxHFECorrelation.C:395
 AddTaskDxHFECorrelation.C:396
 AddTaskDxHFECorrelation.C:397
 AddTaskDxHFECorrelation.C:398
 AddTaskDxHFECorrelation.C:399
 AddTaskDxHFECorrelation.C:400
 AddTaskDxHFECorrelation.C:401
 AddTaskDxHFECorrelation.C:402
 AddTaskDxHFECorrelation.C:403
 AddTaskDxHFECorrelation.C:404
 AddTaskDxHFECorrelation.C:405
 AddTaskDxHFECorrelation.C:406
 AddTaskDxHFECorrelation.C:407
 AddTaskDxHFECorrelation.C:408
 AddTaskDxHFECorrelation.C:409
 AddTaskDxHFECorrelation.C:410
 AddTaskDxHFECorrelation.C:411
 AddTaskDxHFECorrelation.C:412
 AddTaskDxHFECorrelation.C:413
 AddTaskDxHFECorrelation.C:414
 AddTaskDxHFECorrelation.C:415
 AddTaskDxHFECorrelation.C:416
 AddTaskDxHFECorrelation.C:417
 AddTaskDxHFECorrelation.C:418
 AddTaskDxHFECorrelation.C:419
 AddTaskDxHFECorrelation.C:420
 AddTaskDxHFECorrelation.C:421
 AddTaskDxHFECorrelation.C:422
 AddTaskDxHFECorrelation.C:423
 AddTaskDxHFECorrelation.C:424
 AddTaskDxHFECorrelation.C:425
 AddTaskDxHFECorrelation.C:426
 AddTaskDxHFECorrelation.C:427
 AddTaskDxHFECorrelation.C:428
 AddTaskDxHFECorrelation.C:429
 AddTaskDxHFECorrelation.C:430
 AddTaskDxHFECorrelation.C:431
 AddTaskDxHFECorrelation.C:432
 AddTaskDxHFECorrelation.C:433
 AddTaskDxHFECorrelation.C:434
 AddTaskDxHFECorrelation.C:435
 AddTaskDxHFECorrelation.C:436
 AddTaskDxHFECorrelation.C:437
 AddTaskDxHFECorrelation.C:438
 AddTaskDxHFECorrelation.C:439
 AddTaskDxHFECorrelation.C:440
 AddTaskDxHFECorrelation.C:441
 AddTaskDxHFECorrelation.C:442
 AddTaskDxHFECorrelation.C:443
 AddTaskDxHFECorrelation.C:444
 AddTaskDxHFECorrelation.C:445
 AddTaskDxHFECorrelation.C:446
 AddTaskDxHFECorrelation.C:447
 AddTaskDxHFECorrelation.C:448
 AddTaskDxHFECorrelation.C:449
 AddTaskDxHFECorrelation.C:450
 AddTaskDxHFECorrelation.C:451
 AddTaskDxHFECorrelation.C:452
 AddTaskDxHFECorrelation.C:453
 AddTaskDxHFECorrelation.C:454
 AddTaskDxHFECorrelation.C:455
 AddTaskDxHFECorrelation.C:456
 AddTaskDxHFECorrelation.C:457
 AddTaskDxHFECorrelation.C:458
 AddTaskDxHFECorrelation.C:459
 AddTaskDxHFECorrelation.C:460
 AddTaskDxHFECorrelation.C:461
 AddTaskDxHFECorrelation.C:462
 AddTaskDxHFECorrelation.C:463
 AddTaskDxHFECorrelation.C:464
 AddTaskDxHFECorrelation.C:465
 AddTaskDxHFECorrelation.C:466
 AddTaskDxHFECorrelation.C:467
 AddTaskDxHFECorrelation.C:468
 AddTaskDxHFECorrelation.C:469
 AddTaskDxHFECorrelation.C:470
 AddTaskDxHFECorrelation.C:471
 AddTaskDxHFECorrelation.C:472
 AddTaskDxHFECorrelation.C:473
 AddTaskDxHFECorrelation.C:474
 AddTaskDxHFECorrelation.C:475
 AddTaskDxHFECorrelation.C:476
 AddTaskDxHFECorrelation.C:477
 AddTaskDxHFECorrelation.C:478
 AddTaskDxHFECorrelation.C:479
 AddTaskDxHFECorrelation.C:480
 AddTaskDxHFECorrelation.C:481
 AddTaskDxHFECorrelation.C:482
 AddTaskDxHFECorrelation.C:483
 AddTaskDxHFECorrelation.C:484
 AddTaskDxHFECorrelation.C:485
 AddTaskDxHFECorrelation.C:486
 AddTaskDxHFECorrelation.C:487
 AddTaskDxHFECorrelation.C:488
 AddTaskDxHFECorrelation.C:489
 AddTaskDxHFECorrelation.C:490
 AddTaskDxHFECorrelation.C:491
 AddTaskDxHFECorrelation.C:492
 AddTaskDxHFECorrelation.C:493
 AddTaskDxHFECorrelation.C:494
 AddTaskDxHFECorrelation.C:495
 AddTaskDxHFECorrelation.C:496
 AddTaskDxHFECorrelation.C:497
 AddTaskDxHFECorrelation.C:498
 AddTaskDxHFECorrelation.C:499
 AddTaskDxHFECorrelation.C:500
 AddTaskDxHFECorrelation.C:501
 AddTaskDxHFECorrelation.C:502
 AddTaskDxHFECorrelation.C:503
 AddTaskDxHFECorrelation.C:504
 AddTaskDxHFECorrelation.C:505
 AddTaskDxHFECorrelation.C:506
 AddTaskDxHFECorrelation.C:507
 AddTaskDxHFECorrelation.C:508
 AddTaskDxHFECorrelation.C:509
 AddTaskDxHFECorrelation.C:510
 AddTaskDxHFECorrelation.C:511
 AddTaskDxHFECorrelation.C:512