Switch to the new raw reader (Julian, Raphaelle)
[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//
85c71ba7 95// Origin: Jan Fiete Grosse-Oetringhaus, CERN
96// Michele Floris, CERN
61899827 97//-------------------------------------------------------------------------
98
99#include <Riostream.h>
100#include <TH1F.h>
101#include <TH2F.h>
102#include <TList.h>
103#include <TIterator.h>
104#include <TDirectory.h>
296dd262 105#include <TObjArray.h>
61899827 106
107#include <AliPhysicsSelection.h>
108
109#include <AliTriggerAnalysis.h>
110#include <AliLog.h>
111
112#include <AliESDEvent.h>
85c71ba7 113#include <AliAnalysisTaskSE.h>
114#include "AliAnalysisManager.h"
61899827 115
116ClassImp(AliPhysicsSelection)
117
118AliPhysicsSelection::AliPhysicsSelection() :
296dd262 119 AliAnalysisCuts("AliPhysicsSelection", "AliPhysicsSelection"),
120 fCurrentRun(-1),
a2ce3799 121 fMC(kFALSE),
296dd262 122 fCollTrigClasses(),
123 fBGTrigClasses(),
124 fTriggerAnalysis(),
125 fBackgroundIdentification(0),
91bea6e7 126 fHistBunchCrossing(0),
73cc8654 127 fHistTriggerPattern(0),
91bea6e7 128 fSkipTriggerClassSelection(0),
85c71ba7 129 fUsingCustomClasses(0),
130 fSkipV0(0),
131 fBIFactorA(1),
132 fBIFactorC(1),
133 fRatioBEEE(2),
134 fComputeBG(0),
73cc8654 135 fUseBXNumbers(1),
136 fUseMuonTriggers(0),
85c71ba7 137 fFillingScheme(""),
ff097e3f 138 fBin0CallBack(""),
139 fBin0CallBackPointer(0)
61899827 140{
141 // constructor
142
296dd262 143 fCollTrigClasses.SetOwner(1);
144 fBGTrigClasses.SetOwner(1);
145 fTriggerAnalysis.SetOwner(1);
85c71ba7 146 fHistStatistics[0] = 0;
147 fHistStatistics[1] = 0;
296dd262 148
61899827 149 AliLog::SetClassDebugLevel("AliPhysicsSelection", AliLog::kWarning);
150}
151
152AliPhysicsSelection::~AliPhysicsSelection()
153{
154 // destructor
85c71ba7 155
296dd262 156 fCollTrigClasses.Delete();
157 fBGTrigClasses.Delete();
158 fTriggerAnalysis.Delete();
61899827 159
85c71ba7 160 if (fHistStatistics[0])
161 {
162 delete fHistStatistics[0];
163 fHistStatistics[0] = 0;
164 }
165 if (fHistStatistics[1])
61899827 166 {
85c71ba7 167 delete fHistStatistics[1];
168 fHistStatistics[1] = 0;
61899827 169 }
170
171 if (fHistBunchCrossing)
172 {
173 delete fHistBunchCrossing;
174 fHistBunchCrossing = 0;
175 }
73cc8654 176 if (fHistTriggerPattern)
177 {
178 delete fHistTriggerPattern;
179 fHistTriggerPattern = 0;
180 }
85c71ba7 181
61899827 182}
296dd262 183
184Bool_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const char* trigger) const
185{
186 // checks if the given trigger class(es) are found for the current event
187 // format of trigger: +TRIGGER1 -TRIGGER2
188 // requires TRIGGER1 and rejects TRIGGER2
189
decf6fd4 190 Bool_t foundBCRequirement = kFALSE;
191 Bool_t foundCorrectBC = kFALSE;
192
296dd262 193 TString str(trigger);
194 TObjArray* tokens = str.Tokenize(" ");
195
196 for (Int_t i=0; i < tokens->GetEntries(); i++)
197 {
198 TString str2(((TObjString*) tokens->At(i))->String());
199
decf6fd4 200 if (str2[0] == '+' || str2[0] == '-')
296dd262 201 {
decf6fd4 202 Bool_t flag = (str2[0] == '+');
203
204 str2.Remove(0, 1);
205
206 if (flag && !aEsd->IsTriggerClassFired(str2))
207 {
208 AliDebug(AliLog::kDebug, Form("Rejecting event because trigger class %s is not present", str2.Data()));
209 delete tokens;
210 return kFALSE;
211 }
212 if (!flag && aEsd->IsTriggerClassFired(str2))
213 {
214 AliDebug(AliLog::kDebug, Form("Rejecting event because trigger class %s is present", str2.Data()));
215 delete tokens;
216 return kFALSE;
217 }
296dd262 218 }
decf6fd4 219 else if (str2[0] == '#')
296dd262 220 {
decf6fd4 221 foundBCRequirement = kTRUE;
222
223 str2.Remove(0, 1);
224
225 Int_t bcNumber = str2.Atoi();
226 AliDebug(AliLog::kDebug, Form("Checking for bunch crossing number %d", bcNumber));
227
228 if (aEsd->GetBunchCrossNumber() == bcNumber)
229 {
230 foundCorrectBC = kTRUE;
231 AliDebug(AliLog::kDebug, Form("Found correct bunch crossing %d", bcNumber));
232 }
296dd262 233 }
decf6fd4 234 else
235 AliFatal(Form("Invalid trigger syntax: %s", trigger));
296dd262 236 }
237
238 delete tokens;
decf6fd4 239
240 if (foundBCRequirement && !foundCorrectBC)
241 return kFALSE;
242
296dd262 243 return kTRUE;
244}
61899827 245
246Bool_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
247{
248 // checks if the given event is a collision candidate
249
95e6f4ec 250 if (fCurrentRun != aEsd->GetRunNumber())
251 if (!Initialize(aEsd->GetRunNumber()))
252 AliFatal(Form("Could not initialize for run %d", aEsd->GetRunNumber()));
253
61899827 254 const AliESDHeader* esdHeader = aEsd->GetHeader();
255 if (!esdHeader)
256 {
257 AliError("ESD Header could not be retrieved");
258 return kFALSE;
259 }
260
a2ce3799 261 // check event type; should be PHYSICS = 7 for data and 0 for MC
262 if (!fMC)
263 {
264 if (esdHeader->GetEventType() != 7)
265 return kFALSE;
266 }
267 else
268 {
269 if (esdHeader->GetEventType() != 0)
270 AliFatal(Form("Invalid event type for MC: %d", esdHeader->GetEventType()));
271 }
758941d4 272
296dd262 273 Bool_t accept = kFALSE;
274
275 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
276 for (Int_t i=0; i < count; i++)
61899827 277 {
296dd262 278 const char* triggerClass = 0;
279 if (i < fCollTrigClasses.GetEntries())
280 triggerClass = ((TObjString*) fCollTrigClasses.At(i))->String();
281 else
282 triggerClass = ((TObjString*) fBGTrigClasses.At(i - fCollTrigClasses.GetEntries()))->String();
61899827 283
296dd262 284 AliDebug(AliLog::kDebug, Form("Processing trigger class %s", triggerClass));
61899827 285
296dd262 286 AliTriggerAnalysis* triggerAnalysis = static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i));
61899827 287
296dd262 288 triggerAnalysis->FillTriggerClasses(aEsd);
61899827 289
296dd262 290 if (CheckTriggerClass(aEsd, triggerClass))
291 {
292 triggerAnalysis->FillHistograms(aEsd);
293
85c71ba7 294 Bool_t isBin0 = kFALSE;
295 if (fBin0CallBack != "") {
296 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
297 if (!mgr) {
298 AliError("Cannot get the analysis manager");
299 }
300 else {
301 isBin0 = ((AliAnalysisTaskSE*)mgr->GetTask(fBin0CallBack.Data()))->IsEventInBinZero();
302 }
ff097e3f 303 } else if (fBin0CallBackPointer) {
304 isBin0 = (*fBin0CallBackPointer)(aEsd);
305
85c71ba7 306 }
ff097e3f 307
85c71ba7 308
cc9d9320 309
310 // hardware trigger (should only remove events for MC)
311 // replay CINT1B hardware trigger
312 // TODO this has to depend on the actual hardware trigger (and that depends on the run...)
313 Int_t fastORHW = triggerAnalysis->SPDFiredChips(aEsd, 1); // SPD number of chips from trigger bits (!)
85c71ba7 314 Bool_t v0A = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0A);
315 Bool_t v0C = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0C);
316 Bool_t v0AHW = fSkipV0 ? 0 :(triggerAnalysis->V0Trigger(aEsd, AliTriggerAnalysis::kASide, kTRUE) == AliTriggerAnalysis::kV0BB);// should replay hw trigger
317 Bool_t v0CHW = fSkipV0 ? 0 :(triggerAnalysis->V0Trigger(aEsd, AliTriggerAnalysis::kCSide, kTRUE) == AliTriggerAnalysis::kV0BB);// should replay hw trigger
cc9d9320 318 // offline trigger
319 Int_t fastOROffline = triggerAnalysis->SPDFiredChips(aEsd, 0); // SPD number of chips from clusters (!)
85c71ba7 320 Bool_t v0ABG = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0ABG);
321 Bool_t v0CBG = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0CBG);
f4ca8f20 322 Bool_t v0BG = v0ABG || v0CBG;
85c71ba7 323
324 // fmd
325 Bool_t fmdA = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kFMDA);
326 Bool_t fmdC = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kFMDC);
327 Bool_t fmd = fmdA || fmdC;
61899827 328
85c71ba7 329 // SSD
330 Int_t ssdClusters = triggerAnalysis->SSDClusters(aEsd);
331
332 // Some "macros"
333 Bool_t mb1 = (fastOROffline > 0 || v0A || v0C) && (!v0BG);
334 Bool_t mb1prime = (fastOROffline > 1 || (fastOROffline > 0 && (v0A || v0C)) || (v0A && v0C) ) && (!v0BG);
335
336 // Background rejection
337 Bool_t bgID = ! fBackgroundIdentification->IsSelected(const_cast<AliESDEvent*> (aEsd));
338
339 Int_t ntrig = fastOROffline; // any 2 hits
340 if(v0A) ntrig += 1;
341 if(v0C) ntrig += 1; //v0C alone is enough
342 if(fmd) ntrig += 1;
343 if(ssdClusters>1) ntrig += 1;
344
345
346 Bool_t hwTrig = fastORHW > 0 || v0AHW || v0CHW;
347
73cc8654 348 // Fill trigger pattern histo
349 Int_t tpatt = 0;
350 if (fastORHW>0) tpatt+=1;
351 if (v0AHW) tpatt+=2;
352 if (v0CHW) tpatt+=4;
353 fHistTriggerPattern->Fill( tpatt );
354
85c71ba7 355 // fill statistics and return decision
356 const Int_t nHistStat = 2;
357 for(Int_t iHistStat = 0; iHistStat < nHistStat; iHistStat++){
358 if (iHistStat == kStatIdxBin0 && !isBin0) continue; // skip the filling of bin0 stats if the event is not in the bin0
359
360 fHistStatistics[iHistStat]->Fill(kStatTriggerClass, i);
361
362
363
364 // We fill the rest only if hw trigger is ok
365 if (!hwTrig)
366 {
367 AliDebug(AliLog::kDebug, "Rejecting event because hardware trigger is not fired");
368 continue;
369 } else {
370 fHistStatistics[iHistStat]->Fill(kStatHWTrig, i);
371 }
733f0542 372
85c71ba7 373
374 // v0 BG stats
375 if (v0ABG)
376 fHistStatistics[iHistStat]->Fill(kStatV0ABG, i);
377 if (v0CBG)
378 fHistStatistics[iHistStat]->Fill(kStatV0CBG, i);
379
380 // We fill the rest only if mb1 && ! v0BG
381 if (mb1)
382 fHistStatistics[iHistStat]->Fill(kStatMB1, i);
383 else continue;
384
385 if (mb1prime)
386 fHistStatistics[iHistStat]->Fill(kStatMB1Prime, i);
387
388 if (fmd)
389 fHistStatistics[iHistStat]->Fill(kStatFMD, i);
390
391 if(ssdClusters>1)
392 fHistStatistics[iHistStat]->Fill(kStatSSD1, i);
393
394 if(ntrig >= 2 && !v0BG)
395 fHistStatistics[iHistStat]->Fill(kStatAny2Hits, i);
396
397 if (fastOROffline > 0)
398 fHistStatistics[iHistStat]->Fill(kStatFO1, i);
399 if (fastOROffline > 1)
400 fHistStatistics[iHistStat]->Fill(kStatFO2, i);
cc9d9320 401
85c71ba7 402 if (v0A)
403 fHistStatistics[iHistStat]->Fill(kStatV0A, i);
404 if (v0C)
405 fHistStatistics[iHistStat]->Fill(kStatV0C, i);
406
407 // if (fastOROffline > 1 && !v0BG)
408 // fHistStatistics[iHistStat]->Fill(kStatFO2NoBG, i);
409
410 if (fastOROffline > 0 && (v0A || v0C) && !v0BG)
411 fHistStatistics[iHistStat]->Fill(kStatFO1AndV0, i);
296dd262 412
85c71ba7 413 if (v0A && v0C && !v0BG && !bgID)
414 fHistStatistics[iHistStat]->Fill(kStatV0, i);
415
416
417 if ( mb1 )
418
419 {
420 if (!v0BG || fSkipV0)
421 {
422 if (!v0BG) fHistStatistics[iHistStat]->Fill(kStatOffline, i);
61899827 423
85c71ba7 424 if (fBackgroundIdentification && bgID)
425 {
426 AliDebug(AliLog::kDebug, "Rejecting event because of background identification");
427 fHistStatistics[iHistStat]->Fill(kStatBG, i);
428 }
429 else
430 {
431 AliDebug(AliLog::kDebug, "Accepted event for histograms");
296dd262 432
85c71ba7 433 fHistStatistics[iHistStat]->Fill(kStatAccepted, i);
434 if(iHistStat == kStatIdxAll) fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i); // Fill only for all (avoid double counting)
435 if((i < fCollTrigClasses.GetEntries() || fSkipTriggerClassSelection) && (iHistStat==kStatIdxAll))
436 accept = kTRUE; // only set for "all" (should not really matter)
437 }
438 }
439 else
440 AliDebug(AliLog::kDebug, "Rejecting event because of V0 BG flag");
441 }
442 else
443 AliDebug(AliLog::kDebug, "Rejecting event because trigger condition is not fulfilled");
296dd262 444 }
296dd262 445 }
446 }
447
448 if (accept)
449 AliDebug(AliLog::kDebug, "Accepted event as collision candidate");
61899827 450
296dd262 451 return accept;
61899827 452}
a2ce3799 453
85c71ba7 454Int_t AliPhysicsSelection::GetTriggerScheme(UInt_t runNumber) const
a2ce3799 455{
456 // returns the current trigger scheme (classes that are accepted/rejected)
457
458 if (fMC)
459 return 0;
460
461 // TODO dependent on run number
4b7e8f3b 462
463 switch (runNumber)
464 {
465 // CSMBB triggers
466 case 104044:
467 case 105054:
468 case 105057:
469 return 2;
470 }
471
472 // default: CINT1 suite
a2ce3799 473 return 1;
474}
85c71ba7 475
476const char * AliPhysicsSelection::GetFillingScheme(UInt_t runNumber) {
477
478 if(fMC) return "MC";
479
480 if (runNumber >= 104065 && runNumber <= 104160) {
481 return "4x4a";
482 }
483 else if (runNumber >= 104315 && runNumber <= 104321) {
484 return "4x4a*";
485 }
486 else if (runNumber >= 104792 && runNumber <= 104803) {
487 return "4x4b";
488 }
489 else if (runNumber >= 104824 && runNumber <= 104892) {
490 return "4x4c";
491 }
492 else if (runNumber == 105143 || runNumber == 105160) {
493 return "16x16a";
494 }
495 else if (runNumber >= 105256 && runNumber <= 105268) {
496 return "4x4c";
73cc8654 497 } else if (runNumber >= 114786 && runNumber <= 116684) {
ca234d7a 498 return "Single_2b_1_1_1";
85c71ba7 499 }
500 else {
501 AliError(Form("Unknown filling scheme (run %d)", runNumber));
502 }
503
504 return "Unknown";
505}
506
507Int_t AliPhysicsSelection::GetRatioBBBE(Int_t runNumber) {
508
509
510 if(fMC) return 1;
511
512 if (runNumber == 105143 || runNumber == 105160) {
513 return 8;
73cc8654 514 }else if (runNumber == 114786 || runNumber == 114798 ) {
515 return 1;
516 } else if (runNumber >= 114783 && runNumber <= 116684){
ca234d7a 517 return 1;
85c71ba7 518 }
519 else if (fComputeBG &&
520 !(runNumber >= 105256 && runNumber <= 105268) &&
521 !(runNumber >= 104065 && runNumber <= 104160) &&
522 !(runNumber >= 104315 && runNumber <= 104321) &&
523 !(runNumber >= 104792 && runNumber <= 104803) &&
524 !(runNumber >= 104824 && runNumber <= 104892)
525 ){
526
527 AliError(Form("Unknown run %d, assuming ratio BE/EE = 2",runNumber));
528
529 }
530
531 return 2;
532}
533
534
535const char * AliPhysicsSelection::GetBXIDs(UInt_t runNumber, const char * trigger) {
536
537 if (!fUseBXNumbers || fMC) return "";
538
539 if (runNumber >= 104065 && runNumber <= 104160) {
540 if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #2128 #3019";
541 else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #346 #3465";
542 else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1234 #1680";
543 else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
544 else AliError(Form("Unknown trigger: %s", trigger));
545 }
546 else if (runNumber >= 104315 && runNumber <= 104321) {
547 if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #2000 #2891";
548 else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #218 #3337";
549 else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1106 #1552";
550 else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
551 else AliError(Form("Unknown trigger: %s", trigger));
552 }
553 else if (runNumber >= 104792 && runNumber <= 104803) {
554 if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #2228 #3119";
555 else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2554 #446";
556 else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1334 #769";
557 else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
558 else AliError(Form("Unknown trigger: %s", trigger));
559 }
560 else if (runNumber >= 104824 && runNumber <= 104892) {
561 if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #3119 #769";
562 else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2554 #446";
563 else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1334 #2228";
564 else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
565 else AliError(Form("Unknown trigger: %s", trigger));
566 }
567 else if (runNumber == 105143 || runNumber == 105160) {
568 fRatioBEEE = 8;
569 if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #1337 #1418 #2228 #2309 #3119 #3200 #446 #527";
570 else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #1580 #1742 #1904 #2066 #2630 #2792 #2954 #3362";
571 else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #845 #1007 #1169 #1577 #3359 #3521 #119 #281 ";
572 else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
573 else AliError(Form("Unknown trigger: %s", trigger));
574 }
575 else if (runNumber >= 105256 && runNumber <= 105268) {
576 if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #3019 #669";
577 else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2454 #346";
578 else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #1234 #2128";
579 else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #790";
580 else AliError(Form("Unknown trigger: %s", trigger));
73cc8654 581 } else if (runNumber >= 114786 && runNumber <= 116684) { // 7 TeV 2010, assume always the same filling scheme
ca234d7a 582 if (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return " #346";
583 else if(!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return " #2131";
584 else if(!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return " #3019";
585 else if(!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1238";
586 else AliError(Form("Unknown trigger: %s", trigger));
85c71ba7 587 }
588 else {
589 AliError(Form("Unknown run %d, using all BXs!",runNumber));
590 }
591
592 return "";
593}
61899827 594
85c71ba7 595Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
61899827 596{
597 // initializes the object for the given run
598 // TODO having the run number here and parameters hardcoded is clearly temporary, a way needs to be found to have a CDB-like configuration also for analysis
599
29e8486e 600 Bool_t oldStatus = TH1::AddDirectoryStatus();
601 TH1::AddDirectory(kFALSE);
602
85c71ba7 603 if(!fBin0CallBack)
604 AliError("Bin0 Callback not set: will not fill the statistics for the bin 0");
605
606 if (fMC) {
607 // ovverride BX and bg options in case of MC
608 fComputeBG = kFALSE;
609 fUseBXNumbers = kFALSE;
610 }
611
a2ce3799 612 Int_t triggerScheme = GetTriggerScheme(runNumber);
91bea6e7 613 if (!fUsingCustomClasses && fCurrentRun != -1 && triggerScheme != GetTriggerScheme(fCurrentRun))
a2ce3799 614 AliFatal("Processing several runs with different trigger schemes is not supported");
296dd262 615
85c71ba7 616 if(fComputeBG && fCurrentRun != -1 && fCurrentRun != runNumber)
617 AliFatal("Cannot process several runs because BG computation is requested");
618
619 if(fComputeBG && !fUseBXNumbers)
620 AliFatal("Cannot compute BG id BX numbers are not used");
621
622 if(fUseBXNumbers && fFillingScheme != "" && fFillingScheme != GetFillingScheme(runNumber))
623 AliFatal("Cannot process runs with different filling scheme if usage of BX numbers is requested");
624
625 fRatioBEEE = GetRatioBBBE(runNumber);
626 fFillingScheme = GetFillingScheme(runNumber);
627
628 if(fComputeBG) SetBIFactors(runNumber);
629
61899827 630 AliInfo(Form("Initializing for run %d", runNumber));
631
758941d4 632 // initialize first time?
a2ce3799 633 if (fCurrentRun == -1)
a2ce3799 634 {
91bea6e7 635 if (fUsingCustomClasses) {
636 AliInfo("Using user-provided trigger classes");
637 } else {
638 switch (triggerScheme)
639 {
a2ce3799 640 case 0:
641 fCollTrigClasses.Add(new TObjString(""));
642 break;
91bea6e7 643
a2ce3799 644 case 1:
85c71ba7 645 { // need a new scope to avoid cross-initialization errors
73cc8654 646
647 if (fUseMuonTriggers) {
648 // Muon trigger have the same BXIDs of the corresponding CINT triggers
649 fCollTrigClasses.Add(new TObjString(Form("%s%s ","+CMUS1B-ABCE-NOPF-MUON", GetBXIDs(runNumber,"CINT1B-ABCE-NOPF-ALL"))));
650 fBGTrigClasses.Add (new TObjString(Form("%s%s ","+CMUS1A-ABCE-NOPF-MUON", GetBXIDs(runNumber,"CINT1A-ABCE-NOPF-ALL"))));
651 fBGTrigClasses.Add (new TObjString(Form("%s%s ","+CMUS1C-ABCE-NOPF-MUON", GetBXIDs(runNumber,"CINT1C-ABCE-NOPF-ALL"))));
652 fBGTrigClasses.Add (new TObjString(Form("%s%s ","+CMUS1-E-NOPF-MUON" , GetBXIDs(runNumber,"CINT1-E-NOPF-ALL"))));
653 }
85c71ba7 654 TObjString * cint1b = new TObjString(Form("%s%s","+CINT1B-ABCE-NOPF-ALL", GetBXIDs(runNumber,"CINT1B-ABCE-NOPF-ALL")));
655 TObjString * cint1a = new TObjString(Form("%s%s","+CINT1A-ABCE-NOPF-ALL", GetBXIDs(runNumber,"CINT1A-ABCE-NOPF-ALL")));
656 TObjString * cint1c = new TObjString(Form("%s%s","+CINT1C-ABCE-NOPF-ALL", GetBXIDs(runNumber,"CINT1C-ABCE-NOPF-ALL")));
657 TObjString * cint1e = new TObjString(Form("%s%s","+CINT1-E-NOPF-ALL", GetBXIDs(runNumber,"CINT1-E-NOPF-ALL")) );
658 //
659 fCollTrigClasses.Add(cint1b);
660 fBGTrigClasses.Add(cint1a);
661 fBGTrigClasses.Add(cint1c);
662 fBGTrigClasses.Add(cint1e);
73cc8654 663
85c71ba7 664 }
a2ce3799 665 break;
666
4b7e8f3b 667 case 2:
668 fCollTrigClasses.Add(new TObjString("+CSMBB-ABCE-NOPF-ALL"));
669 fBGTrigClasses.Add(new TObjString("+CSMBA-ABCE-NOPF-ALL -CSMBB-ABCE-NOPF-ALL"));
670 fBGTrigClasses.Add(new TObjString("+CSMBC-ABCE-NOPF-ALL -CSMBB-ABCE-NOPF-ALL"));
671 break;
91bea6e7 672
a2ce3799 673 default:
674 AliFatal(Form("Unsupported trigger scheme %d", triggerScheme));
91bea6e7 675 }
a2ce3799 676 }
91bea6e7 677
a2ce3799 678 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
679
680 for (Int_t i=0; i<count; i++)
681 {
682 AliTriggerAnalysis* triggerAnalysis = new AliTriggerAnalysis;
683 triggerAnalysis->SetAnalyzeMC(fMC);
684 triggerAnalysis->EnableHistograms();
685 triggerAnalysis->SetSPDGFOThreshhold(1);
686 fTriggerAnalysis.Add(triggerAnalysis);
687 }
688
85c71ba7 689 // TODO: shall I really delete this?
690 if (fHistStatistics[0])
691 delete fHistStatistics[0];
692 if (fHistStatistics[1])
693 delete fHistStatistics[1];
296dd262 694
85c71ba7 695 fHistStatistics[kStatIdxBin0] = BookHistStatistics("_Bin0");
696 fHistStatistics[kStatIdxAll] = BookHistStatistics("");
a2ce3799 697
698 if (fHistBunchCrossing)
699 delete fHistBunchCrossing;
700
701 fHistBunchCrossing = new TH2F("fHistBunchCrossing", "fHistBunchCrossing;bunch crossing number;", 4000, -0.5, 3999.5, count, -0.5, -0.5 + count);
73cc8654 702
703 if (fHistTriggerPattern)
704 delete fHistTriggerPattern;
705
706 const int ntrig=3;
85c71ba7 707 Int_t n = 1;
73cc8654 708 const Int_t nbinTrig = TMath::Nint(TMath::Power(2,ntrig));
709
710 fHistTriggerPattern = new TH1F("fHistTriggerPattern", "Trigger pattern: FO + 2*v0A + 4*v0C",
711 nbinTrig, -0.5, nbinTrig-0.5);
712 fHistTriggerPattern->GetXaxis()->SetBinLabel(1,"NO TRIG");
713 fHistTriggerPattern->GetXaxis()->SetBinLabel(2,"FO");
714 fHistTriggerPattern->GetXaxis()->SetBinLabel(3,"v0A");
715 fHistTriggerPattern->GetXaxis()->SetBinLabel(4,"FO & v0A");
716 fHistTriggerPattern->GetXaxis()->SetBinLabel(5,"v0C");
717 fHistTriggerPattern->GetXaxis()->SetBinLabel(6,"FO & v0C");
718 fHistTriggerPattern->GetXaxis()->SetBinLabel(7,"v0A & v0C");
719 fHistTriggerPattern->GetXaxis()->SetBinLabel(8,"FO & v0A & v0C");
720
721
722 n = 1;
a2ce3799 723 for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
724 {
a2ce3799 725 fHistBunchCrossing->GetYaxis()->SetBinLabel(n, ((TObjString*) fCollTrigClasses.At(i))->String());
726 n++;
727 }
728 for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
729 {
a2ce3799 730 fHistBunchCrossing->GetYaxis()->SetBinLabel(n, ((TObjString*) fBGTrigClasses.At(i))->String());
731 n++;
732 }
85c71ba7 733
734
735
a2ce3799 736 }
737
738 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
296dd262 739 for (Int_t i=0; i<count; i++)
61899827 740 {
a2ce3799 741 AliTriggerAnalysis* triggerAnalysis = static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i));
742
296dd262 743 switch (runNumber)
744 {
a2ce3799 745 case 104315:
296dd262 746 case 104316:
747 case 104320:
a2ce3799 748 case 104321:
296dd262 749 case 104439:
750 triggerAnalysis->SetV0TimeOffset(7.5);
751 break;
a2ce3799 752 default:
753 triggerAnalysis->SetV0TimeOffset(0);
296dd262 754 }
f4ca8f20 755 }
756
758941d4 757 fCurrentRun = runNumber;
758
29e8486e 759 TH1::AddDirectory(oldStatus);
760
61899827 761 return kTRUE;
762}
763
85c71ba7 764TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
765
766 // add 6 rows to count for the estimate of good, accidentals and
767 // BG and the ratio of BG and accidentals to total +ratio goot to
768 // first col + 2 for error on good.
769
770 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
771#ifdef VERBOSE_STAT
772 Int_t extrarows = fComputeBG ? 8 : 0;
773#else
774 Int_t extrarows = fComputeBG ? 3 : 0;
775#endif
776 TH2F * h = new TH2F(Form("fHistStatistics%s",tag), Form("fHistStatistics - %s ;;",tag), kStatAccepted, 0.5, kStatAccepted+0.5, count+extrarows, -0.5, -0.5 + count+extrarows);
777
778 h->GetXaxis()->SetBinLabel(kStatTriggerClass, "Trigger class");
779 h->GetXaxis()->SetBinLabel(kStatHWTrig, "Hardware trigger");
780 h->GetXaxis()->SetBinLabel(kStatFO1, "FO >= 1");
781 h->GetXaxis()->SetBinLabel(kStatFO2, "FO >= 2");
782 h->GetXaxis()->SetBinLabel(kStatV0A, "V0A");
783 h->GetXaxis()->SetBinLabel(kStatV0C, "V0C");
784 h->GetXaxis()->SetBinLabel(kStatFMD, "FMD");
785 h->GetXaxis()->SetBinLabel(kStatSSD1, "SSD >= 2");
786 h->GetXaxis()->SetBinLabel(kStatV0ABG, "V0A BG");
787 h->GetXaxis()->SetBinLabel(kStatV0CBG, "V0C BG");
788 h->GetXaxis()->SetBinLabel(kStatMB1, "(FO >= 1 | V0A | V0C) & !V0 BG");
789 h->GetXaxis()->SetBinLabel(kStatMB1Prime, "(FO >= 2 | (FO >= 1 & (V0A | V0C)) | (V0A &v0C) ) & !V0 BG");
790 h->GetXaxis()->SetBinLabel(kStatFO1AndV0, "FO >= 1 & (V0A | V0C) & !V0 BG");
791 h->GetXaxis()->SetBinLabel(kStatV0, "V0A & V0C & !V0 BG & !BG ID");
792 h->GetXaxis()->SetBinLabel(kStatOffline, "Offline Trigger");
793 h->GetXaxis()->SetBinLabel(kStatAny2Hits, "2 Hits & !V0 BG");
794 h->GetXaxis()->SetBinLabel(kStatBG, "Background identification");
795 h->GetXaxis()->SetBinLabel(kStatAccepted, "Accepted");
796
797 Int_t n = 1;
798 for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
799 {
800 h->GetYaxis()->SetBinLabel(n, ((TObjString*) fCollTrigClasses.At(i))->String());
801 n++;
802 }
803 for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
804 {
805 h->GetYaxis()->SetBinLabel(n, ((TObjString*) fBGTrigClasses.At(i))->String());
806 n++;
807 }
808
809 if(fComputeBG) {
810 h->GetYaxis()->SetBinLabel(n++, "BG (A+C)");
811 h->GetYaxis()->SetBinLabel(n++, "ACC");
812#ifdef VERBOSE_STAT
813 h->GetYaxis()->SetBinLabel(n++, "BG (A+C) % (rel. to CINT1B)");
814 h->GetYaxis()->SetBinLabel(n++, "ACC % (rel. to CINT1B)");
815 h->GetYaxis()->SetBinLabel(n++, "ERR GOOD %");
816 h->GetYaxis()->SetBinLabel(n++, "GOOD % (rel. to 1st col)");
817 h->GetYaxis()->SetBinLabel(n++, "ERR GOOD");
818#endif
819 h->GetYaxis()->SetBinLabel(n++, "GOOD");
820 }
821
822 return h;
823}
824
61899827 825void AliPhysicsSelection::Print(Option_t* /* option */) const
826{
827 // print the configuration
828
a2ce3799 829 Printf("Configuration initialized for run %d (MC: %d):", fCurrentRun, fMC);
61899827 830
296dd262 831 Printf("Collision trigger classes:");
832 for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
833 Printf("%s", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
61899827 834
296dd262 835 Printf("Background trigger classes:");
836 for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
837 Printf("%s", ((TObjString*) fBGTrigClasses.At(i))->String().Data());
838
839 AliTriggerAnalysis* triggerAnalysis = dynamic_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(0));
61899827 840
296dd262 841 if (triggerAnalysis)
842 {
843 if (triggerAnalysis->GetV0TimeOffset() > 0)
844 Printf("V0 time offset active: %.2f ns", triggerAnalysis->GetV0TimeOffset());
61899827 845
296dd262 846 Printf("\nTotal available events:");
528640ed 847
296dd262 848 triggerAnalysis->PrintTriggerClasses();
849 }
528640ed 850
85c71ba7 851 if (fHistStatistics[kStatIdxAll] && fCollTrigClasses.GetEntries() > 0)
b43e01ed 852 {
cc9d9320 853 Printf("\nSelection statistics for first collision trigger (%s):", ((TObjString*) fCollTrigClasses.First())->String().Data());
b43e01ed 854
85c71ba7 855 Printf("Total events with correct trigger class: %d", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(1, 1));
856 Printf("Selected collision candidates: %d", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), 1));
17ba346c 857 }
858
859 if (fHistBunchCrossing)
860 {
861 Printf("\nBunch crossing statistics:");
862
863 for (Int_t i=1; i<=fHistBunchCrossing->GetNbinsY(); i++)
864 {
865 TString str;
866 str.Form("Trigger %s has accepted events in the bunch crossings: ", fHistBunchCrossing->GetYaxis()->GetBinLabel(i));
867
868 for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++)
869 if (fHistBunchCrossing->GetBinContent(j, i) > 0)
870 str += Form("%d, ", (Int_t) fHistBunchCrossing->GetXaxis()->GetBinCenter(j));
871
872 Printf("%s", str.Data());
873 }
874
875 for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++)
876 {
877 Int_t count = 0;
878 for (Int_t i=1; i<=fHistBunchCrossing->GetNbinsY(); i++)
879 {
880 if (fHistBunchCrossing->GetBinContent(j, i) > 0)
881 count++;
882 }
883 if (count > 1)
884 Printf("WARNING: Bunch crossing %d has more than one trigger class active. Check BPTX functioning for this run!", (Int_t) fHistBunchCrossing->GetXaxis()->GetBinCenter(j));
885 }
b43e01ed 886 }
91bea6e7 887
888 if (fUsingCustomClasses)
889 Printf("WARNING: Using custom trigger classes!");
890 if (fSkipTriggerClassSelection)
891 Printf("WARNING: Skipping trigger class selection!");
85c71ba7 892 if (fSkipV0)
893 Printf("WARNING: Ignoring V0 information in selection");
894 if(!fBin0CallBack)
895 Printf("WARNING: Callback not set: will not fill the statistics for the bin 0");
896
61899827 897}
898
899Long64_t AliPhysicsSelection::Merge(TCollection* list)
900{
901 // Merge a list of AliMultiplicityCorrection objects with this (needed for
902 // PROOF).
903 // Returns the number of merged objects (including this).
904
905 if (!list)
906 return 0;
907
908 if (list->IsEmpty())
909 return 1;
910
911 TIterator* iter = list->MakeIterator();
912 TObject* obj;
17ba346c 913
61899827 914 // collections of all histograms
915 const Int_t nHists = 9;
916 TList collections[nHists];
917
918 Int_t count = 0;
919 while ((obj = iter->Next())) {
920
921 AliPhysicsSelection* entry = dynamic_cast<AliPhysicsSelection*> (obj);
922 if (entry == 0)
923 continue;
17ba346c 924
925 collections[0].Add(&(entry->fTriggerAnalysis));
85c71ba7 926 if (entry->fHistStatistics[0])
927 collections[1].Add(entry->fHistStatistics[0]);
928 if (entry->fHistStatistics[1])
929 collections[2].Add(entry->fHistStatistics[1]);
17ba346c 930 if (entry->fHistBunchCrossing)
85c71ba7 931 collections[3].Add(entry->fHistBunchCrossing);
73cc8654 932 if (entry->fHistTriggerPattern)
933 collections[4].Add(entry->fHistTriggerPattern);
296dd262 934 if (entry->fBackgroundIdentification)
73cc8654 935 collections[5].Add(entry->fBackgroundIdentification);
61899827 936
937 count++;
938 }
939
17ba346c 940 fTriggerAnalysis.Merge(&collections[0]);
85c71ba7 941 if (fHistStatistics[0])
942 fHistStatistics[0]->Merge(&collections[1]);
943 if (fHistStatistics[1])
944 fHistStatistics[1]->Merge(&collections[2]);
17ba346c 945 if (fHistBunchCrossing)
85c71ba7 946 fHistBunchCrossing->Merge(&collections[3]);
73cc8654 947 if (fHistTriggerPattern)
948 fHistTriggerPattern->Merge(&collections[4]);
296dd262 949 if (fBackgroundIdentification)
73cc8654 950 fBackgroundIdentification->Merge(&collections[5]);
61899827 951
952 delete iter;
953
954 return count+1;
955}
956
957void AliPhysicsSelection::SaveHistograms(const char* folder) const
958{
959 // write histograms to current directory
960
85c71ba7 961 if (!fHistStatistics[0] || !fHistStatistics[1])
61899827 962 return;
963
964 if (folder)
965 {
966 gDirectory->mkdir(folder);
967 gDirectory->cd(folder);
968 }
969
85c71ba7 970
971 // Fill the last rows of fHistStatistics before saving
972 if (fComputeBG) {
973 Int_t triggerScheme = GetTriggerScheme(UInt_t(fCurrentRun));
974 if(triggerScheme != 1){
975 AliWarning("BG estimate only supported for trigger scheme \"1\" (CINT1 suite)");
73cc8654 976 } else if (fUseMuonTriggers) {
977 AliWarning("BG estimate with muon triggers to be implemented");
85c71ba7 978 } else {
979 Int_t nHistStat = 2;
980 // TODO: get number of rows in a more flexible way
981 // 1. loop over all cols
982
983 for(Int_t iHistStat = 0; iHistStat < nHistStat; iHistStat++){
984
985 Int_t ncol = fHistStatistics[iHistStat]->GetNbinsX();
986 Float_t good1 = 0;
987 for(Int_t icol = 1; icol <= ncol; icol++) {
988 Int_t cint1B = (Int_t) fHistStatistics[iHistStat]->GetBinContent(icol,1);
989 Int_t cint1A = (Int_t) fHistStatistics[iHistStat]->GetBinContent(icol,2);
990 Int_t cint1C = (Int_t) fHistStatistics[iHistStat]->GetBinContent(icol,3);
991 Int_t cint1E = (Int_t) fHistStatistics[iHistStat]->GetBinContent(icol,4);
992
993 if (cint1B>0) {
994 Int_t acc = fRatioBEEE*cint1E;
ca234d7a 995 Double_t acc_err = TMath::Sqrt(fRatioBEEE*fRatioBEEE*cint1E);
85c71ba7 996 // Int_t bg = cint1A + cint1C - 2*acc;
997 Float_t bg = fBIFactorA*(cint1A-acc) + fBIFactorC*(cint1C-acc) ;
998 Float_t good = Float_t(cint1B) - bg - acc;
999 if (icol ==1) good1 = good;
1000 // Float_t errGood = TMath::Sqrt(2*(cint1A+cint1C+cint1E));// Error on the number of goods assuming only bg fluctuates
1001 // DeltaG^2 = B + FA^2 A + FC^2 C + Ratio^2 (FA+FC-1)^2 E.
1002 Float_t errGood = TMath::Sqrt( cint1B +
1003 fBIFactorA*fBIFactorA*cint1A +
1004 fBIFactorC*fBIFactorC*cint1C +
1005 fRatioBEEE * fRatioBEEE *
1006 (fBIFactorA + fBIFactorC - 1)*(fBIFactorA + fBIFactorC - 1)*cint1E);
1007 Float_t errBG = TMath::Sqrt(fBIFactorA*fBIFactorA*cint1A+
1008 fBIFactorC*fBIFactorC*cint1C+
1009 fRatioBEEE*fRatioBEEE*(fBIFactorA+fBIFactorC)*(fBIFactorA+fBIFactorC)*cint1E);
1010
1011
1012 fHistStatistics[iHistStat]->SetBinContent(icol,kStatRowBG,bg);
1013 fHistStatistics[iHistStat]->SetBinError (icol,kStatRowBG,errBG);
1014 fHistStatistics[iHistStat]->SetBinContent(icol,kStatRowAcc,acc);
ca234d7a 1015 fHistStatistics[iHistStat]->SetBinError (icol,kStatRowAcc,acc_err);
85c71ba7 1016 fHistStatistics[iHistStat]->SetBinContent(icol,kStatRowGood,good);
1017 fHistStatistics[iHistStat]->SetBinError (icol,kStatRowGood,errGood);
1018
1019#ifdef VERBOSE_STAT
ca234d7a 1020 //kStatRowBG=5,kStatRowAcc,kStatRowBGFrac,kStatRowAccFrac,kStatRowErrGoodFrac,kStatRowGoodFrac,kStatRowGood,kStatRowErrGood
85c71ba7 1021 Float_t accFrac = Float_t(acc) / cint1B *100;
ca234d7a 1022 Float_t errAccFrac= Float_t(acc_err) / cint1B *100;
85c71ba7 1023 Float_t bgFrac = Float_t(bg) / cint1B *100;
1024 Float_t goodFrac = Float_t(good) / good1 *100;
1025 Float_t errGoodFrac = errGood/good1 * 100;
73cc8654 1026 Float_t errFracBG = bg > 0 ? TMath::Sqrt((errBG/bg)*(errBG/bg) + 1/cint1B)*bgFrac : 0;
85c71ba7 1027 fHistStatistics[iHistStat]->SetBinContent(icol,kStatRowBGFrac,bgFrac);
1028 fHistStatistics[iHistStat]->SetBinError (icol,kStatRowBGFrac,errFracBG);
1029 fHistStatistics[iHistStat]->SetBinContent(icol,kStatRowAccFrac,accFrac);
ca234d7a 1030 fHistStatistics[iHistStat]->SetBinError (icol,kStatRowAccFrac,errAccFrac);
85c71ba7 1031 fHistStatistics[iHistStat]->SetBinContent(icol,kStatRowGoodFrac,goodFrac);
ca234d7a 1032 fHistStatistics[iHistStat]->SetBinContent(icol,kStatRowErrGoodFrac,errGoodFrac);
85c71ba7 1033 fHistStatistics[iHistStat]->SetBinContent(icol,kStatRowErrGood,errGood);
1034#endif
1035 }
1036 }
1037 }
1038 }
1039 }
1040
1041 fHistStatistics[0]->Write();
1042 fHistStatistics[1]->Write();
8e58a7b9 1043 if(fHistBunchCrossing ) fHistBunchCrossing ->Write();
1044 if(fHistTriggerPattern) fHistTriggerPattern->Write();
61899827 1045
296dd262 1046 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
1047 for (Int_t i=0; i < count; i++)
1048 {
1049 TString triggerClass = "trigger_histograms_";
1050 if (i < fCollTrigClasses.GetEntries())
1051 triggerClass += ((TObjString*) fCollTrigClasses.At(i))->String();
1052 else
1053 triggerClass += ((TObjString*) fBGTrigClasses.At(i - fCollTrigClasses.GetEntries()))->String();
61899827 1054
296dd262 1055 gDirectory->mkdir(triggerClass);
1056 gDirectory->cd(triggerClass);
61899827 1057
296dd262 1058 static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i))->SaveHistograms();
1059
1060 gDirectory->cd("..");
1061 }
1062
1063 if (fBackgroundIdentification)
1064 {
1065 gDirectory->mkdir("background_identification");
1066 gDirectory->cd("background_identification");
1067
1068 fBackgroundIdentification->GetOutput()->Write();
1069
1070 gDirectory->cd("..");
1071 }
61899827 1072
1073 if (folder)
1074 gDirectory->cd("..");
1075}
85c71ba7 1076
1077void AliPhysicsSelection::SetBIFactors(Int_t run) {
1078
1079 switch(run) {
1080 case 104155:
1081 fBIFactorA = 0.961912722908;
1082 fBIFactorC = 1.04992336081;
1083 break;
1084 case 104157:
1085 fBIFactorA = 0.947312854998;
1086 fBIFactorC = 1.01599706417;
1087 break;
1088 case 104159:
1089 fBIFactorA = 0.93659320151;
1090 fBIFactorC = 0.98580804207;
1091 break;
1092 case 104160:
1093 fBIFactorA = 0.929664189926;
1094 fBIFactorC = 0.963467679851;
1095 break;
1096 case 104315:
1097 fBIFactorA = 1.08939104979;
1098 fBIFactorC = 0.931113921925;
1099 break;
1100 case 104316:
1101 fBIFactorA = 1.08351880974;
1102 fBIFactorC = 0.916068345845;
1103 break;
1104 case 104320:
1105 fBIFactorA = 1.07669281245;
1106 fBIFactorC = 0.876818744763;
1107 break;
1108 case 104321:
1109 fBIFactorA = 1.00971079602;
1110 fBIFactorC = 0.773781299076;
1111 break;
1112 case 104792:
1113 fBIFactorA = 0.787215863962;
1114 fBIFactorC = 0.778253173071;
1115 break;
1116 case 104793:
1117 fBIFactorA = 0.692211363661;
1118 fBIFactorC = 0.733152456667;
1119 break;
1120 case 104799:
1121 fBIFactorA = 1.04027825161;
1122 fBIFactorC = 1.00530825942;
1123 break;
1124 case 104800:
1125 fBIFactorA = 1.05309910671;
1126 fBIFactorC = 1.00376801855;
1127 break;
1128 case 104801:
1129 fBIFactorA = 1.0531231922;
1130 fBIFactorC = 0.992439666758;
1131 break;
1132 case 104802:
1133 fBIFactorA = 1.04191478134;
1134 fBIFactorC = 0.979368585208;
1135 break;
1136 case 104803:
1137 fBIFactorA = 1.03121314094;
1138 fBIFactorC = 0.973379962609;
1139 break;
1140 case 104824:
1141 fBIFactorA = 0.969945926722;
1142 fBIFactorC = 0.39549745806;
1143 break;
1144 case 104825:
1145 fBIFactorA = 0.968627213937;
1146 fBIFactorC = 0.310100412205;
1147 break;
1148 case 104841:
1149 fBIFactorA = 0.991601393212;
1150 fBIFactorC = 0.83762204722;
1151 break;
1152 case 104845:
1153 fBIFactorA = 0.98040863886;
1154 fBIFactorC = 0.694824205793;
1155 break;
1156 case 104867:
1157 fBIFactorA = 1.10646173412;
1158 fBIFactorC = 0.841407246916;
1159 break;
1160 case 104876:
1161 fBIFactorA = 1.12063452421;
1162 fBIFactorC = 0.78726542895;
1163 break;
1164 case 104890:
1165 fBIFactorA = 1.02346137453;
1166 fBIFactorC = 1.03355663595;
1167 break;
1168 case 104892:
1169 fBIFactorA = 1.05406025913;
1170 fBIFactorC = 1.00029166135;
1171 break;
1172 case 105143:
1173 fBIFactorA = 0.947343384349;
1174 fBIFactorC = 0.972637444408;
1175 break;
1176 case 105160:
1177 fBIFactorA = 0.908854622177;
1178 fBIFactorC = 0.958851103977;
1179 break;
1180 case 105256:
1181 fBIFactorA = 0.810076150206;
1182 fBIFactorC = 0.884663561883;
1183 break;
1184 case 105257:
1185 fBIFactorA = 0.80974912303;
1186 fBIFactorC = 0.878859123479;
1187 break;
1188 case 105268:
1189 fBIFactorA = 0.809052110679;
1190 fBIFactorC = 0.87233890989;
1191 break;
1192 default:
1193 fBIFactorA = 1;
1194 fBIFactorC = 1;
1195 }
1196
1197
1198}