]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
updates and bugfixes in preparation for the AOD filtering. New class added
authorandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 18 Sep 2010 22:32:20 +0000 (22:32 +0000)
committerandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 18 Sep 2010 22:32:20 +0000 (22:32 +0000)
for track cuts

16 files changed:
PWG3/PWG3dielectronLinkDef.h
PWG3/dielectron/AliDielectronCF.cxx
PWG3/dielectron/AliDielectronHistos.cxx
PWG3/dielectron/AliDielectronHistos.h
PWG3/dielectron/AliDielectronPID.cxx
PWG3/dielectron/AliDielectronPID.h
PWG3/dielectron/AliDielectronTrackCuts.cxx [new file with mode: 0644]
PWG3/dielectron/AliDielectronTrackCuts.h [new file with mode: 0644]
PWG3/dielectron/AliDielectronVarManager.h
PWG3/dielectron/macros/AddTaskJPSI.C
PWG3/dielectron/macros/AddTaskJPSIFilter.C
PWG3/dielectron/macros/ConfigJpsi2eeData.C
PWG3/dielectron/macros/ConfigJpsi2eeDataAOD.C
PWG3/dielectron/macros/ConfigJpsi2eeFilter.C
PWG3/dielectron/macros/MakeDataReport.C
PWG3/libPWG3dielectron.pkg

index de5755eeaeb9f412323e069c742f5f2aa4c0093f..8986b8224258713c7a8a9a1f41343e05699f05c4 100644 (file)
@@ -18,6 +18,7 @@
 #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+;
index b8a121f4e10a589085a6b01777cd4115aba017f5..3dc939da9d92e6e76585bbcdbd3abeff3af555e6 100644 (file)
@@ -82,7 +82,6 @@ AliDielectronCF::AliDielectronCF() :
     fNBinsLeg[i]=0;
     fVarLoLimitLeg[i]=0.;
     fVarUpLimitLeg[i]=0.;
-    fVarBinLimits[i]=0x0;
     fStepMasks[i]=0xFFFFFF;
   }
 }
index 4d5a605a7e6fb97576e3eb7b109069ad8470571f..7626064880e3aecb60a1ff4e33269a5c135ccbe5 100644 (file)
@@ -51,6 +51,7 @@ AliDielectronHistos::AliDielectronHistos() :
 //   TCollection(),
   TNamed("AliDielectronHistos","Dielectron Histogram Container"),
   fHistoList(),
+  fList(0x0),
   fReservedWords(new TString)
 {
   //
@@ -65,6 +66,7 @@ AliDielectronHistos::AliDielectronHistos(const char* name, const char* title) :
 //   TCollection(),
   TNamed(name, title),
   fHistoList(),
+  fList(0x0),
   fReservedWords(new TString)
 {
   //
@@ -388,6 +390,22 @@ TH1* AliDielectronHistos::GetHistogram(const char* histClass, const char* name)
   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)
 {
@@ -418,7 +436,7 @@ 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;
@@ -509,20 +527,37 @@ void AliDielectronHistos::PrintStructure() const
   //
   // 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!
@@ -535,8 +570,28 @@ void AliDielectronHistos::SetHistogramList(THashList &list)
   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;
 }
 
 //_____________________________________________________________________________
index 3e47ca9f409811f019e18199a2fdcd093305d0f7..0c8a0e748bc8e93a50f7add0f6f2db4b5b5b1803 100644 (file)
@@ -20,6 +20,7 @@
 
 class TH1;
 class TString;
+class TList;
 // class TVectorT<double>;
 
 class AliDielectronHistos : public TNamed {
@@ -56,11 +57,15 @@ public:
 
   
   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");
@@ -78,8 +83,11 @@ public:
 //   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);
@@ -98,7 +106,7 @@ private:
   AliDielectronHistos(const AliDielectronHistos &hist);
   AliDielectronHistos& operator = (const AliDielectronHistos &hist);
 
-  ClassDef(AliDielectronHistos,1)
+  ClassDef(AliDielectronHistos,2)
 };
 
 #endif
index 370deb295e55e895928411aabab173d1105e6d9e..17688a354bf49e59276d6a12078b3099c510c9c9 100644 (file)
@@ -28,7 +28,7 @@ Detailed description
 #include <TMath.h>
 #include <TF1.h>
 
-#include <AliVParticle.h>
+#include <AliVTrack.h>
 #include <AliLog.h>
 #include <AliESDtrack.h>
 
@@ -180,7 +180,7 @@ Bool_t AliDielectronPID::IsSelected(TObject* track)
   //
 
   //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();
@@ -220,7 +220,7 @@ Bool_t AliDielectronPID::IsSelected(TObject* track)
 }
 
 //______________________________________________
-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
@@ -228,11 +228,12 @@ Bool_t AliDielectronPID::IsSelectedITS(AliVParticle * const part, Int_t icut) co
   //
   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{
@@ -246,7 +247,7 @@ Bool_t AliDielectronPID::IsSelectedITS(AliVParticle * const part, Int_t icut) co
 }
 
 //______________________________________________
-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
@@ -273,7 +274,7 @@ Bool_t AliDielectronPID::IsSelectedTPC(AliVParticle * const part, Int_t icut) co
 }
 
 //______________________________________________
-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
@@ -282,7 +283,7 @@ Bool_t AliDielectronPID::IsSelectedTRD(AliVParticle * const /*part*/, Int_t /*ic
 }
 
 //______________________________________________
-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
@@ -388,8 +389,8 @@ void AliDielectronPID::SetDefaults(Int_t def){
     // 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);
index c080581d2d1e1f65b6fba3d7a145d359eb9889b9..67530cfb64094ef2bd983008b14f184f0f9c9165 100644 (file)
@@ -27,8 +27,8 @@
 #include <AliAnalysisCuts.h>
 
 class TF1;
-
 class TList;
+class AliVTrack;
 
 class AliDielectronPID : public AliAnalysisCuts {
 public:
@@ -78,10 +78,10 @@ private:
   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;
diff --git a/PWG3/dielectron/AliDielectronTrackCuts.cxx b/PWG3/dielectron/AliDielectronTrackCuts.cxx
new file mode 100644 (file)
index 0000000..07294f7
--- /dev/null
@@ -0,0 +1,131 @@
+/*************************************************************************
+* 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;
+}
+
diff --git a/PWG3/dielectron/AliDielectronTrackCuts.h b/PWG3/dielectron/AliDielectronTrackCuts.h
new file mode 100644 (file)
index 0000000..487cb24
--- /dev/null
@@ -0,0 +1,77 @@
+#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
index fb42f211f8fee280d8b582484ad9db44f545646f..66a6e4c58892466b21c05d68953e6f2cc56183cf 100644 (file)
@@ -255,7 +255,7 @@ inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle
 
   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();
@@ -351,7 +351,7 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle
   
   // 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;
@@ -366,7 +366,7 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle
   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
   // ...
@@ -399,7 +399,7 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle
     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;
index 6bc368d5e60eeb9534af2b8b93936aedca25cd75..9ba071b918d42dd35eb1ee62a42aa4639399f25b 100644 (file)
@@ -11,10 +11,7 @@ AliAnalysisTask *AddTaskJPSI(const char* config=""){
   }
 
   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");
@@ -25,7 +22,7 @@ AliAnalysisTask *AddTaskJPSI(const char* config=""){
   
   //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);
   }
   
index 78d81ccc402df71462031ff10f8c045775db2c76..76462d01b6379f3bb082d05ab9381a94555cbd60 100644 (file)
@@ -2,28 +2,27 @@ AliAnalysisTask *AddTaskJPSIFilter(){
   //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);
@@ -50,9 +49,10 @@ AliAnalysisTask *AddTaskJPSIFilter(){
                          AliAnalysisManager::kOutputContainer,
                          containerName.Data());
   
+  
   mgr->ConnectInput(task,  0, mgr->GetCommonInputContainer());
   mgr->ConnectOutput(task, 1, cOutputHist1);
   mgr->ConnectOutput(task, 2, cOutputHist2);
-
+  
   return task;
 }
index aa4b4a448aa6ec638e52c46ffbbb363608658934..12f521a1abff6540a47a733a676084a39932b0af 100644 (file)
@@ -1,11 +1,11 @@
 
-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");
 
@@ -13,79 +13,103 @@ TObjArray *arrNames=names.Tokenize(";");
 
 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
@@ -112,14 +136,14 @@ AliESDtrackCuts *SetupESDtrackCuts(Int_t cutDefinition)
 
 
 //______________________________________________________________________________________
-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");
@@ -163,17 +187,17 @@ void InitHistograms(AliDielectron *die, Int_t cutDefinition)
   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);
@@ -186,7 +210,7 @@ void InitCF(AliDielectron* die, Int_t cutDefinition)
   cf->AddVariable(AliDielectronVarManager::kPt,2,0.8,1.2,kTRUE);
   cf->AddVariable(AliDielectronVarManager::kNclsTPC,3,90,120,kTRUE);
   
-  die->SetCFManagerPair(cf);
+  fDiele->SetCFManagerPair(cf);
   
 }
 
index 6b897cbd77e12af0a5e5a1b91a6ec7f2fae29f86..8139448307e3eae47f718db31dbffb62c22c38f4 100644 (file)
@@ -105,13 +105,10 @@ void SetupPairCuts(AliDielectron *die, Int_t cutDefinition)
   // 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);
 }
 
 //______________________________________________________________________________________
index d78b37fe4633b06ad880ba0105ce00c83fb11c68..85e518c505b8740f657a3aa214bf06f0a8990296 100644 (file)
@@ -1,56 +1,75 @@
+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
@@ -61,7 +80,7 @@ void SetupPairCuts(AliDielectron *die)
   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);
 
 }
 
@@ -88,7 +107,7 @@ AliESDtrackCuts *SetupESDtrackCuts()
 
 
 //______________________________________________________________________________________
-void InitHistograms(AliDielectron *die)
+void InitHistograms()
 {
   //
   // Initialise the histograms
@@ -96,13 +115,12 @@ void InitHistograms(AliDielectron *die)
   
 //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){
@@ -137,5 +155,5 @@ void InitHistograms(AliDielectron *die)
   histos->UserHistogram("Pair","OpeningAngle","Opening angle;angle",
                         100,0.,3.15,AliDielectronVarManager::kOpeningAngle);
   
-  die->SetHistogramManager(histos);
+  fDiele->SetHistogramManager(histos);
 }
index 3e492f6a5dc24c73e8d4282d7edfd1da3f4c13a8..3fbd77b6caa8374e1b0710663d2fb792533dc8e7 100644 (file)
@@ -726,7 +726,7 @@ c->SetAlias("TPCcut","(Leg1_TPC_signal>70*(1-exp(-1*(Leg1_P_InnerParam+2))))&&(L
 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")
 
index ab3caa88e257ff5918a3932c011e1be0b9157360..79ef0e6e2f1ca859f4dc99bba4505159ab808982 100644 (file)
@@ -12,6 +12,7 @@ SRCS= dielectron/AliDielectron.cxx \
       dielectron/AliAnalysisTaskDielectronEfficiency.cxx \
       dielectron/AliAnalysisTaskMultiDielectron.cxx \
       dielectron/AliDielectronVarCuts.cxx \
+      dielectron/AliDielectronTrackCuts.cxx \
       dielectron/AliDielectronPairLegCuts.cxx \
       dielectron/AliDielectronSignalBase.cxx \
       dielectron/AliDielectronSignalFunc.cxx \