ROOT logo
//
// This macro adds the specific RSN input handler, with all single particle cuts
//
void AddRsnInputHandler(Bool_t isMC, AliMultiInputEventHandler *multi)
{
   void myError  (const char *msg) {::Error  ("AddRsnInputHandler", msg);}
   void myWarning(const char *msg) {::Warning("AddRsnInputHandler", msg);}
   void myInfo   (const char *msg) {::Info   ("AddRsnInputHandler", msg);}
   
   if (!multi) {
      ::Error("AddRsnInputHandler", "Required a WELL INITIALIZED AliMultiInputEventHandler object");
      return;
   }
   
   //---------------------------------------------
   //  Define single cuts
   //---------------------------------------------

   // Track quality for ITS standalone:
   // this cut is used to select tracks of good quality, irrespective of the PID.
   // When adding status flags, the second argument tells if each considered flag
   // must be active or not in the track status, since the ITS-SA tracks need that
   // some of them are OFF (e.g.: kTPCin)
   AliRsnCutTrackQuality *cutQualityITS = new AliRsnCutTrackQuality("cutQualityITS");
   cutQualityITS->AddStatusFlag(AliESDtrack::kITSin    , kTRUE);
   cutQualityITS->AddStatusFlag(AliESDtrack::kTPCin    , kFALSE);
   cutQualityITS->AddStatusFlag(AliESDtrack::kITSrefit , kTRUE);
   cutQualityITS->AddStatusFlag(AliESDtrack::kTPCrefit , kFALSE);
   cutQualityITS->AddStatusFlag(AliESDtrack::kITSpureSA, kFALSE);
   cutQualityITS->AddStatusFlag(AliESDtrack::kITSpid   , kTRUE);
   cutQualityITS->SetPtRange(0.15, 1E+20);
   cutQualityITS->SetEtaRange(-0.8, 0.8);
   cutQualityITS->SetDCARPtFormula("0.0595+0.0182/pt^1.55");
   cutQualityITS->SetDCAZmax(2.0);
   cutQualityITS->SetSPDminNClusters(1);
   cutQualityITS->SetITSminNClusters(4);
   cutQualityITS->SetITSmaxChi2(2.0);
   cutQualityITS->SetTPCminNClusters(0);
   cutQualityITS->SetTPCmaxChi2(1E+10);
   cutQualityITS->SetRejectKinkDaughters();
      
   // Track quality for TPC+ITS:
   // works exactly like the one above, but has settings for selecting TPC+ITS tracks
   // in this case, the flags required are all necessary, so here the procedure is simpler
   AliRsnCutTrackQuality *cutQualityTPC = new AliRsnCutTrackQuality("cutQualityTPC");
   cutQualityTPC->AddStatusFlag(AliESDtrack::kTPCin   , kTRUE);
   cutQualityTPC->AddStatusFlag(AliESDtrack::kTPCrefit, kTRUE);
   cutQualityTPC->AddStatusFlag(AliESDtrack::kITSrefit, kTRUE);
   cutQualityTPC->SetPtRange(0.15, 1E+20);
   cutQualityTPC->SetEtaRange(-0.8, 0.8);
   cutQualityTPC->SetDCARPtFormula("0.0182+0.0350/pt^1.01");
   cutQualityTPC->SetDCAZmax(2.0);
   cutQualityTPC->SetSPDminNClusters(1);
   cutQualityTPC->SetITSminNClusters(0);
   cutQualityTPC->SetITSmaxChi2(1E+20);
   cutQualityTPC->SetTPCminNClusters(70);
   cutQualityTPC->SetTPCmaxChi2(4.0);
   cutQualityTPC->SetRejectKinkDaughters();
   
   // ITS PID
   // -- pions: 3sigma dE/dx cut
   // -- kaons: 3sigma dE/dx cut
   //
   // NOTE:
   // --> need to know if running on MC or data (for initializing the BB)
   AliRsnCutPIDITS *cutPIDITSpion = new AliRsnCutPIDITS("cutPIDITSpion", AliPID::kPion, -3.0, 3.0);
   AliRsnCutPIDITS *cutPIDITSkaon = new AliRsnCutPIDITS("cutPIDITSkaon", AliPID::kKaon, -3.0, 3.0);
   cutPIDITSpion->SetMC(isMC);
   cutPIDITSkaon->SetMC(isMC);
   
   // TPC PID
   // -- pions: 3sigma dE/dx cut
   // -- kaons: 3(5)sigma dE/dx cut for p_TPC above(below) 350 MeV/c
   //
   // NOTE:
   // --> The initialization of the BB is different between data and MC.
   AliRsnCutPIDTPC *cutPIDTPCpion  = new AliRsnCutPIDTPC("cutPIDTPCpion" , AliPID::kPion, -3.0, 3.0);
   AliRsnCutPIDTPC *cutPIDTPCkaonL = new AliRsnCutPIDTPC("cutPIDTPCkaonL", AliPID::kKaon, -5.0, 5.0);
   AliRsnCutPIDTPC *cutPIDTPCkaonH = new AliRsnCutPIDTPC("cutPIDTPCkaonH", AliPID::kKaon, -3.0, 3.0);
   
   // assign the momentum range and tell to reject tracks outside it
   cutPIDTPCkaonL->SetMomentumRange(0.00, 0.35);
   cutPIDTPCkaonH->SetMomentumRange(0.35, 1E20);
   cutPIDTPCkaonL->SetRejectOutside(kTRUE);
   cutPIDTPCkaonH->SetRejectOutside(kTRUE);
   
   // BB parameterization depends on data sample (MC, data)
   // the momentum range is passed and tracks outside it are rejected
   Double_t bbPar[5];
   if (isMC) {
      bbPar[0] = 2.15898 / 50.0;
      bbPar[1] = 1.75295E1;
      bbPar[2] = 3.40030E-9;
      bbPar[3] = 1.96178;
      bbPar[4] = 3.91720;
   } else {
      bbPar[0] = 1.41543 / 50.0;
      bbPar[1] = 2.63394E1;
      bbPar[2] = 5.0411E-11;
      bbPar[3] = 2.12543;
      bbPar[4] = 4.88663;
   }
   cutPIDTPCpion ->SetBBParam(bbPar);
   cutPIDTPCkaonL->SetBBParam(bbPar);
   cutPIDTPCkaonH->SetBBParam(bbPar);
   
   // TOF PID
   // -- pions: 3sigma cut
   // -- kaons: 3sigma cut
   //
   // NOTE:
   // --> since we use also TPC, unmatched tracks are accepted
   AliRsnCutPIDTOF *cutPIDTOFpion = new AliRsnCutPIDTOF("cutPIDTOFpion", AliPID::kPion, -3.0, 3.0);
   AliRsnCutPIDTOF *cutPIDTOFkaon = new AliRsnCutPIDTOF("cutPIDTOFkaon", AliPID::kKaon, -3.0, 3.0);
   cutPIDTOFpion->SetRejectUnmatched(kFALSE);
   cutPIDTOFkaon->SetRejectUnmatched(kFALSE);
   
   //---------------------------------------------
   //  Combine cuts
   //---------------------------------------------
   
   // make several combinations of cuts:
   // ITS and TPC standard
   AliRsnCutSet *cutsQualityITS = new AliRsnCutSet("qualityITS", AliRsnTarget::kDaughter);
   AliRsnCutSet *cutsQualityTPC = new AliRsnCutSet("qualityTPC", AliRsnTarget::kDaughter);
   AliRsnCutSet *cutsPionITS    = new AliRsnCutSet("pionITS"   , AliRsnTarget::kDaughter);
   AliRsnCutSet *cutsPionTPC    = new AliRsnCutSet("pionTPC"   , AliRsnTarget::kDaughter);
   AliRsnCutSet *cutsPionAll    = new AliRsnCutSet("pionAll"   , AliRsnTarget::kDaughter);
   AliRsnCutSet *cutsKaonITS    = new AliRsnCutSet("kaonITS"   , AliRsnTarget::kDaughter);
   AliRsnCutSet *cutsKaonTPC    = new AliRsnCutSet("kaonTPC"   , AliRsnTarget::kDaughter);
   AliRsnCutSet *cutsKaonAll    = new AliRsnCutSet("kaonAll"   , AliRsnTarget::kDaughter);
   
   // ITS standalone: quality only
   cutsQualityITS->AddCut(cutQualityITS);
   cutsQualityITS->SetCutScheme(cutQualityITS->GetName());
   
   // TPC+ITS: quality only
   cutsQualityTPC->AddCut(cutQualityTPC);
   cutsQualityTPC->SetCutScheme(cutQualityTPC->GetName());
   
   // ITS standalone: quality and ITS PID (pions)
   cutsPionITS->AddCut(cutQualityITS);
   cutsPionITS->AddCut(cutPIDITSpion);
   cutsPionITS->SetCutScheme(Form("%s&%s", cutQualityITS->GetName(), cutPIDITSpion->GetName()));
   
   // ITS standalone: quality and ITS PID (kaons)
   cutsKaonITS->AddCut(cutQualityITS);
   cutsKaonITS->AddCut(cutPIDITSkaon);
   cutsKaonITS->SetCutScheme(Form("%s&%s", cutQualityITS->GetName(), cutPIDITSkaon->GetName()));
   
   // TPC standalone: quality and TPC + TOF PID (pions)
   cutsPionTPC->AddCut(cutQualityTPC);
   cutsPionTPC->AddCut(cutPIDTPCpion);
   cutsPionTPC->AddCut(cutPIDTOFpion);
   cutsPionTPC->SetCutScheme(Form("%s & %s & %s", cutQualityTPC->GetName(), cutPIDTPCpion->GetName(), cutPIDTOFpion->GetName()));
   
   // TPC standalone: quality and TPC + TOF PID (kaons)
   cutsKaonTPC->AddCut(cutQualityTPC);
   cutsKaonTPC->AddCut(cutPIDTPCkaonL);
   cutsKaonTPC->AddCut(cutPIDTPCkaonH);
   cutsKaonTPC->AddCut(cutPIDTOFkaon);
   cutsKaonTPC->SetCutScheme(Form("%s & (%s|%s) & %s", cutQualityTPC->GetName(), cutPIDTPCkaonL->GetName(), cutPIDTPCkaonH->GetName(), cutPIDTOFkaon->GetName()));
   
   // all tracks: both qualities and PIDs (pion)
   cutsPionAll->AddCut(cutQualityITS);
   cutsPionAll->AddCut(cutQualityTPC);
   cutsPionAll->AddCut(cutPIDITSpion);
   cutsPionAll->AddCut(cutPIDTPCpion);
   cutsPionAll->AddCut(cutPIDTOFpion);
   cutsPionAll->SetCutScheme(Form("(%s)|(%s)", cutsKaonITS->GetCutScheme().Data(), cutsKaonTPC->GetCutScheme().Data()));
   
   // all tracks: both qualities and PIDs (kaon)
   cutsKaonAll->AddCut(cutQualityITS);
   cutsKaonAll->AddCut(cutQualityTPC);
   cutsKaonAll->AddCut(cutPIDITSkaon);
   cutsKaonAll->AddCut(cutPIDTPCkaonL);
   cutsKaonAll->AddCut(cutPIDTPCkaonH);
   cutsKaonAll->AddCut(cutPIDTOFkaon);
   cutsKaonAll->SetCutScheme(Form("(%s)|(%s)", cutsKaonITS->GetCutScheme().Data(), cutsKaonTPC->GetCutScheme().Data()));
   
   // setup selector in the handler and add RSN input handler
   AliRsnInputHandler *rsnIH = new AliRsnInputHandler();
   AliRsnDaughterSelector *sel = rsnIH->GetSelector();
// sel->Add(cutsQualityITS, kTRUE);
   sel->Add(cutsQualityTPC, kTRUE);
// sel->Add(cutsPionITS   , kTRUE);
// sel->Add(cutsPionTPC   , kTRUE);
// sel->Add(cutsPionAll   , kTRUE);
// sel->Add(cutsKaonITS   , kTRUE);
   sel->Add(cutsKaonTPC   , kTRUE);
// sel->Add(cutsKaonAll   , kTRUE);
   sel->Init();
   multi->AddInputEventHandler(rsnIH);
}
 AddRsnInputHandler.C:1
 AddRsnInputHandler.C:2
 AddRsnInputHandler.C:3
 AddRsnInputHandler.C:4
 AddRsnInputHandler.C:5
 AddRsnInputHandler.C:6
 AddRsnInputHandler.C:7
 AddRsnInputHandler.C:8
 AddRsnInputHandler.C:9
 AddRsnInputHandler.C:10
 AddRsnInputHandler.C:11
 AddRsnInputHandler.C:12
 AddRsnInputHandler.C:13
 AddRsnInputHandler.C:14
 AddRsnInputHandler.C:15
 AddRsnInputHandler.C:16
 AddRsnInputHandler.C:17
 AddRsnInputHandler.C:18
 AddRsnInputHandler.C:19
 AddRsnInputHandler.C:20
 AddRsnInputHandler.C:21
 AddRsnInputHandler.C:22
 AddRsnInputHandler.C:23
 AddRsnInputHandler.C:24
 AddRsnInputHandler.C:25
 AddRsnInputHandler.C:26
 AddRsnInputHandler.C:27
 AddRsnInputHandler.C:28
 AddRsnInputHandler.C:29
 AddRsnInputHandler.C:30
 AddRsnInputHandler.C:31
 AddRsnInputHandler.C:32
 AddRsnInputHandler.C:33
 AddRsnInputHandler.C:34
 AddRsnInputHandler.C:35
 AddRsnInputHandler.C:36
 AddRsnInputHandler.C:37
 AddRsnInputHandler.C:38
 AddRsnInputHandler.C:39
 AddRsnInputHandler.C:40
 AddRsnInputHandler.C:41
 AddRsnInputHandler.C:42
 AddRsnInputHandler.C:43
 AddRsnInputHandler.C:44
 AddRsnInputHandler.C:45
 AddRsnInputHandler.C:46
 AddRsnInputHandler.C:47
 AddRsnInputHandler.C:48
 AddRsnInputHandler.C:49
 AddRsnInputHandler.C:50
 AddRsnInputHandler.C:51
 AddRsnInputHandler.C:52
 AddRsnInputHandler.C:53
 AddRsnInputHandler.C:54
 AddRsnInputHandler.C:55
 AddRsnInputHandler.C:56
 AddRsnInputHandler.C:57
 AddRsnInputHandler.C:58
 AddRsnInputHandler.C:59
 AddRsnInputHandler.C:60
 AddRsnInputHandler.C:61
 AddRsnInputHandler.C:62
 AddRsnInputHandler.C:63
 AddRsnInputHandler.C:64
 AddRsnInputHandler.C:65
 AddRsnInputHandler.C:66
 AddRsnInputHandler.C:67
 AddRsnInputHandler.C:68
 AddRsnInputHandler.C:69
 AddRsnInputHandler.C:70
 AddRsnInputHandler.C:71
 AddRsnInputHandler.C:72
 AddRsnInputHandler.C:73
 AddRsnInputHandler.C:74
 AddRsnInputHandler.C:75
 AddRsnInputHandler.C:76
 AddRsnInputHandler.C:77
 AddRsnInputHandler.C:78
 AddRsnInputHandler.C:79
 AddRsnInputHandler.C:80
 AddRsnInputHandler.C:81
 AddRsnInputHandler.C:82
 AddRsnInputHandler.C:83
 AddRsnInputHandler.C:84
 AddRsnInputHandler.C:85
 AddRsnInputHandler.C:86
 AddRsnInputHandler.C:87
 AddRsnInputHandler.C:88
 AddRsnInputHandler.C:89
 AddRsnInputHandler.C:90
 AddRsnInputHandler.C:91
 AddRsnInputHandler.C:92
 AddRsnInputHandler.C:93
 AddRsnInputHandler.C:94
 AddRsnInputHandler.C:95
 AddRsnInputHandler.C:96
 AddRsnInputHandler.C:97
 AddRsnInputHandler.C:98
 AddRsnInputHandler.C:99
 AddRsnInputHandler.C:100
 AddRsnInputHandler.C:101
 AddRsnInputHandler.C:102
 AddRsnInputHandler.C:103
 AddRsnInputHandler.C:104
 AddRsnInputHandler.C:105
 AddRsnInputHandler.C:106
 AddRsnInputHandler.C:107
 AddRsnInputHandler.C:108
 AddRsnInputHandler.C:109
 AddRsnInputHandler.C:110
 AddRsnInputHandler.C:111
 AddRsnInputHandler.C:112
 AddRsnInputHandler.C:113
 AddRsnInputHandler.C:114
 AddRsnInputHandler.C:115
 AddRsnInputHandler.C:116
 AddRsnInputHandler.C:117
 AddRsnInputHandler.C:118
 AddRsnInputHandler.C:119
 AddRsnInputHandler.C:120
 AddRsnInputHandler.C:121
 AddRsnInputHandler.C:122
 AddRsnInputHandler.C:123
 AddRsnInputHandler.C:124
 AddRsnInputHandler.C:125
 AddRsnInputHandler.C:126
 AddRsnInputHandler.C:127
 AddRsnInputHandler.C:128
 AddRsnInputHandler.C:129
 AddRsnInputHandler.C:130
 AddRsnInputHandler.C:131
 AddRsnInputHandler.C:132
 AddRsnInputHandler.C:133
 AddRsnInputHandler.C:134
 AddRsnInputHandler.C:135
 AddRsnInputHandler.C:136
 AddRsnInputHandler.C:137
 AddRsnInputHandler.C:138
 AddRsnInputHandler.C:139
 AddRsnInputHandler.C:140
 AddRsnInputHandler.C:141
 AddRsnInputHandler.C:142
 AddRsnInputHandler.C:143
 AddRsnInputHandler.C:144
 AddRsnInputHandler.C:145
 AddRsnInputHandler.C:146
 AddRsnInputHandler.C:147
 AddRsnInputHandler.C:148
 AddRsnInputHandler.C:149
 AddRsnInputHandler.C:150
 AddRsnInputHandler.C:151
 AddRsnInputHandler.C:152
 AddRsnInputHandler.C:153
 AddRsnInputHandler.C:154
 AddRsnInputHandler.C:155
 AddRsnInputHandler.C:156
 AddRsnInputHandler.C:157
 AddRsnInputHandler.C:158
 AddRsnInputHandler.C:159
 AddRsnInputHandler.C:160
 AddRsnInputHandler.C:161
 AddRsnInputHandler.C:162
 AddRsnInputHandler.C:163
 AddRsnInputHandler.C:164
 AddRsnInputHandler.C:165
 AddRsnInputHandler.C:166
 AddRsnInputHandler.C:167
 AddRsnInputHandler.C:168
 AddRsnInputHandler.C:169
 AddRsnInputHandler.C:170
 AddRsnInputHandler.C:171
 AddRsnInputHandler.C:172
 AddRsnInputHandler.C:173
 AddRsnInputHandler.C:174
 AddRsnInputHandler.C:175
 AddRsnInputHandler.C:176
 AddRsnInputHandler.C:177
 AddRsnInputHandler.C:178
 AddRsnInputHandler.C:179
 AddRsnInputHandler.C:180
 AddRsnInputHandler.C:181
 AddRsnInputHandler.C:182
 AddRsnInputHandler.C:183
 AddRsnInputHandler.C:184
 AddRsnInputHandler.C:185
 AddRsnInputHandler.C:186
 AddRsnInputHandler.C:187
 AddRsnInputHandler.C:188
 AddRsnInputHandler.C:189
 AddRsnInputHandler.C:190
 AddRsnInputHandler.C:191
 AddRsnInputHandler.C:192
 AddRsnInputHandler.C:193
 AddRsnInputHandler.C:194
 AddRsnInputHandler.C:195