1 /**************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //*************************************************************************
20 // Class for monitoring of information used for open charm normalization
21 // (triggers, candles, ...)
23 // Origin: davide.caffarri@pd.infn.it
25 //*************************************************************************
30 #include <TObjArray.h>
35 #include "AliAnalysisTask.h"
36 #include "AliAnalysisManager.h"
37 #include "AliESDEvent.h"
38 #include "AliESDInputHandler.h"
39 #include "AliTriggerAnalysis.h"
41 #include "AliCounterCollection.h"
42 #include "AliAnalysisTaskSEMonitNorm.h"
44 ClassImp(AliAnalysisTaskSEMonitNorm)
46 //________________________________________________________________________
47 AliAnalysisTaskSEMonitNorm::AliAnalysisTaskSEMonitNorm(const char *name):
48 AliAnalysisTaskSE(name),
53 fCounterCandleTrig(0),
54 fCounterCandleNotTrig(0)
59 // Define input and output slots here
60 // Output slot #0 writes into a TList container
61 DefineOutput(1, TList::Class()); //My private output
62 DefineOutput(2, AliCounterCollection::Class());
63 DefineOutput(3, AliCounterCollection::Class());
64 DefineOutput(4, AliCounterCollection::Class());
65 DefineOutput(5, AliCounterCollection::Class());
68 //________________________________________________________________________
69 AliAnalysisTaskSEMonitNorm::~AliAnalysisTaskSEMonitNorm()
73 // histograms are in the output list and deleted when the output
74 // list is deleted by the TSelector dtor
86 if (fCounterNotTrigg) {
87 delete fCounterNotTrigg;
91 if (fCounterCandleTrig) {
92 delete fCounterCandleTrig;
93 fCounterCandleTrig = 0;
96 if (fCounterCandleNotTrig) {
97 delete fCounterCandleNotTrig;
98 fCounterCandleNotTrig = 0;
106 //________________________________________________________________________
107 void AliAnalysisTaskSEMonitNorm::UserCreateOutputObjects()
112 // Several histograms are more conveniently managed in a TList
117 //Counter for Normalization new line
118 fCounterTrigg = new AliCounterCollection("Triggered_Counter");//new line
119 fCounterTrigg->AddRubric("Event", "triggered/v0andONLINE/v0andOFFLINE/v0andOFF&ON/v0andON_notOFF/v0andOFF_notON/v0orOFF/V0orON");//new line
120 fCounterTrigg->AddRubric("Run", 10000000);//new line
121 fCounterTrigg->Init();//new line
123 fCounterNotTrigg = new AliCounterCollection("NotTriggered_Counter");//new line
124 fCounterNotTrigg->AddRubric("Event", "!triggered/v0andONLINE/v0andOFFLINE/v0andOFF&ON/v0andON_notOFF/v0andOFF_notON/v0orOFF/v0orON");//new line
125 fCounterNotTrigg->AddRubric("Run", 10000000);//new line
126 fCounterNotTrigg->Init();//new line
128 fCounterCandleTrig = new AliCounterCollection("Candle_Triggered_Counter");//new line
129 fCounterCandleTrig->AddRubric("Event", "triggered/candles02/2xcandles02/primVtx/TPConly");//new line
130 fCounterCandleTrig->AddRubric("Run", 10000000);//new line
131 fCounterCandleTrig->Init();//new line
134 fCounterCandleNotTrig = new AliCounterCollection("Candle_NotTriggered_Counter");//new line
135 fCounterCandleNotTrig->AddRubric("Event", "!triggered/candles02/2xcandles02/primVtx/TPConly");//new line
136 fCounterCandleNotTrig->AddRubric("Run", 10000000);//new line
137 fCounterCandleNotTrig->Init();//new line
140 PostData(1, fOutput);
141 PostData(2, fCounterTrigg);
142 PostData(3, fCounterNotTrigg);
143 PostData(4, fCounterCandleTrig);
144 PostData(5, fCounterCandleNotTrig);
148 //________________________________________________________________________
149 void AliAnalysisTaskSEMonitNorm::UserExec(Option_t *)
152 // Called for each event
155 Printf("ERROR: fESD not available");
158 AliESDEvent* esdE = (AliESDEvent*) InputEvent();
160 Printf("ERROR: fESD not available");
164 // Select PHYSICS events (type=7, for data) and MC events (type=0)
165 // fCheckEventType is kFALSE if fReadMC is kTRUE, hence check is skipped
166 if(esdE->GetEventType()!=7 ) return;
168 Int_t runNumber = (Int_t)esdE->GetRunNumber();
170 //static AliTriggerAnalysis* triggerAnalysis = new AliTriggerAnalysis();
171 Bool_t eventTriggered = 0;
173 Bool_t flag02 = kFALSE;
174 Bool_t flagPVT = kFALSE;
175 Bool_t flagTPCOnly70 = kFALSE;
177 // use response of AliPhysicsSelection
178 eventTriggered = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
181 AliTriggerAnalysis *trigAnalys = new AliTriggerAnalysis();
184 Bool_t v0andOFF = kFALSE;
185 Bool_t v0orOFF = kFALSE;
187 v0C = trigAnalys->IsOfflineTriggerFired(esdE , AliTriggerAnalysis::kV0C);
188 v0A = trigAnalys->IsOfflineTriggerFired(esdE , AliTriggerAnalysis::kV0A);
189 if(v0A&&v0C)v0andOFF=kTRUE;
190 if (v0A||v0C)v0orOFF=kTRUE;
193 Int_t v0Con = trigAnalys->V0Trigger(esdE, AliTriggerAnalysis::kCSide, kTRUE, kFALSE);
194 Int_t v0Aon = trigAnalys->V0Trigger(esdE, AliTriggerAnalysis::kASide, kTRUE, kFALSE);
196 Bool_t v0andON=kFALSE;
197 if((v0Aon==AliTriggerAnalysis::kV0BB)&&(v0Con==AliTriggerAnalysis::kV0BB))v0andON=kTRUE;
199 Bool_t v0orON =((v0Aon==AliTriggerAnalysis::kV0BB)||(v0Con==AliTriggerAnalysis::kV0BB));
201 Int_t trkEntries = (Int_t)esdE->GetNumberOfTracks();
203 for(Int_t i=0;i<trkEntries;i++){
204 AliESDtrack *track=(AliESDtrack*)esdE->GetTrack(i);
205 UShort_t nClusTPC=track->GetTPCNcls();
208 if((track->GetStatus()&AliESDtrack::kTPCin)&&TMath::Abs(track->Eta()<0.9)&&nClusTPC>=70){
215 if((nClusTPC>=70)&&(track->GetStatus()&AliESDtrack::kITSrefit)&&(track->GetStatus()&AliESDtrack::kTPCrefit)){
216 if((track->Pt()>0.2)){
217 if(!flag02) flag02=kTRUE;
224 const AliESDVertex *vtrc1 = esdE->GetPrimaryVertex();
225 if(vtrc1 && vtrc1->GetNContributors()>0) flagPVT=kTRUE;
230 fCounterTrigg->Count(Form("Event:triggered/Run:%d", runNumber));
231 if (v0andON) fCounterTrigg->Count(Form("Event:v0andONLINE/Run:%d", runNumber));
232 if (v0andOFF) fCounterTrigg->Count(Form("Event:v0andOFFLINE/Run:%d", runNumber));
233 if (v0andON&&v0andOFF) fCounterTrigg->Count(Form("Event:v0andOFF&ON/Run:%d", runNumber));
234 if (v0andON&&!v0andOFF) fCounterTrigg->Count(Form("Event:v0andON_notOFF/Run:%d", runNumber));
235 if (!v0andON&&v0andOFF) fCounterTrigg->Count(Form("Event:v0andOFF_notON/Run:%d", runNumber));
236 if (v0orON) fCounterTrigg->Count(Form("Event:v0orON/Run:%d", runNumber));
237 if (v0orOFF) fCounterTrigg->Count(Form("Event:v0orOFF/Run:%d", runNumber));
239 fCounterCandleTrig->Count(Form("Event:triggered/Run:%d", runNumber));
240 if (flagTPCOnly70) fCounterCandleTrig->Count(Form("Event:TPConly/Run:%d", runNumber));
241 if (flag02) fCounterCandleTrig->Count(Form("Event:candles02/Run:%d", runNumber));
242 if (flagPVT) fCounterCandleTrig->Count(Form("Event:primVtx/Run:%d", runNumber));
246 fCounterNotTrigg->Count(Form("Event:!triggered/Run:%d", runNumber));
247 if (v0andON) fCounterNotTrigg->Count(Form("Event:v0andONLINE/Run:%d", runNumber));
248 if (v0andOFF) fCounterNotTrigg->Count(Form("Event:v0andOFFLINE/Run:%d", runNumber));
249 if (v0andON&&v0andOFF) fCounterNotTrigg->Count(Form("Event:v0andOFF&ON/Run:%d", runNumber));
250 if (v0andON&&!v0andOFF) fCounterNotTrigg->Count(Form("Event:v0andON_notOFF/Run:%d", runNumber));
251 if (!v0andON&&v0andOFF) fCounterNotTrigg->Count(Form("Event:v0andOFF_notON/Run:%d", runNumber));
252 if (v0orON) fCounterNotTrigg->Count(Form("Event:v0orON/Run:%d", runNumber));
253 if (v0orOFF) fCounterNotTrigg->Count(Form("Event:v0orOFF/Run:%d", runNumber));
255 fCounterCandleNotTrig->Count(Form("Event:!triggered/Run:%d", runNumber));
256 if (flagTPCOnly70) fCounterCandleNotTrig->Count(Form("Event:TPConly/Run:%d", runNumber));
257 if (flag02) fCounterCandleNotTrig->Count(Form("Event:candles02/Run:%d", runNumber));
258 if (flagPVT) fCounterCandleNotTrig->Count(Form("Event:primVtx/Run:%d", runNumber));
264 // Post the data already here
265 PostData(1, fOutput);
266 PostData(2, fCounterTrigg);
267 PostData(3, fCounterNotTrigg);
268 PostData(4, fCounterCandleTrig);
269 PostData(5, fCounterCandleNotTrig);
274 //________________________________________________________________________
275 void AliAnalysisTaskSEMonitNorm::Terminate(Option_t *)
277 // Draw result to the screen
278 // Called once at the end of the query
279 fOutput = dynamic_cast<TList*> (GetOutputData(1));
281 Printf("ERROR: fOutput not available");
285 fCounterTrigg = dynamic_cast<AliCounterCollection*> (GetOutputData(2));
286 if (!fCounterTrigg) {
287 Printf("ERROR: fCounterTrigg not available");
291 fCounterNotTrigg = dynamic_cast<AliCounterCollection*> (GetOutputData(3));
292 if (!fCounterNotTrigg) {
293 Printf("ERROR: fCounterNotTrigg not available");
297 fCounterCandleTrig = dynamic_cast<AliCounterCollection*> (GetOutputData(4));
298 if (!fCounterCandleTrig) {
299 Printf("ERROR: fCounterCandleTrig not available");
303 fCounterCandleNotTrig = dynamic_cast<AliCounterCollection*> (GetOutputData(5));
304 if (!fCounterCandleNotTrig) {
305 Printf("ERROR: fCounterCandleNotTrig not available");
312 //_________________________________________________________________________