ROOT logo
//
// Test config macro for RSN package.
// It configures:
// 1) a monitor for all tracks passing quality cuts
// 2) a monitor for all tracks passing quality + PID cuts
// 3) an unlike-sign invariant-mass + pt distribution for K+K- pairs
//
Bool_t RsnConfigPhiKaonTest
(
   AliRsnAnalysisTask *task,
   Bool_t              isMC
)
{
   if (!task) {
      ::Error("RsnConfigPhiKaonTest.C", "NULL task");
      return kFALSE;
   }
   
   const char *suffix = "test";
      
   // ----------------------------------------------------------------------------------------------
   // -- DEFINITIONS -------------------------------------------------------------------------------
   // ----------------------------------------------------------------------------------------------
   
   // daughter definition for monitor loops
   // since it is intended to loop over all 'track' like objects (in the sense that we exclude V0s and cascades),
   // we initialize it using the constructor that requires an AliRsnDaughter::EType and a charge, but since
   // we want to loop over both charges, we set it to anything which is not '+' '-' or '0', which are tokens for
   // selecting only positive, only negative or only neutral
   AliRsnDaughterDef *tracks = new AliRsnDaughterDef(AliRsnDaughter::kTrack, 0);
   
   // definition of pair decay tree for phi resonance
   // here we *must* specify a particle species and a charge, in order to check the decay tree
   // last arguments are the PDG code and nominal mass of the resonance, which are needed when
   // one wants to select true pairs only and/or he wants to compute rapidity or Mt 
   AliRsnPairDef *pairDef = new AliRsnPairDef(AliRsnDaughter::kKaon, '+', AliRsnDaughter::kKaon, '-', 333, 1.019455);
   
   // definition of loop objects:
   // (a) 1 monitor for all tracks passing quality cuts
   // (b) 1 monitor for all tracks passing quality+PID cuts
   // (c) 1 pair filled with all tracks passing same cuts as (b)
   // (d) 1 pair like (c) but for mixing
   // (e) 1 pair like (c) but with true pairs only
   // NOTE: (c) and (d) are instantiated with same settings, they will be made
   //       different after some settings done in second moment
   AliRsnLoopDaughter *loopQuality = new AliRsnLoopDaughter(Form("%s_mon_quality", suffix), 0, tracks);
   AliRsnLoopDaughter *loopPID     = new AliRsnLoopDaughter(Form("%s_mon_pid"    , suffix), 0, tracks);
   AliRsnLoopPair     *loopPhi     = new AliRsnLoopPair    (Form("%s_unlike"     , suffix), pairDef);
   AliRsnLoopPair     *loopPhiMix  = new AliRsnLoopPair    (Form("%s_unlike"     , suffix), pairDef);
   AliRsnLoopPair     *loopPhiTrue = new AliRsnLoopPair    (Form("%s_trues"      , suffix), pairDef);
   
   // set additional option for true pairs (slot [0])
   loopPhiTrue->SetOnlyTrue(kTRUE);
   loopPhiTrue->SetCheckDecay(kTRUE);
   
   // set mixing options
   loopPhi    ->SetMixed(kFALSE);
   loopPhiMix ->SetMixed(kTRUE);
   loopPhiTrue->SetMixed(kFALSE);
   
   // assign the ID of the entry lists to be used by each pair to get selected daughters
   // in our case, the AliRsnInputHandler contains only one list for selecting kaons
   Int_t idQuality, idPID;
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   AliMultiInputEventHandler *multi = dynamic_cast<AliMultiInputEventHandler*>(mgr->GetInputEventHandler());
   if (!multi) {
      myError("Needed a multi input handler!");
      return kFALSE;
   }
   TObjArray *array = multi->InputEventHandlers();
   AliRsnInputHandler *rsn = (AliRsnInputHandler*)array->FindObject("rsnInputHandler");
   if (!rsn) {
      myError("Needed an RSN event handler");
      return kFALSE;
   }
   AliRsnDaughterSelector *sel = rsn->GetSelector();
   idQuality = sel->GetID("qualityTPC", kTRUE);
   idPID = sel->GetID("kaonTPC", kTRUE);
   if (idQuality < 0 || idPID < 0) {
      myError("List problems");
      return kFALSE;
   }
   loopQuality->SetListID(idQuality);
   loopPID    ->SetListID(idPID);
   loopPhi    ->SetListID(0, idPID);
   loopPhi    ->SetListID(1, idPID);
   loopPhiMix ->SetListID(0, idPID);
   loopPhiMix ->SetListID(1, idPID);
   loopPhiTrue->SetListID(0, idPID);
   loopPhiTrue->SetListID(1, idPID);
   
   // ----------------------------------------------------------------------------------------------
   // -- EVENT CUTS --------------------------------------------------------------------------------
   // ----------------------------------------------------------------------------------------------

   // primary vertex:
   // - 2nd argument --> |Vz| range
   // - 3rd argument --> minimum required number of contributors
   // - 4th argument --> tells if TPC stand-alone vertexes must be accepted
   // we switch on the check for pileup
   AliRsnCutPrimaryVertex *cutVertex = new AliRsnCutPrimaryVertex("cutVertex", 10.0, 0, kFALSE);
   cutVertex->SetCheckPileUp(kTRUE);
      
   // primary vertex is always used
   AliRsnCutSet *eventCuts = new AliRsnCutSet("eventCuts", AliRsnTarget::kEvent);
   eventCuts->AddCut(cutVertex);
   eventCuts->SetCutScheme(cutVertex->GetName());
   
   // add the event cuts to all loops
   loopQuality->SetEventCuts(eventCuts);
   loopPID    ->SetEventCuts(eventCuts);
   loopPhi    ->SetEventCuts(eventCuts);
   loopPhi    ->SetEventCuts(eventCuts);
   loopPhiMix ->SetEventCuts(eventCuts);
   loopPhiMix ->SetEventCuts(eventCuts);
   loopPhiTrue->SetEventCuts(eventCuts);
   loopPhiTrue->SetEventCuts(eventCuts);
   
   // ----------------------------------------------------------------------------------------------
   // -- PAIR CUTS ---------------------------------------------------------------------------------
   // ----------------------------------------------------------------------------------------------
   
   // for pairs we define a rapidity windows, defined through a cut
   // --> NOTE: it needs a support AliRsnPairDef from which it takes the mass
   AliRsnValueStd *valRapidity = new AliRsnValueStd("valY", AliRsnValueStd::kPairY);
   AliRsnCutValue *cutRapidity = new AliRsnCutValue("cutY", -0.5, 0.5, isMC);
   valRapidity->SetSupportObject(pairDef);
   cutRapidity->SetValueObj(valRapidity);
   
   // cut set
   AliRsnCutSet *pairCuts = new AliRsnCutSet("pairCuts", AliRsnTarget::kMother);
   pairCuts->AddCut(cutRapidity);
   pairCuts->SetCutScheme(cutRapidity->GetName());
   
   // add cut to pair loops only
   loopPhi    ->SetPairCuts(pairCuts);
   loopPhi    ->SetPairCuts(pairCuts);
   loopPhiMix ->SetPairCuts(pairCuts);
   loopPhiMix ->SetPairCuts(pairCuts);
   loopPhiTrue->SetPairCuts(pairCuts);
   loopPhiTrue->SetPairCuts(pairCuts);
   
   // ----------------------------------------------------------------------------------------------
   // -- COMPUTED VALUES & OUTPUTS -----------------------------------------------------------------
   // ----------------------------------------------------------------------------------------------
   
   AliRsnValueStd *axisIM     = new AliRsnValueStd("IM"  , AliRsnValueStd::kPairInvMass   , 0.9,   1.4, 0.001);
   AliRsnValueStd *axisPt     = new AliRsnValueStd("PT"  , AliRsnValueStd::kPairPt        , 0.0,   5.0, 0.1  );
   AliRsnValueStd *axisMomTPC = new AliRsnValueStd("pTPC", AliRsnValueStd::kTrackPtpc     , 0.0,   5.0, 0.01 );
   AliRsnValueStd *axisSigTPC = new AliRsnValueStd("sTPC", AliRsnValueStd::kTrackTPCsignal, 0.0, 500.0, 2.0  );
   
   // output for monitors:
   // 2D histogram with TPC signal vs TPC momentum
   AliRsnListOutput *outMonitor = new AliRsnListOutput("mon", AliRsnListOutput::kHistoDefault);
   outMonitor->AddValue(axisMomTPC);
   outMonitor->AddValue(axisSigTPC);
   
   // output for pairs:
   // 2D histogram with inv.mass vs pt
   AliRsnListOutput *outPair = new AliRsnListOutput("pair", AliRsnListOutput::kHistoDefault);
   outPair->AddValue(axisIM);
   outPair->AddValue(axisPt);
   
   // add outputs to loops
   loopQuality->AddOutput(outMonitor);
   loopPID    ->AddOutput(outMonitor);
   loopPhi    ->AddOutput(outPair);
   loopPhiMix ->AddOutput(outPair);
   loopPhiTrue->AddOutput(outPair);
   
   // ----------------------------------------------------------------------------------------------
   // -- CONCLUSION --------------------------------------------------------------------------------
   // ----------------------------------------------------------------------------------------------
   
   task->Add(loopQuality);
   task->Add(loopPID    );
   task->Add(loopPhi    );
   task->Add(loopPhiMix );
   task->Add(loopPhiTrue);
   
   return kTRUE;
}
 RsnConfigPhiKaonTest.C:1
 RsnConfigPhiKaonTest.C:2
 RsnConfigPhiKaonTest.C:3
 RsnConfigPhiKaonTest.C:4
 RsnConfigPhiKaonTest.C:5
 RsnConfigPhiKaonTest.C:6
 RsnConfigPhiKaonTest.C:7
 RsnConfigPhiKaonTest.C:8
 RsnConfigPhiKaonTest.C:9
 RsnConfigPhiKaonTest.C:10
 RsnConfigPhiKaonTest.C:11
 RsnConfigPhiKaonTest.C:12
 RsnConfigPhiKaonTest.C:13
 RsnConfigPhiKaonTest.C:14
 RsnConfigPhiKaonTest.C:15
 RsnConfigPhiKaonTest.C:16
 RsnConfigPhiKaonTest.C:17
 RsnConfigPhiKaonTest.C:18
 RsnConfigPhiKaonTest.C:19
 RsnConfigPhiKaonTest.C:20
 RsnConfigPhiKaonTest.C:21
 RsnConfigPhiKaonTest.C:22
 RsnConfigPhiKaonTest.C:23
 RsnConfigPhiKaonTest.C:24
 RsnConfigPhiKaonTest.C:25
 RsnConfigPhiKaonTest.C:26
 RsnConfigPhiKaonTest.C:27
 RsnConfigPhiKaonTest.C:28
 RsnConfigPhiKaonTest.C:29
 RsnConfigPhiKaonTest.C:30
 RsnConfigPhiKaonTest.C:31
 RsnConfigPhiKaonTest.C:32
 RsnConfigPhiKaonTest.C:33
 RsnConfigPhiKaonTest.C:34
 RsnConfigPhiKaonTest.C:35
 RsnConfigPhiKaonTest.C:36
 RsnConfigPhiKaonTest.C:37
 RsnConfigPhiKaonTest.C:38
 RsnConfigPhiKaonTest.C:39
 RsnConfigPhiKaonTest.C:40
 RsnConfigPhiKaonTest.C:41
 RsnConfigPhiKaonTest.C:42
 RsnConfigPhiKaonTest.C:43
 RsnConfigPhiKaonTest.C:44
 RsnConfigPhiKaonTest.C:45
 RsnConfigPhiKaonTest.C:46
 RsnConfigPhiKaonTest.C:47
 RsnConfigPhiKaonTest.C:48
 RsnConfigPhiKaonTest.C:49
 RsnConfigPhiKaonTest.C:50
 RsnConfigPhiKaonTest.C:51
 RsnConfigPhiKaonTest.C:52
 RsnConfigPhiKaonTest.C:53
 RsnConfigPhiKaonTest.C:54
 RsnConfigPhiKaonTest.C:55
 RsnConfigPhiKaonTest.C:56
 RsnConfigPhiKaonTest.C:57
 RsnConfigPhiKaonTest.C:58
 RsnConfigPhiKaonTest.C:59
 RsnConfigPhiKaonTest.C:60
 RsnConfigPhiKaonTest.C:61
 RsnConfigPhiKaonTest.C:62
 RsnConfigPhiKaonTest.C:63
 RsnConfigPhiKaonTest.C:64
 RsnConfigPhiKaonTest.C:65
 RsnConfigPhiKaonTest.C:66
 RsnConfigPhiKaonTest.C:67
 RsnConfigPhiKaonTest.C:68
 RsnConfigPhiKaonTest.C:69
 RsnConfigPhiKaonTest.C:70
 RsnConfigPhiKaonTest.C:71
 RsnConfigPhiKaonTest.C:72
 RsnConfigPhiKaonTest.C:73
 RsnConfigPhiKaonTest.C:74
 RsnConfigPhiKaonTest.C:75
 RsnConfigPhiKaonTest.C:76
 RsnConfigPhiKaonTest.C:77
 RsnConfigPhiKaonTest.C:78
 RsnConfigPhiKaonTest.C:79
 RsnConfigPhiKaonTest.C:80
 RsnConfigPhiKaonTest.C:81
 RsnConfigPhiKaonTest.C:82
 RsnConfigPhiKaonTest.C:83
 RsnConfigPhiKaonTest.C:84
 RsnConfigPhiKaonTest.C:85
 RsnConfigPhiKaonTest.C:86
 RsnConfigPhiKaonTest.C:87
 RsnConfigPhiKaonTest.C:88
 RsnConfigPhiKaonTest.C:89
 RsnConfigPhiKaonTest.C:90
 RsnConfigPhiKaonTest.C:91
 RsnConfigPhiKaonTest.C:92
 RsnConfigPhiKaonTest.C:93
 RsnConfigPhiKaonTest.C:94
 RsnConfigPhiKaonTest.C:95
 RsnConfigPhiKaonTest.C:96
 RsnConfigPhiKaonTest.C:97
 RsnConfigPhiKaonTest.C:98
 RsnConfigPhiKaonTest.C:99
 RsnConfigPhiKaonTest.C:100
 RsnConfigPhiKaonTest.C:101
 RsnConfigPhiKaonTest.C:102
 RsnConfigPhiKaonTest.C:103
 RsnConfigPhiKaonTest.C:104
 RsnConfigPhiKaonTest.C:105
 RsnConfigPhiKaonTest.C:106
 RsnConfigPhiKaonTest.C:107
 RsnConfigPhiKaonTest.C:108
 RsnConfigPhiKaonTest.C:109
 RsnConfigPhiKaonTest.C:110
 RsnConfigPhiKaonTest.C:111
 RsnConfigPhiKaonTest.C:112
 RsnConfigPhiKaonTest.C:113
 RsnConfigPhiKaonTest.C:114
 RsnConfigPhiKaonTest.C:115
 RsnConfigPhiKaonTest.C:116
 RsnConfigPhiKaonTest.C:117
 RsnConfigPhiKaonTest.C:118
 RsnConfigPhiKaonTest.C:119
 RsnConfigPhiKaonTest.C:120
 RsnConfigPhiKaonTest.C:121
 RsnConfigPhiKaonTest.C:122
 RsnConfigPhiKaonTest.C:123
 RsnConfigPhiKaonTest.C:124
 RsnConfigPhiKaonTest.C:125
 RsnConfigPhiKaonTest.C:126
 RsnConfigPhiKaonTest.C:127
 RsnConfigPhiKaonTest.C:128
 RsnConfigPhiKaonTest.C:129
 RsnConfigPhiKaonTest.C:130
 RsnConfigPhiKaonTest.C:131
 RsnConfigPhiKaonTest.C:132
 RsnConfigPhiKaonTest.C:133
 RsnConfigPhiKaonTest.C:134
 RsnConfigPhiKaonTest.C:135
 RsnConfigPhiKaonTest.C:136
 RsnConfigPhiKaonTest.C:137
 RsnConfigPhiKaonTest.C:138
 RsnConfigPhiKaonTest.C:139
 RsnConfigPhiKaonTest.C:140
 RsnConfigPhiKaonTest.C:141
 RsnConfigPhiKaonTest.C:142
 RsnConfigPhiKaonTest.C:143
 RsnConfigPhiKaonTest.C:144
 RsnConfigPhiKaonTest.C:145
 RsnConfigPhiKaonTest.C:146
 RsnConfigPhiKaonTest.C:147
 RsnConfigPhiKaonTest.C:148
 RsnConfigPhiKaonTest.C:149
 RsnConfigPhiKaonTest.C:150
 RsnConfigPhiKaonTest.C:151
 RsnConfigPhiKaonTest.C:152
 RsnConfigPhiKaonTest.C:153
 RsnConfigPhiKaonTest.C:154
 RsnConfigPhiKaonTest.C:155
 RsnConfigPhiKaonTest.C:156
 RsnConfigPhiKaonTest.C:157
 RsnConfigPhiKaonTest.C:158
 RsnConfigPhiKaonTest.C:159
 RsnConfigPhiKaonTest.C:160
 RsnConfigPhiKaonTest.C:161
 RsnConfigPhiKaonTest.C:162
 RsnConfigPhiKaonTest.C:163
 RsnConfigPhiKaonTest.C:164
 RsnConfigPhiKaonTest.C:165
 RsnConfigPhiKaonTest.C:166
 RsnConfigPhiKaonTest.C:167
 RsnConfigPhiKaonTest.C:168
 RsnConfigPhiKaonTest.C:169
 RsnConfigPhiKaonTest.C:170
 RsnConfigPhiKaonTest.C:171
 RsnConfigPhiKaonTest.C:172
 RsnConfigPhiKaonTest.C:173
 RsnConfigPhiKaonTest.C:174
 RsnConfigPhiKaonTest.C:175
 RsnConfigPhiKaonTest.C:176
 RsnConfigPhiKaonTest.C:177
 RsnConfigPhiKaonTest.C:178
 RsnConfigPhiKaonTest.C:179
 RsnConfigPhiKaonTest.C:180
 RsnConfigPhiKaonTest.C:181
 RsnConfigPhiKaonTest.C:182
 RsnConfigPhiKaonTest.C:183