ROOT logo
///////////////////////////////////////////////////////////////////////////////
// Macro to setup AliPerformanceTask for either 
// HLT or offline TPC performance QA to run on PWGPP QA train. 
//
// Input: ESDs, ESDfriends (optional), Kinematics (optional), TrackRefs (optional)
// ESD and MC input handlers must be attached to AliAnalysisManager
// to run default configuration. 
//
// By default 7 performance components are added to 
// the task: 
// 1. AliPerformanceRes (TPC track resolution w.r.t MC at DCA)
// 2. AliPerformanceResTPCInner (TPC track resolution w.r.t MC at inner TPC wall)
// 3. AliPerformanceResTPCOuter (TPC track resolution w.r.t MC at outer TPC wall)
// 4. AliPerformanceEff (TPC track reconstruction efficiency, MC primaries)
// 5. AliPerformanceDEdxTPCInner (TPC dEdx response - track parameters at TPC inner wall)
// 6. AliPerformanceDCA (TPC impact parameters resolution at DCA)
// 7. AliPerformanceTPC (TPC cluster and track and event information)
// 8. AliPerformanceMatch (TPC and ITS/TRD matching and TPC eff w.r.t ITS)
//
// Usage on the analysis train (default configuration):
// gSystem->Load("libANALYSIS");
// gSystem->Load("libANALYSISalice");
// gSystem->Load("libTPCcalib.so");
// gSystem->Load("libTENDER.so");
// gSystem->Load("libPWGPP.so");
//
// gROOT->LoadMacro("$ALICE_ROOT/HLT/QA/tasks/macros/AddTaskPerformanceTPC.C");
// AliPerformanceTask *tpcQA = AddTaskPerformanceTPC("kTRUE","kTRUE", "kTRUE"ΒΈ"triggerClass"); 
// 
// Output:
// HLTTPC.Performance.root file with HLT TPC performance components 
// or 
// TPC.Performance.root file with TPC performance components 
//
// Each of the components contains THnSparse generic histograms which 
// have to be analysed (post-analysis) by using Analyse() function. 
// Each component contains such function.
//
//01-09.10 -  J.Otwinowski@gsi.de, jochen@thaeder.de, hege.erdal@ift.uib.no
///////////////////////////////////////////////////////////////////////////////

//__________________________________________________________________________________________________
AliPerformanceTask* AddTaskPerformance(Bool_t bUseMCInfo=kTRUE,
				       Bool_t bUseESDfriend=kTRUE,
				       Bool_t bUseHLT = kFALSE,
				       const char *triggerClass=0) {
  //					const char *triggerClass="CINT1B-ABCE-NOPF-ALL") {
  //
  // Add AliPerformanceTask with HLT/TPC performance components
  //
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if(!mgr) { 
    Error("AddTaskPerformance","AliAnalysisManager not set!");
    return NULL;
  }
  
  TString type = mgr->GetInputEventHandler()->GetDataType();
  if (!type.Contains("ESD")) {
    Error("AddTaskPerformance", "ESD input handler needed!");
    return NULL;
  }
  
  AliMCEventHandler *mcH = (AliMCEventHandler*)mgr->GetMCtruthEventHandler();
  if (!mcH && bUseMCInfo) {
    Error("AddTaskPerformance", "MC input handler needed!");
    return NULL;
  }

  //============= Add HLT ESD ================================================================
  if(bUseHLT){
    AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(mgr->GetInputEventHandler());
    esdH->SetReadHLT();
  }
  //==========================================================================================

  //
  // Create task -----------------------------------------------------------------------------------
  //
  if(bUseHLT)
    AliPerformanceTask *task = new AliPerformanceTask("Performance","HLT TPC Performance");
  else
    AliPerformanceTask *task = new AliPerformanceTask("Performance","TPC Performance");

  if (!task) {
    Error("AddTaskPerformance", "Performance task cannot be created!");
    return NULL;
  }

  task->SelectCollisionCandidates();
  task->SetUseMCInfo(bUseMCInfo);
  task->SetUseESDfriend(bUseESDfriend);
  task->SetUseTerminate(kFALSE);
  task->SetUseHLT(bUseHLT);
  //
  // Add task to analysis manager ------------------------------------------------------------------
  //
  
  mgr->AddTask(task);

  //================================================================================================
  // -- Cuts
  //================================================================================================

  //
  // Create TPC-ESD track reconstruction cuts ------------------------------------------------------
  // MB tracks
  //

  AliRecInfoCuts *pRecInfoCutsTPC = new AliRecInfoCuts(); 
  if(pRecInfoCutsTPC) {
    //    pRecInfoCutsTPC->SetMaxDCAToVertexXY(3.0);
    //    pRecInfoCutsTPC->SetMaxDCAToVertexZ(30.0);
    pRecInfoCutsTPC->SetMaxDCAToVertexXY(150.0);
    pRecInfoCutsTPC->SetMaxDCAToVertexZ(150.0);
    pRecInfoCutsTPC->SetRequireSigmaToVertex(kFALSE);
    pRecInfoCutsTPC->SetRequireTPCRefit(kFALSE);

    pRecInfoCutsTPC->SetAcceptKinkDaughters(kTRUE);
    pRecInfoCutsTPC->SetMinNClustersTPC(50);
    pRecInfoCutsTPC->SetMaxChi2PerClusterTPC(1000000.);
    pRecInfoCutsTPC->SetDCAToVertex2D(kFALSE);

    pRecInfoCutsTPC->SetHistogramsOn(kFALSE); 
  } 
  else {
    Error("AddTaskPerformance", "AliRecInfoCutsTPC cannot be created!");
    return NULL;
  }

  //
  // Create TPC-ESD track reconstruction cuts ------------------------------------------------------
  // standard cuts

  AliRecInfoCuts *pRecInfoCuts = new AliRecInfoCuts(); 
  if(pRecInfoCuts) {
    pRecInfoCuts->SetMaxDCAToVertexXY(3.0);
    pRecInfoCuts->SetMaxDCAToVertexZ(3.0);
    pRecInfoCuts->SetMinNClustersTPC(50);
    pRecInfoCuts->SetMinNClustersITS(2);
    pRecInfoCuts->SetHistogramsOn(kFALSE); 
    pRecInfoCuts->SetTPCITSMatchingRadius(70); 
    pRecInfoCuts->SetTPCTRDMatchingRadius(260); 
  } 
  else {
    Error("AddTaskPerformance", "AliRecInfoCuts cannot be created!");
    return NULL;
  }

  //
  // Create TPC-MC track reconstruction cuts -------------------------------------------------------
  //
  AliMCInfoCuts  *pMCInfoCuts = new AliMCInfoCuts();
  if(pMCInfoCuts) {
    pMCInfoCuts->SetMinTrackLength(70);
  } 
  else {
    Error("AddTaskPerformance", "AliMCInfoCuts cannot be created!");
    return NULL;
  }

  //================================================================================================
  // -- Object
  //================================================================================================

  //
  // Create performance objects for TPC and set cuts 
  //
  enum { kTPC = 0, kTPCITS, kConstrained, kTPCInner, kTPCOuter, kTPCSec };

  //
  // Resolution ------------------------------------------------------------------------------------
  //

  AliPerformanceRes *pCompRes0 = new AliPerformanceRes("AliPerformanceRes",
						       "AliPerformanceRes",kTPC,kFALSE); 
  if(!pCompRes0) {
    Error("AddTaskPerformance", "Cannot create AliPerformanceRes");
  }
  pCompRes0->SetAliRecInfoCuts(pRecInfoCuts);
  pCompRes0->SetAliMCInfoCuts(pMCInfoCuts);
  pCompRes0->SetUseTrackVertex(kTRUE);

  //
  // Efficiency ------------------------------------------------------------------------------------
  //

  AliPerformanceEff *pCompEff0 = new AliPerformanceEff("AliPerformanceEff",
						       "AliPerformanceEff",kTPC,kFALSE); 
  if(!pCompEff0) {
    Error("AddTaskPerformance", "Cannot create AliPerformanceEff");
  }
  pCompEff0->SetAliRecInfoCuts(pRecInfoCuts);
  pCompEff0->SetAliMCInfoCuts(pMCInfoCuts);
  pCompEff0->SetUseTrackVertex(kTRUE);

  //
  // dEdx ------------------------------------------------------------------------------------------
  //

  AliPerformanceDEdx *pCompDEdx3 = new AliPerformanceDEdx("AliPerformanceDEdxTPCInner",
							  "AliPerformanceDEdxTPCInner",kTPCInner,kFALSE); 
  if(!pCompDEdx3) {
    Error("AddTaskPerformance", "Cannot create AliPerformanceDEdxTPCInner");
  }
  pCompDEdx3->SetAliRecInfoCuts(pRecInfoCuts);
  pCompDEdx3->SetAliMCInfoCuts(pMCInfoCuts);
  pCompDEdx3->SetUseTrackVertex(kTRUE);

  //
  // DCA -------------------------------------------------------------------------------------------
  //

  AliPerformanceDCA *pCompDCA0 = new AliPerformanceDCA("AliPerformanceDCA",
						       "AliPerformanceDCA",kTPC,kFALSE); 
  if(!pCompDCA0) {
    Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceDCA");
  }
  pCompDCA0->SetAliRecInfoCuts(pRecInfoCuts);
  pCompDCA0->SetAliMCInfoCuts(pMCInfoCuts);
  pCompDCA0->SetUseTrackVertex(kTRUE);

  //
  // TPC performance -------------------------------------------------------------------------------
  //

  AliPerformanceTPC *pCompTPC0 = new AliPerformanceTPC("AliPerformanceTPC",
						       "AliPerformanceTPC",kTPC,kFALSE); 
  if(!pCompTPC0) {
    Error("AddTaskPerformance", "Cannot create AliPerformanceTPC");
  }
  pCompTPC0->SetAliRecInfoCuts(pRecInfoCutsTPC);
  pCompTPC0->SetAliMCInfoCuts(pMCInfoCuts);
  pCompTPC0->SetUseTrackVertex(kTRUE);
  pCompTPC0->SetUseHLT(bUseHLT);

  //
  // Add components to the performance task --------------------------------------------------------
  //

  //01.09.10  At the moment only use pCompTPC0

  //task->AddPerformanceObject( pCompDEdx3 );
  //task->AddPerformanceObject( pCompDCA0 );
  task->AddPerformanceObject( pCompTPC0 );

  /*
    if(bUseMCInfo) { 
    task->AddPerformanceObject( pCompRes0 );
    task->AddPerformanceObject( pCompEff0 );
    }
    
    if(!bUseMCInfo &&  triggerClass) {
    pCompDEdx3->SetTriggerClass(triggerClass);
    pCompDCA0->SetTriggerClass(triggerClass);
    pCompTPC0->SetTriggerClass(triggerClass);
    }
  */
  
  //================================================================================================
  //              data containers
  //================================================================================================
  AliAnalysisDataContainer *cinput  = mgr->GetCommonInputContainer();
  
  if(bUseHLT){
    AliAnalysisDataContainer *coutput1 =    
      mgr->CreateContainer("HLTQA", TList::Class(),
			   AliAnalysisManager::kOutputContainer, Form("HLTTPC.%s.root", task->GetName()));
  }
  else{
    AliAnalysisDataContainer *coutput1 = 
      mgr->CreateContainer("TPC", TList::Class(), 
			   AliAnalysisManager::kOutputContainer, Form("TPC.%s.root", task->GetName()));
  }

  // -- connect containers
  mgr->ConnectInput  (task,  0, cinput );
  mgr->ConnectOutput (task,  1, coutput1);

  return task;  
}
 AddTaskPerformance.C:1
 AddTaskPerformance.C:2
 AddTaskPerformance.C:3
 AddTaskPerformance.C:4
 AddTaskPerformance.C:5
 AddTaskPerformance.C:6
 AddTaskPerformance.C:7
 AddTaskPerformance.C:8
 AddTaskPerformance.C:9
 AddTaskPerformance.C:10
 AddTaskPerformance.C:11
 AddTaskPerformance.C:12
 AddTaskPerformance.C:13
 AddTaskPerformance.C:14
 AddTaskPerformance.C:15
 AddTaskPerformance.C:16
 AddTaskPerformance.C:17
 AddTaskPerformance.C:18
 AddTaskPerformance.C:19
 AddTaskPerformance.C:20
 AddTaskPerformance.C:21
 AddTaskPerformance.C:22
 AddTaskPerformance.C:23
 AddTaskPerformance.C:24
 AddTaskPerformance.C:25
 AddTaskPerformance.C:26
 AddTaskPerformance.C:27
 AddTaskPerformance.C:28
 AddTaskPerformance.C:29
 AddTaskPerformance.C:30
 AddTaskPerformance.C:31
 AddTaskPerformance.C:32
 AddTaskPerformance.C:33
 AddTaskPerformance.C:34
 AddTaskPerformance.C:35
 AddTaskPerformance.C:36
 AddTaskPerformance.C:37
 AddTaskPerformance.C:38
 AddTaskPerformance.C:39
 AddTaskPerformance.C:40
 AddTaskPerformance.C:41
 AddTaskPerformance.C:42
 AddTaskPerformance.C:43
 AddTaskPerformance.C:44
 AddTaskPerformance.C:45
 AddTaskPerformance.C:46
 AddTaskPerformance.C:47
 AddTaskPerformance.C:48
 AddTaskPerformance.C:49
 AddTaskPerformance.C:50
 AddTaskPerformance.C:51
 AddTaskPerformance.C:52
 AddTaskPerformance.C:53
 AddTaskPerformance.C:54
 AddTaskPerformance.C:55
 AddTaskPerformance.C:56
 AddTaskPerformance.C:57
 AddTaskPerformance.C:58
 AddTaskPerformance.C:59
 AddTaskPerformance.C:60
 AddTaskPerformance.C:61
 AddTaskPerformance.C:62
 AddTaskPerformance.C:63
 AddTaskPerformance.C:64
 AddTaskPerformance.C:65
 AddTaskPerformance.C:66
 AddTaskPerformance.C:67
 AddTaskPerformance.C:68
 AddTaskPerformance.C:69
 AddTaskPerformance.C:70
 AddTaskPerformance.C:71
 AddTaskPerformance.C:72
 AddTaskPerformance.C:73
 AddTaskPerformance.C:74
 AddTaskPerformance.C:75
 AddTaskPerformance.C:76
 AddTaskPerformance.C:77
 AddTaskPerformance.C:78
 AddTaskPerformance.C:79
 AddTaskPerformance.C:80
 AddTaskPerformance.C:81
 AddTaskPerformance.C:82
 AddTaskPerformance.C:83
 AddTaskPerformance.C:84
 AddTaskPerformance.C:85
 AddTaskPerformance.C:86
 AddTaskPerformance.C:87
 AddTaskPerformance.C:88
 AddTaskPerformance.C:89
 AddTaskPerformance.C:90
 AddTaskPerformance.C:91
 AddTaskPerformance.C:92
 AddTaskPerformance.C:93
 AddTaskPerformance.C:94
 AddTaskPerformance.C:95
 AddTaskPerformance.C:96
 AddTaskPerformance.C:97
 AddTaskPerformance.C:98
 AddTaskPerformance.C:99
 AddTaskPerformance.C:100
 AddTaskPerformance.C:101
 AddTaskPerformance.C:102
 AddTaskPerformance.C:103
 AddTaskPerformance.C:104
 AddTaskPerformance.C:105
 AddTaskPerformance.C:106
 AddTaskPerformance.C:107
 AddTaskPerformance.C:108
 AddTaskPerformance.C:109
 AddTaskPerformance.C:110
 AddTaskPerformance.C:111
 AddTaskPerformance.C:112
 AddTaskPerformance.C:113
 AddTaskPerformance.C:114
 AddTaskPerformance.C:115
 AddTaskPerformance.C:116
 AddTaskPerformance.C:117
 AddTaskPerformance.C:118
 AddTaskPerformance.C:119
 AddTaskPerformance.C:120
 AddTaskPerformance.C:121
 AddTaskPerformance.C:122
 AddTaskPerformance.C:123
 AddTaskPerformance.C:124
 AddTaskPerformance.C:125
 AddTaskPerformance.C:126
 AddTaskPerformance.C:127
 AddTaskPerformance.C:128
 AddTaskPerformance.C:129
 AddTaskPerformance.C:130
 AddTaskPerformance.C:131
 AddTaskPerformance.C:132
 AddTaskPerformance.C:133
 AddTaskPerformance.C:134
 AddTaskPerformance.C:135
 AddTaskPerformance.C:136
 AddTaskPerformance.C:137
 AddTaskPerformance.C:138
 AddTaskPerformance.C:139
 AddTaskPerformance.C:140
 AddTaskPerformance.C:141
 AddTaskPerformance.C:142
 AddTaskPerformance.C:143
 AddTaskPerformance.C:144
 AddTaskPerformance.C:145
 AddTaskPerformance.C:146
 AddTaskPerformance.C:147
 AddTaskPerformance.C:148
 AddTaskPerformance.C:149
 AddTaskPerformance.C:150
 AddTaskPerformance.C:151
 AddTaskPerformance.C:152
 AddTaskPerformance.C:153
 AddTaskPerformance.C:154
 AddTaskPerformance.C:155
 AddTaskPerformance.C:156
 AddTaskPerformance.C:157
 AddTaskPerformance.C:158
 AddTaskPerformance.C:159
 AddTaskPerformance.C:160
 AddTaskPerformance.C:161
 AddTaskPerformance.C:162
 AddTaskPerformance.C:163
 AddTaskPerformance.C:164
 AddTaskPerformance.C:165
 AddTaskPerformance.C:166
 AddTaskPerformance.C:167
 AddTaskPerformance.C:168
 AddTaskPerformance.C:169
 AddTaskPerformance.C:170
 AddTaskPerformance.C:171
 AddTaskPerformance.C:172
 AddTaskPerformance.C:173
 AddTaskPerformance.C:174
 AddTaskPerformance.C:175
 AddTaskPerformance.C:176
 AddTaskPerformance.C:177
 AddTaskPerformance.C:178
 AddTaskPerformance.C:179
 AddTaskPerformance.C:180
 AddTaskPerformance.C:181
 AddTaskPerformance.C:182
 AddTaskPerformance.C:183
 AddTaskPerformance.C:184
 AddTaskPerformance.C:185
 AddTaskPerformance.C:186
 AddTaskPerformance.C:187
 AddTaskPerformance.C:188
 AddTaskPerformance.C:189
 AddTaskPerformance.C:190
 AddTaskPerformance.C:191
 AddTaskPerformance.C:192
 AddTaskPerformance.C:193
 AddTaskPerformance.C:194
 AddTaskPerformance.C:195
 AddTaskPerformance.C:196
 AddTaskPerformance.C:197
 AddTaskPerformance.C:198
 AddTaskPerformance.C:199
 AddTaskPerformance.C:200
 AddTaskPerformance.C:201
 AddTaskPerformance.C:202
 AddTaskPerformance.C:203
 AddTaskPerformance.C:204
 AddTaskPerformance.C:205
 AddTaskPerformance.C:206
 AddTaskPerformance.C:207
 AddTaskPerformance.C:208
 AddTaskPerformance.C:209
 AddTaskPerformance.C:210
 AddTaskPerformance.C:211
 AddTaskPerformance.C:212
 AddTaskPerformance.C:213
 AddTaskPerformance.C:214
 AddTaskPerformance.C:215
 AddTaskPerformance.C:216
 AddTaskPerformance.C:217
 AddTaskPerformance.C:218
 AddTaskPerformance.C:219
 AddTaskPerformance.C:220
 AddTaskPerformance.C:221
 AddTaskPerformance.C:222
 AddTaskPerformance.C:223
 AddTaskPerformance.C:224
 AddTaskPerformance.C:225
 AddTaskPerformance.C:226
 AddTaskPerformance.C:227
 AddTaskPerformance.C:228
 AddTaskPerformance.C:229
 AddTaskPerformance.C:230
 AddTaskPerformance.C:231
 AddTaskPerformance.C:232
 AddTaskPerformance.C:233
 AddTaskPerformance.C:234
 AddTaskPerformance.C:235
 AddTaskPerformance.C:236
 AddTaskPerformance.C:237
 AddTaskPerformance.C:238
 AddTaskPerformance.C:239
 AddTaskPerformance.C:240
 AddTaskPerformance.C:241
 AddTaskPerformance.C:242
 AddTaskPerformance.C:243
 AddTaskPerformance.C:244
 AddTaskPerformance.C:245
 AddTaskPerformance.C:246
 AddTaskPerformance.C:247
 AddTaskPerformance.C:248
 AddTaskPerformance.C:249
 AddTaskPerformance.C:250
 AddTaskPerformance.C:251
 AddTaskPerformance.C:252
 AddTaskPerformance.C:253
 AddTaskPerformance.C:254
 AddTaskPerformance.C:255
 AddTaskPerformance.C:256
 AddTaskPerformance.C:257
 AddTaskPerformance.C:258
 AddTaskPerformance.C:259
 AddTaskPerformance.C:260
 AddTaskPerformance.C:261
 AddTaskPerformance.C:262
 AddTaskPerformance.C:263
 AddTaskPerformance.C:264
 AddTaskPerformance.C:265
 AddTaskPerformance.C:266
 AddTaskPerformance.C:267
 AddTaskPerformance.C:268
 AddTaskPerformance.C:269
 AddTaskPerformance.C:270
 AddTaskPerformance.C:271
 AddTaskPerformance.C:272
 AddTaskPerformance.C:273
 AddTaskPerformance.C:274
 AddTaskPerformance.C:275
 AddTaskPerformance.C:276
 AddTaskPerformance.C:277
 AddTaskPerformance.C:278
 AddTaskPerformance.C:279
 AddTaskPerformance.C:280
 AddTaskPerformance.C:281