]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
framework update; new classes for track rotation (for background), cuts grouping...
authorandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 2 Nov 2010 18:15:52 +0000 (18:15 +0000)
committerandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 2 Nov 2010 18:15:52 +0000 (18:15 +0000)
event cuts

31 files changed:
PWG3/PWG3dielectronLinkDef.h
PWG3/dielectron/AliAnalysisTaskDielectronFilter.cxx
PWG3/dielectron/AliAnalysisTaskDielectronSE.cxx
PWG3/dielectron/AliAnalysisTaskMultiDielectron.cxx
PWG3/dielectron/AliAnalysisTaskMultiDielectron.h
PWG3/dielectron/AliDielectron.cxx
PWG3/dielectron/AliDielectron.h
PWG3/dielectron/AliDielectronCFdraw.cxx
PWG3/dielectron/AliDielectronCFdraw.h
PWG3/dielectron/AliDielectronCutGroup.cxx [new file with mode: 0644]
PWG3/dielectron/AliDielectronCutGroup.h [new file with mode: 0644]
PWG3/dielectron/AliDielectronEventCuts.cxx [new file with mode: 0644]
PWG3/dielectron/AliDielectronEventCuts.h [new file with mode: 0644]
PWG3/dielectron/AliDielectronMC.cxx
PWG3/dielectron/AliDielectronMC.h
PWG3/dielectron/AliDielectronPID.cxx
PWG3/dielectron/AliDielectronPID.h
PWG3/dielectron/AliDielectronSignalBase.cxx
PWG3/dielectron/AliDielectronSignalBase.h
PWG3/dielectron/AliDielectronSignalExt.cxx
PWG3/dielectron/AliDielectronSignalExt.h
PWG3/dielectron/AliDielectronSignalFunc.cxx
PWG3/dielectron/AliDielectronTrackRotator.cxx [new file with mode: 0644]
PWG3/dielectron/AliDielectronTrackRotator.h [new file with mode: 0644]
PWG3/dielectron/AliDielectronVarManager.cxx
PWG3/dielectron/AliDielectronVarManager.h
PWG3/dielectron/macros/AddTaskJPSIFilter.C
PWG3/dielectron/macros/ConfigJpsi2eeData.C
PWG3/dielectron/macros/MakeDataReport.C
PWG3/dielectron/macros/PlotDataResults.C [new file with mode: 0644]
PWG3/libPWG3dielectron.pkg

index 8986b8224258713c7a8a9a1f41343e05699f05c4..8c71a55970a773dad379b9ea2d32385d3540f6ba 100644 (file)
@@ -25,5 +25,8 @@
 #pragma link C++ class AliDielectronSignalExt+;
 #pragma link C++ class AliDielectronSpectrum+;
 #pragma link C++ class AliDielectronDebugTree+;
+#pragma link C++ class AliDielectronTrackRotator+;
 #pragma link C++ class AliDielectronPID+;
+#pragma link C++ class AliDielectronCutGroup+;
+#pragma link C++ class AliDielectronEventCuts+;
 #endif
index 9f5a5a63ba8a8daaa4e0acf044429779575fab1d..c14218ef862eeacc6969058344fadcb8272051b2 100644 (file)
@@ -28,6 +28,7 @@
 #include <AliVEvent.h>
 #include <AliInputEventHandler.h>
 #include <AliESDInputHandler.h>
+#include <AliAODInputHandler.h>
 
 #include "AliDielectron.h"
 #include "AliDielectronMC.h"
@@ -39,11 +40,11 @@ ClassImp(AliAnalysisTaskDielectronFilter)
 
 //_________________________________________________________________________________
 AliAnalysisTaskDielectronFilter::AliAnalysisTaskDielectronFilter() :
-  AliAnalysisTaskSE(),
-  fDielectron(0),
-  fSelectPhysics(kTRUE),
-  fTriggerMask(AliVEvent::kMB),
-  fEventStat(0x0)
+AliAnalysisTaskSE(),
+fDielectron(0),
+fSelectPhysics(kTRUE),
+fTriggerMask(AliVEvent::kMB),
+fEventStat(0x0)
 {
   //
   // Constructor
@@ -52,11 +53,11 @@ AliAnalysisTaskDielectronFilter::AliAnalysisTaskDielectronFilter() :
 
 //_________________________________________________________________________________
 AliAnalysisTaskDielectronFilter::AliAnalysisTaskDielectronFilter(const char *name) :
-  AliAnalysisTaskSE(name),
-  fDielectron(0),
-  fSelectPhysics(kTRUE),
-  fTriggerMask(AliVEvent::kMB),
-  fEventStat(0x0)
+AliAnalysisTaskSE(name),
+fDielectron(0),
+fSelectPhysics(kTRUE),
+fTriggerMask(AliVEvent::kMB),
+fEventStat(0x0)
 {
   //
   // Constructor
@@ -99,7 +100,7 @@ void AliAnalysisTaskDielectronFilter::UserCreateOutputObjects()
     fEventStat->GetXaxis()->SetBinLabel(2,"After Phys. Sel.");
     fEventStat->GetXaxis()->SetBinLabel(3,"After Cand. Sel.");
   }
-
+  
   PostData(2,fEventStat);
 }
 
@@ -120,14 +121,30 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
     //load esd pid bethe bloch parameters depending on the existance of the MC handler
     // yes: MC parameters
     // no:  data parameters
-    if (!AliDielectronVarManager::GetESDpid()){
-      if (AliDielectronMC::Instance()->HasMC()) {
-        AliDielectronVarManager::InitESDpid();
-      } else {
-        AliDielectronVarManager::InitESDpid(1);
+    
+    //ESD case
+    if (man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class()){
+      if (!AliDielectronVarManager::GetESDpid()){
+        
+        if (AliDielectronMC::Instance()->HasMC()) {
+          AliDielectronVarManager::InitESDpid();
+        } else {
+          AliDielectronVarManager::InitESDpid(1);
+        }
+      }
+    }
+    //AOD case
+    if (man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class()){
+      if (!AliDielectronVarManager::GetAODpidUtil()){
+        if (AliDielectronMC::Instance()->HasMC()) {
+          AliDielectronVarManager::InitAODpidUtil();
+        } else {
+          AliDielectronVarManager::InitAODpidUtil(1);
+        }
       }
     }
   }
+  
   // Was event selected ?
   AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
   UInt_t isSelected = AliVEvent::kAny;
@@ -135,7 +152,7 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
     isSelected = inputHandler->IsEventSelected();
     isSelected&=fTriggerMask;
   }
-
+  
   //Before physics selection
   fEventStat->Fill(0.);
   if (isSelected==0) {
@@ -152,43 +169,53 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
   fDielectron->Process(InputEvent());
   
   if(fDielectron->HasCandidates()){
-    //If input event is an AliESDevent
-    // replace the references of the legs with the AOD references
-    if(man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class()){
-      AliAODEvent *aod = ((AliAODHandler*)((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()))->GetAOD();
-      TObjArray *obj = 0x0;
-      AliAODTrack *leg1 = 0x0;
-      AliAODTrack *leg2 = 0x0;
-      for(Int_t i=0; i < 10; i++ ){
-        obj = (TObjArray*)(*(fDielectron->GetPairArraysPointer()))->UncheckedAt(i);
-        if(!obj) continue;
-        for(int j=0;j<obj->GetEntriesFast();j++)
-        {
-          AliDielectronPair *pairObj = (AliDielectronPair*)obj->UncheckedAt(j);
-          Int_t id1 = ((AliESDtrack*)pairObj->GetFirstDaughter())->GetID();
-          Int_t id2 = ((AliESDtrack*)pairObj->GetSecondDaughter())->GetID();
-          for(Int_t it=0;it<aod->GetNumberOfTracks();it++){
-            if(aod->GetTrack(it)->GetID() == id1) leg1 = aod->GetTrack(it);
-            if(aod->GetTrack(it)->GetID() == id2) leg2 = aod->GetTrack(it);
-          }
-          if(!leg1 || !leg2) continue;
-          pairObj->SetRefFirstDaughter(leg1);
-          pairObj->SetRefSecondDaughter(leg2);
+    AliAODEvent *aod = ((AliAODHandler*)((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()))->GetAOD();
+    
+    //replace the references of the legs with the AOD references
+    TObjArray *obj = 0x0;
+    for(Int_t i=0; i < 10; i++ ){
+      obj = (TObjArray*)((*(fDielectron->GetPairArraysPointer()))->UncheckedAt(i));
+      if(!obj) continue;
+      for(int j=0;j<obj->GetEntriesFast();j++){
+        AliAODTrack *leg1 = 0x0;
+        AliAODTrack *leg2 = 0x0;
+        AliDielectronPair *pairObj = (AliDielectronPair*)obj->UncheckedAt(j);
+        Int_t id1 = ((AliVTrack*)pairObj->GetFirstDaughter())->GetID();
+        Int_t id2 = ((AliVTrack*)pairObj->GetSecondDaughter())->GetID();
+        
+        for(Int_t it=0;it<aod->GetNumberOfTracks();it++){
+          if(aod->GetTrack(it)->GetID() == id1) leg1 = aod->GetTrack(it);
+          if(aod->GetTrack(it)->GetID() == id2) leg2 = aod->GetTrack(it);
+        }
+        if(!leg1 || !leg2) continue;
+        
+        if(man->GetInputEventHandler()->IsA()==AliAODInputHandler::Class()){
+          leg1->ResetBit(kIsReferenced);
+          leg1->SetUniqueID(0);
+          leg2->ResetBit(kIsReferenced);
+          leg2->SetUniqueID(0);
         }
+        pairObj->SetRefFirstDaughter(leg1);
+        pairObj->SetRefSecondDaughter(leg2);
       }
     }
-      
-    AliAODExtension *extDielectron = dynamic_cast<AliAODHandler*>
-        ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler())->GetFilteredAOD("AliAOD.Dielectron.root");
+    
+    AliAODExtension *extDielectron = dynamic_cast<AliAODHandler*>       ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler())->GetFilteredAOD("AliAOD.Dielectron.root");
     extDielectron->SelectEvent();
     //after candidate selection
     fEventStat->Fill(2.);
     
     //see if dielectron candidate branch exists, if not create is
     TTree *t=extDielectron->GetTree();
+
+    if(!t->GetListOfBranches()->GetEntries() && man->GetInputEventHandler()->IsA()==AliAODInputHandler::Class())
+      t->Branch(aod->GetList());
+    
     if (!t->GetBranch("dielectrons")){
       t->Bronch("dielectrons","TObjArray",fDielectron->GetPairArraysPointer());
     }
+    
+    if(man->GetInputEventHandler()->IsA()==AliAODInputHandler::Class()) t->Fill();
   }
   
   PostData(1, const_cast<THashList*>(fDielectron->GetHistogramList()));
index 9fe22fa0ddfce28b1c1f2c5643851586acd688df..5581411c54b63a03d2bc3fe93648e2531b8b419b 100644 (file)
@@ -111,11 +111,26 @@ void AliAnalysisTaskDielectronSE::UserExec(Option_t *)
     //load esd pid bethe bloch parameters depending on the existance of the MC handler
     // yes: MC parameters
     // no:  data parameters
-    if (!AliDielectronVarManager::GetESDpid()){
-      if (AliDielectronMC::Instance()->HasMC()) {
-        AliDielectronVarManager::InitESDpid();
-      } else {
-        AliDielectronVarManager::InitESDpid(1);
+    
+    //ESD case
+    if (man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class()){
+      if (!AliDielectronVarManager::GetESDpid()){
+        
+        if (AliDielectronMC::Instance()->HasMC()) {
+          AliDielectronVarManager::InitESDpid();
+        } else {
+          AliDielectronVarManager::InitESDpid(1);
+        }
+      }
+    }
+    //AOD case
+    if (man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class()){
+      if (!AliDielectronVarManager::GetAODpidUtil()){
+        if (AliDielectronMC::Instance()->HasMC()) {
+          AliDielectronVarManager::InitAODpidUtil();
+        } else {
+          AliDielectronVarManager::InitAODpidUtil(1);
+        }
       }
     }
   }
index 4a9035ee77df0760cd60bb43bf0056250346b6ab..2638679ca567ff34493b2566adc7d1553d49227e 100644 (file)
 #include <AliCFContainer.h>
 #include <AliInputEventHandler.h>
 #include <AliESDInputHandler.h>
+#include <AliAODHandler.h>
 #include <AliAnalysisManager.h>
 #include <AliVEvent.h>
+#include <AliTriggerAnalysis.h>
 
 #include "AliDielectron.h"
 #include "AliDielectronHistos.h"
@@ -44,6 +46,10 @@ AliAnalysisTaskMultiDielectron::AliAnalysisTaskMultiDielectron() :
   fListCF(),
   fSelectPhysics(kFALSE),
   fTriggerMask(AliVEvent::kMB),
+  fTriggerOnV0AND(kFALSE),
+  fRejectPileup(kFALSE),
+  fTriggerAnalysis(0x0),
+  fEventFilter(0x0),
   fEventStat(0x0)
 {
   //
@@ -59,6 +65,10 @@ AliAnalysisTaskMultiDielectron::AliAnalysisTaskMultiDielectron(const char *name)
   fListCF(),
   fSelectPhysics(kFALSE),
   fTriggerMask(AliVEvent::kMB),
+  fTriggerOnV0AND(kFALSE),
+  fRejectPileup(kFALSE),
+  fTriggerAnalysis(0x0),
+  fEventFilter(0x0),
   fEventStat(0x0)
 {
   //
@@ -70,6 +80,9 @@ AliAnalysisTaskMultiDielectron::AliAnalysisTaskMultiDielectron(const char *name)
   DefineOutput(3, TH1D::Class());
   fListHistos.SetName("Dielectron_Histos_Multi");
   fListCF.SetName("Dielectron_CF_Multi");
+  fListDielectron.SetOwner();
+  fListHistos.SetOwner();
+  fListCF.SetOwner();
 }
 
 
@@ -82,6 +95,10 @@ void AliAnalysisTaskMultiDielectron::UserCreateOutputObjects()
 
   if (!fListHistos.IsEmpty()||!fListCF.IsEmpty()) return; //already initialised
 
+  AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
+  Bool_t isESD=man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class();
+//   Bool_t isAOD=man->GetInputEventHandler()->IsA()==AliAODHandler::Class();
+  
   TIter nextDie(&fListDielectron);
   AliDielectron *die=0;
   while ( (die=static_cast<AliDielectron*>(nextDie())) ){
@@ -91,16 +108,24 @@ void AliAnalysisTaskMultiDielectron::UserCreateOutputObjects()
   }
 
   Int_t cuts=fListDielectron.GetEntries();
-  Int_t nbins=2+2*cuts;
+  Int_t nbins=kNbinsEvent+2*cuts;
   if (!fEventStat){
     fEventStat=new TH1D("hEventStat","Event statistics",nbins,0,nbins);
     fEventStat->GetXaxis()->SetBinLabel(1,"Before Phys. Sel.");
     fEventStat->GetXaxis()->SetBinLabel(2,"After Phys. Sel.");
+    if (fTriggerOnV0AND&&isESD) fEventStat->GetXaxis()->SetBinLabel(3,"V0and triggers");
+    if (fEventFilter) fEventStat->GetXaxis()->SetBinLabel(4,"After Event Filter");
+    if (fRejectPileup) fEventStat->GetXaxis()->SetBinLabel(5,"After Pileup rejection");
+    
     for (Int_t i=0; i<cuts; ++i){
-      fEventStat->GetXaxis()->SetBinLabel(3+2*i,Form("#splitline{1 candidate}{%s}",fListDielectron.At(i)->GetName()));
-      fEventStat->GetXaxis()->SetBinLabel(4+2*i,Form("#splitline{With >1 candidate}{%s}",fListDielectron.At(i)->GetName()));
+      fEventStat->GetXaxis()->SetBinLabel((kNbinsEvent+1)+2*i,Form("#splitline{1 candidate}{%s}",fListDielectron.At(i)->GetName()));
+      fEventStat->GetXaxis()->SetBinLabel((kNbinsEvent+2)+2*i,Form("#splitline{With >1 candidate}{%s}",fListDielectron.At(i)->GetName()));
     }
   }
+
+  if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
+  fTriggerAnalysis->EnableHistograms();
+  fTriggerAnalysis->SetAnalyzeMC(AliDielectronMC::Instance()->HasMC());
   
   PostData(1, &fListHistos);
   PostData(2, &fListCF);
@@ -118,17 +143,34 @@ void AliAnalysisTaskMultiDielectron::UserExec(Option_t *)
 
   AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
   AliESDInputHandler *esdHandler=0x0;
+  Bool_t isESD=man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class();
+  Bool_t isAOD=man->GetInputEventHandler()->IsA()==AliAODHandler::Class();
   if ( (esdHandler=dynamic_cast<AliESDInputHandler*>(man->GetInputEventHandler())) && esdHandler->GetESDpid() ){
     AliDielectronVarManager::SetESDpid(esdHandler->GetESDpid());
   } else {
     //load esd pid bethe bloch parameters depending on the existance of the MC handler
     // yes: MC parameters
     // no:  data parameters
-    if (!AliDielectronVarManager::GetESDpid()){
-      if (AliDielectronMC::Instance()->HasMC()) {
-        AliDielectronVarManager::InitESDpid();
-      } else {
-        AliDielectronVarManager::InitESDpid(1);
+
+    //ESD case
+    if (isESD){
+      if (!AliDielectronVarManager::GetESDpid()){
+        
+        if (AliDielectronMC::Instance()->HasMC()) {
+          AliDielectronVarManager::InitESDpid();
+        } else {
+          AliDielectronVarManager::InitESDpid(1);
+        }
+      }
+    }
+    //AOD case
+    if (isAOD){
+      if (!AliDielectronVarManager::GetAODpidUtil()){
+        if (AliDielectronMC::Instance()->HasMC()) {
+          AliDielectronVarManager::InitAODpidUtil();
+        } else {
+          AliDielectronVarManager::InitAODpidUtil(1);
+        }
       }
     }
   } 
@@ -141,18 +183,38 @@ void AliAnalysisTaskMultiDielectron::UserExec(Option_t *)
   }
   
   //Before physics selection
-  fEventStat->Fill(0.);
+  fEventStat->Fill(kAllEvents);
   if (isSelected==0) {
     PostData(3,fEventStat);
     return;
   }
   //after physics selection
-  fEventStat->Fill(1.);
+  fEventStat->Fill(kSelectedEvents);
+
+  //V0and
+  if (fTriggerOnV0AND&&isESD){
+    if (!fTriggerAnalysis->IsOfflineTriggerFired(static_cast<AliESDEvent*>(InputEvent()), AliTriggerAnalysis::kV0AND)) return;
+  }
+  fEventStat->Fill(kV0andEvents);
+  
+  //event filter
+  if (fEventFilter) {
+    if (!fEventFilter->IsSelected(InputEvent())) return;
+  }
+  fEventStat->Fill(kFilteredEvents);
+  
+  //pileup
+  if (fRejectPileup){
+    if (InputEvent()->IsPileupFromSPD(3,0.8,3.,2.,5.)) return;
+  }
+  fEventStat->Fill(kPileupEvents);
   
   //bz for AliKF
   Double_t bz = InputEvent()->GetMagneticField();
   AliKFParticle::SetField( bz );
 
+  AliDielectronPID::SetCorrVal((Double_t)InputEvent()->GetRunNumber());
+  
   //Process event in all AliDielectron instances
   TIter nextDie(&fListDielectron);
   AliDielectron *die=0;
@@ -161,8 +223,8 @@ void AliAnalysisTaskMultiDielectron::UserExec(Option_t *)
     die->Process(InputEvent());
     if (die->HasCandidates()){
       Int_t ncandidates=die->GetPairArray(1)->GetEntriesFast();
-      if (ncandidates==1) fEventStat->Fill(3+2*idie);
-      else if (ncandidates>1) fEventStat->Fill(4+2*idie);
+      if (ncandidates==1) fEventStat->Fill((kNbinsEvent+1)+2*idie);
+      else if (ncandidates>1) fEventStat->Fill((kNbinsEvent+2)+2*idie);
     }
     ++idie;
   }
index 0a67dd0859df7f0010b595b34ac290cb6de372b4..d5cb045919c50c82822dfc84d0473d0883d4168a 100644 (file)
@@ -23,6 +23,8 @@
 
 class AliDielectron;
 class TH1D;
+class AliAnalysisCuts;
+class AliTriggerAnalysis;
 
 class AliAnalysisTaskMultiDielectron : public AliAnalysisTaskSE {
   
@@ -35,23 +37,32 @@ public:
   virtual void UserCreateOutputObjects();
   virtual void FinishTaskOutput();
   //temporary
-  virtual void NotifyRun(){AliDielectronPID::SetCorrVal((Double_t)fCurrentRunNumber);}
+//   virtual void NotifyRun(){AliDielectronPID::SetCorrVal((Double_t)fCurrentRunNumber);}
   
   void UsePhysicsSelection(Bool_t phy=kTRUE) {fSelectPhysics=phy;}
   void SetTriggerMask(UInt_t mask) {fTriggerMask=mask;}
   UInt_t GetTriggerMask() const { return fTriggerMask; }
-  
+
+  void SetEventFilter(AliAnalysisCuts * const filter) {fEventFilter=filter;}
+  void SetTriggerOnV0AND(Bool_t v0and=kTRUE)    { fTriggerOnV0AND=v0and;    }
+  void SetRejectPileup(Bool_t pileup=kTRUE)     { fRejectPileup=pileup;     }
   void AddDielectron(AliDielectron * const die) { fListDielectron.Add(die); }
   
 private:
-  
+  enum {kAllEvents=0, kSelectedEvents, kV0andEvents, kFilteredEvents, kPileupEvents, kNbinsEvent};
   TList fListDielectron;             // List of dielectron framework instances
   TList fListHistos;                 //! List of histogram manager lists in the framework classes
   TList fListCF;                     //! List with CF Managers
 
   Bool_t fSelectPhysics;             // Whether to use physics selection
   UInt_t fTriggerMask;               // Event trigger mask
+  Bool_t fTriggerOnV0AND;            // if to trigger on V0and
+  Bool_t fRejectPileup;              // pileup rejection wanted
+  
+  AliTriggerAnalysis *fTriggerAnalysis; //! trigger analysis class
 
+  AliAnalysisCuts *fEventFilter;     // event filter
+  
   TH1D *fEventStat;                  //! Histogram with event statistics
   
   AliAnalysisTaskMultiDielectron(const AliAnalysisTaskMultiDielectron &c);
index 069b42b7aefb965d5891008b5e7cb3302a2670a1..7bf1d19383b1700d5eaf5923241b008ca9cbd3a7 100644 (file)
@@ -36,7 +36,7 @@ The names are available via the function PairClassName(Int_t i)
 8: ev2+ ev2-  (same event unlike sign)
 9: ev2- ev2-  (same event like sign -)
 
-
+10: ev1+ ev1- (same event track rotation)
 
 */
 //                                                                       //
@@ -57,6 +57,7 @@ The names are available via the function PairClassName(Int_t i)
 #include "AliDielectronCF.h"
 #include "AliDielectronMC.h"
 #include "AliDielectronVarManager.h"
+#include "AliDielectronTrackRotator.h"
 #include "AliDielectronDebugTree.h"
 
 #include "AliDielectron.h"
@@ -70,7 +71,7 @@ const char* AliDielectron::fgkTrackClassNames[4] = {
   "ev2-"
 };
 
-const char* AliDielectron::fgkPairClassNames[10] = {
+const char* AliDielectron::fgkPairClassNames[11] = {
   "ev1+_ev1+",
   "ev1+_ev1-",
   "ev1-_ev1-",
@@ -80,7 +81,8 @@ const char* AliDielectron::fgkPairClassNames[10] = {
   "ev1+_ev2-",
   "ev1-_ev2-",
   "ev2+_ev2-",
-  "ev2-_ev2-"
+  "ev2-_ev2-",
+  "ev1+_ev1-_TR"
 };
 
 //________________________________________________________________
@@ -97,6 +99,7 @@ AliDielectron::AliDielectron() :
   fHistos(0x0),
   fPairCandidates(new TObjArray(10)),
   fCfManagerPair(0x0),
+  fTrackRotator(0x0),
   fDebugTree(0x0)
 {
   //
@@ -119,6 +122,7 @@ AliDielectron::AliDielectron(const char* name, const char* title) :
   fHistos(0x0),
   fPairCandidates(new TObjArray(10)),
   fCfManagerPair(0x0),
+  fTrackRotator(0x0),
   fDebugTree(0x0)
 {
   //
@@ -145,6 +149,7 @@ void AliDielectron::Init()
   // Initialise objects
   //
   if (fCfManagerPair) fCfManagerPair->InitialiseContainer(fPairFilter);
+  if (fTrackRotator)  fTrackRotator->SetTrackArrays(&fTracks[0],&fTracks[1]);
   if (fDebugTree) fDebugTree->SetDielectron(this);
 } 
 
@@ -195,6 +200,9 @@ void AliDielectron::Process(AliVEvent *ev1, AliVEvent *ev2)
     }
   }
 
+  //track rotation
+  if (fTrackRotator) FillPairArrayTR();
+  
   //in case there is a histogram manager, fill the QA histograms
   if (fHistos) FillHistograms(ev1);
 
@@ -284,6 +292,43 @@ void AliDielectron::FillHistograms(const AliVEvent *ev)
   }
   
 }
+//________________________________________________________________
+void AliDielectron::FillHistogramsPair(AliDielectronPair *pair)
+{
+  //
+  // Fill Histogram information for pairs and the track in the pair
+  // NOTE: in this funtion the leg information may be filled multiple
+  //       times. This funtion is used in the track rotation pairing
+  //       and those legs are not saved!
+  //
+  TString  className,className2;
+  Double_t values[AliDielectronVarManager::kNMaxValues];
+  
+  //Fill Pair information, separately for all pair candidate arrays and the legs
+  TObjArray arrLegs(100);
+  const Int_t type=pair->GetType();
+  className.Form("Pair_%s",fgkPairClassNames[type]);
+  className2.Form("Track_Legs_%s",fgkPairClassNames[type]);
+  
+  Bool_t pairClass=fHistos->GetHistogramList()->FindObject(className.Data())!=0x0;
+  Bool_t legClass=fHistos->GetHistogramList()->FindObject(className2.Data())!=0x0;
+  
+  //fill pair information
+  if (pairClass){
+    AliDielectronVarManager::Fill(pair, values);
+    fHistos->FillClass(className, AliDielectronVarManager::kNMaxValues, values);
+  }
+
+  if (legClass){
+    AliVParticle *d1=pair->GetFirstDaughter();
+    AliDielectronVarManager::Fill(d1, values);
+    fHistos->FillClass(className2, AliDielectronVarManager::kNMaxValues, values);
+    
+    AliVParticle *d2=pair->GetSecondDaughter();
+    AliDielectronVarManager::Fill(d2, values);
+    fHistos->FillClass(className2, AliDielectronVarManager::kNMaxValues, values);
+  }
+}
 
 //________________________________________________________________
 void AliDielectron::FillTrackArrays(AliVEvent * const ev, Int_t eventNr)
@@ -318,7 +363,8 @@ void AliDielectron::FillTrackArrays(AliVEvent * const ev, Int_t eventNr)
 }
 
 //________________________________________________________________
-void AliDielectron::PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2) {
+void AliDielectron::PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2)
+{
   //
   // Prefilter tracks from pairs
   // Needed for datlitz rejections
@@ -395,7 +441,8 @@ void AliDielectron::PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1,
 }
 
 //________________________________________________________________
-void AliDielectron::FillPairArrays(Int_t arr1, Int_t arr2) {
+void AliDielectron::FillPairArrays(Int_t arr1, Int_t arr2)
+{
   //
   // select pairs and fill pair candidate arrays
   //
@@ -444,6 +491,30 @@ void AliDielectron::FillPairArrays(Int_t arr1, Int_t arr2) {
   delete candidate;
 }
 
+//________________________________________________________________
+void AliDielectron::FillPairArrayTR()
+{
+  //
+  // select pairs and fill pair candidate arrays
+  //
+  UInt_t selectedMask=(1<<fPairFilter.GetCuts()->GetEntries())-1;
+  
+  while ( fTrackRotator->NextCombination() ){
+    AliDielectronPair candidate;
+    candidate.SetTracks(fTrackRotator->GetTrackP(), fPdgLeg1, fTrackRotator->GetTrackN(), fPdgLeg2);
+    candidate.SetType(10);
+    
+    //pair cuts
+    UInt_t cutMask=fPairFilter.IsSelected(&candidate);
+    
+    //CF manager for the pair
+    if (fCfManagerPair) fCfManagerPair->Fill(cutMask,&candidate);
+    
+    //apply cut
+    if (cutMask==selectedMask&&fHistos) FillHistogramsPair(&candidate);
+  }
+}
+
 //________________________________________________________________
 void AliDielectron::FillDebugTree()
 {
index 60e484218c4c3a65a2b98485636d0553047eaa68..34e9049a1e00bd04b7a63c76029ae85ba8783b12 100644 (file)
@@ -29,14 +29,17 @@ class AliVEvent;
 class THashList;
 class AliDielectronCF;
 class AliDielectronDebugTree;
+class AliDielectronTrackRotator;
 
 //________________________________________________________________
 class AliDielectron : public TNamed {
   
 public:
-  enum ParticleValues { kPx=0, kPy, kPz, kPt, kP, kXv, kYv, kZv, kOneOverPt,
-      kPhi, kTheta, kE, kM, kEta, kY, kCharge, kNParticleValues };
-  enum PairValues { kChi2NDF=kNParticleValues, kDecayLength, kR, kOpeningAngle, kMerr, kNPairValues };
+  enum EPairType { kEv1PP=0, kEv1PM, kEv1MM,
+      kEv1PEv2P, kEv1MEv2P, kEv2PP,
+      kEv1PEv2M, kEv1MEv2M, kEv2PM,
+      kEv2MM, kEv1PMRot };
+  enum ELegType  { kEv1P, kEv1M, kEv2P, kEv2M };
   
   AliDielectron();
   AliDielectron(const char* name, const char* title);
@@ -76,10 +79,13 @@ public:
   void SetCFManagerPair(AliDielectronCF * const cf) { fCfManagerPair=cf; }
   AliDielectronCF* GetCFManagerPair() const { return fCfManagerPair; }
 
+  void SetTrackRotator(AliDielectronTrackRotator * const rot) { fTrackRotator=rot; }
+  AliDielectronTrackRotator* GetTrackRotator() const { return fTrackRotator; }
+  
   void SetDebugTree(AliDielectronDebugTree * const tree) { fDebugTree=tree; }
   
   static const char* TrackClassName(Int_t i) { return (i>=0&&i<4)?fgkTrackClassNames[i]:""; }
-  static const char* PairClassName(Int_t i)  { return (i>=0&&i<10)?fgkPairClassNames[i]:""; }
+  static const char* PairClassName(Int_t i)  { return (i>=0&&i<11)?fgkPairClassNames[i]:""; }
 
   void SaveDebugTree();
   
@@ -110,12 +116,13 @@ private:
                                   //TODO: better way to store it? TClonesArray?
 
   AliDielectronCF *fCfManagerPair;//Correction Framework Manager for the Pair
-
+  AliDielectronTrackRotator *fTrackRotator; //Track rotator
   AliDielectronDebugTree *fDebugTree;  // Debug tree output
   
   void FillTrackArrays(AliVEvent * const ev, Int_t eventNr=0);
   void PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2);
   void FillPairArrays(Int_t arr1, Int_t arr2);
+  void FillPairArrayTR();
   
   Int_t GetPairIndex(Int_t arr1, Int_t arr2) const {return arr1>=arr2?arr1*(arr1+1)/2+arr2:arr2*(arr2+1)/2+arr1;}
 
@@ -125,11 +132,13 @@ private:
   TObjArray* PairArray(Int_t i);
   
   static const char* fgkTrackClassNames[4];   //Names for track arrays
-  static const char* fgkPairClassNames[10];   //Names for pair arrays
+  static const char* fgkPairClassNames[11];   //Names for pair arrays
 
   void ProcessMC();
   
   void  FillHistograms(const AliVEvent *ev);
+  void  FillHistogramsPair(AliDielectronPair *pair);
+    
   void  FillDebugTree();
   
   AliDielectron(const AliDielectron &c);
index 5e73f10b827f2037a4f20d541983c8df61348e6b..ba052d2ebae3c397503184ac9d2391c674e3640e 100644 (file)
@@ -349,7 +349,7 @@ TObjArray* AliDielectronCFdraw::CollectHistosProj(Int_t dim, Int_t *vars, const
 TH1* AliDielectronCFdraw::Project(Int_t ndim, Int_t *vars, Int_t slice)
 {
   //
-  // Do an nim projection
+  // Do an ndim projection
   //
   switch (ndim){
   case 1:
@@ -365,6 +365,35 @@ TH1* AliDielectronCFdraw::Project(Int_t ndim, Int_t *vars, Int_t slice)
   return 0x0;
 }
 
+//________________________________________________________________
+TH1* AliDielectronCFdraw::Project(const Option_t* var, Int_t slice)
+{
+  //
+  // translate variable names and do projection
+  //
+  TObjArray *arrVars=TString(var).Tokenize(":");
+  Int_t entries=arrVars->GetEntriesFast();
+  if (entries<1||entries>3){
+    AliError("Wrong number of variables, supported are 1 - 3 dimensions");
+    delete arrVars;
+    return 0x0;
+  }
+  
+  TIter next(arrVars);
+  TObjString *ostr=0x0;
+  Int_t ivar[3]={-1,-1,-1};
+  for (Int_t i=0; i<entries; ++i){
+    ostr=static_cast<TObjString*>(next());
+    if (ostr->GetString().IsDigit()){
+      ivar[i]=ostr->GetString().Atoi();
+    } else {
+      ivar[i]=fCfContainer->GetVar(ostr->GetName());
+    }
+  }
+  delete arrVars;
+  return Project(entries,ivar,slice);
+}
+
 //________________________________________________________________
 void AliDielectronCFdraw::DrawEfficiency(const char* varnames, const char* nominators, Int_t denominator, const char* opt)
 {
index 142350b92518244e7bb7dbe84f811d266e6236e0..2f2e244c435b83872be23bdb5ef61052b6d292aa 100644 (file)
@@ -63,7 +63,8 @@ public:
 
   TObjArray* CollectHistosProj(Int_t dim, Int_t *vars, const char* slices);
   TH1* Project(Int_t ndim, Int_t *vars, Int_t slice);
-
+  TH1* Project(const Option_t* var, Int_t slice);
+  
   //Draw efficiencies
   void DrawEfficiency(const char* varnames, const char* nominators, Int_t denominator=0, const char* opt="sameleg2");
   void DrawEfficiency(Int_t var, const char* nominators, Int_t denominator=0, const char* opt="sameleg", Int_t type=0);
diff --git a/PWG3/dielectron/AliDielectronCutGroup.cxx b/PWG3/dielectron/AliDielectronCutGroup.cxx
new file mode 100644 (file)
index 0000000..90a6bd8
--- /dev/null
@@ -0,0 +1,102 @@
+/*************************************************************************
+ * 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.                  *
+ **************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////
+//                           CutGroup                                   //
+//                                                                      //
+//                                                                      //
+//   Allow to define groups of cut conditions which are tested with     //
+//      an OR condition between groups and an AND within groups         //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+#include "AliDielectronCutGroup.h"
+
+ClassImp(AliDielectronCutGroup)
+
+AliDielectronCutGroup::AliDielectronCutGroup(Bool_t compOperator /*=kCompOR*/) :
+  AliAnalysisCuts(),
+  fCutGroupList(0x0),
+  fCompOperator(compOperator)
+{
+  //
+  // Default constructor
+  //
+}
+
+//_____________________________________________________________________
+AliDielectronCutGroup::AliDielectronCutGroup(const char* name, const char* title, Bool_t compOperator /*=kCompOR*/) :
+  AliAnalysisCuts(name, title),
+  fCutGroupList(0x0),
+  fCompOperator(compOperator)
+{
+  //
+  // Named Constructor
+  //
+}
+
+//_____________________________________________________________________
+AliDielectronCutGroup::~AliDielectronCutGroup() 
+{
+  //
+  //Default Destructor
+  //
+}
+
+//_____________________________________________________________________
+Bool_t AliDielectronCutGroup::IsSelected(TObject* track) 
+{
+  //
+  // Selection-finder handling different comparison operations
+  //
+  
+  
+  //Different init for and/or makes code shorter
+  Bool_t selectionResult=fCompOperator;
+  
+  TIter listIterator(&fCutGroupList);
+  while (AliAnalysisCuts *thisCut = (AliAnalysisCuts*) listIterator()) {
+    if (fCompOperator == kCompOR) {
+      selectionResult = (selectionResult || thisCut->IsSelected(track));
+    }
+    else { //kCompAND
+      selectionResult = (selectionResult && thisCut->IsSelected(track));
+      if (selectionResult==kFALSE) break; //Save loops vs. additional check?
+    }
+    
+  }
+  return selectionResult;
+}
+
+//_____________________________________________________________________
+
+void AliDielectronCutGroup::AddCut(AliAnalysisCuts* fCut) 
+{
+  //
+  // Add a defined cut to the list
+  //
+  
+  fCutGroupList.Add(fCut);
+}
+
+//_____________________________________________________________________
+void AliDielectronCutGroup::SetCompOperator(Bool_t compOperator) 
+{
+  //
+  // Switch between AND/OR
+  //
+  
+  fCompOperator = compOperator;
+}
diff --git a/PWG3/dielectron/AliDielectronCutGroup.h b/PWG3/dielectron/AliDielectronCutGroup.h
new file mode 100644 (file)
index 0000000..92adfd2
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef ALIDIELECTRONCUTGROUP_H
+#define ALIDIELECTRONCUTGROUP_H
+
+/* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+//#################################################################
+//#                                                               #
+//#             Class AliDielectronCutGroup                       #
+//#              Dielectron Group of cuts                         #
+//#                                                               #
+//#  Authors:                                                     #
+//#   Anton     Andronic, GSI / A.Andronic@gsi.de                 #
+//#   Ionut C.  Arsene,   GSI / I.C.Arsene@gsi.de                 #
+//#   Christoph Baumann   uni Ffm / cbaumann@ikf.uni-frankfurt.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 HD / Jens.Wiechula@cern.ch          #
+//#                                                               #
+//#################################################################
+
+#include <AliAnalysisCuts.h>
+#include <TList.h>
+
+class TCollection;
+
+class AliDielectronCutGroup : public AliAnalysisCuts {
+  
+public:
+  enum TruthValues {
+    kCompAND = kTRUE,
+    kCompOR = kFALSE
+  };
+  
+  AliDielectronCutGroup(Bool_t compOperator=kCompOR);
+  AliDielectronCutGroup(const char*name, const char* title, Bool_t compOperator=kCompOR);
+  
+  virtual ~AliDielectronCutGroup();
+  
+  //Analysis cuts interface
+  //
+  virtual Bool_t IsSelected(TObject* track);
+  virtual Bool_t IsSelected(TList*   /* list */ ) {return kFALSE;}
+  
+  void AddCut(AliAnalysisCuts* fCut);
+  void SetCompOperator(Bool_t compOperator);
+  
+private:
+  TList  fCutGroupList;  //for saving the different cuts
+  Bool_t fCompOperator;  //determines whether the cuts are AND/OR compared
+  
+  ClassDef(AliDielectronCutGroup,1) //Group of cuts
+};
+
+#endif
diff --git a/PWG3/dielectron/AliDielectronEventCuts.cxx b/PWG3/dielectron/AliDielectronEventCuts.cxx
new file mode 100644 (file)
index 0000000..12de258
--- /dev/null
@@ -0,0 +1,129 @@
+/*************************************************************************
+* 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 EventCuts                                  //
+//                                                                       //
+//                                                                       //
+/*
+Detailed description
+
+
+*/
+//                                                                       //
+///////////////////////////////////////////////////////////////////////////
+
+#include <AliTriggerAnalysis.h>
+#include <AliESDVertex.h>
+#include <AliESDEvent.h>
+
+#include "AliDielectronEventCuts.h"
+
+ClassImp(AliDielectronEventCuts)
+
+AliDielectronEventCuts::AliDielectronEventCuts() :
+  AliAnalysisCuts(),
+  fVtxZmin(0.),
+  fVtxZmax(0.),
+  fRequireVtx(kFALSE),
+  fMinVtxContributors(0),
+  fVtxType(kVtxTracks),
+  fRequireV0and(0),
+  fTriggerAnalysis(0x0),
+  fkVertex(0x0)
+{
+  //
+  // Default Constructor
+  //
+  
+}
+
+//______________________________________________
+AliDielectronEventCuts::AliDielectronEventCuts(const char* name, const char* title) :
+  AliAnalysisCuts(name, title),
+  fVtxZmin(0.),
+  fVtxZmax(0.),
+  fRequireVtx(kFALSE),
+  fMinVtxContributors(0),
+  fVtxType(kVtxTracks),
+  fRequireV0and(0),
+  fTriggerAnalysis(0x0),
+  fkVertex(0x0)
+{
+  //
+  // Named Constructor
+  //
+}
+
+//______________________________________________
+AliDielectronEventCuts::~AliDielectronEventCuts()
+{
+  //
+  // Default Destructor
+  //
+  if (fTriggerAnalysis) delete fTriggerAnalysis;
+}
+
+//______________________________________________
+Bool_t AliDielectronEventCuts::IsSelected(TObject* event)
+{
+  //
+  // check the cuts
+  //
+  
+  AliESDEvent *ev=dynamic_cast<AliESDEvent*>(event);
+  if (!ev) return kFALSE;
+
+  fkVertex=0x0;
+  switch(fVtxType){
+  case kVtxTracks: fkVertex=ev->GetPrimaryVertexTracks(); break;
+  case kVtxSPD:    fkVertex=ev->GetPrimaryVertexSPD(); break;
+  case kVtxTPC:    fkVertex=ev->GetPrimaryVertexTPC(); break;
+  case kVtxAny:    fkVertex=ev->GetPrimaryVertex(); break;
+  }
+
+  if ((fRequireVtx||fVtxZmin<fVtxZmax||fMinVtxContributors>0)&&!fkVertex) return kFALSE;
+  
+  if (fVtxZmin<fVtxZmax){
+    Double_t zvtx=fkVertex->GetZv();
+    if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
+  }
+
+  if (fMinVtxContributors>0){
+    Int_t nCtrb = fkVertex->GetNContributors();
+    if (nCtrb<fMinVtxContributors) return kFALSE;
+  }
+
+  if (fRequireV0and){
+    if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
+    Bool_t v0AND = kFALSE;
+    if (fRequireV0and==1){
+      Bool_t v0A       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0A);
+      Bool_t v0C       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0C);
+      v0AND = v0A && v0C;
+    }
+
+    if (fRequireV0and==2){
+      Bool_t v0AHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kASide, kTRUE) == AliTriggerAnalysis::kV0BB);
+      Bool_t v0CHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kCSide, kTRUE) == AliTriggerAnalysis::kV0BB);
+      v0AND = v0AHW && v0CHW;
+    }
+
+    if (!v0AND) return kFALSE;
+  }
+  
+  return kTRUE;
+}
+
diff --git a/PWG3/dielectron/AliDielectronEventCuts.h b/PWG3/dielectron/AliDielectronEventCuts.h
new file mode 100644 (file)
index 0000000..227c4d6
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef ALIDIELECTRONEVENTCUTS_H
+#define ALIDIELECTRONEVENTCUTS_H
+
+/* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+//#############################################################
+//#                                                           # 
+//#         Class AliDielectronEventCuts                     #
+//#                                                           #
+//#  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 HD / Jens.Wiechula@cern.ch      #
+//#                                                           #
+//#############################################################
+
+#include <AliAnalysisCuts.h>
+
+class AliTriggerAnalysis;
+class AliESDVertex;
+
+class AliDielectronEventCuts : public AliAnalysisCuts {
+public:
+  enum EVtxType { kVtxTracks=0, kVtxSPD, kVtxTPC, kVtxAny };
+  
+  AliDielectronEventCuts();
+  AliDielectronEventCuts(const char*name, const char* title);
+
+  virtual ~AliDielectronEventCuts();
+
+
+  void SetVertexType(EVtxType type)             { fVtxType=type;                }
+  void SetVertexZ(Double_t zmin, Double_t zmax) { fVtxZmin=zmin; fVtxZmax=zmax; }
+  void SetRequireVertex(Bool_t req=kTRUE)       { fRequireVtx=req;              }
+  void SetRequireV0and(UChar_t type=1)          { fRequireV0and=type;           }
+  void SetMinVtxContributors(Int_t min=1)       { fMinVtxContributors=min;      }
+
+  //
+  //Analysis cuts interface
+  //
+  virtual Bool_t IsSelected(TObject* event);
+  virtual Bool_t IsSelected(TList*   /* list */ ) {return kFALSE;}
+  
+
+private:
+
+  Double_t fVtxZmin;                // minimum z vertex position
+  Double_t fVtxZmax;                // maximum z vertex position
+  Bool_t   fRequireVtx;             // require a vertex
+  Int_t    fMinVtxContributors;     // min number of vertex contributors
+  EVtxType fVtxType;                // vertex type
+
+  UChar_t fRequireV0and;             // use V0and triggered events only
+
+  AliTriggerAnalysis *fTriggerAnalysis; //! trigger analysis class
+  const AliESDVertex *fkVertex;            //! current vertex
+
+  AliDielectronEventCuts(const AliDielectronEventCuts &c);
+  AliDielectronEventCuts &operator=(const AliDielectronEventCuts &c);
+
+  
+  ClassDef(AliDielectronEventCuts,1)         // Dielectron EventCuts
+};
+
+
+
+#endif
index 943124ce10fc8ff20e6a3dc0517c52636e2f5d1f..b7c332f9aa873ee85e85d0569d26f8ecad3a3cdd 100644 (file)
@@ -113,6 +113,26 @@ Int_t AliDielectronMC::GetNMCTracksFromStack()
   return fStack->GetNtrack();
 }
 
+//____________________________________________________________
+Int_t AliDielectronMC::GetNPrimary()
+{
+  //
+  //  return the number of primary track from MC event
+  //
+  if (!fMCEvent){ AliError("No fMCEvent"); return 0; }
+  return fMCEvent->GetNumberOfPrimaries();
+}
+
+//____________________________________________________________
+Int_t AliDielectronMC::GetNPrimaryFromStack()
+{
+  //
+  //  return the number of primary track from stack
+  //
+  if (!fStack){ AliError("No fStack"); return -999; }
+  return fStack->GetNprimary();
+}
+
 //____________________________________________________________
 AliVParticle* AliDielectronMC::GetMCTrackFromMCEvent(Int_t itrk)
 {
index 76e4cfd8e6af712f2ba10253480842a9c5af2c77..6e7db92537d00311316c9715a4377c0ad0532b71 100644 (file)
@@ -42,6 +42,8 @@ public:
   void Initialize();                              // initialization
   Int_t GetNMCTracks();                                     // return number of generated tracks
   Int_t GetNMCTracksFromStack();                            // return number of generated tracks from stack
+  Int_t GetNPrimary();                                            // return number of primary tracks
+  Int_t GetNPrimaryFromStack();                                   // return number of primary tracks from stack
   Int_t GetMCPID(const AliESDtrack* _track);                      // return MC PID
   Int_t GetMCPIDFromStack(const AliESDtrack* _track);             // return MC PID
   Int_t GetMotherPDG(const AliESDtrack* _track);                  // return mother PID from the MC stack
index 1fc52a70bd577b3c3c228b33eb1316c8931f8f5e..b4b1cebd47fbf0bee76a4ddf9dbd1bfe05237d18 100644 (file)
@@ -32,6 +32,8 @@ Detailed description
 #include <AliVTrack.h>
 #include <AliLog.h>
 #include <AliESDtrack.h>
+#include <AliESDpid.h>
+#include <AliAODpidUtil.h>
 
 #include "AliDielectronVarManager.h"
 
@@ -45,7 +47,8 @@ Double_t AliDielectronPID::fgCorr=0.0;
 AliDielectronPID::AliDielectronPID() :
   AliAnalysisCuts(),
   fNcuts(0),
-  fESDpid(0x0)
+  fESDpid(0x0),
+  fAODpidUtil(0x0)
 {
   //
   // Default Constructor
@@ -68,7 +71,8 @@ AliDielectronPID::AliDielectronPID() :
 AliDielectronPID::AliDielectronPID(const char* name, const char* title) :
   AliAnalysisCuts(name, title),
   fNcuts(0),
-  fESDpid(0x0)
+  fESDpid(0x0),
+  fAODpidUtil(0x0)
 {
   //
   // Named Constructor
@@ -191,6 +195,7 @@ Bool_t AliDielectronPID::IsSelected(TObject* track)
   
   Bool_t selected=kFALSE;
   fESDpid=AliDielectronVarManager::GetESDpid();
+  fAODpidUtil=AliDielectronVarManager::GetAODpidUtil();
   
   for (UChar_t icut=0; icut<fNcuts; ++icut){
     Double_t pMin=fPmin[icut];
@@ -239,11 +244,11 @@ Bool_t AliDielectronPID::IsSelectedITS(AliVTrack * const part, Int_t icut) const
     // ESD case in case the PID bit is not set, don't use this track!
     AliESDtrack *track=static_cast<AliESDtrack*>(part);
     numberOfSigmas=fESDpid->NumberOfSigmasITS(track, fPartType[icut]);
-  }else{
+  }else if(part->IsA()==AliAODTrack::Class()){
     // AOD case
     // FIXME: Is there a place to check whether the PID is was set in ESD???
     AliAODTrack *track=static_cast<AliAODTrack*>(part);
-    numberOfSigmas=NumberOfSigmasITS(track, fPartType[icut]);
+    numberOfSigmas=fAODpidUtil->NumberOfSigmasITS(track, fPartType[icut]);
   }
   Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
   return selected;
@@ -265,15 +270,15 @@ Bool_t AliDielectronPID::IsSelectedTPC(AliVTrack * const part, Int_t icut) const
     // ESD case in case the PID bit is not set, don't use this track!
     AliESDtrack *track=static_cast<AliESDtrack*>(part);
     numberOfSigmas=fESDpid->NumberOfSigmasTPC(track, fPartType[icut]);
-  }else{
+  }else if(part->IsA()==AliAODTrack::Class()){
     // AOD case
     // FIXME: Is there a place to check whether the PID is was set in ESD???
     AliAODTrack *track=static_cast<AliAODTrack*>(part);
-    numberOfSigmas=NumberOfSigmasTPC(track, fPartType[icut]);
+    numberOfSigmas=fAODpidUtil->NumberOfSigmasTPC(track, fPartType[icut]);
+  }
+  if (fPartType[icut]==AliPID::kElectron){
+    numberOfSigmas-=fgCorr;
   }
-//   if (fPartType[icut]==AliPID::kElectron){
-//     numberOfSigmas-=fgCorr;
-//   }
   Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
   return selected;
 }
@@ -303,11 +308,11 @@ Bool_t AliDielectronPID::IsSelectedTOF(AliVTrack * const part, Int_t icut) const
     // ESD case in case the PID bit is not set, don't use this track!
     AliESDtrack *track=static_cast<AliESDtrack*>(part);
     numberOfSigmas=fESDpid->NumberOfSigmasTOF(track, fPartType[icut], fESDpid->GetTOFResponse().GetTimeZero());
-  }else{
+  }else if(part->IsA()==AliAODTrack::Class()){
     // AOD case
     // FIXME: Is there a place to check whether the PID is was set in ESD???
     AliAODTrack *track=static_cast<AliAODTrack*>(part);
-    numberOfSigmas=NumberOfSigmasTOF(track, fPartType[icut]);
+    numberOfSigmas=fAODpidUtil->NumberOfSigmasTOF(track, fPartType[icut]);
   }
   
   Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
index 07601202e7abad419cc1f927b4ad20412487f9a7..3f959e67ca6f6db4096840878c27671f0a5cf253 100644 (file)
@@ -20,7 +20,6 @@
 //#############################################################
 
 #include <AliPID.h>
-#include <AliESDpid.h>
 #include <AliAODTrack.h>
 #include <AliAODPid.h>
 
@@ -30,6 +29,8 @@ class TF1;
 class TList;
 class AliVTrack;
 class TGraph;
+class AliESDpid;
+class AliAODpidUtil;
 
 class AliDielectronPID : public AliAnalysisCuts {
 public:
@@ -82,8 +83,8 @@ private:
   UChar_t  fRequirePIDbit[kNmaxPID]; //How to make use of the pid bit (see)
 
   AliESDpid *fESDpid;             //! esd pid object
-
-                                  
+  AliAODpidUtil *fAODpidUtil;     //! AOD pid object
+  
   static TGraph *fgFitCorr;       //spline fit object to correct the nsigma deviation in the TPC electron band
   static Double_t fgCorr;         //!correction value for current run. Set if fgFitCorr is set and SetCorrVal(run)
                                   // was called
@@ -93,50 +94,10 @@ private:
   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;
-  Float_t NumberOfSigmasTOF(const AliAODTrack *track, AliPID::EParticleType type) const;
-  
   AliDielectronPID(const AliDielectronPID &c);
   AliDielectronPID &operator=(const AliDielectronPID &c);
 
   ClassDef(AliDielectronPID,3)         // Dielectron PID
 };
 
-
-//
-// Inline functions for AOD as long as ther is no AOD pid object we have to fake it
-//
-
-inline Float_t AliDielectronPID::NumberOfSigmasITS(const AliAODTrack *track, AliPID::EParticleType type) const {
-  AliAODPid *pid=track->GetDetPid();
-  if (!pid) return -1000.;
-  
-  return fESDpid->GetITSResponse().GetNumberOfSigmas(track->P(),pid->GetITSsignal(),type);
-}
-
-inline Float_t AliDielectronPID::NumberOfSigmasTPC(const AliAODTrack *track, AliPID::EParticleType type) const {
-  AliAODPid *pid=track->GetDetPid();
-  if (!pid) return -1000.;
-    
-  Double_t mom = pid->GetTPCmomentum();
-  if (mom<0) mom=track->P();
-
-  //FIXME: rough estimate of the number of clusters used for PID. Needs to be fixed!!!
-  Int_t ncl=(Int_t)track->GetTPCClusterMap().CountBits();
-  return fESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),ncl,type);
-}
-
-inline Float_t AliDielectronPID::NumberOfSigmasTOF(const AliAODTrack *track, AliPID::EParticleType type) const {
-  AliAODPid *pid=track->GetDetPid();
-  if (!pid) return -1000.;
-  
-  Double_t times[AliPID::kSPECIES];
-  pid->GetIntegratedTimes(times);
-  Double_t tofRes = fESDpid->GetTOFResponse().GetExpectedSigma(track->P(),times[type],AliPID::ParticleMass(type));
-  return (pid->GetTOFsignal() - times[type])/ tofRes;
-}
-
-
-
 #endif
index 03dd07e37f02bcb551efd6f1d590267ec0f8181f..2775723f6f2ced4974b4dd3feaeb52378f95f59d 100644 (file)
@@ -136,3 +136,19 @@ void AliDielectronSignalBase::Print(Option_t */*option*/) const
     printf("Mass res.: %.5g #pm %.5g\n", fValues(5), fErrors(5));
   }
 }
+
+//______________________________________________
+void AliDielectronSignalBase::ScaleHistograms(TH1* histRaw, TH1* histBackground, Double_t intMin, Double_t intMax)
+{
+  //
+  // scale histBackground to match the integral of histRaw in the interval intMin, intMax
+  //
+  
+  Double_t intRaw  = histRaw->Integral(histRaw->FindBin(intMin),histRaw->FindBin(intMax));
+  Double_t intBack = histBackground->Integral(histBackground->FindBin(intMin),histBackground->FindBin(intMax));
+  if (intBack>0){
+    histBackground->Sumw2();
+    histBackground->Scale(1./intBack);
+    histBackground->Scale(intRaw);
+  }
+}
index 5ab434c73be44adb1f82cbf319d9e1ed9d95cd5e..58ddfccc752d41014f36a47e9e60dc92615671a6 100644 (file)
@@ -34,7 +34,8 @@ public:
   enum EBackgroundMethod {
     kFitted = 0,
     kLikeSign,
-    kEventMixing
+    kEventMixing,
+    kRotation
   };
 
   AliDielectronSignalBase();
@@ -65,9 +66,12 @@ public:
   Double_t GetMassWidth()            const { return fValues(5);}
   Double_t GetMassWidthError()       const { return fErrors(5);}
 
-  TH1F* GetSignalHistogram()      const {return fHistSignal;}
-  TH1F* GetBackgroundHistogram()  const {return fHistBackground;}
-
+  TH1* GetSignalHistogram()      const {return fHistSignal;}
+  TH1* GetBackgroundHistogram()  const {return fHistBackground;}
+  TH1* GetUnlikeSignHistogram()  const {return fHistDataPM;}
+  
+  static void ScaleHistograms(TH1* histRaw, TH1* histBackground, Double_t intMin, Double_t intMax);
+  
   virtual void Print(Option_t *option="") const;
 
   /**
@@ -82,11 +86,11 @@ public:
     
 protected: 
 
-  TH1F *fHistSignal;                  // histogram of pure signal
-  TH1F *fHistBackground;              // histogram of background (fitted=0, like-sign=1, event mixing=2)
-  TH1F *fHistDataPM;                  // histogram of selected +- pair candidates
-  TH1F *fHistDataPP;                  // histogram of selected ++ pair candidates
-  TH1F *fHistDataMM;                  // histogram of selected -- pair candidates
+  TH1 *fHistSignal;                  // histogram of pure signal
+  TH1 *fHistBackground;              // histogram of background (fitted=0, like-sign=1, event mixing=2)
+  TH1 *fHistDataPM;                  // histogram of selected +- pair candidates
+  TH1 *fHistDataPP;                  // histogram of selected ++ pair candidates
+  TH1 *fHistDataMM;                  // histogram of selected -- pair candidates
 
   TVectorD fValues;                   // values
   TVectorD fErrors;                   // value errors
index 91f617531f00cb286ceb055141668ebb48a95672..f25a0709281906a2b524f26cf617d463d0736969 100644 (file)
@@ -83,6 +83,10 @@ void AliDielectronSignalExt::Process(TObjArray* const arrhist)
       ProcessEM(arrhist);    // process event mixing method
       break;
 
+  case kRotation:
+      ProcessRotation(arrhist);
+      break;
+
     default :
       AliWarning("Subtraction method not supported. Please check SetMethod() function.");
   }
@@ -94,9 +98,9 @@ void AliDielectronSignalExt::ProcessLS(TObjArray* const arrhist)
   //
   // signal subtraction 
   //
-  fHistDataPP = (TH1F*)(arrhist->At(0))->Clone("histPP");  // ++    SE
-  fHistDataPM = (TH1F*)(arrhist->At(1))->Clone("histPM");  // +-    SE
-  fHistDataMM = (TH1F*)(arrhist->At(2))->Clone("histMM");  // --    SE   
+  fHistDataPP = (TH1*)(arrhist->At(0))->Clone("histPP");  // ++    SE
+  fHistDataPM = (TH1*)(arrhist->At(1))->Clone("histPM");  // +-    SE
+  fHistDataMM = (TH1*)(arrhist->At(2))->Clone("histMM");  // --    SE
   fHistDataPP->Sumw2();
   fHistDataPM->Sumw2();
   fHistDataMM->Sumw2();
@@ -108,10 +112,10 @@ void AliDielectronSignalExt::ProcessLS(TObjArray* const arrhist)
     fHistDataMM->Rebin(fRebin);
   }       
 
-  fHistSignal = new TH1F("HistSignal", "Like-Sign substracted signal", 
+  fHistSignal = new TH1D("HistSignal", "Like-Sign substracted signal",
                         fHistDataPM->GetXaxis()->GetNbins(),
                         fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
-  fHistBackground = new TH1F("HistBackground", "Like-sign contribution", 
+  fHistBackground = new TH1D("HistBackground", "Like-sign contribution",
                             fHistDataPM->GetXaxis()->GetNbins(),
                             fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
 
@@ -155,6 +159,46 @@ void AliDielectronSignalExt::ProcessEM(TObjArray* const arrhist)
   ProcessLS(arrhist);
 }
 
+//______________________________________________
+void AliDielectronSignalExt::ProcessRotation(TObjArray* const arrhist)
+{
+  //
+  // signal subtraction
+  //
+  fHistDataPM = (TH1*)(arrhist->At(1))->Clone("histPM");  // +-    SE
+  if (!fHistDataPM){
+    AliError("Unlike sign histogram not available. Cannot extract the signal.");
+    return;
+  }
+  fHistDataPM->Sumw2();
+
+  fHistBackground=(TH1*)arrhist->At(10)->Clone("histRotation");
+  if (!fHistBackground){
+    AliError("Histgram from rotation not available. Cannot extract the signal.");
+    delete fHistDataPM;
+    fHistDataPM=0x0;
+    return;
+  }
+
+  //scale histograms to match integral between 3.2 and 4. GeV
+  ScaleHistograms(fHistDataPM,fHistBackground,3.2,4.0);
+  fHistSignal=(TH1*)fHistDataPM->Clone("histSignal");
+  fHistSignal->Add(fHistBackground,-1.);
+
+    // signal
+  fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin),
+                                             fHistSignal->FindBin(fIntMax), fErrors(0));
+  // background
+  fValues(1) = fHistBackground->IntegralAndError(fHistBackground->FindBin(fIntMin),
+                                                 fHistBackground->FindBin(fIntMax),
+                                                 fErrors(1));
+  // S/B and significance
+  SetSignificanceAndSOB();
+  
+  fProcessed = kTRUE;
+  
+}
+
 //______________________________________________
 void AliDielectronSignalExt::Draw(const Option_t* option)
 {
index 06f836a62139476e1ab5bf5520667ed1f782bde2..7af43d1779a406dc20c0dfee8d798121487c887c 100644 (file)
@@ -58,7 +58,8 @@ public:
   virtual void Process(TObjArray* const arrhist);
   void ProcessLS(TObjArray* const arrhist);  // like-sign method
   void ProcessEM(TObjArray* const arrhist);  // event mixing method
-  
+  void ProcessRotation(TObjArray* const arrhist);  // event mixing method
+
   virtual void Draw(const Option_t* option = "");
 
 private:
index 92aaad54c8cdb43c8b4dd296c37d46ade39bcd87..30f437f818888c5dbc3f60b2859db10ad94f3c6a 100644 (file)
@@ -36,7 +36,7 @@ can be used.
 #include <TPaveText.h>
 #include <TList.h>
 #include <TFitResult.h>
-//#include <../hist/hist/src/TF1Helper.h> //not supposed to be used!
+#include <../hist/hist/src/TF1Helper.h>
 
 #include <AliLog.h>
 
@@ -137,7 +137,7 @@ void AliDielectronSignalFunc::ProcessFit(TObjArray * const arrhist) {
   // by the user in its macro
   fHistDataPM->Fit(fFuncSigBack, fFitOpt.Data(), "", fFitMin, fFitMax);
   TFitResultPtr pmFitPtr = fHistDataPM->Fit(fFuncSigBack, fFitOpt.Data(), "", fFitMin, fFitMax);
-  //TFitResult *pmFitResult = pmFitPtr.Get(); //not used when TF1Helper out
+  TFitResult *pmFitResult = pmFitPtr.Get();
   fFuncSignal->SetParameters(fFuncSigBack->GetParameters());
   fFuncBackground->SetParameters(fFuncSigBack->GetParameters()+fFuncSignal->GetNpar());
   
@@ -147,7 +147,6 @@ void AliDielectronSignalFunc::ProcessFit(TObjArray * const arrhist) {
     Double_t epm = fHistDataPM->GetBinError(iBin);
     Double_t bknd = fFuncBackground->Eval(m);
     Double_t ebknd = 0;
-    /* to be revised ... TF1Helper
     for(Int_t iPar=fFuncSignal->GetNpar(); iPar<fFuncSigBack->GetNpar(); iPar++) {
       for(Int_t jPar=iPar; jPar<fFuncSigBack->GetNpar(); jPar++) {
         TF1 gradientIpar("gradientIpar",
@@ -159,7 +158,6 @@ void AliDielectronSignalFunc::ProcessFit(TObjArray * const arrhist) {
           (iPar==jPar ? 1.0 : 2.0);
       }
     }
-    */ // TF1Helper
     Double_t signal = pm-bknd;
     Double_t error = TMath::Sqrt(epm*epm+ebknd);
     fHistSignal->SetBinContent(iBin, signal);
@@ -172,7 +170,6 @@ void AliDielectronSignalFunc::ProcessFit(TObjArray * const arrhist) {
     // signal
     fValues(0) = fFuncSignal->Integral(fIntMin, fIntMax)/fHistDataPM->GetBinWidth(1);
     fErrors(0) = 0;
-    /* to be revised ... TF1Helper
     for(Int_t iPar=0; iPar<fFuncSignal->GetNpar(); iPar++) {
       for(Int_t jPar=iPar; jPar<fFuncSignal->GetNpar(); jPar++) {
         TF1 gradientIpar("gradientIpar",
@@ -184,11 +181,9 @@ void AliDielectronSignalFunc::ProcessFit(TObjArray * const arrhist) {
           (iPar==jPar ? 1.0 : 2.0);
       }
     }
-    */ //TF1Helper
     // background
     fValues(1) = fFuncBackground->Integral(fIntMin, fIntMax)/fHistDataPM->GetBinWidth(1);
     fErrors(1) = 0;
-    /* to be revised... TF1Helper
     for(Int_t iPar=fFuncSignal->GetNpar(); iPar<fFuncSigBack->GetNpar(); iPar++) {
       for(Int_t jPar=iPar; jPar<fFuncSigBack->GetNpar(); jPar++) {
         TF1 gradientIpar("gradientIpar",
@@ -200,7 +195,6 @@ void AliDielectronSignalFunc::ProcessFit(TObjArray * const arrhist) {
           (iPar==jPar ? 1.0 : 2.0);
       }
     }
-    */ // TF1Helper
   }
   else {
     // signal
@@ -261,7 +255,6 @@ void AliDielectronSignalFunc::ProcessLS(TObjArray * const arrhist) {
   TFitResultPtr mmFitPtr = fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax);
   mmFitResult = mmFitPtr.Get();
   
-  /* to be revised ... TF1Helper
   for(Int_t iBin=1; iBin<=fHistDataPM->GetXaxis()->GetNbins(); iBin++) {
     Double_t m = fHistDataPM->GetBinCenter(iBin);
     Double_t pm = fHistDataPM->GetBinContent(iBin);
@@ -280,7 +273,6 @@ void AliDielectronSignalFunc::ProcessLS(TObjArray * const arrhist) {
           (iPar==jPar ? 1.0 : 2.0);
       }
     }
-    
     Double_t emm = 0;
     for(Int_t iPar=0; iPar<funcCloneMM->GetNpar(); iPar++) {
       for(Int_t jPar=iPar; jPar<funcCloneMM->GetNpar(); jPar++) {
@@ -304,8 +296,7 @@ void AliDielectronSignalFunc::ProcessLS(TObjArray * const arrhist) {
     fHistBackground->SetBinContent(iBin, background);
     fHistBackground->SetBinError(iBin, ebackground);
   }
-  */  // TF1Helper
-
+  
   // signal
   fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin),
                                              fHistSignal->FindBin(fIntMax), fErrors(0));
diff --git a/PWG3/dielectron/AliDielectronTrackRotator.cxx b/PWG3/dielectron/AliDielectronTrackRotator.cxx
new file mode 100644 (file)
index 0000000..8fd6ca8
--- /dev/null
@@ -0,0 +1,200 @@
+/*************************************************************************
+* 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 TrackRotator                                  //
+//                                                                       //
+//                                                                       //
+/*
+Detailed description
+
+
+*/
+//                                                                       //
+///////////////////////////////////////////////////////////////////////////
+
+#include <TMath.h>
+#include <TObjArray.h>
+#include <AliAODTrack.h>
+#include <AliESDtrack.h>
+#include <TRandom3.h>
+
+#include "AliDielectronTrackRotator.h"
+
+ClassImp(AliDielectronTrackRotator)
+
+AliDielectronTrackRotator::AliDielectronTrackRotator() :
+  TNamed(),
+  fIterations(1),
+  fRotationType(kRotateBothRandom),
+  fStartAnglePhi(TMath::Pi()),
+  fConeAnglePhi(TMath::Pi()/6.),
+  fkArrTracksP(0x0),
+  fkArrTracksN(0x0),
+  fCurrentIteration(0),
+  fCurrentTackP(0),
+  fCurrentTackN(0),
+  fTrackP(0x0),
+  fTrackN(0x0)
+{
+  //
+  // Default Constructor
+  //
+  gRandom->SetSeed();
+}
+
+//______________________________________________
+AliDielectronTrackRotator::AliDielectronTrackRotator(const char* name, const char* title) :
+  TNamed(name, title),
+  fIterations(1),
+  fRotationType(kRotateBothRandom),
+  fStartAnglePhi(TMath::Pi()),
+  fConeAnglePhi(TMath::Pi()/6.),
+  fkArrTracksP(0x0),
+  fkArrTracksN(0x0),
+  fCurrentIteration(0),
+  fCurrentTackP(0),
+  fCurrentTackN(0),
+  fTrackP(0x0),
+  fTrackN(0x0)
+{
+  //
+  // Named Constructor
+  //
+  gRandom->SetSeed();
+}
+
+//______________________________________________
+AliDielectronTrackRotator::~AliDielectronTrackRotator()
+{
+  //
+  // Default Destructor
+  //
+  
+}
+
+//______________________________________________
+void AliDielectronTrackRotator::Reset()
+{
+  //
+  // Reset the current iterators
+  //
+  fCurrentIteration=0;
+  fCurrentTackP=0;
+  fCurrentTackN=0;
+}
+
+//______________________________________________
+Bool_t AliDielectronTrackRotator::NextCombination()
+{
+  //
+  // Perform track rotation of the tracks in the track arrays as long as there are possible combinations
+  //
+  if (!fkArrTracksP || !fkArrTracksP) {
+    Reset();
+    return kFALSE;
+  }
+
+  Int_t nP=fkArrTracksP->GetEntriesFast();
+  Int_t nN=fkArrTracksN->GetEntriesFast();
+  if (nP==0||nN==0){
+    Reset();
+    return kFALSE;
+  }
+  
+  if (fCurrentIteration==fIterations){
+    fCurrentIteration=0;
+    ++fCurrentTackP;
+  }
+  
+  if (fCurrentTackP==nP){
+    ++fCurrentTackN;
+    fCurrentTackP=0;
+  }
+  
+  if (fCurrentTackN==nN){
+    Reset();
+    return kFALSE;
+  }
+  
+  if (!RotateTracks()){
+    Reset();
+    return kFALSE;
+  }
+  
+  ++fCurrentIteration;
+  return kTRUE;
+}
+
+//______________________________________________
+Bool_t AliDielectronTrackRotator::RotateTracks()
+{
+  //
+  // Actual track rotation
+  // Find out particle type and perform the rotation
+  //
+  
+  const AliVTrack *trackP=dynamic_cast<AliVTrack*>(fkArrTracksP->UncheckedAt(fCurrentTackP));
+  const AliVTrack *trackN=dynamic_cast<AliVTrack*>(fkArrTracksP->UncheckedAt(fCurrentTackN));
+  if (!trackP||!trackN) return kFALSE;
+
+  
+  Double_t angle  = fStartAnglePhi+(2*gRandom->Rndm()-1)*fConeAnglePhi;
+  Int_t    charge = TMath::Nint(gRandom->Rndm());
+  
+  if (trackP->IsA()==AliESDtrack::Class()) {
+    
+    if (!fTrackP) {
+      fTrackP=new AliESDtrack;
+      fTrackN=new AliESDtrack;
+    }
+    
+    trackP->Copy(*fTrackP);
+    trackN->Copy(*fTrackN);
+    
+    if (fRotationType==kRotatePositive||(fRotationType==kRotateBothRandom&&charge==0)){
+      ((AliESDtrack*)fTrackP)->Rotate(angle);
+    }
+    
+    if (fRotationType==kRotateNegative||(fRotationType==kRotateBothRandom&&charge==1)){
+      ((AliESDtrack*)fTrackN)->Rotate(angle);
+    }
+    
+  } else if (trackP->IsA()==AliAODTrack::Class()) {
+    
+    if (!fTrackP) {
+      fTrackP=new AliAODTrack;
+      fTrackN=new AliAODTrack;
+    }
+    
+    (*(AliAODTrack*)fTrackP)=(*(AliAODTrack*)trackP);
+    (*(AliAODTrack*)fTrackN)=(*(AliAODTrack*)trackN);
+        
+    if (fRotationType==kRotatePositive||(fRotationType==kRotateBothRandom&&charge==0)){
+      Double_t phi=fTrackP->Phi()+angle;
+      if (phi>2*TMath::Pi()) phi-=2*TMath::Pi();
+      ((AliAODTrack*)fTrackP)->SetPhi(phi);
+    }
+    
+    if (fRotationType==kRotateNegative||(fRotationType==kRotateBothRandom&&charge==1)){
+      Double_t phi=fTrackN->Phi()+angle;
+      if (phi>2*TMath::Pi()) phi-=2*TMath::Pi();
+      ((AliAODTrack*)fTrackN)->SetPhi(phi);
+    }
+    
+  }
+
+  return kTRUE;
+}
diff --git a/PWG3/dielectron/AliDielectronTrackRotator.h b/PWG3/dielectron/AliDielectronTrackRotator.h
new file mode 100644 (file)
index 0000000..634cb83
--- /dev/null
@@ -0,0 +1,85 @@
+#ifndef ALIDIELECTRONTRACKROTATOR_H
+#define ALIDIELECTRONTRACKROTATOR_H
+
+/* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+//#############################################################
+//#                                                           # 
+//#         Class AliDielectronTrackRotator                   #
+//#                                                           #
+//#  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 HD / Jens.Wiechula@cern.ch      #
+//#                                                           #
+//#############################################################
+
+#include <TNamed.h>
+
+class TObjArray;
+class AliVTrack;
+
+class AliDielectronTrackRotator : public TNamed {
+public:
+  enum ERotationType {kRotatePositive, kRotateNegative, kRotateBothRandom};
+  
+  AliDielectronTrackRotator();
+  AliDielectronTrackRotator(const char*name, const char* title);
+
+  virtual ~AliDielectronTrackRotator();
+
+  void SetTrackArrays(const TObjArray * const arrP, const TObjArray * const arrN) {fkArrTracksP=arrP;fkArrTracksN=arrN;}
+  void Reset();
+  Bool_t NextCombination();
+
+  //Setters
+  void SetIterations(UInt_t niter)         { fIterations=niter;  }
+  void SetRotationType(ERotationType type) { fRotationType=type; }
+  void SetStartAnglePhi(Double_t phi)      { fStartAnglePhi=phi; }
+  void SetConeAnglePhi(Double_t phi)       { fConeAnglePhi=phi;  }
+
+  //Getters
+  Int_t GetIterations() const           { return fIterations;    }
+  ERotationType GetRotationType() const { return fRotationType;  }
+  Double_t GetStartAnglePhi() const     { return fStartAnglePhi; }
+  Double_t GetConeAnglePhi() const      { return fConeAnglePhi;  }
+
+
+  AliVTrack* GetTrackP() const {return fTrackP;}
+  AliVTrack* GetTrackN() const {return fTrackN;}
+
+private:
+  UInt_t   fIterations;             // number of iterations
+
+  ERotationType fRotationType;      // which track to rotate
+  
+  Double_t fStartAnglePhi;          // starting angle for rotation
+  Double_t fConeAnglePhi;           // opening angle in phi for multiple rotation
+
+  const TObjArray *fkArrTracksP;           //! array of positive tracks
+  const TObjArray *fkArrTracksN;           //! array of negative tracks
+
+  UInt_t   fCurrentIteration;       //! current iteration step
+  Int_t    fCurrentTackP;           //! current positive track in array
+  Int_t    fCurrentTackN;           //! current negative track in array
+
+  AliVTrack *fTrackP;               //! Positive track
+  AliVTrack *fTrackN;               //! Negative track
+
+  Bool_t RotateTracks();
+  
+  AliDielectronTrackRotator(const AliDielectronTrackRotator &c);
+  AliDielectronTrackRotator &operator=(const AliDielectronTrackRotator &c);
+
+  
+  ClassDef(AliDielectronTrackRotator,1)         // Dielectron TrackRotator
+};
+
+
+
+#endif
index d73df879cd2a61b981b4a0187f9a1d70d0e40d04..d9241b2b9a1b9fbb3e93c5861b9bb4ec1bc135c3 100644 (file)
@@ -118,6 +118,7 @@ const char* AliDielectronVarManager::fgkParticleNames[AliDielectronVarManager::k
 };
 
 AliESDpid* AliDielectronVarManager::fgESDpid = 0x0;
+AliAODpidUtil* AliDielectronVarManager::fgAODpidUtil = 0x0;
 AliVEvent* AliDielectronVarManager::fgEvent  = 0x0;
 AliKFVertex* AliDielectronVarManager::fgKFVertex  = 0x0;
 //________________________________________________________________
index 4d7448d7b4cdffd370804f3aa51ad63ffa5cfcb4..cfcffbd4896ac470aede86d46e33b0b6f3eb3af7 100644 (file)
@@ -42,6 +42,7 @@
 
 #include <AliExternalTrackParam.h>
 #include <AliESDpid.h>
+#include <AliAODpidUtil.h>
 #include <AliPID.h>
 
 #include "AliDielectronPair.h"
@@ -165,10 +166,13 @@ public:
   static void Fill(const TObject* particle, Double_t * const values);
 
   static void InitESDpid(Int_t type=0);
+  static void InitAODpidUtil(Int_t type=0);
   static void SetESDpid(AliESDpid * const pid) {fgESDpid=pid;}
   static AliESDpid* GetESDpid() {return fgESDpid;}
+  static AliAODpidUtil* GetAODpidUtil() {return fgAODpidUtil;}
   static void SetEvent(AliVEvent * const ev);
-
+  static Bool_t GetDCA(const AliAODTrack *track, Double_t d0z0[2]);
+    
   static const char* GetValueName(Int_t i) { return (i>=0&&i<kNMaxValues)?fgkParticleNames[i]:""; }
 private:
 
@@ -185,9 +189,10 @@ private:
   static void FillVarAODEvent(const AliAODEvent *event,              Double_t * const values);
   static void FillVarMCEvent(const AliMCEvent *event,                Double_t * const values);
   
-  static AliESDpid* fgESDpid;                 // ESD pid object
-  static AliVEvent* fgEvent;                  // current event pointer
-  static AliKFVertex *fgKFVertex;          // kf vertex
+  static AliESDpid     *fgESDpid;             // ESD pid object
+  static AliAODpidUtil *fgAODpidUtil;         // AOD pid object
+  static AliVEvent     *fgEvent;              // current event pointer
+  static AliKFVertex   *fgKFVertex;           // kf vertex
   
   AliDielectronVarManager(const AliDielectronVarManager &c);
   AliDielectronVarManager &operator=(const AliDielectronVarManager &c);
@@ -242,7 +247,9 @@ inline void AliDielectronVarManager::FillVarVParticle(const AliVParticle *partic
   values[AliDielectronVarManager::kE]         = particle->E();
   values[AliDielectronVarManager::kM]         = particle->M();
   values[AliDielectronVarManager::kCharge]    = particle->Charge();
-
+  
+  values[AliDielectronVarManager::kPdgCode]   = particle->PdgCode();
+    
   if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values);
 }
 
@@ -324,8 +331,7 @@ inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle
   // TODO: for the moment we set the bethe bloch parameters manually
   //       this should be changed in future!
   
-  values[AliDielectronVarManager::kTPCnSigmaEle]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kElectron);
-    //-AliDielectronPID::GetCorrVal();
+  values[AliDielectronVarManager::kTPCnSigmaEle]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kElectron)-AliDielectronPID::GetCorrVal();
   values[AliDielectronVarManager::kTPCnSigmaPio]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kPion);
   values[AliDielectronVarManager::kTPCnSigmaMuo]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kMuon);
   values[AliDielectronVarManager::kTPCnSigmaKao]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kKaon);
@@ -371,12 +377,14 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle
   values[AliDielectronVarManager::kTRDprobPio]    = 0;
   
   //TODO: This is only an approximation!!!
-  values[AliDielectronVarManager::kTPCsignalN]    = values[AliDielectronVarManager::kNclsTPC];
+  values[AliDielectronVarManager::kTPCsignalN]    = 0;
   
-// Fill AliAODTrack interface information
-  // ...
-  values[AliDielectronVarManager::kImpactParXY]   = particle->DCA();
-  values[AliDielectronVarManager::kImpactParZ]    = particle->ZAtDCA();
+  // Fill AliAODTrack interface information
+  //
+  Double_t d0z0[2];
+  GetDCA(particle, d0z0);
+  values[AliDielectronVarManager::kImpactParXY]   = d0z0[0];
+  values[AliDielectronVarManager::kImpactParZ]    = d0z0[1];
 
   values[AliDielectronVarManager::kPIn]=0;
   values[AliDielectronVarManager::kTPCsignal]=0;
@@ -392,18 +400,12 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle
   AliAODPid *pid=particle->GetDetPid();
   if (pid){
     Double_t mom =pid->GetTPCmomentum();
-    //TODO: kTPCsignalN is only an approximation (see above)!!
-
-    Double_t tpcNsigmaEle=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
-      TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]) ,AliPID::kElectron);
-    Double_t tpcNsigmaPio=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
-      TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]),AliPID::kPion);
-    Double_t tpcNsigmaMuo=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
-      TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]),AliPID::kMuon);
-    Double_t tpcNsigmaKao=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
-      TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]),AliPID::kKaon);
-    Double_t tpcNsigmaPro=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
-      TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]),AliPID::kProton);
+    values[AliDielectronVarManager::kTPCsignalN] = pid->GetTPCsignalN();
+    Double_t tpcNsigmaEle=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kElectron);
+    Double_t tpcNsigmaPio=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kPion);
+    Double_t tpcNsigmaMuo=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kMuon);
+    Double_t tpcNsigmaKao=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kKaon);
+    Double_t tpcNsigmaPro=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kProton);
     
     values[AliDielectronVarManager::kPIn]=mom;
     values[AliDielectronVarManager::kTPCsignal]=pid->GetTPCsignal();
@@ -475,7 +477,10 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa
   //
   // Fill pair information available for histogramming into an array
   //
-
+  
+  values[AliDielectronVarManager::kPdgCode]=0;
+  values[AliDielectronVarManager::kPdgCodeMother]=0;
+  
   // Fill common AliVParticle interface information
   FillVarVParticle(pair, values);
 
@@ -617,6 +622,36 @@ inline void AliDielectronVarManager::InitESDpid(Int_t type)
   fgESDpid->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);
 }
 
+inline void AliDielectronVarManager::InitAODpidUtil(Int_t type)
+{
+  if (!fgAODpidUtil) fgAODpidUtil=new AliAODpidUtil;
+  Double_t alephParameters[5];
+  // simulation
+  alephParameters[0] = 2.15898e+00/50.;
+  alephParameters[1] = 1.75295e+01;
+  alephParameters[2] = 3.40030e-09;
+  alephParameters[3] = 1.96178e+00;
+  alephParameters[4] = 3.91720e+00;
+  fgAODpidUtil->GetTOFResponse().SetTimeResolution(80.);
+  
+  // data
+  if (type==1){
+    alephParameters[0] = 0.0283086/0.97;
+    alephParameters[1] = 2.63394e+01;
+    alephParameters[2] = 5.04114e-11;
+    alephParameters[3] = 2.12543e+00;
+    alephParameters[4] = 4.88663e+00;
+    fgAODpidUtil->GetTOFResponse().SetTimeResolution(130.);
+    fgAODpidUtil->GetTPCResponse().SetMip(50.);
+  }
+  
+  fgAODpidUtil->GetTPCResponse().SetBetheBlochParameters(
+    alephParameters[0],alephParameters[1],alephParameters[2],
+    alephParameters[3],alephParameters[4]);
+  
+  fgAODpidUtil->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);
+}
+
 
 inline void AliDielectronVarManager::SetEvent(AliVEvent * const ev)
 {
@@ -626,6 +661,28 @@ inline void AliDielectronVarManager::SetEvent(AliVEvent * const ev)
   fgKFVertex=0x0;
   if (ev && ev->GetPrimaryVertex()) fgKFVertex=new AliKFVertex(*ev->GetPrimaryVertex());
 }
+
+
+inline Bool_t AliDielectronVarManager::GetDCA(const AliAODTrack *track, Double_t d0z0[2])
+{
+  if(track->TestBit(AliAODTrack::kIsDCA)){
+    d0z0[0]=track->DCA();
+    d0z0[1]=track->ZAtDCA();
+    return kTRUE;
+  }
+  
+  Double_t covd0z0[3];
+  AliAODTrack copy(*track);
+  AliAODVertex *vtx =(AliAODVertex*)(fgEvent->GetPrimaryVertex());
+  Double_t fBzkG = fgEvent->GetMagneticField(); // z componenent of field in kG
+  Bool_t ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
+  if(!ok){
+    d0z0[0]=-999.;
+    d0z0[1]=-999.;
+  }
+  return ok;
+}
+
 /*
 inline void AliDielectronVarManager::FillValues(const TParticle *particle, Double_t *values)
 {
index 3d6ca7422cc38ea720c60c4b87164d63a396ae41..9f28d9fe82854c28f2529f14b7d5bbb71ee81a41 100644 (file)
@@ -8,7 +8,7 @@ AliAnalysisTask *AddTaskJPSIFilter(){
   
   //check for output aod handler
   if (!mgr->GetOutputEventHandler()||mgr->GetOutputEventHandler()->IsA()!=AliAODHandler::Class()) {
-    Error("AddTaskJPSIFilter","No AOD output handler available. Cannot Proceed!");
+    Warning("AddTaskJPSIFilter","No AOD output handler available. Not adding the task!");
     return 0;
   }
 
@@ -17,6 +17,24 @@ AliAnalysisTask *AddTaskJPSIFilter(){
   
   //Do we run on AOD?
   Bool_t isAOD=mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class();
+
+  if(isAOD) {
+    //add options to AliAODHandler to duplicate input event
+    AliAODHandler *aodHandler = (AliAODHandler*)mgr->GetOutputEventHandler();
+    aodHandler->SetCreateNonStandardAOD();
+    aodHandler->SetNeedsHeaderReplication();
+    aodHandler->SetNeedsTracksBranchReplication();
+    aodHandler->SetNeedsVerticesBranchReplication();
+    aodHandler->SetNeedsV0sBranchReplication();
+    aodHandler->SetNeedsCascadesBranchReplication();
+    aodHandler->SetNeedsTrackletsBranchReplication();
+    aodHandler->SetNeedsPMDClustersBranchReplication();
+    aodHandler->SetNeedsJetsBranchReplication();
+    aodHandler->SetNeedsFMDClustersBranchReplication();
+    aodHandler->SetNeedsCaloClustersBranchReplication();
+    //aodHandler->SetNeedsMCParticlesBranchReplication();
+    aodHandler->SetNeedsDimuonsBranchReplication();
+  }
   
   //Create task and add it to the analysis manager
   AliAnalysisTaskDielectronFilter *task=new AliAnalysisTaskDielectronFilter("jpsi_DielectronFilter");
index 884160f3cad59b70a13bc4d1ef0629942ede6a37..c4361b145e4a51eb10950525520de6e8759ded48 100644 (file)
@@ -43,6 +43,9 @@ AliDielectron* ConfigJpsi2ee(Int_t cutDefinition, Bool_t isAOD=kFALSE)
 //   if (cutDefinition<nDie-1)
   InitCFDieleData(diele, cutDefinition, isAOD);
 
+  AliDielectronTrackRotator *rot=new AliDielectronTrackRotator;
+  rot->SetIterations(10);
+  diele->SetTrackRotator(rot);
   return diele;
 }
 
@@ -174,6 +177,10 @@ void InitHistogramsDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t i
   for (Int_t i=0; i<3; ++i){
     histos->AddClass(Form("Track_Legs_%s",AliDielectron::PairClassName(i)));
   }
+  //track rotation
+  histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(10)));
+  histos->AddClass(Form("Track_Legs_%s",AliDielectron::PairClassName(10)));
+  
   
   //add histograms to event class
   if (cutDefinition==0){
@@ -220,7 +227,7 @@ void InitCFDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t isAOD)
   
   cf->AddVariable(AliDielectronVarManager::kY,40,-2,2);
   cf->AddVariable(AliDielectronVarManager::kM,50,1.98,1.98+50*.04); //40Mev Steps
-  cf->AddVariable(AliDielectronVarManager::kPairType,10,0,10);
+  cf->AddVariable(AliDielectronVarManager::kPairType,11,0,11);
   //leg variables
   cf->AddVariable(AliDielectronVarManager::kPt,"0.0, 0.8, 1.2, 100.0",kTRUE);
   cf->AddVariable(AliDielectronVarManager::kNclsTPC,"0, 100, 120, 160",kTRUE);
index 7652498ce27ee7c354b56f760eddf846f168b160..70e42b07814feea791f706a0f9171712dd7d0c52 100644 (file)
@@ -322,6 +322,7 @@ void DrawUnbinned(){
   
 Int_t baseColors[5]={kRed, kGreen+1, kAzure-4, kMagenta, kCyan+1};
   Int_t sigmaColorOffset=0;
+Int_t baseColors[5]={kRed, kRed, kRed, kRed, kRed};
 
   Double_t sigmas[5]={3,3,3,3,3};
   Double_t masses[5];
@@ -336,7 +337,7 @@ Int_t baseColors[5]={kRed, kGreen+1, kAzure-4, kMagenta, kCyan+1};
   alephParameters[2] = 5.04114e-11;
   alephParameters[3] = 2.12543e+00;
   alephParameters[4] = 4.88663e+00;
-  Double_t mip=49.2;
+  Double_t mip=50;
 
   Color_t color=kRed;
   Int_t lineWidth=2;
@@ -723,7 +724,7 @@ c->SetAlias("Ptcut","Leg1_Pt>1&&Leg2_Pt>1")
 c->SetAlias("TOFcut","abs(Leg1_TOF_nSigma_Electrons)<3&&abs(Leg2_TOF_nSigma_Electrons)<3");
 c->SetAlias("TOFcut2","(Leg1_P_InnerParam<1.3&&abs(Leg1_TOF_nSigma_Electrons)<3||Leg1_P_InnerParam>=1.3)&&(Leg2_P_InnerParam<1.3&&abs(Leg2_TOF_nSigma_Electrons)<3||Leg2_P_InnerParam>=1.3)");
 c->SetAlias("TPCcut","(Leg1_TPC_signal>70*(1-exp(-1*(Leg1_P_InnerParam+2))))&&(Leg2_TPC_signal>70*(1-exp(-1*(Leg2_P_InnerParam+2))))")
-c->SetAlias("NClcut","Leg1_NclsTPC>120&&Leg2_NclsTPC>120");
+c->SetAlias("NClcut","Leg1_NclsTPC>90&&Leg2_NclsTPC>90");
 
 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&&Run<127719")
@@ -920,5 +921,33 @@ c1->Print("pics/M_nClCut_tpc_tof.png");
 
 
 
+c->SetAlias("NClcut","Leg1_NclsTPC>90&&Leg2_NclsTPC>90");
+c->SetAlias("Ptcut","Leg1_Pt>1&&Leg2_Pt>1")
+c->SetAlias("PairT","PairType==1");
+c->SetAlias("cut","NClcut&&Ptcut&&PairT")
+
+
+c->SetAlias("cutE","abs(Leg1_TPC_nSigma_Electrons)<3&&abs(Leg2_TPC_nSigma_Electrons)<3");
+c->SetAlias("cutPi","abs(Leg1_TPC_nSigma_Pions)>3&&abs(Leg2_TPC_nSigma_Pions)>3");
+c->SetAlias("cutP","(Leg1_TPC_nSigma_Protons)>3&&(Leg2_TPC_nSigma_Protons)>3");
+c->SetAlias("cut","NClcut&&Ptcut&&PairT&&cutE&&cutPi&&cutP")
+
+c->SetAlias("eta","abs(Leg1_Eta)<0.88&&abs(Leg1_Eta)<0.88");
+c->SetAlias("rap","abs(Y)<0.88");
+c->SetAlias("spdFirst","(Leg1_ITS_clusterMap&1)==1&&(Leg2_ITS_clusterMap&1)==1")
+c->SetAlias("cut","NClcut&&Ptcut&&PairT&&cutE&&cutPi&&cutP&&eta&&rap&&spdFirst")
+ c->Draw("M>>hM(50,1.98,1.98+50*.04)","cut","e")
+
+
+c->SetAlias("cutProL1",Form("Leg1_TPC_nSigma_Electrons>(%f*%f+(AliExternalTrackParam::BetheBlochAleph(Leg1_P_InnerParam/%f,0.0283086/0.97,2.63394e+01,5.04114e-11,2.12543e+00,4.88663e+00)-AliExternalTrackParam::BetheBlochAleph(Leg1_P_InnerParam/%f,0.0283086/0.97,2.63394e+01,5.04114e-11,2.12543e+00,4.88663e+00)))/%f",nSigma,resolution, AliPID::ParticleMass(AliPID::kProton), AliPID::ParticleMass(AliPID::kElectron), resolution))
+
+c->SetAlias("cutProL2",Form("Leg2_TPC_nSigma_Electrons>(%f*%f+(AliExternalTrackParam::BetheBlochAleph(Leg2_P_InnerParam/%f,0.0283086/0.97,2.63394e+01,5.04114e-11,2.12543e+00,4.88663e+00)-AliExternalTrackParam::BetheBlochAleph(Leg2_P_InnerParam/%f,0.0283086/0.97,2.63394e+01,5.04114e-11,2.12543e+00,4.88663e+00)))/%f",nSigma,resolution, AliPID::ParticleMass(AliPID::kProton), AliPID::ParticleMass(AliPID::kElectron), resolution))
+
+c->SetAlias("cutPioL1",Form("Leg1_TPC_nSigma_Electrons>(%f*%f+(AliExternalTrackParam::BetheBlochAleph(Leg1_P_InnerParam/%f,0.0283086/0.97,2.63394e+01,5.04114e-11,2.12543e+00,4.88663e+00)-AliExternalTrackParam::BetheBlochAleph(Leg1_P_InnerParam/%f,0.0283086/0.97,2.63394e+01,5.04114e-11,2.12543e+00,4.88663e+00)))/%f",nSigma,resolution, AliPID::ParticleMass(AliPID::kPion), AliPID::ParticleMass(AliPID::kElectron), resolution))
+
+c->SetAlias("cutPioL2",Form("Leg2_TPC_nSigma_Electrons>(%f*%f+(AliExternalTrackParam::BetheBlochAleph(Leg2_P_InnerParam/%f,0.0283086/0.97,2.63394e+01,5.04114e-11,2.12543e+00,4.88663e+00)-AliExternalTrackParam::BetheBlochAleph(Leg2_P_InnerParam/%f,0.0283086/0.97,2.63394e+01,5.04114e-11,2.12543e+00,4.88663e+00)))/%f",nSigma,resolution, AliPID::ParticleMass(AliPID::kPion), AliPID::ParticleMass(AliPID::kElectron), resolution))
+
+c->SetAlias("cutPro","cutProL1&&cutProL2");
+c->SetAlias("cutPio","cutPioL1&&cutPioL2");
 */
 
diff --git a/PWG3/dielectron/macros/PlotDataResults.C b/PWG3/dielectron/macros/PlotDataResults.C
new file mode 100644 (file)
index 0000000..3e9e04d
--- /dev/null
@@ -0,0 +1,164 @@
+#include <TROOT.h>
+#include <TStyle.h>
+#include <TH1D.h>
+#include <TObjArray.h>
+#include <TCanvas.h>
+#include <TMath.h>
+#include <TAxis.h>
+
+#include "AliDielectronSignalExt.h"
+#include "AliDielectronCFdraw.h"
+#include "AliDielectron.h"
+
+/*
+gSystem->AddIncludePath("-I/data/Work/software/svngsi/dielectron/trunk/dielectron");
+.L PlotDataResults.C+g
+PlotDataResuts("/data/Work/train/V005.data/2010-10-29_2144.3552/mergedPeriods/data/7TeV/LHC10c.pass2/jpsi.root");
+PlotDataResuts("/data/Work/train/V005.data/2010-10-21_2342.3445/mergedPeriods/data/7TeV/LHC10pass2/jpsi.root")
+PlotDataResuts("/data/Work/train/V005.data/2010-10-21_2342.3445/mergedPeriods/data/7TeV/LHC10d.pass1/wiechula_jpsi.root");
+*/
+
+AliDielectronSignalBase* GetSignalLS(AliDielectronCFdraw &d, Int_t step, const char* nameAdd);
+AliDielectronSignalBase* GetSignalRot(AliDielectronCFdraw &d, Int_t step, const char* nameAdd);
+void DrawSpectra(AliDielectronSignalBase *sig, const char* cname);
+
+//_______________________________________
+void PlotDataResuts(const char* filename)
+{
+  AliDielectronCFdraw d(filename);
+  
+  Int_t stepFirst=0, stepAny=1;
+  
+  gStyle->SetOptStat(0);
+  //Set common Ranges
+//   d.SetRangeUser("Leg1_Pt",1.,1000.);
+//   d.SetRangeUser("Leg2_Pt",1.,1000.);
+  
+  //============================
+  //SPD first
+  //
+
+  //--- Like sign subtraction
+  AliDielectronSignalBase *sigFirst=GetSignalLS(d,stepFirst,"First");
+  DrawSpectra(sigFirst,"cFirst");
+  //--- Rotation subtraction
+  AliDielectronSignalBase *sigFirstRot=GetSignalRot(d,stepFirst,"FirstRot");
+  DrawSpectra(sigFirstRot,"cFirstRot");
+  
+  //============================
+  //SPD any
+  //
+  AliDielectronSignalBase *sigAny=GetSignalLS(d,stepAny,"Any");
+  DrawSpectra(sigAny,"cAny");
+  //--- Rotation subtraction
+  AliDielectronSignalBase *sigAnyRot=GetSignalRot(d,stepAny,"AnyRot");
+  DrawSpectra(sigAnyRot,"cAnyRot");
+  
+}
+
+
+//_______________________________________
+AliDielectronSignalBase *GetSignalLS(AliDielectronCFdraw &d, Int_t step, const char* nameAdd)
+{
+  //
+  // Get Extracted signal from likesign method
+  //
+  
+  TObjArray *arr=new TObjArray;
+  arr->SetOwner();
+
+  for (Int_t iType=0;iType<3;++iType){
+    d.SetRangeUser("PairType",iType,iType);
+    arr->AddAt(d.Project("M",step),iType);
+  }
+
+  AliDielectronSignalExt *sig=new AliDielectronSignalExt;
+  sig->SetIntegralRange(2.9,3.15);
+  sig->SetMethod(AliDielectronSignalBase::kLikeSign);
+  sig->Process(arr);
+  
+  delete arr;
+  return sig;
+}
+
+//_______________________________________
+AliDielectronSignalBase *GetSignalRot(AliDielectronCFdraw &d, Int_t step, const char* nameAdd)
+{
+  //
+  // Get Extracted signal from likesign method
+  //
+  
+  TObjArray *arr=new TObjArray;
+  arr->SetOwner();
+
+  Int_t iType=AliDielectron::kEv1PM;
+  d.SetRangeUser("PairType",iType,iType);
+  arr->AddAt(d.Project("M",step),iType);
+  
+  iType=AliDielectron::kEv1PMRot;
+  d.SetRangeUser("PairType",iType,iType);
+  arr->AddAt(d.Project("M",step),iType);
+  
+  AliDielectronSignalExt *sig=new AliDielectronSignalExt;
+  sig->SetIntegralRange(2.9,3.15);
+  sig->SetMethod(AliDielectronSignalBase::kRotation);
+  sig->Process(arr);
+  
+  delete arr;
+  return sig;
+}
+
+//_______________________________________
+void DrawSpectra(AliDielectronSignalBase *sig, const char* cname)
+{
+  //
+  //
+  //
+  gStyle->SetOptTitle(0);
+  TCanvas *c=(TCanvas*)gROOT->FindObject(cname);
+  if (!c) c=new TCanvas(cname,cname,400,600);
+  c->Clear();
+  c->Divide(1,2,0,0);
+  c->cd(1);
+  gPad->SetTopMargin(0.01);
+  gPad->SetRightMargin(0.01);
+  
+  gPad->SetBottomMargin(0);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetTickx();
+  gPad->SetTicky();
+
+  TH1 *hUS=sig->GetUnlikeSignHistogram();
+  hUS->SetMarkerStyle(20);
+  hUS->SetMarkerSize(0.7);
+  hUS->SetMarkerColor(kRed);
+  hUS->SetLineColor(kRed);
+  hUS->SetStats(0);
+  
+  TH1* hBackground=sig->GetBackgroundHistogram();
+  hBackground->SetMarkerStyle(24);
+  hBackground->SetMarkerSize(0.7);
+  hBackground->SetStats(0);
+  hBackground->SetMarkerColor(kBlue);
+  hBackground->SetLineColor(kBlue);
+  
+  hUS->Draw();
+  hBackground->Draw("same");
+  
+  c->cd(2);
+  gPad->SetRightMargin(0.01);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetTickx();
+  gPad->SetTicky();
+  gPad->SetTopMargin(0);
+
+  TH1* hSignal=sig->GetSignalHistogram();
+  hSignal->SetMarkerStyle(20);
+  hSignal->SetMarkerSize(0.7);
+  hSignal->SetMarkerColor(kRed);
+  hSignal->SetLineColor(kRed);
+  hSignal->Draw();
+}
+
index 79ef0e6e2f1ca859f4dc99bba4505159ab808982..e43a85b46b3459edf7b098c2f1893d022d05c5b1 100644 (file)
@@ -19,7 +19,10 @@ SRCS= dielectron/AliDielectron.cxx \
       dielectron/AliDielectronSignalExt.cxx \
       dielectron/AliDielectronSpectrum.cxx \
       dielectron/AliDielectronDebugTree.cxx \
-      dielectron/AliDielectronPID.cxx
+      dielectron/AliDielectronTrackRotator.cxx \
+      dielectron/AliDielectronPID.cxx \
+      dielectron/AliDielectronCutGroup.cxx \
+      dielectron/AliDielectronEventCuts.cxx
 
 HDRS= $(SRCS:.cxx=.h)