TENDER becomes Tender
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / macros / train / AnalysisSetup.C
1 //
2 // This macro sets all the aspects of configuration of an Analysis Train run
3 // which are always the same for all kinds of analysis (local, PROOF, AliEn)
4 //
5 // Inputs:
6 //
7 //   - taskList       = a string containin all the 'add-task' macros to be used
8 //   - options        = a set of keywords which drive some configurations
9 //   - outputFileName = name of file produced by train
10 //   - configPath     = a path where all required config macros are stored
11 //
12 // Notes:
13 //
14 //   - in case the source is an ESD, and if inputs are a MC production
15 //     the MC input handler is created by default
16 //
17 Bool_t AnalysisSetup
18 (
19    Bool_t      isMC,
20    Int_t       nmix,
21    const char *options,
22    const char *outputFileName,
23    const char *configPath
24 )
25 {
26    //
27    // === EXAMINE OPTIONS ==========================================================================
28    //
29
30    // this is done using the utility 'RsnOptions.C'
31    // which provides a unique way to interpret them
32    
33    TString opt(options);
34    opt.ToUpper();
35    opt.ReplaceAll(" ", "");
36    
37    Bool_t isMix      = (nmix > 0);
38    Bool_t isESD      = opt.Contains("ESD");
39    Bool_t isAOD      = opt.Contains("AOD");
40    Bool_t useTender  = opt.Contains("Tender");
41    Bool_t usePhysSel = opt.Contains("PHYS");
42    Bool_t noV0       = opt.Contains("NOV0");
43    Bool_t useCent    = opt.Contains("CENT");
44    
45    //
46    // === LOAD LIBRARIES ===========================================================================
47    //
48
49    gSystem->Load("libVMC.so");
50    gSystem->Load("libTree.so");
51    gSystem->Load("libPhysics.so");
52    gSystem->Load("libMatrix.so");
53    gSystem->Load("libMinuit.so");
54    gSystem->Load("libXMLParser.so");
55    gSystem->Load("libGui.so");
56    gSystem->Load("libSTEERBase.so");
57    gSystem->Load("libESD.so");
58    gSystem->Load("libAOD.so");
59    gSystem->Load("libANALYSIS.so");
60    gSystem->Load("libANALYSISalice.so");
61    gSystem->Load("libEventMixing.so");
62    gSystem->Load("libCORRFW.so");
63    
64    if (useTender) {
65       ::Info("AnalysisSetup", "Loading tender libraries");
66       gSystem->Load("libTender.so");
67       gSystem->Load("libTenderSupplies.so");
68    }
69    
70    if (!AliAnalysisAlien::SetupPar("PWG2resonances.par")) return kFALSE;
71
72    //
73    // === ANALYSIS MANAGER CONFIGURATION ===========================================================
74    //
75
76    // create analysis manager
77    AliAnalysisManager *mgr = new AliAnalysisManager("RsnAnalysisManager");
78    mgr->SetCommonFileName(outputFileName);
79    ::Info("AnalysisSetup", "Common file name: %s", outputFileName);
80
81    //
82    // === INPUT / OUTPUT HANDLER CONFIGURATION =====================================================
83    //
84
85    ::Info("AnalysisSetup", "Using Multi Handler");
86    // create multi input event handler
87    AliMultiInputEventHandler *multiHandler = new AliMultiInputEventHandler();
88
89    // since there is an exit point above if the job
90    // isn't either ESD or AOD, here we don't recheck that
91    if (isESD) {
92       ::Info("AnalysisSetup", "Creating ESD handler");
93       AliESDInputHandler *esdHandler = new AliESDInputHandler();
94       multiHandler->AddInputEventHandler(esdHandler);
95
96       // if possible, create also MC handler
97       if (isMC) {
98          ::Info("AnalysisSetup", "Creating MC handler");
99          AliMCEventHandler *mcHandler  = new AliMCEventHandler();
100          multiHandler->AddInputEventHandler(mcHandler);
101       }
102    } else {
103       ::Info("AnalysisSetup", "Creating AOD handler");
104       AliAODInputHandler *aodHandler = new AliAODInputHandler();
105       multiHandler->AddInputEventHandler(aodHandler);
106    }
107
108    // add RSN input handler
109    ::Info("AnalysisSetup", "Adding RSN input handler");
110    gROOT->LoadMacro(Form("%s/AddRsnInputHandler.C", configPath));
111    AddRsnInputHandler(isMC, multiHandler);
112    
113    // set the input event handler for manager
114    mgr->SetInputEventHandler(multiHandler);
115    
116    // set event mixing properties, if required
117    if (isMix) {
118       ::Info("AnalysisSetup", "Setting mixing to n = %d", nmix);
119       // define mixing handler
120       AliMixInputEventHandler *mixHandler = new AliMixInputEventHandler(1, nmix);
121       mixHandler->SetInputHandlerForMixing(multiHandler);
122
123       // define binnings
124       AliMixEventPool   *evPool  = new AliMixEventPool();
125       AliMixEventCutObj *multip  = new AliMixEventCutObj(AliMixEventCutObj::kMultiplicity, 1., 10000., 1000.);
126       AliMixEventCutObj *zvertex = new AliMixEventCutObj(AliMixEventCutObj::kZVertex, -10., 10., 4.);
127       AliMixEventCutObj *cent    = new AliMixEventCutObj(AliMixEventCutObj::kCentrality, 0.0, 100.0, 10.0, "V0M");
128
129       // add cuts to handler and handler to manager
130       evPool->AddCut(zvertex);
131       if (useCent) evPool->AddCut(cent); else evPool->AddCut(multip);
132       mixHandler->SetEventPool(evPool);
133       multiHandler->AddInputEventHandler(mixHandler);
134    }
135
136    //
137    // === CONFIGURE AND INSERT PHYSICS SELECTION & Tender SUPPLY ===================================
138    //
139
140    // add event selection for data if running ESD
141    if (isESD) {
142       // add tender supply for TOF
143       if (useTender) {
144          ::Info("AnalysisSetup", "options '%s' require to add tender", options);
145          gROOT->LoadMacro(Form("%s/AddTenderSupplies.C", configPath));
146          AddTenderSupplies(100.0, kTRUE, kFALSE);
147       }
148
149       // add event selection for data
150       // and swtich off VZERO if tender is not used
151       if (usePhysSel) {
152          ::Info("AnalysisSetup", "options '%s' require to add physics selection", options);
153          gROOT->LoadMacro("$(ALICE_ROOT)/ANALYSIS/macros/AddTaskPhysicsSelection.C");
154          AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(isMC);
155          if (noV0) {
156             ::Info("AnalysisSetup", "options '%s' require to skip V0 info", options);
157             physSelTask->GetPhysicsSelection()->SetSkipV0(kTRUE);
158          }
159          if (multiHandler) {
160             AliESDInputHandler *esdHandler = dynamic_cast<AliESDInputHandler*>(multiHandler->GetFirstInputEventHandler());
161             esdHandler->SetEventSelection(multiHandler->GetEventSelection());
162          }
163       }
164    }
165    
166    // add PID response task
167    //gROOT->LoadMacro("$(ALICE_ROOT)/ANALYSIS/macros/AddTaskPIDResponse.C");
168    //AddTaskPIDResponse(isMC);
169    
170    ::Info("AnalysisSetup", "Setup successful");
171    return kTRUE;
172 }