ROOT logo
///
/// Configuration example of a task to get invariant mass spectrum of dimuons
///
/// \author: L. Aphecetche (Subatech) (laurent.aphecetche - at - subatech.in2p3.fr)
///

AliAnalysisTask* AddTaskMuMu(const char* outputname, 
                             TList* triggerClassesToConsider,
                             const char* beamYear,
                             Bool_t simulations)
{
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) {
    ::Error("AddTaskMuMu", "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("AddTaskMuMu", "This task requires an input event handler");
    return NULL;
  }
  TString inputDataType = mgr->GetInputEventHandler()->GetDataType(); // can be "ESD" or "AOD"
  cout << "inputDataType=" << inputDataType.Data() << endl;
  
  // Configure analysis
  //===========================================================================  

  if (simulations && triggerClassesToConsider )
  {
//    triggerClassesToConsider->Add(new TObjString("CMULLO-B-NOPF-MUON"));
//    triggerClassesToConsider->Add(new TObjString("CMSNGL-B-NOPF-MUON"));
    triggerClassesToConsider->Add(new TObjString("ANY"));

//    triggerClassesToConsider->Add(new TObjString("MB1"));
//    triggerClassesToConsider->Add(new TObjString("C0T0A"));

    //    triggerClassesToConsider->Add(new TObjString("MULow"));
//    triggerClassesToConsider->Add(new TObjString("V0L"));
//    triggerClassesToConsider->Add(new TObjString("V0R"));
//
// for dpmjet simulations (at least) we have the following "triggers" :
//    C0T0A,C0T0C,MB1,MBBG1,V0L,V0R,MULow,EMPTY,MBBG3,MULL,MULU,MUHigh
  }

  AliAnalysisTaskMuMu* task = new AliAnalysisTaskMuMu;
  
  AliAnalysisMuMuEventCutter* eventCutter = new AliAnalysisMuMuEventCutter(triggerClassesToConsider);
  
  AliAnalysisMuMuCutRegistry* cr = task->CutRegistry();
  
  AliAnalysisMuMuCutElement* eventTrue = cr->AddEventCut(*eventCutter,"IsTrue","const AliVEvent&","");

  AliAnalysisMuMuCutElement* ps = eventTrue;
  
  if (!simulations)
  {
    ps = cr->AddEventCut(*eventCutter,"IsPhysicsSelected","const AliInputEventHandler&","");
  }

  AliAnalysisMuMuCutElement* triggerSelection = cr->AddTriggerClassCut(*eventCutter,"SelectTriggerClass","const TString&,TString&,UInt_t,UInt_t,UInt_t","");

  cr->AddCutCombination(triggerSelection);
  
//  AliAnalysisMuMuCutElement* cutVDM = cr->AddEventCut(*eventCutter,"IsPhysicsSelectedVDM","const AliVEvent&","");
//
//  AliAnalysisMuMuCutElement* cutTZEROPileUp = cr->AddEventCut(*eventCutter,"IsTZEROPileUp","const AliVEvent&","");
//
//  AliAnalysisMuMuCutElement* notTZEROPileUp = cr->Not(*cutTZEROPileUp);

  cr->AddCutCombination(ps);

  task->SetBeamYear(beamYear);

  AliAnalysisMuMuGlobal* globalAnalysis = 0x0;//new AliAnalysisMuMuGlobal;
  
  AliAnalysisMuMuSingle* singleAnalysis = new AliAnalysisMuMuSingle;
  
  AliAnalysisMuMuMinv* minvAnalysis = new AliAnalysisMuMuMinv;

//  TFile f("$HOME/Downloads/ResponseMatrix_QASPDZPSALL_ANY.root");
//  TH2* h = static_cast<TH2*>(f.Get("ResponseMatrix"));
  
  AliAnalysisMuMuNch* nchAnalysis = new AliAnalysisMuMuNch; // (0x0,-2,2,-40,40);
  
//  AliAnalysisMuMuNch(TH2* spdCorrection=0x0,
//                     Int_t nbinsEta=10, Double_t etaMin=-0.5, Double_t etaMax=0.5,
//                     Int_t nbinsZ=320, Double_t zmin=-40, Double_t zmax=40);


  if ( globalAnalysis )
  {
    AliAnalysisMuMuCutElement* triggerAll = cr->AddTriggerClassCut(*globalAnalysis,"SelectAnyTriggerClass","const TString&,TString&","");
    
    cr->AddCutCombination(triggerAll);
    
    task->AdoptSubAnalysis(globalAnalysis);
  }
  
  if ( nchAnalysis )
  {
//    AliAnalysisMuMuCutElement* trketa2 = cr->AddEventCut(*nchAnalysis,"HasAtLeastNTrackletsInEtaRange","const AliVEvent&,Int_t, Double_t& , Double_t& ","1,-2.0,2.0");
//    AliAnalysisMuMuCutElement* trketa1 = cr->AddEventCut(*nchAnalysis,"HasAtLeastNTrackletsInEtaRange","const AliVEvent&,Int_t, Double_t& , Double_t& ","1,-1.0,1.0");
//    AliAnalysisMuMuCutElement* trk5eta1 = cr->AddEventCut(*nchAnalysis,"HasAtLeastNTrackletsInEtaRange","const AliVEvent&,Int_t, Double_t& , Double_t& ","5,-1.0,1.0");
//    
//    cr->AddCutCombination(ps,trketa1);
//    cr->AddCutCombination(ps,trk5eta1);
//    cr->AddCutCombination(ps,trketa2);
    
    AliAnalysisMuMuCutElement* cutZ18= cr->AddEventCut(*eventCutter,"IsAbsZBelowValue","const AliVEvent&,Double_t","18");
    
    AliAnalysisMuMuCutElement* cutZ10 = cr->AddEventCut(*eventCutter,"IsAbsZBelowValue","const AliVEvent&,Double_t","10");
    
    cr->AddCutCombination(ps,cutZ18);
    cr->AddCutCombination(ps,cutZ10);
    
    task->AdoptSubAnalysis(nchAnalysis);
  }
  
  if ( singleAnalysis )
  {
    AliAnalysisMuMuCutElement* trackTrue = cr->AddTrackCut(*cr,"AlwaysTrue","const AliVParticle&","");
    AliAnalysisMuMuCutElement* rabs = cr->AddTrackCut(*singleAnalysis,"IsRabsOK","const AliVParticle&","");
    AliAnalysisMuMuCutElement* eta = cr->AddTrackCut(*singleAnalysis,"IsEtaInRange","const AliVParticle&,Double_t&,Double_t&","-4.0,-2.5");
    
    cr->AddCutCombination(trackTrue);

    cr->AddCutCombination(rabs);
    
    cr->AddCutCombination(eta);

    cr->AddCutCombination(rabs,eta);

    task->AdoptSubAnalysis(singleAnalysis);

    if ( minvAnalysis )
    {
      AliAnalysisMuMuCutElement* pairTrue = cr->AddTrackPairCut(*cr,"AlwaysTrue","const AliVParticle&, const AliVParticle&","");
      
      AliAnalysisMuMuCutElement* pairy = cr->AddTrackPairCut(*minvAnalysis,"IsRapidityInRange","const AliVParticle&,const AliVParticle&,Double_t&,Double_t&","-4,-2.5");
  
      cr->AddCutCombination(rabs,eta,pairy);

      cr->AddCutCombination(rabs,pairy);

      cr->AddCutCombination(pairy);

      cr->AddCutCombination(pairTrue);

      task->AdoptSubAnalysis(minvAnalysis);
    }
  }
  
  /// below are the kind of configurations that can be performed :
  /// - adding cuts (at event, track or pair level)
  /// - adding bins (in pt, y, centrality, etc...) for minv (and meanpt)

  AliAnalysisMuMuBinning* binning = task->Binning();
  
  if (minvAnalysis)
  {
    binning->AddBin("psi","pt");
    
    // pt binning
    
    binning->AddBin("psi","pt", 0.0, 1.0,"IGOR");
    binning->AddBin("psi","pt", 1.0, 2.0,"IGOR");
    binning->AddBin("psi","pt", 2.0, 3.0,"IGOR");
    binning->AddBin("psi","pt", 3.0, 4.0,"IGOR");
    binning->AddBin("psi","pt", 4.0, 5.0,"IGOR");
    binning->AddBin("psi","pt", 5.0, 6.0,"IGOR");
    binning->AddBin("psi","pt", 6.0, 7.0,"IGOR");
    binning->AddBin("psi","pt", 7.0, 9.0,"IGOR");
    binning->AddBin("psi","pt", 9.0,11.0,"IGOR");
    binning->AddBin("psi","pt",11.0,15.0,"IGOR");
    binning->AddBin("psi","pt",15.0,25.0,"IGOR");
    
    // y binning
    
    binning->AddBin("psi","y",-4,-2.5,"ILAB");
    
    for ( Int_t i = 0; i < 6; ++i )
    {
      Double_t y = -4+i*0.25;
      
      binning->AddBin("psi","y",y,y+0.25,"6PACK");
    }
    
    // nch binning
    if (nchAnalysis)
    {
      binning->AddBin("psi","nch",0.0,30.0,"JAVI"); // 0 - 29
      binning->AddBin("psi","nch",29.0,42.0,"JAVI"); // 30 - 41
      binning->AddBin("psi","nch",41.0,56.0,"JAVI"); // 42 - 55
      binning->AddBin("psi","nch",55.0,72.0,"JAVI"); // 56 - 72
      binning->AddBin("psi","nch",72.0,301.0,"JAVI"); // 73 - 300
    }
  }
  
  // v0 centrality binning
  
  binning->AddBin("centrality","v0a");
//  binning->AddBin("centrality","v0a",0,5);
//  binning->AddBin("centrality","v0a",5,10);
//  binning->AddBin("centrality","v0a",10,20);
//  binning->AddBin("centrality","v0a",20,40);
//  binning->AddBin("centrality","v0a",40,60);
//  binning->AddBin("centrality","v0a",60,80);
//  binning->AddBin("centrality","v0a",80,100);

  // disable some histograms if we don't want them
  task->DisableHistograms("^V02D");
  task->DisableHistograms("^dca");
  task->DisableHistograms("^Chi12");
  task->DisableHistograms("^Rabs12");

  // add the configured task to the analysis manager
  mgr->AddTask(task);  
  
  // Create containers for input/output
  AliAnalysisDataContainer *cinput = mgr->GetCommonInputContainer();  

  AliAnalysisDataContainer *coutputHC = 
  mgr->CreateContainer("OC",AliMergeableCollection::Class(),AliAnalysisManager::kOutputContainer,outputname);

  AliAnalysisDataContainer *coutputCC = 
  mgr->CreateContainer("CC",AliCounterCollection::Class(),AliAnalysisManager::kOutputContainer,outputname);
  
  AliAnalysisDataContainer* cparam = 
  mgr->CreateContainer("BIN", AliAnalysisMuMuBinning::Class(),AliAnalysisManager::kParamContainer,outputname);
  
  // Connect input/output
  mgr->ConnectInput(task, 0, cinput);
  mgr->ConnectOutput(task, 1, coutputHC);
  mgr->ConnectOutput(task, 2, coutputCC);
  mgr->ConnectOutput(task, 3, cparam);
  
  return task;
}

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