]>
Commit | Line | Data |
---|---|---|
a9a39f46 | 1 | void MyAnalysisMacro(TString dataset="/alice/sim/LHC10f8f_130844", |
2 | TString outFName="trbg.root", | |
3 | Bool_t doRec = kTRUE, | |
4 | Bool_t doInj = kTRUE, | |
5 | Bool_t doRot = kTRUE, | |
6 | Bool_t doMix = kFALSE, | |
7 | Bool_t useMC = kTRUE, | |
8 | Bool_t checkReconstructables = kTRUE, | |
9 | // | |
10 | Float_t etaCut = 2.5, | |
11 | // | |
12 | // specific parameters for reconstruction | |
13 | //----------------------- Zv selection parameters important for mixing, to be tuned | |
14 | Float_t zMin = -20, | |
15 | Float_t zMax = 20, | |
16 | Float_t zMixBinSz = 5, //0.1, | |
17 | //--------------------------------------------------------------------------------- | |
18 | // | |
19 | //----------------------- Ntracklets selection parameters important for mixing, to be tuned | |
20 | Float_t ntMin = 1, | |
21 | Float_t ntMax = 15000, | |
22 | Float_t ntMixBinSz = 5000, | |
23 | //--------------------------------------------------------------------------------- | |
24 | // | |
25 | float phiRot = 3.14159e+00, | |
26 | float injScale = 0.7, | |
27 | Bool_t scaleDTheta = kTRUE, | |
28 | float nStdDev = 25., | |
29 | float dphi = 0.08, | |
30 | float dtht = 0.025, | |
31 | float phishift = 0.0045, | |
32 | Bool_t remOvl = kTRUE, | |
33 | float ovlPhiCut = 0.005, | |
34 | float ovlZetaCut = 0.05, | |
35 | Int_t nEvents = 50000, | |
36 | Int_t nEventsSkip = 0) | |
37 | { | |
38 | // | |
39 | TString format = GetFormatFromDataSet(dataset); | |
40 | // | |
41 | // ALICE stuff | |
42 | AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); | |
43 | if (!mgr) mgr = new AliAnalysisManager("Test train"); | |
44 | // | |
45 | InputHandlerSetup(format,useMC); | |
46 | if (doMix) MixHandlerSetup(ntMin,ntMax,ntMixBinSz, zMin,zMax,zMixBinSz); | |
47 | // compile our task | |
48 | gProof->Load("AliITSMultRecBg.cxx++"); | |
49 | gProof->Load("AliTrackletTaskUni.cxx++"); | |
50 | // | |
51 | // load and run AddTask macro | |
52 | gROOT->LoadMacro("AddMultTaskRS.C"); | |
53 | // | |
54 | // create our task | |
55 | AliTrackletTaskUni *mltTask = AddMultTaskRS(outFName.Data()); | |
56 | // | |
57 | mltTask->SetDoNormalReco(doRec); | |
58 | mltTask->SetDoInjection(doInj); | |
59 | mltTask->SetDoRotation(doRot); | |
60 | mltTask->SetDoMixing(doMix); | |
61 | // | |
62 | mltTask->SetUseMC(useMC); | |
63 | mltTask->SetCheckReconstructables(checkReconstructables); | |
64 | // | |
65 | mltTask->SetEtaCut(etaCut); | |
66 | mltTask->SetZVertexMin(zMin); | |
67 | mltTask->SetZVertexMax(zMax); | |
68 | mltTask->SetMultCutMin(ntMin); | |
69 | mltTask->SetMultCutMax(ntMax); | |
70 | // | |
71 | mltTask->SetScaleDThetaBySin2T(scaleDTheta); | |
72 | mltTask->SetNStdDev(nStdDev); | |
73 | mltTask->SetPhiWindow(dphi); | |
74 | mltTask->SetThetaWindow(dtht); | |
75 | mltTask->SetPhiShift(phishift); | |
76 | mltTask->SetPhiOverlapCut(ovlPhiCut); | |
77 | mltTask->SetZetaOverlapCut(ovlZetaCut); | |
78 | mltTask->SetPhiRot(phiRot); | |
79 | mltTask->SetInjScale(injScale); | |
80 | mltTask->SetRemoveOverlaps(remOvl); | |
81 | // | |
82 | printf("new Task: %p\n",mltTask); | |
83 | // | |
84 | AddPhysicsSelection(useMC); | |
85 | mltTask->SelectCollisionCandidates(useMC ? (AliVEvent::kMB) : (AliVEvent::kUserDefined) ); | |
86 | // | |
87 | // Run analysis | |
88 | mgr->InitAnalysis(); | |
89 | // process dataset | |
90 | mgr->StartAnalysis("proof", dataset.Data(), nEvents, nEventsSkip); | |
91 | // | |
92 | TString evstCmd = "if [ -e event_stat.root ]; then \nmv event_stat.root evstat_"; | |
93 | evstCmd += outFName; evstCmd += " \nfi"; | |
94 | gSystem->Exec( evstCmd.Data() ); | |
95 | ||
96 | } | |
97 | ||
98 | ||
99 | TString GetFormatFromDataSet(TString dataset) { | |
100 | ||
101 | // Info("runAAF.C","Detecting format from dataset (may take while, depends on network connection)..."); | |
102 | TString dsTreeName; | |
103 | if (dataset.Contains("#")) { | |
104 | Info("runAAF.C",Form("Detecting format from dataset name '%s' ...",dataset.Data())); | |
105 | dsTreeName=dataset(dataset.Last('#'),dataset.Length()); | |
106 | } else { | |
107 | Info("runAAF.C",Form("Detecting format from dataset '%s' (may take while, depends on network connection) ...",dataset.Data())); | |
108 | TFileCollection *ds = gProof->GetDataSet(dataset.Data()); | |
109 | if (!ds) { | |
110 | Error(Form("Dataset %s doesn't exist on proof cluster!!!!",dataset.Data())); | |
111 | return ""; | |
112 | } | |
113 | dsTreeName = ds->GetDefaultTreeName(); | |
114 | } | |
115 | ||
116 | if (dsTreeName.Contains("esdTree")) { | |
117 | Info("runAAF.C","ESD input format detected ..."); | |
118 | return "ESD"; | |
119 | } else if (dsTreeName.Contains("aodTree")) { | |
120 | Info("runAAF.C","AOD input format detected ..."); | |
121 | return "AOD"; | |
122 | } else { | |
123 | Error("runAAF.C",Form("Tree %s is not supported !!!",dsTreeName.Data())); | |
124 | Error("runAAF.C",Form("Maybe set your DS to %s#esdTree or %s#aodTree",dataset.Data(),dataset.Data())); | |
125 | } | |
126 | ||
127 | return ""; | |
128 | } | |
129 | ||
130 | Bool_t InputHandlerSetup(TString format = "esd", Bool_t useKine = kTRUE) | |
131 | { | |
132 | format.ToLower(); | |
133 | ||
134 | AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); | |
135 | ||
136 | AliAnalysisDataContainer *cin = mgr->GetCommonInputContainer(); | |
137 | ||
138 | if (cin) return; | |
139 | ||
140 | if (!format.CompareTo("esd")) | |
141 | { | |
142 | AliESDInputHandler *esdInputHandler = dynamic_cast<AliESDInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); | |
143 | ||
144 | if (!esdInputHandler) | |
145 | { | |
146 | Info("CustomAnalysisTaskInputSetup", "Creating esdInputHandler ..."); | |
147 | esdInputHandler = new AliESDInputHandlerRP(); | |
148 | mgr->SetInputEventHandler(esdInputHandler); | |
149 | } | |
150 | ||
151 | if (useKine) | |
152 | { | |
153 | AliMCEventHandler* mcInputHandler = dynamic_cast<AliMCEventHandler*>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()); | |
154 | ||
155 | if (!mcInputHandler) | |
156 | { | |
157 | Info("CustomAnalysisTaskInputSetup", "Creating mcInputHandler ..."); | |
158 | AliMCEventHandler* mcInputHandler = new AliMCEventHandler(); | |
159 | mgr->SetMCtruthEventHandler(mcInputHandler); | |
160 | } | |
161 | } | |
162 | ||
163 | } | |
164 | else if (!format.CompareTo("aod")) | |
165 | { | |
166 | AliAODInputHandler *aodInputHandler = dynamic_cast<AliAODInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); | |
167 | ||
168 | if (!aodInputHandler) | |
169 | { | |
170 | Info("CustomAnalysisTaskInputSetup", "Creating aodInputHandler ..."); | |
171 | aodInputHandler = new AliAODInputHandler(); | |
172 | mgr->SetInputEventHandler(aodInputHandler); | |
173 | } | |
174 | } | |
175 | else | |
176 | { | |
177 | Info("Wrong input format!!! Only ESD and AOD are supported. Skipping Task ..."); | |
178 | return kFALSE; | |
179 | } | |
180 | ||
181 | return kTRUE; | |
182 | } | |
183 | ||
184 | void MixHandlerSetup(float ntMin,float ntMax,float ntMixBinSz, | |
185 | float zMin, float zMax, float zMixBinSz) | |
186 | { | |
187 | AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); | |
188 | if (!mgr) return; | |
189 | int bufferSize = 1; | |
190 | AliESDInputHandlerRP *esdH = dynamic_cast<AliESDInputHandlerRP*>(mgr->GetInputEventHandler()); | |
191 | if (!esdH) return; | |
192 | // | |
193 | AliMixEventInputHandler *esdMixH = new AliMixEventInputHandler(bufferSize); | |
194 | esdMixH->SetInputHandlerForMixing(esdH); | |
195 | AliMixEventPool *evPool = new AliMixEventPool("MyPool"); | |
196 | AliMixEventCutObj *tracklets = new AliMixEventCutObj(AliMixEventCutObj::kNumberTracklets, ntMin,ntMax,ntMixBinSz); | |
197 | AliMixEventCutObj *zvertex = new AliMixEventCutObj(AliMixEventCutObj::kZVertex, zMin,zMax, zMixBinSz); | |
198 | // evPool->AddCut(tracklets); | |
199 | evPool->AddCut(zvertex); | |
200 | //evPool->Init(); | |
201 | evPool->Print(); | |
202 | esdMixH->SetEventPool(evPool); | |
203 | esdH->SetMixingHandler(esdMixH); | |
204 | } | |
205 | ||
206 | void AddPhysicsSelection(Bool_t isMC) | |
207 | { | |
208 | // physics selection a la Michele | |
209 | printf("Requesting physics selection in %s mode\n",isMC ? "MC":"Data"); | |
210 | gROOT->ProcessLine(".L $ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C"); | |
211 | //isMC is true when processing monte carlo, the second 0 disables the cluster vs tracklets | |
212 | AliPhysicsSelectionTask* physicsSelectionTask = AddTaskPhysicsSelection(isMC,0); | |
213 | if(!isMC) { | |
214 | AliPhysicsSelection * physSel = physicsSelectionTask->GetPhysicsSelection(); | |
215 | physSel->AddCollisionTriggerClass("+CMBAC-B-NOPF-ALL"); | |
216 | /* | |
217 | physSel->AddCollisionTriggerClass("+CMBS1C-B-NOPF-ALL"); | |
218 | physSel->AddCollisionTriggerClass("+CMBS1A-B-NOPF-ALL"); | |
219 | */ | |
220 | // | |
221 | physSel->AddCollisionTriggerClass("+CMBS2C-B-NOPF-ALL"); | |
222 | physSel->AddCollisionTriggerClass("+CMBS2A-B-NOPF-ALL"); | |
223 | // | |
224 | // This are needed only to fill the statistics tables | |
225 | physSel->AddBGTriggerClass("+CMBAC-C-NOPF-ALL"); | |
226 | physSel->AddBGTriggerClass("+CMBAC-A-NOPF-ALL"); | |
227 | physSel->AddBGTriggerClass("+CMBAC-E-NOPF-ALL"); | |
228 | // | |
229 | /* | |
230 | physSel->AddBGTriggerClass("+CMBS1C-C-NOPF-ALL"); | |
231 | physSel->AddBGTriggerClass("+CMBS1C-A-NOPF-ALL"); | |
232 | physSel->AddBGTriggerClass("+CMBS1C-E-NOPF-ALL"); | |
233 | // | |
234 | physSel->AddBGTriggerClass("+CMBS1A-C-NOPF-ALL"); | |
235 | physSel->AddBGTriggerClass("+CMBS1A-A-NOPF-ALL"); | |
236 | physSel->AddBGTriggerClass("+CMBS1A-E-NOPF-ALL"); | |
237 | // | |
238 | */ | |
239 | /* | |
240 | // | |
241 | physSel->AddBGTriggerClass("+CMBS2C-C-NOPF-ALL"); | |
242 | physSel->AddBGTriggerClass("+CMBS2C-A-NOPF-ALL"); | |
243 | physSel->AddBGTriggerClass("+CMBS2C-E-NOPF-ALL"); | |
244 | // | |
245 | physSel->AddBGTriggerClass("+CMBS2A-C-NOPF-ALL"); | |
246 | physSel->AddBGTriggerClass("+CMBS2A-A-NOPF-ALL"); | |
247 | physSel->AddBGTriggerClass("+CMBS2A-E-NOPF-ALL"); | |
248 | */ | |
249 | } | |
250 | // if you use the following line, your task only gets the selected events | |
251 | // task->SelectCollisionCandidates(AliVEvent::kUserDefined); | |
252 | // | |
253 | //Alternatively, in the UserExec of your task: | |
254 | //Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kUserDefined); | |
255 | // | |
256 | } |