1 #ifndef ALIANALYSISTASKSE_H
15 #include <TClonesArray.h>
19 #include <TInterpreter.h>
21 #include "AliAnalysisTask.h"
22 #include "AliCentrality.h"
24 #include "AliESDEvent.h"
25 #include "AliESDInputHandler.h"
26 #include "AliAODEvent.h"
27 #include "AliAODHandler.h"
28 #include "AliAnalysisManager.h"
29 #include "AliAnalysisTaskSE.h"
33 #include "AliGenPythiaEventHeader.h"
34 #include "AliMCEvent.h"
36 #include <AliEmcalJet.h>
37 #include <AliRhoParameter.h>
38 #include "AliVEventHandler.h"
39 #include "AliVParticle.h"
40 #include "AliAnalysisUtils.h"
42 #include "AliAnalysisTaskQualityAssurancePA.h"
45 //TODO: FillHistogram can be done better with virtual TH1(?)
46 ClassImp(AliAnalysisTaskQualityAssurancePA)
48 // ######################################################################################## DEFINE HISTOGRAMS
49 void AliAnalysisTaskQualityAssurancePA::Init()
52 AliInfo("Creating histograms.");
54 *fRunNumbers = *fRunNumbers + " ALL";
56 TObjArray* runNumberArr = fRunNumbers->Tokenize(" ");
58 for(Int_t i=0; i<runNumberArr->GetEntries();i++)
60 const char* tmpRunNum = (static_cast<TObjString*>(runNumberArr->At(i)))->String().Data();
62 // NOTE: Track & Cluster & QA histograms
65 AddHistogram1D<TH1D>(tmpRunNum, "hNumberEvents", "Number of events (0 = before, 1 = after vertex cuts)", "", 2, 0, 2, "#Delta z(cm)","N^{Events}/cut");
66 AddHistogram1D<TH1D>(tmpRunNum, "hVertexX", "X distribution of the vertex", "", 10000, -1., 1., "#Delta x(cm)","dN^{Events}/dx");
67 AddHistogram1D<TH1D>(tmpRunNum, "hVertexY", "Y distribution of the vertex", "", 10000, -1., 1., "#Delta y(cm)","dN^{Events}/dy");
68 AddHistogram2D<TH2D>(tmpRunNum, "hVertexXY", "XY distribution of the vertex", "COLZ", 1000, -1., 1., 1000, -1., 1.,"#Delta x(cm)", "#Delta y(cm)","dN^{Events}/dxdy");
69 AddHistogram1D<TH1D>(tmpRunNum, "hVertexZ", "Z distribution of the vertex", "", 400, -40., 40., "#Delta z(cm)","dN^{Events}/dz");
70 AddHistogram1D<TH1D>(tmpRunNum, "hVertexR", "R distribution of the vertex", "", 100, 0., 1., "#Delta r(cm)","dN^{Events}/dr");
71 AddHistogram1D<TH1D>(tmpRunNum, "hCentralityV0M", "Centrality distribution V0M", "", 100, 0., 100., "Centrality","dN^{Events}");
72 AddHistogram1D<TH1D>(tmpRunNum, "hCentralityV0A", "Centrality distribution V0A", "", 100, 0., 100., "Centrality","dN^{Events}");
73 AddHistogram1D<TH1D>(tmpRunNum, "hCentralityV0C", "Centrality distribution V0C", "", 100, 0., 100., "Centrality","dN^{Events}");
75 AddHistogram2D<TH2D>(tmpRunNum, "hTrackCountAcc", "Number of tracks in acceptance vs. centrality", "LEGO2", 750, 0., 750., 100, 0, 100, "N tracks","Centrality", "dN^{Events}/dN^{Tracks}");
76 AddHistogram1D<TH1D>(tmpRunNum, "hTrackPt", "Tracks p_{T} distribution", "", 20000, 0., 400., "p_{T} (GeV/c)","dN^{Tracks}/dp_{T}");
77 AddHistogram1D<TH1D>(tmpRunNum, "hTrackPtNegEta", "Tracks p_{T} distribution (negative #eta)", "", 2000, 0., 400., "p_{T} (GeV/c)","dN^{Tracks}/dp_{T}");
78 AddHistogram1D<TH1D>(tmpRunNum, "hTrackPtPosEta", "Tracks p_{T} distribution (positive #eta)", "", 2000, 0., 400., "p_{T} (GeV/c)","dN^{Tracks}/dp_{T}");
79 AddHistogram1D<TH1D>(tmpRunNum, "hTrackCharge", "Charge", "", 11, -5, 5, "Charge (e)","dN^{Tracks}/dq");
80 AddHistogram1D<TH1D>(tmpRunNum, "hTrackPhi", "Track #phi distribution", "", 360, 0, TMath::TwoPi(), "#phi","dN^{Tracks}/d#phi");
81 AddHistogram2D<TH2D>(tmpRunNum, "hTrackPhiEta", "Track angular distribution", "LEGO2", 100, 0., 2*TMath::Pi(),100, -2.5, 2.5, "#phi","#eta","dN^{Tracks}/(d#phi d#eta)");
83 AddHistogram2D<TH2D>(tmpRunNum, "hTrackPhiPtCut", "Track #phi distribution for different pT cuts", "LEGO2", 360, 0, TMath::TwoPi(), 20, 0, 20, "#phi", "p_{T} lower cut", "dN^{Tracks}/d#phi dp_{T}");
84 AddHistogram2D<TH2D>(tmpRunNum, "hTrackPhiLabel", "Track #phi distribution in different labels", "LEGO2", 360, 0, TMath::TwoPi(), 3, 0, 3, "#phi", "Label", "dN^{Tracks}/d#phi");
85 AddHistogram1D<TH1D>(tmpRunNum, "hTrackEta", "Track #eta distribution", "", 180, -fTrackEtaWindow, +fTrackEtaWindow, "#eta","dN^{Tracks}/d#eta");
88 // NOTE: Pythia histograms
91 AddHistogram1D<TH1D>(tmpRunNum, "hPythiaPtHard", "Pythia p_{T} hard distribution", "", 2000, 0, 400, "p_{T} hard","dN^{Events}/dp_{T,hard}");
92 AddHistogram1D<TProfile>(tmpRunNum, "hPythiaXSection", "Pythia cross section distribution", "", fNumPtHardBins, 0, fNumPtHardBins, "p_{T} hard bin","dN^{Events}/dp_{T,hard}");
93 AddHistogram1D<TH1D>(tmpRunNum, "hPythiaNTrials", "Pythia trials (no correction for manual cuts)", "", fNumPtHardBins, 0, fNumPtHardBins, "p_{T} hard bin", "Trials");
96 // NOTE: Jet histograms
99 // ######## Jet spectra
100 AddHistogram1D<TH1D>(tmpRunNum, "hJetPt", "Jets p_{T} distribution", "", 1000, 0., 200., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
101 AddHistogram1D<TH1D>(tmpRunNum, "hJetArea", "Jets area distribution", "", 200, 0., 2., "Area","dN^{Jets}/dA");
102 AddHistogram2D<TH2D>(tmpRunNum, "hJetAreaVsPt", "Jets area vs. p_{T} distribution", "COLZ", 200, 0., 2., 400, 0., 200., "Area", "p_{T}", "dN^{Jets}/dA dp_{T}");
104 AddHistogram2D<TH2D>(tmpRunNum, "hJetPhiEta", "Jets angular distribution", "LEGO2", 360, 0., 2*TMath::Pi(),100, -0.6, 0.6, "#phi","#eta","dN^{Jets}/(d#phi d#eta)");
105 AddHistogram2D<TH2D>(tmpRunNum, "hJetPtVsConstituentCount", "Jets number of constituents vs. jet p_{T}", "COLZ", 800, 0., 400., 100, 0., 100., "p_{T}","N^{Tracks}","dN^{Jets}/(dp_{T} dN^{tracks})");
106 AddHistogram1D<TH1D>(tmpRunNum, "hJetCountAll", "Number of Jets", "", 200, 0., 200., "N jets","dN^{Events}/dN^{Jets}");
107 AddHistogram1D<TH1D>(tmpRunNum, "hJetCountAccepted", "Number of accepted Jets", "", 200, 0., 200., "N jets","dN^{Events}/dN^{Jets}");
111 // register Histograms
112 for (Int_t i = 0; i < fHistCount; i++)
114 fOutputList->Add(fHistList->At(i));
117 PostData(1,fOutputList); // important for merging
122 //________________________________________________________________________
123 AliAnalysisTaskQualityAssurancePA::AliAnalysisTaskQualityAssurancePA() : AliAnalysisTaskSE("AliAnalysisTaskQualityAssurancePA"), 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)
125 // default constructor
129 //________________________________________________________________________
130 AliAnalysisTaskQualityAssurancePA::AliAnalysisTaskQualityAssurancePA(const char *name, const char* trackArrayName, const char* clusterArrayName, const char* jetArrayName) : AliAnalysisTaskSE(name), 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)
133 AliInfo("Calling constructor.");
137 // Define input and output slots here (never in the dummy constructor)
138 // Input slot #0 works with a TChain - it is connected to the default input container
139 // Output slot #1 writes into a TH1 container
142 // Every instance of this task gets his own number
143 static Int_t instance = 0;
144 fTaskInstanceCounter = instance;
147 fTrackArrayName = new TString(trackArrayName);
148 fClusterArrayName = new TString(clusterArrayName);
149 fRunNumbers = new TString("");
150 if (strcmp(fTrackArrayName->Data(),"") == 0)
155 if (fTrackArrayName->Contains("MCParticles")) //TODO: Hardcoded for now
159 fJetArrayName = new TString(jetArrayName);
160 if (strcmp(fJetArrayName->Data(),"") == 0)
161 fAnalyzeJets = kFALSE;
163 fAnalyzeJets = kTRUE;
165 DefineOutput(1, TList::Class());
167 fHistList = new TList();
170 AliInfo("Constructor done.");
175 //________________________________________________________________________
176 inline Double_t AliAnalysisTaskQualityAssurancePA::GetPtHard()
178 Double_t tmpPtHard = -1.0;
181 AliError("MCEvent not accessible although demanded!");
184 AliGenPythiaEventHeader* pythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
186 AliError("Pythia Header not accessible!");
188 tmpPtHard = pythiaHeader->GetPtHard();
193 //________________________________________________________________________
194 inline Int_t AliAnalysisTaskQualityAssurancePA::GetPtHardBin()
196 // ########## PT HARD BIN EDGES
197 const Int_t localkPtHardLowerEdges[] = { 0, 5,11,21,36,57, 84,117,152,191,234};
198 const Int_t localkPtHardHigherEdges[] = { 5,11,21,36,57,84,117,152,191,234,1000000};
200 Int_t tmpPtHardBin = 0;
201 Double_t tmpPtHard = GetPtHard();
203 for (tmpPtHardBin = 0; tmpPtHardBin <= fNumPtHardBins; tmpPtHardBin++)
204 if (tmpPtHard >= localkPtHardLowerEdges[tmpPtHardBin] && tmpPtHard < localkPtHardHigherEdges[tmpPtHardBin])
210 //________________________________________________________________________
211 inline Bool_t AliAnalysisTaskQualityAssurancePA::IsTrackInAcceptance(AliVParticle* track)
214 if (TMath::Abs(track->Eta()) <= fTrackEtaWindow)
215 if (track->Pt() >= fMinTrackPt)
221 //________________________________________________________________________
222 inline Bool_t AliAnalysisTaskQualityAssurancePA::IsClusterInAcceptance(AliVCluster* cluster)
225 // if (TMath::Abs(cluster->Eta()) <= fClusterEtaWindow)
226 // if (cluster->Phi() <= 187.0/360.0 * TMath::TwoPi());
227 // if (cluster->Phi() >= 80.0/360.0 * TMath::TwoPi());
228 if (cluster->E() >= fMinClusterPt)
234 //________________________________________________________________________
235 inline Bool_t AliAnalysisTaskQualityAssurancePA::IsSignalJetInAcceptance(AliEmcalJet *jet)
238 if (TMath::Abs(jet->Eta()) <= fSignalJetEtaWindow)
239 if (jet->Pt() >= fMinJetPt)
240 if (jet->Area() >= fMinJetArea)
246 //________________________________________________________________________
247 void AliAnalysisTaskQualityAssurancePA::ExecOnce()
250 AliInfo("Starting ExecOnce.");
252 fInitialized = kTRUE;
254 // Check for track array
255 if (strcmp(fTrackArrayName->Data(), "") != 0)
257 fTrackArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTrackArrayName->Data()));
261 AliInfo(Form("%s: Could not retrieve tracks %s! This is OK, if tracks are not demanded.", GetName(), fTrackArrayName->Data()));
266 TClass *cl = fTrackArray->GetClass();
267 if (!cl->GetBaseClass("AliVParticle"))
269 AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTrackArrayName->Data()));
275 // Check for cluster array
276 if (strcmp(fClusterArrayName->Data(), "") != 0)
278 fClusterArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fClusterArrayName->Data()));
279 fHasClusters = kTRUE;
282 AliInfo(Form("%s: Could not retrieve clusters %s! This is OK, if clusters are not demanded.", GetName(), fClusterArrayName->Data()));
283 fHasClusters = kFALSE;
287 TClass *cl = fClusterArray->GetClass();
288 if (!cl->GetBaseClass("AliVCluster"))
290 AliError(Form("%s: Collection %s does not contain AliVCluster objects!", GetName(), fClusterArrayName->Data()));
292 fHasClusters = kFALSE;
297 // Check for jet array
298 if (strcmp(fJetArrayName->Data(), "") != 0)
300 fJetArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fJetArrayName->Data()));
305 AliInfo(Form("%s: Could not retrieve jets %s! This is OK, if jets are not demanded.", GetName(), fJetArrayName->Data()));
310 if (!fJetArray->GetClass()->GetBaseClass("AliEmcalJet"))
312 AliError(Form("%s: Collection %s does not contain AliEmcalJet objects!", GetName(), fJetArrayName->Data()));
319 // Look, if initialization is OK
320 if (!fHasTracks && fAnalyzeQA)
322 AliError(Form("%s: Tracks NOT successfully casted although demanded! Deactivating QA",GetName()));
325 if (!fHasJets && fAnalyzeJets)
327 AliError(Form("%s: Jets NOT successfully casted although demanded! Deactivating jet",GetName()));
328 fAnalyzeJets = kFALSE;
331 // Initialize helper class (for vertex selection)
332 fHelperClass = new AliAnalysisUtils();
338 AliInfo("ExecOnce done.");
343 //________________________________________________________________________
344 void AliAnalysisTaskQualityAssurancePA::GetSignalJets()
347 fFirstLeadingJet = NULL;
348 fSecondLeadingJet = NULL;
349 fNumberSignalJets = 0;
351 Float_t maxJetPts[] = {0, 0};
352 Int_t jetIDArray[] = {-1, -1};
353 Int_t jetCount = fJetArray->GetEntries();
355 // Go through all jets and save signal jets and the two leading ones
356 for (Int_t i = 0; i < jetCount; i++)
358 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJetArray->At(i));
361 AliError(Form("%s: Could not receive jet %d", GetName(), i));
365 if (!IsSignalJetInAcceptance(jet)) continue;
367 if (jet->Pt() > maxJetPts[0])
369 maxJetPts[1] = maxJetPts[0];
370 jetIDArray[1] = jetIDArray[0];
371 maxJetPts[0] = jet->Pt();
374 else if (jet->Pt() > maxJetPts[1])
376 maxJetPts[1] = jet->Pt();
379 fSignalJets[fNumberSignalJets] = jet;
383 if (fNumberSignalJets > 0)
384 fFirstLeadingJet = static_cast<AliEmcalJet*>(fJetArray->At(jetIDArray[0]));
385 if (fNumberSignalJets > 1)
386 fSecondLeadingJet = static_cast<AliEmcalJet*>(fJetArray->At(jetIDArray[1]));
390 //________________________________________________________________________
391 Int_t AliAnalysisTaskQualityAssurancePA::GetLeadingJets(TClonesArray* jetArray, Int_t* jetIDArray)
393 // Writes first two leading jets into already registered array jetIDArray
397 AliError("Could not get the jet array to get leading jets from it!");
401 Float_t maxJetPts[] = {0, 0};
405 Int_t jetCount = jetArray->GetEntries();
406 Int_t jetCountAccepted = 0;
408 for (Int_t i = 0; i < jetCount; i++)
410 AliEmcalJet* jet = static_cast<AliEmcalJet*>(jetArray->At(i));
413 AliError(Form("%s: Could not receive jet %d", GetName(), i));
417 if (!IsSignalJetInAcceptance(jet)) continue;
419 if (jet->Pt() > maxJetPts[0])
421 maxJetPts[1] = maxJetPts[0];
422 jetIDArray[1] = jetIDArray[0];
423 maxJetPts[0] = jet->Pt();
426 else if (jet->Pt() > maxJetPts[1])
428 maxJetPts[1] = jet->Pt();
433 return jetCountAccepted;
437 //________________________________________________________________________
438 void AliAnalysisTaskQualityAssurancePA::Calculate(AliVEvent* event)
441 AliInfo("Starting Calculate().");
443 ////////////////////// NOTE: initialization & casting
446 AliError("??? Event pointer == 0 ???");
451 ExecOnce(); // Get tracks, jets from arrays if not already given + Init Histos
454 TString tmpRunNum("");
455 tmpRunNum += event->GetRunNumber();
457 FillHistogram(tmpRunNum.Data(), "hNumberEvents", 0.5); // number of events before manual cuts
459 if(!fHelperClass->IsVertexSelected2013pA(event))
462 FillHistogram(tmpRunNum.Data(), "hNumberEvents", 1.5); // number of events after manual cuts
465 AliInfo("Calculate()::Init done.");
468 ////////////////////// NOTE: Get Centrality, (Leading)Signal jets
470 // Get centrality (V0A)
471 AliCentrality* tmpCentrality = NULL;
472 tmpCentrality = event->GetCentrality();
473 Double_t centralityPercentileV0A = 0.0;
474 Double_t centralityPercentileV0C = 0.0;
475 Double_t centralityPercentileV0M = 0.0;
476 if (tmpCentrality != NULL)
478 centralityPercentileV0A = tmpCentrality->GetCentralityPercentile("V0A");
479 centralityPercentileV0C = tmpCentrality->GetCentralityPercentile("V0C");
480 centralityPercentileV0M = tmpCentrality->GetCentralityPercentile("V0M");
487 AliInfo("Calculate()::Centrality&SignalJets done.");
489 ////////////////////// NOTE: Pythia histograms
492 FillHistogram(tmpRunNum.Data(), "hPythiaPtHard", GetPtHard());
493 FillHistogram(tmpRunNum.Data(), "hPythiaNTrials", GetPtHardBin()+0.1, fTrials);
494 FillHistogram(tmpRunNum.Data(), "hPythiaXSection", GetPtHardBin()+0.1, fCrossSection);
497 AliInfo("Calculate()::Pythia done.");
501 ////////////////////// NOTE: Track & QA histograms
505 FillHistogram(tmpRunNum.Data(), "hVertexX",event->GetPrimaryVertex()->GetX());
506 FillHistogram(tmpRunNum.Data(), "hVertexY",event->GetPrimaryVertex()->GetY());
507 FillHistogram(tmpRunNum.Data(), "hVertexXY",event->GetPrimaryVertex()->GetX(), event->GetPrimaryVertex()->GetY());
508 FillHistogram(tmpRunNum.Data(), "hVertexZ",event->GetPrimaryVertex()->GetZ());
509 FillHistogram(tmpRunNum.Data(), "hVertexR",TMath::Sqrt(event->GetPrimaryVertex()->GetX()*event->GetPrimaryVertex()->GetX() + event->GetPrimaryVertex()->GetY()*event->GetPrimaryVertex()->GetY()));
510 FillHistogram(tmpRunNum.Data(), "hCentralityV0M",centralityPercentileV0M);
511 FillHistogram(tmpRunNum.Data(), "hCentralityV0A",centralityPercentileV0A);
512 FillHistogram(tmpRunNum.Data(), "hCentralityV0C",centralityPercentileV0C);
514 Int_t trackCountAcc = 0;
515 Int_t nTracks = fTrackArray->GetEntries();
516 for (Int_t i = 0; i < nTracks; i++)
518 AliVTrack* track = static_cast<AliVTrack*>(fTrackArray->At(i));
519 if (IsTrackInAcceptance(track))
521 FillHistogram(tmpRunNum.Data(), "hTrackPhiEta", track->Phi(),track->Eta(), 1);
522 FillHistogram(tmpRunNum.Data(), "hTrackPt", track->Pt());
523 if(track->Eta() >= 0)
524 FillHistogram(tmpRunNum.Data(), "hTrackPtPosEta", track->Pt());
526 FillHistogram(tmpRunNum.Data(), "hTrackPtNegEta", track->Pt());
528 FillHistogram(tmpRunNum.Data(), "hTrackEta", track->Eta());
529 FillHistogram(tmpRunNum.Data(), "hTrackPhi", track->Phi());
530 FillHistogram(tmpRunNum.Data(), "hTrackPhiLabel", track->Phi(), track->GetLabel());
531 for(Int_t j=0;j<20;j++)
533 FillHistogram(tmpRunNum.Data(), "hTrackPhiPtCut", track->Phi(), track->Pt());
535 FillHistogram(tmpRunNum.Data(), "hTrackCharge", track->Charge());
539 FillHistogram(tmpRunNum.Data(), "hTrackCountAcc", trackCountAcc, centralityPercentileV0M);
543 AliInfo("Calculate()::QA done.");
546 ////////////////////// NOTE: Jet analysis and calculations
550 FillHistogram(tmpRunNum.Data(), "hJetCountAll", fJetArray->GetEntries());
551 FillHistogram(tmpRunNum.Data(), "hJetCountAccepted", fNumberSignalJets);
552 // SIGNAL JET ANALYSIS
553 for (Int_t i = 0; i<fNumberSignalJets; i++)
555 AliEmcalJet* tmpJet = fSignalJets[i];
557 FillHistogram(tmpRunNum.Data(), "hJetArea", tmpJet->Area());
558 FillHistogram(tmpRunNum.Data(), "hJetAreaVsPt", tmpJet->Area(), tmpJet->Pt());
559 FillHistogram(tmpRunNum.Data(), "hJetPt", tmpJet->Pt());
560 FillHistogram(tmpRunNum.Data(), "hJetPtVsConstituentCount", tmpJet->Pt(),tmpJet->GetNumberOfTracks());
561 FillHistogram(tmpRunNum.Data(), "hJetPhiEta", tmpJet->Phi(),tmpJet->Eta());
565 } //endif AnalyzeJets
568 AliInfo("Calculate()::Jets done.");
572 //________________________________________________________________________
573 Bool_t AliAnalysisTaskQualityAssurancePA::Notify()
575 // Implemented Notify() to read the cross sections
576 // and number of trials from pyxsec.root
579 AliInfo("Notify started.");
584 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
585 TFile *currFile = tree->GetCurrentFile();
587 TString file(currFile->GetName());
589 if(file.Contains("root_archive.zip#")){
590 Ssiz_t pos1 = file.Index("root_archive",12,TString::kExact);
591 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
592 file.Replace(pos+1,20,"");
595 // not an archive take the basename....
596 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
599 TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root")); // problem that we cannot really test the existance of a file in a archive so we have to lvie with open error message from root
601 // next trial fetch the histgram file
602 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
604 // not a severe condition but inciate that we have no information
608 // find the tlist we want to be independtent of the name so use the Tkey
609 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
614 TList *list = dynamic_cast<TList*>(key->ReadObj());
619 fCrossSection = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
620 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
623 } // no tree pyxsec.root
625 TTree *xtree = (TTree*)fxsec->Get("Xsection");
631 Double_t xsection = 0;
632 xtree->SetBranchAddress("xsection",&xsection);
633 xtree->SetBranchAddress("ntrials",&ntrials);
636 fCrossSection = xsection;
640 AliInfo("Notify ended.");
646 //________________________________________________________________________
647 inline void AliAnalysisTaskQualityAssurancePA::FillHistogram(const char* runNumber, const char * key, Double_t x)
649 if(strcmp(runNumber,"ALL") != 0)
650 FillHistogram("ALL", key, x);
652 TH1* tmpHist = static_cast<TH1*>(fOutputList->FindObject(GetHistoName(runNumber, key)));
655 AliError(Form("Cannot find histogram <%s> ",GetHistoName(runNumber, key))) ;
662 //________________________________________________________________________
663 inline void AliAnalysisTaskQualityAssurancePA::FillHistogram(const char* runNumber, const char * key, Double_t x, Double_t y)
665 if(strcmp(runNumber,"ALL") != 0)
666 FillHistogram("ALL", key, x, y);
668 TH1* tmpHist = static_cast<TH1*>(fOutputList->FindObject(GetHistoName(runNumber, key)));
671 AliError(Form("Cannot find histogram <%s> ",GetHistoName(runNumber, key)));
675 if (tmpHist->IsA()->GetBaseClass("TH1"))
676 static_cast<TH1*>(tmpHist)->Fill(x,y); // Fill x with y
677 else if (tmpHist->IsA()->GetBaseClass("TH2"))
678 static_cast<TH2*>(tmpHist)->Fill(x,y); // Fill x,y with 1
681 //________________________________________________________________________
682 inline void AliAnalysisTaskQualityAssurancePA::FillHistogram(const char* runNumber, const char * key, Double_t x, Double_t y, Double_t add)
684 if(strcmp(runNumber,"ALL") != 0)
685 FillHistogram("ALL", key, x, y, add);
688 TH2* tmpHist = static_cast<TH2*>(fOutputList->FindObject(GetHistoName(runNumber, key)));
691 AliError(Form("Cannot find histogram <%s> ",GetHistoName(runNumber, key)));
695 tmpHist->Fill(x,y,add);
697 //________________________________________________________________________
698 template <class T> T* AliAnalysisTaskQualityAssurancePA::AddHistogram1D(const char* runNumber, const char* name, const char* title, const char* options, Int_t xBins, Double_t xMin, Double_t xMax, const char* xTitle, const char* yTitle)
700 T* tmpHist = new T(GetHistoName(runNumber, name), GetHistoName(runNumber, title), xBins, xMin, xMax);
702 tmpHist->GetXaxis()->SetTitle(xTitle);
703 tmpHist->GetYaxis()->SetTitle(yTitle);
704 tmpHist->SetOption(options);
705 tmpHist->SetMarkerStyle(kFullCircle);
708 fHistList->Add(tmpHist);
714 //________________________________________________________________________
715 template <class T> T* AliAnalysisTaskQualityAssurancePA::AddHistogram2D(const char* runNumber, const char* name, const char* title, const char* options, Int_t xBins, Double_t xMin, Double_t xMax, Int_t yBins, Double_t yMin, Double_t yMax, const char* xTitle, const char* yTitle, const char* zTitle)
717 T* tmpHist = new T(GetHistoName(runNumber, name), GetHistoName(runNumber, title), xBins, xMin, xMax, yBins, yMin, yMax);
718 tmpHist->GetXaxis()->SetTitle(xTitle);
719 tmpHist->GetYaxis()->SetTitle(yTitle);
720 tmpHist->GetZaxis()->SetTitle(zTitle);
721 tmpHist->SetOption(options);
722 tmpHist->SetMarkerStyle(kFullCircle);
725 fHistList->Add(tmpHist);
731 //________________________________________________________________________
732 void AliAnalysisTaskQualityAssurancePA::Terminate(Option_t *)
734 PostData(1, fOutputList);
737 fOutputList = dynamic_cast<TList*> (GetOutputData(1)); // '1' refers to the output slot
739 printf("ERROR: Output list not available\n");
744 //________________________________________________________________________
745 AliAnalysisTaskQualityAssurancePA::~AliAnalysisTaskQualityAssurancePA()
747 // Destructor. Clean-up the output list, but not the histograms that are put inside
748 // (the list is owner and will clean-up these histograms). Protect in PROOF case.
749 if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
754 //________________________________________________________________________
755 void AliAnalysisTaskQualityAssurancePA::UserCreateOutputObjects()
757 // called once to create user defined output objects like histograms, plots etc.
758 // and to put it on the output list.
759 // Note: Saving to file with e.g. OpenFile(0) is must be before creating other objects.
761 fRandom = new TRandom3(0);
763 fOutputList = new TList();
764 fOutputList->SetOwner(); // otherwise it produces leaks in merging
766 PostData(1, fOutputList);
769 //________________________________________________________________________
770 void AliAnalysisTaskQualityAssurancePA::UserExec(Option_t *)
773 AliInfo("UserExec() started.");
776 Calculate(InputEvent());
778 PostData(1, fOutputList);