//_____________________________________________________________________________ void FnormMacro( const char* filename="../LHC15g.MuMu.1.root", const char* associatedSimFileName="", const char* associatedSimFileName2="", const char* beamYear="PbPb2011",const int DebugLevel =0) { // //_____ FNorm // analysis.ComputeIntFnormFromCounters("",kFALSE); // //_____ AliAnalysisMuMu ana(filename,associatedSimFileName,associatedSimFileName2,beamYear); AliLog::SetGlobalDebugLevel(DebugLevel); if (!ana.OC() || !ana.CC()) { AliError("No mergeable/counter collection. Consider Upgrade()"); return ; } else { cout << " ================================================================ " << endl; cout << " Compute Mean Fnorm From Counters " << endl; cout << " ================================================================ " << endl; } // Get configuration settings TObjArray* eventTypeArray = ana.Config()->GetListElements(AliAnalysisMuMuConfig::kEventSelectionList,IsSimulation()); TObjArray* triggerMuonArray = ana.Config()->GetListElements(AliAnalysisMuMuConfig::kDimuonTriggerList,IsSimulation()); TObjArray* triggerMBArray = ana.Config()->GetListElements(AliAnalysisMuMuConfig::kMinbiasTriggerList,IsSimulation()); TObjArray* centralityArray = ana.Config()->GetListElements(AliAnalysisMuMuConfig::kCentralitySelectionList, IsSimulation()); // Iterator for loops TIter nextTriggerMuon(triggerMuonArray); TIter nextTriggerMB(triggerMBArray); TIter nextEventType(eventTypeArray); TIter nextCentrality(centralityArray); // Strings TObjString* striggerMuon; TObjString* striggerMB; TObjString* seventType; TObjString* scentrality; //Pointers on histo TH1*h(0x0); TH1*h1(0x0); TH1*h2(0x0); Double_t FNormOverStat(0.); Double_t FNormTotError(0.); Double_t FNormTotErrorInverse(0.); Double_t FNormTotErrorSys(0.); Double_t Norm(1.); Int_t n =0; //counter nextEventType.Reset(); // Loop on each envenType (see MuMuConfig) //============================================================================== while ( ( seventType = static_cast<TObjString*>(nextEventType())) ) { AliDebug(1,Form("EVENTTYPE %s",seventType->String().Data())); nextTriggerMuon.Reset(); // Loop on each Muon trigger (see MuMuConfig) //============================================================================== while ( ( striggerMuon = static_cast<TObjString*>(nextTriggerMuon())) ) { AliDebug(1,Form("-MUON TRIGGER %s",striggerMuon->String().Data())); nextTriggerMB.Reset(); // Loop on each MB trigger (not the ones in MuMuConfig but the ones set) //============================================================================== while ( ( striggerMB = static_cast<TObjString*>(nextTriggerMB())) ) { AliDebug(1,Form("-- MB PAIRCUT %s",striggerMB->String().Data())); nextCentrality.Reset(); // Loop on each centrality //============================================================================== while ( ( scentrality = static_cast<TObjString*>(nextCentrality()) ) ) { TString id(Form("/FNORM-%s/%s/%s/PbPb",striggerMuon->String().Data(),seventType->String().Data(),scentrality->String().Data())); // Path where are saved histos in the mergeable collection h = OC()->Histo(id.Data(),Form("hFNormIntVSrun_%s",striggerMB->String().Data())); if (!h) { AliDebug(1,Form("Can't get histo %s/hFNormIntVSrun_%s",id.Data(),striggerMB->String().Data())); continue; } h1 = OC()->Histo(id.Data(),Form("hFNormInt_%s",striggerMB->String().Data())); if (!h1) { AliDebug(1,Form("Can't get histo %s/hFNormInt_%s",id.Data(),striggerMB->String().Data())); continue; } h2 = OC()->Histo(id.Data(),Form("hFNormIntSys_%s",striggerMB->String().Data())); if (!h2) { AliDebug(1,Form("Can't get histo %s/hFNormIntSys_%s",id.Data(),striggerMB->String().Data())); continue; } cout << Form("Fnorm from %s/%s added",id.Data(),h1->GetName()) << endl; cout << Form("Fnorm from %s/%s added",id.Data(),h2->GetName()) << endl; // Normalise with respect to centrality if (scentrality->String().Contains("V0M_00.00_90.00")) { Norm = 1.; FNormOverStat = FNormOverStat + (Norm*h1->GetBinContent(1)) /(TMath::Power(Norm *h1->GetBinError(1),2.)); FNormTotError = FNormTotError + 1./(TMath::Power(Norm*h1->GetBinError(1),2.)); FNormTotErrorInverse = FNormTotErrorInverse + 1./(TMath::Power(Norm*h1->GetBinError(1),-2.)); FNormTotErrorSys = FNormTotErrorSys + 1./(TMath::Power(Norm*h2->GetBinContent(1),2.)); cout <<"--- Quantities from histogram : " << endl; cout <<" - Norm = " << Norm << endl; cout <<" - FNormHisto = " << h1->GetBinContent(1) << endl; cout <<" - FNormHistoError = " << h1->GetBinError(1) << endl; cout <<" - FNormHistoSys = " << h2->GetBinContent(1) << endl; cout <<"--- Quantities (normalized) from histogram: " << endl; cout <<" - FNormHisto = " << Norm*h1->GetBinContent(1) << endl; cout <<" - FNormHistoError = " << Norm*h1->GetBinError(1) << endl; cout <<" - FNormHistoSys = " << Norm*h2->GetBinContent(1) << endl; cout <<"--- After addition : " << endl; cout <<" - FNormOverStat = " << FNormOverStat << endl; cout <<" - FNormTotError = " << FNormTotError << endl; cout <<" - FNormTotErrorInverse = " << FNormTotErrorInverse << endl; cout <<" - FNormTotErrorSys = " << FNormTotErrorSys << endl; } else if (scentrality->String().Contains("V0M_10.00_50.00")) { Norm = (1./0.4)*0.445*0.9; FNormOverStat = FNormOverStat + (Norm*h1->GetBinContent(1)) /(TMath::Power(Norm *h1->GetBinError(1),2.)); FNormTotError = FNormTotError + 1./(TMath::Power(Norm*h1->GetBinError(1),2.)); FNormTotErrorInverse = FNormTotErrorInverse + 1./(TMath::Power(Norm*h1->GetBinError(1),-2.)); FNormTotErrorSys = FNormTotErrorSys + 1./(TMath::Power(Norm*h2->GetBinContent(1),2.)); cout <<"--- Quantities from histogram : " << endl; cout <<" - Norm = " << Norm << endl; cout <<" - FNormHisto = " << h1->GetBinContent(1) << endl; cout <<" - FNormHistoError = " << h1->GetBinError(1) << endl; cout <<" - FNormHistoSys = " << h2->GetBinContent(1) << endl; cout <<"--- Quantities (normalized) from histogram: " << endl; cout <<" - FNormHisto = " << Norm*h1->GetBinContent(1) << endl; cout <<" - FNormHistoError = " << Norm*h1->GetBinError(1) << endl; cout <<" - FNormHistoSys = " << Norm*h2->GetBinContent(1) << endl; cout <<"--- After addition : " << endl; cout <<" - FNormOverStat = " << FNormOverStat << endl; cout <<" - FNormTotError = " << FNormTotError << endl; cout <<" - FNormTotErrorInverse = " << FNormTotErrorInverse << endl; cout <<" - FNormTotErrorSys = " << FNormTotErrorSys << endl; } else if (scentrality->String().Contains("V0M_00.00_07.50")) { Norm = (1./0.075)*0.443*0.9; FNormOverStat = FNormOverStat + (Norm*h1->GetBinContent(1)) /(TMath::Power(Norm *h1->GetBinError(1),2.)); FNormTotError = FNormTotError + 1./(TMath::Power(Norm*h1->GetBinError(1),2.)); FNormTotErrorInverse = FNormTotErrorInverse + 1./(TMath::Power(Norm*h1->GetBinError(1),-2.)); FNormTotErrorSys = FNormTotErrorSys + 1./(TMath::Power(Norm*h2->GetBinContent(1),2.)); cout <<"--- Quantities from histogram : " << endl; cout <<" - Norm = " << Norm << endl; cout <<" - FNormHisto = " << h1->GetBinContent(1) << endl; cout <<" - FNormHistoError = " << h1->GetBinError(1) << endl; cout <<" - FNormHistoSys = " << h2->GetBinContent(1) << endl; cout <<"--- Quantities (normalized) from histogram: " << endl; cout <<" - FNormHisto = " << Norm*h1->GetBinContent(1) << endl; cout <<" - FNormHistoError = " << Norm*h1->GetBinError(1) << endl; cout <<" - FNormHistoSys = " << Norm*h2->GetBinContent(1) << endl; cout <<"--- After addition : " << endl; cout <<" - FNormOverStat = " << FNormOverStat << endl; cout <<" - FNormTotError = " << FNormTotError << endl; cout <<" - FNormTotErrorInverse = " << FNormTotErrorInverse << endl; cout <<" - FNormTotErrorSys = " << FNormTotErrorSys << endl; } else { AliError("Check this method for centrality selection !"); return; } n++; } } } } cout << "Mean FNorm computed from " << n <<" results = " << FNormOverStat/FNormTotError << " +/- " << TMath::Sqrt(FNormTotErrorInverse) << " (stat) +/-" << TMath::Sqrt(FNormTotErrorSys) << " (sys) " <<endl; delete triggerMuonArray ; delete triggerMBArray ; delete eventTypeArray ; delete centralityArray ; }
//_____________________________________________________________________________ void RunPerformanceTaskResEffMC(TChain *chain, Bool_t bUseMCInfo=kTRUE, Bool_t bUseESDfriend=kTRUE, Bool_t bProof=kTRUE) { if(!chain) { AliDebug(AliLog::kError, "ERROR: No input chain available"); return; } // // Swtich off all AliInfo (too much output!) // AliLog::SetGlobalLogLevel(AliLog::kError); // // Create analysis manager // AliAnalysisManager *mgr = new AliAnalysisManager; if(!mgr) { Error("runTPCQA","AliAnalysisManager not set!"); return; } // // Set ESD input handler // AliESDInputHandler* esdH = new AliESDInputHandler; if(!esdH) { Error("runTPCQA","AliESDInputHandler not created!"); return; } if(bUseESDfriend) esdH->SetActiveBranches("ESDfriend"); mgr->SetInputEventHandler(esdH); // // Set MC input handler // if(bUseMCInfo) { AliMCEventHandler* mcH = new AliMCEventHandler; if(!esdH) { Error("runTPCQA","AliMCEventHandler not created!"); return; } mcH->SetReadTR(kTRUE); mgr->SetMCtruthEventHandler(mcH); } // // Create task // AliPerformanceTask *task = new AliPerformanceTask("Performance","TPC Performance"); if (!task) { Error("AddTaskPerformanceTPC", "TPC performance task cannot be created!"); return NULL; } task->SetUseMCInfo(bUseMCInfo); task->SetUseESDfriend(bUseESDfriend); // // Add task to analysis manager // mgr->AddTask(task); // // Create TPC-ESD track reconstruction cuts // MB tracks // AliRecInfoCuts *pRecInfoCutsTPC = new AliRecInfoCuts("pRecInfoCutsTPC"); if(pRecInfoCutsTPC) { pRecInfoCutsTPC->SetMaxDCAToVertexXY(3.0); pRecInfoCutsTPC->SetMaxDCAToVertexZ(30.0); //pRecInfoCutsTPC->SetMaxDCAToVertexZ(3.0); pRecInfoCutsTPC->SetRequireSigmaToVertex(kFALSE); pRecInfoCutsTPC->SetRequireTPCRefit(kFALSE); pRecInfoCutsTPC->SetAcceptKinkDaughters(kTRUE); pRecInfoCutsTPC->SetMinNClustersTPC(50); pRecInfoCutsTPC->SetMaxChi2PerClusterTPC(1000000.); pRecInfoCutsTPC->SetDCAToVertex2D(kFALSE); pRecInfoCutsTPC->SetHistogramsOn(kFALSE); } else { Error("AddTaskPerformanceTPC", "AliRecInfoCutsTPC cannot be created!"); return NULL; } // // Create TPC-ESD track reconstruction cuts // MATCH tracks // AliRecInfoCuts *pRecInfoCutsMATCH = new AliRecInfoCuts("pRecInfoCutsMATCH"); if(pRecInfoCutsMATCH) { pRecInfoCutsMATCH->SetMaxDCAToVertexXY(3.0); pRecInfoCutsMATCH->SetMaxDCAToVertexZ(3.0); pRecInfoCutsMATCH->SetRequireSigmaToVertex(kFALSE); pRecInfoCutsMATCH->SetRequireTPCRefit(kFALSE); pRecInfoCutsMATCH->SetAcceptKinkDaughters(kTRUE); pRecInfoCutsMATCH->SetMinNClustersTPC(50); pRecInfoCutsMATCH->SetMaxChi2PerClusterTPC(1000000.); pRecInfoCutsMATCH->SetDCAToVertex2D(kFALSE); pRecInfoCutsMATCH->SetTPCITSMatchingRadius(70); pRecInfoCutsMATCH->SetTPCTRDMatchingRadius(260); pRecInfoCutsMATCH->SetMinNClustersITS(3); pRecInfoCutsMATCH->SetHistogramsOn(kFALSE); } else { Error("AddTaskPerformanceTPC", "AliRecInfoCutsTPC cannot be created!"); return NULL; } // // Create TPC-ESD track reconstruction cuts // standard cuts AliRecInfoCuts *pRecInfoCuts = new AliRecInfoCuts("pRecInfoCuts"); if(pRecInfoCuts) { pRecInfoCuts->SetMaxDCAToVertexXY(3.0); pRecInfoCuts->SetMaxDCAToVertexZ(3.0); pRecInfoCuts->SetMinNClustersTPC(50); pRecInfoCuts->SetMinNClustersITS(2); pRecInfoCuts->SetHistogramsOn(kFALSE); pRecInfoCuts->SetTPCITSMatchingRadius(70); pRecInfoCuts->SetTPCTRDMatchingRadius(260); } else { Error("AddTaskPerformanceTPC", "AliRecInfoCuts cannot be created!"); return NULL; } // // Create TPC-MC track reconstruction cuts // AliMCInfoCuts *pMCInfoCuts = new AliMCInfoCuts("pMCInfoCuts"); if(pMCInfoCuts) { pMCInfoCuts->SetMinTrackLength(70); } else { Error("AddTaskPerformanceTPC", "AliMCInfoCuts cannot be created!"); return NULL; } // // Create performance objects for TPC and set cuts // enum { kTPC = 0, kTPCITS, kConstrained, kTPCInner, kTPCOuter, kTPCSec }; // // Resolution // AliPerformanceRes *pCompRes0 = new AliPerformanceRes("AliPerformanceRes","AliPerformanceRes",kTPC,kFALSE); if(!pCompRes0) { Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceRes"); } pCompRes0->SetAliRecInfoCuts(pRecInfoCuts); pCompRes0->SetAliMCInfoCuts(pMCInfoCuts); AliPerformanceRes *pCompRes3 = new AliPerformanceRes("AliPerformanceResTPCInner","AliPerformanceResTPCInner",kTPCInner,kFALSE); if(!pCompRes3) { Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceResTPCInner"); } pCompRes3->SetAliRecInfoCuts(pRecInfoCuts); pCompRes3->SetAliMCInfoCuts(pMCInfoCuts); AliPerformanceRes *pCompRes4 = new AliPerformanceRes("AliPerformanceResTPCOuter","AliPerformanceResTPCOuter",kTPCOuter,kFALSE); if(!pCompRes4) { Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceResTPCOuter"); } pCompRes4->SetAliRecInfoCuts(pRecInfoCuts); pCompRes4->SetAliMCInfoCuts(pMCInfoCuts); // // Efficiency // AliPerformanceEff *pCompEff0 = new AliPerformanceEff("AliPerformanceEff","AliPerformanceEff",kTPC,kFALSE); if(!pCompEff0) { Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceEff"); } pCompEff0->SetAliRecInfoCuts(pRecInfoCuts); pCompEff0->SetAliMCInfoCuts(pMCInfoCuts); // // dEdx // AliPerformanceDEdx *pCompDEdx3 = new AliPerformanceDEdx("AliPerformanceDEdxTPCInner","AliPerformanceDEdxTPCInner",kTPCInner,kFALSE); if(!pCompDEdx3) { Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceDEdxTPCInner"); } pCompDEdx3->SetAliRecInfoCuts(pRecInfoCuts); pCompDEdx3->SetAliMCInfoCuts(pMCInfoCuts); // // DCA // AliPerformanceDCA *pCompDCA0 = new AliPerformanceDCA("AliPerformanceDCA","AliPerformanceDCA",kTPC,kFALSE); if(!pCompDCA0) { Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceDCA"); } pCompDCA0->SetAliRecInfoCuts(pRecInfoCuts); pCompDCA0->SetAliMCInfoCuts(pMCInfoCuts); // // TPC performance // AliPerformanceTPC *pCompTPC0 = new AliPerformanceTPC("AliPerformanceTPC","AliPerformanceTPC",kTPC,kFALSE); if(!pCompTPC0) { Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceTPC"); } pCompTPC0->SetAliRecInfoCuts(pRecInfoCutsTPC); pCompTPC0->SetAliMCInfoCuts(pMCInfoCuts); // // TPC+ITS matching performance // AliPerformanceMatch *pCompMatch0 = new AliPerformanceMatch("AliPerformanceMatchTPCITS","AliPerformanceMatchTPCITS",0,kFALSE); if(!pCompMatch0) { Error("AddTaskPerformanceMatch", "Cannot create AliPerformanceMatchTPCITS"); } pCompMatch0->SetAliRecInfoCuts(pRecInfoCutsMATCH); pCompMatch0->SetAliMCInfoCuts(pMCInfoCuts); // // TPC+TRD matching performance // AliPerformanceMatch *pCompMatch1 = new AliPerformanceMatch("AliPerformanceMatchTPCTRD","AliPerformanceMatchTPCTRD",1,kFALSE); if(!pCompMatch1) { Error("AddTaskPerformanceMatch", "Cannot create AliPerformanceMatchTPCTRD"); } pCompMatch1->SetAliRecInfoCuts(pRecInfoCutsMATCH); pCompMatch1->SetAliMCInfoCuts(pMCInfoCuts); AliPerformanceMatch *pCompMatch2 = new AliPerformanceMatch("AliPerformanceMatchTPCEFF","AliPerformanceMatchTPCEFF",2,kFALSE); if(!pCompMatch2) { Error("AddTaskPerformanceMatch", "Cannot create AliPerformanceMatchTPCEFF"); } pCompMatch2->SetAliRecInfoCuts(pRecInfoCutsMATCH); pCompMatch2->SetAliMCInfoCuts(pMCInfoCuts); // // Add components to the performance task // //task->AddPerformanceObject( pCompDEdx3 ); //task->AddPerformanceObject( pCompDCA0 ); //task->AddPerformanceObject( pCompTPC0 ); //task->AddPerformanceObject( pCompMatch0 ); //task->AddPerformanceObject( pCompMatch1 ); //task->AddPerformanceObject( pCompMatch2 ); // if(bUseMCInfo) { task->AddPerformanceObject( pCompRes0 ); //task->AddPerformanceObject( pCompRes3 ); //task->AddPerformanceObject( pCompRes4 ); task->AddPerformanceObject( pCompEff0 ); } // if(!bUseMCInfo) { pCompDEdx3->SetTriggerClass(triggerClass); pCompDCA0->SetTriggerClass(triggerClass); pCompTPC0->SetTriggerClass(triggerClass); pCompMatch0->SetTriggerClass(triggerClass); pCompMatch1->SetTriggerClass(triggerClass); pCompMatch2->SetTriggerClass(triggerClass); } // // Create containers for input // mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer()); // // Create containers for output // AliAnalysisDataContainer *coutput_tpc = mgr->CreateContainer("TPCMC", TList::Class(), AliAnalysisManager::kOutputContainer, Form("TPC.MC.%s.root", task->GetName())); mgr->ConnectOutput(task, 1, coutput_tpc); // Enable debug printouts mgr->SetDebugLevel(0); if (!mgr->InitAnalysis()) return; mgr->PrintStatus(); if(bProof) mgr->StartAnalysis("proof",chain); else mgr->StartAnalysis("local",chain); }