ROOT logo
//
// *** Configuration script for phi->KK 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 RsnConfigPhi
(
   AliRsnAnalysisTask *task,
   Bool_t              isMC,
   Bool_t              isMix,
   const char         *options
)
{
   void myError  (const char *msg) {::Error  ("RsnConfigPhi", msg);}
   void myWarning(const char *msg) {::Warning("RsnConfigPhi", msg);}
   void myInfo   (const char *msg) {::Info   ("RsnConfigPhi", msg);}

   if (!task) myError("NULL task");
   
   // ==================================================================================================================
   // == OPTIONS =======================================================================================================
   // ==================================================================================================================
   
   // Instead or getting confused with plenty of arguments in the macro (with default values),
   // we use a unique string of options with a set of conventional strings to set up the job:
   // -- "MC"/"DATA" --> what kind of sample
   // -- "ITS"/"TPC" --> what tracks to use (ITS standalone and/or TPC+ITS)
   // -- "xxxPID"    --> add the PID cuts for the detector xxx.
   // -- "MULT"      --> add axes for multiplicity
   //
   // In this point, these options are converted into boolean variables.
   
   TString opt(options);
   opt.ToUpper();
   opt.ReplaceAll(" ", "");
   
   Bool_t addITS  = opt.Contains("ITS");
   Bool_t addTPC  = opt.Contains("TPC");
   Bool_t useITS  = opt.Contains("ITSPID");
   Bool_t useTPC  = opt.Contains("TPCPID");
   Bool_t useTOF  = opt.Contains("TOFPID");
   Bool_t useMult = opt.Contains("MULT");
   
   // correct options when needed
   if (!addITS) useITS = kFALSE;
   if (!addTPC) useTPC = useTOF = kFALSE;
   
   // ==================================================================================================================
   // == DEFINITIONS ===================================================================================================
   // ==================================================================================================================
   
   // daughter definitions
   AliRsnDaughterDef *defKaonP = new AliRsnDaughterDef(AliRsnDaughter::kKaon, '+');
   AliRsnDaughterDef *defKaonM = new AliRsnDaughterDef(AliRsnDaughter::kKaon, '-');
   
   // pair definitions --> decay channels:
   // in our case, unlike-charged KK pairs for the signal, and like-charged ones for background
   AliRsnPairDef *pairDef[3];
   pairDef[0] = new AliRsnPairDef(defKaonP, defKaonM, 333, 1.019455); // unlike
   pairDef[1] = new AliRsnPairDef(defKaonP, defKaonP, 333, 1.019455); // like ++
   pairDef[2] = new AliRsnPairDef(defKaonM, defKaonM, 333, 1.019455); // like --

   // computation objects:
   // these are the objects which drive the computations, whatever it is (histos or tree filling)
   // and all tracks passed to them will be given the mass according to the reference pair definition
   // we create two unlike-sign pair computators, one for all pairs and another for true pairs (useful in MC)
   AliRsnLoopPair *pair[4];
   pair[0] = new AliRsnLoopPair(Form("%s_kaonP_kaonM_phi", opt.Data()), 0, 0, pairDef[0]); // unlike - true
   pair[1] = new AliRsnLoopPair(Form("%s_kaonP_kaonM_all", opt.Data()), 0, 0, pairDef[0]); // unlike - all
   pair[2] = new AliRsnLoopPair(Form("%s_kaonP_kaonP_all", opt.Data()), 0, 0, pairDef[1]); // like ++
   pair[3] = new AliRsnLoopPair(Form("%s_kaonM_kaonM_all", opt.Data()), 0, 0, pairDef[2]); // like --
   
   // loop on events
   AliRsnLoopEvent *event = new AliRsnLoopEvent(Form("%s_evt", opt.Data()));

   // set additional option for true pairs (slot [0])
   pair[0]->SetOnlyTrue(kTRUE);
   pair[0]->SetCheckDecay(kTRUE);
   
   // 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
   for (Int_t i = 0; i < 4; i++) pair[i]->SetListID(0, 0);
   
   // ==================================================================================================================
   // == COMPUTED VALUES ===============================================================================================
   // ==================================================================================================================
   
   // 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]);
   
   AliRsnValue *axisIM      = new AliRsnValue("IM"  , AliRsnValue::kPairInvMass   ,  0.9, 1.4, 0.001);
   AliRsnValue *axisRes     = new AliRsnValue("RES" , AliRsnValue::kPairInvMassRes, -0.5, 0.5, 0.001);
   AliRsnValue *axisPt      = new AliRsnValue("PT"  , AliRsnValue::kPairPt        ,  0.0, 5.0, 0.1  );
   AliRsnValue *axisY       = new AliRsnValue("Y"   , AliRsnValue::kPairY         , -1.1, 1.1, 0.1  );
   AliRsnValue *axisMultESD = new AliRsnValue("MESD", AliRsnValue::kEventMultESDCuts, nmult, mult);
   AliRsnValue *axisMultSPD = new AliRsnValue("MSPD", AliRsnValue::kEventMultSPD    , nmult, mult);
   AliRsnValue *axisMultMC  = new AliRsnValue("MMC" , AliRsnValue::kEventMultMC     , nmult, mult);

   // add values to pairs
   // NOTE: in previous package version, they were added to functions
   for (Int_t i = 0; i < 4; i++) {
      if (i == 0) pair[i]->AddValue(axisRes);
      pair[i]->AddValue(axisIM);
      pair[i]->AddValue(axisPt);
      pair[i]->AddValue(axisY);
      if (useMult) {
         ::Info("RsnConfigPhi", "Adding multiplicity computations");
         pair[i]->AddValue(axisMultESD);
         pair[i]->AddValue(axisMultSPD);
         if (isMC) pair[i]->AddValue(axisMultMC);
         event->AddValue(axisMultESD);
         event->AddValue(axisMultSPD);
         if (isMC) event->AddValue(axisMultMC);
      }
   }
      
   // ==================================================================================================================
   // == PAIR CUTS =====================================================================================================
   // ==================================================================================================================
   
   // Rapidity cut
   // Only thing to consider is that it needs a support object to define mass
   AliRsnCutValue *cutRapidity = new AliRsnCutValue("cutY", AliRsnValue::kPairY, -0.5, 0.5);
   cutRapidity->GetValueObj()->SetSupportObject(pairDef[0]);

   // in this case, we add the cut to the specific cut sets of all pairs
   // and we must then loop over all pairs, to add cuts to the related sets
   for (Int_t ipair = 0; ipair < 4; ipair++) {
      pair[ipair]->GetPairCuts()->AddCut(cutRapidity);
      pair[ipair]->GetPairCuts()->SetCutScheme(cutRapidity->GetName());
      ::Info("RsnConfigPhi", "Scheme for pair cuts: %s", pair[ipair]->GetPairCuts()->GetCutScheme().Data());
   }
   
   // ==================================================================================================================
   // == OUTPUTS =======================================================================================================
   // ==================================================================================================================
   
   // now we define the outputs
   // in the new version of package, we use same syntax as TNtuple:
   // for each output object we define a name, and a list of variables
   // which must contain a combination of names of the axes added to the pair
   // and third argument is an enum to decide what kind of output we want

   AliRsnOutput *ntpMult = new AliRsnOutput("ntp1", "MSPD:MESD", AliRsnOutput::kNtuple);
   AliRsnOutput *ntpIMPt = new AliRsnOutput("ntp2", "IM:PT"    , AliRsnOutput::kNtuple);
   AliRsnOutput *fcnIMPt = new AliRsnOutput("out1", "IM:PT"    , AliRsnOutput::kHistoDefault);
   AliRsnOutput *fcnIM   = new AliRsnOutput("out2", "IM"       , AliRsnOutput::kHistoDefault);
   AliRsnOutput *fcnPt   = new AliRsnOutput("out3", "PT"       , AliRsnOutput::kHistoDefault);
   AliRsnOutput *fcnRes  = new AliRsnOutput("out4", "IM:PT:RES", AliRsnOutput::kHistoSparse);
   
   // add outputs to pairs
   for (Int_t ipair = 0; ipair < 4; ipair++) {
      if (!ipair) pair[ipair]->AddOutput(fcnRes);
      pair[ipair]->AddOutput(ntpIMPt);
      //pair[ipair]->AddOutput(fcnIMPt);
      //pair[ipair]->AddOutput(fcnIM);
      //pair[ipair]->AddOutput(fcnPt);
   }
   if (useMult) event->AddOutput(ntpMult);
   
   // ==================================================================================================================
   // == CONCLUSION ====================================================================================================
   // ==================================================================================================================
   
   // add all created objects to the task
   for (Int_t i = 0; i < 4; i++) {
      if (i == 0 && !isMC) continue;
      if (isMix && i != 1) continue;
      pair[i]->SetMixed(isMix);
      task->Add(pair[i]);
   }
   if (useMult) task->Add(event);
   
   return kTRUE;
}
 RsnConfigPhiTest.C:1
 RsnConfigPhiTest.C:2
 RsnConfigPhiTest.C:3
 RsnConfigPhiTest.C:4
 RsnConfigPhiTest.C:5
 RsnConfigPhiTest.C:6
 RsnConfigPhiTest.C:7
 RsnConfigPhiTest.C:8
 RsnConfigPhiTest.C:9
 RsnConfigPhiTest.C:10
 RsnConfigPhiTest.C:11
 RsnConfigPhiTest.C:12
 RsnConfigPhiTest.C:13
 RsnConfigPhiTest.C:14
 RsnConfigPhiTest.C:15
 RsnConfigPhiTest.C:16
 RsnConfigPhiTest.C:17
 RsnConfigPhiTest.C:18
 RsnConfigPhiTest.C:19
 RsnConfigPhiTest.C:20
 RsnConfigPhiTest.C:21
 RsnConfigPhiTest.C:22
 RsnConfigPhiTest.C:23
 RsnConfigPhiTest.C:24
 RsnConfigPhiTest.C:25
 RsnConfigPhiTest.C:26
 RsnConfigPhiTest.C:27
 RsnConfigPhiTest.C:28
 RsnConfigPhiTest.C:29
 RsnConfigPhiTest.C:30
 RsnConfigPhiTest.C:31
 RsnConfigPhiTest.C:32
 RsnConfigPhiTest.C:33
 RsnConfigPhiTest.C:34
 RsnConfigPhiTest.C:35
 RsnConfigPhiTest.C:36
 RsnConfigPhiTest.C:37
 RsnConfigPhiTest.C:38
 RsnConfigPhiTest.C:39
 RsnConfigPhiTest.C:40
 RsnConfigPhiTest.C:41
 RsnConfigPhiTest.C:42
 RsnConfigPhiTest.C:43
 RsnConfigPhiTest.C:44
 RsnConfigPhiTest.C:45
 RsnConfigPhiTest.C:46
 RsnConfigPhiTest.C:47
 RsnConfigPhiTest.C:48
 RsnConfigPhiTest.C:49
 RsnConfigPhiTest.C:50
 RsnConfigPhiTest.C:51
 RsnConfigPhiTest.C:52
 RsnConfigPhiTest.C:53
 RsnConfigPhiTest.C:54
 RsnConfigPhiTest.C:55
 RsnConfigPhiTest.C:56
 RsnConfigPhiTest.C:57
 RsnConfigPhiTest.C:58
 RsnConfigPhiTest.C:59
 RsnConfigPhiTest.C:60
 RsnConfigPhiTest.C:61
 RsnConfigPhiTest.C:62
 RsnConfigPhiTest.C:63
 RsnConfigPhiTest.C:64
 RsnConfigPhiTest.C:65
 RsnConfigPhiTest.C:66
 RsnConfigPhiTest.C:67
 RsnConfigPhiTest.C:68
 RsnConfigPhiTest.C:69
 RsnConfigPhiTest.C:70
 RsnConfigPhiTest.C:71
 RsnConfigPhiTest.C:72
 RsnConfigPhiTest.C:73
 RsnConfigPhiTest.C:74
 RsnConfigPhiTest.C:75
 RsnConfigPhiTest.C:76
 RsnConfigPhiTest.C:77
 RsnConfigPhiTest.C:78
 RsnConfigPhiTest.C:79
 RsnConfigPhiTest.C:80
 RsnConfigPhiTest.C:81
 RsnConfigPhiTest.C:82
 RsnConfigPhiTest.C:83
 RsnConfigPhiTest.C:84
 RsnConfigPhiTest.C:85
 RsnConfigPhiTest.C:86
 RsnConfigPhiTest.C:87
 RsnConfigPhiTest.C:88
 RsnConfigPhiTest.C:89
 RsnConfigPhiTest.C:90
 RsnConfigPhiTest.C:91
 RsnConfigPhiTest.C:92
 RsnConfigPhiTest.C:93
 RsnConfigPhiTest.C:94
 RsnConfigPhiTest.C:95
 RsnConfigPhiTest.C:96
 RsnConfigPhiTest.C:97
 RsnConfigPhiTest.C:98
 RsnConfigPhiTest.C:99
 RsnConfigPhiTest.C:100
 RsnConfigPhiTest.C:101
 RsnConfigPhiTest.C:102
 RsnConfigPhiTest.C:103
 RsnConfigPhiTest.C:104
 RsnConfigPhiTest.C:105
 RsnConfigPhiTest.C:106
 RsnConfigPhiTest.C:107
 RsnConfigPhiTest.C:108
 RsnConfigPhiTest.C:109
 RsnConfigPhiTest.C:110
 RsnConfigPhiTest.C:111
 RsnConfigPhiTest.C:112
 RsnConfigPhiTest.C:113
 RsnConfigPhiTest.C:114
 RsnConfigPhiTest.C:115
 RsnConfigPhiTest.C:116
 RsnConfigPhiTest.C:117
 RsnConfigPhiTest.C:118
 RsnConfigPhiTest.C:119
 RsnConfigPhiTest.C:120
 RsnConfigPhiTest.C:121
 RsnConfigPhiTest.C:122
 RsnConfigPhiTest.C:123
 RsnConfigPhiTest.C:124
 RsnConfigPhiTest.C:125
 RsnConfigPhiTest.C:126
 RsnConfigPhiTest.C:127
 RsnConfigPhiTest.C:128
 RsnConfigPhiTest.C:129
 RsnConfigPhiTest.C:130
 RsnConfigPhiTest.C:131
 RsnConfigPhiTest.C:132
 RsnConfigPhiTest.C:133
 RsnConfigPhiTest.C:134
 RsnConfigPhiTest.C:135
 RsnConfigPhiTest.C:136
 RsnConfigPhiTest.C:137
 RsnConfigPhiTest.C:138
 RsnConfigPhiTest.C:139
 RsnConfigPhiTest.C:140
 RsnConfigPhiTest.C:141
 RsnConfigPhiTest.C:142
 RsnConfigPhiTest.C:143
 RsnConfigPhiTest.C:144
 RsnConfigPhiTest.C:145
 RsnConfigPhiTest.C:146
 RsnConfigPhiTest.C:147
 RsnConfigPhiTest.C:148
 RsnConfigPhiTest.C:149
 RsnConfigPhiTest.C:150
 RsnConfigPhiTest.C:151
 RsnConfigPhiTest.C:152
 RsnConfigPhiTest.C:153
 RsnConfigPhiTest.C:154
 RsnConfigPhiTest.C:155
 RsnConfigPhiTest.C:156
 RsnConfigPhiTest.C:157
 RsnConfigPhiTest.C:158
 RsnConfigPhiTest.C:159
 RsnConfigPhiTest.C:160
 RsnConfigPhiTest.C:161
 RsnConfigPhiTest.C:162
 RsnConfigPhiTest.C:163
 RsnConfigPhiTest.C:164
 RsnConfigPhiTest.C:165
 RsnConfigPhiTest.C:166
 RsnConfigPhiTest.C:167
 RsnConfigPhiTest.C:168
 RsnConfigPhiTest.C:169
 RsnConfigPhiTest.C:170
 RsnConfigPhiTest.C:171
 RsnConfigPhiTest.C:172
 RsnConfigPhiTest.C:173
 RsnConfigPhiTest.C:174
 RsnConfigPhiTest.C:175
 RsnConfigPhiTest.C:176
 RsnConfigPhiTest.C:177
 RsnConfigPhiTest.C:178
 RsnConfigPhiTest.C:179
 RsnConfigPhiTest.C:180
 RsnConfigPhiTest.C:181
 RsnConfigPhiTest.C:182
 RsnConfigPhiTest.C:183
 RsnConfigPhiTest.C:184
 RsnConfigPhiTest.C:185
 RsnConfigPhiTest.C:186
 RsnConfigPhiTest.C:187
 RsnConfigPhiTest.C:188
 RsnConfigPhiTest.C:189