--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id: AliTRDqaAT.cxx $ */
+
+//
+// This class is a part of a package of high level QA monitoring for TRD.
+// In this class provides a commonly used tools as static functions.
+//
+// S. Radomski
+// radomski@physi.uni-heidelberg.de
+// March 2008
+//
+
+#include "AliTRDqaAT.h"
+
+#include "TMath.h"
+#include "TH1D.h"
+#include "AliExternalTrackParam.h"
+
+//______________________________________________________________________________
+
+AliTRDqaAT::AliTRDqaAT() {
+ //
+ // Dummy contructor
+ //
+
+}
+
+//______________________________________________________________________________
+Int_t AliTRDqaAT::GetSector(const Double_t alpha)
+{
+ // Gets the sector number
+
+ Double_t size = TMath::DegToRad() * 20.;
+ Int_t sector = (Int_t)((alpha + TMath::Pi())/size);
+ return sector;
+}
+
+//______________________________________________________________________________
+
+Int_t AliTRDqaAT::GetStack(const AliExternalTrackParam *paramOut)
+{
+ //
+ // calculates the stack the track is in
+ //
+
+ const Double_t l = -0.9;
+ const Double_t w = (2*l)/5;
+
+ Double_t tan = paramOut->GetZ() / paramOut->GetX();
+ Double_t pos = (tan - l) / w;
+ return (Int_t) pos;
+}
+
+//______________________________________________________________________________
+
+void AliTRDqaAT::BuildRatio(TH1D *ratio, TH1D *histN, TH1D*histD) {
+ //
+ // Calculate the ratio of two histograms
+ // error are calculated assuming the histos have the same counts
+ //
+
+ // calclate
+
+ Int_t nbins = histN->GetXaxis()->GetNbins();
+ for(Int_t i=1; i<nbins+2; i++) {
+
+ Double_t valueN = histN->GetBinContent(i);
+ Double_t valueD = histD->GetBinContent(i);
+
+ if (valueD < 1) {
+ ratio->SetBinContent(i, 0);
+ ratio->SetBinError(i, 0);
+ continue;
+ }
+
+ Double_t eps = (valueN < valueD-valueN)? valueN : valueD-valueN;
+
+ ratio->SetBinContent(i, valueN/valueD);
+ ratio->SetBinError(i, TMath::Sqrt(eps)/valueD);
+ }
+
+ // style
+ ratio->SetMinimum(-0.1);
+ ratio->SetMaximum(1.1);
+ ratio->SetMarkerStyle(20);
+}
+//__________________________________________________________________________
--- /dev/null
+#ifndef ALITRDQAAT_H
+#define ALITRDQAAT_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $Id: AliTRDqaAT.h $ */
+
+////////////////////////////////////////////////////////////////////////////
+// //
+// TRD analysis tools //
+// //
+// Author: //
+// Sylwester Radomski (radomski@physi.uni-heidelberg.de) //
+// //
+////////////////////////////////////////////////////////////////////////////
+
+#include "AliAnalysisTask.h"
+
+class TH1D;
+class AliExternalTrackParam;
+
+class AliTRDqaAT : public TObject {
+
+ public:
+
+ AliTRDqaAT();
+ virtual ~AliTRDqaAT() {}
+
+ static Int_t GetSector(const Double_t alpha);
+ static Int_t GetStack(const AliExternalTrackParam *paramOut);
+ static void BuildRatio(TH1D *ratio, TH1D *histN, TH1D *histD);
+
+ ClassDef(AliTRDqaAT, 0); // TRD analysis tools
+};
+#endif // ALITRDQAAT_H
--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id: AliTRDqaESDFriends.cxx $ */
+
+//
+// This class is a part of a package of high level QA monitoring for TRD.
+// The residuals of cluster with respect to tracklets are analyzed
+// in this class. This class needs ESDfriends.root
+//
+// S. Radomski
+// radomski@physi.uni-heidelberg.de
+// March 2008
+//
+
+#include "AliTRDqaESDFriends.h"
+
+#include "TMath.h"
+#include "TH1D.h"
+#include "TH2D.h"
+#include "TFile.h"
+#include "TTree.h"
+#include "TChain.h"
+
+#include "AliESDEvent.h"
+#include "AliESDtrack.h"
+#include "AliKalmanTrack.h"
+#include "AliESDfriend.h"
+
+//______________________________________________________________________________
+
+AliTRDqaESDFriends::AliTRDqaESDFriends()
+ : AliAnalysisTask("",""),
+ fChain(0),
+ fESD(0),
+ fOutputContainer(0),
+ fResiduals(0),
+ fResidualsAngle(0)
+{
+ // Dummy default constructor
+}
+//______________________________________________________________________________
+
+AliTRDqaESDFriends:: AliTRDqaESDFriends(AliTRDqaESDFriends& /*trd*/)
+ : AliAnalysisTask("",""),
+ fChain(0),
+ fESD(0),
+ fOutputContainer(0),
+ fResiduals(0),
+ fResidualsAngle(0)
+{
+ // dummy copy constructor
+
+ //return *this;
+}
+
+
+//______________________________________________________________________________
+AliTRDqaESDFriends::AliTRDqaESDFriends(const char *name)
+ : AliAnalysisTask(name,""),
+ fChain(0),
+ fESD(0),
+ fOutputContainer(0),
+ fResiduals(0),
+ fResidualsAngle(0)
+{
+ // Constructor.
+ // Input slot #0 works with an Ntuple
+ DefineInput(0, TChain::Class());
+ // Output slot #0 writes into a TH1 container
+ DefineOutput(0, TObjArray::Class()) ;
+}
+
+//______________________________________________________________________________
+void AliTRDqaESDFriends::ConnectInputData(const Option_t *)
+{
+ // Initialisation of branch container and histograms
+
+ //AliInfo(Form("*** Initialization of %s", GetName())) ;
+
+ fChain = (TChain*)GetInputData(0);
+ fESD = new AliESDEvent();
+ fESD->ReadFromTree(fChain);
+}
+
+//________________________________________________________________________
+void AliTRDqaESDFriends::CreateOutputObjects()
+{
+ // build histograms
+
+ fResiduals = new TH1D("residuals", ";residuals (cm)", 1000, -1, 1);
+ fResidualsAngle = new TH2D("residualsAngle", ";angle (rad);residuals (cm)", 100, -1, 1, 100, -1, 1);
+
+ Int_t c = 0;
+ fOutputContainer = new TObjArray(50);
+
+ fOutputContainer->AddAt(fResiduals, c++);
+ fOutputContainer->AddAt(fResidualsAngle, c++);
+
+ printf("n hist = %d\n", c);
+}
+//______________________________________________________________________________
+void AliTRDqaESDFriends::Exec(Option_t *)
+{
+ // Process one event
+
+ //Long64_t entry = fChain->GetReadEntry() ;
+
+ // Processing of one event
+
+ if (!fESD) {
+ //AliError("fESD is not connected to the input!") ;
+ return ;
+ }
+
+ Int_t nTracks = fESD->GetNumberOfTracks();
+ //fNTracks->Fill(nTracks);
+
+ // track loop
+ for(Int_t i=0; i<nTracks; i++) {
+
+ //
+ // track selection
+ //
+ // param in and Out
+ // TRDrefit and TRDPid bit
+ //
+
+ AliESDtrack *track = fESD->GetTrack(i);
+ const AliExternalTrackParam *paramOut = track->GetOuterParam();
+ const AliExternalTrackParam *paramIn = track->GetInnerParam();
+
+ // long track ..
+ if (!paramIn) continue;
+ if (!paramOut) continue;
+
+ UInt_t status = track->GetStatus();
+ if (!(status & AliESDtrack::kTRDrefit)) continue;
+ if (!(status & AliESDtrack::kTRDpid)) continue;
+ if (track->GetTRDpidQuality() < 6) continue;
+
+ // standard selection
+
+ // fESD->GetList()->Print();
+ //AliESDfriend *f = (AliESDfriend*)fESD->FindListObject("ESDfriend");
+ //if (f) f->Print();
+ // AliKalmanTrack *trdTrack = track->GetTRDtrack();
+ //if (trdTrack) trdTrack->Print();
+ }
+
+ PostData(0, fOutputContainer);
+}
+
+//______________________________________________________________________________
+void AliTRDqaESDFriends::Terminate(Option_t *)
+{
+ // retrieve histograms
+ fOutputContainer = (TObjArray*)GetOutputData(0);
+
+ // post processing
+
+
+ // save the results
+ TFile *file = new TFile("outESDFriends.root", "RECREATE");
+ fOutputContainer->Write();
+
+ file->Flush();
+ file->Close();
+ delete file;
+
+ //for(Int_t i=0; i<fOutputContainer->GetEntries(); i++) {
+ // TObject *obj = fOu
+ // }
+}
+
+//______________________________________________________________________________
--- /dev/null
+#ifndef ALITRDQAESDFRIENDS_H
+#define ALITRDQAESDFRIENDS_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $Id: AliTRDqaESDFriends.h $ */
+
+//
+// This class is a part of a package of high level QA monitoring for TRD.
+// The residuals of cluster with respect to tracklets are analyzed
+// in this class. This class needs ESDfriends.root
+//
+// S. Radomski
+// radomski@physi.uni-heidelberg.de
+// March 2008
+//
+
+#include "AliAnalysisTask.h"
+
+class TTree;
+class AliESDEvent;
+class TH1D;
+class TH2D;
+class AliExternalTrackParam;
+
+class AliTRDqaESDFriends : public AliAnalysisTask {
+
+public:
+ AliTRDqaESDFriends();
+ AliTRDqaESDFriends(const char *name);
+ AliTRDqaESDFriends(AliTRDqaESDFriends& trd);
+ AliTRDqaESDFriends& operator = (const AliTRDqaESDFriends& /*g*/) { return *this; };
+ virtual ~AliTRDqaESDFriends() {}
+
+ virtual void Exec(Option_t * opt = "");
+ virtual void ConnectInputData(Option_t *);
+ virtual void CreateOutputObjects();
+ virtual void Terminate(Option_t * opt = "");
+
+protected:
+
+ TTree * fChain; //!pointer to the analyzed TTree or TChain
+ AliESDEvent * fESD; //! Declaration of leave types
+
+ TObjArray * fOutputContainer; //! output data container
+
+ // histograms
+ TH1D *fResiduals; // residuals distribution
+ TH2D *fResidualsAngle; // diferential resisuals distribution
+ //TH2D *fResidualsAngleChamber[540]; // per chamber
+
+ ClassDef(AliTRDqaESDFriends, 0); // a TRD analysis task
+};
+#endif // ALITRDQAESDFRIENDS_H
--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id: AliTRDqaElectronSpectra.cxx $ */
+
+//
+// This class is a part of a package of high level QA monitoring for TRD.
+//
+// The transverse momentum spectrum is analyzed stack-by-stack
+// for all tracks, and for electron tracks.
+// Tracks have to pass quality cuts.
+// Electrons are waighted with the PID LQ
+//
+// S. Radomski
+// radomski@physi.uni-heidelberg.de
+// March 2008
+//
+
+#include "AliTRDqaElectronSpectra.h"
+#include "AliTRDqaAT.h"
+
+#include "TMath.h"
+#include "TH1D.h"
+#include "TH2D.h"
+#include "TFile.h"
+#include "TTree.h"
+#include "TChain.h"
+
+#include "AliESDEvent.h"
+#include "AliESDtrack.h"
+
+//______________________________________________________________________________
+
+AliTRDqaElectronSpectra::AliTRDqaElectronSpectra()
+ : AliAnalysisTask("",""),
+ fChain(0),
+ fESD(0),
+ fOutputContainer(0),
+ fStatus(0),
+ fSector(0),
+ fTheta(0),
+ fStack(0),
+ fnTracks(0),
+ fnElTracks(0),
+ fTracksRatio(0),
+ fPt(0),
+ fPtElectron(0),
+ fMeanPt(0),
+ fMeanPtElectron(0),
+ fPtStack(0),
+ fPtStackElectron(0),
+ fElectronLQ(0)
+{
+ //
+ // default dummy constructor
+ //
+
+}
+//______________________________________________________________________________
+
+AliTRDqaElectronSpectra:: AliTRDqaElectronSpectra(AliTRDqaElectronSpectra& /*trd*/)
+ : AliAnalysisTask("",""),
+ fChain(0),
+ fESD(0),
+ fOutputContainer(0),
+ fStatus(0),
+ fSector(0),
+ fTheta(0),
+ fStack(0),
+ fnTracks(0),
+ fnElTracks(0),
+ fTracksRatio(0),
+ fPt(0),
+ fPtElectron(0),
+ fMeanPt(0),
+ fMeanPtElectron(0),
+ fPtStack(0),
+ fPtStackElectron(0),
+ fElectronLQ(0)
+{
+ //
+ // Dummy copy constructor
+ //
+
+ //return *this;
+}
+
+
+//______________________________________________________________________________
+AliTRDqaElectronSpectra::AliTRDqaElectronSpectra(const char *name)
+ : AliAnalysisTask(name,""),
+ fChain(0),
+ fESD(0),
+ fOutputContainer(0),
+ fStatus(0),
+ fSector(0),
+ fTheta(0),
+ fStack(0),
+ fnTracks(0),
+ fnElTracks(0),
+ fTracksRatio(0),
+ fPt(0),
+ fPtElectron(0),
+ fMeanPt(0),
+ fMeanPtElectron(0),
+ fPtStack(0),
+ fPtStackElectron(0),
+ fElectronLQ(0)
+{
+ // Constructor.
+ // Input slot #0 works with an Ntuple
+ DefineInput(0, TChain::Class());
+ // Output slot #0 writes into a TH1 container
+ DefineOutput(0, TObjArray::Class()) ;
+}
+
+//______________________________________________________________________________
+void AliTRDqaElectronSpectra::ConnectInputData(const Option_t *)
+{
+ // Initialisation of branch container and histograms
+
+ //AliInfo(Form("*** Initialization of %s", GetName())) ;
+
+ fChain = (TChain*)GetInputData(0);
+ fESD = new AliESDEvent();
+ fESD->ReadFromTree(fChain);
+}
+
+//________________________________________________________________________
+void AliTRDqaElectronSpectra::CreateOutputObjects()
+{
+ // build histograms
+
+ fStatus = new TH1D("status", ";status bit", 32, -0.5, 31.5);
+ fSector = new TH1D("sector", ";sector", 18, -0.5, 17.5);
+ fTheta = new TH1D("theta", ";theta (rad)", 100, -1, 1);
+ fStack = new TH1D("stack", ";stack", 90, -0.5, 89.5);
+
+ fnTracks = new TH1D("tracks", ";stack;number of tracks", 90, -0.5, 89.5);
+ fnElTracks = new TH1D("elTracks", ";stack;number of electron tracks", 90, -0.5, 89.5);
+ fTracksRatio = new TH1D("fractionElectrons", ";stack;fraction of electron tracks", 90, -0.5, 89.5);
+
+ fPt = new TH1D("pt", "p_{T} (GeV/c)", 50, 0, 10);
+ fPtElectron = new TH1D("ptElectron", "p_{T} (GeV/c)", 50, 0, 10);
+
+ fMeanPt = new TH1D("meanPt", ";<p_{T}> (GeV/c)", 100, 0, 5);
+ fMeanPtElectron = new TH1D("meanPtElectron", ";<P_{T}> (GeV/c)", 100, 0, 5);
+
+ fPtStack = new TH2D("stackPt", ";stack;p_{T} (GeV/c)", 90, -0.5, 89.5, 50, 0, 10);
+ fPtStackElectron = new TH2D("stackPtEl", ";stack;p_{T} (GeV/c)", 90, -0.5, 89.5, 50, 0, 10);
+
+ fElectronLQ = new TH1D("elLQ", ";likelyhood", 100, 0, 1);
+
+ Int_t c = 0;
+ fOutputContainer = new TObjArray(50);
+
+ fOutputContainer->AddAt(fStatus, c++);
+ fOutputContainer->AddAt(fSector, c++);
+ fOutputContainer->AddAt(fTheta, c++);
+ fOutputContainer->AddAt(fStack, c++);
+
+ fOutputContainer->AddAt(fnTracks, c++);
+ fOutputContainer->AddAt(fnElTracks, c++);
+ fOutputContainer->AddAt(fTracksRatio, c++);
+
+ fOutputContainer->AddAt(fPt, c++);
+ fOutputContainer->AddAt(fPtElectron, c++);
+
+ fOutputContainer->AddAt(fMeanPt, c++);
+ fOutputContainer->AddAt(fMeanPtElectron, c++);
+
+ fOutputContainer->AddAt(fPtStack, c++);
+ fOutputContainer->AddAt(fPtStackElectron, c++);
+
+ fOutputContainer->AddAt(fElectronLQ, c++);
+
+ printf("n hist = %d\n", c);
+}
+//______________________________________________________________________________
+void AliTRDqaElectronSpectra::Exec(Option_t *)
+{
+ // Process one event
+ Long64_t entry = fChain->GetReadEntry() ;
+ if (!(entry%10)) Info("Exec", "Entry = %ld", entry);
+
+ // Processing of one event
+
+ if (!fESD) {
+ //AliError("fESD is not connected to the input!") ;
+ return ;
+ }
+
+ Int_t nTracks = fESD->GetNumberOfTracks();
+ //fNTracks->Fill(nTracks);
+
+ // track loop
+ for(Int_t i=0; i<nTracks; i++) {
+
+ //
+ // track selection
+ //
+ // param in and Out
+ // TRDrefit and TRDPid bit
+ //
+
+ AliESDtrack *track = fESD->GetTrack(i);
+ const AliExternalTrackParam *paramOut = track->GetOuterParam();
+ const AliExternalTrackParam *paramIn = track->GetInnerParam();
+
+ // long track ..
+ if (!paramIn) continue;
+ if (!paramOut) continue;
+
+ UInt_t status = track->GetStatus();
+ if (!(status & AliESDtrack::kTRDrefit)) continue;
+ if (!(status & AliESDtrack::kTRDpid)) continue;
+ if (track->GetTRDpidQuality() < 6) continue;
+
+ Int_t sm = AliTRDqaAT::GetSector(paramOut->GetAlpha());
+ Int_t stack = 5*sm + AliTRDqaAT::GetStack(paramOut);
+ Double_t lq = track->GetTRDpid(AliPID::kElectron);
+ Double_t pt = paramOut->Pt();
+
+ //TH1D *fStatus; // track status
+ fSector->Fill(sm);
+ fStack->Fill(stack);
+ fElectronLQ->Fill(lq);
+
+ fTheta->Fill(paramOut->GetZ() / paramOut->GetX());
+
+ fnTracks->Fill(stack);
+ fnElTracks->Fill(stack, lq);
+
+ fPt->Fill(pt);
+ fPtElectron->Fill(pt, lq);
+
+ fPtStack->Fill(stack, pt);
+ fPtStackElectron->Fill(stack, pt, lq);
+ }
+
+ PostData(0, fOutputContainer);
+}
+
+//______________________________________________________________________________
+void AliTRDqaElectronSpectra::Terminate(Option_t *)
+{
+ // save histograms
+ fOutputContainer = (TObjArray*)GetOutputData(0);
+
+ // build ratios
+ fnTracks = (TH1D*)fOutputContainer->FindObject("tracks");
+ fnElTracks = (TH1D*)fOutputContainer->FindObject("elTracks");
+ fTracksRatio = (TH1D*)fOutputContainer->FindObject("fractionElectrons");
+
+ AliTRDqaAT::BuildRatio(fTracksRatio, fnElTracks, fnTracks);
+
+ // save the results
+
+ TFile *file = new TFile("outElSpectra.root", "RECREATE");
+ fOutputContainer->Write();
+
+ file->Flush();
+ file->Close();
+ delete file;
+
+ //for(Int_t i=0; i<fOutputContainer->GetEntries(); i++) {
+ // TObject *obj = fOu
+ // }
+}
+
+//______________________________________________________________________________
--- /dev/null
+#ifndef ALITRDQAELECTRONSPECTRA_H
+#define ALITRDQAELECTRONSPECTRA_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $Id: AliTRDqaElectronSpectra.h $ */
+
+//
+// This class is a part of a package of high level QA monitoring for TRD.
+//
+// The transverse momentum spectrum is analyzed stack-by-stack
+// for all tracks, and for electron tracks.
+// Tracks have to pass quality cuts.
+// Electrons are waighted with the PID LQ
+//
+// S. Radomski
+// radomski@physi.uni-heidelberg.de
+// March 2008
+//
+
+#include "AliAnalysisTask.h"
+
+class TTree;
+class AliESDEvent;
+class TH1D;
+class TH2D;
+class AliExternalTrackParam;
+
+class AliTRDqaElectronSpectra : public AliAnalysisTask {
+
+ public:
+
+ AliTRDqaElectronSpectra();
+ AliTRDqaElectronSpectra(const char *name);
+ AliTRDqaElectronSpectra(AliTRDqaElectronSpectra& trd);
+ AliTRDqaElectronSpectra& operator = (const AliTRDqaElectronSpectra& /*g*/) { return *this; };
+ virtual ~AliTRDqaElectronSpectra() {}
+
+ virtual void Exec(Option_t * opt = "");
+ virtual void ConnectInputData(Option_t *);
+ virtual void CreateOutputObjects();
+ virtual void Terminate(Option_t * opt = "");
+
+ private:
+
+ TTree * fChain; //!pointer to the analyzed TTree or TChain
+ AliESDEvent * fESD; //! Declaration of leave types
+
+ TObjArray * fOutputContainer; //! output data container
+
+ // histograms
+
+ TH1D *fStatus; // track status
+ TH1D *fSector; // sector
+ TH1D *fTheta; // theta to decide on stack
+ TH1D *fStack; // stack ID
+
+ TH1D *fnTracks; // number of tracks in a stack
+ TH1D *fnElTracks; // number of electrons tracks in a stack
+ TH1D *fTracksRatio; // fraction of electron tracks in a stack
+
+ TH1D *fPt; // transverse momentum distribution
+ TH1D *fPtElectron; // transverse momentum of electrons
+
+ TH1D *fMeanPt; // all tracks
+ TH1D *fMeanPtElectron; // electrons
+
+ TH2D *fPtStack; // pt distribution per stack
+ TH2D *fPtStackElectron; // for electrons
+
+ TH1D *fElectronLQ; // electron likehood
+
+
+ ClassDef(AliTRDqaElectronSpectra, 0); // a TRD analysis task
+};
+#endif // ALITRDQAELECTRONSPECTRA_H
--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id: AliTRDqaEnergyDeposit.cxx $ */
+
+//
+// This class is a part of a package of high level QA monitoring for TRD.
+// In this class the dEdX is analyzed as a function of the particle type,
+// momentum and chamber.
+//
+// S. Radomski
+// radomski@physi.uni-heidelberg.de
+// March 2008
+//
+
+#include "AliTRDqaEnergyDeposit.h"
+
+#include "TMath.h"
+#include "TH1D.h"
+#include "TH2D.h"
+#include "TFile.h"
+#include "TTree.h"
+#include "TChain.h"
+
+#include "AliESDEvent.h"
+#include "AliESDtrack.h"
+#include "AliKalmanTrack.h"
+
+//______________________________________________________________________________
+
+AliTRDqaEnergyDeposit::AliTRDqaEnergyDeposit()
+ : AliAnalysisTask("",""),
+ fChain(0),
+ fESD(0),
+ fOutputContainer(0)
+{
+ // Dummy default constructor
+}
+//______________________________________________________________________________
+
+AliTRDqaEnergyDeposit:: AliTRDqaEnergyDeposit(AliTRDqaEnergyDeposit& /*trd*/)
+ : AliAnalysisTask("",""),
+ fChain(0),
+ fESD(0),
+ fOutputContainer(0)
+{
+ // Dummy copy constructor
+
+ //return *this;
+}
+
+//______________________________________________________________________________
+AliTRDqaEnergyDeposit::AliTRDqaEnergyDeposit(const char *name)
+ : AliAnalysisTask(name,""),
+ fChain(0),
+ fESD(0),
+ fOutputContainer(0)
+{
+ // Constructor.
+ // Input slot #0 works with an Ntuple
+ DefineInput(0, TChain::Class());
+ // Output slot #0 writes into a TH1 container
+ DefineOutput(0, TObjArray::Class()) ;
+}
+
+//______________________________________________________________________________
+void AliTRDqaEnergyDeposit::ConnectInputData(const Option_t *)
+{
+ // Initialisation of branch container and histograms
+
+ //AliInfo(Form("*** Initialization of %s", GetName())) ;
+
+ fChain = (TChain*)GetInputData(0);
+ fESD = new AliESDEvent();
+ fESD->ReadFromTree(fChain);
+}
+
+//________________________________________________________________________
+void AliTRDqaEnergyDeposit::CreateOutputObjects()
+{
+ // build histograms
+
+ // prepare the scale from 0.5 to 10 GeV
+ const Int_t knbinsx = 50;
+ Double_t scalex[knbinsx+1];
+ Double_t dd = (TMath::Log(10) - TMath::Log(0.5)) / knbinsx;
+ for(Int_t ix=0; ix<knbinsx+1; ix++) {
+ scalex[ix] = 0.5 * TMath::Exp(dd * ix);
+ }
+
+ const Int_t knbinsy = 50;
+ Double_t scaley[knbinsy+1];
+ for(Int_t iy=0; iy<knbinsy+1; iy++) {
+ scaley[iy] = iy * (3e3/100.);
+ }
+
+ const char *title = ";p_{T};dEdX (a. u.)";
+ const char *charge[2] = {"Pos", "Neg"};
+
+ // build histograms
+ fOutputContainer = new TObjArray(50);
+ Int_t c=0;
+
+ for(Int_t i=0; i<2; i++) {
+
+ fSignalPtSum[i] = new TH2D(Form("ptSig%s", charge[i]), title, knbinsx, scalex, knbinsy, scaley);
+ fOutputContainer->AddAt(fSignalPtSum[i], c++);
+
+ for(Int_t j=0; j<AliPID::kSPECIES; j++) {
+ Int_t idx = AliPID::kSPECIES*i+j;
+ fSignalPtType[idx] =
+ new TH2D(Form("ptSig%s%d", charge[i], j), title, knbinsx, scalex, knbinsy, scaley);
+ fOutputContainer->AddAt(fSignalPtType[idx], c++);
+
+ fProb[idx] = new TH1D(Form("prob%s%d", charge[i], j), ";LQ", 100, 0, 1);
+ fOutputContainer->AddAt(fProb[idx], c++);
+ }
+ }
+
+ printf("n hist = %d\n", c);
+}
+//______________________________________________________________________________
+void AliTRDqaEnergyDeposit::Exec(Option_t *)
+{
+ // Process one event
+
+ // Long64_t entry = fChain->GetReadEntry() ;
+
+ // Processing of one event
+
+ if (!fESD) {
+ //AliError("fESD is not connected to the input!") ;
+ return ;
+ }
+
+ Int_t nTracks = fESD->GetNumberOfTracks();
+ //fNTracks->Fill(nTracks);
+
+ // track loop
+ for(Int_t i=0; i<nTracks; i++) {
+
+ //
+ // track selection
+ //
+ // param in and Out
+ // TRDrefit and TRDPid bit
+ //
+
+ AliESDtrack *track = fESD->GetTrack(i);
+ const AliExternalTrackParam *paramOut = track->GetOuterParam();
+ const AliExternalTrackParam *paramIn = track->GetInnerParam();
+
+ // long track ..
+ if (!paramIn) continue;
+ if (!paramOut) continue;
+
+ UInt_t status = track->GetStatus();
+ if (!(status & AliESDtrack::kTRDrefit)) continue;
+ if (!(status & AliESDtrack::kTRDpid)) continue;
+ if (track->GetTRDpidQuality() < 6) continue;
+
+ // standard selection
+
+ Int_t idx = (track->GetSign() > 0) ? 0 : 1;
+ Double_t pt = paramOut->Pt();
+
+ Double_t signal = 0;
+ for(Int_t i=0; i<6; i++)
+ signal += track->GetTRDsignals(i, -1);
+ signal /= 6;
+
+ fSignalPtSum[idx]->Fill(pt, signal);
+
+ for(Int_t i=0; i<AliPID::kSPECIES; i++) {
+
+ Double_t lq = track->GetTRDpid(i);
+ fProb[AliPID::kSPECIES*idx+i]->Fill(lq);
+ fSignalPtType[AliPID::kSPECIES*idx+i]->Fill(pt, signal, lq);
+ }
+ }
+
+ PostData(0, fOutputContainer);
+}
+
+//______________________________________________________________________________
+void AliTRDqaEnergyDeposit::Terminate(Option_t *)
+{
+ // retrieve histograms
+ fOutputContainer = (TObjArray*)GetOutputData(0);
+
+ // post processing
+
+
+ // save the results
+ TFile *file = new TFile("outEnergyDeposit.root", "RECREATE");
+ fOutputContainer->Write();
+
+ file->Flush();
+ file->Close();
+ delete file;
+
+ //for(Int_t i=0; i<fOutputContainer->GetEntries(); i++) {
+ // TObject *obj = fOu
+ // }
+}
+
+//______________________________________________________________________________
--- /dev/null
+#ifndef ALITRDQAENERGYDEPOSIT_H
+#define ALITRDQAENERGYDEPOSIT_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $Id: AliTRDqaEnergyDeposit.h $ */
+
+//
+// This class is a part of a package of high level QA monitoring for TRD.
+// In this class the dEdX is analyzed as a function of the particle type,
+// momentum and chamber.
+//
+// S. Radomski
+// radomski@physi.uni-heidelberg.de
+// March 2008
+//
+
+#include "AliAnalysisTask.h"
+
+class TTree;
+class AliESDEvent;
+class TH1D;
+class TH2D;
+class AliExternalTrackParam;
+
+class AliTRDqaEnergyDeposit : public AliAnalysisTask {
+
+public:
+ AliTRDqaEnergyDeposit();
+ AliTRDqaEnergyDeposit(const char *name);
+ AliTRDqaEnergyDeposit(AliTRDqaEnergyDeposit& trd);
+ AliTRDqaEnergyDeposit& operator = (const AliTRDqaEnergyDeposit& /*g*/) { return *this; };
+ virtual ~AliTRDqaEnergyDeposit() {}
+
+ virtual void Exec(Option_t * opt = "");
+ virtual void ConnectInputData(Option_t *);
+ virtual void CreateOutputObjects();
+ virtual void Terminate(Option_t * opt = "");
+
+protected:
+
+ TTree *fChain; //!pointer to the analyzed TTree or TChain
+ AliESDEvent *fESD; //! Declaration of leave types
+
+ TObjArray *fOutputContainer; //! output data container
+
+ // histogrms
+
+ //TH2D *fSignalPt[2]; // pt-dedx distribution for pos and neg
+ TH2D *fSignalPtSum[2]; // pt-dedx distribution for pos and neg
+ TH2D *fSignalPtType[2*5]; // weight with the PID probability
+ TH1D *fProb[2*5]; // probabilities
+ //TH2D *fSignalPtChamber[2*540];
+
+ ClassDef(AliTRDqaEnergyDeposit, 0); // a TRD analysis task
+};
+#endif // ALITRDQAENERGYDEPOSIT_H
--- /dev/null
+
+void drawEnergyDeposit(const char *filename) {
+
+ gROOT->SetStyle("Plain");
+ gStyle->SetPadRightMargin(0.01);
+ gStyle->SetPadTopMargin(0.01);
+ gStyle->SetPadLeftMargin(0.07);
+ gStyle->SetPadBottomMargin(0.07);
+ gStyle->SetOptStat(0);
+ TGaxis::SetMaxDigits(3);
+
+ TFile *file = new TFile(filename, "READ");
+ if (file->IsZombie()) return;
+
+ TCanvas *c = new TCanvas();
+ c->Divide(5, 4, 0.001, 0.001);
+
+ for(int i=0; i<5; i++) {
+ TH1 *hist = (TH1*)file->Get(Form("probPos%d", i));
+ c->cd(i+1);
+ gPad->SetLogy();
+ hist->Draw();
+ }
+
+ for(int i=0; i<5; i++) {
+ TH1 *hist = (TH1*)file->Get(Form("ptSigPos%d", i));
+ c->cd(i+6);
+ gPad->SetLogx();
+ hist->Draw("col");
+ }
+
+ for(int i=0; i<5; i++) {
+ TH1 *hist = (TH1*)file->Get(Form("probNeg%d", i));
+ c->cd(i+11);
+ gPad->SetLogy();
+ hist->Draw();
+ }
+
+ for(int i=0; i<5; i++) {
+ TH1 *hist = (TH1*)file->Get(Form("ptSigNeg%d", i));
+ c->cd(i+16);
+ gPad->SetLogx();
+ hist->Draw("col");
+ }
+}
--- /dev/null
+
+void runTRDqaAnalysis(const char *chainName, int limit = 0) {
+ //
+ // runs the analysis train
+ // parameters:
+ // chainName -- a name of a file with a list of ESDs
+ // limit -- number of files to be processed
+ //
+ //
+
+ gSystem->Load("libANALYSIS.so");
+ gSystem->Load("libTRDqaAnalysis.so");
+
+ // Setup chain
+ TChain *chain = new TChain("esdTree");
+ //chain->SetBranchStatus("*",0);
+ //chain->SetBranchStatus("*fTracks*",1);
+ //esdTree->SetBranchStatus("ESDfriend*",1);
+
+ int nfiles = 0;
+ fstream coll(chainName, ios_base::in);
+ TString line;
+ while (line.ReadLine(coll)) {
+ cout << line.Data() << endl;
+ chain->Add(line.Data());
+ nfiles++;
+ if (limit && nfiles > limit) break;
+ }
+
+ // Create an analysis manager
+ AliAnalysisManager *mgr = new AliAnalysisManager("qaTasks", "No safety");
+ AliAnalysisTask *tasks[3];
+ AliAnalysisDataContainer *out[3];
+
+ tasks[0] = new AliTRDqaElectronSpectra("trdElectronSpectra");
+ tasks[1] = new AliTRDqaESDFriends("trdESDFriends");
+ tasks[2] = new AliTRDqaEnergyDeposit("trdEnergyDeposit");
+
+ AliAnalysisDataContainer *cinput =
+ mgr->CreateContainer("inputESD", TTree::Class(), AliAnalysisManager::kInputContainer);
+
+ out[0] = mgr->CreateContainer("oES", TObjArray::Class(), AliAnalysisManager::kOutputContainer);
+ out[1] = mgr->CreateContainer("oEF", TObjArray::Class(), AliAnalysisManager::kOutputContainer);
+ out[2] = mgr->CreateContainer("oED", TObjArray::Class(), AliAnalysisManager::kOutputContainer);
+
+ // register
+ for(int i=0; i<3; i++) {
+ mgr->AddTask(tasks[i]);
+ mgr->ConnectInput(tasks[i],0,cinput);
+ mgr->ConnectOutput(tasks[i],0,out[i]);
+ }
+
+ // Connect input data
+ cout << "connect to data" << endl;
+ cinput->SetData(chain);
+ Long_t t0 = gSystem->Now();
+
+ TStopwatch sw;
+ sw.Start();
+
+ cout << "Initializing" << endl;
+ if (mgr->InitAnalysis()) {
+ mgr->PrintStatus();
+ mgr->StartAnalysis("local", chain);
+ }
+
+ sw.Stop();
+ sw.Print();
+
+ Long_t t1 = gSystem->Now();
+ double time = 1e-3 * (t1-t0);
+
+ //cout << "Size = " << mgr->GetNBytes()*1e-6 << " MB" << endl;
+ //cout << "Time = " << time << " s" << endl;
+ //cout << "Speed = " << 1e-6*mgr->GetNBytes()/time << " MB/s" << endl;
+ //cout << "Events = " << mgr->GetNEvents()/time << " Events/s" << endl;
+
+ //gSystem->Exit(0);
+
+
+}