ROOT logo
/**
 * @file   AddTaskCentralTracks.C
 * @author Christian Holm Christensen <cholm@dalsgaard.hehi.nbi.dk>
 * @date   Fri Jan 28 10:22:26 2011
 * 
 * @brief Class and script to add a multiplicity task for the central
 *        @f$\eta@f$ region
 * 
 * @ingroup pwglf_forward_scripts_tasks
 * 
 */
#include <AliAnalysisTaskSE.h>
#include <AliESDtrackCuts.h>
class TList;
class TH2D;
class TH1D;

/**
 * Task to determine the charged particle pseudo density from tracks
 * and tracklets.
 *
 * This class determines 
 * @f[
 *   \left.\frac{d^2N_{ch}}{d\eta d\phi}\right|_{central}
 * @f] 
 * from tracks and tracklets. 
 *
 * First, global tracks are investigated. The requirements on global
 * tracks are
 * - @f$ n_{TPC clusters} \ge 70@f$ 
 * - @f$ \chi^2_{TPC cluster} \le 4@f$ 
 * - No daughter kinks 
 * - Re-fit of TPC tracks 
 * - Re-fit of ITS tracks 
 * - No requirement on SPD clusters 
 *
 * Secondly, ITS stand-alone tracks are investigated.  The
 * requirements on ITS standalone tracks are
 * - Re-fit of ITS tracks 
 * - No requirement on SPD clusters 
 * 
 * Tracks that does not meet these quality conditions are flagged as
 * rejected.
 *
 * Both kinds of tracks (global and ITS standalone) have requirements
 * on the distance of closest approach (DCA) to the interaction
 * vertex @f$(v_x,v_y,v_z)@f$. 
 *
 * For tracks with SPD clusters: 
 * - @f$ DCA_{xy} < 0.0182+0.0350/p_t^{1.01}@f$ 
 * - @f$ DCA_{z} < 0.5@f$ 
 *
 * For tracks without SPD clusters 
 * - @f$ DCA_{xy} < 1.5(0.0182+0.0350/p_t^{1.01})@f$ 
 * - @f$ DCA_{z} < 0.5@f$ 
 *
 * Tracks that does not meet these DCA requirements are flagged as
 * secondaries.
 *
 * Thirdly, the number of SPD tracklets are investigated.  If the
 * tracklet is associated with a track, and that track has already
 * been used, then that tracklet is ignored
 * 
 * An @f$(\eta,\phi)@f$ per-event histogram is then filled from these
 * tracks and tracklets, and that histogram is stored in the output
 * AOD event.
 *
 * Furthermore, a number of diagnostics @f$\eta@f$ histograms are filled: 
 * - @f$\eta@f$ of all accepted tracks and tracklets 
 * - @f$\eta@f$ of accepted global tracks
 * - @f$\eta@f$ of accepted ITS tracks
 * - @f$\eta@f$ of accepted SPD tracklets
 *
 * At the end of the job, these histograms are normalized to the
 * number of accepted events and bin width to provide an estimate of
 * the @f$dN_{ch}/d\eta@f$
 *
 * Only minimum bias events with a @f$v_z@f$ within the defined cut
 * are analysed.
 *
 * @deprecated This class is deprecated 
 * @ingroup pwglf_forward_aod
 */
class CentralMultTask : public AliAnalysisTaskSE
{
public:
  enum { 
    kValidTrigger = 0x1, 
    kValidVertex  = 0x2
  };
  /** 
   * Constructor 
   * 
   */
  CentralMultTask();
  /** 
   * Constructor
   * 
   * @param name    Name of task 
   * @param maxEta  Set @f$\eta@f$ range
   * @param maxVtx  Set @f$v_z@f$ range
   */
  CentralMultTask(const char* name, 
		  Double_t maxEta=2, 
		  Double_t maxVtx=10);
  /**
   * Destructor
   * 
   */
  virtual ~CentralMultTask();
  /** 
   * Whether to use tracklets
   * 
   * @param use IF true, use tracklets
   */
  void SetUseTracklets(Bool_t use) { fUseTracklets = use; }
  /** 
   * Initialise on master - does nothing
   * 
   */
  virtual void   Init() {}
  /** 
   * Create output objects.  
   *
   * This is called once per slave process 
   */
  virtual void UserCreateOutputObjects();
  /** 
   * Process a single event 
   * 
   * @param option Not used
   */
  virtual void UserExec(Option_t* option);
  /** 
   * Called at end of event processing.
   *
   * This is called once in the master 
   * 
   * @param option Not used 
   */
  virtual void Terminate(Option_t* option);
protected:
  /** 
   * Check if this event is within cuts
   * 
   * @param esd Event
   * @param vz  Vertex @f$ z@f$ coordinate 
   * 
   * @return true if this event is to be considered
   */
  UShort_t CheckEvent(const AliESDEvent& esd, Double_t& vz);

  TH2D*           fHist;      // Per-event d2n/deta/dphi
  TH1D*           fAll;       // Summed d2n/deta/dphi - all track(let)s
  TH1D*           fGlobal;    // Summed d2n/deta/dphi - global tracks
  TH1D*           fITS;       // Summed d2n/deta/dphi - ITS tracks
  TH1D*           fTracklets; // Summed d2n/deta/dphi - SPD tracklets
  TH1D*           fNEventsTr; // Number of triggered events per vertex bin
  TH1D*           fNEventsVtx;// Number of triggered+vertex events per vertex
  TList*          fOutput;    // Output list
  AliESDtrackCuts fQGlo;      // Quality cut on ITS+TPC
  AliESDtrackCuts fQITS;      // Quality cut on ITS standalone (not ITS+TPC)
  AliESDtrackCuts fDCAwSPD;   // DCA for traks with SPD hits
  AliESDtrackCuts fDCAwoSPD;  // DCA for traks without SPD hits
  AliESDtrackCuts fIsPrimary; // Primary particle 
  Bool_t          fUseTracklets; // Whether to count tracklets or not 
  Bool_t          fDebug;     // Debug flag

  ClassDef(CentralMultTask,1); // Determine multiplicity in central area
};

//====================================================================
#include <TMath.h>
#include <TH2D.h>
#include <TH1D.h>
#include <THStack.h>
#include <TList.h>
#include <AliAnalysisManager.h>
#include <AliESDEvent.h>
#include <AliAODHandler.h>
#include <AliAODEvent.h>
#include <AliESDInputHandler.h>
#include <AliESDtrack.h>
#include <AliMultiplicity.h>

//____________________________________________________________________
inline CentralMultTask::CentralMultTask()
  : AliAnalysisTaskSE(), 
    fHist(0),
    fAll(0),
    fGlobal(0),
    fITS(0),
    fTracklets(0),
    fNEventsTr(0),
    fNEventsVtx(0),
    fOutput(0),
    fUseTracklets(false),
    fDebug(false)
{}

//____________________________________________________________________
inline CentralMultTask::CentralMultTask(const char* /* name */,
					Double_t maxEta,
					Double_t maxVtx)
  : AliAnalysisTaskSE("Central"), 
    fHist(0),
    fAll(0),
    fGlobal(0),
    fITS(0),
    fTracklets(0),
    fNEventsTr(0),
    fNEventsVtx(0),
    fOutput(0),
    fUseTracklets(true),
    fDebug(false)
{
  Int_t nBins = 40;
  fHist = new TH2D("Central", "d^{2}N_{ch}/d#etad#phi in central region",
		   nBins, -maxEta, maxEta, 20, 0, 2*TMath::Pi());
  fHist->SetDirectory(0);
  fHist->SetXTitle("#eta");
  fHist->SetYTitle("#phi [radians]");
  fHist->SetZTitle("d^{2}N_{ch}/d#etad#phi");
  fHist->SetStats(0);
  fHist->Sumw2();

  fAll = new TH1D("all", "Central region", nBins, -maxEta, maxEta);
  fAll->SetDirectory(0);
  fAll->SetXTitle("#eta");
  fAll->SetYTitle("dN_{ch}/d#eta");
  fAll->Sumw2();
  fAll->SetFillColor(kGray);
  fAll->SetFillStyle(3001);
  fAll->SetMarkerStyle(28);
  fAll->SetMarkerColor(kGray);
  fAll->SetStats(0);
  
  fGlobal = static_cast<TH1D*>(fAll->Clone("global"));
  fGlobal->SetTitle("Global tracks");
  fGlobal->SetDirectory(0);
  fGlobal->Sumw2();
  fGlobal->SetFillColor(kRed+1);
  fGlobal->SetFillStyle(3001);
  fGlobal->SetMarkerStyle(28);
  fGlobal->SetMarkerColor(kRed+1);
  fGlobal->SetStats(0);

  fITS = static_cast<TH1D*>(fAll->Clone("its"));
  fITS->SetTitle("ITS tracks");
  fITS->SetDirectory(0);
  fITS->Sumw2();
  fITS->SetFillColor(kGreen+1);
  fITS->SetFillStyle(3001);
  fITS->SetMarkerStyle(28);
  fITS->SetMarkerColor(kGreen+1);
  fITS->SetStats(0);

  fTracklets = static_cast<TH1D*>(fAll->Clone("tracklets"));
  fTracklets->SetTitle("SPD tracklets");
  fTracklets->SetDirectory(0);
  fTracklets->Sumw2();
  fTracklets->SetFillColor(kBlue+1);
  fTracklets->SetFillStyle(3001);
  fTracklets->SetMarkerStyle(28);
  fTracklets->SetMarkerColor(kBlue+1);
  fTracklets->SetStats(0);

  fNEventsTr = new TH1D("nEventsTr", 
			"Events per vertex bin", 10, -maxVtx, maxVtx);
  fNEventsTr->SetXTitle("v_{z}");
  fNEventsTr->SetYTitle("Events");
  fNEventsTr->SetDirectory(0);

  fNEventsVtx = new TH1D("nEventsVtx", 
			 "Events per vertex bin", 10, -maxVtx, maxVtx);
  fNEventsVtx->SetXTitle("v_{z}");
  fNEventsVtx->SetYTitle("Events");
  fNEventsVtx->SetDirectory(0);

  // --- Global (ITS+TPC) track quality cuts 
  // TPC  
  fQGlo.SetMinNClustersTPC(70);
  fQGlo.SetMaxChi2PerClusterTPC(4);
  fQGlo.SetAcceptKinkDaughters(kFALSE);
  fQGlo.SetRequireTPCRefit(kTRUE);
  // ITS
  fQGlo.SetRequireITSRefit(kTRUE);
  fQGlo.SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kOff);
  fQGlo.SetEtaRange(-maxEta, maxEta);

  // --- ITS standalone track quality cuts 
  fQITS.SetRequireITSRefit(kTRUE);
  fQITS.SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kOff);
  fQITS.SetEtaRange(-maxEta, maxEta); 

  // -- Distance-of-Closest-Approach cuts for tracks w/ITS hits 
  fDCAwSPD.SetClusterRequirementITS(AliESDtrackCuts::kSPD,
				    AliESDtrackCuts::kAny);
  fDCAwSPD.SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
  fDCAwSPD.SetMaxDCAToVertexZ(0.5);
  fDCAwSPD.SetEtaRange(-maxEta, maxEta);

  // -- Distance-of-Closest-Approach cuts for tracks w/o ITS hits 
  fDCAwoSPD.SetClusterRequirementITS(AliESDtrackCuts::kSPD,
				     AliESDtrackCuts::kNone);
  fDCAwoSPD.SetMaxDCAToVertexXYPtDep("1.5*(0.0182+0.0350/pt^1.01)");
  fDCAwoSPD.SetMaxDCAToVertexZ(0.5);
  fDCAwoSPD.SetEtaRange(-maxEta, maxEta);  

  // -- Primary track cut 
  // https://twiki.cern.ch/twiki/bin/view/ALICE/SelectionOfPrimaryTracksForPpDataAnalysis
  // Quality
  fIsPrimary.SetMinNClustersTPC(70);
  fIsPrimary.SetMaxChi2PerClusterTPC(4);
  fIsPrimary.SetAcceptKinkDaughters(kFALSE);
  fIsPrimary.SetRequireTPCRefit(kTRUE);
  fIsPrimary.SetRequireITSRefit(kTRUE);
  fIsPrimary.SetClusterRequirementITS(AliESDtrackCuts::kSPD,
				      AliESDtrackCuts::kAny);
  //  Dca:
  fIsPrimary.SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
  fIsPrimary.SetMaxDCAToVertexZ(2);
  fIsPrimary.SetDCAToVertex2D(kFALSE);
  fIsPrimary.SetRequireSigmaToVertex(kFALSE);  

  // Output slot #1 writes into a TH1 container
  DefineOutput(1, TList::Class()); 
}

//____________________________________________________________________
inline CentralMultTask::~CentralMultTask()
{
  if (fHist)      delete fHist;
  if (fAll)       delete fAll;
  if (fGlobal)    delete fGlobal;
  if (fITS)       delete fITS;
  if (fTracklets) delete fTracklets;
}

//________________________________________________________________________
inline void 
CentralMultTask::UserCreateOutputObjects()
{
  // Create histograms
  // Called once (on the worker node)

  fOutput = new TList;
  fOutput->SetName(GetName());
  fOutput->SetOwner();

  fOutput->Add(fAll);
  fOutput->Add(fGlobal);
  fOutput->Add(fITS);
  fOutput->Add(fTracklets);
  fOutput->Add(fNEventsTr);
  fOutput->Add(fNEventsVtx);

  AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
  AliAODHandler*      ah = 
    dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
  if (!ah) AliFatal("No AOD output handler set in analysis manager");

  ah->AddBranch("TH2D", &fHist);
  
  // Post data for ALL output slots >0 here, to get at least an empty histogram
  PostData(1, fOutput); 
}

//____________________________________________________________________
inline UShort_t
CentralMultTask::CheckEvent(const AliESDEvent& esd, Double_t& vz)
{
  // Do some fast cuts first
  vz = 0;

  // Get the analysis manager - should always be there 
  AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
  if (!am) { 
    AliWarning("No analysis manager defined!");
    return 0;
  }

  // Get the input handler - should always be there 
  AliInputEventHandler* ih = 
    static_cast<AliInputEventHandler*>(am->GetInputEventHandler());
  if (!ih) { 
    AliWarning("No input handler");
    return 0;
  }

  // Trigger mask 
  UInt_t    mask     = ih->IsEventSelected();   
  Bool_t   isMinBias = (mask == AliVEvent::kMB) ? 1 : 0;
  UShort_t ret       = 0;
  if (isMinBias) ret |= kValidTrigger;
  
  // check for good reconstructed vertex
  if (!(esd.GetPrimaryVertex()->GetStatus())) {
    if (fDebug)
      AliWarning("Primary vertex has bad status");
    return ret;
  }
  if (!(esd.GetPrimaryVertexSPD()->GetStatus())) { 
    if (fDebug)
      AliWarning("Primary SPD vertex has bad status");
    return ret;
  }

  // if vertex is from spd vertexZ, require more stringent cut
  if (esd.GetPrimaryVertex()->IsFromVertexerZ()) {
    if (esd.GetPrimaryVertex()->GetDispersion() > 0.02 ||  
	esd.GetPrimaryVertex()->GetZRes()       > 0.25) {
      if (fDebug)
	AliWarning(Form("Primary vertex dispersion=%f (0.02) zres=%f (0.05)", 
			esd.GetPrimaryVertex()->GetDispersion(),
			esd.GetPrimaryVertex()->GetZRes()));
      return ret;
    }
  }
  // One can add a cut on the vertex z position here
  vz = esd.GetPrimaryVertex()->GetZ();
  Double_t vl = fNEventsVtx->GetXaxis()->GetXmin();
  Double_t vh = fNEventsVtx->GetXaxis()->GetXmax();
  if (vz <  vl || vz > vh) {
    if (fDebug)
      AliWarning(Form("Primary vertex vz=%f out of range [%f,%f]", vz, vl, vh));
    return ret; 
  }
  ret |= kValidVertex;

  return ret;
}

//____________________________________________________________________
inline void 
CentralMultTask::UserExec(Option_t *) 
{
  // Main loop
  AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
  if (!esd) {
    AliError("Cannot get the ESD event");
    return;
  }  

  fHist->Reset();

  // Check event 
  Double_t vz         = 0;
  UShort_t eventFlags = CheckEvent(*esd, vz);
  if (!(eventFlags & kValidTrigger)) 
    return; // No trigger
  else {
    fNEventsTr->Fill(vz);
    if (eventFlags & kValidVertex) 
      fNEventsVtx->Fill(vz);
    else 
      return; // No trigger or no vertex
  }
  

  // flags for secondary and rejected tracks
  // set this bit in ESD tracks if it is rejected by a cut
  const int kRejBit = BIT(15); 
  // set this bit in ESD tracks if it is secondary according to a cut
  const int kSecBit = BIT(16); 

  Int_t total      = 0;
  Int_t nESDTracks = esd->GetNumberOfTracks();
  // Loop over ESD tracks 
  for(Int_t i = 0; i < nESDTracks; i++){ // flag the tracks

    AliESDtrack* track = esd->GetTrack(i);
    
    // if track is a secondary from a V0, flag as a secondary
    if (track->IsOn(AliESDtrack::kMultInV0)) {
      track->SetBit(kSecBit); 
      continue;
    } 

    Double_t eta = track->Eta();
    Double_t phi = track->Phi();
    // check tracks with ITS part
    if (track->IsOn(AliESDtrack::kITSin)) {

      // Check ITS pure stand-alone - and if it is, reject it 
      if (track->IsOn(AliESDtrack::kITSpureSA)) {
	track->SetBit(kRejBit);
	continue;
      }

      // Check DCA - if not close enough reject it as secondary 
      if (!fDCAwSPD.AcceptTrack(track) && 
	  !fDCAwoSPD.AcceptTrack(track)) {
	track->SetBit(kSecBit); 
	continue;
      }

      // Check if this is an ITS complementary - no TPC in
      if (!track->IsOn(AliESDtrack::kTPCin)) { 
	if (fQITS.AcceptTrack(track)) { // Check ITS quality 
	  fITS->Fill(eta);
	  fAll->Fill(eta);
	}
	else 
	  track->SetBit(kRejBit);
      }
      else { // Not ITS SA or TPC+ITS
	if (fQGlo.AcceptTrack(track)) { // Check ITS quality 
	  fGlobal->Fill(eta);
	  fAll->Fill(eta);
	}
	else 
	  track->SetBit(kRejBit);
      }
      if (track->IsOn(kSecBit) || track->IsOn(kRejBit)) continue;

      // fill d2n/detadphi
      fHist->Fill(eta, phi);
    }
  }
  
  // Get multiplicity from SPD tracklets 
  const AliMultiplicity* spdmult = esd->GetMultiplicity();
  for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i){
    // if counting tracks+tracklets, 
    // check if clusters were already used in tracks
    Int_t id1,id2;
    spdmult->GetTrackletTrackIDs(i,0,id1,id2);
    AliESDtrack* tr1 = id1>=0 ? esd->GetTrack(id1) : 0;
    AliESDtrack* tr2 = id2>=0 ? esd->GetTrack(id2) : 0;
    //
    if ((tr1 && tr1->TestBit(kSecBit))  || // Flagged as secondary
	(tr2 && tr2->TestBit(kSecBit))  || // Flagged as secondary
	(tr1 && !tr1->TestBit(kRejBit)) || // already accounted for
	(tr2 && !tr2->TestBit(kRejBit)))   // already accounted for 
      continue; 
    ++total;
    Double_t eta = spdmult->GetEta(i);
    Double_t phi = spdmult->GetPhi(i);
    
    // Increment d2n/detadphi from an SPD tracklet 
    if (fUseTracklets) {
      fHist->Fill(eta, phi);
      fAll->Fill(eta);
      total++;
    }
    fTracklets->Fill(eta);
  }
  if (fDebug) AliInfo(Form("A total of %d tracks", total));

  // NEW HISTO should be filled before this point, as PostData puts the
  // information for this iteration of the UserExec in the container
  PostData(1, fOutput);
}

  
//________________________________________________________________________
inline void 
CentralMultTask::Terminate(Option_t *) 
{
  // Draw result to screen, or perform fitting, normalizations Called
  // once at the end of the query
        
  fOutput = dynamic_cast<TList*> (GetOutputData(1));
  if(!fOutput) {
    AliError("Could not retrieve TList fOutput"); 
    return; 
  }

  TH1D* all       = static_cast<TH1D*>(fOutput->FindObject("all"));
  TH1D* global    = static_cast<TH1D*>(fOutput->FindObject("global"));
  TH1D* its       = static_cast<TH1D*>(fOutput->FindObject("its"));
  TH1D* tracklets = static_cast<TH1D*>(fOutput->FindObject("tracklets"));
  TH1D* eventsTr  = static_cast<TH1D*>(fOutput->FindObject("nEventsTr"));
  TH1D* eventsVtx = static_cast<TH1D*>(fOutput->FindObject("nEventsVtx"));

  Int_t nTriggers  = eventsTr->GetEntries();
  Int_t nVertex    = eventsVtx->GetEntries();
  if (nTriggers <= 0 || nVertex <= 0) {
    AliWarning("No data in the events histogram!");
    nTriggers = 1;
  }

  all      ->Scale(1. / nTriggers, "width");
  global   ->Scale(1. / nTriggers, "width");
  its      ->Scale(1. / nTriggers, "width");
  tracklets->Scale(1. / nTriggers, "width");

  THStack* stack = new THStack("components", "Components");
  if (fUseTracklets) stack->Add(tracklets);
  stack->Add(global);
  stack->Add(its);

  fOutput->Add(stack);
}

//========================================================================
/** 
 * Add task to do central dN/deta from tracks/tracklets 
 * 
 * @deprecated This function is deprecated 
 * @return Newly created task
 */
inline AliAnalysisTask*
AddTaskCentralTracks()
{
  // analysis manager
  AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
  
  // Make our object.  2nd argumenent is absolute max Eta 
  // 3rd argument is absolute max Vz
  CentralMultTask* task = new CentralMultTask("Global", 2, 10);
  // if physics selection performed in UserExec(),
  // this line should be commented 
  // task->SelectCollisionCandidates(AliVEvent::kMB); 
  mgr->AddTask(task);

  // create containers for input/output
  AliAnalysisDataContainer *output = 
    mgr->CreateContainer("Central", TList::Class(), 
			 AliAnalysisManager::kOutputContainer, 
			 AliAnalysisManager::GetCommonFileName());
  
  // connect input/output
  mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
  mgr->ConnectOutput(task, 1, output);

  return task;
}

  
//________________________________________________________________________
//
// EOF
// 
 AddTaskCentralTracks.C:1
 AddTaskCentralTracks.C:2
 AddTaskCentralTracks.C:3
 AddTaskCentralTracks.C:4
 AddTaskCentralTracks.C:5
 AddTaskCentralTracks.C:6
 AddTaskCentralTracks.C:7
 AddTaskCentralTracks.C:8
 AddTaskCentralTracks.C:9
 AddTaskCentralTracks.C:10
 AddTaskCentralTracks.C:11
 AddTaskCentralTracks.C:12
 AddTaskCentralTracks.C:13
 AddTaskCentralTracks.C:14
 AddTaskCentralTracks.C:15
 AddTaskCentralTracks.C:16
 AddTaskCentralTracks.C:17
 AddTaskCentralTracks.C:18
 AddTaskCentralTracks.C:19
 AddTaskCentralTracks.C:20
 AddTaskCentralTracks.C:21
 AddTaskCentralTracks.C:22
 AddTaskCentralTracks.C:23
 AddTaskCentralTracks.C:24
 AddTaskCentralTracks.C:25
 AddTaskCentralTracks.C:26
 AddTaskCentralTracks.C:27
 AddTaskCentralTracks.C:28
 AddTaskCentralTracks.C:29
 AddTaskCentralTracks.C:30
 AddTaskCentralTracks.C:31
 AddTaskCentralTracks.C:32
 AddTaskCentralTracks.C:33
 AddTaskCentralTracks.C:34
 AddTaskCentralTracks.C:35
 AddTaskCentralTracks.C:36
 AddTaskCentralTracks.C:37
 AddTaskCentralTracks.C:38
 AddTaskCentralTracks.C:39
 AddTaskCentralTracks.C:40
 AddTaskCentralTracks.C:41
 AddTaskCentralTracks.C:42
 AddTaskCentralTracks.C:43
 AddTaskCentralTracks.C:44
 AddTaskCentralTracks.C:45
 AddTaskCentralTracks.C:46
 AddTaskCentralTracks.C:47
 AddTaskCentralTracks.C:48
 AddTaskCentralTracks.C:49
 AddTaskCentralTracks.C:50
 AddTaskCentralTracks.C:51
 AddTaskCentralTracks.C:52
 AddTaskCentralTracks.C:53
 AddTaskCentralTracks.C:54
 AddTaskCentralTracks.C:55
 AddTaskCentralTracks.C:56
 AddTaskCentralTracks.C:57
 AddTaskCentralTracks.C:58
 AddTaskCentralTracks.C:59
 AddTaskCentralTracks.C:60
 AddTaskCentralTracks.C:61
 AddTaskCentralTracks.C:62
 AddTaskCentralTracks.C:63
 AddTaskCentralTracks.C:64
 AddTaskCentralTracks.C:65
 AddTaskCentralTracks.C:66
 AddTaskCentralTracks.C:67
 AddTaskCentralTracks.C:68
 AddTaskCentralTracks.C:69
 AddTaskCentralTracks.C:70
 AddTaskCentralTracks.C:71
 AddTaskCentralTracks.C:72
 AddTaskCentralTracks.C:73
 AddTaskCentralTracks.C:74
 AddTaskCentralTracks.C:75
 AddTaskCentralTracks.C:76
 AddTaskCentralTracks.C:77
 AddTaskCentralTracks.C:78
 AddTaskCentralTracks.C:79
 AddTaskCentralTracks.C:80
 AddTaskCentralTracks.C:81
 AddTaskCentralTracks.C:82
 AddTaskCentralTracks.C:83
 AddTaskCentralTracks.C:84
 AddTaskCentralTracks.C:85
 AddTaskCentralTracks.C:86
 AddTaskCentralTracks.C:87
 AddTaskCentralTracks.C:88
 AddTaskCentralTracks.C:89
 AddTaskCentralTracks.C:90
 AddTaskCentralTracks.C:91
 AddTaskCentralTracks.C:92
 AddTaskCentralTracks.C:93
 AddTaskCentralTracks.C:94
 AddTaskCentralTracks.C:95
 AddTaskCentralTracks.C:96
 AddTaskCentralTracks.C:97
 AddTaskCentralTracks.C:98
 AddTaskCentralTracks.C:99
 AddTaskCentralTracks.C:100
 AddTaskCentralTracks.C:101
 AddTaskCentralTracks.C:102
 AddTaskCentralTracks.C:103
 AddTaskCentralTracks.C:104
 AddTaskCentralTracks.C:105
 AddTaskCentralTracks.C:106
 AddTaskCentralTracks.C:107
 AddTaskCentralTracks.C:108
 AddTaskCentralTracks.C:109
 AddTaskCentralTracks.C:110
 AddTaskCentralTracks.C:111
 AddTaskCentralTracks.C:112
 AddTaskCentralTracks.C:113
 AddTaskCentralTracks.C:114
 AddTaskCentralTracks.C:115
 AddTaskCentralTracks.C:116
 AddTaskCentralTracks.C:117
 AddTaskCentralTracks.C:118
 AddTaskCentralTracks.C:119
 AddTaskCentralTracks.C:120
 AddTaskCentralTracks.C:121
 AddTaskCentralTracks.C:122
 AddTaskCentralTracks.C:123
 AddTaskCentralTracks.C:124
 AddTaskCentralTracks.C:125
 AddTaskCentralTracks.C:126
 AddTaskCentralTracks.C:127
 AddTaskCentralTracks.C:128
 AddTaskCentralTracks.C:129
 AddTaskCentralTracks.C:130
 AddTaskCentralTracks.C:131
 AddTaskCentralTracks.C:132
 AddTaskCentralTracks.C:133
 AddTaskCentralTracks.C:134
 AddTaskCentralTracks.C:135
 AddTaskCentralTracks.C:136
 AddTaskCentralTracks.C:137
 AddTaskCentralTracks.C:138
 AddTaskCentralTracks.C:139
 AddTaskCentralTracks.C:140
 AddTaskCentralTracks.C:141
 AddTaskCentralTracks.C:142
 AddTaskCentralTracks.C:143
 AddTaskCentralTracks.C:144
 AddTaskCentralTracks.C:145
 AddTaskCentralTracks.C:146
 AddTaskCentralTracks.C:147
 AddTaskCentralTracks.C:148
 AddTaskCentralTracks.C:149
 AddTaskCentralTracks.C:150
 AddTaskCentralTracks.C:151
 AddTaskCentralTracks.C:152
 AddTaskCentralTracks.C:153
 AddTaskCentralTracks.C:154
 AddTaskCentralTracks.C:155
 AddTaskCentralTracks.C:156
 AddTaskCentralTracks.C:157
 AddTaskCentralTracks.C:158
 AddTaskCentralTracks.C:159
 AddTaskCentralTracks.C:160
 AddTaskCentralTracks.C:161
 AddTaskCentralTracks.C:162
 AddTaskCentralTracks.C:163
 AddTaskCentralTracks.C:164
 AddTaskCentralTracks.C:165
 AddTaskCentralTracks.C:166
 AddTaskCentralTracks.C:167
 AddTaskCentralTracks.C:168
 AddTaskCentralTracks.C:169
 AddTaskCentralTracks.C:170
 AddTaskCentralTracks.C:171
 AddTaskCentralTracks.C:172
 AddTaskCentralTracks.C:173
 AddTaskCentralTracks.C:174
 AddTaskCentralTracks.C:175
 AddTaskCentralTracks.C:176
 AddTaskCentralTracks.C:177
 AddTaskCentralTracks.C:178
 AddTaskCentralTracks.C:179
 AddTaskCentralTracks.C:180
 AddTaskCentralTracks.C:181
 AddTaskCentralTracks.C:182
 AddTaskCentralTracks.C:183
 AddTaskCentralTracks.C:184
 AddTaskCentralTracks.C:185
 AddTaskCentralTracks.C:186
 AddTaskCentralTracks.C:187
 AddTaskCentralTracks.C:188
 AddTaskCentralTracks.C:189
 AddTaskCentralTracks.C:190
 AddTaskCentralTracks.C:191
 AddTaskCentralTracks.C:192
 AddTaskCentralTracks.C:193
 AddTaskCentralTracks.C:194
 AddTaskCentralTracks.C:195
 AddTaskCentralTracks.C:196
 AddTaskCentralTracks.C:197
 AddTaskCentralTracks.C:198
 AddTaskCentralTracks.C:199
 AddTaskCentralTracks.C:200
 AddTaskCentralTracks.C:201
 AddTaskCentralTracks.C:202
 AddTaskCentralTracks.C:203
 AddTaskCentralTracks.C:204
 AddTaskCentralTracks.C:205
 AddTaskCentralTracks.C:206
 AddTaskCentralTracks.C:207
 AddTaskCentralTracks.C:208
 AddTaskCentralTracks.C:209
 AddTaskCentralTracks.C:210
 AddTaskCentralTracks.C:211
 AddTaskCentralTracks.C:212
 AddTaskCentralTracks.C:213
 AddTaskCentralTracks.C:214
 AddTaskCentralTracks.C:215
 AddTaskCentralTracks.C:216
 AddTaskCentralTracks.C:217
 AddTaskCentralTracks.C:218
 AddTaskCentralTracks.C:219
 AddTaskCentralTracks.C:220
 AddTaskCentralTracks.C:221
 AddTaskCentralTracks.C:222
 AddTaskCentralTracks.C:223
 AddTaskCentralTracks.C:224
 AddTaskCentralTracks.C:225
 AddTaskCentralTracks.C:226
 AddTaskCentralTracks.C:227
 AddTaskCentralTracks.C:228
 AddTaskCentralTracks.C:229
 AddTaskCentralTracks.C:230
 AddTaskCentralTracks.C:231
 AddTaskCentralTracks.C:232
 AddTaskCentralTracks.C:233
 AddTaskCentralTracks.C:234
 AddTaskCentralTracks.C:235
 AddTaskCentralTracks.C:236
 AddTaskCentralTracks.C:237
 AddTaskCentralTracks.C:238
 AddTaskCentralTracks.C:239
 AddTaskCentralTracks.C:240
 AddTaskCentralTracks.C:241
 AddTaskCentralTracks.C:242
 AddTaskCentralTracks.C:243
 AddTaskCentralTracks.C:244
 AddTaskCentralTracks.C:245
 AddTaskCentralTracks.C:246
 AddTaskCentralTracks.C:247
 AddTaskCentralTracks.C:248
 AddTaskCentralTracks.C:249
 AddTaskCentralTracks.C:250
 AddTaskCentralTracks.C:251
 AddTaskCentralTracks.C:252
 AddTaskCentralTracks.C:253
 AddTaskCentralTracks.C:254
 AddTaskCentralTracks.C:255
 AddTaskCentralTracks.C:256
 AddTaskCentralTracks.C:257
 AddTaskCentralTracks.C:258
 AddTaskCentralTracks.C:259
 AddTaskCentralTracks.C:260
 AddTaskCentralTracks.C:261
 AddTaskCentralTracks.C:262
 AddTaskCentralTracks.C:263
 AddTaskCentralTracks.C:264
 AddTaskCentralTracks.C:265
 AddTaskCentralTracks.C:266
 AddTaskCentralTracks.C:267
 AddTaskCentralTracks.C:268
 AddTaskCentralTracks.C:269
 AddTaskCentralTracks.C:270
 AddTaskCentralTracks.C:271
 AddTaskCentralTracks.C:272
 AddTaskCentralTracks.C:273
 AddTaskCentralTracks.C:274
 AddTaskCentralTracks.C:275
 AddTaskCentralTracks.C:276
 AddTaskCentralTracks.C:277
 AddTaskCentralTracks.C:278
 AddTaskCentralTracks.C:279
 AddTaskCentralTracks.C:280
 AddTaskCentralTracks.C:281
 AddTaskCentralTracks.C:282
 AddTaskCentralTracks.C:283
 AddTaskCentralTracks.C:284
 AddTaskCentralTracks.C:285
 AddTaskCentralTracks.C:286
 AddTaskCentralTracks.C:287
 AddTaskCentralTracks.C:288
 AddTaskCentralTracks.C:289
 AddTaskCentralTracks.C:290
 AddTaskCentralTracks.C:291
 AddTaskCentralTracks.C:292
 AddTaskCentralTracks.C:293
 AddTaskCentralTracks.C:294
 AddTaskCentralTracks.C:295
 AddTaskCentralTracks.C:296
 AddTaskCentralTracks.C:297
 AddTaskCentralTracks.C:298
 AddTaskCentralTracks.C:299
 AddTaskCentralTracks.C:300
 AddTaskCentralTracks.C:301
 AddTaskCentralTracks.C:302
 AddTaskCentralTracks.C:303
 AddTaskCentralTracks.C:304
 AddTaskCentralTracks.C:305
 AddTaskCentralTracks.C:306
 AddTaskCentralTracks.C:307
 AddTaskCentralTracks.C:308
 AddTaskCentralTracks.C:309
 AddTaskCentralTracks.C:310
 AddTaskCentralTracks.C:311
 AddTaskCentralTracks.C:312
 AddTaskCentralTracks.C:313
 AddTaskCentralTracks.C:314
 AddTaskCentralTracks.C:315
 AddTaskCentralTracks.C:316
 AddTaskCentralTracks.C:317
 AddTaskCentralTracks.C:318
 AddTaskCentralTracks.C:319
 AddTaskCentralTracks.C:320
 AddTaskCentralTracks.C:321
 AddTaskCentralTracks.C:322
 AddTaskCentralTracks.C:323
 AddTaskCentralTracks.C:324
 AddTaskCentralTracks.C:325
 AddTaskCentralTracks.C:326
 AddTaskCentralTracks.C:327
 AddTaskCentralTracks.C:328
 AddTaskCentralTracks.C:329
 AddTaskCentralTracks.C:330
 AddTaskCentralTracks.C:331
 AddTaskCentralTracks.C:332
 AddTaskCentralTracks.C:333
 AddTaskCentralTracks.C:334
 AddTaskCentralTracks.C:335
 AddTaskCentralTracks.C:336
 AddTaskCentralTracks.C:337
 AddTaskCentralTracks.C:338
 AddTaskCentralTracks.C:339
 AddTaskCentralTracks.C:340
 AddTaskCentralTracks.C:341
 AddTaskCentralTracks.C:342
 AddTaskCentralTracks.C:343
 AddTaskCentralTracks.C:344
 AddTaskCentralTracks.C:345
 AddTaskCentralTracks.C:346
 AddTaskCentralTracks.C:347
 AddTaskCentralTracks.C:348
 AddTaskCentralTracks.C:349
 AddTaskCentralTracks.C:350
 AddTaskCentralTracks.C:351
 AddTaskCentralTracks.C:352
 AddTaskCentralTracks.C:353
 AddTaskCentralTracks.C:354
 AddTaskCentralTracks.C:355
 AddTaskCentralTracks.C:356
 AddTaskCentralTracks.C:357
 AddTaskCentralTracks.C:358
 AddTaskCentralTracks.C:359
 AddTaskCentralTracks.C:360
 AddTaskCentralTracks.C:361
 AddTaskCentralTracks.C:362
 AddTaskCentralTracks.C:363
 AddTaskCentralTracks.C:364
 AddTaskCentralTracks.C:365
 AddTaskCentralTracks.C:366
 AddTaskCentralTracks.C:367
 AddTaskCentralTracks.C:368
 AddTaskCentralTracks.C:369
 AddTaskCentralTracks.C:370
 AddTaskCentralTracks.C:371
 AddTaskCentralTracks.C:372
 AddTaskCentralTracks.C:373
 AddTaskCentralTracks.C:374
 AddTaskCentralTracks.C:375
 AddTaskCentralTracks.C:376
 AddTaskCentralTracks.C:377
 AddTaskCentralTracks.C:378
 AddTaskCentralTracks.C:379
 AddTaskCentralTracks.C:380
 AddTaskCentralTracks.C:381
 AddTaskCentralTracks.C:382
 AddTaskCentralTracks.C:383
 AddTaskCentralTracks.C:384
 AddTaskCentralTracks.C:385
 AddTaskCentralTracks.C:386
 AddTaskCentralTracks.C:387
 AddTaskCentralTracks.C:388
 AddTaskCentralTracks.C:389
 AddTaskCentralTracks.C:390
 AddTaskCentralTracks.C:391
 AddTaskCentralTracks.C:392
 AddTaskCentralTracks.C:393
 AddTaskCentralTracks.C:394
 AddTaskCentralTracks.C:395
 AddTaskCentralTracks.C:396
 AddTaskCentralTracks.C:397
 AddTaskCentralTracks.C:398
 AddTaskCentralTracks.C:399
 AddTaskCentralTracks.C:400
 AddTaskCentralTracks.C:401
 AddTaskCentralTracks.C:402
 AddTaskCentralTracks.C:403
 AddTaskCentralTracks.C:404
 AddTaskCentralTracks.C:405
 AddTaskCentralTracks.C:406
 AddTaskCentralTracks.C:407
 AddTaskCentralTracks.C:408
 AddTaskCentralTracks.C:409
 AddTaskCentralTracks.C:410
 AddTaskCentralTracks.C:411
 AddTaskCentralTracks.C:412
 AddTaskCentralTracks.C:413
 AddTaskCentralTracks.C:414
 AddTaskCentralTracks.C:415
 AddTaskCentralTracks.C:416
 AddTaskCentralTracks.C:417
 AddTaskCentralTracks.C:418
 AddTaskCentralTracks.C:419
 AddTaskCentralTracks.C:420
 AddTaskCentralTracks.C:421
 AddTaskCentralTracks.C:422
 AddTaskCentralTracks.C:423
 AddTaskCentralTracks.C:424
 AddTaskCentralTracks.C:425
 AddTaskCentralTracks.C:426
 AddTaskCentralTracks.C:427
 AddTaskCentralTracks.C:428
 AddTaskCentralTracks.C:429
 AddTaskCentralTracks.C:430
 AddTaskCentralTracks.C:431
 AddTaskCentralTracks.C:432
 AddTaskCentralTracks.C:433
 AddTaskCentralTracks.C:434
 AddTaskCentralTracks.C:435
 AddTaskCentralTracks.C:436
 AddTaskCentralTracks.C:437
 AddTaskCentralTracks.C:438
 AddTaskCentralTracks.C:439
 AddTaskCentralTracks.C:440
 AddTaskCentralTracks.C:441
 AddTaskCentralTracks.C:442
 AddTaskCentralTracks.C:443
 AddTaskCentralTracks.C:444
 AddTaskCentralTracks.C:445
 AddTaskCentralTracks.C:446
 AddTaskCentralTracks.C:447
 AddTaskCentralTracks.C:448
 AddTaskCentralTracks.C:449
 AddTaskCentralTracks.C:450
 AddTaskCentralTracks.C:451
 AddTaskCentralTracks.C:452
 AddTaskCentralTracks.C:453
 AddTaskCentralTracks.C:454
 AddTaskCentralTracks.C:455
 AddTaskCentralTracks.C:456
 AddTaskCentralTracks.C:457
 AddTaskCentralTracks.C:458
 AddTaskCentralTracks.C:459
 AddTaskCentralTracks.C:460
 AddTaskCentralTracks.C:461
 AddTaskCentralTracks.C:462
 AddTaskCentralTracks.C:463
 AddTaskCentralTracks.C:464
 AddTaskCentralTracks.C:465
 AddTaskCentralTracks.C:466
 AddTaskCentralTracks.C:467
 AddTaskCentralTracks.C:468
 AddTaskCentralTracks.C:469
 AddTaskCentralTracks.C:470
 AddTaskCentralTracks.C:471
 AddTaskCentralTracks.C:472
 AddTaskCentralTracks.C:473
 AddTaskCentralTracks.C:474
 AddTaskCentralTracks.C:475
 AddTaskCentralTracks.C:476
 AddTaskCentralTracks.C:477
 AddTaskCentralTracks.C:478
 AddTaskCentralTracks.C:479
 AddTaskCentralTracks.C:480
 AddTaskCentralTracks.C:481
 AddTaskCentralTracks.C:482
 AddTaskCentralTracks.C:483
 AddTaskCentralTracks.C:484
 AddTaskCentralTracks.C:485
 AddTaskCentralTracks.C:486
 AddTaskCentralTracks.C:487
 AddTaskCentralTracks.C:488
 AddTaskCentralTracks.C:489
 AddTaskCentralTracks.C:490
 AddTaskCentralTracks.C:491
 AddTaskCentralTracks.C:492
 AddTaskCentralTracks.C:493
 AddTaskCentralTracks.C:494
 AddTaskCentralTracks.C:495
 AddTaskCentralTracks.C:496
 AddTaskCentralTracks.C:497
 AddTaskCentralTracks.C:498
 AddTaskCentralTracks.C:499
 AddTaskCentralTracks.C:500
 AddTaskCentralTracks.C:501
 AddTaskCentralTracks.C:502
 AddTaskCentralTracks.C:503
 AddTaskCentralTracks.C:504
 AddTaskCentralTracks.C:505
 AddTaskCentralTracks.C:506
 AddTaskCentralTracks.C:507
 AddTaskCentralTracks.C:508
 AddTaskCentralTracks.C:509
 AddTaskCentralTracks.C:510
 AddTaskCentralTracks.C:511
 AddTaskCentralTracks.C:512
 AddTaskCentralTracks.C:513
 AddTaskCentralTracks.C:514
 AddTaskCentralTracks.C:515
 AddTaskCentralTracks.C:516
 AddTaskCentralTracks.C:517
 AddTaskCentralTracks.C:518
 AddTaskCentralTracks.C:519
 AddTaskCentralTracks.C:520
 AddTaskCentralTracks.C:521
 AddTaskCentralTracks.C:522
 AddTaskCentralTracks.C:523
 AddTaskCentralTracks.C:524
 AddTaskCentralTracks.C:525
 AddTaskCentralTracks.C:526
 AddTaskCentralTracks.C:527
 AddTaskCentralTracks.C:528
 AddTaskCentralTracks.C:529
 AddTaskCentralTracks.C:530
 AddTaskCentralTracks.C:531
 AddTaskCentralTracks.C:532
 AddTaskCentralTracks.C:533
 AddTaskCentralTracks.C:534
 AddTaskCentralTracks.C:535
 AddTaskCentralTracks.C:536
 AddTaskCentralTracks.C:537
 AddTaskCentralTracks.C:538
 AddTaskCentralTracks.C:539
 AddTaskCentralTracks.C:540
 AddTaskCentralTracks.C:541
 AddTaskCentralTracks.C:542
 AddTaskCentralTracks.C:543
 AddTaskCentralTracks.C:544
 AddTaskCentralTracks.C:545
 AddTaskCentralTracks.C:546
 AddTaskCentralTracks.C:547
 AddTaskCentralTracks.C:548
 AddTaskCentralTracks.C:549
 AddTaskCentralTracks.C:550
 AddTaskCentralTracks.C:551
 AddTaskCentralTracks.C:552
 AddTaskCentralTracks.C:553
 AddTaskCentralTracks.C:554
 AddTaskCentralTracks.C:555
 AddTaskCentralTracks.C:556
 AddTaskCentralTracks.C:557
 AddTaskCentralTracks.C:558
 AddTaskCentralTracks.C:559
 AddTaskCentralTracks.C:560
 AddTaskCentralTracks.C:561
 AddTaskCentralTracks.C:562
 AddTaskCentralTracks.C:563
 AddTaskCentralTracks.C:564
 AddTaskCentralTracks.C:565
 AddTaskCentralTracks.C:566
 AddTaskCentralTracks.C:567
 AddTaskCentralTracks.C:568
 AddTaskCentralTracks.C:569
 AddTaskCentralTracks.C:570
 AddTaskCentralTracks.C:571
 AddTaskCentralTracks.C:572
 AddTaskCentralTracks.C:573
 AddTaskCentralTracks.C:574
 AddTaskCentralTracks.C:575
 AddTaskCentralTracks.C:576
 AddTaskCentralTracks.C:577
 AddTaskCentralTracks.C:578
 AddTaskCentralTracks.C:579
 AddTaskCentralTracks.C:580
 AddTaskCentralTracks.C:581
 AddTaskCentralTracks.C:582
 AddTaskCentralTracks.C:583
 AddTaskCentralTracks.C:584
 AddTaskCentralTracks.C:585
 AddTaskCentralTracks.C:586
 AddTaskCentralTracks.C:587
 AddTaskCentralTracks.C:588
 AddTaskCentralTracks.C:589
 AddTaskCentralTracks.C:590
 AddTaskCentralTracks.C:591
 AddTaskCentralTracks.C:592
 AddTaskCentralTracks.C:593
 AddTaskCentralTracks.C:594
 AddTaskCentralTracks.C:595
 AddTaskCentralTracks.C:596
 AddTaskCentralTracks.C:597
 AddTaskCentralTracks.C:598
 AddTaskCentralTracks.C:599
 AddTaskCentralTracks.C:600
 AddTaskCentralTracks.C:601
 AddTaskCentralTracks.C:602
 AddTaskCentralTracks.C:603
 AddTaskCentralTracks.C:604
 AddTaskCentralTracks.C:605
 AddTaskCentralTracks.C:606
 AddTaskCentralTracks.C:607
 AddTaskCentralTracks.C:608
 AddTaskCentralTracks.C:609
 AddTaskCentralTracks.C:610
 AddTaskCentralTracks.C:611
 AddTaskCentralTracks.C:612
 AddTaskCentralTracks.C:613
 AddTaskCentralTracks.C:614
 AddTaskCentralTracks.C:615
 AddTaskCentralTracks.C:616
 AddTaskCentralTracks.C:617
 AddTaskCentralTracks.C:618
 AddTaskCentralTracks.C:619
 AddTaskCentralTracks.C:620
 AddTaskCentralTracks.C:621
 AddTaskCentralTracks.C:622
 AddTaskCentralTracks.C:623
 AddTaskCentralTracks.C:624
 AddTaskCentralTracks.C:625
 AddTaskCentralTracks.C:626
 AddTaskCentralTracks.C:627
 AddTaskCentralTracks.C:628
 AddTaskCentralTracks.C:629
 AddTaskCentralTracks.C:630
 AddTaskCentralTracks.C:631
 AddTaskCentralTracks.C:632
 AddTaskCentralTracks.C:633
 AddTaskCentralTracks.C:634
 AddTaskCentralTracks.C:635
 AddTaskCentralTracks.C:636