1 #ifndef ALIANALYSISTASKQUALITYASSURANCEPA_H
2 #define ALIANALYSISTASKQUALITYASSURANCEPA_H
13 class AliRhoParameter;
16 class AliAnalysisUtils;
18 #ifndef ALIANALYSISTASKSE_H
19 #include <Riostream.h>
32 #include <TClonesArray.h>
36 #include <TInterpreter.h>
38 #include "AliAnalysisTask.h"
39 #include "AliCentrality.h"
41 #include "AliESDEvent.h"
42 #include "AliESDInputHandler.h"
43 #include "AliAODEvent.h"
44 #include "AliAODHandler.h"
45 #include "AliAnalysisManager.h"
46 #include "AliAnalysisTaskSE.h"
50 #include "AliGenPythiaEventHeader.h"
51 #include "AliMCEvent.h"
53 #include <AliEmcalJet.h>
54 #include <AliRhoParameter.h>
55 #include "AliVEventHandler.h"
56 #include "AliVParticle.h"
57 #include "AliAnalysisUtils.h"
60 class AliAnalysisTaskQualityAssurancePA : public AliAnalysisTaskSE {
63 AliAnalysisTaskQualityAssurancePA() : AliAnalysisTaskSE(), fOutputList(0), fAnalyzeQA(1), fAnalyzeJets(1), fAnalyzePythia(0), fHasTracks(0), fHasClusters(0), fHasJets(0), fIsMC(0), fJetArray(0), fTrackArray(0), fClusterArray(0), fJetArrayName(0), fTrackArrayName(0), fClusterArrayName(0), fRunNumbers(0), fNumPtHardBins(11), fSignalJetRadius(0.4), fNumberExcludedJets(2), fSignalJetEtaWindow(0.5), fTrackEtaWindow(0.9), fClusterEtaWindow(0.7), fVertexWindow(10.0), fVertexMaxR(1.0), fMinTrackPt(0.150), fMinClusterPt(0.300), fMinJetPt(1.0), fMinJetArea(0.4), fFirstLeadingJet(0), fSecondLeadingJet(0), fNumberSignalJets(0), fCrossSection(0.0), fTrials(0.0), fRandom(0), fHelperClass(0), fInitialized(0), fTaskInstanceCounter(0), fHistList(0), fHistCount(0) {}
65 AliAnalysisTaskQualityAssurancePA(const char *name, const char* trackArrayName, const char* clusterArrayName, const char* jetArrayName);
68 virtual ~AliAnalysisTaskQualityAssurancePA();
69 virtual void UserCreateOutputObjects();
70 virtual void UserExec(Option_t *option);
71 virtual void Terminate(Option_t *);
74 void SetAnalyzeTracks(Bool_t val) {fAnalyzeQA = val;}
75 void SetAnalyzeJets(Bool_t val) {fAnalyzeJets = val;}
76 void SetAnalyzePythia(Bool_t val) {fAnalyzePythia = val;}
78 void SetTrackMinPt(Double_t minPt) {fMinJetPt = minPt;}
79 void SetSignalJetMinPt(Double_t minPt) {fMinJetPt = minPt;}
80 void SetSignalJetMinArea(Double_t minArea) {fMinJetArea = minArea;}
81 void SetRunNumbers(const char* runNumbers) {*fRunNumbers = runNumbers;}
82 void SetNumberOfPtHardBins(Int_t count) {fNumPtHardBins = count;}
84 void SetSignalJetRadius(Double_t radius) {fSignalJetRadius = radius;}
85 void SetAcceptanceWindows(Double_t trackEta, Double_t vertexZ, Double_t vertexMaxR, Double_t signalJetRadius)
87 fVertexWindow = vertexZ;
88 fVertexMaxR = vertexMaxR;
89 fTrackEtaWindow = trackEta;
90 fSignalJetRadius = signalJetRadius;
91 fSignalJetEtaWindow = fTrackEtaWindow-fSignalJetRadius;
95 Int_t GetInstanceCounter() {return fTaskInstanceCounter;}
98 // Calculation functions
100 Int_t GetLeadingJets(TClonesArray* jetArray, Int_t* jetIDArray);
101 Double_t GetPtHard();
102 Int_t GetPtHardBin();
105 Bool_t IsTrackInAcceptance(AliVParticle* track);
106 Bool_t IsClusterInAcceptance(AliVCluster* cluster);
107 Bool_t IsSignalJetInAcceptance(AliEmcalJet* jet);
110 Double_t EtaToTheta(Double_t arg){return 2.*atan(exp(-arg));}
111 Double_t ThetaToEta(Double_t arg)
113 if ((arg > TMath::Pi()) || (arg < 0.0))
115 AliError(Form("ThetaToEta got wrong input! (%f)", arg));
118 return -log(tan(arg/2.));
120 Double_t GetDeltaPhi(Double_t phi1, Double_t phi2) {return min(TMath::Abs(phi1-phi2),TMath::TwoPi()- TMath::Abs(phi1-phi2));}
122 // #### This functions return the ratio of a rectangle that is covered by a circle
123 Double_t MCGetOverlapCircleRectancle(Double_t cPosX, Double_t cPosY, Double_t cRadius, Double_t rPosXmin, Double_t rPosXmax, Double_t rPosYmin, Double_t rPosYmax)
125 const Int_t kTests = 1000;
127 TRandom3 randomGen(0);
129 // Loop over kTests-many tests
130 for (Int_t i=0; i<kTests; i++)
132 //Choose random position in rectangle for the tester
133 Double_t tmpTestX = randomGen.Uniform(rPosXmin, rPosXmax);
134 Double_t tmpTestY = randomGen.Uniform(rPosYmin, rPosYmax);
136 //Check, if tester is in circle. If yes, increment circle counter.
137 Double_t tmpDistance = TMath::Sqrt( (tmpTestX - cPosX)*(tmpTestX - cPosX) + (tmpTestY - cPosY)*(tmpTestY - cPosY) );
138 if(tmpDistance < cRadius)
143 return (static_cast<Double_t>(hits)/static_cast<Double_t>(kTests));
146 void FillHistogram(const char* runNumber, const char * key, Double_t x);
147 void FillHistogram(const char* runNumber, const char * key, Double_t x, Double_t y);
148 void FillHistogram(const char* runNumber, const char * key, Double_t x, Double_t y, Double_t add);
149 const char* GetHistoName(const char* runNumber, const char* name)
152 return Form("H%d_%s_%s_MC", fTaskInstanceCounter, name, runNumber);
154 return Form("H%d_%s_%s", fTaskInstanceCounter, name, runNumber);
157 template <class T> T* AddHistogram1D(const char* runNumber, const char* name = "CustomHistogram", const char* title = "NO_TITLE", const char* options = "", Int_t xBins = 100, Double_t xMin = 0.0, Double_t xMax = 20.0, const char* xTitle = "x axis", const char* yTitle = "y axis");
159 template <class T> T* AddHistogram2D(const char* runNumber, const char* name = "CustomHistogram", const char* title = "NO_TITLE", const char* options = "", Int_t xBins = 100, Double_t xMin = 0.0, Double_t xMax = 20.0, Int_t yBins = 100, Double_t yMin = 0.0, Double_t yMax = 20.0, const char* xTitle = "x axis", const char* yTitle = "y axis", const char* zTitle = "z axis");
163 // Standard functions
165 void Calculate(AliVEvent* event);
169 TList* fOutputList; //! Output list
170 // ########## TRIGGERS
171 Bool_t fAnalyzeQA; // trigger if tracks should be analyzed
172 Bool_t fAnalyzeJets; // trigger if jets should be processed
173 Bool_t fAnalyzePythia; // trigger if pythia properties should be processed
174 Bool_t fHasTracks; // trigger if tracks are actually valid
175 Bool_t fHasClusters; // trigger if clusters are actually valid
176 Bool_t fHasJets; // trigger if jets are actually valid
177 Bool_t fIsMC; // trigger if data is MC (for naming reasons)
178 // ########## SOURCE INFORMATION
179 TClonesArray* fJetArray; //! object containing the jets
180 TClonesArray* fTrackArray; //! object containing the tracks
181 TClonesArray* fClusterArray; //! object containing the clusters
182 TString* fJetArrayName; // name of object containing the jets
183 TString* fTrackArrayName; // name of object containing the tracks
184 TString* fClusterArrayName; // name of object containing the tracks
185 TString* fRunNumbers; // analyzed run numbers
186 Int_t fNumPtHardBins; // Number of used pt hard bins
188 // ########## JET/DIJET/RC PROPERTIES
189 Double_t fSignalJetRadius; // Radius for the signal jets
190 Int_t fNumberExcludedJets; // Number of jets to be excluded
193 Double_t fSignalJetEtaWindow; // +- window in eta for signal jets
194 Double_t fTrackEtaWindow; // +- window in eta for tracks
195 Double_t fClusterEtaWindow; // +- window in eta for clusters
196 Double_t fVertexWindow; // +- window in Z for the vertex
197 Double_t fVertexMaxR; // +- window in R for the vertex (distance in xy-plane)
198 Double_t fMinTrackPt; // Min track pt to be accepted
199 Double_t fMinClusterPt; // Min track pt to be accepted
200 Double_t fMinJetPt; // Min jet pt to be accepted
201 Double_t fMinJetArea; // Min jet area to be accepted
203 // ########## EVENT PROPERTIES
204 AliEmcalJet* fFirstLeadingJet; //! leading jet in event
205 AliEmcalJet* fSecondLeadingJet; //! next to leading jet in event
206 Int_t fNumberSignalJets; //! Number of signal jets in event
207 AliEmcalJet* fSignalJets[1024]; //! memory for signal jet pointers
208 Double_t fCrossSection; //! value is filled, if pythia header is accessible
209 Double_t fTrials; //! value is filled, if pythia header is accessible
211 // ########## GENERAL VARS
212 TRandom3* fRandom; //! A random number
213 AliAnalysisUtils* fHelperClass; //! Vertex selection helper
214 Bool_t fInitialized; //! trigger if tracks/jets are loaded
215 Int_t fTaskInstanceCounter; // for naming reasons
216 TList* fHistList; // Histogram list
217 Int_t fHistCount; // Histogram count
219 AliAnalysisTaskQualityAssurancePA(const AliAnalysisTaskQualityAssurancePA&); // not implemented
220 AliAnalysisTaskQualityAssurancePA& operator=(const AliAnalysisTaskQualityAssurancePA&); // not implemented
222 ClassDef(AliAnalysisTaskQualityAssurancePA, 1); // QA helper task for pA