]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ANALYSIS/AliPhysicsSelection.cxx
Fix for proper PID configuration for both sets of cuts
[u/mrichter/AliRoot.git] / ANALYSIS / AliPhysicsSelection.cxx
CommitLineData
61899827 1/* $Id: AliPhysicsSelection.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */
2
3/**************************************************************************
4 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
5 * *
6 * Author: The ALICE Off-line Project. *
7 * Contributors are mentioned in the code where appropriate. *
8 * *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
17
18//-------------------------------------------------------------------------
19// Implementation of Class AliPhysicsSelection
528640ed 20// This class selects collision candidates from data runs, applying selection cuts on triggers
21// and background rejection based on the content of the ESD
22//
23// Usage:
24//
a2ce3799 25// Create the object:
528640ed 26// fPhysicsSelection = new AliPhysicsSelection;
a2ce3799 27//
28// For MC data, call
29// fPhysicsSelection->SetAnalyzeMC()
528640ed 30//
31// To check if an event is a collision candidate, use:
32// fPhysicsSelection->IsCollisionCandidate(fESD)
33//
34// After processing save the resulting histograms to a file with (a folder physics_selection
35// will be created that contains the histograms):
36// fPhysicsSelection->SaveHistograms("physics_selection")
37//
38// To print statistics after processing use:
39// fPhysicsSelection->Print();
40//
73cc8654 41// The BX ids corresponding to real bunches crossings p2 are
42// automatically selected. You cannot process runs with different
43// filling schemes if this option is set. If you want to disable this,
44// use:
45// fPhysicsSelection->SetUseBXNumbers(0);
46//
47//
48// If you are analizing muons and you want to keep the muon triggers
49// besides the CINT1B you can set:
50// fPhysicsSelection->SetUseMuonTriggers();
51//
85c71ba7 52//
53// To compute the Background automatically using the control triggers
54// use:
55// fPhysicsSelection->SetComputeBG();
56// this will show the value of the Beam Gas, accidentals and good
57// events as additional rows in the statistic tables, but it will NOT
58// subtract the background automatically.
59// This option will only work for runs taken with the CINT1
60// suite. This options enables automatically also the usage of BX
61// numbers. You can only process one run at a time if you require this
62// options, because it uses the bunch intensity estimated run by run.
63//
64// The BG will usually be more important in the so-called "bin 0": the
65// class can also compute the statistics table for events in this
66// bin. Since the definition of bin 0 may in general change from
67// analysis to analysis, the user needs to provide a callback
68// implementing the definition of bin zero. The callback should be
69// implemented as a method in the analysis task and should override
70// the IsEventInBinZero method of AliAnalysisTaskSE, and should thus
71// have the the following prototype:
72// Bool_t IsEventInBinZero();
73// It should return true if the event is in the bin 0 and it is set by
74// passing to the physics selection the NAME of the task where the
75// callback is implemented:
76// fPhysicsSelection->SetBin0Callback("MyTask").
77//
78//
decf6fd4 79// Usually the class selects the trigger scheme by itself depending on the run number.
80// Nevertheless, you can do that manually by calling AddCollisionTriggerClass() and AddBGTriggerClass()
81// Example:
82// To define the class CINT1B-ABCE-NOPF-ALL as collision trigger (those will be accepted as
83// collision candidates when they pass the selection):
84// AddCollisionTriggerClass("+CINT1B-ABCE-NOPF-ALL #769 #3119");
85// To select on bunch crossing IDs in addition, use:
86// AddCollisionTriggerClass("+CINT1B-ABCE-NOPF-ALL #769 #3119");
87// To define the class CINT1A-ABCE-NOPF-ALL as a background trigger (those will only be counted
88// for the control histograms):
89// AddBGTriggerClass("+CINT1A-ABCE-NOPF-ALL");
90// You can also specify more than one trigger class in a string or you can require that some are *not*
91// present. The following line would require CSMBA-ABCE-NOPF-ALL, but CSMBB-ABCE-NOPF-ALL is not allowed
92// to be present:
93// AddBGTriggerClass("+CSMBA-ABCE-NOPF-ALL -CSMBB-ABCE-NOPF-ALL");
94//
869f9767 95// The class also supports the triggers used in heavy ion runs
96//
85c71ba7 97// Origin: Jan Fiete Grosse-Oetringhaus, CERN
98// Michele Floris, CERN
61899827 99//-------------------------------------------------------------------------
100
101#include <Riostream.h>
102#include <TH1F.h>
103#include <TH2F.h>
104#include <TList.h>
105#include <TIterator.h>
106#include <TDirectory.h>
296dd262 107#include <TObjArray.h>
7c55ebd9 108#include <TPRegexp.h>
109#include <TFormula.h>
110#include <TParameter.h>
111#include <TInterpreter.h>
61899827 112
113#include <AliPhysicsSelection.h>
114
115#include <AliTriggerAnalysis.h>
116#include <AliLog.h>
117
118#include <AliESDEvent.h>
85c71ba7 119#include <AliAnalysisTaskSE.h>
120#include "AliAnalysisManager.h"
141265a2 121#include "TPRegexp.h"
7c55ebd9 122#include "TFile.h"
123#include <AliOADBContainer.h>
124#include "AliOADBPhysicsSelection.h"
125#include "AliOADBFillingScheme.h"
eeaab745 126#include "AliOADBTriggerAnalysis.h"
61899827 127
128ClassImp(AliPhysicsSelection)
129
130AliPhysicsSelection::AliPhysicsSelection() :
296dd262 131 AliAnalysisCuts("AliPhysicsSelection", "AliPhysicsSelection"),
132 fCurrentRun(-1),
a2ce3799 133 fMC(kFALSE),
296dd262 134 fCollTrigClasses(),
135 fBGTrigClasses(),
136 fTriggerAnalysis(),
7c55ebd9 137// fHistStatisticsTokens(0),
91bea6e7 138 fHistBunchCrossing(0),
73cc8654 139 fHistTriggerPattern(0),
91bea6e7 140 fSkipTriggerClassSelection(0),
85c71ba7 141 fUsingCustomClasses(0),
142 fSkipV0(0),
8dec6e35 143 fBIFactorA(-1),
144 fBIFactorC(-1),
145 fBIFactorAC(-1),
85c71ba7 146 fComputeBG(0),
7c55ebd9 147 fBGStatOffset(-1),
73cc8654 148 fUseBXNumbers(1),
149 fUseMuonTriggers(0),
85c71ba7 150 fFillingScheme(""),
ff097e3f 151 fBin0CallBack(""),
869f9767 152 fBin0CallBackPointer(0),
7c55ebd9 153 fIsPP(kFALSE),
154 fPSOADB(0),
155 fFillOADB(0),
eeaab745 156 fTriggerOADB(0),
7c55ebd9 157 fRegexp(0),
158 fCashedTokens(0)
159
61899827 160{
161 // constructor
162
296dd262 163 fCollTrigClasses.SetOwner(1);
164 fBGTrigClasses.SetOwner(1);
165 fTriggerAnalysis.SetOwner(1);
85c71ba7 166 fHistStatistics[0] = 0;
167 fHistStatistics[1] = 0;
296dd262 168
7c55ebd9 169 fRegexp = new TPRegexp("([[:alpha:]]\\w*)");
170 fCashedTokens = new TList;
171 fCashedTokens->SetOwner();
172
61899827 173 AliLog::SetClassDebugLevel("AliPhysicsSelection", AliLog::kWarning);
174}
175
176AliPhysicsSelection::~AliPhysicsSelection()
177{
178 // destructor
85c71ba7 179
296dd262 180 fCollTrigClasses.Delete();
181 fBGTrigClasses.Delete();
182 fTriggerAnalysis.Delete();
61899827 183
85c71ba7 184 if (fHistStatistics[0])
185 {
186 delete fHistStatistics[0];
187 fHistStatistics[0] = 0;
188 }
189 if (fHistStatistics[1])
61899827 190 {
85c71ba7 191 delete fHistStatistics[1];
192 fHistStatistics[1] = 0;
61899827 193 }
7c55ebd9 194 // if (fHistStatisticsTokens) {
195 // delete fHistStatisticsTokens;
196 // fHistStatisticsTokens = 0;
197 // }
61899827 198 if (fHistBunchCrossing)
199 {
200 delete fHistBunchCrossing;
201 fHistBunchCrossing = 0;
202 }
73cc8654 203 if (fHistTriggerPattern)
204 {
205 delete fHistTriggerPattern;
206 fHistTriggerPattern = 0;
207 }
7c55ebd9 208
209 if (fPSOADB)
210 {
211 delete fPSOADB;
eeaab745 212 fPSOADB = 0;
7c55ebd9 213 }
214 if (fFillOADB)
215 {
216 delete fFillOADB;
217 fFillOADB = 0;
218 }
eeaab745 219 if (fTriggerOADB)
220 {
221 delete fTriggerOADB;
222 fTriggerOADB = 0;
223 }
7c55ebd9 224
225 if (fRegexp)
226 {
227 delete fRegexp;
228 fRegexp = 0;
229 }
230
231 if (fCashedTokens)
232 {
233 delete fCashedTokens;
234 fCashedTokens = 0;
235 }
236
237
61899827 238}
296dd262 239
c2ba5a61 240UInt_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const char* trigger, Int_t& triggerLogic) const
296dd262 241{
242 // checks if the given trigger class(es) are found for the current event
05e1da5d 243 // format of trigger: +TRIGGER1,TRIGGER1b,TRIGGER1c -TRIGGER2 [#XXX] [&YY] [*ZZ]
244 // requires one out of TRIGGER1,TRIGGER1b,TRIGGER1c and rejects TRIGGER2
0c6c629b 245 // in bunch crossing XXX
1209509c 246 // if successful, YY is returned (for association between entry in fCollTrigClasses and AliVEvent::EOfflineTriggerTypes)
c2ba5a61 247 // triggerLogic is filled with ZZ, defaults to kCINT1
296dd262 248
decf6fd4 249 Bool_t foundBCRequirement = kFALSE;
250 Bool_t foundCorrectBC = kFALSE;
251
0c6c629b 252 UInt_t returnCode = AliVEvent::kUserDefined;
c2ba5a61 253 triggerLogic = kCINT1;
0c6c629b 254
6340be16 255 AliDebug(AliLog::kDebug+1, Form("Processing event with triggers %s", aEsd->GetFiredTriggerClasses().Data()));
256
296dd262 257 TString str(trigger);
258 TObjArray* tokens = str.Tokenize(" ");
259
260 for (Int_t i=0; i < tokens->GetEntries(); i++)
261 {
262 TString str2(((TObjString*) tokens->At(i))->String());
263
decf6fd4 264 if (str2[0] == '+' || str2[0] == '-')
296dd262 265 {
decf6fd4 266 Bool_t flag = (str2[0] == '+');
267
268 str2.Remove(0, 1);
269
05e1da5d 270 TObjArray* tokens2 = str2.Tokenize(",");
271
272 Bool_t foundTriggerClass = kFALSE;
273 for (Int_t j=0; j < tokens2->GetEntries(); j++)
decf6fd4 274 {
05e1da5d 275 TString str3(((TObjString*) tokens2->At(j))->String());
276
277 if (flag && aEsd->IsTriggerClassFired(str3))
278 foundTriggerClass = kTRUE;
279 if (!flag && aEsd->IsTriggerClassFired(str3))
280 {
7c55ebd9 281 AliDebug(AliLog::kDebug+1, Form("Rejecting event because trigger class %s is present", str3.Data()));
05e1da5d 282 delete tokens2;
283 delete tokens;
284 return kFALSE;
285 }
decf6fd4 286 }
05e1da5d 287
288 delete tokens2;
289
6340be16 290 if (flag && !foundTriggerClass)
decf6fd4 291 {
7c55ebd9 292 AliDebug(AliLog::kDebug+1, Form("Rejecting event because (none of the) trigger class(es) %s is present", str2.Data()));
decf6fd4 293 delete tokens;
294 return kFALSE;
295 }
296dd262 296 }
decf6fd4 297 else if (str2[0] == '#')
296dd262 298 {
decf6fd4 299 foundBCRequirement = kTRUE;
300
301 str2.Remove(0, 1);
302
303 Int_t bcNumber = str2.Atoi();
7c55ebd9 304 AliDebug(AliLog::kDebug+1, Form("Checking for bunch crossing number %d", bcNumber));
decf6fd4 305
306 if (aEsd->GetBunchCrossNumber() == bcNumber)
307 {
308 foundCorrectBC = kTRUE;
7c55ebd9 309 AliDebug(AliLog::kDebug+1, Form("Found correct bunch crossing %d", bcNumber));
decf6fd4 310 }
296dd262 311 }
7c55ebd9 312 else if (str2[0] == '&')
0c6c629b 313 {
314 str2.Remove(0, 1);
315
1209509c 316 returnCode = str2.Atoll();
0c6c629b 317 }
c2ba5a61 318 else if (str2[0] == '*')
319 {
320 str2.Remove(0, 1);
321
322 triggerLogic = str2.Atoi();
323 }
decf6fd4 324 else
325 AliFatal(Form("Invalid trigger syntax: %s", trigger));
296dd262 326 }
327
328 delete tokens;
decf6fd4 329
330 if (foundBCRequirement && !foundCorrectBC)
331 return kFALSE;
332
0c6c629b 333 return returnCode;
296dd262 334}
2d45a1a7 335
336//______________________________________________________________________________
7c55ebd9 337TObject *AliPhysicsSelection::GetStatistics(const Option_t *option) const
2d45a1a7 338{
7c55ebd9 339// Get the statistics histograms ("ALL" and "BIN0" and "TOK")
2d45a1a7 340 TString opt(option);
341 opt.ToUpper();
342 Int_t ihist = 0;
343 if (opt == "ALL") ihist = kStatIdxAll;
344 if (opt == "BIN0") ihist = kStatIdxBin0;
7c55ebd9 345 // if (opt == "TOK") return fHistStatisticsTokens;
2d45a1a7 346 return fHistStatistics[ihist];
347}
348
7c55ebd9 349//______________________________________________________________________________
350Bool_t AliPhysicsSelection::EvaluateTriggerLogic(const AliESDEvent* aEsd, AliTriggerAnalysis* triggerAnalysis, const char* triggerLogic, Bool_t offline)
351{
352 // evaluates trigger logic. If called with no ESD pointer/triggerAnalysis pointer, it just caches the tokens
353 // Fills the statistics histogram, if booked at row i
354 TString trigger(triggerLogic);
355
356 // add space after each token (to use ReplaceAll later)
357 fRegexp->Substitute(trigger, "$1 ", "g");
358
359 while (1)
360 {
361 AliDebug(AliLog::kDebug, trigger.Data());
362
363 TArrayI pos;
364 Int_t nMatches = fRegexp->Match(trigger, "", 0, 2, &pos);
365
366 if (nMatches <= 0)
367 break;
368
369 TString token(trigger(pos[0], pos[1]-pos[0]+1));
370
371 TParameter<Int_t>* param = (TParameter<Int_t>*) fCashedTokens->FindObject(token);
372 if (!param)
373 {
374 TInterpreter::EErrorCode error;
375 Int_t bit = gInterpreter->ProcessLine(Form("AliTriggerAnalysis::k%s;", token.Data()), &error);
376
377 if (error > 0)
378 AliFatal(Form("Trigger token %s unknown", token.Data()));
379
380 param = new TParameter<Int_t>(token, bit);
381 fCashedTokens->Add(param);
382 AliDebug(AliLog::kDebug, "Added token");
383 }
384
385 Long64_t bit = param->GetVal();
386
387 AliDebug(AliLog::kDebug, Form("Tok %d %d %s %lld", pos[0], pos[1], token.Data(), bit));
388
389 if (offline)
390 bit |= AliTriggerAnalysis::kOfflineFlag;
391
392 if(aEsd && triggerAnalysis) {
393 trigger.ReplaceAll(token, Form("%d", triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) bit)));
394 // if(fHistStatisticsTokens)
395 }
396 }
397
398 TFormula formula("formula", trigger);
399 Bool_t result = formula.Eval(0);
400
401 AliDebug(AliLog::kDebug, Form("%s --> %d", trigger.Data(), result));
402
403 return result;
404}
405
2d45a1a7 406//______________________________________________________________________________
0c6c629b 407UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
61899827 408{
409 // checks if the given event is a collision candidate
0c6c629b 410 //
411 // returns a bit word describing the fired offline triggers (see AliVEvent::EOfflineTriggerTypes)
7acc5b9d 412 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
413 if (!mgr) {
414 AliError("Cannot get the analysis manager");
415 return 0;
416 }
417 mgr->LoadBranch("AliESDHeader.");
418 mgr->LoadBranch("AliESDRun.");
1ea7a921 419
141265a2 420 if (fCurrentRun != aEsd->GetRunNumber()) {
1107e2ce 421 if (!Initialize(aEsd))
95e6f4ec 422 AliFatal(Form("Could not initialize for run %d", aEsd->GetRunNumber()));
141265a2 423 if(fComputeBG) SetBIFactors(aEsd); // is this safe here?
424 }
61899827 425 const AliESDHeader* esdHeader = aEsd->GetHeader();
426 if (!esdHeader)
427 {
428 AliError("ESD Header could not be retrieved");
429 return kFALSE;
430 }
431
a2ce3799 432 // check event type; should be PHYSICS = 7 for data and 0 for MC
433 if (!fMC)
434 {
435 if (esdHeader->GetEventType() != 7)
436 return kFALSE;
437 }
438 else
439 {
440 if (esdHeader->GetEventType() != 0)
441 AliFatal(Form("Invalid event type for MC: %d", esdHeader->GetEventType()));
442 }
758941d4 443
1ea7a921 444 mgr->LoadBranch("AliMultiplicity.");
445//mgr->LoadBranch("AliESDFMD.");
446 mgr->LoadBranch("AliESDVZERO.");
447 mgr->LoadBranch("AliESDZDC.");
448 mgr->LoadBranch("SPDVertex.");
449 mgr->LoadBranch("PrimaryVertex.");
450 mgr->LoadBranch("TPCVertex.");
451 mgr->LoadBranch("Tracks");
452 mgr->LoadBranch("SPDPileupVertices");
453
0c6c629b 454 UInt_t accept = 0;
296dd262 455
456 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
457 for (Int_t i=0; i < count; i++)
61899827 458 {
296dd262 459 const char* triggerClass = 0;
460 if (i < fCollTrigClasses.GetEntries())
461 triggerClass = ((TObjString*) fCollTrigClasses.At(i))->String();
462 else
463 triggerClass = ((TObjString*) fBGTrigClasses.At(i - fCollTrigClasses.GetEntries()))->String();
61899827 464
7c55ebd9 465 AliDebug(AliLog::kDebug+1, Form("Processing trigger class %s", triggerClass));
61899827 466
296dd262 467 AliTriggerAnalysis* triggerAnalysis = static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i));
61899827 468
296dd262 469 triggerAnalysis->FillTriggerClasses(aEsd);
61899827 470
c2ba5a61 471 Int_t triggerLogic = 0;
472 UInt_t singleTriggerResult = CheckTriggerClass(aEsd, triggerClass, triggerLogic);
473
0c6c629b 474 if (singleTriggerResult)
296dd262 475 {
476 triggerAnalysis->FillHistograms(aEsd);
477
85c71ba7 478 Bool_t isBin0 = kFALSE;
479 if (fBin0CallBack != "") {
85c71ba7 480 isBin0 = ((AliAnalysisTaskSE*)mgr->GetTask(fBin0CallBack.Data()))->IsEventInBinZero();
ff097e3f 481 } else if (fBin0CallBackPointer) {
482 isBin0 = (*fBin0CallBackPointer)(aEsd);
85c71ba7 483 }
ff097e3f 484
7c55ebd9 485 // ---->
486 // FIXME: this stuff is still used to fill the stat
487 // tables. Decide wethere we are switching to a new stat table
488 // (with all AliTriggerAnalysis tokens? Only we the tokens
489 // actually used in the selection?) and clean up
490
c2ba5a61 491 // hardware trigger
7c55ebd9 492 Int_t fastORHW = triggerAnalysis->EvaluateTrigger(aEsd, AliTriggerAnalysis::kSPDGFO); // SPD number of chips from trigger bits (!)
493 // Int_t fastORHWL1 = triggerAnalysis->EvaluateTrigger(aEsd, AliTriggerAnalysis::kSPDGFOL1); // SPD number of chips from trigger bits in second layer (!)
494 Bool_t v0AHW = fSkipV0 ? 0 : triggerAnalysis->EvaluateTrigger(aEsd, AliTriggerAnalysis::kV0A);// should replay hw trigger
495 Bool_t v0CHW = fSkipV0 ? 0 : triggerAnalysis->EvaluateTrigger(aEsd, AliTriggerAnalysis::kV0C);// should replay hw trigger
c2ba5a61 496
cc9d9320 497 // offline trigger
7c55ebd9 498 Int_t fastOROffline = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kSPDGFO)); // SPD number of chips from clusters (!)
499 Int_t fastOROfflineL1 = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kSPDGFOL1)); // SPD number of chips from clusters in second layer (!)
500 Bool_t v0A = fSkipV0 ? 0 : triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kV0A));
501 Bool_t v0C = fSkipV0 ? 0 : triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kV0C));
502 Bool_t v0ABG = fSkipV0 ? 0 : triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kV0ABG));
503 Bool_t v0CBG = fSkipV0 ? 0 : triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kV0CBG));
f4ca8f20 504 Bool_t v0BG = v0ABG || v0CBG;
85c71ba7 505
506 // fmd
396981c2 507 // Bool_t fmdA = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kFMDA));
508 // Bool_t fmdC = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kFMDC));
509 // Bool_t fmd = fmdA || fmdC;
61899827 510
85c71ba7 511 // SSD
1107e2ce 512 //Int_t ssdClusters = triggerAnalysis->SSDClusters(aEsd);
c2ba5a61 513
514 // ZDC
ce08cb1f 515 // Bool_t zdcA = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kZDCA);
516 // Bool_t zdcC = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kZDCC);
7c55ebd9 517 Bool_t zdcA = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kZDCTDCA));
518 Bool_t zdcC = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kZDCTDCC));
519 Bool_t zdcTime = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kZDCTime));
85c71ba7 520
396981c2 521 Bool_t laserCut = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kTPCLaserWarmUp));
522
85c71ba7 523 // Some "macros"
524 Bool_t mb1 = (fastOROffline > 0 || v0A || v0C) && (!v0BG);
525 Bool_t mb1prime = (fastOROffline > 1 || (fastOROffline > 0 && (v0A || v0C)) || (v0A && v0C) ) && (!v0BG);
526
527 // Background rejection
8663e267 528 Bool_t bgID = kFALSE;
1ea7a921 529 bgID = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kSPDClsVsTrkBG | AliTriggerAnalysis::kOfflineFlag)); // FIXME: temporarily, we keep both ways to validate the new one. if the external BG id is not set, it will use the new one
8663e267 530
c2ba5a61 531 /*Int_t ntrig = fastOROffline; // any 2 hits
85c71ba7 532 if(v0A) ntrig += 1;
533 if(v0C) ntrig += 1; //v0C alone is enough
534 if(fmd) ntrig += 1;
c2ba5a61 535 if(ssdClusters>1) ntrig += 1;*/
85c71ba7 536
7c55ebd9 537
538 // <---
539
540 TString triggerLogicOnline = fPSOADB->GetHardwareTrigger(triggerLogic);
541 TString triggerLogicOffline = fPSOADB->GetOfflineTrigger(triggerLogic);
542
010e7ad7 543 AliDebug(AliLog::kDebug, Form("Triggers from OADB [0x%x][%d][%s][%s]",singleTriggerResult,AliOADBPhysicsSelection::GetActiveBit(singleTriggerResult),triggerLogicOffline.Data(),triggerLogicOnline.Data()));
7c55ebd9 544
c2ba5a61 545 // replay hardware trigger (should only remove events for MC)
7c55ebd9 546 Bool_t onlineTrigger = EvaluateTriggerLogic(aEsd, triggerAnalysis, triggerLogicOnline, kFALSE);
547 // offline selection
548 Bool_t offlineTrigger = EvaluateTriggerLogic(aEsd, triggerAnalysis, triggerLogicOffline, kTRUE);
c2ba5a61 549
7c55ebd9 550 // Printf("%s %s", triggerLogicOnline.Data(), triggerLogicOffline.Data());
551 // Printf("%d %d", onlineTrigger, offlineTrigger);
552
85c71ba7 553
73cc8654 554 // Fill trigger pattern histo
555 Int_t tpatt = 0;
556 if (fastORHW>0) tpatt+=1;
557 if (v0AHW) tpatt+=2;
558 if (v0CHW) tpatt+=4;
559 fHistTriggerPattern->Fill( tpatt );
560
85c71ba7 561 // fill statistics and return decision
562 const Int_t nHistStat = 2;
563 for(Int_t iHistStat = 0; iHistStat < nHistStat; iHistStat++){
564 if (iHistStat == kStatIdxBin0 && !isBin0) continue; // skip the filling of bin0 stats if the event is not in the bin0
565
566 fHistStatistics[iHistStat]->Fill(kStatTriggerClass, i);
8dec6e35 567 if(iHistStat == kStatIdxAll) fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i); // Fill only for all (avoid double counting)
85c71ba7 568
85c71ba7 569 // We fill the rest only if hw trigger is ok
7c55ebd9 570 if (!onlineTrigger)
85c71ba7 571 {
572 AliDebug(AliLog::kDebug, "Rejecting event because hardware trigger is not fired");
573 continue;
574 } else {
575 fHistStatistics[iHistStat]->Fill(kStatHWTrig, i);
576 }
733f0542 577
85c71ba7 578
579 // v0 BG stats
580 if (v0ABG)
581 fHistStatistics[iHistStat]->Fill(kStatV0ABG, i);
582 if (v0CBG)
583 fHistStatistics[iHistStat]->Fill(kStatV0CBG, i);
584
7c55ebd9 585 // mb 1
85c71ba7 586 if (mb1)
587 fHistStatistics[iHistStat]->Fill(kStatMB1, i);
85c71ba7 588
589 if (mb1prime)
590 fHistStatistics[iHistStat]->Fill(kStatMB1Prime, i);
591
396981c2 592 if (laserCut)
593 fHistStatistics[iHistStat]->Fill(kStatLaserCut, i);
85c71ba7 594
c2ba5a61 595 //if(ntrig >= 2 && !v0BG)
596 // fHistStatistics[iHistStat]->Fill(kStatAny2Hits, i);
85c71ba7 597
598 if (fastOROffline > 0)
599 fHistStatistics[iHistStat]->Fill(kStatFO1, i);
600 if (fastOROffline > 1)
601 fHistStatistics[iHistStat]->Fill(kStatFO2, i);
c2ba5a61 602 if (fastOROfflineL1 > 1)
603 fHistStatistics[iHistStat]->Fill(kStatFO2L1, i);
cc9d9320 604
85c71ba7 605 if (v0A)
606 fHistStatistics[iHistStat]->Fill(kStatV0A, i);
607 if (v0C)
608 fHistStatistics[iHistStat]->Fill(kStatV0C, i);
c2ba5a61 609
610 if (zdcA)
611 fHistStatistics[iHistStat]->Fill(kStatZDCA, i);
612 if (zdcC)
613 fHistStatistics[iHistStat]->Fill(kStatZDCC, i);
614 if (zdcA && zdcC)
615 fHistStatistics[iHistStat]->Fill(kStatZDCAC, i);
7c55ebd9 616
869f9767 617 if (zdcTime)
618 fHistStatistics[iHistStat]->Fill(kStatZDCTime, i);
296dd262 619
869f9767 620 if (v0A && v0C && !v0BG && (!bgID && fIsPP))
85c71ba7 621 fHistStatistics[iHistStat]->Fill(kStatV0, i);
622
1ea7a921 623 if (bgID && !v0BG)
624 fHistStatistics[iHistStat]->Fill(kStatBG, i);
7c55ebd9 625
626 // FIXME: check lines below
627 if ( offlineTrigger )
85c71ba7 628 {
629 if (!v0BG || fSkipV0)
630 {
631 if (!v0BG) fHistStatistics[iHistStat]->Fill(kStatOffline, i);
1ea7a921 632 AliDebug(AliLog::kDebug, Form("Accepted event for histograms with trigger logic %d", triggerLogic));
296dd262 633
1ea7a921 634 fHistStatistics[iHistStat]->Fill(kStatAccepted, i);
635
636 if (aEsd->IsPileupFromSPD())
637 fHistStatistics[iHistStat]->Fill(kStatAcceptedPileUp, i);
638
8dec6e35 639 // if(iHistStat == kStatIdxAll) fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i); // Fill only for all (avoid double counting)
1ea7a921 640 if((i < fCollTrigClasses.GetEntries() || fSkipTriggerClassSelection) && (iHistStat==kStatIdxAll))
641 accept |= singleTriggerResult; // only set for "all" (should not really matter)
85c71ba7 642 }
643 else
644 AliDebug(AliLog::kDebug, "Rejecting event because of V0 BG flag");
645 }
646 else
c2ba5a61 647 AliDebug(AliLog::kDebug, Form("Rejecting event because trigger logic %d is not fulfilled", triggerLogic));
296dd262 648 }
296dd262 649 }
650 }
651
652 if (accept)
0c6c629b 653 AliDebug(AliLog::kDebug, Form("Accepted event as collision candidate with bit mask %d", accept));
61899827 654
296dd262 655 return accept;
61899827 656}
a2ce3799 657
5f337f3d 658
7c55ebd9 659// const char * AliPhysicsSelection::GetFillingScheme(UInt_t runNumber) {
660
661// if(fMC) return "MC";
662
663// if (runNumber >= 104065 && runNumber <= 104160) {
664// return "4x4a";
665// }
666// else if (runNumber >= 104315 && runNumber <= 104321) {
667// return "4x4a*";
668// }
669// else if (runNumber >= 104792 && runNumber <= 104803) {
670// return "4x4b";
671// }
672// else if (runNumber >= 104824 && runNumber <= 104892) {
673// return "4x4c";
674// }
675// else if (runNumber == 105143 || runNumber == 105160) {
676// return "16x16a";
677// }
678// else if (runNumber >= 105256 && runNumber <= 105268) {
679// return "4x4c";
680// }
681// else if (runNumber >= 114786 && runNumber <= 116684) {
682// return "Single_2b_1_1_1";
683// }
684// else if (runNumber >= 117048 && runNumber <= 117120) {
685// return "Single_3b_2_2_2";
686// }
687// else if (runNumber >= 117220 && runNumber <= 119163) {
688// return "Single_2b_1_1_1";
689// }
690// else if (runNumber >= 119837 && runNumber <= 119862) {
691// return "Single_4b_2_2_2";
692// }
693// else if (runNumber >= 119902 && runNumber <= 120691) {
694// return "Single_6b_3_3_3";
695// }
696// else if (runNumber >= 120741 && runNumber <= 122375) {
697// return "Single_13b_8_8_8";
698// }
699// else if (runNumber >= 130148 && runNumber <= 130375) {
700// return "125n_48b_36_16_36";
701// }
702// else if (runNumber >= 130601 && runNumber <= 130640) {
703// return "1000ns_50b_35_14_35";
704// }
705// else {
706// AliError(Form("Unknown filling scheme (run %d)", runNumber));
707// }
708
709// return "Unknown";
710// }
711
712// const char * AliPhysicsSelection::GetBXIDs(UInt_t runNumber, const char * trigger) {
713
714// if (!fUseBXNumbers || fMC) return "";
715
716// if (runNumber >= 104065 && runNumber <= 104160) {
717// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #2128 #3019";
718// else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #346 #3465";
719// else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1234 #1680";
720// else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
721// // else AliError(Form("Unknown trigger: %s", trigger));
722// }
723// else if (runNumber >= 104315 && runNumber <= 104321) {
724// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #2000 #2891";
725// else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #218 #3337";
726// else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1106 #1552";
727// else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
728// // else AliError(Form("Unknown trigger: %s", trigger));
729// }
730// else if (runNumber >= 104792 && runNumber <= 104803) {
731// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #2228 #3119";
732// else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2554 #446";
733// else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1334 #769";
734// else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
735// // else AliError(Form("Unknown trigger: %s", trigger));
736// }
737// else if (runNumber >= 104824 && runNumber <= 104892) {
738// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #3119 #769";
739// else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2554 #446";
740// else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1334 #2228";
741// else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
742// // else AliError(Form("Unknown trigger: %s", trigger));
743// }
744// else if (runNumber == 105143 || runNumber == 105160) {
745// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #1337 #1418 #2228 #2309 #3119 #3200 #446 #527";
746// else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #1580 #1742 #1904 #2066 #2630 #2792 #2954 #3362";
747// else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #845 #1007 #1169 #1577 #3359 #3521 #119 #281 ";
748// else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
749// // else AliError(Form("Unknown trigger: %s", trigger));
750// }
751// else if (runNumber >= 105256 && runNumber <= 105268) {
752// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #3019 #669";
753// else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2454 #346";
754// else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1234 #2128";
755// else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
756// // else AliError(Form("Unknown trigger: %s", trigger));
757// } else if (runNumber >= 114786 && runNumber <= 116684) { // 7 TeV 2010, assume always the same filling scheme
758// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #346";
759// else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2131";
760// else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #3019";
761// else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1238";
762// // else AliError(Form("Unknown trigger: %s", trigger));
763// }
764// else if (runNumber >= 117048 && runNumber <= 117120) {
765// // return "Single_3b_2_2_2";
766// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #346 #1240 ";
767// else if (!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2131 ";
768// else if (!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #3019 ";
769// else if (!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1238";
770// // else AliError(Form("Unknown trigger: %s", trigger));
771
772// }
773// else if ((runNumber >= 117220 && runNumber <= 118555) || (runNumber >= 118784 && runNumber <= 119163))
774// {
775// // return "Single_2b_1_1_1";
776// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #346 ";
777// else if (!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2131 ";
778// else if (!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #3019 ";
779// else if (!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1238 ";
780// // else AliError(Form("Unknown trigger: %s", trigger));
781// }
782// else if (runNumber >= 118556 && runNumber <= 118783) {
783// // return "Single_2b_1_1_1";
784// // same as previous but was misaligned by 1 BX in fill 1069
785// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #345 ";
786// else if (!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2130 ";
787// else if (!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #3018 ";
788// else if (!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1238 ";
789// // else AliError(Form("Unknown trigger: %s", trigger));
790// }
791// else if (runNumber >= 119837 && runNumber <= 119862) {
792// // return "Single_4b_2_2_2";
793// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #669 #3019 ";
794// else if (!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #346 #2454 ";
795// else if (!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1234 #2128 ";
796// else if (!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1681 #3463";
797// // else AliError(Form("Unknown trigger: %s", trigger));
798
799// }
800// else if (runNumber >= 119902 && runNumber <= 120691) {
801// // return "Single_6b_3_3_3";
802// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #346 #546 #746 ";
803// else if (!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2131 #2331 #2531 ";
804// else if (!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #3019 #3219 #3419 ";
805// else if (!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1296 #1670";
806// // else AliError(Form("Unknown trigger: %s", trigger));
807// }
808// else if (runNumber >= 120741 && runNumber <= 122375) {
809// // return "Single_13b_8_8_8";
810// if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #346 #446 #546 #646 #1240 #1340 #1440 #1540 ";
811// else if (!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #946 #2131 #2231 #2331 #2431 ";
812// else if (!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #3019 #3119 #3219 #3319 #3519 ";
813// else if (!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1835 #2726";
814// // else AliError(Form("Unknown trigger: %s", trigger));
5f337f3d 815
7c55ebd9 816// }
817// else if (runNumber >= 130148 && runNumber <= 130375) {
818// TString triggerString = trigger;
819// static TString returnString = " ";
820// returnString = "";
821// if (triggerString.Contains("B")) returnString += " #346 #396 #446 #496 #546 #596 #646 #696 #1240 #1290 #1340 #1390 #1440 #1490 #1540 #1590 ";
822// if (triggerString.Contains("A")) returnString += " #755 #805 #855 #905 #955 #1005 #1799 #1849 #1899 #2131 #2181 #2231 #2281 #2331 #2381 #2431 #2481 #2531 #2581 #2631 #2846 #3016 #3066 #3116 #3166 #3216 #3266 #3316 #3366 #3425 #3475 #3525 ";
823// if (triggerString.Contains("C")) returnString += " #3019 #3069 #3119 #3169 #3219 #3269 #3319 #3369 #14 #64 #114 #746 #796 #846 #908 #958 #1008 #1640 #1690 #1740 #2055 #2125 #2175 #2225 #2275 #2325 #2375 #2425 #2475 #2534 #2584 #2634 ";
824// // Printf("0x%x",returnString.Data());
825// // Printf("%s",returnString.Data());
826// return returnString.Data();
827// }
828// else if (runNumber >= 130601 && runNumber <= 130640) {
829// TString triggerString = trigger;
830// static TString returnString = " ";
831// returnString = "";
832// if (triggerString.Contains("B")) returnString += " #346 #386 #426 #466 #506 #546 #586 #1240 #1280 #1320 #1360 #1400 #1440 #1480 ";
833// if (triggerString.Contains("A")) returnString += " #626 #666 #706 #746 #786 #826 #866 #1520 #1560 #1600 #1640 #1680 #1720 #1760 #2076 #2131 #2171 #2211 #2251 #2291 #2331 #2371 #2414 #2454 #2494 #2534 #2574 #2614 #2654 #2694 #2734 #2774 #2814 "; //#2854 #2894 #2934 not present in this run
834// if (triggerString.Contains("C")) returnString += " #3019 #3059 #3099 #3139 #3179 #3219 #3259 #3299 #3339 #3379 #3419 #3459 #3499 #3539 #115 #629 #669 #709 #749 #789 #829 #869 #909 #949 #989 #1029 #1069 #1109 #1149 #1523 #1563 #1603 #1643 "; //#1683 #1723 #1763 not present in this run
835// return returnString.Data();
836// }
837
838// else {
839// AliWarning(Form("Unknown run %d, using all BXs!",runNumber));
840// }
841
842// return "";
843// }
1107e2ce 844
845Bool_t AliPhysicsSelection::Initialize(const AliESDEvent* aEsd)
846{
847 // initializes the object for the given ESD
848
c8aeecab 849 AliInfo(Form("Initializing for beam type: %s", aEsd->GetESDRun()->GetBeamType()));
869f9767 850 fIsPP = kTRUE;
1107e2ce 851 if (strcmp(aEsd->GetESDRun()->GetBeamType(), "Pb-Pb") == 0)
869f9767 852 fIsPP = kFALSE;
853
7c55ebd9 854 return Initialize(aEsd->GetRunNumber());
1107e2ce 855}
856
7c55ebd9 857Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
61899827 858{
7c55ebd9 859 // initializes the object for the given run
860
861
29e8486e 862 Bool_t oldStatus = TH1::AddDirectoryStatus();
863 TH1::AddDirectory(kFALSE);
7c55ebd9 864
865 /// Open OADB file and fetch OADB objects
866 TString oadbfilename = AliPhysicsSelection::GetOADBFileName();
867
28cbc692 868 TFile * foadb = TFile::Open(oadbfilename);
7c55ebd9 869 if(!foadb->IsOpen()) AliFatal(Form("Cannot open OADB file %s", oadbfilename.Data()));
870
871
872 if(!fPSOADB || !fUsingCustomClasses) { // if it's already set and custom class is required, we use the one provided by the user
873 AliInfo("Using Standard OADB");
874 AliOADBContainer * psContainer = (AliOADBContainer*) foadb->Get("physSel");
6340be16 875 if (!psContainer) AliFatal("Cannot fetch OADB container for Physics selection");
876 fPSOADB = (AliOADBPhysicsSelection*) psContainer->GetObject(runNumber, fIsPP ? "oadbDefaultPP" : "oadbDefaultPbPb");
7c55ebd9 877 if (!fPSOADB) AliFatal(Form("Cannot find physics selection object for run %d", runNumber));
878 } else {
879 AliInfo("Using Custom OADB");
880 }
881 if(!fFillOADB || !fUsingCustomClasses) { // if it's already set and custom class is required, we use the one provided by the user
882 AliOADBContainer * fillContainer = (AliOADBContainer*) foadb->Get("fillScheme");
6340be16 883 if (!fillContainer) AliFatal("Cannot fetch OADB container for filling scheme");
7c55ebd9 884 fFillOADB = (AliOADBFillingScheme*) fillContainer->GetObject(runNumber, "Default");
885 if (!fFillOADB) AliFatal(Form("Cannot find filling scheme object for run %d", runNumber));
886 }
eeaab745 887 if(!fTriggerOADB || !fUsingCustomClasses) { // if it's already set and custom class is required, we use the one provided by the user
888 AliOADBContainer * triggerContainer = (AliOADBContainer*) foadb->Get("trigAnalysis");
889 if (!triggerContainer) AliFatal("Cannot fetch OADB container for trigger analysis");
890 fTriggerOADB = (AliOADBTriggerAnalysis*) triggerContainer->GetObject(runNumber, "Default");
891 fTriggerOADB->Print();
892 if (!fTriggerOADB) AliFatal(Form("Cannot find trigger analysis object for run %d", runNumber));
893 }
7c55ebd9 894
29e8486e 895
85c71ba7 896 if(!fBin0CallBack)
897 AliError("Bin0 Callback not set: will not fill the statistics for the bin 0");
898
899 if (fMC) {
0c6c629b 900 // override BX and bg options in case of MC
85c71ba7 901 fComputeBG = kFALSE;
902 fUseBXNumbers = kFALSE;
903 }
904
7c55ebd9 905 // FIXME: think how to implement this check with the OADB, trigger scheme is not a int number here
906 // Int_t triggerScheme = GetTriggerScheme(runNumber);
907 // if (!fUsingCustomClasses && fCurrentRun != -1 && triggerScheme != GetTriggerScheme(fCurrentRun))
908 // AliFatal("Processing several runs with different trigger schemes is not supported");
296dd262 909
85c71ba7 910 if(fComputeBG && fCurrentRun != -1 && fCurrentRun != runNumber)
911 AliFatal("Cannot process several runs because BG computation is requested");
912
913 if(fComputeBG && !fUseBXNumbers)
e0bf2892 914 AliFatal("Cannot compute BG if BX numbers are not used");
85c71ba7 915
7c55ebd9 916 if(fUseBXNumbers && fFillingScheme != "" && fFillingScheme != fFillOADB->GetFillingSchemeName())
85c71ba7 917 AliFatal("Cannot process runs with different filling scheme if usage of BX numbers is requested");
918
7c55ebd9 919 fFillingScheme = fFillOADB->GetFillingSchemeName();
85c71ba7 920
61899827 921 AliInfo(Form("Initializing for run %d", runNumber));
922
758941d4 923 // initialize first time?
a2ce3799 924 if (fCurrentRun == -1)
a2ce3799 925 {
7c55ebd9 926 const UInt_t ntriggerBits = fPSOADB->GetNTriggerBits(); // FIXME!
927 for(UInt_t ibit = 0; ibit < ntriggerBits; ibit++){
928
929 TIterator * collIter = fPSOADB->GetCollTrigClass(ibit)->MakeIterator();
930 TIterator * bgIter = fPSOADB->GetBGTrigClass(ibit)->MakeIterator();
931 TObjString * obj = 0;
932 while((obj = (TObjString*) collIter->Next())){
933 if (obj->String() != "") {
934 fCollTrigClasses.Add(new TObjString(GetTriggerString(obj)));
935 }
1107e2ce 936 }
7c55ebd9 937 // BG classes only make sense for real data
938 if(!fMC) {
939 obj = 0 ;
940 while((obj = (TObjString*) bgIter->Next())){
941 if (obj->String() != "") {
942 fBGTrigClasses.Add(new TObjString(GetTriggerString(obj)));
943 }
944 }
91bea6e7 945 }
7c55ebd9 946
a2ce3799 947 }
7c55ebd9 948 // not sure how to handle this in the case of > x cuts
949 // // Book the token histo with the tokens actually used here!
950 // // 1. Cache the tokens
951 // for(UInt_t ibit = 0; ibit < ntriggerBits; ibit++){
952 // EvaluateTriggerLogic(0,0, fPSOADB->GetHardwareTrigger(ibit), 0);
953 // EvaluateTriggerLogic(0,0, fPSOADB->GetOfflineTrigger(ibit), 1);
954 // }
955 // // 2. Book the histogram
956 // if (!fHistStatisticsTokens) {
957 // Int_t ntokens = fCashedTokens->GetEntries();
958 // Int_t count = fCollTrigClasses->GetEntries() + fBGTrigClasses->GetEntries();
959 // fHistStatisticsTokens = new TH2F("fHistStatisticsTokens", "fHistStatisticsTokens", ntokens + 2, 0.5, ntokens+2+0.5, count, -0.5, -0.5 + count);
960
961 // Int_t nrow = 0;
962 // fHistStatisticsTokens->GetXaxis()->SetBinLabel(nrow++, "Trigger class");
963 // for(Int_t itoken = 0; itoken < ntoken; itoken++){
964 // TParameter<Int_t> * param = fCashedTokens->At(itoken);
965 // fHistStatisticsTokens->GetXaxis()->SetBinLabel(nrow++, param->GetName());
966 // }
967
968 // fHistStatisticsTokens->GetXaxis()->SetBinLabel(nrow++, "Accepted");
969
970 // }
971
972
91bea6e7 973
7c55ebd9 974 // TODO:
975 // Add a new statistics histo containing only the tokens actually used in the selection
976
a2ce3799 977 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
978
979 for (Int_t i=0; i<count; i++)
980 {
7c55ebd9 981
a2ce3799 982 AliTriggerAnalysis* triggerAnalysis = new AliTriggerAnalysis;
983 triggerAnalysis->SetAnalyzeMC(fMC);
984 triggerAnalysis->EnableHistograms();
985 triggerAnalysis->SetSPDGFOThreshhold(1);
4011b280 986 triggerAnalysis->SetDoFMD(kFALSE);
eeaab745 987 triggerAnalysis->SetCorrZDCCutParams(fTriggerOADB->GetZDCCutRefSumCorr(),
988 fTriggerOADB->GetZDCCutRefDeltaCorr(),
989 fTriggerOADB->GetZDCCutSigmaSumCorr(),
990 fTriggerOADB->GetZDCCutSigmaDeltaCorr());
a2ce3799 991 fTriggerAnalysis.Add(triggerAnalysis);
992 }
7c55ebd9 993
994
85c71ba7 995 // TODO: shall I really delete this?
996 if (fHistStatistics[0])
997 delete fHistStatistics[0];
998 if (fHistStatistics[1])
999 delete fHistStatistics[1];
296dd262 1000
85c71ba7 1001 fHistStatistics[kStatIdxBin0] = BookHistStatistics("_Bin0");
1002 fHistStatistics[kStatIdxAll] = BookHistStatistics("");
a2ce3799 1003
7c55ebd9 1004
a2ce3799 1005 if (fHistBunchCrossing)
1006 delete fHistBunchCrossing;
1007
1008 fHistBunchCrossing = new TH2F("fHistBunchCrossing", "fHistBunchCrossing;bunch crossing number;", 4000, -0.5, 3999.5, count, -0.5, -0.5 + count);
73cc8654 1009
7c55ebd9 1010 // TODO: remove fHistTriggerPattern
73cc8654 1011 if (fHistTriggerPattern)
1012 delete fHistTriggerPattern;
1013
1014 const int ntrig=3;
85c71ba7 1015 Int_t n = 1;
73cc8654 1016 const Int_t nbinTrig = TMath::Nint(TMath::Power(2,ntrig));
1017
1018 fHistTriggerPattern = new TH1F("fHistTriggerPattern", "Trigger pattern: FO + 2*v0A + 4*v0C",
1019 nbinTrig, -0.5, nbinTrig-0.5);
1020 fHistTriggerPattern->GetXaxis()->SetBinLabel(1,"NO TRIG");
1021 fHistTriggerPattern->GetXaxis()->SetBinLabel(2,"FO");
1022 fHistTriggerPattern->GetXaxis()->SetBinLabel(3,"v0A");
1023 fHistTriggerPattern->GetXaxis()->SetBinLabel(4,"FO & v0A");
1024 fHistTriggerPattern->GetXaxis()->SetBinLabel(5,"v0C");
1025 fHistTriggerPattern->GetXaxis()->SetBinLabel(6,"FO & v0C");
1026 fHistTriggerPattern->GetXaxis()->SetBinLabel(7,"v0A & v0C");
1027 fHistTriggerPattern->GetXaxis()->SetBinLabel(8,"FO & v0A & v0C");
1028
1029
1030 n = 1;
a2ce3799 1031 for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
1032 {
7c55ebd9 1033
a2ce3799 1034 fHistBunchCrossing->GetYaxis()->SetBinLabel(n, ((TObjString*) fCollTrigClasses.At(i))->String());
1035 n++;
1036 }
1037 for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
1038 {
7c55ebd9 1039
a2ce3799 1040 fHistBunchCrossing->GetYaxis()->SetBinLabel(n, ((TObjString*) fBGTrigClasses.At(i))->String());
1041 n++;
1042 }
85c71ba7 1043
1044
1045
a2ce3799 1046 }
1047
1048 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
296dd262 1049 for (Int_t i=0; i<count; i++)
61899827 1050 {
7c55ebd9 1051
a2ce3799 1052 AliTriggerAnalysis* triggerAnalysis = static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i));
1053
296dd262 1054 switch (runNumber)
1055 {
a2ce3799 1056 case 104315:
296dd262 1057 case 104316:
1058 case 104320:
a2ce3799 1059 case 104321:
296dd262 1060 case 104439:
1061 triggerAnalysis->SetV0TimeOffset(7.5);
1062 break;
a2ce3799 1063 default:
1064 triggerAnalysis->SetV0TimeOffset(0);
296dd262 1065 }
f4ca8f20 1066 }
1067
758941d4 1068 fCurrentRun = runNumber;
1069
29e8486e 1070 TH1::AddDirectory(oldStatus);
1071
7c55ebd9 1072
61899827 1073 return kTRUE;
1074}
1075
85c71ba7 1076TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
bc18a83e 1077 // add 6 rows to count for the estimate of good, accidentals and
1078 // BG and the ratio of BG and accidentals to total +ratio goot to
1079 // first col + 2 for error on good.
1080 // TODO: Remember the the indexes of rows for the BG selection. Add new member fBGRows[] and use kStat as indexes
85c71ba7 1081
1082 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
1083#ifdef VERBOSE_STAT
8dec6e35 1084 Int_t extrarows = fComputeBG != 0 ? 11 : 0;
85c71ba7 1085#else
8dec6e35 1086 Int_t extrarows = fComputeBG != 0 ? 6 : 0;
85c71ba7 1087#endif
e219c292 1088 TH2F * h = new TH2F(Form("fHistStatistics%s",tag), Form("fHistStatistics - %s ;;",tag), kStatAcceptedPileUp, 0.5, kStatAcceptedPileUp+0.5, count+extrarows, -0.5, -0.5 + count+extrarows);
85c71ba7 1089
1090 h->GetXaxis()->SetBinLabel(kStatTriggerClass, "Trigger class");
1091 h->GetXaxis()->SetBinLabel(kStatHWTrig, "Hardware trigger");
1092 h->GetXaxis()->SetBinLabel(kStatFO1, "FO >= 1");
1093 h->GetXaxis()->SetBinLabel(kStatFO2, "FO >= 2");
c2ba5a61 1094 h->GetXaxis()->SetBinLabel(kStatFO2L1, "FO (L1) >= 2");
85c71ba7 1095 h->GetXaxis()->SetBinLabel(kStatV0A, "V0A");
1096 h->GetXaxis()->SetBinLabel(kStatV0C, "V0C");
396981c2 1097 h->GetXaxis()->SetBinLabel(kStatLaserCut, "TPC Laser Wup Cut");
85c71ba7 1098 h->GetXaxis()->SetBinLabel(kStatV0ABG, "V0A BG");
1099 h->GetXaxis()->SetBinLabel(kStatV0CBG, "V0C BG");
c2ba5a61 1100 h->GetXaxis()->SetBinLabel(kStatZDCA, "ZDCA");
1101 h->GetXaxis()->SetBinLabel(kStatZDCC, "ZDCC");
1102 h->GetXaxis()->SetBinLabel(kStatZDCAC, "ZDCA & ZDCC");
869f9767 1103 h->GetXaxis()->SetBinLabel(kStatZDCTime, "ZDC Time Cut");
85c71ba7 1104 h->GetXaxis()->SetBinLabel(kStatMB1, "(FO >= 1 | V0A | V0C) & !V0 BG");
1105 h->GetXaxis()->SetBinLabel(kStatMB1Prime, "(FO >= 2 | (FO >= 1 & (V0A | V0C)) | (V0A &v0C) ) & !V0 BG");
c2ba5a61 1106 //h->GetXaxis()->SetBinLabel(kStatFO1AndV0, "FO >= 1 & (V0A | V0C) & !V0 BG");
85c71ba7 1107 h->GetXaxis()->SetBinLabel(kStatV0, "V0A & V0C & !V0 BG & !BG ID");
1108 h->GetXaxis()->SetBinLabel(kStatOffline, "Offline Trigger");
c2ba5a61 1109 //h->GetXaxis()->SetBinLabel(kStatAny2Hits, "2 Hits & !V0 BG");
85c71ba7 1110 h->GetXaxis()->SetBinLabel(kStatBG, "Background identification");
1111 h->GetXaxis()->SetBinLabel(kStatAccepted, "Accepted");
e219c292 1112 h->GetXaxis()->SetBinLabel(kStatAcceptedPileUp, "Pile up (in accepted)");
1113
85c71ba7 1114
1115 Int_t n = 1;
1116 for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
1117 {
1118 h->GetYaxis()->SetBinLabel(n, ((TObjString*) fCollTrigClasses.At(i))->String());
1119 n++;
1120 }
1121 for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
1122 {
1123 h->GetYaxis()->SetBinLabel(n, ((TObjString*) fBGTrigClasses.At(i))->String());
1124 n++;
1125 }
1126
1127 if(fComputeBG) {
141265a2 1128 fBGStatOffset = n;
8dec6e35 1129 h->GetYaxis()->SetBinLabel(n++, "All B");
1130 h->GetYaxis()->SetBinLabel(n++, "All A+C");
1131 h->GetYaxis()->SetBinLabel(n++, "All E");
141265a2 1132 h->GetYaxis()->SetBinLabel(n++, Form("BG (A+C) (Mask [0x%x])", fComputeBG));
85c71ba7 1133 h->GetYaxis()->SetBinLabel(n++, "ACC");
1134#ifdef VERBOSE_STAT
1135 h->GetYaxis()->SetBinLabel(n++, "BG (A+C) % (rel. to CINT1B)");
1136 h->GetYaxis()->SetBinLabel(n++, "ACC % (rel. to CINT1B)");
1137 h->GetYaxis()->SetBinLabel(n++, "ERR GOOD %");
1138 h->GetYaxis()->SetBinLabel(n++, "GOOD % (rel. to 1st col)");
1139 h->GetYaxis()->SetBinLabel(n++, "ERR GOOD");
1140#endif
1141 h->GetYaxis()->SetBinLabel(n++, "GOOD");
1142 }
1143
1144 return h;
1145}
1146
7c55ebd9 1147void AliPhysicsSelection::Print(const Option_t *option) const
61899827 1148{
1149 // print the configuration
e9247450 1150 TString msg;
a2ce3799 1151 Printf("Configuration initialized for run %d (MC: %d):", fCurrentRun, fMC);
e9247450 1152 msg += Form("Configuration initialized for run %d (MC: %d):\n", fCurrentRun, fMC);
61899827 1153
296dd262 1154 Printf("Collision trigger classes:");
1155 for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
1156 Printf("%s", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
61899827 1157
296dd262 1158 Printf("Background trigger classes:");
1159 for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
1160 Printf("%s", ((TObjString*) fBGTrigClasses.At(i))->String().Data());
1161
1162 AliTriggerAnalysis* triggerAnalysis = dynamic_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(0));
61899827 1163
296dd262 1164 if (triggerAnalysis)
1165 {
1166 if (triggerAnalysis->GetV0TimeOffset() > 0)
1167 Printf("V0 time offset active: %.2f ns", triggerAnalysis->GetV0TimeOffset());
61899827 1168
296dd262 1169 Printf("\nTotal available events:");
528640ed 1170
296dd262 1171 triggerAnalysis->PrintTriggerClasses();
7e7fadb8 1172 // Check if all triggers with counts are known to the physics selection. If not, print a WARNING (only for MC)
1173 if(!fMC) {
1174 TMap * triggers = triggerAnalysis->GetTriggerClasses();
1175 TIterator* iter = triggers->MakeIterator();
1176 TObjString* obj = 0;
1177 static TString alreadyFoundTriggers;
1178 while ((obj = dynamic_cast<TObjString*> (iter->Next())))
1179 {
1180 TString strTrigger = obj->GetString();
1181 TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (triggers->GetValue(obj));
1182 Long_t counts = (Long_t)param->GetVal();
1183 TObjArray* tokens = obj->String().Tokenize(" ");
1184 for (Int_t i=0; i<tokens->GetEntries(); i++)
1185 {
1186 TString singleTrigStr = ((TObjString*) tokens->At(i))->String();
1187 singleTrigStr.Strip(TString::kBoth, ' ' );
1188 const char * singleTrig = singleTrigStr.Data();
1189 // Printf("%s", singleTrig);
1190 TString singleTrigStrFull;
1191 Bool_t found = kFALSE;
1192 Int_t nCollTriggers = fCollTrigClasses.GetEntries();
1193 for(Int_t iCollTriggers = 0; iCollTriggers < nCollTriggers; iCollTriggers++){
1194 singleTrigStrFull = ((TObjString*)fCollTrigClasses.At(iCollTriggers))->String();
1195 if(singleTrigStrFull.Contains(singleTrigStr)) {
1196 found = kTRUE;
1197 break;
1198 }
1199 singleTrigStrFull = singleTrigStr;
b885484d 1200 }
7e7fadb8 1201 Int_t nBGTriggers = fBGTrigClasses.GetEntries();
1202 for(Int_t iBGTriggers = 0; iBGTriggers < nBGTriggers; iBGTriggers++){
1203 singleTrigStrFull = ((TObjString*)fBGTrigClasses.At(iBGTriggers))->String();
1204 if(singleTrigStrFull.Contains(singleTrigStr)) {
1205 found = kTRUE;
1206 break;
1207 }
1208 singleTrigStrFull = singleTrigStr;
b885484d 1209 }
7e7fadb8 1210
6aca0ab9 1211 TString blacklist = "CEMC7WU-B-NOPF-ALL, CEMC7WU-AC-NOPF-ALL CEMC7WU-E-NOPF-ALL C0LSR-ABCE-NOPF-TPC CBEAMB-B-NOPF-ALLNOTRD"; // We know we dont support those, so we print no warning
7e7fadb8 1212 if(counts>0 && !found && !blacklist.Contains(singleTrig) && !singleTrigStr.Contains("WU") && !alreadyFoundTriggers.Contains(singleTrig)) {
1213 Printf("WARNING: Found unknown trigger [%s] with %ld counts in the ESD!", singleTrig, counts);
1214 alreadyFoundTriggers += singleTrig; // Avoid printing warning twice for the same trigger
1215 }
1216 }
1217 delete tokens;
1218 }
1219 delete iter;
1220 }
296dd262 1221 }
528640ed 1222
0c6c629b 1223 if (fHistStatistics[kStatIdxAll])
b43e01ed 1224 {
7e7fadb8 1225 static TString alreadyFoundTriggers; // avoids printing twice the same warning
1226
0c6c629b 1227 for (Int_t i=0; i<fCollTrigClasses.GetEntries(); i++)
1228 {
1229 Printf("\nSelection statistics for collision trigger %s:", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
e9247450 1230 msg += Form("\nSelection statistics for collision trigger %s:\n", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
0c6c629b 1231
b885484d 1232 Float_t allEvents = fHistStatistics[kStatIdxAll]->GetBinContent(1, i+1);
1233 Float_t triggeredEvents = fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), i+1);
1234
0c6c629b 1235 Printf("Total events with correct trigger class: %d", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(1, i+1));
e9247450 1236 msg += Form("Total events with correct trigger class: %d\n", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(1, i+1));
0c6c629b 1237 Printf("Selected collision candidates: %d", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), i+1));
e9247450 1238 msg += Form("Selected collision candidates: %d\n", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), i+1));
b885484d 1239
1240 // If the fraction of accepted events is too low, print a warning.
1241 Float_t eff = allEvents > 0 ? triggeredEvents/allEvents : 0;
7e7fadb8 1242 if(allEvents > 0 && (eff < 0.5) && // FIXME: make threshold programmable in OADB
1243 !alreadyFoundTriggers.Contains(((TObjString*) fCollTrigClasses.At(i))->String().Data())) {
b885484d 1244 Printf("WARNING: Trigger class %s has a very low efficiency (%d/%d=%.2f)",((TObjString*) fCollTrigClasses.At(i))->String().Data(), (Int_t) triggeredEvents, (Int_t) allEvents, eff);
7e7fadb8 1245 alreadyFoundTriggers += ((TObjString*) fCollTrigClasses.At(i))->String().Data();
e219c292 1246 Printf("%s", alreadyFoundTriggers.Data());
b885484d 1247 }
1248
0c6c629b 1249 }
17ba346c 1250 }
1251
1252 if (fHistBunchCrossing)
1253 {
1254 Printf("\nBunch crossing statistics:");
e9247450 1255 msg += "\nBunch crossing statistics:\n";
17ba346c 1256
1257 for (Int_t i=1; i<=fHistBunchCrossing->GetNbinsY(); i++)
1258 {
1259 TString str;
8dec6e35 1260 str.Form("Trigger %s has events in the bunch crossings: ", fHistBunchCrossing->GetYaxis()->GetBinLabel(i));
17ba346c 1261
1262 for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++)
1263 if (fHistBunchCrossing->GetBinContent(j, i) > 0)
1264 str += Form("%d, ", (Int_t) fHistBunchCrossing->GetXaxis()->GetBinCenter(j));
e9247450 1265
17ba346c 1266 Printf("%s", str.Data());
e9247450 1267 msg += str;
1268 msg += "\n";
17ba346c 1269 }
1270
1271 for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++)
1272 {
0c6c629b 1273 Int_t countColl = 0;
1274 Int_t countBG = 0;
17ba346c 1275 for (Int_t i=1; i<=fHistBunchCrossing->GetNbinsY(); i++)
1276 {
1277 if (fHistBunchCrossing->GetBinContent(j, i) > 0)
0c6c629b 1278 {
1279 if (fCollTrigClasses.FindObject(fHistBunchCrossing->GetYaxis()->GetBinLabel(i)))
1280 countColl++;
1281 if (fBGTrigClasses.FindObject(fHistBunchCrossing->GetYaxis()->GetBinLabel(i)))
1282 countBG++;
1283 }
17ba346c 1284 }
0c6c629b 1285 if (countColl > 0 && countBG > 0)
1286 Printf("WARNING: Bunch crossing %d has collision and BG trigger classes active. Check BPTX functioning for this run!", (Int_t) fHistBunchCrossing->GetXaxis()->GetBinCenter(j));
17ba346c 1287 }
b43e01ed 1288 }
91bea6e7 1289
1290 if (fUsingCustomClasses)
1291 Printf("WARNING: Using custom trigger classes!");
1292 if (fSkipTriggerClassSelection)
1293 Printf("WARNING: Skipping trigger class selection!");
85c71ba7 1294 if (fSkipV0)
1295 Printf("WARNING: Ignoring V0 information in selection");
1296 if(!fBin0CallBack)
1297 Printf("WARNING: Callback not set: will not fill the statistics for the bin 0");
e9247450 1298 TString opt(option);
1299 opt.ToUpper();
1300 if (opt == "STAT") {
1301 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
1302 if (mgr) mgr->AddStatisticsMsg(msg);
1303 }
61899827 1304}
1305
1306Long64_t AliPhysicsSelection::Merge(TCollection* list)
1307{
1308 // Merge a list of AliMultiplicityCorrection objects with this (needed for
1309 // PROOF).
1310 // Returns the number of merged objects (including this).
1311
1312 if (!list)
1313 return 0;
1314
1315 if (list->IsEmpty())
1316 return 1;
1317
1318 TIterator* iter = list->MakeIterator();
1319 TObject* obj;
17ba346c 1320
61899827 1321 // collections of all histograms
1ea7a921 1322 const Int_t nHists = 8;
61899827 1323 TList collections[nHists];
1324
1325 Int_t count = 0;
1326 while ((obj = iter->Next())) {
1327
1328 AliPhysicsSelection* entry = dynamic_cast<AliPhysicsSelection*> (obj);
1329 if (entry == 0)
1330 continue;
518b6d59 1331 // Update run number. If this one is not initialized (-1) take the one from
1332 // the next physics selection to be merged with. In case of 2 different run
1333 // numbers issue a warning (should physics selections from different runs be
1334 // merged together) A.G.
1335 Int_t currentRun = entry->GetCurrentRun();
1336 // Nothing to merge with since run number was not initialized.
1337 if (currentRun < 0) continue;
c2ba5a61 1338 if (fCurrentRun < 0)
1339 {
1340 fCurrentRun = currentRun;
1341 fMC = entry->fMC;
1342 for (Int_t i=0; i<entry->fCollTrigClasses.GetEntries(); i++)
1343 fCollTrigClasses.Add(entry->fCollTrigClasses.At(i)->Clone());
1344 for (Int_t i=0; i<entry->fBGTrigClasses.GetEntries(); i++)
1345 fBGTrigClasses.Add(entry->fBGTrigClasses.At(i)->Clone());
1346 }
518b6d59 1347 if (fCurrentRun != currentRun)
1348 AliWarning(Form("Current run %d not matching the one to be merged with %d", fCurrentRun, currentRun));
7c55ebd9 1349
1350 // With the same strategy update fBGStatOffset
1351 Int_t bgstatoffset = entry->GetBGStatOffset();
1352
504e41a3 1353 // Nothing to merge with since BG was not initialized.
1354 if (!(bgstatoffset < 0)){
1355 if (fBGStatOffset < 0)
1356 {
1357 fBGStatOffset = bgstatoffset;
1358 }
7c55ebd9 1359 }
1360 if (fBGStatOffset != bgstatoffset)
504e41a3 1361 AliWarning(Form("Current run %d not matching the one to be merged with %d", fBGStatOffset, bgstatoffset));
518b6d59 1362
7c55ebd9 1363
1364
1365 // Merge the OADBs (Take just the first instance you find
28cbc692 1366 if (!fPSOADB && entry->GetOADBPhysicsSelection()) {
7c55ebd9 1367 fPSOADB = (AliOADBPhysicsSelection*) entry->GetOADBPhysicsSelection()->Clone();
1368 }
28cbc692 1369 if (!fFillOADB && entry->GetOADBFillingScheme()){
7c55ebd9 1370 fFillOADB = (AliOADBFillingScheme*) entry->GetOADBFillingScheme()->Clone();
1371 }
1372
c2ba5a61 1373 if (entry->fTriggerAnalysis.GetEntries() > 0)
1374 collections[0].Add(&(entry->fTriggerAnalysis));
85c71ba7 1375 if (entry->fHistStatistics[0])
1376 collections[1].Add(entry->fHistStatistics[0]);
1377 if (entry->fHistStatistics[1])
1378 collections[2].Add(entry->fHistStatistics[1]);
7c55ebd9 1379 // if (entry->fHistStatisticsTokens)
1380 // collections[3].Add(entry->fHistStatisticsTokens);
17ba346c 1381 if (entry->fHistBunchCrossing)
85c71ba7 1382 collections[3].Add(entry->fHistBunchCrossing);
73cc8654 1383 if (entry->fHistTriggerPattern)
1384 collections[4].Add(entry->fHistTriggerPattern);
61899827 1385
1386 count++;
1387 }
1388
c2ba5a61 1389 if (fTriggerAnalysis.GetEntries() == 0 && collections[0].GetEntries() > 0)
1390 {
1391 TList* firstList = (TList*) collections[0].First();
1392 for (Int_t i=0; i<firstList->GetEntries(); i++)
1393 fTriggerAnalysis.Add(firstList->At(i)->Clone());
1394
1395 collections[0].RemoveAt(0);
1396 }
17ba346c 1397 fTriggerAnalysis.Merge(&collections[0]);
c2ba5a61 1398
1399 // if this instance is empty (not initialized) nothing would be merged here --> copy first entry
1400 if (!fHistStatistics[0] && collections[1].GetEntries() > 0)
1401 {
1402 fHistStatistics[0] = (TH2F*) collections[1].First()->Clone();
1403 collections[1].RemoveAt(0);
1404 }
85c71ba7 1405 if (fHistStatistics[0])
1406 fHistStatistics[0]->Merge(&collections[1]);
c2ba5a61 1407
1408 if (!fHistStatistics[1] && collections[2].GetEntries() > 0)
1409 {
1410 fHistStatistics[1] = (TH2F*) collections[2].First()->Clone();
1411 collections[2].RemoveAt(0);
1412 }
85c71ba7 1413 if (fHistStatistics[1])
1414 fHistStatistics[1]->Merge(&collections[2]);
c2ba5a61 1415
1416 if (!fHistBunchCrossing && collections[3].GetEntries() > 0)
1417 {
1418 fHistBunchCrossing = (TH2F*) collections[3].First()->Clone();
1419 collections[3].RemoveAt(0);
1420 }
17ba346c 1421 if (fHistBunchCrossing)
85c71ba7 1422 fHistBunchCrossing->Merge(&collections[3]);
c2ba5a61 1423
1424 if (!fHistTriggerPattern && collections[4].GetEntries() > 0)
1425 {
1426 fHistTriggerPattern = (TH1F*) collections[4].First()->Clone();
1427 collections[4].RemoveAt(0);
1428 }
73cc8654 1429 if (fHistTriggerPattern)
1430 fHistTriggerPattern->Merge(&collections[4]);
1ea7a921 1431
61899827 1432 delete iter;
1433
1434 return count+1;
1435}
1436
8dec6e35 1437void AliPhysicsSelection::SaveHistograms(const char* folder)
61899827 1438{
1439 // write histograms to current directory
1440
85c71ba7 1441 if (!fHistStatistics[0] || !fHistStatistics[1])
61899827 1442 return;
1443
1444 if (folder)
1445 {
1446 gDirectory->mkdir(folder);
1447 gDirectory->cd(folder);
1448 }
1449
85c71ba7 1450
1451 // Fill the last rows of fHistStatistics before saving
8dec6e35 1452 if (fComputeBG) {
1453 AliInfo("BG estimate assumes that for a given run you only have A and C triggers separately or"
1454 " toghether as a AC class! Make sure this assumption holds in your case");
1455
1456 // use an anum for the different trigger classes, to make loops easier to read
1457 enum {kClassB =0 , kClassA, kClassC, kClassAC, kClassE, kNClasses};
1458 const char * classFlags[] = {"B", "A", "C", "AC", "E"}; // labels
1459
1460 UInt_t * rows[kNClasses] = {0}; // Array of matching rows
1461 Int_t nrows[kNClasses] = {0};
1462 // Get rows matching the requested trigger bits for all trigger classes
1463 for(Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
1464 nrows[iTrigClass] = GetStatRow(classFlags[iTrigClass],fComputeBG,&rows[iTrigClass]);
1465 }
1466
1467 // 0. Determine the ratios of triggers E/B, A/B, C/B from the stat histogram
1468 // Those are used to rescale the different classes to the same number of bx ids
1469 // TODO: pass names of the rows for B, CA and E and look names of the rows. How do I handle the case in which both AC are in the same row?
1470 Int_t nBXIds[kNClasses] = {0};
1471 // cout <<"Computing BG:" << endl;
1472
1473 for(Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
1474 for(Int_t irow = 0; irow < nrows[iTrigClass]; irow++) {
1475 if(irow==0) cout << "- Class " << classFlags[iTrigClass] << endl;
1476 for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++) {
1477 if (fHistBunchCrossing->GetBinContent(j, rows[iTrigClass][irow]) > 0) {
1478 nBXIds[iTrigClass]++;
141265a2 1479 }
141265a2 1480 }
8dec6e35 1481 if(nBXIds[iTrigClass]>0) cout << " Using row " << rows[iTrigClass][irow] << ": "
1482 << fHistBunchCrossing->GetYaxis()->GetBinLabel(rows[iTrigClass][irow])
1483 << " (nBXID "<< nBXIds[iTrigClass] << ")"<< endl;
141265a2 1484
5f337f3d 1485 }
141265a2 1486
8dec6e35 1487 }
1488
1489 Float_t ratioToB[kNClasses];
1490 ratioToB[kClassE] = nBXIds[kClassE] >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassE] : 0;
1491 ratioToB[kClassA] = nBXIds[kClassA] >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassA] : 0;
1492 ratioToB[kClassC] = nBXIds[kClassC] >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassC] : 0;
1493 ratioToB[kClassAC] = nBXIds[kClassAC] >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassAC] : 0;
1494 Printf("Ratio between the BX ids in the different trigger classes:");
1495 Printf(" B/E = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassE], ratioToB[kClassE] );
1496 Printf(" B/A = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassA], ratioToB[kClassA] );
1497 Printf(" B/C = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassC], ratioToB[kClassC] );
1498 Printf(" B/AC = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassAC],ratioToB[kClassAC]);
1499 Int_t nHistStat = 2;
1500
1501 // 1. loop over all cols
1502 for(Int_t iHistStat = 0; iHistStat < nHistStat; iHistStat++){
1503 Int_t ncol = fHistStatistics[iHistStat]->GetNbinsX();
1504 Float_t good1 = 0;
1505 for(Int_t icol = 1; icol <= ncol; icol++) {
1506 Int_t nEvents[kNClasses] = {0}; // number of events should be reset at every column
1507 // For all trigger classes, add up over row matching trigger mask (as selected before)
1508 for(Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
1509 for(Int_t irow = 0; irow < nrows[iTrigClass]; irow++) {
1510 nEvents[iTrigClass] += (Int_t) fHistStatistics[iHistStat]->GetBinContent(icol,rows[iTrigClass][irow]);
141265a2 1511 }
8dec6e35 1512 // cout << "Events " << classFlags[iTrigClass] << " ("<<icol<<") " << nEvents[iTrigClass] << endl;
1513 }
1514 if (nEvents[kClassB]>0) {
1515 Float_t acc = ratioToB[kClassE]*nEvents[kClassE];
7c55ebd9 1516 Double_t accErr = TMath::Sqrt(ratioToB[kClassE]*ratioToB[kClassE]*nEvents[kClassE]);
8dec6e35 1517 // Int_t bg = cint1A + cint1C - 2*acc;
141265a2 1518
8dec6e35 1519 // If intensity measurements are available, they already
1520 // contain the scaling for BX ratios, so we reset the
1521 // ratioToB entries
1779d797 1522 if(icol == 1) {
1523 if(fBIFactorAC > 0 || fBIFactorA > 0 || fBIFactorC > 0) {
7c55ebd9 1524 if (fBIFactorAC <= 0 && (fBIFactorA <= 0 || fBIFactorC <= 0)) {
1779d797 1525 AliError("Not all intensities set!, assuming equal intensities");
1526 fBIFactorA = 1;
1527 fBIFactorC = 1;
1528 fBIFactorAC = 1;
1529 } else {
1530 AliInfo("Using ratio of number of bunch crossing embedded in the intensity measurements");
1531 ratioToB[kClassA] = ratioToB[kClassA] >0 ? 1 : 0;
1532 ratioToB[kClassC] = ratioToB[kClassC] >0 ? 1 : 0;
1533 ratioToB[kClassAC] = ratioToB[kClassAC] >0 ? 1 : 0;
1534 AliInfo(Form(" - BI Factor A: %f", fBIFactorA ));
1535 AliInfo(Form(" - BI Factor C: %f", fBIFactorC ));
1536 AliInfo(Form(" - BI Factor AC: %f", fBIFactorAC ));
1537
1538 }
1539 } else {
1540 AliWarning("Intensities not set!, assuming equal intensities");
8dec6e35 1541 fBIFactorA = 1;
1542 fBIFactorC = 1;
1543 fBIFactorAC = 1;
8dec6e35 1544 }
8dec6e35 1545 }
8dec6e35 1546 // Assuming that for a given class the triggers are either recorded as A+C or AC
1547 Float_t bg = nEvents[kClassAC] > 0 ?
1548 fBIFactorAC*(ratioToB[kClassAC]*nEvents[kClassAC] - 2*acc):
1549 fBIFactorA* (ratioToB[kClassA]*nEvents[kClassA]-acc) +
1550 fBIFactorC* (ratioToB[kClassC]*nEvents[kClassC]-acc) ;
1551
1552 // cout << "-----------------------" << endl;
1553 // cout << "Factors: " << fBIFactorA << " " << fBIFactorC << " " << fBIFactorAC << endl;
1554 // cout << "Ratios: " << ratioToB[kClassA] << " " << ratioToB[kClassC] << " " << ratioToB[kClassAC] << endl;
1555 // cout << "Evts: " << nEvents[kClassA] << " " << nEvents[kClassC] << " " << nEvents[kClassAC] << " " << nEvents[kClassB] << endl;
1556 // cout << "Acc: " << acc << endl;
1557 // cout << "BG: " << bg << endl;
1558 // cout << " " << fBIFactorA* (ratioToB[kClassA]*nEvents[kClassA]-acc) <<endl;
1559 // cout << " " << fBIFactorC* (ratioToB[kClassC]*nEvents[kClassC]-acc) <<endl;
1560 // cout << " " << fBIFactorAC*(ratioToB[kClassAC]*nEvents[kClassAC] - 2*acc) << endl;
1561 // cout << "-----------------------" << endl;
1562
1563 Float_t good = Float_t(nEvents[kClassB]) - bg - acc;
1564 if (icol ==1) good1 = good;
1565 // Float_t errGood = TMath::Sqrt(2*(nEvents[kClassA]+nEvents[kClassC]+nEvents[kClassE]));// Error on the number of goods assuming only bg fluctuates
1566 // DeltaG^2 = B + FA^2 A + FC^2 C + Ratio^2 (FA+FC-1)^2 E.
1567 Float_t errGood = nEvents[kClassAC] > 0 ?
1568 TMath::Sqrt( nEvents[kClassB] +
1569 fBIFactorAC*fBIFactorAC*ratioToB[kClassAC]*ratioToB[kClassAC]*nEvents[kClassAC] +
1570 ratioToB[kClassE] * ratioToB[kClassE] *
1571 (fBIFactorAC - 1)*(fBIFactorAC - 1)*nEvents[kClassE]) :
1572 TMath::Sqrt( nEvents[kClassB] +
1573 fBIFactorA*fBIFactorA*ratioToB[kClassA]*ratioToB[kClassA]*nEvents[kClassA] +
1574 fBIFactorC*fBIFactorC*ratioToB[kClassC]*ratioToB[kClassC]*nEvents[kClassC] +
1575 ratioToB[kClassE] * ratioToB[kClassE] *
1576 (fBIFactorA + fBIFactorC - 1)*(fBIFactorA + fBIFactorC - 1)*nEvents[kClassE]);
1577
1578 Float_t errBG = nEvents[kClassAC] > 0 ?
1579 TMath::Sqrt(fBIFactorAC*fBIFactorAC*ratioToB[kClassAC]*ratioToB[kClassAC]*nEvents[kClassAC]+
1580 4*ratioToB[kClassE]*ratioToB[kClassE]*(fBIFactorAC*fBIFactorAC)*nEvents[kClassE]) :
1581 TMath::Sqrt(fBIFactorA*fBIFactorA*ratioToB[kClassA]*ratioToB[kClassA]*nEvents[kClassA]+
1582 fBIFactorC*fBIFactorC*ratioToB[kClassC]*ratioToB[kClassC]*nEvents[kClassC]+
1583 ratioToB[kClassE]*ratioToB[kClassE]*(fBIFactorA+fBIFactorC)*(fBIFactorA+fBIFactorC)*nEvents[kClassE]);
85c71ba7 1584
1585
8dec6e35 1586 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAllB, nEvents[kClassB]);
1587 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAllAC,nEvents[kClassA]+nEvents[kClassC]+nEvents[kClassAC]);
1588 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAllE, nEvents[kClassE]);
1589
1590 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowBG,bg);
1591 fHistStatistics[iHistStat]->SetBinError (icol,fBGStatOffset+kStatRowBG,errBG);
1592 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAcc,acc);
7c55ebd9 1593 fHistStatistics[iHistStat]->SetBinError (icol,fBGStatOffset+kStatRowAcc,accErr);
8dec6e35 1594 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowGood,good);
1595 fHistStatistics[iHistStat]->SetBinError (icol,fBGStatOffset+kStatRowGood,errGood);
85c71ba7 1596
1597#ifdef VERBOSE_STAT
8dec6e35 1598 //kStatRowBG=0,kStatRowAcc,kStatRowBGFrac,kStatRowAccFrac,kStatRowErrGoodFrac,kStatRowGoodFrac,kStatRowGood,kStatRowErrGood
1599 Float_t accFrac = Float_t(acc) / nEvents[kClassB] *100;
7c55ebd9 1600 Float_t errAccFrac= Float_t(accErr) / nEvents[kClassB] *100;
8dec6e35 1601 Float_t bgFrac = Float_t(bg) / nEvents[kClassB] *100;
1602 Float_t goodFrac = Float_t(good) / good1 *100;
1603 Float_t errGoodFrac = errGood/good1 * 100;
1604 Float_t errFracBG = bg > 0 ? TMath::Sqrt((errBG/bg)*(errBG/bg) + 1/nEvents[kClassB])*bgFrac : 0;
1605 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowBGFrac,bgFrac);
1606 fHistStatistics[iHistStat]->SetBinError (icol,fBGStatOffset+kStatRowBGFrac,errFracBG);
1607 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAccFrac,accFrac);
1608 fHistStatistics[iHistStat]->SetBinError (icol,fBGStatOffset+kStatRowAccFrac,errAccFrac);
1609 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowGoodFrac,goodFrac);
1610 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowErrGoodFrac,errGoodFrac);
1611 fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowErrGood,errGood);
85c71ba7 1612#endif
85c71ba7 1613 }
1614 }
8dec6e35 1615 }
1616 for (Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
1617 delete [] rows[iTrigClass];
85c71ba7 1618 }
8dec6e35 1619 }
85c71ba7 1620
1621 fHistStatistics[0]->Write();
1622 fHistStatistics[1]->Write();
8e58a7b9 1623 if(fHistBunchCrossing ) fHistBunchCrossing ->Write();
1624 if(fHistTriggerPattern) fHistTriggerPattern->Write();
61899827 1625
296dd262 1626 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
1627 for (Int_t i=0; i < count; i++)
8dec6e35 1628 {
1629 TString triggerClass = "trigger_histograms_";
1630 if (i < fCollTrigClasses.GetEntries())
1631 triggerClass += ((TObjString*) fCollTrigClasses.At(i))->String();
1632 else
1633 triggerClass += ((TObjString*) fBGTrigClasses.At(i - fCollTrigClasses.GetEntries()))->String();
1634
1635 gDirectory->mkdir(triggerClass);
1636 gDirectory->cd(triggerClass);
1637
1638 static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i))->SaveHistograms();
1639
1640 gDirectory->cd("..");
1641 }
1ea7a921 1642
61899827 1643 if (folder)
1644 gDirectory->cd("..");
7c55ebd9 1645
61899827 1646}
85c71ba7 1647
141265a2 1648Int_t AliPhysicsSelection::GetStatRow(const char * triggerBXClass, UInt_t offlineTriggerType, UInt_t ** rowIDs) const {
1649 // Puts inside the array rowIDs the row number for a given offline
1650 // trigger in a given bx class. Returns the total number of lines
1651 // matching the selection
1652 // triggerBXClass can be either "A", "AC", "B" or "E"
1653 // offlineTriggerType is one of the types defined in AliVEvent
1654 // User should delete rowIDs if no longer needed
1655
1656 if(!fHistStatistics[0]) {
1657 AliWarning("Not initialized, returning 0");
1658 return 0;
1659 }
1660 const Int_t nrows = fHistStatistics[0]->GetNbinsY();
1661
1662 // allocate memory for at maximum nrows
1663 Int_t nMatches = 0;
1664 (*rowIDs) = new UInt_t[nrows];
1665
7c55ebd9 1666
1667 // Loop over rows and find matching ones, using the PS OADB
1668 // FIXME: check BG estimates
141265a2 1669 for(Int_t irow = 1; irow <= nrows; irow++){
8dec6e35 1670 TString triggerClassCurrent = fHistStatistics[0]->GetYaxis()->GetBinLabel(irow);
7c55ebd9 1671 TPRegexp trigType (".*\\&(\\d+).*");
1672 TObjArray * arr = trigType.MatchS(triggerClassCurrent.Data());
1673 if(arr->GetEntries() > 1){
1674 UInt_t tType = ((TObjString*)arr->At(1))->GetString().Atoi();
1675
1676 if (tType == offlineTriggerType && fPSOADB->GetBeamSide(triggerClassCurrent.Data()) == triggerBXClass) {
1677 (*rowIDs)[nMatches] = irow;
1678 nMatches++;
141265a2 1679 }
7c55ebd9 1680
141265a2 1681 }
7c55ebd9 1682 delete arr;
1683
85c71ba7 1684 }
141265a2 1685
1686 return nMatches;
1687}
85c71ba7 1688
141265a2 1689void AliPhysicsSelection::SetBIFactors(const AliESDEvent * aESD) {
1690 // Set factors for realtive bunch intesities
1691 if(!aESD) {
1692 AliFatal("ESD not given");
1693 }
1694 Int_t run = aESD->GetRunNumber();
1695 if (run > 105268) {
1696 // intensities stored in the ESDs
1697 const AliESDRun* esdRun = aESD->GetESDRun();
1698 Double_t intAB = esdRun->GetMeanIntensityIntecting(0);
1699 Double_t intCB = esdRun->GetMeanIntensityIntecting(1);
1700 Double_t intAA = esdRun->GetMeanIntensityNonIntecting(0);
1701 Double_t intCC = esdRun->GetMeanIntensityNonIntecting(1);
1702
1703 // cout << "INT " <<intAB <<endl;
1704 // cout << "INT " <<intCB <<endl;
1705 // cout << "INT " <<intAA <<endl;
1706 // cout << "INT " <<intCC <<endl;
1707
d0b66831 1708 if (intAB > 0 && intAA > 0) {
141265a2 1709 fBIFactorA = intAB/intAA;
1710 } else {
8dec6e35 1711 AliWarning("Cannot set fBIFactorA");
141265a2 1712 }
1713
d0b66831 1714 if (intCB > 0 && intCC > 0) {
141265a2 1715 fBIFactorC = intCB/intCC;
1716 } else {
8dec6e35 1717 AliWarning("Cannot set fBIFactorC");
141265a2 1718 }
1719
d0b66831 1720 if (intAB > 0 && intAA > 0 &&
1721 intCB > 0 && intCC > 0) {
141265a2 1722 fBIFactorAC = (intAB+intCB)/(intAA+intCC);
1723 } else {
8dec6e35 1724 AliWarning("Cannot set fBIFactorAC");
141265a2 1725 }
1726
1727 }
1728 else {
1729 // First runs. Intensities hardcoded
1730 switch(run) {
1731 case 104155:
1732 fBIFactorA = 0.961912722908;
1733 fBIFactorC = 1.04992336081;
1734 break;
1735 case 104157:
1736 fBIFactorA = 0.947312854998;
1737 fBIFactorC = 1.01599706417;
1738 break;
1739 case 104159:
1740 fBIFactorA = 0.93659320151;
1741 fBIFactorC = 0.98580804207;
1742 break;
1743 case 104160:
1744 fBIFactorA = 0.929664189926;
1745 fBIFactorC = 0.963467679851;
1746 break;
1747 case 104315:
1748 fBIFactorA = 1.08939104979;
1749 fBIFactorC = 0.931113921925;
1750 break;
1751 case 104316:
1752 fBIFactorA = 1.08351880974;
1753 fBIFactorC = 0.916068345845;
1754 break;
1755 case 104320:
1756 fBIFactorA = 1.07669281245;
1757 fBIFactorC = 0.876818744763;
1758 break;
1759 case 104321:
1760 fBIFactorA = 1.00971079602;
1761 fBIFactorC = 0.773781299076;
1762 break;
1763 case 104792:
1764 fBIFactorA = 0.787215863962;
1765 fBIFactorC = 0.778253173071;
1766 break;
1767 case 104793:
1768 fBIFactorA = 0.692211363661;
1769 fBIFactorC = 0.733152456667;
1770 break;
1771 case 104799:
1772 fBIFactorA = 1.04027825161;
1773 fBIFactorC = 1.00530825942;
1774 break;
1775 case 104800:
1776 fBIFactorA = 1.05309910671;
1777 fBIFactorC = 1.00376801855;
1778 break;
1779 case 104801:
1780 fBIFactorA = 1.0531231922;
1781 fBIFactorC = 0.992439666758;
1782 break;
1783 case 104802:
1784 fBIFactorA = 1.04191478134;
1785 fBIFactorC = 0.979368585208;
1786 break;
1787 case 104803:
1788 fBIFactorA = 1.03121314094;
1789 fBIFactorC = 0.973379962609;
1790 break;
1791 case 104824:
1792 fBIFactorA = 0.969945926722;
1793 fBIFactorC = 0.39549745806;
1794 break;
1795 case 104825:
1796 fBIFactorA = 0.968627213937;
1797 fBIFactorC = 0.310100412205;
1798 break;
1799 case 104841:
1800 fBIFactorA = 0.991601393212;
1801 fBIFactorC = 0.83762204722;
1802 break;
1803 case 104845:
1804 fBIFactorA = 0.98040863886;
1805 fBIFactorC = 0.694824205793;
1806 break;
1807 case 104867:
1808 fBIFactorA = 1.10646173412;
1809 fBIFactorC = 0.841407246916;
1810 break;
1811 case 104876:
1812 fBIFactorA = 1.12063452421;
1813 fBIFactorC = 0.78726542895;
1814 break;
1815 case 104890:
1816 fBIFactorA = 1.02346137453;
1817 fBIFactorC = 1.03355663595;
1818 break;
1819 case 104892:
1820 fBIFactorA = 1.05406025913;
1821 fBIFactorC = 1.00029166135;
1822 break;
1823 case 105143:
1824 fBIFactorA = 0.947343384349;
1825 fBIFactorC = 0.972637444408;
1826 break;
1827 case 105160:
1828 fBIFactorA = 0.908854622177;
1829 fBIFactorC = 0.958851103977;
1830 break;
1831 case 105256:
1832 fBIFactorA = 0.810076150206;
1833 fBIFactorC = 0.884663561883;
1834 break;
1835 case 105257:
1836 fBIFactorA = 0.80974912303;
1837 fBIFactorC = 0.878859123479;
1838 break;
1839 case 105268:
1840 fBIFactorA = 0.809052110679;
1841 fBIFactorC = 0.87233890989;
1842 break;
1843 default:
1844 fBIFactorA = 1;
1845 fBIFactorC = 1;
1846 }
1847 }
85c71ba7 1848
1849}
7c55ebd9 1850
1851const char * AliPhysicsSelection::GetTriggerString(TObjString * obj) {
1852 // Returns a formed objstring
1853 static TString retString;
1854
1855 retString.Form("%s%s",
1856 obj->String().Data(),
1857 fUseBXNumbers ? fFillOADB->GetBXIDs(fPSOADB->GetBeamSide(obj->String().Data())) : ""
1858 );
1859
1860 if (fMC) {
1861 TPRegexp stripClasses("\\+\\S* ");
1862 stripClasses.Substitute(retString,"","g");
1863 stripClasses=TPRegexp("\\-\\S* ");
1864 stripClasses.Substitute(retString,"","g");
1865 }
1866
1867 return retString.Data();
1868}
1869
1870void AliPhysicsSelection::AddCollisionTriggerClass(const char* className){
1871 AliError("This method is deprecated! Will be removed soon! Please use SetCustomOADBObjects() instead!");
1872 if(!fPSOADB) {
1873 fPSOADB = new AliOADBPhysicsSelection("CustomPS");
1874 fPSOADB->SetHardwareTrigger ( 0,"SPDGFO >= 1 || V0A || V0C");
1875 fPSOADB->SetOfflineTrigger ( 0,"(SPDGFO >= 1 || V0A || V0C) && !V0ABG && !V0CBG");
1876 }
1877
1878 // Strip all which is not needed, if BX ids are provided, they are still used here
1879 // offline trigger and logics are appended automagically, so we strip-em out if they are provided
1880 TString classNameStripped = className;
1881 if(classNameStripped.Index("*")>0)
1882 classNameStripped.Remove(classNameStripped.Index("*")); // keep only the class name (no bx, offline trigger...)
1883 if(classNameStripped.Index("&")>0)
1884 classNameStripped.Remove(classNameStripped.Index("&")); // keep only the class name (no bx, offline trigger...)
1885
1886 fPSOADB->AddCollisionTriggerClass ( AliVEvent::kUserDefined,classNameStripped.Data(),"B",0);
1887
1888 fUsingCustomClasses = kTRUE;
1889
1890
1891}
1892
1893void AliPhysicsSelection::AddBGTriggerClass(const char* className){
1894 // Add custom BG trigger class
1895
1896 AliError("This method is deprecated! Will be removed soon! Please use SetCustomOADBObjects() instead!");
1897 if(!fPSOADB) {
1898 fPSOADB = new AliOADBPhysicsSelection("CustomPS");
1899 fPSOADB->SetHardwareTrigger ( 0,"SPDGFO >= 1 || V0A || V0C");
1900 fPSOADB->SetOfflineTrigger ( 0,"(SPDGFO >= 1 || V0A || V0C) && !V0ABG && !V0CBG");
1901 }
1902
1903 // Strip all which is not needed, if BX ids are provided, they are still used here
1904 // offline trigger and logics are appended automagically, so we strip-em out if they are provided
1905 TString classNameStripped = className;
1906 if(classNameStripped.Index("*")>0)
1907 classNameStripped.Remove(classNameStripped.Index("*")); // keep only the class name (no bx, offline trigger...)
1908 if(classNameStripped.Index("&")>0)
1909 classNameStripped.Remove(classNameStripped.Index("&")); // keep only the class name (no bx, offline trigger...)
1910
1911 fPSOADB->AddBGTriggerClass ( AliVEvent::kUserDefined,classNameStripped.Data(),"AC",0);
1912
1913 fUsingCustomClasses = kTRUE;
1914
1915}