+// ----------------------------------------------------------------
+// AliBackgroundSelection
+//
+// This class implements to cuts to reject background events from the
+// samples to be used in the physics analysis:
+// 1. A linear cut on the correlation cluster vs tracklets
+// 2. A cut on the delta phi window used by the vertexer Z
+// The parameters used in both cuts can be set
+//
+// The class also produces control histograms for all and accepted
+// events, for each trigger class present in the data independently.
+// Histograms are booked on the fly in the UserExec, whenever a new
+// trigger class is found.
+//
+// After the first implementation, it was realized that the deltaphi
+// cut is more a quality selection cut than an event selection cut, so
+// it is effectively disabled by default.
+//
+// Author: Michele Floris, CERN
+// ----------------------------------------------------------------
+
+
#include "AliBackgroundSelection.h"
#include "TH2F.h"
#include "TList.h"
-#include "AliLog.h"
#include "TString.h"
#include "AliESDInputHandlerRP.h"
#include "AliAnalysisManager.h"
#include "TTree.h"
+#include "AliMultiplicity.h"
#ifdef PASS1RECO
-#include "../ITS/AliITSRecPoint.h"
+#include "AliITSRecPoint.h"
#endif
-#include "AliMultiplicity.h"
+
+
ClassImp(AliBackgroundSelection)
AliBackgroundSelection::AliBackgroundSelection():
AliAnalysisCuts(), fOutputHist(0), fACut(0), fBCut(0), fDeltaPhiCut(10)
{
-
+ // ctor
fOutputHist = new TList();
fOutputHist->SetOwner();
fACut = 65;
AliBackgroundSelection::AliBackgroundSelection(const char* name, const char* title):
AliAnalysisCuts(name,title), fOutputHist(0), fACut(0), fBCut(0), fDeltaPhiCut(10)
{
-
+ // ctor
fOutputHist = new TList();
fOutputHist->SetOwner();
fACut = 65;
AliBackgroundSelection::AliBackgroundSelection(const AliBackgroundSelection& obj) : AliAnalysisCuts(obj),
fOutputHist(0), fACut(0), fBCut(0), fDeltaPhiCut(0)
{
-
+ // copy ctor
fOutputHist = obj.fOutputHist;
fACut = obj.fACut;
fBCut = obj.fBCut;
}
AliBackgroundSelection::~AliBackgroundSelection() {
+ // dtor
if(fOutputHist) {
delete fOutputHist;
fOutputHist = 0;
}
-Bool_t AliBackgroundSelection::IsSelected(TObject* obj)
+Bool_t AliBackgroundSelection::IsSelected(TObject* const obj)
{
+ // returns false if the event is identifiead as beam background,
+ // true otherwise.
// reset fSelected
SetSelected(kFALSE);
void AliBackgroundSelection::Init(){
+ // Set default cut values
fACut = 65;
fBCut = 4;
void AliBackgroundSelection::BookClusterVsTrackletsHisto(const char * trigger_name){
+ // Book control histogram for the cut on the correlation cluster vs tracklets
+
Bool_t oldStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE);
- TH2F * h1 = new TH2F(GetClusterVsTrackletsHistoName(trigger_name),trigger_name, 50, -0.5, 49.5, 1000, -0.5, 999.5);
+ TH2F * h1 = new TH2F(GetClusterVsTrackletsHistoName(trigger_name),trigger_name, 300, -0.5, 2999.5, 1000, -0.5, 9999.5);
h1->SetXTitle("Tracklets");
h1->SetYTitle("SPD Clusters");
- AliInfo(Form("Creating histos: %s, all and accepted", GetClusterVsTrackletsHistoName(trigger_name)));
+ // AliInfo(Form("Creating histos: %s, all and accepted", GetClusterVsTrackletsHistoName(trigger_name)));
TH2F * h2 = new TH2F(GetClusterVsTrackletsHistoNameAccepted(trigger_name),TString(trigger_name)+ "(accepted)",
- 50, -0.5, 49.5, 1000, -0.5, 999.5);
+ 300, -0.5, 2999.5, 1000, -0.5, 9999.5);
h2->SetXTitle("Tracklets");
h2->SetYTitle("SPD Clusters");
void AliBackgroundSelection::BookDeltaPhiHisto(const char * trigger_name){
+ // Book control histogram for the cut on the DeltaPhi window used by vertexer Z
+
Bool_t oldStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE);
TH1F * h1 = new TH1F(GetDeltaPhiHistoName(trigger_name),trigger_name, 100,0,0.5);
h1->SetXTitle("#Delta #phi");
- AliInfo(Form("Creating histos: %s, all and accepted", GetDeltaPhiHistoName(trigger_name)));
+ // AliInfo(Form("Creating histos: %s, all and accepted", GetDeltaPhiHistoName(trigger_name)));
TH1F * h2 = new TH1F(GetDeltaPhiHistoNameAccepted(trigger_name),TString(trigger_name)+ "(accepted)", 100,0,0.5);
h2->SetXTitle("#Delta #phi");
}
TH2F * AliBackgroundSelection::GetClusterVsTrackletsHisto(const char * trigger_name){
+
+ // Returns the control histogram corresponding to a given trigger
+ // class. If it does not exist, it creates it and adds it to the
+ // output list
+ // All Events
+
if(!fOutputHist) {AliError("List of histos not initialized");return 0;}
TH2F * h = (TH2F*) fOutputHist->FindObject(GetClusterVsTrackletsHistoName(trigger_name));
if(!h) {
return h;
}
TH1F * AliBackgroundSelection::GetDeltaPhiHisto(const char * trigger_name){
+
+ // Returns the control histogram corresponding to a given trigger
+ // class. If it does not exist, it creates it and adds it to the
+ // output list
+ // All Events
+
if(!fOutputHist) {AliError("List of histos not initialized");return 0;}
TH1F * h = (TH1F*) fOutputHist->FindObject(GetDeltaPhiHistoName(trigger_name));
if(!h) {
TH2F * AliBackgroundSelection::GetClusterVsTrackletsHistoAccepted(const char * trigger_name){
+ // Returns the control histogram corresponding to a given trigger
+ // class. If it does not exist, it creates it and adds it to the
+ // output list
+ // Events passing the cut only
+
if(!fOutputHist) {AliError("List of histos not initialized");return 0;}
TH2F * h = (TH2F*) fOutputHist->FindObject(GetClusterVsTrackletsHistoNameAccepted(trigger_name));
if(!h) {
TH1F * AliBackgroundSelection::GetDeltaPhiHistoAccepted(const char * trigger_name){
+ // Returns the control histogram corresponding to a given trigger
+ // class. If it does not exist, it creates it and adds it to the
+ // output list
+ // Events passing the cut only
+
if(!fOutputHist) {AliError("List of histos not initialized");return 0;}
TH1F * h = (TH1F*) fOutputHist->FindObject(GetDeltaPhiHistoNameAccepted(trigger_name));
if(!h) {
}
const char * AliBackgroundSelection::GetClusterVsTrackletsHistoName(const char * trigger_name){
+
+ // build up the name of the cluster vs tracklets histo using the trigger class
+
static TString str;
str = ("hCvsT");
str = str+GetName()+"_"+trigger_name;
}
const char * AliBackgroundSelection::GetClusterVsTrackletsHistoNameAccepted(const char * trigger_name){
+
+ // build up the name of the cluster vs tracklets histo using the trigger class (accepted events)
static TString str;
str = ("hCvsT");
str = str+GetName()+"_"+trigger_name + "_accepted";
}
const char * AliBackgroundSelection::GetDeltaPhiHistoName(const char * trigger_name){
+
+ // build up the name of the delta phi histo using the trigger class
+
+
static TString str;
str = ("hDeltaPhi");
str = str+GetName()+"_"+trigger_name;
}
const char * AliBackgroundSelection::GetDeltaPhiHistoNameAccepted(const char * trigger_name){
+
+ // build up the name of the delta phi histo using the trigger class (accepted events)
+
static TString str;
str = ("hDeltaPhi");
str = str+GetName()+"_"+trigger_name + "_accepted";
return str.Data();
}
-Long64_t AliBackgroundSelection::Merge(TCollection* list)
+Long64_t AliBackgroundSelection::Merge(TCollection* const list)
{
// Merge a list of AliBackgroundSelection objects with this (needed for
// PROOF).
// the same order. We thus also have to sort the list (sorting is
// done by name in TList).
- AliInfo("Merging");
+ //AliInfo("Merging");
if (!list)
return 0;
Bool_t areListsDifferent=kTRUE;
Int_t iloop = 0;
- Int_t max_loops = hlist->GetSize() + fOutputHist->GetSize(); // In the worst case all of the histos will be different...
+ Int_t maxLoops = hlist->GetSize() + fOutputHist->GetSize(); // In the worst case all of the histos will be different...
while(areListsDifferent) {
- if(iloop>max_loops) AliFatal("Infinite Loop?");
+ if(iloop>maxLoops) AliFatal("Infinite Loop?");
iloop++;
// sort
hlist->Sort();
while ((hist= iterlist->Next())){
if(!otherlist->FindObject(hist->GetName())){
- AliInfo(Form("Adding object %s",hist->GetName()));
+ //AliInfo(Form("Adding object %s",hist->GetName()));
foundDiffinThisIterStep = kTRUE;
TH1 * hclone = (TH1*) hist->Clone();
hclone->Reset();
}
}
+ delete iterlist;
// re-sort before checking
hlist->Sort();
fOutputHist->Sort();