26 #include "TObjString.h"
27 #include "TObjArray.h"
30 #include "TGraphAsymmErrors.h"
35 #include "AliVParticle.h"
36 #include "AliAODTrack.h"
37 #include "AliESDMuonTrack.h"
40 #include "AliAnalysisManager.h"
41 #include "AliAnalysisDataSlot.h"
42 #include "AliAnalysisDataContainer.h"
45 #include "AliVAnalysisMuon.h"
46 #include "AliMuonEventCuts.h"
47 #include "AliMuonTrackCuts.h"
48 #include "AliMergeableCollection.h"
49 #include "AliAnalysisMuonUtility.h"
69 AliVAnalysisMuon(name, cuts),
77 DefineOutput(2, TList::Class());
88 if ( ! AliAnalysisManager::GetAnalysisManager() || ! AliAnalysisManager::GetAnalysisManager()->IsProofMode() ) {
103 for (
Int_t isel=0; isel<kNselections; ++isel ) {
104 for (
Int_t itrig=0; itrig<GetAllSelectedTrigClasses()->GetEntries(); ++itrig ) {
105 for (
Int_t icent=1; icent<=GetCentralityClasses()->GetNbins(); ++icent ) {
110 for (
Int_t ich=-1; ich<4; ++ich ) {
115 TH1* histoAdd =
static_cast<TH1*
>(fMergeableCollection->GetObject(Form(
"/%s/%s/%s/",fPhysSelKeys->At(isel)->GetName(), GetAllSelectedTrigClasses()->At(itrig)->GetName(), GetCentralityClasses()->GetBinLabel(icent)), histoName));
116 if ( ! histoAdd )
continue;
118 if ( ! histo ) histo =
static_cast<TH1*
>(GetMergeableObject(fPhysSelKeys->At(isel)->GetName(), GetAllSelectedTrigClasses()->At(itrig)->GetName(), GetCentralityClasses()->GetBinLabel(icent), histoName));
119 AliDebug(2,Form(
"Adding %s (%g) to %s (%g)", histoAdd->GetName(), histoAdd->Integral(), histo->GetName(), histo->Integral()));
120 histo->Add(histoAdd);
132 TString physSel = fPhysSelKeys->At(kPhysSelPass)->GetName();
137 outList->SetOwner(kFALSE);
140 while ( (obj = next()) )
fList->Add(obj);
143 AliVAnalysisMuon::FinishTaskOutput();
163 for (
Int_t ich=0; ich<4; ++ich ) {
174 fMuonTrackCuts->Print();
188 Int_t slat = 0, board = 0;
194 AliVParticle* track = 0x0;
196 UInt_t addMask[4] = {0, AliMuonTrackCuts::kMuMatchApt, AliMuonTrackCuts::kMuMatchApt|AliMuonTrackCuts::kMuMatchLpt, AliMuonTrackCuts::kMuMatchApt|AliMuonTrackCuts::kMuMatchLpt|AliMuonTrackCuts::kMuMatchHpt};
198 Int_t nTracks = AliAnalysisMuonUtility::GetNTracks(InputEvent());
199 for (
Int_t itrack = 0; itrack < nTracks; ++itrack ) {
200 track = AliAnalysisMuonUtility::GetTrack(itrack,InputEvent());
202 Bool_t matchTracker = AliAnalysisMuonUtility::IsMuonTrack(track);
204 Int_t matchTrig = AliAnalysisMuonUtility::GetMatchTrigger(track);
205 UInt_t selection = fMuonTrackCuts->GetSelectionMask(track);
208 UInt_t filterMask = fMuonTrackCuts->GetFilterMask() | addMask[matchTrig];
209 Bool_t isSelected = ( ( selection & filterMask ) == filterMask );
213 if ( ! matchTracker || track->P() < 10. )
continue;
214 pattern = AliAnalysisMuonUtility::GetMUONTrigHitsMapTrk(track);
215 board = AliESDMuonTrack::GetCrossedBoard(pattern);
218 if ( matchTrig == 0 )
continue;
219 pattern = AliAnalysisMuonUtility::GetMUONTrigHitsMapTrg(track);
220 board = ( AliAnalysisMuonUtility::IsAODEvent(InputEvent()) ) ? AliESDMuonTrack::GetCrossedBoard(pattern) : ((AliESDMuonTrack*)track)->LoCircuit();
223 Int_t effFlag = AliESDMuonTrack::GetEffFlag(pattern);
225 if ( effFlag < AliESDMuonTrack::kChEff ) {
228 for (
Int_t itrig=0; itrig<selectTrigClasses.GetEntries(); ++itrig ) {
229 TString trigClassName = ((TObjString*)selectTrigClasses.At(itrig))->GetString();
232 ((
TH2F*)GetMergeableObject(physSel, trigClassName, centrality, histoName))->Fill(AliESDMuonTrack::GetSlatOrInfo(pattern), board);
238 othersEfficient.Reset(1);
239 for (
Int_t cath=0; cath<2; ++cath ) {
240 for (
Int_t ich=0; ich<4; ++ich ) {
241 if ( ! AliESDMuonTrack::IsChamberHit(pattern, cath, ich) ) {
242 for (
Int_t jch=0; jch<4; jch++ ) {
243 if ( jch != ich ) othersEfficient[jch] = 0;
250 Bool_t rejectTrack = kTRUE;
251 for (
Int_t ich=0; ich<4; ++ich ) {
252 if ( othersEfficient[ich] > 0 ) {
253 rejectTrack = kFALSE;
258 if ( rejectTrack )
continue;
260 slat = AliESDMuonTrack::GetSlatOrInfo(pattern);
262 for (
Int_t ich=0; ich<4; ++ich ) {
263 if ( ! othersEfficient[ich] )
267 Int_t iChamber = 11 + ich;
269 Bool_t hitsBend = AliESDMuonTrack::IsChamberHit(pattern, 0, ich);
270 Bool_t hitsNonBend = AliESDMuonTrack::IsChamberHit(pattern, 1, ich);
275 ( hitsBend && hitsNonBend ),
282 if ( ! fillHisto[icount] )
continue;
283 for (
Int_t itrig=0; itrig<selectTrigClasses.GetEntries(); ++itrig ) {
284 TString trigClassName = ((TObjString*)selectTrigClasses.At(itrig))->GetString();
287 static_cast<TH1*
>(GetMergeableObject(physSel, trigClassName, centrality, histoName))->Fill(iChamber);
289 if ( effFlag < AliESDMuonTrack::kSlatEff )
continue;
291 static_cast<TH1*
>(GetMergeableObject(physSel, trigClassName, centrality, histoName))->Fill(slat);
293 if ( effFlag < AliESDMuonTrack::kBoardEff )
continue;
295 static_cast<TH1*
>(GetMergeableObject(physSel, trigClassName, centrality, histoName))->Fill(board);
314 AliVAnalysisMuon::Terminate(
"");
316 if ( ! fMergeableCollection )
return;
326 TObjArray* physSel = ((TObjString*)fTerminateOptions->At(0))->GetString().Tokenize(
" ");
328 TObjArray* trigClasses = ((TObjString*)fTerminateOptions->At(1))->GetString().Tokenize(
" ");
329 trigClasses->SetOwner();
330 TObjArray* centrality = ((TObjString*)fTerminateOptions->At(2))->GetString().Tokenize(
" ");
331 centrality->SetOwner();
332 TString furtherOpt = ((TObjString*)fTerminateOptions->At(3))->GetString();
335 TObjArray* optArr = furtherOpt.Tokenize(
" ");
338 methodSel.SetOwner();
340 for (
Int_t iopt=0; iopt<optArr->GetEntries(); iopt++ ) {
341 currName = optArr->At(iopt)->GetName();
342 if ( currName.Contains(
".root") ) outFileOpt = currName;
343 else if ( currName.Contains(
"Match") ) trackSel.Add(
new TObjString(currName));
344 else if ( currName.Contains(
"From") ) methodSel.Add(
new TObjString(currName));
351 furtherOpt.ToUpper();
357 TString histoName =
"", yAxisTitle =
"";
370 TCanvas* can =
new TCanvas(currName.Data(), currName.Data(), igroup1*xshift,igroup2*yshift,600,600);
372 TLegend* leg =
new TLegend(0.6, 0.6, 0.9, 0.9);
373 leg->SetBorderSize(1);
374 for (
Int_t ich=0; ich<4; ++ich ) {
377 gPad->SetRightMargin(0.03);
381 for (
Int_t isel=0; isel<physSel->GetEntries(); ++isel ) {
382 for (
Int_t itrig=0; itrig<trigClasses->GetEntries(); ++itrig ) {
383 for (
Int_t icent=0; icent<centrality->GetEntries(); ++icent ) {
384 for (
Int_t imethodSel=0; imethodSel<methodSel.GetEntries(); ++imethodSel ) {
385 for (
Int_t itrackSel=0; itrackSel<trackSel.GetEntries(); ++itrackSel ) {
387 histoName += Form(
"%s%s",trackSel.At(itrackSel)->GetName(),methodSel.At(imethodSel)->GetName());
388 den =
static_cast<TH1*
>(
fAnalysisOutput->GetSum(physSel->At(isel)->GetName(), trigClasses->At(itrig)->GetName(), centrality->At(icent)->GetName(), histoName.Data()));
390 printf(
"Warning: cannot find %s\n", histoName.Data());
394 histoName += Form(
"%s%s",trackSel.At(itrackSel)->GetName(),methodSel.At(imethodSel)->GetName());
395 num =
static_cast<TH1*
>(
fAnalysisOutput->GetSum(physSel->At(isel)->GetName(), trigClasses->At(itrig)->GetName(), centrality->At(icent)->GetName(), histoName.Data()));
396 if ( ! num )
continue;
398 currName = Form(
"%s_%s_%s_%s_%s", physSel->At(isel)->GetName(), trigClasses->At(itrig)->GetName(), centrality->At(icent)->GetName(), trackSel.At(itrackSel)->GetName(), methodSel.At(imethodSel)->GetName());
399 effGraph->SetTitle(currName.Data());
403 yAxisTitle =
"Efficiency";
405 if ( furtherOpt.Contains(
"DIFF") || furtherOpt.Contains(
"PULL") ) {
410 Double_t currX, currY, baseX, baseY, errYlow = 0., errYhigh = 0., newY = 0.;
412 for (
Int_t ipoint=0; ipoint<effGraph->GetN(); ipoint++ ) {
413 refGraph->GetPoint(ipoint, baseX, baseY);
414 effGraph->GetPoint(ipoint, currX, currY);
415 Double_t errX = effGraph->GetErrorXlow(ipoint);
416 if ( furtherOpt.Contains(
"DIFF") ) {
417 refVal = ( baseY > 0. ) ? baseY : 1.;
418 newY = ( currY - baseY ) / refVal;
419 Double_t errYlow1 = effGraph->GetErrorYlow(ipoint);
420 Double_t errYlow2 = refGraph->GetErrorYlow(ipoint);
421 Double_t errYhigh1 = effGraph->GetErrorYhigh(ipoint);
422 Double_t errYhigh2 = refGraph->GetErrorYhigh(ipoint);
423 errYlow = TMath::Sqrt(errYlow1*errYlow1 + errYlow2*errYlow2) / refVal;
424 errYhigh = TMath::Sqrt(errYhigh1*errYhigh1 + errYhigh2*errYhigh2) / refVal;
426 yAxisTitle =
"(eff - ref ) / ref";
427 effGraph->SetTitle(Form(
"Rel. diff. w.r.t. %s", refGraph->GetTitle()));
431 else if ( furtherOpt.Contains(
"PULL") ) {
432 errY = 0.5 * ( effGraph->GetErrorYlow(ipoint) + effGraph->GetErrorYhigh(ipoint));
433 newY = ( errY > 0. ) ? ( currY - baseY ) / errY : 0.;
437 yAxisTitle =
"(eff - ref ) / err";
438 effGraph->SetTitle(Form(
"Pull w.r.t. %s", refGraph->GetTitle()));
442 effGraph->SetPoint(ipoint, currX, newY);
443 effGraph->SetPointError(ipoint, errX, errX, errYlow, errYhigh);
446 effGraph->GetYaxis()->SetRangeUser(ymin, ymax);
447 effGraph->GetYaxis()->SetTitle(yAxisTitle.Data());
448 effGraph->SetLineColor(icolor);
449 effGraph->SetMarkerColor(icolor);
450 effGraph->SetMarkerStyle(20 + istyle);
453 if ( icolor == 5 || icolor == 10 ) icolor++;
455 effGraph->Draw(drawOpt.Data());
457 if ( ich < 3 )
continue;
458 leg->AddEntry(effGraph, currName.Data(),
"lp");
474 fList =
dynamic_cast<TList*
>(GetOutputData(2));
480 TString baseName[3] = {
"Chamber",
"RPC",
"Board"};
482 TString effName[AliTrigChEffOutput::kNcounts-1] = {
"BendPlane",
"NonBendPlane",
"BothPlanes"};
483 for (
Int_t itype=0; itype<3; itype++ ) {
484 for (
Int_t icount=0; icount<AliTrigChEffOutput::kNcounts-1; icount++ ){
485 TString canName = Form(
"efficiencyPer%s_%s",baseName[itype].
Data(),effName[icount].
Data());
486 TCanvas* can =
new TCanvas(canName.Data(),canName.Data(),10*(1+AliTrigChEffOutput::kNcounts*itype+icount),10*(1+AliTrigChEffOutput::kNcounts*itype+icount),310,310);
487 can->SetFillColor(10); can->SetHighLightColor(10);
488 can->SetLeftMargin(0.15); can->SetBottomMargin(0.15);
492 for (
Int_t ich=-1; ich<4; ich++ ) {
494 num =
static_cast<TH1*
>(
fList->FindObject(histoName.Data()));
496 den =
static_cast<TH1*
>(
fList->FindObject(histoName.Data()));
497 if ( ! num || ! den )
continue;
499 effGraph->GetYaxis()->SetRangeUser(0., 1.1);
500 effGraph->GetYaxis()->SetTitle(
"Efficiency");
501 effGraph->GetXaxis()->SetTitle(baseName[itype].
Data());
503 effGraph->Draw(
"AP");
504 if ( itype == 0 )
break;
511 if ( ! outFileOpt.IsNull() ) {
512 TObjArray* outFileOptList = outFileOpt.Tokenize(
"?");
513 AliInfo(Form(
"Creating file %s", outFileOptList->At(0)->GetName()));
514 TString histoPattern = outFileOptList->At(4)->GetName();
521 TList* effList =
fAnalysisOutput->
GetEffHistoList(outFileOptList->At(1)->GetName(), outFileOptList->At(2)->GetName(), outFileOptList->At(3)->GetName(), itrackSel, imatch, imethod);
522 effList->SetName(GetOutputSlot(2)->GetContainer()->GetName());
523 if ( effList ->GetEntries() == 0 ) {
524 printf(
"\nWarning: no histograms satisfying the requested conditions.\n(%s %s %s %s).\nOutput %s not created.\n", outFileOptList->At(1)->GetName(), outFileOptList->At(2)->GetName(), outFileOptList->At(3)->GetName(), outFileOptList->At(4)->GetName(),outFileOptList->At(0)->GetName());
527 TFile* outFile = TFile::Open(outFileOptList->At(0)->GetName(),
"RECREATE");
528 effList->Write(effList->GetName(),TObject::kSingleKey);
532 delete outFileOptList;
Hit pattern from tracker track extrapolation.
TList * GetEffHistoList(TString physSel, TString trigClassNames, TString centrality, Int_t itrackSel, Int_t imatch, Int_t imethod)
void Terminate(Option_t *option)
void ProcessEvent(TString physSel, const TObjArray &selectTrigClasses, TString centrality)
Total number of track selection.
AliTrigChEffOutput * fAnalysisOutput
! Output handler
Counts per board histogram index.
tracks used for calculation
Total number of efficiency methods.
Check rejected tracks per board.
Total number of matched types.
TH1 * GetCountHisto(Int_t itype, Int_t icount, Int_t ichamber, Int_t itrackSel, Int_t imatch, Int_t imethod)
Output for Trig chamber effieincy.
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
Non selected tracks (includes ghosts)
Counts per cathode histogram index.
AliAnalysisTaskTrigChEff()
Check rejected tracks per board.
virtual ~AliAnalysisTaskTrigChEff()
void MyUserCreateOutputObjects()
Hit pattern from trigger.
TList * fList
! TList output object
TString GetHistoName(Int_t itype, Int_t icount, Int_t ichamber, Int_t itrackSel, Int_t imatch, Int_t imethod)
Counts per slat histogram index.