From: jbook Date: Tue, 25 Jun 2013 15:04:38 +0000 (+0000) Subject: -add cut qa class X-Git-Url: http://git.uio.no/git/?a=commitdiff_plain;h=d8bb1abe717070b16bffb0f9a3acd4a1d618261a;p=u%2Fmrichter%2FAliRoot.git -add cut qa class -protection for missing V0 branch (nanoAODs) --- diff --git a/PWGDQ/CMakelibPWGDQdielectron.pkg b/PWGDQ/CMakelibPWGDQdielectron.pkg index 9c56c41cb55..c2b8485da43 100644 --- a/PWGDQ/CMakelibPWGDQdielectron.pkg +++ b/PWGDQ/CMakelibPWGDQdielectron.pkg @@ -56,6 +56,7 @@ set ( SRCS dielectron/AliDielectronTrackRotator.cxx dielectron/AliDielectronPID.cxx dielectron/AliDielectronCutGroup.cxx + dielectron/AliDielectronCutQA.cxx dielectron/AliDielectronEventCuts.cxx dielectron/AliDielectronHelper.cxx dielectron/AliDielectronBtoJPSItoEleCDFfitFCN.cxx diff --git a/PWGDQ/PWGDQdielectronLinkDef.h b/PWGDQ/PWGDQdielectronLinkDef.h index 2092187dd2e..0c798ab8284 100644 --- a/PWGDQ/PWGDQdielectronLinkDef.h +++ b/PWGDQ/PWGDQdielectronLinkDef.h @@ -36,6 +36,7 @@ #pragma link C++ class AliDielectronTrackRotator+; #pragma link C++ class AliDielectronPID+; #pragma link C++ class AliDielectronCutGroup+; +#pragma link C++ class AliDielectronCutQA+; #pragma link C++ class AliDielectronEventCuts+; #pragma link C++ class AliDielectronHelper+; #pragma link C++ class AliDielectronBtoJPSItoEleCDFfitFCN+; diff --git a/PWGDQ/dielectron/AliAnalysisTaskMultiDielectron.cxx b/PWGDQ/dielectron/AliAnalysisTaskMultiDielectron.cxx index 1349032ace6..78943c0d949 100644 --- a/PWGDQ/dielectron/AliAnalysisTaskMultiDielectron.cxx +++ b/PWGDQ/dielectron/AliAnalysisTaskMultiDielectron.cxx @@ -111,6 +111,9 @@ AliAnalysisTaskMultiDielectron::~AliAnalysisTaskMultiDielectron() fListHistos.SetOwner(kFALSE); fListCF.SetOwner(kFALSE); + // try to reduce memory issues + if(fEventStat) { delete fEventStat; fEventStat=0; } + if(fTriggerAnalysis) { delete fTriggerAnalysis; fTriggerAnalysis=0; } } //_________________________________________________________________________________ void AliAnalysisTaskMultiDielectron::UserCreateOutputObjects() @@ -129,9 +132,10 @@ void AliAnalysisTaskMultiDielectron::UserCreateOutputObjects() AliDielectron *die=0; while ( (die=static_cast(nextDie())) ){ die->Init(); - if (die->GetHistogramList()) fListHistos.Add(const_cast(die->GetHistogramList())); - if (die->GetHistogramArray()) fListHistos.Add(const_cast(die->GetHistogramArray())); - if (die->GetCFManagerPair()) fListCF.Add(const_cast(die->GetCFManagerPair()->GetContainer())); + if (die->GetHistogramList()) fListHistos.Add(const_cast(die->GetHistogramList())); + if (die->GetHistogramArray()) fListHistos.Add(const_cast(die->GetHistogramArray())); + if (die->GetQAHistArray()) fListHistos.Add(const_cast(die->GetQAHistArray())); + if (die->GetCFManagerPair()) fListCF.Add(const_cast(die->GetCFManagerPair()->GetContainer())); } Int_t cuts=fListDielectron.GetEntries(); diff --git a/PWGDQ/dielectron/AliDielectron.cxx b/PWGDQ/dielectron/AliDielectron.cxx index 86946203d73..e3a778cdc30 100644 --- a/PWGDQ/dielectron/AliDielectron.cxx +++ b/PWGDQ/dielectron/AliDielectron.cxx @@ -95,6 +95,8 @@ const char* AliDielectron::fgkPairClassNames[11] = { //________________________________________________________________ AliDielectron::AliDielectron() : TNamed("AliDielectron","AliDielectron"), + fCutQA(kFALSE), + fQAmonitor(0x0), fEventFilter("EventFilter"), fTrackFilter("TrackFilter"), fPairPreFilter("PairPreFilter"), @@ -136,6 +138,8 @@ AliDielectron::AliDielectron() : //________________________________________________________________ AliDielectron::AliDielectron(const char* name, const char* title) : TNamed(name,title), + fCutQA(kFALSE), + fQAmonitor(0x0), fEventFilter("EventFilter"), fTrackFilter("TrackFilter"), fPairPreFilter("PairPreFilter"), @@ -180,6 +184,7 @@ AliDielectron::~AliDielectron() // // Default destructor // + if (fQAmonitor) delete fQAmonitor; if (fHistoArray) delete fHistoArray; if (fHistos) delete fHistos; if (fPairCandidates) delete fPairCandidates; @@ -219,7 +224,15 @@ void AliDielectron::Init() fHistoArray->SetSignalsMC(fSignalsMC); fHistoArray->Init(); } -} + + if (fCutQA) { + fQAmonitor = new AliDielectronCutQA(Form("QAcuts_%s",GetName()),"QAcuts"); + fQAmonitor->AddTrackFilter(&fTrackFilter); + fQAmonitor->AddPairFilter(&fPairFilter); + fQAmonitor->AddEventFilter(&fEventFilter); + fQAmonitor->Init(); + } +} //________________________________________________________________ void AliDielectron::Process(AliVEvent *ev1, AliVEvent *ev2) @@ -251,6 +264,7 @@ void AliDielectron::Process(AliVEvent *ev1, AliVEvent *ev2) } //in case we have MC load the MC event and process the MC particles + // why do not apply the event cuts first ???? if (AliDielectronMC::Instance()->ConnectMCEvent()){ ProcessMC(ev1); } @@ -266,8 +280,11 @@ void AliDielectron::Process(AliVEvent *ev1, AliVEvent *ev2) UInt_t selectedMask=(1<GetEntries())-1; //apply event cuts - if ((ev1&&fEventFilter.IsSelected(ev1)!=selectedMask) || - (ev2&&fEventFilter.IsSelected(ev2)!=selectedMask)) return; + UInt_t cutmask = fEventFilter.IsSelected(ev1); + if(fCutQA) fQAmonitor->FillAll(ev1); + if(fCutQA) fQAmonitor->Fill(cutmask,ev1); + if ((ev1&&cutmask!=selectedMask) || + (ev2&&fEventFilter.IsSelected(ev2)!=selectedMask)) return; //fill track arrays for the first event if (ev1){ @@ -613,12 +630,19 @@ void AliDielectron::FillTrackArrays(AliVEvent * const ev, Int_t eventNr) AliVParticle *particle=ev->GetTrack(itrack); //apply track cuts - if (fTrackFilter.IsSelected(particle)!=selectedMask) continue; + UInt_t cutmask=fTrackFilter.IsSelected(particle); + //fill cut QA + if(fCutQA) fQAmonitor->FillAll(particle); + if(fCutQA) fQAmonitor->Fill(cutmask,particle); + + if (cutmask!=selectedMask) continue; //fill selected particle into the corresponding track arrays Short_t charge=particle->Charge(); if (charge>0) fTracks[eventNr*2].Add(particle); else if (charge<0) fTracks[eventNr*2+1].Add(particle); + + } } @@ -1095,6 +1119,11 @@ void AliDielectron::FillPairArrays(Int_t arr1, Int_t arr2) if (fCfManagerPair) fCfManagerPair->Fill(cutMask,candidate); //histogram array for the pair if (fHistoArray) fHistoArray->Fill(pairIndex,candidate); + // cut qa + if(pairIndex==AliDielectron::kEv1PM && fCutQA) { + fQAmonitor->FillAll(candidate); + fQAmonitor->Fill(cutMask,candidate); + } //apply cut if (cutMask!=selectedMask) continue; diff --git a/PWGDQ/dielectron/AliDielectron.h b/PWGDQ/dielectron/AliDielectron.h index d53c1888b83..116f1918075 100644 --- a/PWGDQ/dielectron/AliDielectron.h +++ b/PWGDQ/dielectron/AliDielectron.h @@ -24,6 +24,7 @@ #include "AliDielectronHistos.h" #include "AliDielectronHF.h" +#include "AliDielectronCutQA.h" class AliEventplane; class AliVEvent; @@ -74,6 +75,7 @@ public: Int_t GetLeg1Pdg() const { return fPdgLeg1; } Int_t GetLeg2Pdg() const { return fPdgLeg2; } + void SetCutQA(Bool_t qa=kTRUE) { fCutQA=qa; } void SetNoPairing(Bool_t noPairing=kTRUE) { fNoPairing=noPairing; } void SetUseKF(Bool_t useKF=kTRUE) { fUseKF=useKF; } const TObjArray* GetTrackArray(Int_t i) const {return (i>=0&&i<4)?&fTracks[i]:0;} @@ -83,6 +85,7 @@ public: TObjArray** GetPairArraysPointer() { return &fPairCandidates; } void SetHistogramArray(AliDielectronHF * const histoarray) { fHistoArray=histoarray; } const TObjArray * GetHistogramArray() const { return fHistoArray?fHistoArray->GetHistArray():0x0; } + const TObjArray * GetQAHistArray() const { return fQAmonitor?fQAmonitor->GetQAHistArray():0x0; } void SetHistogramManager(AliDielectronHistos * const histos) { fHistos=histos; } AliDielectronHistos* GetHistoManager() const { return fHistos; } @@ -130,7 +133,9 @@ public: void SaveDebugTree(); private: - + + Bool_t fCutQA; // monitor cuts + AliDielectronCutQA *fQAmonitor; // monitoring of cuts AliAnalysisFilter fEventFilter; // Event cuts AliAnalysisFilter fTrackFilter; // leg cuts AliAnalysisFilter fPairPreFilter; // pair prefilter cuts diff --git a/PWGDQ/dielectron/AliDielectronCutQA.cxx b/PWGDQ/dielectron/AliDielectronCutQA.cxx new file mode 100644 index 00000000000..5f780faba7d --- /dev/null +++ b/PWGDQ/dielectron/AliDielectronCutQA.cxx @@ -0,0 +1,247 @@ +/************************************************************************* + * Copyright(c) 1998-2009, 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. * + **************************************************************************/ + +////////////////////////////////////////////////////////////////////////// +// CutQA // +// // +/* + Allow to monitor how many tracks,pair,events pass the selection criterion + in any of the cuts added to the corresponding filters. All you need to + add to your config is the following: + + dielectron->SetCutQA(); + + +*/ +// // +////////////////////////////////////////////////////////////////////////// + +#include "AliDielectronCutQA.h" + +#include +#include + +#include "AliDielectronCutGroup.h" +#include "AliAnalysisCuts.h" + +#include "AliVEvent.h" +#include "AliVParticle.h" +#include "AliVTrack.h" +#include "AliDielectronPair.h" + + +ClassImp(AliDielectronCutQA) + + +AliDielectronCutQA::AliDielectronCutQA() : + TNamed(), + fQAHistArray(0x0) +{ + // + // Default constructor + // + for(Int_t itype=0; itypeGetXaxis()->SetBinLabel(i+1,fCutNames[i][itype]); + // printf(" %s \n",fCutNames[i][itype]); + } + fQAHistArray.AddLast(fCutQA[itype]); + } + +} + +//_____________________________________________________________________ +void AliDielectronCutQA::AddTrackFilter(AliAnalysisFilter *trackFilter) +{ + // + // add track filter cuts to the qa histogram + // + + + TIter listIterator(trackFilter->GetCuts()); + while (AliAnalysisCuts *thisCut = (AliAnalysisCuts*) listIterator()) { + Bool_t addCut=kTRUE; + + // add new cut class to the array + if(addCut) { + fCutNames[fNCuts[kTrack]][kTrack]=thisCut->GetTitle(); + // printf("add cut %s to %d \n",thisCut->GetTitle(),fNCuts[kTrack]); + fNCuts[kTrack]++; + } + + } // pair filter loop + +} + + +//_____________________________________________________________________ +void AliDielectronCutQA::AddPairFilter(AliAnalysisFilter *pairFilter) +{ + // + // add track filter cuts to the qa histogram + // + + + TIter listIterator(pairFilter->GetCuts()); + while (AliAnalysisCuts *thisCut = (AliAnalysisCuts*) listIterator()) { + Bool_t addCut=kTRUE; + + // add new cut class to the array + if(addCut) { + fCutNames[fNCuts[kPair]][kPair]=thisCut->GetTitle(); + // printf("add cut %s to %d \n",thisCut->GetTitle(),fNCuts[kPair]); + fNCuts[kPair]++; + } + + } // trk filter loop + +} + +//_____________________________________________________________________ +void AliDielectronCutQA::AddEventFilter(AliAnalysisFilter *eventFilter) +{ + // + // add track filter cuts to the qa histogram + // + + + TIter listIterator(eventFilter->GetCuts()); + while (AliAnalysisCuts *thisCut = (AliAnalysisCuts*) listIterator()) { + Bool_t addCut=kTRUE; + + // add new cut class to the array + if(addCut) { + fCutNames[fNCuts[kEvent]][kEvent]=thisCut->GetTitle(); + // printf("add cut %s to %d \n",thisCut->GetTitle(),fNCuts[kEvent]); + fNCuts[kEvent]++; + } + + } // trk filter loop + +} + +//_____________________________________________________________________ +void AliDielectronCutQA::Fill(UInt_t mask, TObject *obj) +{ + // + // fill the corresponding step in the qa histogram + // + + UInt_t idx = GetObjIndex(obj); + + Int_t cutstep=1; + for (Int_t iCut=0; iCutFill(cutstep); + ++cutstep; + } + + } + +} + +//_____________________________________________________________________ +void AliDielectronCutQA::FillAll(TObject *obj) +{ + // + // fill the corresponding step in the qa histogram + // + + UInt_t idx = GetObjIndex(obj); + fCutQA[idx]->Fill(0); + +} + +//______________________________________________________________________ +UInt_t AliDielectronCutQA::GetObjIndex(TObject *obj) +{ + // + // return the corresponding idex + // + + if(obj->InheritsFrom(AliVTrack::Class()) ) return kTrack; + if(obj->InheritsFrom(AliVParticle::Class()) ) return kTrack; + if(obj->InheritsFrom(AliDielectronPair::Class())) return kPair; + if(obj->InheritsFrom(AliVEvent::Class()) ) return kEvent; + printf("FATAL: object type %s not yet supported, please let the author know\n", obj->IsA()->GetName()); + return -1; + //TODO complete + +} + + + + diff --git a/PWGDQ/dielectron/AliDielectronCutQA.h b/PWGDQ/dielectron/AliDielectronCutQA.h new file mode 100644 index 00000000000..ff055c1e07c --- /dev/null +++ b/PWGDQ/dielectron/AliDielectronCutQA.h @@ -0,0 +1,65 @@ +#ifndef ALIDIELECTRONCUTQA_H +#define ALIDIELECTRONCUTQA_H + +/* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. * + * See cxx source for full Copyright notice */ + +//################################################################# +//# # +//# Class AliDielectronCutQA # +//# Dielectron Group of cuts # +//# # +//# Authors: # +//# Julian Book, Uni Ffm / Julian.Book@cern.ch # +//# # +//################################################################# + +#include +#include +#include +#include +#include + +class TCollection; + +class AliDielectronCutQA : public TNamed { + +public: + enum { kTrack=0, kPair, kEvent, kNtypes }; + + AliDielectronCutQA(); + AliDielectronCutQA(const char*name, const char* title); + + virtual ~AliDielectronCutQA(); + + //Analysis cuts interface + // + void Init(); + void AddTrackFilter( AliAnalysisFilter *trkFilter); + /* void AddPrePairFilter( AliAnalysisFilter *prePairFilter); */ + /* void AddPrePairLegFilter(AliAnalysisFilter *prePairLegFilter); */ + void AddPairFilter( AliAnalysisFilter *pairFilter); + void AddEventFilter( AliAnalysisFilter *eventFilter); + + // void Fill(AliAnalysisCuts *cut); + void Fill(UInt_t mask, TObject *obj); + void FillAll(TObject *obj);// { fCutQA->Fill(0); } + + const TObjArray * GetQAHistArray() const { return &fQAHistArray; } + + +private: + + TObjArray fQAHistArray; //-> array of QA histograms + TH1F *fCutQA[kNtypes]; // qa histogram + Int_t fNCuts[kNtypes]; // number of cuts + const char* fCutNames[20][kNtypes]; // cut names + const char* fTypeKeys[kNtypes]; // type names + + + UInt_t GetObjIndex(TObject *obj); // return object index + + ClassDef(AliDielectronCutQA,1) //Group of cuts +}; + +#endif diff --git a/PWGDQ/dielectron/AliDielectronV0Cuts.cxx b/PWGDQ/dielectron/AliDielectronV0Cuts.cxx index ad68d85c223..777348df5af 100644 --- a/PWGDQ/dielectron/AliDielectronV0Cuts.cxx +++ b/PWGDQ/dielectron/AliDielectronV0Cuts.cxx @@ -225,6 +225,7 @@ void AliDielectronV0Cuts::InitEvent(AliVTrack *trk) } else if(ev->IsA() == AliAODEvent::Class()) { const AliAODEvent *aodEv = static_cast(ev); + if(!aodEv->GetV0s()) return; // protection for nano AODs // loop over vertices for (Int_t ivertex=0; ivertexGetNumberOfV0s(); ++ivertex){