ROOT logo
//
// *** Configuration script for KStar->Kpi analysis with 2010 runs ***
// 
// A configuration script for RSN package needs to define the followings:
//
// (1) decay tree of each resonance to be studied, which is needed to select
//     true pairs and to assign the right mass to all candidate daughters
// (2) cuts at all levels: single daughters, tracks, events
// (3) output objects: histograms or trees
//
Bool_t RsnConfigKStarTPC
(
   AliRsnAnalysisTask *task,
   Bool_t              isMC,
   Bool_t              useCentrality,
   AliRsnCutSet       *eventCuts
)
{
   if (!task) ::Error("RsnConfigKStarTPC", "NULL task");
   
   // we define here a suffix to differentiate names of different setups for the same resonance
   // and we define also the name of the list of tracks we want to select for the analysis
   // (if will fail if no lists with this name were added to the RsnInputHandler)
   const char *suffix     = "tpc";
   const char *listName1  = "kaonTPC";
   const char *listName2  = "pionTPC";
   Bool_t      useCharged = kTRUE;
   Int_t       listID1    = -1;
   Int_t       listID2    = -1;
   
   // find the index of the corresponding list in the RsnInputHandler
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   AliMultiInputEventHandler *multi = dynamic_cast<AliMultiInputEventHandler*>(mgr->GetInputEventHandler());
   if (multi) {
      TObjArray *array = multi->InputEventHandlers();
      AliRsnInputHandler *rsn = (AliRsnInputHandler*)array->FindObject("rsnInputHandler");
      if (rsn) {
         AliRsnDaughterSelector *sel = rsn->GetSelector();
         listID1 = sel->GetID(listName1, useCharged);
         listID2 = sel->GetID(listName2, useCharged);
      }
   }
   if (listID1 >= 0 && listID2 >= 0)
      ::Info("RsnConfigKStarTPC.C", "Required lists '%s' and '%s' stay in positions %d and %d", listName1, listName2, listID1, listID2);
   else {
      ::Error("RsnConfigKStarTPC.C", "Required lists '%s' and '%s' absent in handler!", listName1, listName2);
      return kFALSE;
   }
            
   // ----------------------------------------------------------------------------------------------
   // -- DEFINITIONS -------------------------------------------------------------------------------
   // ----------------------------------------------------------------------------------------------
   
   // PAIR DEFINITIONS:
   // this contains the definition of particle species and charge for both daughters of a resonance,
   // which are used for the following purposes:
   // --> species is used to assign the mass to the daughter (e.g. for building invariant mass)
   // --> charge is used to select what tracks to use when doing the computation loops
   // When a user wants to compute a like-sign background, he must define also a pair definition
   // for each like-sign: in case of charged track decays, we need one for ++ and one for --
   // Last two arguments are necessary only in some cases (but it is not bad to well initialize them):
   // --> PDG code of resonance, which is used for selecting true pairs, when needed
   // --> nominal resonance mass, which is used for computing quantities like Y or Mt
   AliRsnPairDef *kstar_kaonP_pionM = new AliRsnPairDef(AliRsnDaughter::kKaon, '+', AliRsnDaughter::kPion, '-', 313, 0.896);
   AliRsnPairDef *kstar_kaonM_pionP = new AliRsnPairDef(AliRsnDaughter::kKaon, '-', AliRsnDaughter::kPion, '+', 313, 0.896);
   AliRsnPairDef *kstar_kaonP_pionP = new AliRsnPairDef(AliRsnDaughter::kKaon, '+', AliRsnDaughter::kPion, '+', 313, 0.896);
   AliRsnPairDef *kstar_kaonM_pionM = new AliRsnPairDef(AliRsnDaughter::kKaon, '-', AliRsnDaughter::kPion, '-', 313, 0.896);

   // PAIR LOOPS:
   // these are the objects which drive the computations and fill the output histograms
   // each one requires to be initialized with an AliRsnPairDef object, which provided masses,
   // last argument tells if the pair is for mixing or not (this can be also set afterwards, anyway)
   const Int_t     nPairs = 8;
   Bool_t          addPair[nPairs] = {1, 1, 1, 1, 1, 1, 1, 1};
   AliRsnLoopPair *kstarLoop[nPairs];
   kstarLoop[0] = new AliRsnLoopPair(Form("%s_kstar_kaonP_pionM"     , suffix), kstar_kaonP_pionM, kFALSE);
   kstarLoop[1] = new AliRsnLoopPair(Form("%s_kstar_kaonP_pionM_true", suffix), kstar_kaonP_pionM, kFALSE);
   kstarLoop[2] = new AliRsnLoopPair(Form("%s_kstar_kaonP_pionM_mix" , suffix), kstar_kaonP_pionM, kTRUE );
   kstarLoop[3] = new AliRsnLoopPair(Form("%s_kstar_kaonM_pionP"     , suffix), kstar_kaonM_pionP, kFALSE);
   kstarLoop[4] = new AliRsnLoopPair(Form("%s_kstar_kaonM_pionP_true", suffix), kstar_kaonM_pionP, kFALSE);
   kstarLoop[5] = new AliRsnLoopPair(Form("%s_kstar_kaonM_pionP_mix" , suffix), kstar_kaonM_pionP, kTRUE );
   kstarLoop[6] = new AliRsnLoopPair(Form("%s_kstar_kaonP_pionP"     , suffix), kstar_kaonP_pionP, kFALSE);
   kstarLoop[7] = new AliRsnLoopPair(Form("%s_kstar_kaonM_pionM"     , suffix), kstar_kaonM_pionM, kFALSE);

   // set additional option for true pairs
   // 1) we select only pairs coming from the same mother, which must have the right PDG code (from pairDef)
   // 2) we select only pairs decaying according to the right channel (from pairDef species+charge definitions)
   kstarLoop[1]->SetOnlyTrue(kTRUE);
   kstarLoop[1]->SetCheckDecay(kTRUE);
   kstarLoop[4]->SetOnlyTrue(kTRUE);
   kstarLoop[4]->SetCheckDecay(kTRUE);
   
   // don't add true pairs if not MC
   if (!isMC) addPair[1] = addPair[4] = 0;
   
   // ----------------------------------------------------------------------------------------------
   // -- 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("kstar_cutY", -0.5, 0.5, isMC);
   valRapidity->SetSupportObject(kstar_kaonP_pionM);
   cutRapidity->SetValueObj(valRapidity);
   
   // add the cut to a cut set (will be simple, there's only one)
   AliRsnCutSet *pairCuts = new AliRsnCutSet("kstar_pairCuts", AliRsnTarget::kMother);
   pairCuts->AddCut(cutRapidity);
   pairCuts->SetCutScheme(cutRapidity->GetName());
   
   // ----------------------------------------------------------------------------------------------
   // -- COMPUTED VALUES & OUTPUTS -----------------------------------------------------------------
   // ----------------------------------------------------------------------------------------------
   
   // All values which should be computed are defined here and passed to the computation objects,
   // since they define all that is computed bye each one, and, in case one output is a histogram
   // they define the binning and range for that value
   //
   // NOTE:
   // --> multiplicity bins have variable size
   
   Double_t mult[] = { 0.,  1.,  2.,  3.,  4.,  5.,   6.,   7.,   8.,   9.,  10., 11., 12., 13., 
                      14., 15., 16., 17., 18., 19.,  20.,  21.,  22.,  23.,  24.,  25., 30., 35., 
                      40., 50., 60., 70., 80., 90., 100., 120., 140., 160., 180., 200., 500.};
   Int_t    nmult  = sizeof(mult) / sizeof(mult[0]);
   
   AliRsnValueStd *axisIM      = new AliRsnValueStd("kIM" , AliRsnValueStd::kPairInvMass       ,   0.5,   1.5, 0.0025);
   AliRsnValueStd *axisRes     = new AliRsnValueStd("RES" , AliRsnValueStd::kPairInvMassRes    ,  -0.5,   0.5, 0.001);
   AliRsnValueStd *axisPt      = new AliRsnValueStd("PT"  , AliRsnValueStd::kPairPt            ,   0.0,   5.0, 0.1  );
   AliRsnValueStd *axisCentV0  = new AliRsnValueStd("CNT" , AliRsnValueStd::kEventCentralityV0 ,   0.0, 100.0, 5.0  );
   AliRsnValueStd *axisMultESD = new AliRsnValueStd("MESD", AliRsnValueStd::kEventMultESDCuts  , nmult, mult);
   AliRsnValueStd *axisMultSPD = new AliRsnValueStd("MSPD", AliRsnValueStd::kEventMultSPD      , nmult, mult);
   AliRsnValueStd *axisMultTRK = new AliRsnValueStd("MTRK", AliRsnValueStd::kEventMult         , nmult, mult);
   AliRsnValueStd *axisMultMC  = new AliRsnValueStd("MMC" , AliRsnValueStd::kEventMultMC       , nmult, mult);

   // create outputs:
   // we define one for true pairs, where we add resolution, and another without it, for all others
   // it seems that it is much advantageous to use sparse histograms when adding more than 2 axes
   AliRsnListOutput *out[2];
   out[0] = new AliRsnListOutput("res"  , AliRsnListOutput::kHistoSparse);
   out[1] = new AliRsnListOutput("nores", AliRsnListOutput::kHistoSparse);
   
   // add values to outputs:
   // if centrality is required, we add it only, otherwise we add all multiplicities
   // other axes (invmass, pt) are always added
   for (Int_t i = 0; i < 2; i++) {
      out[i]->AddValue(axisIM);
      out[i]->AddValue(axisPt);
      if (useCentrality) {
         ::Info("RsnConfigKStarTPC.C", "Adding centrality axis");
         out[i]->AddValue(axisCentV0);
      } else {
         ::Info("RsnConfigKStarTPC.C", "Adding multiplicity axes");
         //out[i]->AddValue(axisMultESD);
         //out[i]->AddValue(axisMultSPD);
         out[i]->AddValue(axisMultTRK);
         if (isMC) out[i]->AddValue(axisMultMC);
      }
   }
   // resolution only in the first
   out[0]->AddValue(axisRes);
   
   // ----------------------------------------------------------------------------------------------
   // -- ADD SETTINGS TO LOOPS AND LOOPS TO TASK ---------------------------------------------------
   // ----------------------------------------------------------------------------------------------
   
   for (Int_t ip = 0; ip < nPairs; ip++) {
      // skip pairs not to be added
      if (!addPair[ip]) continue;
      // assign list IDs
      kstarLoop[ip]->SetListID(0, listID1);
      kstarLoop[ip]->SetListID(1, listID2);
      // assign event cuts
      kstarLoop[ip]->SetEventCuts(eventCuts);
      // assign pair cuts
      kstarLoop[ip]->SetPairCuts(pairCuts);
      // assign outputs
      if (ip != 1)
         kstarLoop[ip]->AddOutput(out[1]);
      else
         kstarLoop[ip]->AddOutput(out[0]);
      // add to task
      task->Add(kstarLoop[ip]);
   }
   
   return kTRUE;
}
 RsnConfigKStarTPC.C:1
 RsnConfigKStarTPC.C:2
 RsnConfigKStarTPC.C:3
 RsnConfigKStarTPC.C:4
 RsnConfigKStarTPC.C:5
 RsnConfigKStarTPC.C:6
 RsnConfigKStarTPC.C:7
 RsnConfigKStarTPC.C:8
 RsnConfigKStarTPC.C:9
 RsnConfigKStarTPC.C:10
 RsnConfigKStarTPC.C:11
 RsnConfigKStarTPC.C:12
 RsnConfigKStarTPC.C:13
 RsnConfigKStarTPC.C:14
 RsnConfigKStarTPC.C:15
 RsnConfigKStarTPC.C:16
 RsnConfigKStarTPC.C:17
 RsnConfigKStarTPC.C:18
 RsnConfigKStarTPC.C:19
 RsnConfigKStarTPC.C:20
 RsnConfigKStarTPC.C:21
 RsnConfigKStarTPC.C:22
 RsnConfigKStarTPC.C:23
 RsnConfigKStarTPC.C:24
 RsnConfigKStarTPC.C:25
 RsnConfigKStarTPC.C:26
 RsnConfigKStarTPC.C:27
 RsnConfigKStarTPC.C:28
 RsnConfigKStarTPC.C:29
 RsnConfigKStarTPC.C:30
 RsnConfigKStarTPC.C:31
 RsnConfigKStarTPC.C:32
 RsnConfigKStarTPC.C:33
 RsnConfigKStarTPC.C:34
 RsnConfigKStarTPC.C:35
 RsnConfigKStarTPC.C:36
 RsnConfigKStarTPC.C:37
 RsnConfigKStarTPC.C:38
 RsnConfigKStarTPC.C:39
 RsnConfigKStarTPC.C:40
 RsnConfigKStarTPC.C:41
 RsnConfigKStarTPC.C:42
 RsnConfigKStarTPC.C:43
 RsnConfigKStarTPC.C:44
 RsnConfigKStarTPC.C:45
 RsnConfigKStarTPC.C:46
 RsnConfigKStarTPC.C:47
 RsnConfigKStarTPC.C:48
 RsnConfigKStarTPC.C:49
 RsnConfigKStarTPC.C:50
 RsnConfigKStarTPC.C:51
 RsnConfigKStarTPC.C:52
 RsnConfigKStarTPC.C:53
 RsnConfigKStarTPC.C:54
 RsnConfigKStarTPC.C:55
 RsnConfigKStarTPC.C:56
 RsnConfigKStarTPC.C:57
 RsnConfigKStarTPC.C:58
 RsnConfigKStarTPC.C:59
 RsnConfigKStarTPC.C:60
 RsnConfigKStarTPC.C:61
 RsnConfigKStarTPC.C:62
 RsnConfigKStarTPC.C:63
 RsnConfigKStarTPC.C:64
 RsnConfigKStarTPC.C:65
 RsnConfigKStarTPC.C:66
 RsnConfigKStarTPC.C:67
 RsnConfigKStarTPC.C:68
 RsnConfigKStarTPC.C:69
 RsnConfigKStarTPC.C:70
 RsnConfigKStarTPC.C:71
 RsnConfigKStarTPC.C:72
 RsnConfigKStarTPC.C:73
 RsnConfigKStarTPC.C:74
 RsnConfigKStarTPC.C:75
 RsnConfigKStarTPC.C:76
 RsnConfigKStarTPC.C:77
 RsnConfigKStarTPC.C:78
 RsnConfigKStarTPC.C:79
 RsnConfigKStarTPC.C:80
 RsnConfigKStarTPC.C:81
 RsnConfigKStarTPC.C:82
 RsnConfigKStarTPC.C:83
 RsnConfigKStarTPC.C:84
 RsnConfigKStarTPC.C:85
 RsnConfigKStarTPC.C:86
 RsnConfigKStarTPC.C:87
 RsnConfigKStarTPC.C:88
 RsnConfigKStarTPC.C:89
 RsnConfigKStarTPC.C:90
 RsnConfigKStarTPC.C:91
 RsnConfigKStarTPC.C:92
 RsnConfigKStarTPC.C:93
 RsnConfigKStarTPC.C:94
 RsnConfigKStarTPC.C:95
 RsnConfigKStarTPC.C:96
 RsnConfigKStarTPC.C:97
 RsnConfigKStarTPC.C:98
 RsnConfigKStarTPC.C:99
 RsnConfigKStarTPC.C:100
 RsnConfigKStarTPC.C:101
 RsnConfigKStarTPC.C:102
 RsnConfigKStarTPC.C:103
 RsnConfigKStarTPC.C:104
 RsnConfigKStarTPC.C:105
 RsnConfigKStarTPC.C:106
 RsnConfigKStarTPC.C:107
 RsnConfigKStarTPC.C:108
 RsnConfigKStarTPC.C:109
 RsnConfigKStarTPC.C:110
 RsnConfigKStarTPC.C:111
 RsnConfigKStarTPC.C:112
 RsnConfigKStarTPC.C:113
 RsnConfigKStarTPC.C:114
 RsnConfigKStarTPC.C:115
 RsnConfigKStarTPC.C:116
 RsnConfigKStarTPC.C:117
 RsnConfigKStarTPC.C:118
 RsnConfigKStarTPC.C:119
 RsnConfigKStarTPC.C:120
 RsnConfigKStarTPC.C:121
 RsnConfigKStarTPC.C:122
 RsnConfigKStarTPC.C:123
 RsnConfigKStarTPC.C:124
 RsnConfigKStarTPC.C:125
 RsnConfigKStarTPC.C:126
 RsnConfigKStarTPC.C:127
 RsnConfigKStarTPC.C:128
 RsnConfigKStarTPC.C:129
 RsnConfigKStarTPC.C:130
 RsnConfigKStarTPC.C:131
 RsnConfigKStarTPC.C:132
 RsnConfigKStarTPC.C:133
 RsnConfigKStarTPC.C:134
 RsnConfigKStarTPC.C:135
 RsnConfigKStarTPC.C:136
 RsnConfigKStarTPC.C:137
 RsnConfigKStarTPC.C:138
 RsnConfigKStarTPC.C:139
 RsnConfigKStarTPC.C:140
 RsnConfigKStarTPC.C:141
 RsnConfigKStarTPC.C:142
 RsnConfigKStarTPC.C:143
 RsnConfigKStarTPC.C:144
 RsnConfigKStarTPC.C:145
 RsnConfigKStarTPC.C:146
 RsnConfigKStarTPC.C:147
 RsnConfigKStarTPC.C:148
 RsnConfigKStarTPC.C:149
 RsnConfigKStarTPC.C:150
 RsnConfigKStarTPC.C:151
 RsnConfigKStarTPC.C:152
 RsnConfigKStarTPC.C:153
 RsnConfigKStarTPC.C:154
 RsnConfigKStarTPC.C:155
 RsnConfigKStarTPC.C:156
 RsnConfigKStarTPC.C:157
 RsnConfigKStarTPC.C:158
 RsnConfigKStarTPC.C:159
 RsnConfigKStarTPC.C:160
 RsnConfigKStarTPC.C:161
 RsnConfigKStarTPC.C:162
 RsnConfigKStarTPC.C:163
 RsnConfigKStarTPC.C:164
 RsnConfigKStarTPC.C:165
 RsnConfigKStarTPC.C:166
 RsnConfigKStarTPC.C:167
 RsnConfigKStarTPC.C:168
 RsnConfigKStarTPC.C:169
 RsnConfigKStarTPC.C:170
 RsnConfigKStarTPC.C:171
 RsnConfigKStarTPC.C:172
 RsnConfigKStarTPC.C:173
 RsnConfigKStarTPC.C:174
 RsnConfigKStarTPC.C:175
 RsnConfigKStarTPC.C:176
 RsnConfigKStarTPC.C:177
 RsnConfigKStarTPC.C:178
 RsnConfigKStarTPC.C:179
 RsnConfigKStarTPC.C:180
 RsnConfigKStarTPC.C:181
 RsnConfigKStarTPC.C:182
 RsnConfigKStarTPC.C:183
 RsnConfigKStarTPC.C:184
 RsnConfigKStarTPC.C:185
 RsnConfigKStarTPC.C:186
 RsnConfigKStarTPC.C:187
 RsnConfigKStarTPC.C:188
 RsnConfigKStarTPC.C:189