1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //--------------------------------------------------
19 // Method implementation for background studies and background subtraction with UA1 algorithms
21 // Author: magali.estienne@subatech.in2p3.fr
22 //-------------------------------------------------
24 #include <Riostream.h>
26 #include <TClonesArray.h>
30 #include "AliAODJetEventBackground.h"
31 #include "AliUA1JetHeaderV1.h"
32 #include "AliJetCalTrk.h"
33 #include "AliJetBkg.h"
40 ////////////////////////////////////////////////////////////////////////
42 AliJetBkg::AliJetBkg():
50 // Default constructor
51 for(int i = 0;i < kMaxJets;i++){
52 fhAreaJet[i] = fhEtJet[i] = 0;
56 //----------------------------------------------------------------
57 AliJetBkg::AliJetBkg(const AliJetBkg& input):
60 fHeader(input.fHeader),
62 fhEtBackg(input.fhEtBackg),
63 fhAreaBackg(input.fhAreaBackg)
66 for(int i = 0;i < kMaxJets;i++){
67 fhAreaJet[i] = input.fhAreaJet[i];
68 fhEtJet[i] = input.fhEtJet[i];
73 //----------------------------------------------------------------
74 AliJetBkg::~AliJetBkg()
77 if(fhEtBackg) delete fhEtBackg;
78 if(fhAreaBackg) delete fhAreaBackg;
79 for(int i = 0;i < kMaxJets;i++){
80 if(fhAreaJet[i]) delete fhAreaJet[i];
81 if(fhEtJet[i]) delete fhEtJet[i];
86 //----------------------------------------------------------------
87 Bool_t AliJetBkg::PtCutPass(Int_t id, Int_t nTracks)
89 // Check if track or cell passes the cut flag
90 if(id < nTracks && fEvent->GetCalTrkTrack(id)->GetCutFlag() == 1)
96 //----------------------------------------------------------------
97 Bool_t AliJetBkg::SignalCutPass(Int_t id, Int_t nTracks)
99 // Check if track or cell passes the cut flag
100 if(id < nTracks && fEvent->GetCalTrkTrack(id)->GetSignalFlag() == 1)
106 //----------------------------------------------------------------
107 Float_t AliJetBkg::CalcJetAreaEtaCut(Float_t radius, const Float_t etaJet)
109 // Calculate jet area taking into account an acceptance cut in eta
110 AliUA1JetHeader* header = (AliUA1JetHeader*) fHeader;
111 Float_t detamax = etaJet + radius;
112 Float_t detamin = etaJet - radius;
113 Float_t accmax = 0.0; Float_t accmin = 0.0;
114 if(detamax > header->GetLegoEtaMax()){ // sector outside etamax
115 Float_t h = header->GetLegoEtaMax() - etaJet;
116 accmax = radius*radius*TMath::ACos(h/radius) - h*TMath::Sqrt(radius*radius - h*h);
118 if(detamin < header->GetLegoEtaMin()){ // sector outside etamin
119 Float_t h = header->GetLegoEtaMax() + etaJet;
120 accmin = radius*radius*TMath::ACos(h/radius) - h*TMath::Sqrt(radius*radius - h*h);
123 return radius*radius*TMath::Pi() - accmax - accmin;
127 //----------------------------------------------------------------
128 void AliJetBkg::CalcJetAndBckgAreaEtaCut(Bool_t calcOutsideArea, Float_t radius, const Int_t nJets, const Float_t* etaJet, Float_t* &areaJet, Float_t &areaOut)
130 // Calculate jet and bacground areas taking into account an acceptance cut in eta
132 AliUA1JetHeader* header = (AliUA1JetHeader*) fHeader;
133 areaOut = (header->GetLegoEtaMax()-header->GetLegoEtaMin())*(header->GetLegoPhiMax() - header->GetLegoPhiMin());
134 for(Int_t k=0; k<nJets; k++){
135 areaJet[k] = CalcJetAreaEtaCut(radius, etaJet[k]);
136 if(calcOutsideArea) areaOut = areaOut - areaJet[k];
141 //----------------------------------------------------------------
142 void AliJetBkg::SubtractBackg(const Int_t& nIn, const Int_t&nJ, Float_t&etbgTotalN, Float_t&sigmaN,
143 const Float_t* ptT, const Float_t* etaT, const Float_t* phiT,
144 Float_t* etJet, const Float_t* etaJet, const Float_t* phiJet,
145 Float_t* etsigJet, Int_t* multJetT, Int_t* multJetC, Int_t* multJet,
146 Int_t* injet, Float_t* &areaJet)
149 // Background subtraction using cone method but without correction in dE/deta distribution
150 // Cases to take into account the EMCal geometry are included
153 AliUA1JetHeader* header = (AliUA1JetHeader*) fHeader;
154 //calculate energy inside and outside cones
155 fDebug = header->GetDebug();
156 Float_t rc = header->GetRadius();
158 // Get number of tracks from EventCalTrk
159 Int_t nTracks = fEvent->GetNCalTrkTracks();
161 Float_t etIn[kMaxJets] = {0};
162 Float_t areaOut = 0.;
164 for(Int_t jpart = 0; jpart < nIn; jpart++){ // loop for all particles in array
166 for(Int_t ijet=0; ijet<nJ; ijet++){
167 Float_t deta = etaT[jpart] - etaJet[ijet];
168 Float_t dphi = phiT[jpart] - phiJet[ijet];
169 if (dphi < -TMath::Pi()) dphi= -dphi - 2.0 * TMath::Pi();
170 if (dphi > TMath::Pi()) dphi = 2.0 * TMath::Pi() - dphi;
171 Float_t dr = TMath::Sqrt(deta * deta + dphi * dphi);
172 if(dr <= rc){ // particles inside this cone
173 if(jpart < nTracks) multJetT[ijet]++;
174 else multJetC[ijet]++;
177 if(PtCutPass(jpart,nTracks)){ // pt cut
178 etIn[ijet] += ptT[jpart];
179 if(SignalCutPass(jpart,nTracks))
180 etsigJet[ijet]+= ptT[jpart];
186 if((injet[jpart] == -1) &&
187 (PtCutPass(jpart,nTracks))){
188 etOut += ptT[jpart]; // particle outside cones and pt cut
190 } //end particle loop
192 // Calculate jet and background areas
193 Bool_t calcAreaOut = kTRUE;
194 CalcJetAndBckgAreaEtaCut(calcAreaOut,rc, nJ, etaJet, areaJet, areaOut);
196 //subtract background using area method
197 for(Int_t ljet=0; ljet<nJ; ljet++){
198 Float_t areaRatio = areaJet[ljet]/areaOut;
199 etJet[ljet] = etIn[ljet]-etOut*areaRatio; // subtraction
202 // estimate new total background
204 areaT = (header->GetLegoEtaMax()-header->GetLegoEtaMin())*(header->GetLegoPhiMax()-header->GetLegoPhiMin());
205 etbgTotalN = etOut*areaT/areaOut;
207 // estimate standard deviation of background
209 for(Int_t jpart = 0; jpart < nIn; jpart++){ // loop for all particles in array
210 if((injet[jpart] == -1) &&
211 (PtCutPass(jpart,nTracks))){
212 sigmaN += etbgTotalN/areaT - ptT[jpart];
213 // To be checked (Division by jet area to obtain standard deviation of rho ?)
218 sigmaN=TMath::Sqrt(TMath::Abs(sigmaN)/count);
222 //----------------------------------------------------------------
223 void AliJetBkg::SubtractBackgStat(const Int_t& nIn, const Int_t&nJ,Float_t&etbgTotalN, Float_t&sigmaN,
224 const Float_t* ptT, const Float_t* etaT, const Float_t* phiT,
225 Float_t* etJet, const Float_t* etaJet, const Float_t* phiJet,
226 Float_t* etsigJet, Int_t* multJetT, Int_t* multJetC, Int_t* multJet,
227 Int_t* injet, Float_t* &areaJet)
230 //background subtraction using statistical method
231 // Cases to take into account the EMCal geometry are included
234 AliUA1JetHeader* header = (AliUA1JetHeader*) fHeader;
235 Float_t etbgStat = header->GetBackgStat(); // pre-calculated background
237 //calculate energy inside
238 Float_t rc= header->GetRadius();
239 Float_t etIn[kMaxJets] = {0.0};
240 // Get number of tracks from EventCalTrk
241 Int_t nTracks = fEvent->GetNCalTrkTracks();
242 Float_t areaOut = 0.;
244 for(Int_t jpart = 0; jpart < nIn; jpart++)
245 { // loop for all particles in array
247 for(Int_t ijet=0; ijet<nJ; ijet++)
249 Float_t deta = etaT[jpart] - etaJet[ijet];
250 Float_t dphi = phiT[jpart] - phiJet[ijet];
251 if (dphi < -TMath::Pi()) dphi= -dphi - 2.0 * TMath::Pi();
252 if (dphi > TMath::Pi()) dphi = 2.0 * TMath::Pi() - dphi;
253 Float_t dr = TMath::Sqrt(deta * deta + dphi * dphi);
254 if(dr <= rc){ // particles inside this cone
255 if(jpart < nTracks) multJetT[ijet]++;
256 else multJetC[ijet]++;
260 if(PtCutPass(jpart,nTracks)){ // pt cut
261 etIn[ijet] += ptT[jpart];
262 if(SignalCutPass(jpart,nTracks))
263 etsigJet[ijet]+= ptT[jpart];
268 } //end particle loop
270 // Calculate jet and background areas
271 Bool_t calcAreaOut = kFALSE;
272 CalcJetAndBckgAreaEtaCut(calcAreaOut,rc, nJ, etaJet, areaJet, areaOut);
274 //subtract background using area method
275 for(Int_t ljet=0; ljet<nJ; ljet++){
276 Float_t areaRatio = areaJet[ljet]/areaOut;
277 etJet[ljet] = etIn[ljet]-etbgStat*areaRatio; // subtraction
280 etbgTotalN = etbgStat;
282 // estimate standard deviation of background
284 areaT = (header->GetLegoEtaMax()-header->GetLegoEtaMin())*(header->GetLegoPhiMax()-header->GetLegoPhiMin());
285 for(Int_t jpart = 0; jpart < nIn; jpart++){ // loop for all particles in array
286 if((injet[jpart] == -1) &&
287 (PtCutPass(jpart,nTracks))){
288 sigmaN += etbgTotalN/areaT - ptT[jpart];
292 sigmaN=TMath::Sqrt(TMath::Abs(sigmaN)/count);
296 //----------------------------------------------------------------
297 void AliJetBkg::SubtractBackgCone(const Int_t& nIn, const Int_t&nJ,Float_t& etbgTotalN, Float_t&sigmaN,
298 const Float_t* ptT, const Float_t* etaT, const Float_t* phiT, Float_t* etJet,
299 const Float_t* etaJet, const Float_t* phiJet, Float_t* etsigJet,
300 Int_t* multJetT, Int_t* multJetC, Int_t* multJet, Int_t* injet, Float_t* &/*areaJet*/)
303 // Cone background subtraction method taking into acount dEt/deta distribution
304 // Cases to take into account the EMCal geometry are not included
307 AliUA1JetHeader* header = (AliUA1JetHeader*) fHeader;
309 Float_t rc= header->GetRadius();
310 Float_t etamax = header->GetLegoEtaMax();
311 Float_t etamin = header->GetLegoEtaMin();
313 // Get number of tracks from EventCalTrk
314 Int_t nTracks = fEvent->GetNCalTrkTracks();
316 // jet energy and area arrays
317 Bool_t oldStatus = TH1::AddDirectoryStatus();
318 TH1::AddDirectory(kFALSE);
320 for(Int_t mjet=0; mjet<nJ; mjet++){
322 fhEtJet[mjet] = new TH1F(Form("hEtJet%d", mjet),"et dist in eta ",ndiv,etamin,etamax);
324 if(!fhAreaJet[mjet]){
325 fhAreaJet[mjet] = new TH1F(Form("hEtJet%d", mjet),"area dist in eta ",ndiv,etamin,etamax);
327 fhEtJet[mjet]->Reset();
328 fhAreaJet[mjet]->Reset();
330 // background energy and area
331 if(!fhEtBackg)fhEtBackg = new TH1F("hEtBackg"," backg et dist in eta ",ndiv,etamin,etamax);
333 if(!fhAreaBackg) fhAreaBackg = new TH1F("hAreaBackg","backg area dist in eta ",ndiv,etamin,etamax);
334 fhAreaBackg->Reset();
335 TH1::AddDirectory(oldStatus);
338 for(Int_t jpart = 0; jpart < nIn; jpart++){ // loop for all particles in array
339 for(Int_t ijet=0; ijet<nJ; ijet++){ // loop for all jets
340 Float_t deta = etaT[jpart] - etaJet[ijet];
341 Float_t dphi = phiT[jpart] - phiJet[ijet];
342 if (dphi < -TMath::Pi()) dphi= -dphi - 2.0 * TMath::Pi();
343 if (dphi > TMath::Pi()) dphi = 2.0 * TMath::Pi() - dphi;
344 Float_t dr = TMath::Sqrt(deta * deta + dphi * dphi);
345 if(dr <= rc){ // particles inside this cone
346 if(jpart < nTracks) multJetT[ijet]++;
347 else multJetC[ijet]++;
351 if(PtCutPass(jpart,nTracks)){ // pt cut
352 fhEtJet[ijet]->Fill(etaT[jpart],ptT[jpart]); //particle inside cone
353 if(SignalCutPass(jpart,nTracks))
354 etsigJet[ijet]+= ptT[jpart];
360 if((injet[jpart] == -1) &&
361 (PtCutPass(jpart,nTracks) == 1))
362 fhEtBackg->Fill(etaT[jpart],ptT[jpart]); // particle outside cones
363 } //end particle loop
366 Float_t eta0 = etamin;
367 Float_t etaw = (etamax - etamin)/((Float_t)ndiv);
368 Float_t eta1 = eta0 + etaw;
369 for(Int_t etabin = 0; etabin< ndiv; etabin++){ // loop for all eta bins
370 Float_t etac = eta0 + etaw/2.0;
371 Float_t areabg = etaw*2.0*TMath::Pi();
372 for(Int_t ijet=0; ijet<nJ; ijet++){ // loop for all jets
373 Float_t deta0 = TMath::Abs(eta0 - etaJet[ijet]);
374 Float_t deta1 = TMath::Abs(eta1 - etaJet[ijet]);
375 Float_t acc0 = 0.0; Float_t acc1 = 0.0;
377 if(deta0 > rc && deta1 < rc){
378 acc1 = rc*rc*TMath::ACos(deta1/rc) - deta1*TMath::Sqrt(rc*rc - deta1*deta1);
381 if(deta0 < rc && deta1 > rc){
382 acc0 = rc*rc*TMath::ACos(deta0/rc) - deta0*TMath::Sqrt(rc*rc - deta0*deta0);
385 if(deta0 < rc && deta1 < rc){
386 acc0 = rc*rc*TMath::ACos(deta0/rc) - deta0*TMath::Sqrt(rc*rc - deta0*deta0);
387 acc1 = rc*rc*TMath::ACos(deta1/rc) - deta1*TMath::Sqrt(rc*rc - deta1*deta1);
388 if(eta1<etaJet[ijet]) areaj = acc1-acc0; // case 1
389 if((eta0 < etaJet[ijet]) && (etaJet[ijet]<eta1)) areaj = rc*rc*TMath::Pi() - acc1 -acc0; // case 2
390 if(etaJet[ijet] < eta0) areaj = acc0 -acc1; // case 3
392 fhAreaJet[ijet]->Fill(etac,areaj);
393 areabg = areabg - areaj;
395 fhAreaBackg->Fill(etac,areabg);
398 } // end loop for all eta bins
400 //subtract background
401 for(Int_t kjet=0; kjet<nJ; kjet++){
402 etJet[kjet] = 0.0; // first clear etJet for this jet
403 for(Int_t bin = 0; bin< ndiv; bin++){
404 if(fhAreaJet[kjet]->GetBinContent(bin)){
405 Float_t areab = fhAreaBackg->GetBinContent(bin);
406 Float_t etb = fhEtBackg->GetBinContent(bin);
407 Float_t areaR = (fhAreaJet[kjet]->GetBinContent(bin))/areab;
408 etJet[kjet] = etJet[kjet] + ((fhEtJet[kjet]->GetBinContent(bin)) - etb*areaR); //subtraction
413 // calc background total
414 Double_t etOut = fhEtBackg->Integral();
415 Double_t areaOut = fhAreaBackg->Integral();
416 Float_t areaT = (header->GetLegoEtaMax()-header->GetLegoEtaMin())*(header->GetLegoPhiMax()-header->GetLegoPhiMin());
417 etbgTotalN = etOut*areaT/areaOut;
420 for(Int_t jpart = 0; jpart < nIn; jpart++){ // loop for all particles in array
421 if((injet[jpart] == -1) &&
422 (PtCutPass(jpart,nTracks))){
423 sigmaN += etbgTotalN/areaT - ptT[jpart];
427 sigmaN=TMath::Sqrt(TMath::Abs(sigmaN)/count);
431 //----------------------------------------------------------------
432 void AliJetBkg::SubtractBackgRatio(const Int_t& nIn, const Int_t&nJ,Float_t& etbgTotalN, Float_t&sigmaN,
433 const Float_t* ptT,const Float_t* etaT, const Float_t* phiT,
434 Float_t* etJet, const Float_t* etaJet, const Float_t* phiJet,
435 Float_t* etsigJet, Int_t* multJetT, Int_t* multJetC, Int_t* multJet,
436 Int_t* injet, Float_t* &/*areaJet*/)
438 // Ratio background subtraction method taking into acount dEt/deta distribution
439 // Cases to take into account the EMCal geometry are not included
441 AliUA1JetHeader* header = (AliUA1JetHeader*) fHeader;
442 //factor F calc before
443 Float_t bgRatioCut = header->GetBackgCutRatio();
446 Float_t rc= header->GetRadius();
447 Float_t etamax = header->GetLegoEtaMax();
448 Float_t etamin = header->GetLegoEtaMin();
450 // Get number of tracks from EventCalTrk
451 Int_t nTracks = fEvent->GetNCalTrkTracks();
453 // jet energy and area arrays
454 Bool_t oldStatus = TH1::AddDirectoryStatus();
455 TH1::AddDirectory(kFALSE);
456 for(Int_t mjet=0; mjet<nJ; mjet++){
458 fhEtJet[mjet] = new TH1F(Form("hEtJet%d", mjet),"et dist in eta ",ndiv,etamin,etamax);
460 if(!fhAreaJet[mjet]){
461 fhAreaJet[mjet] = new TH1F(Form("hAreaJet%d", mjet),"area dist in eta ",ndiv,etamin,etamax);
463 fhEtJet[mjet]->Reset();
464 fhAreaJet[mjet]->Reset();
466 // background energy and area
467 if(!fhEtBackg)fhEtBackg = new TH1F("hEtBackg"," backg et dist in eta ",ndiv,etamin,etamax);
469 if(!fhAreaBackg) fhAreaBackg = new TH1F("hAreaBackg","backg area dist in eta ",ndiv,etamin,etamax);
470 fhAreaBackg->Reset();
471 TH1::AddDirectory(oldStatus);
474 for(Int_t jpart = 0; jpart < nIn; jpart++){ // loop for all particles in array
475 for(Int_t ijet=0; ijet<nJ; ijet++){ // loop for all jets
476 Float_t deta = etaT[jpart] - etaJet[ijet];
477 Float_t dphi = phiT[jpart] - phiJet[ijet];
478 if (dphi < -TMath::Pi()) dphi= -dphi - 2.0 * TMath::Pi();
479 if (dphi > TMath::Pi()) dphi = 2.0 * TMath::Pi() - dphi;
480 Float_t dr = TMath::Sqrt(deta * deta + dphi * dphi);
481 if(dr <= rc){ // particles inside this cone
482 if(jpart < nTracks) multJetT[ijet]++;
483 else multJetC[ijet]++;
487 if(PtCutPass(jpart,nTracks)){ // pt cut
488 fhEtJet[ijet]->Fill(etaT[jpart],ptT[jpart]); //particle inside cone
489 if(SignalCutPass(jpart,nTracks))
490 etsigJet[ijet]+= ptT[jpart];
495 if(injet[jpart] == -1) fhEtBackg->Fill(etaT[jpart],ptT[jpart]); // particle outside cones
496 } //end particle loop
499 Float_t eta0 = etamin;
500 Float_t etaw = (etamax - etamin)/((Float_t)ndiv);
501 Float_t eta1 = eta0 + etaw;
502 for(Int_t etabin = 0; etabin< ndiv; etabin++){ // loop for all eta bins
503 Float_t etac = eta0 + etaw/2.0;
504 Float_t areabg = etaw*2.0*TMath::Pi();
505 for(Int_t ijet=0; ijet<nJ; ijet++){ // loop for all jets
506 Float_t deta0 = TMath::Abs(eta0 - etaJet[ijet]);
507 Float_t deta1 = TMath::Abs(eta1 - etaJet[ijet]);
508 Float_t acc0 = 0.0; Float_t acc1 = 0.0;
510 if(deta0 > rc && deta1 < rc){
511 acc1 = rc*rc*TMath::ACos(deta1/rc) - deta1*TMath::Sqrt(rc*rc - deta1*deta1);
514 if(deta0 < rc && deta1 > rc){
515 acc0 = rc*rc*TMath::ACos(deta0/rc) - deta0*TMath::Sqrt(rc*rc - deta0*deta0);
518 if(deta0 < rc && deta1 < rc){
519 acc0 = rc*rc*TMath::ACos(deta0/rc) - deta0*TMath::Sqrt(rc*rc - deta0*deta0);
520 acc1 = rc*rc*TMath::ACos(deta1/rc) - deta1*TMath::Sqrt(rc*rc - deta1*deta1);
521 if(eta1<etaJet[ijet]) areaj = acc1-acc0; // case 1
522 if((eta0 < etaJet[ijet]) && (etaJet[ijet]<eta1)) areaj = rc*rc*TMath::Pi() - acc1 -acc0; // case 2
523 if(etaJet[ijet] < eta0) areaj = acc0 -acc1; // case 3
525 fhAreaJet[ijet]->Fill(etac,areaj);
526 areabg = areabg - areaj;
528 fhAreaBackg->Fill(etac,areabg);
531 } // end loop for all eta bins
533 //subtract background
534 for(Int_t kjet=0; kjet<nJ; kjet++){
535 etJet[kjet] = 0.0; // first clear etJet for this jet
536 for(Int_t bin = 0; bin< ndiv; bin++){
537 if(fhAreaJet[kjet]->GetBinContent(bin)){
538 Float_t areab = fhAreaBackg->GetBinContent(bin);
539 Float_t etb = fhEtBackg->GetBinContent(bin);
540 Float_t areaR = (fhAreaJet[kjet]->GetBinContent(bin))/areab;
541 etJet[kjet] = etJet[kjet] + ((fhEtJet[kjet]->GetBinContent(bin)) - etb*areaR*bgRatioCut); //subtraction
546 // calc background total
547 Double_t etOut = fhEtBackg->Integral();
548 Double_t areaOut = fhAreaBackg->Integral();
549 Float_t areaT = (header->GetLegoEtaMax()-header->GetLegoEtaMin())*(header->GetLegoPhiMax()-header->GetLegoPhiMin());
550 etbgTotalN = etOut*areaT/areaOut;
554 for(Int_t jpart = 0; jpart < nIn; jpart++){ // loop for all particles in array
555 if((injet[jpart] == -1) &&
556 (PtCutPass(jpart,nTracks))){
557 sigmaN += etbgTotalN/areaT - ptT[jpart];
561 sigmaN=TMath::Sqrt(TMath::Abs(sigmaN)/count);