#pragma link C++ class AliAnalysisTaskDielectronEfficiency+;
#pragma link C++ class AliAnalysisTaskMultiDielectron+;
#pragma link C++ class AliDielectronVarCuts+;
+#pragma link C++ class AliDielectronTrackCuts+;
#pragma link C++ class AliDielectronPairLegCuts+;
#pragma link C++ class AliDielectronSignalBase+;
#pragma link C++ class AliDielectronSignalFunc+;
fNBinsLeg[i]=0;
fVarLoLimitLeg[i]=0.;
fVarUpLimitLeg[i]=0.;
- fVarBinLimits[i]=0x0;
fStepMasks[i]=0xFFFFFF;
}
}
// TCollection(),
TNamed("AliDielectronHistos","Dielectron Histogram Container"),
fHistoList(),
+ fList(0x0),
fReservedWords(new TString)
{
//
// TCollection(),
TNamed(name, title),
fHistoList(),
+ fList(0x0),
fReservedWords(new TString)
{
//
return (TH1*)classTable->FindObject(name);
}
+//_____________________________________________________________________________
+TH1* AliDielectronHistos::GetHistogram(const char* cutClass, const char* histClass, const char* name) const
+{
+ //
+ // return histogram from list of list of histograms
+ // this function is thought for retrieving histograms if a list of AliDielectronHistos is set
+ //
+
+ if (!fList) return 0x0;
+ THashList *h=dynamic_cast<THashList*>(fList->FindObject(cutClass));
+ if (!h)return 0x0;
+ THashList *classTable=dynamic_cast<THashList*>(h->FindObject(histClass));
+ if (!classTable) return 0x0;
+ return (TH1*)classTable->FindObject(name);
+}
+
//_____________________________________________________________________________
void AliDielectronHistos::Draw(const Option_t* option)
{
delete arr;
drawStr.ToLower();
- //options
+ //optionsfList
// Bool_t same=drawOpt.Contains("same"); //FIXME not yet implemented
TCanvas *c=0x0;
//
// Print classes and histograms in the class to stdout
//
- TIter nextClass(&fHistoList);
- THashList *classTable=0;
- while ( (classTable=(THashList*)nextClass()) ){
- TIter nextHist(classTable);
- TObject *o=0;
- printf("+ %s\n",classTable->GetName());
- while ( (o=nextHist()) )
- printf("| ->%s\n",o->GetName());
+ if (!fList){
+ TIter nextClass(&fHistoList);
+ THashList *classTable=0;
+ while ( (classTable=(THashList*)nextClass()) ){
+ TIter nextHist(classTable);
+ TObject *o=0;
+ printf("+ %s\n",classTable->GetName());
+ while ( (o=nextHist()) )
+ printf("| ->%s\n",o->GetName());
+ }
+ } else {
+ TIter nextCutClass(fList);
+ THashList *cutClass=0x0;
+ while ( (cutClass=(THashList*)nextCutClass()) ) {
+ printf("+ %s\n",cutClass->GetName());
+ TIter nextClass(cutClass);
+ THashList *classTable=0;
+ while ( (classTable=(THashList*)nextClass()) ){
+ TIter nextHist(classTable);
+ TObject *o=0;
+ printf("| + %s\n",classTable->GetName());
+ while ( (o=nextHist()) )
+ printf("| | ->%s\n",o->GetName());
+ }
+
+ }
}
-
}
//_____________________________________________________________________________
-void AliDielectronHistos::SetHistogramList(THashList &list)
+void AliDielectronHistos::SetHistogramList(THashList &list, Bool_t setOwner/*=kTRUE*/)
{
//
// set histogram classes and histograms to this instance. It will take onwnership!
while ( (o=next()) ){
fHistoList.Add(o);
}
- list.SetOwner(kFALSE);
- fHistoList.SetOwner(kTRUE);
+ if (setOwner){
+ list.SetOwner(kFALSE);
+ fHistoList.SetOwner(kTRUE);
+ }
+}
+
+//_____________________________________________________________________________
+Bool_t AliDielectronHistos::SetCutClass(const char* cutClass)
+{
+ //
+ // Assign histogram list according to cutClass
+ //
+
+ if (!fList) return kFALSE;
+ ResetHistogramList();
+ THashList *h=dynamic_cast<THashList*>(fList->FindObject(cutClass));
+ if (!h) {
+ Warning("SetCutClass","cutClass '%s' not found", cutClass);
+ return kFALSE;
+ }
+ SetHistogramList(*h,kFALSE);
+ return kTRUE;
}
//_____________________________________________________________________________
class TH1;
class TString;
+class TList;
// class TVectorT<double>;
class AliDielectronHistos : public TNamed {
TH1* GetHistogram(const char* histClass, const char* name) const;
-
- void SetHistogramList(THashList &list);
+ TH1* GetHistogram(const char* cutClass, const char* histClass, const char* name) const;
+
+ void SetHistogramList(THashList &list, Bool_t setOwner=kTRUE);
void ResetHistogramList(){fHistoList.Clear();}
const THashList* GetHistogramList() const {return &fHistoList;}
-
+
+ void SetList(TList * const list) { fList=list; }
+ TList *GetList() const { return fList; }
+
void AddClass(const char* histClass);
void DumpToFile(const char* file="histos.root");
// virtual TIterator *MakeIterator(Bool_t dir = kIterForward) const ;
// virtual TObject *Remove(TObject *obj) { return 0; }
+ Bool_t SetCutClass(const char* cutClass);
+
private:
THashList fHistoList; //-> list of histograms
+ TList *fList; //! List of list of histograms
TString *fReservedWords; //! list of reserved words
void UserHistogramReservedWords(const char* histClass, TH1 *hist, UInt_t valTypes);
AliDielectronHistos(const AliDielectronHistos &hist);
AliDielectronHistos& operator = (const AliDielectronHistos &hist);
- ClassDef(AliDielectronHistos,1)
+ ClassDef(AliDielectronHistos,2)
};
#endif
#include <TMath.h>
#include <TF1.h>
-#include <AliVParticle.h>
+#include <AliVTrack.h>
#include <AliLog.h>
#include <AliESDtrack.h>
//
//loop over all cuts
- AliVParticle *part=static_cast<AliVParticle*>(track);
+ AliVTrack *part=static_cast<AliVTrack*>(track);
//TODO: Which momentum to use?
// Different momenta for different detectors?
Double_t mom=part->P();
}
//______________________________________________
-Bool_t AliDielectronPID::IsSelectedITS(AliVParticle * const part, Int_t icut) const
+Bool_t AliDielectronPID::IsSelectedITS(AliVTrack * const part, Int_t icut) const
{
//
// ITS part of the PID check
//
Float_t numberOfSigmas=-1000.;
+ if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&!(part->GetStatus()&AliESDtrack::kITSpid)) return kFALSE;
+ if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&!(part->GetStatus()&AliESDtrack::kITSpid)) return kTRUE;
+
if (part->IsA()==AliESDtrack::Class()){
// ESD case in case the PID bit is not set, don't use this track!
AliESDtrack *track=static_cast<AliESDtrack*>(part);
- if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&!(track->GetStatus()&AliESDtrack::kITSpid)) return kFALSE;
- if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&!(track->GetStatus()&AliESDtrack::kITSpid)) return kTRUE;
numberOfSigmas=fESDpid->NumberOfSigmasITS(track, fPartType[icut]);
}else{
}
//______________________________________________
-Bool_t AliDielectronPID::IsSelectedTPC(AliVParticle * const part, Int_t icut) const
+Bool_t AliDielectronPID::IsSelectedTPC(AliVTrack * const part, Int_t icut) const
{
//
// TPC part of the PID check
}
//______________________________________________
-Bool_t AliDielectronPID::IsSelectedTRD(AliVParticle * const /*part*/, Int_t /*icut*/) const
+Bool_t AliDielectronPID::IsSelectedTRD(AliVTrack * const /*part*/, Int_t /*icut*/) const
{
//
// TRD part of the pid check
}
//______________________________________________
-Bool_t AliDielectronPID::IsSelectedTOF(AliVParticle * const part, Int_t icut) const
+Bool_t AliDielectronPID::IsSelectedTOF(AliVTrack * const part, Int_t icut) const
{
//
// TOF part of the PID check
// TOF 5 sigma inclusion if TOFpid available
// this should reduce K,p,Pi to a large extent
TF1 *lowerCut=new TF1("lowerCut", "[0] * TMath::Exp([1]*x)", 0, 100);
- lowerCut->SetParameters(-2.7,-0.4357);
- AddCut(kTPC,AliPID::kElectron,lowerCut,3.);
+ lowerCut->SetParameters(-2.65,-0.6757);
+ AddCut(kTPC,AliPID::kElectron,lowerCut,4.);
AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
} else if (def==10) {
AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
#include <AliAnalysisCuts.h>
class TF1;
-
class TList;
+class AliVTrack;
class AliDielectronPID : public AliAnalysisCuts {
public:
AliESDpid *fESDpid; //! esd pid object
- Bool_t IsSelectedITS(AliVParticle * const part, Int_t icut) const;
- Bool_t IsSelectedTPC(AliVParticle * const part, Int_t icut) const;
- Bool_t IsSelectedTRD(AliVParticle * const part, Int_t icut) const;
- Bool_t IsSelectedTOF(AliVParticle * const part, Int_t icut) const;
+ Bool_t IsSelectedITS(AliVTrack * const part, Int_t icut) const;
+ Bool_t IsSelectedTPC(AliVTrack * const part, Int_t icut) const;
+ Bool_t IsSelectedTRD(AliVTrack * const part, Int_t icut) const;
+ Bool_t IsSelectedTOF(AliVTrack * const part, Int_t icut) const;
Float_t NumberOfSigmasITS(const AliAODTrack *track, AliPID::EParticleType type) const;
Float_t NumberOfSigmasTPC(const AliAODTrack *track, AliPID::EParticleType type) const;
--- /dev/null
+/*************************************************************************
+* 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. *
+**************************************************************************/
+
+///////////////////////////////////////////////////////////////////////////
+// Dielectron TrackCuts //
+// //
+// //
+/*
+Detailed description
+
+
+*/
+// //
+///////////////////////////////////////////////////////////////////////////
+
+
+
+#include "AliDielectronTrackCuts.h"
+#include "AliVTrack.h"
+
+ClassImp(AliDielectronTrackCuts)
+
+AliDielectronTrackCuts::AliDielectronTrackCuts() :
+ AliAnalysisCuts(),
+ fV0DaughterCut(0),
+ fRequireITSRefit(kFALSE),
+ fRequireTPCRefit(kFALSE)
+{
+ //
+ // Default Constructor
+ //
+
+ for (Int_t i = 0; i < 3; i++)
+ fCutClusterRequirementITS[i] = kOff;
+
+}
+
+//______________________________________________
+AliDielectronTrackCuts::AliDielectronTrackCuts(const char* name, const char* title) :
+ AliAnalysisCuts(name, title),
+ fV0DaughterCut(0),
+ fRequireITSRefit(kFALSE),
+ fRequireTPCRefit(kFALSE)
+{
+ //
+ // Named Constructor
+ //
+
+ for (Int_t i = 0; i < 3; i++)
+ fCutClusterRequirementITS[i] = kOff;
+
+}
+
+//______________________________________________
+AliDielectronTrackCuts::~AliDielectronTrackCuts()
+{
+ //
+ // Default Destructor
+ //
+
+}
+
+//______________________________________________
+Bool_t AliDielectronTrackCuts::IsSelected(TObject* track)
+{
+ //
+ // Apply configured cuts
+ //
+
+ AliVTrack *vtrack=dynamic_cast<AliVTrack*>(track);
+ if (!vtrack) return kFALSE;
+
+ Bool_t accept=kTRUE;
+ if (fV0DaughterCut) {
+ accept*=track->TestBit(BIT(fV0DaughterCut));
+ }
+
+ for (Int_t i=0;i<3;++i){
+ Bool_t layer1=TESTBIT(vtrack->GetITSClusterMap(),i*2);
+ Bool_t layer2=TESTBIT(vtrack->GetITSClusterMap(),i*2+1);
+ accept*=CheckITSClusterRequirement(fCutClusterRequirementITS[i], layer1, layer2);
+ }
+
+ if (fRequireITSRefit) accept*=(vtrack->GetStatus()&kITSrefit)>0;
+ if (fRequireTPCRefit) accept*=(vtrack->GetStatus()&kTPCrefit)>0;
+
+ return accept;
+}
+
+//______________________________________________
+void AliDielectronTrackCuts::SetV0DaughterCut(AliPID::EParticleType type)
+{
+ //
+ // Set V0 Daughter cut bit
+ //
+ const Int_t bitMap[5] = {14, -1, 15, -1, 16}; // convert the AliPID to bit positions
+ fV0DaughterCut=bitMap[type];
+}
+
+//____________________________________________________________________
+Bool_t AliDielectronTrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2) const
+{
+ // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
+
+ switch (req)
+ {
+ case kOff: return kTRUE;
+ case kNone: return !clusterL1 && !clusterL2;
+ case kAny: return clusterL1 || clusterL2;
+ case kFirst: return clusterL1;
+ case kOnlyFirst: return clusterL1 && !clusterL2;
+ case kSecond: return clusterL2;
+ case kOnlySecond: return clusterL2 && !clusterL1;
+ case kBoth: return clusterL1 && clusterL2;
+ }
+
+ return kFALSE;
+}
+
--- /dev/null
+#ifndef ALIDIELECTRONTRACKCUTS_H
+#define ALIDIELECTRONTRACKCUTS_H
+
+/* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+//#############################################################
+//# #
+//# Class AliDielectronTrackCuts #
+//# #
+//# Authors: #
+//# Anton Andronic, GSI / A.Andronic@gsi.de #
+//# Ionut C. Arsene, GSI / I.C.Arsene@gsi.de #
+//# Julian Book, Uni Ffm / Julian.Book@cern.ch #
+//# Frederick Kramer, Uni Ffm, / Frederick.Kramer@cern.ch #
+//# Magnus Mager, CERN / Magnus.Mager@cern.ch #
+//# WooJin J. Park, GSI / W.J.Park@gsi.de #
+//# Jens Wiechula, Uni Tü / Jens.Wiechula@cern.ch #
+//# #
+//#############################################################
+
+#include <AliPID.h>
+#include <AliAnalysisCuts.h>
+
+class AliDielectronTrackCuts : public AliAnalysisCuts {
+public:
+ enum ITSClusterRequirement { kOff = 0, kNone, kAny, kFirst, kOnlyFirst, kSecond, kOnlySecond, kBoth };
+ enum Detector { kSPD = 0, kSDD, kSSD };
+
+ enum {
+ kITSin=0x0001,kITSout=0x0002,kITSrefit=0x0004,kITSpid=0x0008,
+ kTPCin=0x0010,kTPCout=0x0020,kTPCrefit=0x0040,kTPCpid=0x0080,
+ kTRDin=0x0100,kTRDout=0x0200,kTRDrefit=0x0400,kTRDpid=0x0800,
+ kTOFin=0x1000,kTOFout=0x2000,kTOFrefit=0x4000,kTOFpid=0x8000,
+ kHMPIDout=0x10000,kHMPIDpid=0x20000
+ };
+
+ AliDielectronTrackCuts();
+ AliDielectronTrackCuts(const char*name, const char* title);
+
+ virtual ~AliDielectronTrackCuts();
+
+ void SetV0DaughterCut(AliPID::EParticleType type);
+ void SetClusterRequirementITS(Detector det, ITSClusterRequirement req = kOff) { fCutClusterRequirementITS[det] = req; }
+
+ void SetRequireITSRefit(Bool_t req) { fRequireITSRefit=req; }
+ void SetRequireTPCRefit(Bool_t req) { fRequireTPCRefit=req; }
+
+ Int_t GetV0DaughterCut() const { return fV0DaughterCut; }
+ ITSClusterRequirement GetClusterRequirementITS(Detector det) const { return fCutClusterRequirementITS[det]; }
+
+ //
+ //Analysis cuts interface
+ //
+ virtual Bool_t IsSelected(TObject* track);
+ virtual Bool_t IsSelected(TList* /* list */ ) {return kFALSE;}
+
+
+private:
+
+ AliDielectronTrackCuts(const AliDielectronTrackCuts &c);
+ AliDielectronTrackCuts &operator=(const AliDielectronTrackCuts &c);
+
+ Int_t fV0DaughterCut; // Bit for V0 daughter selection
+ ITSClusterRequirement fCutClusterRequirementITS[3]; // detailed ITS cluster requirements for (SPD, SDD, SSD)
+
+ Bool_t fRequireITSRefit; // require ITS refit
+ Bool_t fRequireTPCRefit; // require TPC refit
+
+ Bool_t CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2) const;
+
+ ClassDef(AliDielectronTrackCuts,1) // Dielectron TrackCuts
+};
+
+
+
+#endif
Double_t pidProbs[AliPID::kSPECIES];
// Fill AliESDtrack interface specific information
- Double_t tpcNcls=particle->GetNcls(1);
+ Double_t tpcNcls=particle->GetTPCNcls();
values[AliDielectronVarManager::kNclsITS] = particle->GetNcls(0); // TODO: get rid of the plain numbers
values[AliDielectronVarManager::kNclsTPC] = tpcNcls; // TODO: get rid of the plain numbers
values[AliDielectronVarManager::kNFclsTPC] = particle->GetTPCNclsF();
// Reset AliESDtrack interface specific information
values[AliDielectronVarManager::kNclsITS] = 0;
- values[AliDielectronVarManager::kNclsTPC] = 0;
+ values[AliDielectronVarManager::kNclsTPC] = particle->GetTPCNcls();
values[AliDielectronVarManager::kNFclsTPC] = 0;
values[AliDielectronVarManager::kNclsTRD] = 0;
values[AliDielectronVarManager::kTRDntracklets] = 0;
values[AliDielectronVarManager::kTRDprobPio] = 0;
//TODO: This is only an approximation!!!
- values[AliDielectronVarManager::kTPCsignalN] = particle->GetTPCClusterMap().CountBits();
+ values[AliDielectronVarManager::kTPCsignalN] = values[AliDielectronVarManager::kNclsTPC];
// Fill AliAODTrack interface information
// ...
Double_t tpcNsigmaPro=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]),AliPID::kProton);
- values[AliDielectronVarManager::kPIn]=pid->GetTPCmomentum();
+ values[AliDielectronVarManager::kPIn]=mom;
values[AliDielectronVarManager::kTPCsignal]=pid->GetTPCsignal();
values[AliDielectronVarManager::kTPCnSigmaEle]=tpcNsigmaEle;
}
TString configFile("$ALICE_ROOT/PWG3/dielectron/macros/ConfigJpsi2eeData.C");
-// if (mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class()){
-// ::Info("AddTaskJPSI", "Using AOD configuration");
-// configFile="$ALICE_ROOT/PWG3/dielectron/macros/ConfigJpsi2eeDataAOD.C";
-// }
+ Bool_t isAOD=mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class();
//create task and add it to the manager
AliAnalysisTaskMultiDielectron *task=new AliAnalysisTaskMultiDielectron("MultiDie");
//add dielectron analysis with different cuts to the task
for (Int_t i=0; i<nDie; ++i){ //nDie defined in config file
- AliDielectron *jpsi=ConfigJpsi2ee(i);
+ AliDielectron *jpsi=ConfigJpsi2ee(i,isAOD);
task->AddDielectron(jpsi);
}
//get the current analysis manager
AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
if (!mgr) {
- Error("AddTask_jpsi_DielectronFilter", "No analysis manager found.");
- return 0;
- }
- // currently don't accept AOD input
- if (mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class()) {
- Warning("AddTask_jpsi_JPsi","No AOD input supported currently. Not adding the task!");
+ Error("AddTaskJPSIFilter", "No analysis manager found.");
return 0;
}
+
//check for output aod handler
if (!mgr->GetOutputEventHandler()||mgr->GetOutputEventHandler()->IsA()!=AliAODHandler::Class()) {
- Warning("AddTask_jpsi_DielectronFilter","No AOD output handler available. Not adding the task!");
+ Warning("AddTaskJPSIFilter","No AOD output handler available. Not adding the task!");
return 0;
}
//Do we have an MC handler?
Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
-
+
+ //Do we run on AOD?
+ Bool_t isAOD=mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class();
+
//Create task and add it to the analysis manager
AliAnalysisTaskDielectronFilter *task=new AliAnalysisTaskDielectronFilter("jpsi_DielectronFilter");
gROOT->LoadMacro("$ALICE_ROOT/PWG3/dielectron/macros/ConfigJpsi2eeFilter.C");
- AliDielectron *jpsi=ConfigJpsi2eeFilter();
+ AliDielectron *jpsi=ConfigJpsi2eeFilter(isAOD);
if (!hasMC) task->UsePhysicsSelection();
task->SetDielectron(jpsi);
mgr->AddTask(task);
AliAnalysisManager::kOutputContainer,
containerName.Data());
+
mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
mgr->ConnectOutput(task, 1, cOutputHist1);
mgr->ConnectOutput(task, 2, cOutputHist2);
-
+
return task;
}
-void InitHistograms(AliDielectron *die, Int_t cutDefinition);
-void InitCF(AliDielectron* die, Int_t cutDefinition);
-void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition);
-void SetupPairCuts(AliDielectron *die, Int_t cutDefinition);
+void SetupTrackCuts();
+void SetupPairCuts();
+void InitHistograms();
+void InitCF();
-AliESDtrackCuts *SetupESDtrackCuts(Int_t cutDefinition);
+AliESDtrackCuts *SetupESDtrackCuts();
TString names=("basicQ+SPDfirst+pt>.6+PID");
const Int_t nDie=arrNames->GetEntries();
-AliDielectron* ConfigJpsi2ee(Int_t cutDefinition)
+AliDielectron *fDiele=0x0;
+Int_t fCutDefinition=0;
+Bool_t fIsAOD=kFALSE;
+
+AliDielectron* ConfigJpsi2ee(Int_t fCutDefinition, Bool_t isAOD)
{
//
// Setup the instance of AliDielectron
//
+ fCutDefinition=fCutDefinition;
+ fIsAOD=isAOD;
+
// create the actual framework object
- TString name=Form("%02d",cutDefinition);
- if (cutDefinition<arrNames->GetEntriesFast()){
- name=arrNames->At(cutDefinition)->GetName();
+ TString name=Form("%02d",fCutDefinition);
+ if (fCutDefinition<arrNames->GetEntriesFast()){
+ name=arrNames->At(fCutDefinition)->GetName();
}
- AliDielectron *die =
- new AliDielectron(Form("%s",name.Data()),
- Form("Track cuts: %s",name.Data()));
+ fDiele = new AliDielectron(Form("%s",name.Data()),
+ Form("Track cuts: %s",name.Data()));
-
// cut setup
- SetupTrackCuts(die,cutDefinition);
- SetupPairCuts(die,cutDefinition);
+ SetupTrackCuts();
+ SetupPairCuts();
//
// histogram setup
// only if an AliDielectronHistos object is attached to the
- // dielectron framework histograms will be filled
+ // fDielelectron framework histograms will be filled
//
- InitHistograms(die,cutDefinition);
+ InitHistograms();
// the last definition uses no cuts and only the QA histograms should be filled!
-// if (cutDefinition<nDie-1)
- InitCF(die,cutDefinition);
+// if (fCutDefinition<nDie-1)
+ InitCF();
- return die;
+ return fDiele;
}
//______________________________________________________________________________________
-void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition)
+void SetupTrackCuts()
{
//
// Setup the track cuts
//
- //ESD quality cuts
- die->GetTrackFilter().AddCuts(SetupESDtrackCuts(cutDefinition));
+ //ESD quality cuts DielectronTrackCuts
+ if (!fIsAOD) {
+ fDiele->GetTrackFilter().AddCuts(SetupESDtrackCuts());
+ } else {
+ AliDielectronTrackCuts *trackCuts=new AliDielectronTrackCuts("trackCuts","trackCuts");
+ trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
+ trackCuts->SetRequireTPCRefit(kTRUE);
+ trackCuts->SetRequireITSRefit(kTRUE);
+ fDiele->GetTrackFilter().AddCuts(trackCuts);
+ }
- if(cutDefinition==0) {
+ if(fCutDefinition==0) {
//Pt cut ----------------------------------------------------------
AliDielectronVarCuts *pt = new AliDielectronVarCuts("ptCut","pt cut");
pt->AddCut(AliDielectronVarManager::kPt,0.6,1e30);
- die->GetTrackFilter().AddCuts(pt);
+
+ //AOD additions since there are no AliESDtrackCuts -----------------
+ //
+ if (fIsAOD){
+ // TPC #clusteres cut
+ pt->AddCut(AliDielectronVarManager::kNclsTPC,90.,160.);
+ pt->AddCut(AliDielectronVarManager::kEta,-0.8,0.8);
+ //TODO: DCA cuts to be investigated!!!
+// pt->AddCut(AliDielectronVarManager::kImpactParXY,-1.,1.);
+// pt->AddCut(AliDielectronVarManager::kImpactParZ,-3.,3.);
+ }
+ fDiele->GetTrackFilter().AddCuts(pt);
// PID cuts --------------------------------------------------------
AliDielectronPID *pid = new AliDielectronPID("PID10","TPC nSigma |e|<3 + |Pi|>3 + |P|>3 + TOF nSigma |e|<3");
pid->SetDefaults(10);
- die->GetTrackFilter().AddCuts(pid);
+ fDiele->GetTrackFilter().AddCuts(pid);
}
}
//______________________________________________________________________________________
-void SetupPairCuts(AliDielectron *die, Int_t cutDefinition)
+void SetupPairCuts()
{
//
// Setup the pair cuts
//
- //Invariant mass selection
- AliDielectronVarCuts *invMassCut=new AliDielectronVarCuts("2<M<4+|Y|<.8","2<M<4 + |Y|<.8");
- invMassCut->AddCut(AliDielectronVarManager::kM,2.,4.);
- invMassCut->AddCut(AliDielectronVarManager::kY,-0.8,0.8);
- die->GetPairFilter().AddCuts(invMassCut);
+ //Invariant mass and rapidity selection
+ AliDielectronVarCuts *pairCut=new AliDielectronVarCuts("2<M<4+|Y|<.8","2<M<4 + |Y|<.8");
+ pairCut->AddCut(AliDielectronVarManager::kM,2.,4.);
+ pairCut->AddCut(AliDielectronVarManager::kY,-0.8,0.8);
+ fDiele->GetPairFilter().AddCuts(pairCut);
}
//______________________________________________________________________________________
-AliESDtrackCuts *SetupESDtrackCuts(Int_t cutDefinition)
+AliESDtrackCuts *SetupESDtrackCuts()
{
//
// Setup default AliESDtrackCuts
//______________________________________________________________________________________
-void InitHistograms(AliDielectron *die, Int_t cutDefinition)
+void InitHistograms()
{
//
// Initialise the histograms
//
//Setup histogram Manager
- AliDielectronHistos *histos=new AliDielectronHistos(die->GetName(),die->GetTitle());
+ AliDielectronHistos *histos=new AliDielectronHistos(fDiele->GetName(),fDiele->GetTitle());
//Initialise histogram classes
histos->SetReservedWords("Track;Pair");
histos->UserHistogram("Pair","OpeningAngle","Opening angle;angle",
100,0.,3.15,AliDielectronVarManager::kOpeningAngle);
- die->SetHistogramManager(histos);
+ fDiele->SetHistogramManager(histos);
}
-void InitCF(AliDielectron* die, Int_t cutDefinition)
+void InitCF()
{
//
// Setupd the CF Manager if needed
//
- AliDielectronCF *cf=new AliDielectronCF(die->GetName(),die->GetTitle());
+ AliDielectronCF *cf=new AliDielectronCF(fDiele->GetName(),fDiele->GetTitle());
//pair variables
TVectorD *binLimPt=new TVectorD(6);
cf->AddVariable(AliDielectronVarManager::kPt,2,0.8,1.2,kTRUE);
cf->AddVariable(AliDielectronVarManager::kNclsTPC,3,90,120,kTRUE);
- die->SetCFManagerPair(cf);
+ fDiele->SetCFManagerPair(cf);
}
// Setup the pair cuts
//
-
- // reject conversions
- // and select mass region
- AliDielectronVarCuts *openingAngleCut=new AliDielectronVarCuts("OpeningAngle","Opening angle > 35mrad");
- openingAngleCut->AddCut(AliDielectronVarManager::kOpeningAngle,.035,4.);
- openingAngleCut->AddCut(AliDielectronVarManager::kM,2.,4.);
- die->GetPairFilter().AddCuts(openingAngleCut);
+ //Invariant mass and rapidity selection
+ AliDielectronVarCuts *pairCut=new AliDielectronVarCuts("2<M<4+|Y|<.8","2<M<4 + |Y|<.8");
+ pairCut->AddCut(AliDielectronVarManager::kM,2.,4.);
+ pairCut->AddCut(AliDielectronVarManager::kY,-0.8,0.8);
}
//______________________________________________________________________________________
+void SetupTrackCuts(AliDielectron *fDiele);
+void SetupPairCuts(AliDielectron *fDiele);
-void InitHistograms(AliDielectron *die);
-void InitCF(AliDielectron* die);
-
-void SetupTrackCuts(AliDielectron *die);
-void SetupPairCuts(AliDielectron *die);
+void InitHistograms();
AliESDtrackCuts *SetupESDtrackCuts();
-AliDielectron* ConfigJpsi2eeFilter()
+Bool_t *fIsAOD=kFALSE;
+AliDielectron *fDiele=0x0;
+
+AliDielectron* ConfigJpsi2eeFilter(Bool_t isAOD=kFALSE)
{
//
// Setup the instance of AliDielectron
//
+
+ fIsAOD=isAOD;
// create the actual framework object
- TString name="trackQ+Pt>0.5+60<dEdx<100";
- AliDielectron *die =
- new AliDielectron(Form("%s",name.Data()),
- Form("Track cuts: %s",name.Data()));
+ TString name="trackQ+Pt>0.6+60<dEdx<100";
+ fDiele = new AliDielectron(Form("%s",name.Data()),
+ Form("Track cuts: %s",name.Data()));
// cut setup
- SetupTrackCuts(die);
- SetupPairCuts(die);
+ SetupTrackCuts();
+ SetupPairCuts();
//
// QA histogram setup
//
- InitHistograms(die);
+ InitHistograms();
- return die;
+ return fDiele;
}
//______________________________________________________________________________________
-void SetupTrackCuts(AliDielectron *die)
+void SetupTrackCuts()
{
//
// Setup the track cuts
//
- //ESD quality cuts
- die->GetTrackFilter().AddCuts(SetupESDtrackCuts());
+ //ESD quality cuts DielectronTrackCuts
+ if (!fIsAOD) {
+ fDiele->GetTrackFilter().AddCuts(SetupESDtrackCuts());
+ } else {
+ AliDielectronTrackCuts *trackCuts=new AliDielectronTrackCuts("trackCuts","trackCuts");
+ trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
+ trackCuts->SetRequireTPCRefit(kTRUE);
+ trackCuts->SetRequireITSRefit(kTRUE);
+ fDiele->GetTrackFilter().AddCuts(trackCuts);
+ }
//Pt cut
AliDielectronVarCuts *pt = new AliDielectronVarCuts("Pt>.5+60<dEdx<100","Pt>.6 && 60<dEdx<100");
pt->AddCut(AliDielectronVarManager::kPt,.6,1e30);
pt->AddCut(AliDielectronVarManager::kTPCsignal,60.,100.);
+
+ if (fIsAOD){
+ // TPC #clusteres cut
+ pt->AddCut(AliDielectronVarManager::kNclsTPC,90.,160.);
+ pt->AddCut(AliDielectronVarManager::kEta,-0.8,0.8);
+ //TODO: DCA cuts to be investigated!!!
+// pt->AddCut(AliDielectronVarManager::kImpactParXY,-1.,1.);
+// pt->AddCut(AliDielectronVarManager::kImpactParZ,-3.,3.);
+ }
- die->GetTrackFilter().AddCuts(pt);
+ fDiele->GetTrackFilter().AddCuts(pt);
}
//______________________________________________________________________________________
-void SetupPairCuts(AliDielectron *die)
+void SetupPairCuts()
{
//
// Setup the pair cuts
AliDielectronVarCuts *invMassCut=new AliDielectronVarCuts("InvMass","2<M<4");
invMassCut->AddCut(AliDielectronVarManager::kM,2.,1e30);
// invMassCut->AddCut(AliDielectronVarManager::kPairType,1.);
- die->GetPairFilter().AddCuts(invMassCut);
+ fDiele->GetPairFilter().AddCuts(invMassCut);
}
//______________________________________________________________________________________
-void InitHistograms(AliDielectron *die)
+void InitHistograms()
{
//
// Initialise the histograms
//Setup histogram classes
AliDielectronHistos *histos=
- new AliDielectronHistos(die->GetName(),
- die->GetTitle());
+ new AliDielectronHistos(fDiele->GetName(),
+ fDiele->GetTitle());
//Initialise histogram classes
histos->SetReservedWords("Track;Pair");
-
//Track classes
//to fill also track info from 2nd event loop until 2
for (Int_t i=0; i<2; ++i){
histos->UserHistogram("Pair","OpeningAngle","Opening angle;angle",
100,0.,3.15,AliDielectronVarManager::kOpeningAngle);
- die->SetHistogramManager(histos);
+ fDiele->SetHistogramManager(histos);
}
c->SetAlias("NClcut","Leg1_NclsTPC>120&&Leg2_NclsTPC>120");
c->SetAlias("eleParam","Leg1_TPC_nSigma_Electrons<5&&Leg2_TPC_nSigma_Electrons<5&&Leg1_TPC_nSigma_Electrons>-2.65*exp(-0.6757*Leg1_P_InnerParam)&&Leg2_TPC_nSigma_Electrons>-2.65*exp(-0.6757*Leg2_P_InnerParam)")
-c->SetAlias("cut","PairType==1&&eleParam")
+c->SetAlias("cut","PairType==1&&eleParam&&Run<127719")
c->SetAlias("cut","1==1")
c->SetAlias("cut","NClcut")
dielectron/AliAnalysisTaskDielectronEfficiency.cxx \
dielectron/AliAnalysisTaskMultiDielectron.cxx \
dielectron/AliDielectronVarCuts.cxx \
+ dielectron/AliDielectronTrackCuts.cxx \
dielectron/AliDielectronPairLegCuts.cxx \
dielectron/AliDielectronSignalBase.cxx \
dielectron/AliDielectronSignalFunc.cxx \