1 #include "AliBackgroundSelection.h"
\r
6 #include "AliESDInputHandlerRP.h"
\r
7 #include "AliAnalysisManager.h"
\r
10 #include "../ITS/AliITSRecPoint.h"
\r
12 #include "AliMultiplicity.h"
\r
14 ClassImp(AliBackgroundSelection)
\r
16 AliBackgroundSelection::AliBackgroundSelection():
\r
17 AliAnalysisCuts(), fOutputHist(0), fACut(0), fBCut(0), fDeltaPhiCut(0)
\r
20 fOutputHist = new TList();
\r
21 fOutputHist->SetOwner();
\r
24 fDeltaPhiCut = 0.02;
\r
27 AliBackgroundSelection::AliBackgroundSelection(const char* name, const char* title):
\r
28 AliAnalysisCuts(name,title), fOutputHist(0), fACut(0), fBCut(0), fDeltaPhiCut(0)
\r
31 fOutputHist = new TList();
\r
32 fOutputHist->SetOwner();
\r
35 fDeltaPhiCut = 0.02;
\r
39 AliBackgroundSelection::AliBackgroundSelection(const AliBackgroundSelection& obj) : AliAnalysisCuts(obj),
\r
40 fOutputHist(0), fACut(0), fBCut(0), fDeltaPhiCut(0)
\r
43 fOutputHist = obj.fOutputHist;
\r
46 fDeltaPhiCut = obj.fDeltaPhiCut;
\r
49 AliBackgroundSelection::~AliBackgroundSelection() {
\r
57 Bool_t AliBackgroundSelection::IsSelected(TObject* obj){
\r
60 SetSelected(kFALSE);
\r
63 AliESDInputHandlerRP* handlerRP = dynamic_cast<AliESDInputHandlerRP*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
\r
65 AliFatal("Cannot get the AliESDInputHandlerRP");
\r
67 TTree* itsClusterTree = handlerRP->GetTreeR("ITS");
\r
68 if (!itsClusterTree){
\r
69 AliError("Cannot get the ITS Cluster tree");
\r
72 // AliFatal("Cannot get the ITS Cluster tree");
\r
74 TClonesArray* itsClusters = new TClonesArray("AliITSRecPoint");
\r
75 TBranch* itsClusterBranch=itsClusterTree->GetBranch("ITSRecPoints");
\r
77 itsClusterBranch->SetAddress(&itsClusters);
\r
79 Int_t nItsSubs = (Int_t)itsClusterTree->GetEntries();
\r
82 AliESDEvent * esdEv = (AliESDEvent*) obj;
\r
85 Float_t deltaPhi = 0.0; // deltaPhi is not available in pass1
\r
87 // Get # spd clusters and of tracklets
\r
88 Int_t spdClusters=0;
\r
91 // loop over the its subdetectors
\r
92 for (Int_t iIts=0; iIts < nItsSubs; iIts++) {
\r
94 if (!itsClusterTree->GetEvent(iIts))
\r
97 Int_t nClusters = itsClusters->GetEntriesFast();
\r
99 // loop over clusters
\r
100 while (nClusters--) {
\r
101 AliITSRecPoint* cluster = (AliITSRecPoint*) itsClusters->UncheckedAt(nClusters);
\r
103 Int_t layer = cluster->GetLayer();
\r
105 if (layer < 3) { // SPD
\r
112 const AliMultiplicity* mult = esdEv->GetMultiplicity();
\r
114 AliFatal("No multiplicity object"); // TODO: Should this be fatal?
\r
116 Int_t ntracklet = mult->GetNumberOfTracklets();
\r
119 // get deltaphi if vertexer z
\r
120 Float_t deltaPhi = 0.0;
\r
122 const AliESDVertex * vtxESD = esdEv->GetPrimaryVertexSPD();
\r
124 if (vtxESD->IsFromVertexerZ()) deltaPhi = vtxESD->GetDispersion(); // dispersion contains deltaphi in case of vertexer Z
\r
127 AliWarning("No Vertex");
\r
132 // compute number of spd clusters
\r
133 Float_t spdClusters = 0;
\r
134 for(Int_t ilayer = 0; ilayer < 2; ilayer++){
\r
135 spdClusters += mult->GetNumberOfITSClusters(ilayer);
\r
140 Bool_t isCvsTOk = kFALSE;
\r
141 Bool_t isDeltaPhiOk = kFALSE;
\r
143 Float_t limit = fACut + ntracklet * fBCut;
\r
144 if (spdClusters > limit) isCvsTOk = kFALSE;
\r
145 else isCvsTOk = kTRUE ;
\r
147 if(deltaPhi > fDeltaPhiCut) isDeltaPhiOk = kFALSE;
\r
148 else isDeltaPhiOk = kTRUE ;
\r
150 if (!isCvsTOk || !isDeltaPhiOk) SetSelected(kFALSE);
\r
151 else SetSelected(kTRUE );
\r
153 // Fill control histos for all trigger classes
\r
154 TString trgClasses = esdEv->GetFiredTriggerClasses();
\r
155 TObjArray * tokens = trgClasses.Tokenize(" ");
\r
156 TIter iter(tokens);
\r
157 while(TObjString * tok = (TObjString*) iter.Next()){
\r
158 // clean up trigger name
\r
159 TString trg = tok->GetString();
\r
160 trg.Strip(TString::kTrailing, ' ');
\r
161 trg.Strip(TString::kLeading, ' ');
\r
163 // cluster vs tracklets
\r
164 TH2F * hCvsT = GetClusterVsTrackletsHisto(trg.Data());
\r
165 TH2F * hCvsTa = GetClusterVsTrackletsHistoAccepted(trg.Data());
\r
166 hCvsT->Fill(ntracklet,spdClusters);
\r
167 if(isCvsTOk) hCvsTa->Fill(ntracklet,spdClusters);
\r
170 TH1F * hDeltaPhi = GetDeltaPhiHisto(trg.Data());
\r
171 TH1F * hDeltaPhia = GetDeltaPhiHistoAccepted(trg.Data());
\r
172 hDeltaPhi->Fill(deltaPhi);
\r
173 if(isDeltaPhiOk) hDeltaPhia->Fill(deltaPhi);
\r
175 if(tokens) delete tokens;
\r
180 itsClusters->Delete();
\r
181 delete itsClusters;
\r
188 void AliBackgroundSelection::Init(){
\r
196 void AliBackgroundSelection::BookClusterVsTrackletsHisto(const char * trigger_name){
\r
198 Bool_t oldStatus = TH1::AddDirectoryStatus();
\r
199 TH1::AddDirectory(kFALSE);
\r
201 TH2F * h1 = new TH2F(GetClusterVsTrackletsHistoName(trigger_name),trigger_name, 50, -0.5, 49.5, 1000, -0.5, 999.5);
\r
202 h1->SetXTitle("Tracklets");
\r
203 h1->SetYTitle("SPD Clusters");
\r
204 AliInfo(Form("Creating histos: %s, all and accepted", GetClusterVsTrackletsHistoName(trigger_name)));
\r
206 TH2F * h2 = new TH2F(GetClusterVsTrackletsHistoNameAccepted(trigger_name),TString(trigger_name)+ "(accepted)",
\r
207 50, -0.5, 49.5, 1000, -0.5, 999.5);
\r
208 h2->SetXTitle("Tracklets");
\r
209 h2->SetYTitle("SPD Clusters");
\r
211 fOutputHist->Add(h1);
\r
212 fOutputHist->Add(h2);
\r
214 TH1::AddDirectory(oldStatus);
\r
218 void AliBackgroundSelection::BookDeltaPhiHisto(const char * trigger_name){
\r
220 Bool_t oldStatus = TH1::AddDirectoryStatus();
\r
221 TH1::AddDirectory(kFALSE);
\r
223 TH1F * h1 = new TH1F(GetDeltaPhiHistoName(trigger_name),trigger_name, 100,0,0.5);
\r
224 h1->SetXTitle("#Delta #phi");
\r
225 AliInfo(Form("Creating histos: %s, all and accepted", GetDeltaPhiHistoName(trigger_name)));
\r
227 TH1F * h2 = new TH1F(GetDeltaPhiHistoNameAccepted(trigger_name),TString(trigger_name)+ "(accepted)", 100,0,0.5);
\r
228 h2->SetXTitle("#Delta #phi");
\r
231 fOutputHist->Add(h1);
\r
232 fOutputHist->Add(h2);
\r
234 TH1::AddDirectory(oldStatus);
\r
238 TH2F * AliBackgroundSelection::GetClusterVsTrackletsHisto(const char * trigger_name){
\r
239 if(!fOutputHist) {AliError("List of histos not initialized");return 0;}
\r
240 TH2F * h = (TH2F*) fOutputHist->FindObject(GetClusterVsTrackletsHistoName(trigger_name));
\r
242 BookClusterVsTrackletsHisto(trigger_name);
\r
243 h = (TH2F*) fOutputHist->FindObject(GetClusterVsTrackletsHistoName(trigger_name));
\r
247 TH1F * AliBackgroundSelection::GetDeltaPhiHisto(const char * trigger_name){
\r
248 if(!fOutputHist) {AliError("List of histos not initialized");return 0;}
\r
249 TH1F * h = (TH1F*) fOutputHist->FindObject(GetDeltaPhiHistoName(trigger_name));
\r
251 BookDeltaPhiHisto(trigger_name);
\r
252 h = (TH1F*) fOutputHist->FindObject(GetDeltaPhiHistoName(trigger_name));
\r
257 TH2F * AliBackgroundSelection::GetClusterVsTrackletsHistoAccepted(const char * trigger_name){
\r
259 if(!fOutputHist) {AliError("List of histos not initialized");return 0;}
\r
260 TH2F * h = (TH2F*) fOutputHist->FindObject(GetClusterVsTrackletsHistoNameAccepted(trigger_name));
\r
262 BookClusterVsTrackletsHisto(trigger_name);
\r
263 h = (TH2F*) fOutputHist->FindObject(GetClusterVsTrackletsHistoNameAccepted(trigger_name));
\r
269 TH1F * AliBackgroundSelection::GetDeltaPhiHistoAccepted(const char * trigger_name){
\r
271 if(!fOutputHist) {AliError("List of histos not initialized");return 0;}
\r
272 TH1F * h = (TH1F*) fOutputHist->FindObject(GetDeltaPhiHistoNameAccepted(trigger_name));
\r
274 BookDeltaPhiHisto(trigger_name);
\r
275 h = (TH1F*) fOutputHist->FindObject(GetDeltaPhiHistoNameAccepted(trigger_name));
\r
281 const char * AliBackgroundSelection::GetClusterVsTrackletsHistoName(const char * trigger_name){
\r
282 static TString str;
\r
284 str = str+GetName()+"_"+trigger_name;
\r
288 const char * AliBackgroundSelection::GetClusterVsTrackletsHistoNameAccepted(const char * trigger_name){
\r
289 static TString str;
\r
291 str = str+GetName()+"_"+trigger_name + "_accepted";
\r
295 const char * AliBackgroundSelection::GetDeltaPhiHistoName(const char * trigger_name){
\r
296 static TString str;
\r
297 str = ("hDeltaPhi");
\r
298 str = str+GetName()+"_"+trigger_name;
\r
302 const char * AliBackgroundSelection::GetDeltaPhiHistoNameAccepted(const char * trigger_name){
\r
303 static TString str;
\r
304 str = ("hDeltaPhi");
\r
305 str = str+GetName()+"_"+trigger_name + "_accepted";
\r
309 Long64_t AliBackgroundSelection::Merge(TCollection* list)
\r
311 // Merge a list of AliBackgroundSelection objects with this (needed for
\r
313 // Returns the number of merged objects (including this).
\r
315 // We have to make sure that all the list contain the same histos in
\r
316 // the same order. We thus also have to sort the list (sorting is
\r
317 // done by name in TList).
\r
319 AliInfo("Merging");
\r
324 if (list->IsEmpty())
\r
327 TIterator* iter = list->MakeIterator();
\r
330 // collections of all histograms
\r
331 const Int_t nHists = 1;
\r
332 TList collections[nHists];
\r
335 // 1. Sort this list
\r
336 fOutputHist->Sort();
\r
338 while ((obj = iter->Next())) {
\r
339 Bool_t foundDiffinThisIterStep = kFALSE;
\r
340 // Printf("%d - %s",count, obj->GetName());
\r
341 AliBackgroundSelection* entry = dynamic_cast<AliBackgroundSelection*> (obj);
\r
345 TList * hlist = entry->fOutputHist;
\r
347 // Check if all histos in this fOutputHist are also in the one from entry and viceversa
\r
348 // Use getters to automatically book non defined histos
\r
350 Bool_t areListsDifferent=kTRUE;
\r
352 Int_t max_loops = hlist->GetSize() + fOutputHist->GetSize(); // In the worst case all of the histos will be different...
\r
353 while(areListsDifferent) {
\r
354 if(iloop>max_loops) AliFatal("Infinite Loop?");
\r
358 fOutputHist->Sort();
\r
359 // loop over the largest
\r
361 // loop over the largest
\r
363 TIterator * iterlist = 0;
\r
364 TList * thislist = 0; // the list over which I'm iterating (i.e. the largest)
\r
365 TList * otherlist = 0; // the other list
\r
367 if (hlist->GetSize() >= fOutputHist->GetSize()) {
\r
369 otherlist = fOutputHist;
\r
372 thislist = fOutputHist;
\r
373 otherlist = hlist;
\r
375 iterlist = thislist->MakeIterator();
\r
377 while ((hist= iterlist->Next())){
\r
378 if(!otherlist->FindObject(hist->GetName())){
\r
379 AliInfo(Form("Adding object %s",hist->GetName()));
\r
380 foundDiffinThisIterStep = kTRUE;
\r
381 TH1 * hclone = (TH1*) hist->Clone();
\r
383 otherlist->Add(hclone);
\r
387 // re-sort before checking
\r
389 fOutputHist->Sort();
\r
391 // check if everything is fine
\r
392 areListsDifferent=kFALSE;
\r
393 if (hlist->GetSize() == fOutputHist->GetSize()) {
\r
394 Int_t nhist = fOutputHist->GetSize();
\r
395 for(Int_t ihist = 0; ihist < nhist; ihist++){
\r
396 if(strcmp(fOutputHist->At(ihist)->GetName(),hlist->At(ihist)->GetName())) areListsDifferent = kTRUE;
\r
399 areListsDifferent=kTRUE;
\r
403 // last check: if something is not ok die loudly
\r
404 if (hlist->GetSize() != fOutputHist->GetSize()) {
\r
405 AliFatal("Mismatching size!");
\r
407 Int_t nhist = fOutputHist->GetSize();
\r
408 for(Int_t ihist = 0; ihist < nhist; ihist++){
\r
409 if(strcmp(fOutputHist->At(ihist)->GetName(),hlist->At(ihist)->GetName())){
\r
410 AliFatal(Form("Mismatching histos: %s -> %s", fOutputHist->At(ihist)->GetName(),hlist->At(ihist)->GetName()));
\r
414 if (foundDiffinThisIterStep){
\r
415 iter->Reset(); // We found a difference: previous lists could
\r
416 // also be affected... We start from scratch
\r
418 collections[n++].Clear();
\r
422 // AliInfo("hlist");
\r
424 // AliInfo("fOutputHist");
\r
425 // fOutputHist->Print();
\r
428 collections[n++].Add(hlist);
\r
435 fOutputHist->Merge(&collections[n++]);
\r