/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ //------------------------------------------------------------------------// // Fill histograms with basic QA information for EMCAL offline trigger // // Author: Nicolas Arbor (LPSC-Grenoble), Rachid Guernane (LPSC-Grenoble)// // Gustavo Conesa Balbastre (LPSC-Grenoble) // // // // $Id$ // //------------------------------------------------------------------------// #include #include #include #include #include #include #include "AliLog.h" #include "AliVCluster.h" #include "AliVCaloCells.h" #include "AliVEvent.h" #include "AliCentrality.h" #include "AliESDEvent.h" #include "AliESDVZERO.h" #include "AliESDCaloTrigger.h" #include "AliEMCALGeometry.h" #include "AliEMCALRecoUtils.h" #include "AliOADBContainer.h" #include "AliAnalysisManager.h" #include "AliAnalysisTaskEMCALTriggerQA.h" ClassImp(AliAnalysisTaskEMCALTriggerQA) //______________________________________________________________ AliAnalysisTaskEMCALTriggerQA::AliAnalysisTaskEMCALTriggerQA() : AliAnalysisTaskSE(), fOutputList(0), fRecoUtils(0x0), fGeoSet(0), fGeometry(0), fGeoName(""), fOADBSet(kFALSE), fAccessOADB(kTRUE), fOADBFilePath(""), fBitEGA(0), fBitEJE(0), fEtaPhiEnMin(10.), //Histograms fhNEvents(0), fhFORAmp(0), fhFORAmpL1G(0), fhFORAmpL1G2(0), fhFORAmpL1J(0), fhFORAmpL1J2(0), fhL0Amp(0), fhL0AmpL1G(0), fhL0AmpL1J(0), fhL1Amp(0), fhL1GAmp(0), fhL1G2Amp(0), fhL1JAmp(0), fhL1J2Amp(0), fhL1FOREnergy(0), fhL0Patch(0), fhL1GPatch(0), fhL1G2Patch(0), fhL1GPatchNotFake(0),fhL1GPatchFake(0),fhL1GPatchNotAllFake(0), fhL1GPatchAllFake(0),fhL1GPatchNotAllFakeMax(0),fhL1GPatchAllFakeMax(0),fhL1GPatchNotAllFakeMaxE(0),fhL1GPatchAllFakeMaxE(0), fhL1GPatchNotAllFakeE(0),fhL1GPatchAllFakeE(0),fhL1GPatchFakeE(0),fhL1GPatchNotFakeE(0),fhnpatchFake(0),fhnpatchNotFake(0), fhL1JPatch(0), fhL1J2Patch(0), fhFEESTU(0), fhTRUSTU(0), fhV0STU(0), fhGPMaxVV0TT(0), fhJPMaxVV0TT(0), fhFORMeanAmp(0), fhL0MeanAmp(0), fhL1MeanAmp(0), fhL1GPatchMax(0), fhL1G2PatchMax(0), fhL1JPatchMax(0), fhL1J2PatchMax(0), //Histogram settings fNBinsSTUSignal (2000), fMaxSTUSignal (200000), fNBinsTRUSignal (2000), fMaxTRUSignal (200000), fNBinsV0Signal (5000), fMaxV0Signal (100000), fNBinsSTUFEERatio(1000), fMaxSTUFEERatio(100), fNBinsSTUTRURatio(1000), fMaxSTUTRURatio(100), fNBinsClusterE (500), fMaxClusterE (200) { // Constructor InitHistogramArrays(); DefineOutput(1, TList::Class()); } //______________________________________________________________________________ AliAnalysisTaskEMCALTriggerQA::AliAnalysisTaskEMCALTriggerQA(const char *name) : AliAnalysisTaskSE(name), fOutputList(0), fRecoUtils(0x0), fGeoSet(0), fGeometry(0), fGeoName(""), fOADBSet(kFALSE), fAccessOADB(kTRUE), fOADBFilePath(""), fBitEGA(0), fBitEJE(0), fEtaPhiEnMin(10.), //Histograms fhNEvents(0), fhFORAmp(0), fhFORAmpL1G(0), fhFORAmpL1G2(0), fhFORAmpL1J(0), fhFORAmpL1J2(0), fhL0Amp(0), fhL0AmpL1G(0), fhL0AmpL1J(0), fhL1Amp(0), fhL1GAmp(0), fhL1G2Amp(0), fhL1JAmp(0), fhL1J2Amp(0), fhL1FOREnergy(0), fhL0Patch(0), fhL1GPatch(0), fhL1G2Patch(0), fhL1GPatchNotFake(0),fhL1GPatchFake(0),fhL1GPatchNotAllFake(0), fhL1GPatchAllFake(0),fhL1GPatchNotAllFakeMax(0),fhL1GPatchAllFakeMax(0),fhL1GPatchNotAllFakeMaxE(0),fhL1GPatchAllFakeMaxE(0), fhL1GPatchNotAllFakeE(0),fhL1GPatchAllFakeE(0),fhL1GPatchFakeE(0),fhL1GPatchNotFakeE(0),fhnpatchFake(0),fhnpatchNotFake(0), fhL1JPatch(0), fhL1J2Patch(0), fhFEESTU(0), fhTRUSTU(0), fhV0STU(0), fhGPMaxVV0TT(0), fhJPMaxVV0TT(0), fhFORMeanAmp(0), fhL0MeanAmp(0), fhL1MeanAmp(0), fhL1GPatchMax(0), fhL1G2PatchMax(0), fhL1JPatchMax(0), fhL1J2PatchMax(0), //Histogram settings fNBinsSTUSignal (2000), fMaxSTUSignal (200000), fNBinsTRUSignal (2000), fMaxTRUSignal (200000), fNBinsV0Signal (5000), fMaxV0Signal (100000), fNBinsSTUFEERatio(1000), fMaxSTUFEERatio(100), fNBinsSTUTRURatio(1000), fMaxSTUTRURatio(100), fNBinsClusterE (500), fMaxClusterE (200) { // Constructor InitHistogramArrays(); DefineOutput(1, TList::Class()); } //______________________________________________ void AliAnalysisTaskEMCALTriggerQA::AccessOADB() { // Set the AODB bad channels at least once //Set it only once if(fOADBSet) return ; if(fOADBFilePath == "") fOADBFilePath = "$ALICE_ROOT/OADB/EMCAL" ; Int_t runnumber = InputEvent()->GetRunNumber() ; if(DebugLevel() > 0) printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Get AODB parameters from EMCAL in %s for run %d\n",fOADBFilePath.Data(),runnumber); Int_t nSM = fGeometry->GetNumberOfSuperModules(); // Bad map if(fRecoUtils->IsBadChannelsRemovalSwitchedOn()) { AliOADBContainer *contBC=new AliOADBContainer(""); contBC->InitFromFile(Form("%s/EMCALBadChannels.root",fOADBFilePath.Data()),"AliEMCALBadChannels"); TObjArray *arrayBC=(TObjArray*)contBC->GetObject(runnumber); if(arrayBC) { if(DebugLevel() > 0) printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Remove EMCAL bad cells \n"); for (Int_t i=0; iGetEMCALChannelStatusMap(i); if (hbm) delete hbm; hbm=(TH2I*)arrayBC->FindObject(Form("EMCALBadChannelMap_Mod%d",i)); if (!hbm) { AliError(Form("Can not get EMCALBadChannelMap_Mod%d",i)); continue; } hbm->SetDirectory(0); fRecoUtils->SetEMCALChannelStatusMap(i,hbm); } // loop } else if(DebugLevel() > 0) printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Do NOT remove EMCAL bad channels\n"); // run array } // Remove bad fOADBSet = kTRUE; } //_______________________________________________________________________________________________________________ void AliAnalysisTaskEMCALTriggerQA::FillClusterHistograms(Int_t triggerNumber, Bool_t max, Float_t e, Float_t eta, Float_t phi, Float_t ieta, Float_t iphi, Float_t centrality, Float_t v0AC) { //Fill normal cluster related histograms depending on the trigger selection if(!max) { fhClus[triggerNumber] ->Fill(e); fhClusCen[triggerNumber] ->Fill(e,centrality); fhClusV0[triggerNumber] ->Fill(e,v0AC); fhClusEta[triggerNumber] ->Fill(e,eta); fhClusPhi[triggerNumber] ->Fill(e,phi); if(e > fEtaPhiEnMin) { fhClusEtaPhiHigh[triggerNumber] ->Fill( eta, phi); fhClusEtaPhiHighCellMax[triggerNumber] ->Fill(ieta,iphi); } else { fhClusEtaPhiLow[triggerNumber] ->Fill( eta, phi); fhClusEtaPhiLowCellMax[triggerNumber] ->Fill(ieta,iphi); } } else { fhClusMax[triggerNumber] ->Fill(e); fhClusCenMax[triggerNumber] ->Fill(e,centrality); fhClusV0Max[triggerNumber] ->Fill(e,v0AC); fhClusEtaMax[triggerNumber] ->Fill(e,eta); fhClusPhiMax[triggerNumber] ->Fill(e,phi); if(e > fEtaPhiEnMin) { fhClusEtaPhiHighCluMax[triggerNumber] ->Fill( eta, phi); fhClusEtaPhiHighCellMaxCluMax[triggerNumber] ->Fill(ieta,iphi); } else { fhClusEtaPhiLowCluMax[triggerNumber] ->Fill( eta, phi); fhClusEtaPhiLowCellMaxCluMax[triggerNumber] ->Fill(ieta,iphi); } } } //_________________________________________ void AliAnalysisTaskEMCALTriggerQA::Init() { //Init analysis parameters not set before if(!fRecoUtils) { fRecoUtils = new AliEMCALRecoUtils ; fRecoUtils->SwitchOnBadChannelsRemoval(); } } //_________________________________________________ void AliAnalysisTaskEMCALTriggerQA::InitGeometry() { // Init geometry and set the geometry matrix, for the first event, skip the rest // Also set once the run dependent calibrations if(fGeoSet) return; // Init the trigger bit once, correct depending on version fBitEGA = 4; fBitEJE = 5; TFile* file = AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile(); const TList *clist = file->GetStreamerInfoCache(); if(clist) { TStreamerInfo *cinfo = (TStreamerInfo*)clist->FindObject("AliESDCaloTrigger"); if(!cinfo) cinfo = (TStreamerInfo*)clist->FindObject("AliAODCaloTrigger"); if(cinfo) { Int_t classversionid = cinfo->GetClassVersion(); if (classversionid >= 5) { fBitEGA = 6; fBitEJE = 8; } } else printf("AliAnalysisTaskEMCALTriggerQA - Streamer info for trigger class not available, bit not changed\n"); } else printf("AliAnalysisTaskEMCALTriggerQA - Streamer list not available!, bit not changed\n"); Int_t runnumber = InputEvent()->GetRunNumber() ; if (!fGeometry) { if(fGeoName=="") { if (runnumber < 140000) fGeoName = "EMCAL_FIRSTYEARV1"; else if(runnumber < 171000) fGeoName = "EMCAL_COMPLETEV1"; else fGeoName = "EMCAL_COMPLETE12SMV1"; if(DebugLevel() > 0) printf("AliAnalysisTaskEMCALTriggerQA::InitGeometry() - Set EMCAL geometry name to <%s> for run %d\n",fGeoName.Data(),runnumber); } fGeometry = AliEMCALGeometry::GetInstance(fGeoName); } fGeoSet = kTRUE; } //_______________________________________________________ void AliAnalysisTaskEMCALTriggerQA::InitHistogramArrays() { //Histograms array initialization for (Int_t i = 0; i < 10; i++) { fhV0[i] = 0; fhClus[i]=0; fhClusMax[i]=0; fhClusCen[i]=0; fhClusCenMax[i]=0; fhClusV0[i]=0; fhClusV0Max[i]=0; fhClusEta[i]=0; fhClusEtaMax[i]=0; fhClusPhi[i]=0; fhClusPhiMax[i]=0; fhClusEtaPhiHigh[i]=0; fhClusEtaPhiHighCluMax[i]=0; fhClusEtaPhiHighCellMax[i]=0; fhClusEtaPhiHighCellMaxCluMax[i]=0; fhClusEtaPhiLow[i]=0; fhClusEtaPhiLowCluMax[i]=0; fhClusEtaPhiLowCellMax[i]=0; fhClusEtaPhiLowCellMaxCluMax[i]=0; if(i<3){ fhClusMBPure[i]=0; fhClusMaxMBPure[i]=0;} } } //___________________________________________________________ void AliAnalysisTaskEMCALTriggerQA::UserCreateOutputObjects() { // Init histograms and geometry fOutputList = new TList; fOutputList ->SetOwner(kTRUE); fhNEvents = new TH1F("hNEvents","Number of selected events",16,0,16); fhNEvents ->SetYTitle("N events"); fhNEvents ->GetXaxis()->SetBinLabel(1 ,"All"); fhNEvents ->GetXaxis()->SetBinLabel(2 ,"MB"); fhNEvents ->GetXaxis()->SetBinLabel(3 ,"Central Pb"); fhNEvents ->GetXaxis()->SetBinLabel(4 ,"SemiCentral Pb"); fhNEvents ->GetXaxis()->SetBinLabel(5 ,"L0"); fhNEvents ->GetXaxis()->SetBinLabel(6 ,"L1-G"); fhNEvents ->GetXaxis()->SetBinLabel(7 ,"L1-G2"); fhNEvents ->GetXaxis()->SetBinLabel(8 ,"L1-J"); fhNEvents ->GetXaxis()->SetBinLabel(9 ,"L1-J2"); fhNEvents ->GetXaxis()->SetBinLabel(10 ,"L1-G & !L1-J"); fhNEvents ->GetXaxis()->SetBinLabel(11 ,"L1-J & !L1-G"); fhNEvents ->GetXaxis()->SetBinLabel(12 ,"L1-J & L1-G"); fhNEvents ->GetXaxis()->SetBinLabel(13 ,"MB & !L1 & !L0"); fhNEvents ->GetXaxis()->SetBinLabel(14,"L0 & !MB"); fhNEvents ->GetXaxis()->SetBinLabel(15,"L1-G & !MB"); fhNEvents ->GetXaxis()->SetBinLabel(16,"L1-J & !MB"); fhFORAmp = new TH2F("hFORAmp", "FEE cells deposited energy, grouped like FastOR 2x2 per Row and Column", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhFORAmp ->SetXTitle("Index #eta (columnns)"); fhFORAmp ->SetYTitle("Index #phi (rows)"); fhFORAmp ->SetZTitle("Amplitude"); fhFORAmpL1G = new TH2F("hFORAmpL1G", "FEE cells deposited energy, grouped like FastOR 2x2 per Row and Column, with L1G trigger condition", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhFORAmpL1G ->SetXTitle("Index #eta (columnns)"); fhFORAmpL1G ->SetYTitle("Index #phi (rows)"); fhFORAmpL1G ->SetZTitle("Amplitude"); fhFORAmpL1G2 = new TH2F("hFORAmpL1G2", "FEE cells deposited energy, grouped like FastOR 2x2 per Row and Column, with L1G2 trigger condition", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhFORAmpL1G2 ->SetXTitle("Index #eta (columnns)"); fhFORAmpL1G2 ->SetYTitle("Index #phi (rows)"); fhFORAmpL1G2 ->SetZTitle("Amplitude"); fhFORAmpL1J = new TH2F("hFORAmpL1J", "FEE cells deposited energy, grouped like FastOR 2x2 per Row and Column, with L1J trigger condition", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhFORAmpL1J ->SetXTitle("Index #eta (columnns)"); fhFORAmpL1J ->SetYTitle("Index #phi (rows)"); fhFORAmpL1J ->SetZTitle("Amplitude"); fhFORAmpL1J2 = new TH2F("hFORAmpL1J2", "FEE cells deposited energy, grouped like FastOR 2x2 per Row and Column, with L1J2 trigger condition", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhFORAmpL1J2 ->SetXTitle("Index #eta (columnns)"); fhFORAmpL1J2 ->SetYTitle("Index #phi (rows)"); fhFORAmpL1J2 ->SetZTitle("Amplitude"); fhL0Amp = new TH2F("hL0Amp","FALTRO signal per Row and Column", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL0Amp ->SetXTitle("Index #eta (columnns)"); fhL0Amp ->SetYTitle("Index #phi (rows)"); fhL0Amp ->SetZTitle("Amplitude"); fhL0AmpL1G = new TH2F("hL0AmpL1G","FALTRO signal per Row and Column, with L1G trigger condition", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL0AmpL1G ->SetXTitle("Index #eta (columnns)"); fhL0AmpL1G ->SetYTitle("Index #phi (rows)"); fhL0AmpL1G ->SetZTitle("Amplitude"); fhL0AmpL1J = new TH2F("hL0AmpL1J","FALTRO signal per Row and Column, with L1j trigger condition", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL0AmpL1J ->SetXTitle("Index #eta (columnns)"); fhL0AmpL1J ->SetYTitle("Index #phi (rows)"); fhL0AmpL1J ->SetZTitle("Amplitude"); fhL1Amp = new TH2F("hL1Amp","STU signal per Row and Column", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1Amp ->SetXTitle("Index #eta (columnns)"); fhL1Amp ->SetYTitle("Index #phi (rows)"); fhL1Amp ->SetZTitle("Amplitude"); fhL1GAmp = new TH2F("hL1GAmp","STU signal per Row and Column for L1 Gamma", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1GAmp ->SetXTitle("Index #eta (columnns)"); fhL1GAmp ->SetYTitle("Index #phi (rows)"); fhL1GAmp ->SetZTitle("Amplitude"); fhL1G2Amp = new TH2F("hL1G2Amp","STU signal per Row and Column for L1 Gamma2", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1G2Amp ->SetXTitle("Index #eta (columnns)"); fhL1G2Amp ->SetYTitle("Index #phi (rows)"); fhL1G2Amp ->SetZTitle("Amplitude"); fhL1JAmp = new TH2F("hL1JAmp","STU signal per Row and Column for L1 Jet", fgkFALTROCols/4,0,fgkFALTROCols,fgkFALTRORows/4,0,fgkFALTRORows); fhL1JAmp ->SetXTitle("Index #eta (columnns)"); fhL1JAmp ->SetYTitle("Index #phi (rows)"); fhL1JAmp ->SetZTitle("Amplitude"); fhL1J2Amp = new TH2F("hL1J2Amp","STU signal per Row and Column for L1 Jet2", fgkFALTROCols/4,0,fgkFALTROCols,fgkFALTRORows/4,0,fgkFALTRORows); fhL1J2Amp ->SetXTitle("Index #eta (columnns)"); fhL1J2Amp ->SetYTitle("Index #phi (rows)"); fhL1J2Amp ->SetZTitle("Amplitude"); fhL1FOREnergy = new TH2F("hL1FOREnergy","FOR index vs FOR energy", fgkFALTROCols*fgkFALTRORows,0,fgkFALTROCols*fgkFALTRORows,200,0,200); fhL1FOREnergy ->SetXTitle("Index FOR"); fhL1FOREnergy ->SetYTitle("Energy (ADC)"); fhL0Patch = new TH2F("hL0Patch","FOR with associated L0 Patch", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL0Patch ->SetXTitle("Index #eta (columnns)"); fhL0Patch ->SetYTitle("Index #phi (rows)"); fhL0Patch ->SetZTitle("counts"); fhL1GPatch = new TH2F("hL1GPatch","FOR with associated L1 Gamma Patch", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1GPatch ->SetXTitle("Index #eta (columnns)"); fhL1GPatch ->SetYTitle("Index #phi (rows)"); fhL1GPatch ->SetZTitle("counts"); fhL1G2Patch = new TH2F("hL1G2Patch","FOR with associated L1 Gamma2 Patch", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1G2Patch ->SetXTitle("Index #eta (columnns)"); fhL1G2Patch ->SetYTitle("Index #phi (rows)"); fhL1G2Patch ->SetZTitle("counts"); fhL1GPatchNotFake = new TH2F("hL1GPatchNotFake","FOR with L1 Gamma Patch associated to energetic cells", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1GPatchNotFake ->SetXTitle("Index #eta (columnns)"); fhL1GPatchNotFake ->SetYTitle("Index #phi (rows)"); fhL1GPatchNotFake ->SetZTitle("counts"); fhL1GPatchFake = new TH2F("hL1GPatchFake","FOR without L1 Gamma Patch associated to energetic cells", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1GPatchFake ->SetXTitle("Index #eta (columnns)"); fhL1GPatchFake ->SetYTitle("Index #phi (rows)"); fhL1GPatchFake ->SetZTitle("counts"); fhL1GPatchNotAllFake = new TH2F("hL1GPatchNotAllFake","FOR with one L1 Gamma Patch associated to an energetic cell", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1GPatchNotAllFake ->SetXTitle("Index #eta (columnns)"); fhL1GPatchNotAllFake ->SetYTitle("Index #phi (rows)"); fhL1GPatchNotAllFake ->SetZTitle("counts"); fhL1GPatchAllFake = new TH2F("hL1GPatchAllFake","FOR without any L1 Gamma Patch associated to an energetic cell", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1GPatchAllFake ->SetXTitle("Index #eta (columnns)"); fhL1GPatchAllFake ->SetYTitle("Index #phi (rows)"); fhL1GPatchAllFake ->SetZTitle("counts"); fhL1GPatchAllFakeMax = new TH2F("hL1GPatchAllFakeMax","FOR with L1 Gamma Patch Max not associated to an energetic cell", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1GPatchAllFakeMax ->SetXTitle("Index #eta (columnns)"); fhL1GPatchAllFakeMax ->SetYTitle("Index #phi (rows)"); fhL1GPatchAllFakeMax ->SetZTitle("counts"); fhL1GPatchNotAllFakeMax = new TH2F("hL1GPatchNotAllFakeMax","FOR with one L1 Gamma Patch Max associated to an energetic cell", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1GPatchNotAllFakeMax ->SetXTitle("Index #eta (columnns)"); fhL1GPatchNotAllFakeMax ->SetYTitle("Index #phi (rows)"); fhL1GPatchNotAllFakeMax ->SetZTitle("counts"); fhL1GPatchNotAllFakeMaxE = new TH1F("hL1GPatchNotAllFakeMaxE","Energy distribution of FOR in events with L1 Gamma Patch Max associated to an energetic cell", fNBinsClusterE,0,fMaxClusterE); fhL1GPatchNotAllFakeMaxE ->SetXTitle("Energy (GeV)"); fhL1GPatchAllFakeMaxE = new TH1F("hL1GPatchAllFakeMaxE","Energy distribution of FOR in events with L1 Gamma Patch Max not associated to an energetic cell", fNBinsClusterE,0,fMaxClusterE); fhL1GPatchAllFakeMaxE ->SetXTitle("Energy (GeV)"); fhL1GPatchNotAllFakeE = new TH1F("hL1GPatchNotAllFakeE","Energy distribution of FOR in events with L1 Gamma Patch not associated to an energetic cell", fNBinsClusterE,0,fMaxClusterE); fhL1GPatchNotAllFakeE ->SetXTitle("Energy (GeV)"); fhL1GPatchAllFakeE = new TH1F("hL1GPatchAllFakeE","Energy distribution of FOR in events with L1 Gamma Patch associated to an energetic cell", fNBinsClusterE,0,fMaxClusterE); fhL1GPatchAllFakeE ->SetXTitle("Energy (GeV)"); fhL1GPatchFakeE = new TH1F("hL1GPatchFakeE","Energy distribution of FOR with L1 Gamma Patch not associated to an energetic cell", fNBinsClusterE,0,fMaxClusterE); fhL1GPatchFakeE ->SetXTitle("Energy (GeV)"); fhL1GPatchNotFakeE = new TH1F("hL1GPatchNotFakeE","Energy distribution of FOR with L1 Gamma Patch associated to an energetic cell", fNBinsClusterE,0,fMaxClusterE); fhL1GPatchNotFakeE ->SetXTitle("Energy (GeV)"); fhnpatchFake = new TH2F("hnpatchFake","number of fake patchs vs. all patchs are fake", 3,0,3, 2880,0,2880); fhnpatchFake ->SetYTitle("number of fake patchs"); fhnpatchFake ->SetXTitle("all fake event"); fhnpatchFake ->SetZTitle("counts"); fhnpatchNotFake = new TH2F("hnpatchNotFake","number of Not fake patchs vs. all patchs are fake", 3, 0, 3, 2000,0,2000); fhnpatchNotFake ->SetYTitle("number of Not fake patchs"); fhnpatchNotFake ->SetXTitle("all fake event"); fhnpatchNotFake ->SetZTitle("counts"); fhL1JPatch = new TH2F("hL1JPatch","FOR with associated L1 Jet Patch", fgkFALTROCols/4,0,fgkFALTROCols,fgkFALTRORows/4,0,fgkFALTRORows); fhL1JPatch ->SetXTitle("Index #eta (columnns)"); fhL1JPatch ->SetYTitle("Index #phi (rows)"); fhL1JPatch ->SetZTitle("counts"); fhL1J2Patch = new TH2F("hL1J2Patch","FOR with associated L1 Jet2 Patch", fgkFALTROCols/4,0,fgkFALTROCols,fgkFALTRORows/4,0,fgkFALTRORows); fhL1J2Patch ->SetXTitle("Index #eta (columnns)"); fhL1J2Patch ->SetYTitle("Index #phi (rows)"); fhL1J2Patch ->SetZTitle("counts"); fhV0STU = new TH2I("hV0STU","Total signal STU vs V0C+V0S", fNBinsV0Signal,0,fMaxV0Signal,fNBinsSTUSignal,0,fMaxSTUSignal); fhV0STU ->SetXTitle("Signal V0C+V0A"); fhV0STU ->SetYTitle("Total signal STU"); fhV0STU ->SetZTitle("counts"); fhFEESTU = new TH2F("hFEESTU","STU / FEE vs channel", fNBinsSTUFEERatio,0,fMaxSTUFEERatio,30,0,30); fhFEESTU ->SetXTitle("STU/FEE signal"); fhFEESTU ->SetYTitle("channel"); fhFEESTU ->SetZTitle("counts"); fhTRUSTU = new TH2F("hTRUSTU","STU / TRU vs channel", fNBinsSTUTRURatio,0,fMaxSTUTRURatio,30,0,30); fhTRUSTU ->SetXTitle("STU/TRU signal"); fhTRUSTU ->SetYTitle("channel"); fhTRUSTU ->SetZTitle("counts"); fhGPMaxVV0TT = new TH2F("hGPMaxVV0TT","Maximum patch of L1-Gamma vs V0 signal in STU",fNBinsV0Signal,0,fMaxV0Signal,1000,0,1000); fhGPMaxVV0TT ->SetXTitle("V0 from STU"); fhGPMaxVV0TT ->SetYTitle("Patch Max"); fhJPMaxVV0TT = new TH2F("hJPMaxVV0TT","Maximum patch of L1-Jet vs V0 signal in STU",fNBinsV0Signal,0,fMaxV0Signal,1000,0,1000); fhJPMaxVV0TT ->SetXTitle("V0 from STU"); fhJPMaxVV0TT ->SetYTitle("Patch Max"); fhFORMeanAmp = new TProfile2D("hFORMeanAmp", "Mean FastOR(FEE) signal per Row and Column", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhFORMeanAmp->SetXTitle("Index #eta"); fhFORMeanAmp->SetYTitle("Index #phi"); fhL0MeanAmp = new TProfile2D("hL0MeanAmp", "Mean FastOR(TRU) signal per Row and Column", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL0MeanAmp->SetXTitle("Index #eta"); fhL0MeanAmp->SetYTitle("Index #phi"); fhL1MeanAmp = new TProfile2D("hL1MeanAmp", "Mean FastOR(STU) signal per Row and Column", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1MeanAmp->SetXTitle("Index #eta"); fhL1MeanAmp->SetYTitle("Index #phi"); fhL1GPatchMax = new TH2F("hL1GPatchMax","FOR of max amplitude patch with associated L1 Gamma Patch", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1GPatchMax ->SetXTitle("Index #eta (columnns)"); fhL1GPatchMax ->SetYTitle("Index #phi (rows)"); fhL1GPatchMax ->SetZTitle("counts"); fhL1G2PatchMax = new TH2F("hL1G2PatchMax","FOR of max amplitude patch with associated L1 Gamma2 Patch", fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhL1G2PatchMax ->SetXTitle("Index #eta (columnns)"); fhL1G2PatchMax ->SetYTitle("Index #phi (rows)"); fhL1G2PatchMax ->SetZTitle("counts"); fhL1JPatchMax = new TH2F("hL1JPatchMax","FOR of max amplitude patch with associated L1 Jet Patch", fgkFALTROCols/4,0,fgkFALTROCols,fgkFALTRORows/4,0,fgkFALTRORows); fhL1JPatchMax ->SetXTitle("Index #eta (columnns)"); fhL1JPatchMax ->SetYTitle("Index #phi (rows)"); fhL1JPatchMax ->SetZTitle("counts"); fhL1J2PatchMax = new TH2F("hL1JPatchMax","FOR of max amplitude patch with associated L1 Jet2 Patch", fgkFALTROCols/4,0,fgkFALTROCols,fgkFALTRORows/4,0,fgkFALTRORows); fhL1J2PatchMax ->SetXTitle("Index #eta (columnns)"); fhL1J2PatchMax ->SetYTitle("Index #phi (rows)"); fhL1J2PatchMax ->SetZTitle("counts"); fOutputList->Add(fhNEvents); fOutputList->Add(fhV0STU); fOutputList->Add(fhFORAmp); fOutputList->Add(fhFORAmpL1G); fOutputList->Add(fhFORAmpL1G2); fOutputList->Add(fhFORAmpL1J); fOutputList->Add(fhFORAmpL1J2); fOutputList->Add(fhL0Amp); fOutputList->Add(fhL0AmpL1G); fOutputList->Add(fhL0AmpL1J); fOutputList->Add(fhL1Amp); fOutputList->Add(fhL1GAmp); fOutputList->Add(fhL1G2Amp); fOutputList->Add(fhL1JAmp); fOutputList->Add(fhL1J2Amp); fOutputList->Add(fhL1FOREnergy); fOutputList->Add(fhL0Patch); fOutputList->Add(fhL1GPatch); fOutputList->Add(fhL1G2Patch); fOutputList->Add(fhL1GPatchNotFake); fOutputList->Add(fhL1GPatchFake); fOutputList->Add(fhL1GPatchAllFake); fOutputList->Add(fhL1GPatchNotAllFake); fOutputList->Add(fhL1GPatchNotAllFakeMax); fOutputList->Add(fhL1GPatchAllFakeMax); fOutputList->Add(fhL1GPatchNotAllFakeMaxE); fOutputList->Add(fhL1GPatchAllFakeMaxE); fOutputList->Add(fhL1GPatchNotAllFakeE); fOutputList->Add(fhL1GPatchAllFakeE); fOutputList->Add(fhL1GPatchFakeE); fOutputList->Add(fhL1GPatchNotFakeE); fOutputList->Add(fhnpatchFake); fOutputList->Add(fhnpatchNotFake); fOutputList->Add(fhL1JPatch); fOutputList->Add(fhL1J2Patch); fOutputList->Add(fhFEESTU); fOutputList->Add(fhTRUSTU); fOutputList->Add(fhGPMaxVV0TT); fOutputList->Add(fhJPMaxVV0TT); fOutputList->Add(fhFORMeanAmp); fOutputList->Add(fhL0MeanAmp); fOutputList->Add(fhL1MeanAmp); fOutputList->Add(fhL1GPatchMax); fOutputList->Add(fhL1G2PatchMax); fOutputList->Add(fhL1JPatchMax); fOutputList->Add(fhL1J2PatchMax); // Cluster histograms, E TString hName [] = {"MB","L0","L1G","L1G2","L1J","L1J2","L1GOnly","L1JOnly","Central","SemiCentral"}; TString hTitle [] = {"MB trigger","L0 trigger","L1 Gamma trigger","L1 Gamma2 trigger","L1 Jet trigger","L1 Jet2 trigger", "L1 Gamma trigger and not L1 Jet","L1 Jet trigger and not L1 Gamma","Central trigger","SemiCentral trigger"}; for(Int_t i=0; i < 3; i++) { Int_t j = i+5; if(i==0)j=0; fhClusMBPure[i] = new TH1F(Form("hClus%sPure",hName[j].Data()), Form("clusters E distribution for %s, no other EMCAL trigger on",hTitle[j].Data()), fNBinsClusterE,0,fMaxClusterE); fhClusMBPure[i] ->SetXTitle("Energy (GeV)"); fOutputList->Add(fhClusMBPure[i]); fhClusMaxMBPure[i] = new TH1F(Form("hClusMax%sPure",hName[j].Data()), Form("maximum energy cluster per event for %s, no other EMCAL trigger on",hTitle[j].Data()), fNBinsClusterE,0,fMaxClusterE); fhClusMaxMBPure[i] ->SetXTitle("Energy (GeV)"); fOutputList->Add(fhClusMaxMBPure[i]); } for(Int_t i=0; i < 10; i++) { fhV0[i] = new TH1F(Form("hV0%s",hName[i].Data()), Form("V0 distribution for %s",hTitle[i].Data()), fNBinsV0Signal,0,fMaxV0Signal); fhV0[i]->SetXTitle("V0"); fOutputList->Add(fhV0[i] ); fhClus[i] = new TH1F(Form("hClus%s",hName[i].Data()), Form("clusters E distribution for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE); fhClus[i] ->SetXTitle("Energy (GeV)"); fOutputList->Add(fhClus[i]); fhClusMax[i] = new TH1F(Form("hClusMax%s",hName[i].Data()), Form("maximum energy cluster per event for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE); fhClusMax[i]->SetXTitle("Energy (GeV)"); fOutputList->Add(fhClusMax[i]); // Cluster histograms, E vs Cen fhClusCen[i] = new TH2F(Form("hClusCen%s",hName[i].Data()), Form("clusters E distribution vs centrality for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE,100, 0, 100); fhClusCen[i] ->SetXTitle("Energy (GeV)"); fhClusCen[i] ->SetYTitle("Centrality"); fOutputList->Add(fhClusCen[i]); fhClusCenMax[i] = new TH2F(Form("hClusCenMax%s",hName[i].Data()), Form("maximum energy cluster per event vs centrality for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE,100, 0, 100); fhClusCenMax[i]->SetXTitle("Energy (GeV)"); fhClusCenMax[i]->SetYTitle("Centrality"); fOutputList->Add(fhClusCenMax[i]); // Cluster histograms, E vs V0 fhClusV0[i] = new TH2F(Form("hClusV0%s",hName[i].Data()), Form("clusters E distribution vs V0 for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE,fNBinsV0Signal,0,fMaxV0Signal); fhClusV0[i] ->SetXTitle("Energy (GeV)"); fhClusV0[i] ->SetYTitle("V0"); fOutputList->Add(fhClusV0[i]); fhClusV0Max[i] = new TH2F(Form("hClusV0Max%s",hName[i].Data()), Form("maximum energy cluster per event vs V0 for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE,fNBinsV0Signal,0,fMaxV0Signal); fhClusV0Max[i]->SetXTitle("Energy (GeV)"); fhClusV0Max[i]->SetYTitle("V0"); fOutputList->Add(fhClusV0Max[i]); // Cluster histograms, E vs Pseudorapidity Float_t etamin =-0.8; Float_t etamax = 0.8; Int_t neta = 160; fhClusEta[i] = new TH2F(Form("hClusEta%s",hName[i].Data()), Form("clusters distribution vs #eta for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE,neta, etamin, etamax); fhClusEta[i] ->SetXTitle("Energy (GeV)"); fhClusEta[i] ->SetYTitle("#eta"); fOutputList->Add(fhClusEta[i]); fhClusEtaMax[i] = new TH2F(Form("hClusEtaMax%s",hName[i].Data()), Form("maximum energy cluster per event vs #eta for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE,neta, etamin, etamax); fhClusEtaMax[i]->SetXTitle("Energy (GeV)"); fhClusEtaMax[i]->SetYTitle("#eta"); fOutputList->Add(fhClusEtaMax[i]); // Cluster histograms, E vs Azimuthal angle Float_t phimin = 80. *TMath::DegToRad(); Float_t phimax = 190.*TMath::DegToRad(); Int_t nphi = 110; fhClusPhi[i] = new TH2F(Form("hClusPhi%s",hName[i].Data()), Form("clusters distribution vs #phi for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE,nphi, phimin, phimax); fhClusPhi[i] ->SetXTitle("Energy (GeV)"); fhClusPhi[i] ->SetYTitle("#phi (rad)"); fOutputList->Add(fhClusPhi[i]); fhClusPhiMax[i] = new TH2F(Form("hClusPhiMax%s",hName[i].Data()), Form("maximum energy cluster per event vs #phi for %s",hTitle[i].Data()), fNBinsClusterE,0,fMaxClusterE,nphi, phimin, phimax); fhClusPhiMax[i]->SetXTitle("Energy (GeV)"); fhClusPhiMax[i]->SetYTitle("#phi (rad)"); fOutputList->Add(fhClusPhiMax[i]); // Cluster histograms, Pseudorapidity vs Azimuthal angle fhClusEtaPhiHigh[i] = new TH2F(Form("hClusEtaPhiHigh%s",hName[i].Data()), Form("clusters distribution #eta vs #phi for %s, E > 10 GeV",hTitle[i].Data()), neta, etamin, etamax,nphi, phimin, phimax); fhClusEtaPhiHigh[i] ->SetXTitle("#eta"); fhClusEtaPhiHigh[i] ->SetYTitle("#phi (rad)"); fOutputList->Add(fhClusEtaPhiHigh[i]); fhClusEtaPhiHighCluMax[i] = new TH2F(Form("hClusEtaPhiHighCluMax%s",hName[i].Data()), Form("maximum energy cluster per event #eta vs #phi for %s, E > 10 GeV",hTitle[i].Data()), neta, etamin, etamax,nphi, phimin, phimax); fhClusEtaPhiHighCluMax[i]->SetXTitle("#eta"); fhClusEtaPhiHighCluMax[i]->SetYTitle("#phi (rad)"); fOutputList->Add(fhClusEtaPhiHighCluMax[i]); fhClusEtaPhiLow[i] = new TH2F(Form("hClusEtaPhiLow%s",hName[i].Data()), Form("clusters distribution #eta vs #phi for %s, E < 10 GeV",hTitle[i].Data()), neta, etamin, etamax,nphi, phimin, phimax); fhClusEtaPhiLow[i] ->SetXTitle("#eta"); fhClusEtaPhiLow[i] ->SetYTitle("#phi (rad)"); fOutputList->Add(fhClusEtaPhiLow[i]); fhClusEtaPhiLowCluMax[i] = new TH2F(Form("hClusEtaPhiLowCluMax%s",hName[i].Data()), Form("maximum energy cluster per event #eta vs #phi for %s, E < 10 GeV",hTitle[i].Data()), neta, etamin, etamax,nphi, phimin, phimax); fhClusEtaPhiLowCluMax[i]->SetXTitle("#eta"); fhClusEtaPhiLowCluMax[i]->SetYTitle("#phi (rad)"); fOutputList->Add(fhClusEtaPhiLowCluMax[i]); fhClusEtaPhiHighCellMax[i] = new TH2F(Form("hClusEtaPhiHighCellMax%s",hName[i].Data()), Form("Cluster hit map in calorimeter (max cell), column vs row for %s, E > 10 GeV",hTitle[i].Data()), fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhClusEtaPhiHighCellMax[i] ->SetXTitle("Index #eta (columnns)"); fhClusEtaPhiHighCellMax[i] ->SetYTitle("Index #phi (rows)"); fOutputList->Add(fhClusEtaPhiHighCellMax[i]); fhClusEtaPhiHighCellMaxCluMax[i] = new TH2F(Form("hClusEtaPhiHighCellMaxCluMax%s",hName[i].Data()), Form("Max E cluster hit map in calorimeter (max cell), column vs row for %s, E > 10 GeV", hTitle[i].Data()),fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhClusEtaPhiHighCellMaxCluMax[i]->SetXTitle("Index #eta (columnns)"); fhClusEtaPhiHighCellMaxCluMax[i]->SetYTitle("Index #phi (rows)"); fOutputList->Add(fhClusEtaPhiHighCellMaxCluMax[i]); fhClusEtaPhiLowCellMax[i] = new TH2F(Form("hClusEtaPhiLowCellMax%s",hName[i].Data()), Form("Cluster hit map in calorimeter (max cell), column vs row for %s, E < 10 GeV",hTitle[i].Data()), fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhClusEtaPhiLowCellMax[i] ->SetXTitle("Index #eta (columnns)"); fhClusEtaPhiLowCellMax[i] ->SetYTitle("#phi (rad)"); fOutputList->Add(fhClusEtaPhiLowCellMax[i]); fhClusEtaPhiLowCellMaxCluMax[i] = new TH2F(Form("hClusEtaPhiLowCellMaxCluMax%s",hName[i].Data()), Form("Max E cluster hit map in calorimeter (max cell), column vs row for %s, E < 10 GeV", hTitle[i].Data()),fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows); fhClusEtaPhiLowCellMaxCluMax[i]->SetXTitle("Index #eta (columnns)"); fhClusEtaPhiLowCellMaxCluMax[i]->SetYTitle("#phi (rad)"); fOutputList->Add(fhClusEtaPhiLowCellMaxCluMax[i]); } PostData(1, fOutputList); } //______________________________________________________ void AliAnalysisTaskEMCALTriggerQA::UserExec(Option_t *) { // Main loop AliVEvent* event = InputEvent(); //Remove next lines when AODs ready AliESDEvent *esdEvent = dynamic_cast(event); if (!esdEvent) { AliError("Work only with ESDs, not available, exit"); return; } InitGeometry(); // only once, must be done before OADB, geo OADB accessed here if(fAccessOADB) AccessOADB(); // only once //trigger configuration TString triggerclasses = esdEvent->GetFiredTriggerClasses(); Int_t eventType = ((AliVHeader*)InputEvent()->GetHeader())->GetEventType(); // physics events eventType=7, select only those if(triggerclasses=="" || eventType != 7) return; // Check trigger Bool_t bMB = kFALSE; Bool_t bL0 = kFALSE; Bool_t bL1G = kFALSE; Bool_t bL1G2 = kFALSE; Bool_t bL1J = kFALSE; Bool_t bL1J2 = kFALSE; Bool_t bCen = kFALSE; Bool_t bSem = kFALSE; //Min bias event trigger? if((triggerclasses.Contains("CINT") || triggerclasses.Contains("CPBI2_B1") ) && (triggerclasses.Contains("-B-") || triggerclasses.Contains("-I-")) && triggerclasses.Contains("-NOPF-ALLNOTRD") ) bMB = kTRUE; // EMC triggered event? Which type? if( triggerclasses.Contains("-B-") || triggerclasses.Contains("-S-") || triggerclasses.Contains("-I-") ) { if( triggerclasses.Contains("CEMC") && !triggerclasses.Contains("EGA" ) && !triggerclasses.Contains("EJE" ) && !triggerclasses.Contains("EG1" ) && !triggerclasses.Contains("EJ1" ) && !triggerclasses.Contains("EG2" ) && !triggerclasses.Contains("EJ2" ) ) bL0 = kTRUE; if( triggerclasses.Contains("EGA" ) || triggerclasses.Contains("EG1" ) ){ bL1G = kTRUE; } if( triggerclasses.Contains("EG2" ) ){ bL1G2 = kTRUE; } if( triggerclasses.Contains("EJE" ) || triggerclasses.Contains("EJ1" ) ) bL1J = kTRUE; if( triggerclasses.Contains("EJ2" )) bL1J2 = kTRUE; } // Semi/Central PbPb trigger if (triggerclasses.Contains("CCENT_R2-B-NOPF-ALLNOTRD")) bCen = kTRUE; else if(triggerclasses.Contains("CSEMI_R1-B-NOPF-ALLNOTRD")) bSem = kTRUE; // printf("MB : %d; L0 : %d; L1-Gam : %d; L1-Jet : %d; Central : %d; SemiCentral : %d; Trigger Names : %s \n ", // bMB,bL0,bL1G,bL1J,bCen,bSem,triggerclasses.Data()); fhNEvents ->GetXaxis()->SetBinLabel(1 ,"All"); fhNEvents ->GetXaxis()->SetBinLabel(2 ,"MB"); fhNEvents ->GetXaxis()->SetBinLabel(3 ,"Central Pb"); fhNEvents ->GetXaxis()->SetBinLabel(4 ,"SemiCentral Pb"); fhNEvents ->GetXaxis()->SetBinLabel(5 ,"L0"); fhNEvents ->GetXaxis()->SetBinLabel(6 ,"L1-G"); fhNEvents ->GetXaxis()->SetBinLabel(7 ,"L1-G2"); fhNEvents ->GetXaxis()->SetBinLabel(8 ,"L1-J"); fhNEvents ->GetXaxis()->SetBinLabel(9 ,"L1-J2"); fhNEvents ->GetXaxis()->SetBinLabel(10 ,"L1-G & !L1-J"); fhNEvents ->GetXaxis()->SetBinLabel(11 ,"L1-J & !L1-G"); fhNEvents ->GetXaxis()->SetBinLabel(12 ,"L1-J & L1-G"); fhNEvents ->GetXaxis()->SetBinLabel(13 ,"MB & !L1 & !L0"); fhNEvents ->GetXaxis()->SetBinLabel(14,"L0 & !MB"); fhNEvents ->GetXaxis()->SetBinLabel(15,"L1-G & !MB"); fhNEvents ->GetXaxis()->SetBinLabel(16,"L1-J & !MB"); // Fill event histo fhNEvents->Fill(0.5); // All physics events if( bMB ) { fhNEvents->Fill(1.5); if( !bL1G && !bL1J && !bL1G2 && !bL1J2 && !bL0 ) fhNEvents->Fill(12.5); } else { if( bL0 ) fhNEvents->Fill(13.5); if( bL1G ) fhNEvents->Fill(14.5); if( bL1J ) fhNEvents->Fill(15.5); } if( bCen) fhNEvents->Fill(2.5); if( bSem) fhNEvents->Fill(3.5); if( bL0 ) { fhNEvents->Fill(4.5); } if( bL1G ) { fhNEvents->Fill(5.5); if(!bL1J) fhNEvents->Fill(9.5); } if( bL1G2 )fhNEvents->Fill(6.5); if( bL1J2 )fhNEvents->Fill(8.5); if( bL1J ) { fhNEvents->Fill(7.5); if(!bL1G) fhNEvents->Fill(10.5); } if(bL1J && bL1G) fhNEvents->Fill(11.5); //std::cout << "trigger = " << triggerclasses << std::endl; //map for cells and patches Double_t emcalCell [fgkFALTRORows][fgkFALTROCols], emcalCellL1G [fgkFALTRORows][fgkFALTROCols],emcalCellL1G2 [fgkFALTRORows][fgkFALTROCols],emcalCellL1G_ [fgkFALTRORows][fgkFALTROCols]; Double_t emcalCellL1J [fgkFALTRORows][fgkFALTROCols], emcalCellL1J2 [fgkFALTRORows][fgkFALTROCols],emcalTrigL0 [fgkFALTRORows][fgkFALTROCols]; Double_t emcalTrigL0L1G[fgkFALTRORows][fgkFALTROCols], emcalTrigL0L1J[fgkFALTRORows][fgkFALTROCols]; Double_t emcalTrigL1G [fgkFALTRORows][fgkFALTROCols], emcalTrigL1G2 [fgkFALTRORows][fgkFALTROCols],emcalTrigL1J [fgkFALTRORows][fgkFALTROCols], emcalTrigL1J2 [fgkFALTRORows][fgkFALTROCols],emcalTrigL1 [fgkFALTRORows][fgkFALTROCols]; Double_t emcalPatchL0 [fgkFALTRORows][fgkFALTROCols], emcalPatchL1G [fgkFALTRORows][fgkFALTROCols],emcalPatchL1G2[fgkFALTRORows][fgkFALTROCols], emcalPatchL1J[fgkFALTRORows][fgkFALTROCols], emcalPatchL1J2[fgkFALTRORows][fgkFALTROCols]; for (Int_t i = 0; i < fgkFALTRORows; i++) { for (Int_t j = 0; j < fgkFALTROCols; j++) { emcalTrigL0[i][j] = 0.; emcalTrigL0L1G[i][j]= 0.; emcalTrigL0L1J[i][j]= 0.; emcalTrigL1G[i][j] = 0.; emcalTrigL1G2[i][j] = 0.; emcalTrigL1J[i][j] = 0.; emcalTrigL1J2[i][j] = 0.; emcalTrigL1[i][j] = 0.; emcalCell[i][j] = 0.; emcalCellL1G[i][j] = 0.; emcalCellL1G2[i][j] = 0.; emcalCellL1G_[i][j] = 0.; emcalCellL1J[i][j] = 0.; emcalCellL1J2[i][j] = 0.; emcalPatchL0[i][j] = 0.; emcalPatchL1G[i][j] = 0.; emcalPatchL1G2[i][j] = 0.; emcalPatchL1J[i][j] = 0.; emcalPatchL1J2[i][j] = 0.; } } // --------------------------------- // Cells analysis // Fill FEE energy per channel array // --------------------------------- Int_t posX = -1, posY = -1; Int_t nSupMod = -1, ieta = -1, iphi = -1, nModule = -1, nIphi = -1, nIeta = -1; Short_t absId = -1; Int_t nCells = 0; AliVCaloCells& cells= *(event->GetEMCALCells()); if(cells.IsEMCAL()) { for (Int_t icell = 0; icell < cells.GetNumberOfCells(); icell++) { nCells ++; Double_t amp =0., time = 0., efrac = 0; Int_t mclabel = -1; cells.GetCell(icell, absId, amp, time,mclabel,efrac); fGeometry->GetCellIndex(absId, nSupMod, nModule, nIphi, nIeta); fGeometry->GetCellPhiEtaIndexInSModule(nSupMod, nModule, nIphi, nIeta, iphi, ieta); posX = (nSupMod % 2) ? ieta + AliEMCALGeoParams::fgkEMCALCols : ieta; posY = iphi + AliEMCALGeoParams::fgkEMCALRows * int(nSupMod / 2); if(int(posX/2) > fgkFALTROCols || int(posY/2) > fgkFALTRORows ) { if(DebugLevel() > 0) printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Wrong Position (x,y) = (%d,%d)\n",posX,posY); continue; } // ici c'est l'amplitude de chaque cellule emcalCell[int(posY/2)][int(posX/2)] += amp; if(bL1G) { emcalCellL1G[int(posY/2)][int(posX/2)] += amp; //printf("L1G cell[%i,%i] amp=%f\n",int(posY/2),int(posX/2),emcalCellL1G[int(posY/2)][int(posX/2)]); } if(bL1G2){ emcalCellL1G2[int(posY/2)][int(posX/2)] += amp; //printf("L1G2 cell[%i,%i] amp=%f\n",int(posY/2),int(posX/2),emcalCellL1G2[int(posY/2)][int(posX/2)]); } if(bL1J) emcalCellL1J[int(posY/2)][int(posX/2)] += amp; if(bL1J2) emcalCellL1J2[int(posY/2)][int(posX/2)] += amp; //printf("cell[%i,%i] amp=%f\n",int(posY/2),int(posX/2),emcalCell[int(posY/2)][int(posX/2)]); } } //------------------------------------- // Trigger analysis, fill L0, L1 arrays //------------------------------------- AliESDCaloTrigger& trg= * (esdEvent->GetCaloTrigger("EMCAL")); Int_t nL0Patch = 0 ; Int_t nL1Patch = 0 ; Double_t totSTU = 0.; Double_t totTRU = 0.; trg.Reset(); // loop on FASTOR // printf("\n *********** New EVENT ************\n"); int areAllFakes=2; int numberpatchNotFake=0; int numberpatchFake=0; while (trg.Next()) { trg.GetPosition(posX,posY); if (posX > -1 && posY > -1) { //L0 analysis Int_t nTimes = 0; trg.GetNL0Times(nTimes); Int_t l0Times[10]; trg.GetL0Times(l0Times); Float_t ampL0 = 0.; trg.GetAmplitude(ampL0); if (ampL0 > 0) emcalTrigL0[posY][posX] = ampL0; if(triggerclasses.Contains("CEMC7EGA-B-NOPF-CENTNOTRD") || triggerclasses.Contains("CPBI2EGA") || triggerclasses.Contains("CPBI2EG1")) emcalTrigL0L1G[posY][posX] += ampL0; if(triggerclasses.Contains("CEMC7EJE-B-NOPF-CENTNOTRD") || triggerclasses.Contains("CPBI2EJE") || triggerclasses.Contains("CPBI2EJ1")) emcalTrigL0L1J[posY][posX] += ampL0; totTRU += ampL0; int l0fired = 0; for (int itime = 0; itime < nTimes; itime++) { if (l0Times[itime] > 7 && l0Times[itime] < 10) l0fired = 1; } if (l0fired) { nL0Patch += nTimes; emcalPatchL0[posY][posX] = 1.; fhL0Patch->Fill(posX,posY); } //L1 analysis Int_t bit = 0; trg.GetTriggerBits(bit); Int_t ts = 0; trg.GetL1TimeSum(ts); if (ts > 0) emcalTrigL1[posY][posX] = ts; totSTU += ts; // cout << "ts =" <> fBitEGA) & 0x1) { // cout << "(bit >> fBitEGA) & 0x1"<Fill(posX,posY);} if(bL1G2) fhL1G2Patch->Fill(posX,posY); if (ts > 0 && bL1G) {emcalTrigL1G[posY][posX] = ts;} if (ts > 0 && bL1G2) {emcalTrigL1G2[posY][posX] = ts;} } //L1-Jet if (bit >> fBitEJE & 0x1) { nL1Patch ++; emcalPatchL1J[posY][posX] = 1.; if(bL1J) fhL1JPatch->Fill(posX,posY); if(bL1J2) fhL1J2Patch->Fill(posX,posY); if (ts > 0 && bL1J) emcalTrigL1J[posY][posX] = ts; if (ts > 0 && bL1J2) emcalTrigL1J2[posY][posX] = ts; //printf("Jet STU patch %d, time sum %d, posX %d , posY %d\n",nL1Patch,ts,posX, posY); } } } if (!nL0Patch) { bL0 = kFALSE; if (!triggerclasses.Contains("CPBI2")) bL1G = bL1G2 = bL1J = bL1J2 = kFALSE; // pp running } if(totTRU > fMaxTRUSignal && DebugLevel() > 0) printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large totTRU %f\n",totTRU); if(totSTU > fMaxSTUSignal && DebugLevel() > 0) printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large totSTU %f\n",totSTU); //V0 analysis AliESDVZERO* eventV0 = esdEvent->GetVZEROData(); Float_t v0C = 0, v0A = 0, v0TT = trg.GetL1V0(0)+trg.GetL1V0(1); if (eventV0) { for (Int_t i = 0; i < 32; i++) { v0C += eventV0->GetAdcV0C(i); v0A += eventV0->GetAdcV0A(i); } } if (totSTU != 0) { fhV0STU->Fill(v0A+v0C,totSTU); if( v0A+v0C > fMaxV0Signal && DebugLevel() > 0) printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large v0A+v0C %f\n",v0A+v0C); } if( bL1G ) fhV0[kL1GammaTrig] ->Fill(v0A+v0C); if( bL1G2 ) fhV0[kL1GammaTrig2] ->Fill(v0A+v0C); if( bL1J ) fhV0[kL1JetTrig] ->Fill(v0A+v0C); if( bL1J2 ) fhV0[kL1JetTrig2] ->Fill(v0A+v0C); if( bMB ) fhV0[kMBTrig] ->Fill(v0A+v0C); if( bL0 ) fhV0[kL0Trig] ->Fill(v0A+v0C); if( bCen ) fhV0[kCentralTrig] ->Fill(v0A+v0C); if( bSem ) fhV0[kSemiCentralTrig]->Fill(v0A+v0C); if(bL1G && !bL1J) fhV0[kL1GammaOnlyTrig]->Fill(v0A+v0C); if(bL1J && !bL1G) fhV0[kL1JetOnlyTrig] ->Fill(v0A+v0C); //if(nL0Patch!=0 || nL1Patch!=0) printf("total TRU %f, total STU %f, V0C+V0A %f; nL0 %d, nL1 %d \n", // totTRU,totSTU,v0A+v0C,nL0Patch,nL1Patch); if(bL1G) { //cout <<"loop fakes"<0){ for(int irow=0;irow<2;irow++) for(int icol=0;icol<2;icol++) { // loop on cells // printf("cell[%i,%i]=%f\n",posy+icol,posx+irow, emcalCellL1G[posy+icol][posx+irow]); patchEnergy += emcalCellL1G[posy+icol][posx+irow] ; if( emcalCellL1G[posy+icol][posx+irow] >threshold/2) enoughE=kTRUE; } if (patchEnergy > patchMax) { patchMax = patchEnergy; colMax = posx; rowMax = posy; } if(patchEnergy>threshold || (patchEnergy>threshold-3 && enoughE)) { numberpatchNotFake++; fhL1GPatchNotFake->Fill(posx,posy); fhL1GPatchNotFakeE->Fill(patchEnergy); areAllFakes=1; } else { numberpatchFake++; areAllFakes=0; fhL1GPatchFake->Fill(posx,posy); fhL1GPatchFakeE->Fill(patchEnergy); } } } // cout << "qqqqqqqqqqqq areAllFake=" << areAllFakes << " npatchNotFake="<Fill(col,row); double patchEnergy=0; for(int irow=0;irow<2;irow++) for(int icol=0;icol<2;icol++) { patchEnergy += emcalCellL1G[col+icol][row+irow] ; } fhL1GPatchAllFakeE->Fill(patchEnergy); } } // cout << "row max"<0) { // printf("\npatch max [%i,%i] = %f\n",rowMax,colMax,patchMax); fhL1GPatchAllFakeMax->Fill(colMax,rowMax); fhL1GPatchAllFakeMaxE->Fill(patchMax); }} else{ // loop on patches for (Int_t col = 0; col < 47; col++) for (Int_t row = 0; row < 59; row++) { if(emcalTrigL1G[row][col]>0) { fhL1GPatchNotAllFake->Fill(col,row); double patchEnergy=0; for(int irow=0;irow<2;irow++) for(int icol=0;icol<2;icol++) { patchEnergy += emcalCellL1G[col+icol][row+irow] ; } fhL1GPatchNotAllFakeE->Fill(patchEnergy); } } if(emcalTrigL1G[rowMax][colMax]>0) { fhL1GPatchNotAllFakeMax->Fill(colMax,rowMax); fhL1GPatchNotAllFakeMaxE->Fill(patchMax); } } fhGPMaxVV0TT->Fill(v0TT, patchMax); if( bL1G ) fhL1GPatchMax->Fill(colMax,rowMax); if( bL1G2 )fhL1G2PatchMax->Fill(colMax,rowMax); } Double_t patchMax = 0; Int_t colMax = -1; Int_t rowMax = -1; Int_t col,row=0; for (Int_t i = 0; i < 9; i++) { for (Int_t j = 0; j < 12; j++) { Int_t patchJ = 0; col = i; row = j; for (Int_t k = 0; k < 16; k++) { for (Int_t l = 0; l < 16; l++) { patchJ += int(emcalTrigL1[4*j + l][4*i + k]); } } if (patchJ > patchMax) { patchMax = patchJ; colMax = 4*col; rowMax = 4*row; } } } fhJPMaxVV0TT->Fill(v0TT, patchMax); if( bL1J ) fhL1JPatchMax->Fill(colMax,rowMax); if( bL1J2 )fhL1J2PatchMax->Fill(colMax,rowMax); //Matrix with signal per channel for (Int_t i = 0; i < fgkFALTRORows; i++) { for (Int_t j = 0; j < fgkFALTROCols; j++) //check x,y direction for reading FOR ((0,0) = top left); { fhFORAmp ->Fill( j, i, emcalCell [i][j]); fhFORAmpL1G ->Fill( j, i, emcalCellL1G [i][j]); fhFORAmpL1G2->Fill( j, i, emcalCellL1G2 [i][j]); fhFORAmpL1J ->Fill( j, i, emcalCellL1J [i][j]); fhFORAmpL1J2->Fill( j, i, emcalCellL1J2 [i][j]); fhL0Amp ->Fill( j, i, emcalTrigL0 [i][j]); fhL0AmpL1G ->Fill( j, i, emcalTrigL0L1G[i][j]); fhL0AmpL1J ->Fill( j, i, emcalTrigL0L1J[i][j]); fhL1Amp ->Fill( j, i, emcalTrigL1 [i][j]); //if(emcalTrigL1 [i][j]>0) fhL1FOREnergy->Fill(i+fgkFALTRORows*j, emcalTrigL1 [i][j]); fhL1GAmp ->Fill( j, i, emcalTrigL1G [i][j]); fhL1G2Amp ->Fill( j, i, emcalTrigL1G2 [i][j]); fhL1JAmp ->Fill( j, i, emcalTrigL1J [i][j]); fhL1J2Amp ->Fill( j, i, emcalTrigL1J2 [i][j]); fhFORMeanAmp->Fill( j, i, emcalCell [i][j]); fhL0MeanAmp ->Fill( j, i, emcalTrigL0 [i][j]); fhL1MeanAmp ->Fill( j, i, emcalTrigL1 [i][j]); } } //FEE-TRU-STU correlation checks Double_t ampFOR[30] = {0.}, ampL0[30] = {0.}, ampL1[30] = {0.}; for (Int_t i = 0; i < fgkFALTRORows; i++) { for (Int_t j = 0; j < fgkFALTROCols; j++) { //method to get TRU number Int_t idFOR = -1; fGeometry->GetAbsFastORIndexFromPositionInEMCAL(j,i,idFOR); Int_t iTRU = -1; Int_t iADC = -1; fGeometry->GetTRUFromAbsFastORIndex(idFOR,iTRU,iADC); //printf("i %d, j %d, iTRU %d, iADC %d, idFOR %d; cell %f, L0 %f, L1 %f\n", // i,j,iTRU,iADC,idFOR, emcalCell [i][j],emcalTrigL0[i][j],emcalTrigL1[i][j]); if (iTRU >= 0) { ampFOR[iTRU] += emcalCell [i][j]; ampL0[iTRU] += emcalTrigL0[i][j]; ampL1[iTRU] += emcalTrigL1[i][j]; } } } // FEE vs STU and TRU vs STU ratios for (Int_t i = 0; i < 30; i++) { if (ampFOR[i] != 0 && ampL1[i] != 0) { fhFEESTU->Fill(ampL1[i]/ampFOR[i],i); if(ampL1[i]/ampFOR[i] > fMaxSTUFEERatio && DebugLevel() > 0 ) printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large STU/FEE ratio %f\n",ampL1[i]/ampFOR[i]); } if (ampL0[i] != 0 && ampL1[i] != 0) { fhTRUSTU->Fill(ampL1[i]/ampL0[i] ,i); if(ampL1[i]/ampL0[i] > fMaxSTUTRURatio && DebugLevel() > 0 ) printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large STU/TRU ratio %f\n",ampL1[i]/ampL0[i]); } } //Get Vertex Double_t v[3] = {0,0,0}; esdEvent->GetVertex()->GetXYZ(v); //clusters distribution TRefArray* caloClus = new TRefArray(); esdEvent->GetEMCALClusters(caloClus); Int_t nCaloClusters = caloClus->GetEntriesFast(); Float_t emax = 0; Float_t etamax = 0; Float_t phimax = 0; Float_t ietamax=-1; Float_t iphimax=-1; Float_t e = 0; Float_t eta = 0; Float_t phi = 0; TLorentzVector mom; //Get vertex for momentum calculation Double_t vertex[] = {0.0,0.0,0.0}; //InputEvent()->GetPrimaryVertex()->GetXYZ(vertex); Float_t centrality = -1; if(InputEvent()->GetCentrality()) centrality = InputEvent()->GetCentrality()->GetCentralityPercentile("V0M"); for(Int_t icalo = 0; icalo < nCaloClusters; icalo++) { AliESDCaloCluster *clus = (AliESDCaloCluster*) (caloClus->At(icalo)); if(!clus->IsEMCAL()) continue; if(!fRecoUtils->IsGoodCluster(clus,fGeometry,InputEvent()->GetEMCALCells(),InputEvent()->GetBunchCrossNumber())) { continue; } if(clus->GetNCells() < 2) continue ; // Avoid 1 cell clusters, noisy, exotic. clus->GetMomentum(mom, vertex); Bool_t shared = kFALSE; Int_t idAbs = -1, iphi0 = -1, ieta0 = -1; fRecoUtils->GetMaxEnergyCell(fGeometry, InputEvent()->GetEMCALCells(),clus, idAbs,nSupMod,ieta0,iphi0,shared); //Change index to be continuous over SM ieta = (nSupMod % 2) ? ieta0 + AliEMCALGeoParams::fgkEMCALCols : ieta0; iphi = iphi0 + AliEMCALGeoParams::fgkEMCALRows * int(nSupMod / 2); ieta/=2; iphi/=2; if(ieta > fgkFALTROCols || iphi > fgkFALTRORows ) { printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Wrong Position (x,y) = (%d,%d)\n",ieta,iphi); } e = clus->E(); eta = mom.Eta(); phi = mom.Phi(); if(e > emax) { emax = e; etamax = eta; phimax = phi; ietamax = ieta; iphimax = iphi; } // Fill cluster histograms depending on the event trigger selection if(bMB ) FillClusterHistograms(kMBTrig ,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if(bCen) FillClusterHistograms(kCentralTrig ,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if(bSem) FillClusterHistograms(kSemiCentralTrig,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if(bL0 ) FillClusterHistograms(kL0Trig ,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if(bL1G) FillClusterHistograms(kL1GammaTrig ,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if(bL1G2) FillClusterHistograms(kL1GammaTrig2 ,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if(bL1J) FillClusterHistograms(kL1JetTrig ,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if(bL1J2) FillClusterHistograms(kL1JetTrig2 ,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if(bL1G && !bL1J) FillClusterHistograms (kL1GammaOnlyTrig,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if(bL1J && !bL1G) FillClusterHistograms (kL1JetOnlyTrig ,kFALSE,e,eta,phi,ieta,iphi,centrality,v0A+v0C); if( bMB && !bL1G && !bL1J && !bL0 ) fhClusMBPure[0] ->Fill(e); if( bCen && !bL1G && !bL1J && !bL0 ) fhClusMBPure[1] ->Fill(e); if( bSem && !bL1G && !bL1J && !bL0 ) fhClusMBPure[2] ->Fill(e); } // Maximum energy cluster per event histograms if(bMB ) FillClusterHistograms(kMBTrig ,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if(bCen) FillClusterHistograms(kCentralTrig ,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if(bSem) FillClusterHistograms(kSemiCentralTrig,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if(bL0 ) FillClusterHistograms(kL0Trig ,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if(bL1G) FillClusterHistograms(kL1GammaTrig ,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if(bL1G2)FillClusterHistograms(kL1GammaTrig2 ,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if(bL1J) FillClusterHistograms(kL1JetTrig ,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if(bL1J2)FillClusterHistograms(kL1JetTrig2 ,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if(bL1G && !bL1J) FillClusterHistograms (kL1GammaOnlyTrig,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if(bL1J && !bL1G) FillClusterHistograms (kL1JetOnlyTrig ,kTRUE,emax,etamax,phimax,ietamax,iphimax,centrality,v0A+v0C); if( bMB && !bL1G && !bL1J && !bL0 ) fhClusMaxMBPure[0] ->Fill(emax); if( bCen && !bL1G && !bL1J && !bL0 ) fhClusMaxMBPure[1] ->Fill(emax); if( bSem && !bL1G && !bL1J && !bL0 ) fhClusMaxMBPure[2] ->Fill(emax); PostData(1, fOutputList); }