From e727d2f730cb0a89820d03c7080e880899e0a407 Mon Sep 17 00:00:00 2001 From: gconesab Date: Tue, 14 Jul 2009 09:15:47 +0000 Subject: [PATCH] New Calorimeter Calibration directory, now only PHOS AliAnaCalorimeterQA: Correct the pi0 tagging --- PWG4/CMakeLists.txt | 1 + PWG4/CMake_libPWG4CaloCalib.txt | 12 + .../AliAnalysisTaskPHOSPi0CalibSelection.cxx | 270 + .../AliAnalysisTaskPHOSPi0CalibSelection.h | 56 + PWG4/CaloCalib/macros/AnaPHOSPi0Select.C | 82 + PWG4/CaloCalib/macros/PHOS.tgz | Bin 0 -> 22556 bytes PWG4/CaloCalib/macros/Pi0Select.jdl | 57 + PWG4/CaloCalib/macros/README | 38 + PWG4/CaloCalib/macros/addhistoEmc.C | 85 + PWG4/CaloCalib/macros/anaTask.C | 59 + PWG4/CaloCalib/macros/aod.root | Bin 0 -> 212 bytes PWG4/CaloCalib/macros/list.txt | 15 + .../macros/minbias_LHC09a4_81040_81050.xml | 28620 ++++++++++++++++ PWG4/CaloCalib/macros/pi0Calib.C | 121 + PWG4/CaloCalib/macros/pi0Select.sh | 13 + PWG4/PROOF-INF.PWG4CaloCalib/BUILD.sh | 3 + PWG4/PROOF-INF.PWG4CaloCalib/SETUP.C | 13 + PWG4/PWG4CaloCalibLinkDef.h | 9 + PWG4/PartCorrDep/AliAnaCalorimeterQA.cxx | 26 +- PWG4/libPWG4CaloCalib.pkg | 17 + 20 files changed, 29486 insertions(+), 11 deletions(-) create mode 100755 PWG4/CMake_libPWG4CaloCalib.txt create mode 100644 PWG4/CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.cxx create mode 100644 PWG4/CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.h create mode 100644 PWG4/CaloCalib/macros/AnaPHOSPi0Select.C create mode 100644 PWG4/CaloCalib/macros/PHOS.tgz create mode 100644 PWG4/CaloCalib/macros/Pi0Select.jdl create mode 100644 PWG4/CaloCalib/macros/README create mode 100644 PWG4/CaloCalib/macros/addhistoEmc.C create mode 100644 PWG4/CaloCalib/macros/anaTask.C create mode 100644 PWG4/CaloCalib/macros/aod.root create mode 100644 PWG4/CaloCalib/macros/list.txt create mode 100644 PWG4/CaloCalib/macros/minbias_LHC09a4_81040_81050.xml create mode 100644 PWG4/CaloCalib/macros/pi0Calib.C create mode 100644 PWG4/CaloCalib/macros/pi0Select.sh create mode 100755 PWG4/PROOF-INF.PWG4CaloCalib/BUILD.sh create mode 100755 PWG4/PROOF-INF.PWG4CaloCalib/SETUP.C create mode 100644 PWG4/PWG4CaloCalibLinkDef.h create mode 100644 PWG4/libPWG4CaloCalib.pkg diff --git a/PWG4/CMakeLists.txt b/PWG4/CMakeLists.txt index 532630c51d7..10e5f40d0a6 100644 --- a/PWG4/CMakeLists.txt +++ b/PWG4/CMakeLists.txt @@ -11,6 +11,7 @@ ${CMAKE_SOURCE_DIR}/PWG4/PartCorrDep ${CMAKE_SOURCE_DIR}/PWG4/JetTasks ${CMAKE_SOURCE_DIR}/PWG4/GammaConv ${CMAKE_SOURCE_DIR}/PWG4/omega3pi +${CMAKE_SOURCE_DIR}/PWG4/CaloCalib ${CMAKE_SOURCE_DIR}/PHOS ${CMAKE_SOURCE_DIR}/STEER ${CMAKE_SOURCE_DIR}/ANALYSIS diff --git a/PWG4/CMake_libPWG4CaloCalib.txt b/PWG4/CMake_libPWG4CaloCalib.txt new file mode 100755 index 00000000000..6d400024d91 --- /dev/null +++ b/PWG4/CMake_libPWG4CaloCalib.txt @@ -0,0 +1,12 @@ +# -*- mode: cmake -*- + +set(SRCS + CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.cxx +) + +# fill list of header files from list of source files +# by exchanging the file extension +String(REPLACE ".cxx" ".h" HDRS "${SRCS}") + +AddLibrary(PWG4CaloCalib "${SRCS}" "${HDRS}") + diff --git a/PWG4/CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.cxx b/PWG4/CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.cxx new file mode 100644 index 00000000000..08604e769cc --- /dev/null +++ b/PWG4/CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.cxx @@ -0,0 +1,270 @@ +/************************************************************************** + * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * * + * Author: Boris Polishchuk * + * * + * 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 (one per cell) with two-cluster invariant mass // +// using calibration coefficients of the previous iteration. // +// Histogram for a given cell is filled if the most energy of one cluster // +// is deposited in this cell and the other cluster could be anywhere in PHOS.// +// // +//---------------------------------------------------------------------------// + +#include + +// Root +#include "TLorentzVector.h" +#include "TVector3.h" +#include "TGeoManager.h" +#include "TRefArray.h" +#include "TList.h" + +// AliRoot +#include "AliAnalysisTaskPHOSPi0CalibSelection.h" +#include "AliCDBEntry.h" +#include "AliCDBManager.h" +#include "AliAODEvent.h" +#include "AliPHOSPIDv1.h" +#include "AliPHOSAodCluster.h" +#include "AliPHOSGeoUtils.h" +#include "AliPHOSCalibData.h" +#include "AliPHOSReconstructor.h" +#include "AliPHOSPIDv1.h" + + +ClassImp(AliAnalysisTaskPHOSPi0CalibSelection) + +AliAnalysisTaskPHOSPi0CalibSelection::AliAnalysisTaskPHOSPi0CalibSelection() : +AliAnalysisTaskSE(),fOutputContainer(0x0),fRecoParam(0x0),fPhosGeo(0x0),fHmgg(0x0), + fEmin(0.) +{ + //Default constructor. + + for(Int_t iMod=0; iMod<5; iMod++) { + for(Int_t iX=0; iX<64; iX++) { + for(Int_t iZ=0; iZ<56; iZ++) { + fHmpi0[iMod][iX][iZ]=0; + } + } + } + +} + +AliAnalysisTaskPHOSPi0CalibSelection::AliAnalysisTaskPHOSPi0CalibSelection(const char* name) : + AliAnalysisTaskSE(name),fOutputContainer(0x0),fRecoParam(0x0),fPhosGeo(0x0),fHmgg(0x0), + fEmin(0.) +{ + //Named constructor which should be used. + + DefineOutput(1,TList::Class()); + + for(Int_t iMod=0; iMod<5; iMod++) { + for(Int_t iX=0; iX<64; iX++) { + for(Int_t iZ=0; iZ<56; iZ++) { + fHmpi0[iMod][iX][iZ]=0; + } + } + } + +} + +AliAnalysisTaskPHOSPi0CalibSelection::~AliAnalysisTaskPHOSPi0CalibSelection() +{ + //Destructor. + + if(fOutputContainer){ + fOutputContainer->Delete() ; + delete fOutputContainer ; + } +} + +void AliAnalysisTaskPHOSPi0CalibSelection::UserCreateOutputObjects() +{ + //Create output container + fOutputContainer = new TList(); + + char hname[128], htitl[128]; + + for(Int_t iMod=0; iMod<5; iMod++) { + for(Int_t iX=0; iX<64; iX++) { + for(Int_t iZ=0; iZ<56; iZ++) { + sprintf(hname,"%d_%d_%d",iMod,iX,iZ); + sprintf(htitl,"Two-gamma inv. mass for mod %d, cell (%d,%d)",iMod,iX,iZ); + fHmpi0[iMod][iX][iZ] = new TH1F(hname,htitl,100,0.,300.); + fOutputContainer->Add(fHmpi0[iMod][iX][iZ]); + } + } + } + + fHmgg = new TH1F("hmgg","2-cluster invariant mass",100,0.,300.); + fOutputContainer->Add(fHmgg); + +} + +void AliAnalysisTaskPHOSPi0CalibSelection::UserExec(Option_t* /* option */) +{ + //Analysis per event. + + AliAODEvent* aod = 0x0; + if(!strcmp(InputEvent()->GetName(),"AliAODEvent")) aod = dynamic_cast(InputEvent()); + else if(!strcmp(InputEvent()->GetName(),"AliESDEvent")) aod = AODEvent(); + else { + printf("AliAnalysisTaskPHOSPi0CalibSelection: Unknown event type, STOP!\n"); + abort(); + } + + Double_t v[] = {aod->GetVertex(0)->GetX(),aod->GetVertex(0)->GetY(),aod->GetVertex(0)->GetZ()}; //to check!! + //aod->GetVertex()->GetXYZ(v) ; + TVector3 vtx(v); //Check + + printf("Vertex: (%.3f,%.3f,%.3f)\n",vtx.X(),vtx.Y(),vtx.Z()); + + Int_t runNum = aod->GetRunNumber(); + printf("Run number: %d\n",runNum); + + if(!fPhosGeo) { + + AliCDBEntry* entryGeo = AliCDBManager::Instance()->Get("GRP/Geometry/Data",runNum); + if(!entryGeo) AliFatal("No Geometry entry found in OCDB!!"); + + TGeoManager* geoManager = dynamic_cast(entryGeo->GetObject()); + if(!geoManager) AliFatal("No valid TGeoManager object found in the OCDB."); + + gGeoManager = geoManager; + fPhosGeo = AliPHOSGeometry::GetInstance("IHEP") ; + } + + //Calibrations from previous iteration + AliPHOSCalibData calibData(runNum); + + //Get RecoParameters. See AliQADataMakerRec::InitRecoParams(). + if(!fRecoParam) { + + AliCDBEntry* entryRecoPar = AliCDBManager::Instance()->Get("PHOS/Calib/RecoParam",runNum); + if(!entryRecoPar) AliFatal("No RecoParam entry in OCDB!!"); + + TObject * recoParamObj = entryRecoPar->GetObject() ; + AliDetectorRecoParam* rprm = 0; + + if (dynamic_cast(recoParamObj)) { + TObjArray *recoParamArray = dynamic_cast(recoParamObj) ; + for (Int_t iRP=0; iRPGetEntriesFast(); iRP++) { + rprm = dynamic_cast(recoParamArray->At(iRP)) ; + if (rprm->IsDefault()) break; + } + } + + if (dynamic_cast(recoParamObj)) { + dynamic_cast(recoParamObj)->SetAsDefault(); + rprm = dynamic_cast(recoParamObj) ; + } + + if(!rprm) AliFatal("No valid RecoParam object found in the OCDB."); + fRecoParam = dynamic_cast(rprm); + if(!fRecoParam) AliFatal("recoparams are _NOT_ of type AliPHOSRecoParam!!"); + } + + Float_t logWeight = fRecoParam->GetEMCLogWeight(); + printf("Will use logWeight %.3f .\n",logWeight); + + AliPHOSPIDv1 pid; + + Int_t mod1 = -1; + TLorentzVector p1; + TLorentzVector p2; + TLorentzVector p12; + Int_t relid[4] ; + Int_t maxId; + + TRefArray * caloClustersArr = new TRefArray(); + aod->GetPHOSClusters(caloClustersArr); + + const Int_t kNumberOfPhosClusters = caloClustersArr->GetEntries() ; + printf("CaloClusters: %d\n", kNumberOfPhosClusters); + + // PHOS cells + AliAODCaloCells *phsCells = aod->GetPHOSCells(); + + // loop over PHOS clusters + for(Int_t iClu=0; iCluAt(iClu); + if(!c1->IsPHOSCluster()) continue; // EMCAL cluster! + + Float_t e1i = c1->E(); // cluster energy before correction + if(e1iAbsToRelNumbering(maxId, relid); + + mod1 = relid[0]-1; // module + Int_t iX = relid[2]-1; // cluster X-coord + Int_t iZ = relid[3]-1; // cluster Z-coord + Float_t e1ii = clu1.E(); // cluster energy after correction + + for (Int_t jClu=iClu; jCluAt(jClu); + if(!c2->IsPHOSCluster()) continue; // EMCAL cluster! + if(c2->IsEqual(c1)) continue; + + Float_t e2i = c2->E(); + if(e2iFill(p12.M()*1000); + fHmpi0[mod1][iX][iZ]->Fill(p12.M()*1000); + + printf("Mass in (mod%d,%d,%d): %.3f GeV E1_i=%f E1_ii=%f E2_i=%f E2_ii=%f\n", + mod1,iX,iZ,p12.M(),e1i,e1ii,e2i,e2ii); + } + + } // end of loop over PHOS clusters + + delete caloClustersArr; + PostData(1,fOutputContainer); +} + +void AliAnalysisTaskPHOSPi0CalibSelection::MaxEnergyCellPos(AliAODCaloCells *cells, AliAODCaloCluster* clu, Int_t& maxId) +{ + //For a given CaloCluster calculates the absId of the cell + //with maximum energy deposit. + + Double_t eMax = -111; + + for (Int_t iDig=0; iDig< clu->GetNCells(); iDig++) { + Int_t cellAbsId = clu->GetCellAbsId(iDig); + Double_t eCell = cells->GetCellAmplitude(cellAbsId)*clu->GetCellAmplitudeFraction(iDig); + if(eCell>eMax) { + eMax = eCell; + maxId = cellAbsId; + } + } + +} diff --git a/PWG4/CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.h b/PWG4/CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.h new file mode 100644 index 00000000000..600eabc8181 --- /dev/null +++ b/PWG4/CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.h @@ -0,0 +1,56 @@ +#ifndef ALIANALYSISTASKPHOSPI0CALIBSELECTION_H +#define ALIANALYSISTASKPHOSPI0CALIBSELECTION_H + +/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * See cxx source for full Copyright notice */ + +//---------------------------------------------------------------------------// +// Fill histograms with two-cluster invariant mass // +// using calibration coefficients of the previous iteration. // +//---------------------------------------------------------------------------// + + +#include "AliAnalysisTaskSE.h" +#include "AliPHOSRecoParam.h" +#include "AliPHOSGeometry.h" +#include "AliAODCaloCluster.h" +#include "AliAODCaloCells.h" +#include "TH1.h" + +class AliAnalysisTaskPHOSPi0CalibSelection : public AliAnalysisTaskSE +{ +public: + + AliAnalysisTaskPHOSPi0CalibSelection(); + AliAnalysisTaskPHOSPi0CalibSelection(const char* name); + virtual ~AliAnalysisTaskPHOSPi0CalibSelection(); + + // Implementation of interface methods + virtual void UserCreateOutputObjects(); + virtual void UserExec(Option_t * opt); + + void SetClusterMinEnergy(Float_t emin) {fEmin=emin;} + +private: + + AliAnalysisTaskPHOSPi0CalibSelection(const AliAnalysisTaskPHOSPi0CalibSelection&); + AliAnalysisTaskPHOSPi0CalibSelection& operator=(const AliAnalysisTaskPHOSPi0CalibSelection&); + + void MaxEnergyCellPos(AliAODCaloCells *cells, AliAODCaloCluster* clu, Int_t& maxId); + +private: + + TList* fOutputContainer; + TH1F* fHmpi0[5][64][56];// two-cluster inv. mass assigned to each cell. + + AliPHOSRecoParam* fRecoParam; // RecoParameters. + AliPHOSGeometry * fPhosGeo; // PHOS geometry + + TH1F* fHmgg; //two-cluster inv.mass + Float_t fEmin; // min. cluster energy + + ClassDef(AliAnalysisTaskPHOSPi0CalibSelection,1); + +}; + +#endif //ALIANALYSISTASKPHOSPI0CALIBSELECTION_H diff --git a/PWG4/CaloCalib/macros/AnaPHOSPi0Select.C b/PWG4/CaloCalib/macros/AnaPHOSPi0Select.C new file mode 100644 index 00000000000..7ad74e0a54a --- /dev/null +++ b/PWG4/CaloCalib/macros/AnaPHOSPi0Select.C @@ -0,0 +1,82 @@ +void AnaPi0Select(const char* dataset="minbias_LHC09a4_81040_81050.xml") +{ + + gSystem->Load("libTree.so"); + gSystem->Load("libGeom.so"); + gSystem->Load("libVMC.so"); + gSystem->Load("libPhysics.so"); + + //load analysis framework + gSystem->Load("libANALYSIS"); + gSystem->Load("libANALYSISalice"); //AliAnalysisTaskSE + gSystem->Load("libPWG4CaloCalib"); + + //Set local DB for PHOS + gROOT->ProcessLine(".! tar xzvf PHOS.tgz") ; + AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB"); + AliCDBManager::Instance()->SetSpecificStorage("PHOS/*","local://./"); + + // Connect to alien + TString token = gSystem->Getenv("GRID_TOKEN") ; + if ( token == "OK" ) + TGrid::Connect("alien://"); + else + AliInfo("You are not connected to the GRID") ; + + // Create the chain + TChain* chain = new TChain("esdTree"); + TGridCollection * collection = dynamic_cast(TAlienCollection::Open(dataset)); + + TAlienResult* result = collection->GetGridResult("",0 ,0); + TList* rawFileList = result->GetFileInfoList(); + + for (Int_t counter=0 ; counter < rawFileList->GetEntries() ; counter++) { + TFileInfo * fi = static_cast(rawFileList->At(counter)) ; + const char * rawFile = fi->GetCurrentUrl()->GetUrl() ; + printf("Processing %s\n", rawFile) ; + chain->Add(rawFile); + printf("Chain: %d entries.\n",chain->GetEntries()); + } + + // Make the analysis manager + AliAnalysisManager *mgr = new AliAnalysisManager("PHOSPi0CalibSelect","PHOSPi0CalibSelection"); + + // ESD input handler + AliESDInputHandler* esdH = new AliESDInputHandler(); + mgr->SetInputEventHandler(esdH); + + //Output event handler + AliAODHandler* aodoutHandler = new AliAODHandler(); + aodoutHandler->SetOutputFileName("aod.root"); + //aodoutHandler->SetCreateNonStandardAOD(); + mgr->SetOutputEventHandler(aodoutHandler); + + // Debug level + mgr->SetDebugLevel(10); + + // ESD filter task + // + gROOT->LoadMacro("$ALICE_ROOT/PWG4/macros/AddTaskESDfilter.C"); + AliAnalysisTaskESDfilter *esdfilter = AddTaskESDfilter(kFALSE); + + // Calibration task + // + AliAnalysisTaskPHOSPi0CalibSelection *task = new AliAnalysisTaskPHOSPi0CalibSelection("PHOSPi0CalibSelection"); + task->SetClusterMinEnergy(0.4); + + // Create containers for input/output + AliAnalysisDataContainer *cinput = mgr->GetCommonInputContainer(); + AliAnalysisDataContainer *coutput2 = mgr->CreateContainer("histos",TList::Class(),AliAnalysisManager::kOutputContainer,"PHOShistos.root"); + + // Connect to data containers + mgr->ConnectInput (task, 0, cinput); + mgr->ConnectOutput(task, 1, coutput2); + + if (mgr->InitAnalysis()) { + mgr->PrintStatus(); + mgr->StartAnalysis("local", chain); + } + +} + + diff --git a/PWG4/CaloCalib/macros/PHOS.tgz b/PWG4/CaloCalib/macros/PHOS.tgz new file mode 100644 index 0000000000000000000000000000000000000000..7b30a075e9c6b6aa4dfaa6458c8a6e3c68080391 GIT binary patch literal 22556 zcmbTcb8se3&@i~s#!fcb*tY$|+}O6cv7ZYnZ)jDYzu*>o-S1L9H#mQTeRmvAgz<0Lxc`~gVST>GjYN{*Jo7s8WD(1}q>A z64cA9{${`5A4nVk|SoX_{HOPebn;+aqbw|X|k<=KC zJ!e8A1K)(u*!%xCH0C#E{GwrMJH{~%%Q6c#o!ZZY4=bPIPZ~!c(2r8Ka z?M#94e_VeOnlq7uSec0Vd_Xb6e@B4RyAiLTi2U8gw@@%it`uPO|H4vz>UT3wAiO@T z7f=rhk}nkKhu`7-4D6pV5W*jrhP7|>FJ!P_*<-?=flf~VIfL;x{lsJSDUh#`>?N$B zlRV3A;aErl)~+bTVp(OGKQ(UNn@hrMPWq!c&h1TBWp+JirZ?#J@c_t{jtlzxb72=0 z^MQ0h^n8*7iZ1&E_@%Rf;6=bKszE0(9HT;eHY+kDv9|{8HPG2-c7`y-m7&may8%V4 zK1@OT!XpcPY&@7Tdd!GO9TVOUbDkB(9tk%(#7VhEuGS!v@oxYGyl^od2%rh_ zH&bi<%0b_)2EDo&TYcTsFv7f*f5udR93lU67xxG_3z!AQRVKz>fVhAB3MNv(jMNC-n*(gZXUp#ah}St+uSwn)Ub2L?8OD|}wU_XJCT54O+#J-y?A zj|F^;b1nM{L_AGmPay5f5$_S-^b>_~2Db-dlG&O5j3N}4Hx}U!tWkIt+__&T5?KDK zy@7=sH{q{(d4U3-s>wVzyxTDrNLX7XdVX_QX5G6p%mSpWRl59q51H(ocsbx1wJRVB zB*X~Hx*AwmDQywi`~&IC>8a}doUm@SCeTGmj(h|zt8mRTd~wW!L^9Cjntp1&ZNo>! z)Lp|zPSg+$Og8k}?n;P}{9Un^NSbuIEivJX+S1)ljrnmY4sm?mrk?;QOiRcwReARq zq-r?Ym|H9+1@Uc*xEFe3@W>{SqfhoG$sGmt*yF96tI!403cind{A+VRN7+3$7+!ug zMnCfCZJU1Y*QQZ=u-h7@U);R2;F9K?^oQg3sdi>gsC=IC33-)T*po0E{fGP3ado!p z6n``&ykmv)c5Vjjw(oaGymsSnQsi{`j!Feg5Y|8n51AKG? zZZafE@3~0Yd~h>yKF)u!#9bKQ?t3`{2OYZm)A+SXR^IXDw^q?kI6=#Fyifd zX(Xr7LCMZw`%?F#+w8Sd`i%uh+5pR$a{VDv&PZE#M789I)^?@-0O~lGQEQ4|cey); zM374$A_@{m*PT{depp#{v>JmM;$I2toO-k*(M|6`DlSeI_j=VKv}#0vxBIv)2TBUI zbPT4gBLk5QdsarPZX;cSpMJPz+x~ePFTKeCeT$8wT(u=e+nU`)GRv#AkP!aOuhQIq zzhk=Vpu_06PJUeJNp4$eMje?L|5hyEd&69rP2=an=%4HpOy50U;?sM0cU-B@uB=vl zm>j4k%`Lfm9NzEuQKKfdo^@@JSL_4u6Y8|Ip7mA`dAS@A5#|g>K>seHI0d^XM_pR+ z9*S)8Z8kBuFufWf#XPb7JizrTU%6i++MgEFRg62a3rv`(K_rS9uk zMw{huUnzvU%JcaMZf`ldq#r`8R%p-f znYl$UXwK6KeX);!C8uti(sik6`s{?(ROfWIj%8wQJ`YPLQw{`6+e6%vyORJ(Ap=5t-@7cOt@}A=6fIwWm26EEVUtYNFy}nF>Qn(HJ>K%jNS@Ejg5C3o`=yQr8jkPf z_c3&&;6XQZPaf5WNCaxYN|kQmV+FXXtxx6cJwxhulDw%i!S{*Zo)hphuaB<>9my*G zt4!@YbYMWDY9}lr8VZ`HtS} zraEu$7$P5@NMzQZIWj>R4H%X`IZMz%MN~ z#2_B?GoS%-9v^?0Hs{6v8!cFVcG_qnn-|%xq>3O|?)A6Bo854I-i9*mQvT(+?HXUN z$#eRc{nmc=xn&9V(|5*$^8@?*+q>rG%CVvAq2+FErm8!uLS%y1rjc{>%C5#&V%XKP zierhqj>9@1{&R??Ix}zrkKTOJ#Xu~#7W1_6Y4zIR+`;2FCA1S78SozO#IptXOQo1 zBqJcXIo{yea-}-gIG61QbeFqKo~&X+OKu#wXZ;|5Hb3PK!B<9_;is6(z@nIsb7_^5W<3H^{gtXsKt{MSXPuu{ ze^%tG@{pOeQH0|dF5fTlWyHFE#3Y`7-z?ziez}Bh6)%Gn@~8j>jvTn5^N{${t5nVE zskVjvg;%TNs$x%9H{xKgUALqB1L8n@hCoB0IdPjFfajv$HtfF*CzD*Z!??J2^~X-% zU$L_=p3pd{N1ceLQqu764KWn!O(!8n;J~LRG~`I~Ia2P9&9#jYr9mYI`j^+gu|IvQ z1ye0@%#@C(_P$iCIo8LH&J}=rVk+CT?vtX9;mPN0>l+~hK>9f z*d>pA$*ngCIt3DfK=N#GP@tV1P;Y8ePsaBP@Eru8#ICyjS(j7+l{Sf$sksA@J`1wi zz5puyK|TT7-+jL&k@r>6u72Nm-DZFw5d z&jea-7%er$s_dU|vIP*Hd2Negy?&Q5w(R~|pxI{F)x}@D^f5krv4{I#O!ftw%qZ5+ zieQ;p7^y(xr@)Q4^>kZl25q3QF0K?({aNil>9Ty8EV9C-WzUlox5JWW)2_+QcHL$b z0Fj%zV5l@2t(5&D`Pyvl~ZiyWme1n&;uh?cZfU-sL&q`Om%IuTu4* z;C&uf@e~PhA5^>{lee~RF@Dx->qS%WiPK?>P)8dQw>|E@%SG09z8G!1^!F|gPt}|w zX8gk^DJanT**?uCp%3u-%Kva`4v`TbMJqJR?HaDW@TW;=STcn5sbsGIAUoee?PObP zDHx`wQLkx2F>|$7lN#U7m0OAN6KI+m$13_K%58LdhYh!d#bSjLY=05Qs<7u~m!l0n5`kY`JMu5{IX zru#sQ&C~UMXXt;)L;rut18JeCezNCEcC*fE{74n~ z3#_}~!U;?|)_oLDJe-DEeTyPy%|upM%VCH~qr3YHP!p3Noi}(MYsLI$pS8=pq2#tvEo#>Su~MlSS@%ol)QWK`qL%e z6D!?H4^dAvTAK+nnxGwEzS7r$4`?zE#r^U3NXu$P{poBmQ@@Vr2!=tGm8+W(P};ty zP?a|?7{F=iOv^3*9^Uufuh>0&qBhe1d3kebr#QxsOwaGVUTgft{^n~h&OnU1v~l7CxGjkt~*5yBTb z;rP?@CmhbgAU?W{k;y|yelwLt4F&guWevgC8I=xG>|=S$+S=Yq7}?*@QJHmEc>_i- z<%;DYv*8tJLOP~p60>kfx)46L)oz4<=OGK^%%u(GPA=s^mGSQKMtxJeS=k_EbKQaV zfjW+ciz-@MVdYJ&iKi8nio_mUOH0_*5?arjo=aV573Ga)MAbzFNYpqQ={OSNBpQ56 z5_~9Bv~(DyLK$?Sa;Tzkj3S!c{9K|gc(^bk+49myJ&evqw5w(m2)ZeUmdMVOP1khi2qS1m+n&k zijqoMes|gn%RJexv4P3T$$c=hht4#k%QZeJ^r`N3tv0Gy{ne!PWi@$FPf1BF-z2W; zXj^g}m8>}HOqGDbg3er(Rl0PNmME8UD{q1EyG!P(@^FJPt2}@uZbFv@XR%`&o%*r_ zbH=q`!L}b*-Cz%HSC}JAOI$>{<(-?QH11x_y17;h2Hq`lsl$|0Luj(G%8{RIDo9u+ z=Q!5EyaI0pfLC0axoUUp!YV*FA*9N=U;%{I@=0z}OJU9G)D+4=xslv0z7eGNo({gt~=6qnLkIaDk*a}QU3Y*7In1SO}0dh-Z=TMcA4CC%SFnpXR)HhYgZ%Cm+leBxbDj-p+xCO;3aw`K3v zPG&5fbACyghDqaj^W?{(SIl)#($+dm97RYpG{K*UQeJ*QTKQ+iFntwR3{}9?ISCZui3(v zT>XP!s4HveCUW7<#f83EFZjOYZ%N#+Hhem`xrS2fz<9VWd~A9d-CS`}zx61-mzus$ z939yDOr5(8Zsp62K`wUll`OeI`#w?Igpu6+(I8xS3*~dr@2gDz65P6B zAsa#;Q#ZJkLm5Gz4!jww_LV-SF%4C=iN4vyuKk<|dDKUNgu4X}!vFZf$_0Tx>i6ye zK|fA={04wmV6#B5cSb=F)M?NEL-qTL7hCaJWH2Mh)KY)(gmvyHAN;NCm;qJAc9vLe8yTjv^4$ehk(p*LUmL&-%1i z_#Y1dy;|RIkSAeS)CeK01o(H1d*Axqh%TjuO(XCS^pOQZM+*mk2kt>#e1PocJzr*q zJ%G<cs~Gxx0+nKS1k*NU56DS)l(hm-a@e0osEGpo7>SPAEHb)atfBL0zDmaZd1E zP$<@q?;em%<^QsF>3x&t-S$j_z`+H-51?8fKwnOMFFOmco>xhG@*W@@p*;)YNK~AE z{@Az!iYSq=2-J}1Y#eB!sW@pwQJfBGAlRE7)&E=9^$W=Di4Ytr_{Uoe^8Xt7^aBlO zQl3sN0)K!a2tWUP0-e4>gGhIGmViwEk>I=EfjW?eZVa&x0fM`ONh9C6j2{4=?rRXy zCAfd{^$%1k(Fi(soa@ub+ye4HtIrP~09WHA2F^Gw&tsyPo@)?SpS`W|%#DG$C1kI8qhH9+T(7)V2s!WbX1UB@IYXRr(;NJqh2%59b*i zdDDlDMww%*E(6*6;;&NB z`x^=Uyy8ofC|;HV&5i4F-nacVko$qv9WWjvXE2e)!umY3Vh|6h8$+(hq@&*qYM zvlQX}qc=yBu=>KW#s=#zs(zI0^=rA6yEVCv6r(SEkIVk*mBUsfr>)7Tjk46%)dEz{ zXnTq>TJN)f;0Sr#qBs7u-jI@TvQKGmEa^sT`bKsVRe9FL?>**iKt3Ncv!@zCMCB7T&=4 zw~eeehV$BlnQ?)NYP81V4x#w^95;3SUcU+0yK%~8=yA*#kwg=#v=8tP_3e@mTc5e7 z)%6njXPJ(i!cQvl{rZ-+c1ViO0Shw$_T9+4&=V2rWu%dO1-SX`k$i+`ve~T;i&WOi z*3ZZ3RFfxcO&6cU$S;C+*LRJTThBb64zsiJI2FBDJbR##_m zc(?)&p%;xVqjni1EI0f|{}8r;zIIP~Y~j*UA^{9 zA6l?1G*@}Wt+7CWRYpaWLlhalpE?%jDvkWhZ7{r{$qc*Ltk9OF(NFR5reaMvTOeL$ zx{C`V{h$aOP}1)7btm;4a}Tr(#K&FIuko5Y#8woD{Y9ljYI9B@0AoDh~KQ5_e>@)hkoY zEEHh>g#rbP-!mxxY2v0Ju6-JNEb!`pd%tv9w`#h%J``PZLYqgz+jOZKDVpVDd=e`@ z*z&~P`ovxWAXy;@C1BWd%uW=OnMdgSHMTcEJ8S)6$~=A+=i(OG zHN;9>WS&e;fW$DDc%^~I8Yj=dE{UXsatYT{=@Gx{2G&talXA{3tr>3&&&}BVFE`K%SI;(u6j>qzzII3YBTbV&xs`OsjbQQwwHK!hu)!WLIRvB zF3ZM_>b4vTH+gze2NR(e&0JPBWlN&3 z7^eDlw|=l+TeFAMNZ~M`er?sSLqzmO@NITZv1tqht^_x69!ZxA)2)QtE-k6Hz(Z7_ ztG?sLb0t_2hf)pY24oqeKBQ*dCq3w`NErs!DgX0?dsau6OL733;u)4PmlHkvwBnF` zO?@43;O?#&0Y52`Uuz{sE5|t?m3=Ucsm+qZac%F^<5~MxLjWB+9Ak@3oc&X(UFjcr z5goc9L`X3aGu)AU)uM3E7*{FO;5ja=8vY zm6m^DzhLvod}v$4Q#Lm?(lhjt!b*PR^ooexYKGTY8XjrSDK4fUI#GrJq?k4cz1^HhS~(#y1NikVDUEK0 zdE?^aSVOKz|8S%|7-bpGAIunHCBAs*o}g#-M+@Kf=+!|BIUIqC^p0SMaa9<25=^uq zFx?29GOGao=gCefzo7=#N9y-;^t?sNQx8J}!48KzZ7EfGp~lil!nQG>dE{ro`jL(o zHtTAoz~8C$pPNY=ti^*~8#nAWFQiv#pNM2YE4l{Y+ z=_#t&_+^f2T5^i!zhA6o5aV!*qI_w*-otC=PeUXC?4PO%&07YA8L=9p!L`T;;v`^L zc@g9{jz)di+qVz0BPul%Z(E-3TDCcb2Dy{1p+O^2xC2+a)Jpc-qEgWx^+qPYRG$eG z#Iz~Ad?ZY5Lj#(ZHrBPL$pJcth<}>5M;3R=DqThB8U5=jxD3n@56f4#BKM%`D)(fx z!ef%Cx6GYakD|F<#}o*hbga%1upY>t8oUpBydV=Yu#fGZ!cqWZL3%TFdT9ac&{i@N zO4V&PYYTNK^p$kZ5^OJcUHee6ymZlU(rABs5nUm53vkD0i5fFC#HI406dRRbc@mfP zw~vzt*asJQxwu;YbQF3^@fAKU)2DY8Q@W| zX|T&PWm-=yBB{oS zGt-7qn>TTpczkQ)Fqkz;bBzsdY#fy2yG&9Mlf%VBF07!GCDa>IHt^1WxIQ<7=(bvzZ|?EkCdYmB5)IyX$LE03 zHr$ZIWNC_ocrR)O;0NCqPqu0FK$(wf1jbgWg}LO+h7h1igd`UJJeb{h(sB_`&V5r7 z5N!NgYYchBH9omQ^Os^wlEOQ|zD1P)OcCL&&}+DHqpev8spaTH+wTXM1V!66X> zJ97J`!RWAsTVI;|%{`&ih27JioKZmPW{luYj`4O+1>!lL)`^u2zTqbYNN{-2(50cX z%DzdDhq(pgdAx%*vgaO>TPY>U2&+sZi_cXkNcW#TA+!&A7U+10r8#-^HXlnn#vth) zn9bHK-8UnJUb!sB#i{q2u{+WO`fh)=#>71VqDTsYf(dQ-0y&ZB#u`w+&5wF^9sEFj z&_BMRcY*&e(+S}S2v2BZHB~!pZ~eO8%Y9pSH6Qj26h^BeU1z<`elRxoR2L3 zlkNRKvhN>21FA!}cOZ5x2$@l12Lx8n{SjQ_w!qi{AOfBpfZc?;)T(_SO#iowhn^p` z-vh|YF`%03@3lw}1OgbS;|cUd7zNk`-Odbay~Xgpgy!4O1`fHbhC(3+- zs)F*Q)rKb-o}G~u0z3QnTg9im2cXiZ>hphH{v_OW$OYl*{dfg@Hq=poLRnuzWtacw z0fJRY2-?vF^%*!|Ja)Vz!&ZWB18TkiCxRMFJkr>Z!fKU#u0MR{K;}M6pa(*5e@QQO z0?Su{h2_EnZg~f4cBb8uCr~bRrSAx`R-ZGn$({OFPk)LWrFhAoOF2yq-s)<+s6XBG zJe4hs>rB-Vg2$dA3r zy=exG4IHFngG2W7W!db;io(L;$CAy!q)q6euVzJ)r}(l(q4b;QQ0f-jgJ<%HKs+Xy z@Z@8Z`}s>%frv;pc0HQ&n=7+BvukPIt6U#S(3$sj#v3PtJai>q1fAK_Cm%?X5K*ss zdYeTxQMRvs5g@>C#nD|mYjnk}tiM5Dt5dqu?LA~fJu#J3USVtbXW6OMr_-wGJz9+wOCF95BhqJi8&^{DC`-+n`uTviLgxC0@NRz|qKv*p?p&N$q$DloN9eiC8o{oAZGBj2}e z<nhB+Do2fABGkp01g~IES0kF?2CXx@Dj;!^BoseSYQjOOYOP zAi87hD@d`db&ufJswU^_ER3{a4jYA2v+b`$Bn|db;;cdajmHCZ+GT@$7Y!;;e~#!& z;aj76<==J03ZA$K#*o3KmX26ap#tA(7(uBf`j{=l-E7u>GqnI3Ph>g%c!oqB^FL;dej(If3T{d7|;fpx&}3i8_CHGp?eB?8W*c z$*5iqOpD^QUC64112fL?=Toet<6m;D9)+YJsQ6JMS`KbGNP>;Yf?N^=uCIBmA6S29 z;TR0u@zXV1qN-F+8JVofrmC}DGwR#wakw3Kq2hRBt;$9k2(+`VC~RZ+{fRh_B8JF< zH6a?g=evGijZ2$Un;7H{wWQ19=EDh5KRpPBb3!ACnpcli@nswYVCoqJ&SUcI`it-+ zYx&j%2OYO&I0KTx<(*T#Dcty53_v?2pM$NxSI5_k`)fI~lB5SbH%f$*>{GRZYO~99 zl#kI`84)Fi{@7s0du>eWBCj)}znD9W=XvCa(+~)XP|AIY2Di__s`hc`*#4a0&MC)E zI%K^I|L4FXPuu9VUxX}V>W=B^qRe#f!^T(KU9*Dg2;UKVIN8)Zq zFhRHi6+6^DxXh>f-wJBWT|o(MZ~BkP6iSHAPnGvOp9a_w^C6pnYdbu?k2|ulLCfWe zE>P4HwTXExk}SLz;-(V=6$Bjd*+IGSLZ^I{;ZEC8nRoK2j}QGyA=T0j%s>0}|LUWV zWL=GnRhHPtv8ZIO*gkJhi@fK&w!UySk}|@gY>012i8n>& z5~!pyZ|-$vfbxbf*og+J?J2@~*!x^H^ut zkM|m$6>&BeOkK8Hn3U#NM;07Qf4>Y@$&yUC4Ha@C|4F5)>~q9+VA6EHX7YqYFC}wn z>Mk}(%8UPnpfEpm8O?mwj}0r#sg=$=8_aM3DjzQj*vCs0mdWH{Ht)a(7N9Gut@71E zx6IQ-kjx^ic&sw5VxwzHQo?-wHADsFl51Jd|Ime{n;R}rL2~ilStvDFM~uDBK{yf8UsHCFhj@e= z5fVYnI%XVficCDsC#o~z(T+e$l7LzVlvW%z`1M~SmKNm*__J#PO7s0x z?fJ8a6M+$tr2H~BN*Ezgo{{EuE1nmR=BPMzc$xJLu7yp|<6qeLZohprk(?MXQYEL` z_<^mLn);hyp<-|xJJ!Zt@Ynu7q`c6^L7GL*>-IS9sigU~23a%nFO?&ebVKA7kzZ8_ z&;->7w``ix@YlgnleuEImneohzZq_(1w>0fha2ZXy9)9q3pV!kEa2h4RcD-!kwmQt z<~s`vOKVoTT5#_b)Z`kv(8@^>I}t`<+3|`P4P}RKdk3I-i1i$FHR7&3Tw%zttOpR* z*|+Clho@i%{;bPn|DRQ8qcZ`45s92;qd+#kQGQ10SgzQ^AquQRe`p)?-z=7Iw;eCo z+5i?=;Dk<@9g){QEWs|}FtMVwz-Q{~;oz!xE}^D#v9&>O31Jrtn=lVE<~1YZYl zGzN4B1#g5nFEJ5nr)fox0@0$7F~7G3`7#sf&W|}yl*&Nn-+%{D8ffOT1p1L)rI^w| z@F(-IQ86E@$sUNr*#FRlkp^96u6Iq#=Z~cT@kHI@YiOSEzrVirF{mX3Bf{aNvgWGb zx;M)!suVvn{?hggF2l*4?O0WO z&&fjQ%Z6FJI6@q(Sk~VrAKun%no8UMB)2@;bmOs$`}TL{#`aOZL;{Q4janV8D?F&UG3TkwXobD7kDIQ zW~-^fq^U0FG_u88KN`+I@7Kf|#{z%QHqM;`9H(}n@*B#|q@!sCrUoueKNAaMQ3RZ{E zJ^a@ljo6uf(q8~Gd}Z#z-juldd7f4b8#8>`%Yawx?x&vG{}j&{d~dUB6|oF!@ySyR zx{r$PfPM>h?$Lr9WvB1l{OH*;E^|S|aKwU}#T~{xMAl>rAM=27foN3f-CyLkfHXON zuRG&Mdo?H}12b73kqqjze?iErDp^j40h5y12p#y8uG-N5P$DN%LlMNcdbTmo;|jUe znq>YN{-g(&yYkT|W9eo@cANO2P^BbACK)A3MVx?2R3Rq;i){~XDZ)c$9TsU}{9GTj z>SYvijzTVEf<{tHiEQc=ojz}YJ{vd@(7u6EHAx%-32x9UJWMA!LQEG?lZsDKc<218 zq^b}mp(p_PGJN&h!ryn*b>H`3Q05N)cnX~$%YDY{W<>qS{0=l^j5URenSBBhNjox( zaapGoiIzTEq?M#(&`C;p4yD|Ub#!+caPfBEM5X6%w2j-9N;sJ+ham8{GXKJHVoQ;@ zE34V*;QGp4y9?9y*Q%gP>2A-cjN9KDVT|oDaV%4Yo!F}7xOPj8d&UU(Tm?bQT^t1 z${^QRQ%_r)N$Xny7l%rD!N$DoR7u@-c^rPjrRB^TNv%<|Mx_g~UB~%rTKQ@hdiDLr zyIlSYgmPTu(8N8nCraWdNZYSU4&ZYP2KB2qEqM;549MzP{H|8!z160~{ce{@P7gq?Qx7ev-aDniqikIheS60he?vP+_bkCM}|-)7J1;!ZV>WSwK@Llj@yl%8wwl(8R#`ntXGQJ7? zKF$JvKin+)m$Db9byVXCJRr@ zs_bP=;bD}R()m*p&e38t(|{+7M{1`LRT2KRkn8z)S_78TE$({>Eh$5D+#a*_w5ZCb z=%NgKR>D#4icx=VL@-(gl1p*wXs(BR3CxWlH-Ju^#a-V#MXz;~}M_u&twIuoJs*m%+A037r?T~eM`4C1NT zr2rrRpy>VXD)T2(ZL!>{EJJ>OdUG4kix4zW5NMt8f&urC0joErLFJ)y2_{Zf$0>WD zRpzxovy!F#etuaf_gqr<<`!nx)p*eQ^bq0zAEPQ`>u7!`dDMvb=#PIW*MrGeQ<}v~SCL zU*$ybf5lktI#IKn22I6ZSR9_3Hv1Z~73AZIei)@u^e$zyCIk zm0jNzlO#j{&*c$*`$fl{CRbL9TQHvS8k_NuUGCHqg+iDv`bNjq_=WfMf_Rd zEB9~WPjPTM>f^t66x}yd>7tnUsYxpI8g(p%Vq7lHd(PhzZ-&KH^^M~j9n0OE$@_gX zjmY7&oijgF#=@gtV+WhZQnk@V>u1Ip6 zm-Wf@M!UsY>S6ok>h0~;Bl7RG(=^B<`vH{m1_X_W!KanItdfGloZdD>Iv z(j3;XzPOzV#q=&a5GQSTINl*%s8Lh6pY;59!4+3nmM3sLqt;hk-Arr#@pKfQ9ZPbq zyyu=!lESadghFiyz-MU~TA{gj*iCWNK`ynV!=heS0OCa;CGJC_Grb8HW{US4)NV|2 zLQa%|UW%>8WL8LPcG`9qQed|nh60T|t%461#;8!cp!c@bCBwT&JTi<`b^az!IBp6dQ#MucAt$2T33@OZe(-s9I+yTv z8J>~|0q?Xz4MKDo^Ije-)aHHLL4*MWdQPiOU}JsxY))+7F0JntqNiv>h*)`vW@WUH zHLwxVta~TR%KU2ZN5{2z@=bYBusyy|4{vigUZGv%c;zsejHs3GaQ`99yo8o_Ape*? z2i(<8RgGmlN-XUI72nK?G)$av?e`DSD{QpC}5K5s1Oa=Zo zKsB}m{~xuOYXW)PO||>YI@|IwvxSM{%_F{wEZ;vF;i5tyzEe=&yT8t`Un?(-ah^wr zm~wJJNS8AxvPM8k?GHji2v+xRPH;X@26KAAmt_%=@2TSLLNg#>9sJomtk?hqAb3R>6c-LU{_ARq|NdXt4uQdw()YHN zY8Hhp@p%?K4~P&Hx_f>$K?A!H)eSDXgpm`agq3)gNb7lZd;^w99RuR_4+TlS{ca={ zOdbdWUxz_~#Bm1StioJWi)<)l3Sd1oT=ZjV7Sx2YIlBT?)BE%i&I6KXslEG~99FBXjn1CPRA#9$Wf7!q3? zM_v^5FE*L;_RFRcJX#ve*QTr`EVd4~|3dJA#a57Ek288O`v5UBBsgA_pC-y46JH;= zq4;2`aTqp9q~M_J0e01GG}@zJ#5(!#8ZiFN-tfdABIobk%uM>@JMu^SH|5Vj$Q57+ z3^c=WPa{PK=%wJr*D_t|6Z#s&BCgyFnu!1@XkdJ1ydpwZQ+rC-Bg==gl=Y+pF zikp3ibIt)PzSSVUl=rE4N!v19KCVt5;-QT2_kMrs6`zbb$ zy)YdL=l>1LVac?RTi#I%T{a6qQ6aMXQvtdVqYw&&6oMGgy64lBnBNJam7a zB%BQY&s*a2nW9oLmM8VWTf%oXY2Cy0;sXLj8dqk1+9|sF%x_;9D*fj#p-nYgS5*7a%(ZXkx}U{cSJaL7N>2md=$-ka z(7|!!s!X=X0>?@D z`K9j;1~Yn-hDtm%+&CYSy&mRQ1H*zH2D;t%tp}r}Z{Y!+KYuGez58Em=hB2M1n&grL?fOySkxLb5@}RFtjcYa8eW3-{z12(61V}AS;b`iL_ zJMuvoW5N`d(VvR7j!o=zg2mYQsZiyU8P+cv{k%E+LHszhCIW32!TKve6FfVH!Mtw5;Cl{@wUzIuk(W-o(J5PqKm89JEhsq`aDpa|}EwwWC-1 z-1;0mPb7JECrnY-gKNX#a{p5`5#K?}A+B?}Qi>4R&M9i-Q+?NVqQ<`x$7R1_L1Nv0 z=9z66`+o&U7q{qkM{i82t3y&tqeYOkNt3-p85wKDuY@`jy{Z3+zp`-94OP#^P_O7Q z^|5_-H3SlC2(BLmto`ESx1RHkk55_tb{J2_;k72ND0UH}tPZ1&VdEs5b)6UOb1!dO z!FQ_z*)k|e5phWqlG?UlXl49XJ;Pg)8^@|e6y%Q>u#0l0n75$A{qQ!?c8(p@EGnAo zeL8YZB$d{!>orUZA=Jg)ZEI_r@RMKGqP1?cXanbpy+I4+m885Bx|`baHt@i@hzZ5t zCQ?ow=wp8;rKRysDsgl}ueDr>;nTKFRyd|x4cD69S1L&awcCW9NN8I<|KSVkT?enU zcV-H`vQKS3%k;J#{vcb)Abf3rgBkPM#7x2?uI8mp0rF!ko0oF!e-e68`t{X$4~G&o zd5G#`_KvDR;3|FL{!r1r#%Sps z1@U?LSo=&n&)$)HhLM(Q( z-X&W2U>8g36QzUl#jc9Yrf)i>E_|%bY7FSUw~!=bvS>%jPQ9C3l0=&i6@SVDURj#{ zBA%bq{(Qs2XFACrB)kRD&-V>S+g{5yy{`23eGEVGj+S|nD5BTkid|Q7(F1aNG`8&S z<(BNH9ECS47V~2j3=7_6$!ZI)UmBFn7Q&YGVqBO1T$S_HdxCn(K?ZC-3JC)lmn~CL z>*OpwAC9;@QoFT_#C@WZ_eh)32(e5in>^5{Eaon@WnHNM9UmpxOEGaQk@l==UAx4B z)rn(*ZA2dx`jwWRi2R2i!JY*9lIHspul95&Xxdk8x+6u;Oa7z7boc7#cbK-PmMNqu zPvP^QA5I0He*A~Qfcy`}XeLu(x}x9XpH}=w{X&8Gj}Zd#ABg`z{0HJc5dVSr55#{U z{sZyfuN?oW;7OG2L~|n5C!R$Dbc*pG7LKK5e#2<|ADkKnfcTFA`aAp276Ceq`2REi ziGd*y!2XQTr1qZ$0(2(#f8ZEke@19Z_WwZ&VA}Raz|b&Ye}-sE_W!{wpqbbo4%UB$ zXv*{d2i(Ewum4yq2IPM+M3dTo76?$fwf~O)gd@J;zd`;NV>CJcDLrHO@;^q?j}f4V z+35seK)=?c^M4iy(3!0N!2e^6reXgXX8=#O{(sAVqG2eo{xd{?|NONz>HMDs0(7$Z z{}=ox3J&r=7@}F_KmXI=n;HR%qoI{>v@QZB1INf95t1kjb&y~Tp$H@rjfL7fI8tov z{<#1s)(j7mMxmu~(pUlxhrq(k%n5ir(wzFLG#-OSPyG=83H;|@%>P*+KqtNaf5U%b z5pZz*XNUm*`D<(P`+q-9fX*cT1NVO!qiNXxC&hno7z~a5CjLXC!TQe#ea`P(#0;GTRtX;WX0jAL8ZhPjU&uH;4dxhXkIq?$ z{nz=wno{O?C;XSpm+w|*pW@v-$ZT&9!b0mez3&i6JngJNzU2Dya8Gtp=ue1Y#(UEL z|5MhGDP)pd->a+;Pdu|5)2r$`lo|y{UW>-kg{&X#)(bOngdcRm=LPV0D%7cZLT+Rq zG`zuKeaz}ih#RNA@X?arEHy$CHf|n{da3lN>0OxC9W#N{yCTMCK9| zz{F(*nhb5`^`Uv^&0%Ke6;bepFoDK28ue-i@2B!Uo%i22;;-85HJO|L4;c*qV~vAR z0&6#qE@JIcC!FpZ9`9=(swv8^8ZcROcFf$)%j93+s1Rs_8fJUH#%UKWkKp{MKwo-b9ZU= zER>5(k?P)-y9?{={7B!jr+-h)gH1xNoI~zII&!lYWs?__xO}4Ti#-71GH^ ze+-%id5N;n$J^xvq{v}4z1o%jmNgHyMXHDM2D|XfUJMOeQ%@OFRm^@{E@PDJ+SKGM z?0t0p_9`f^NInaNog;w%@X>W_tGSnYFmrJ4zTu!8vmcqGS$r|*g}!fSds@$#cOOS4 zQk@&#%R2AysYJmqIQPVQI`Slk@OV;mZ^*Y83b(w9uZ`oEJNjx+f$yw`%2L@A%a%DR z9tgj6$0N5mhdI;agy2@e)Z?SMY2w^_V%x^xy>r$_YUm~HFF9bYHC>8?_-rvM{`L%Ld)(4buv({IaKURCM zDweIhxHwCcBlXJaVWU+~wvwvsjr+W-bV@T9Ng^uDqD!CD>-x7?E}SSQpSoRU`6O?5 z5wfF0JsK(B;ZZu|BVOOMX=`gIuS(mc3jCugVvn%vhE==SonuA_G0#?TX<=7upAgs1 zVb<2842qzb^%OPyby|HAc*Cr>*VVtS9DaJN>*k6sgV5n)iNn2_3)a;}!eKXm7 zSof##G6yX8f6cjWNl1Btdi(9ud|N}xY{J6Q#YH{!^HW}r$JqLbw7MmoZY`=S4)YTe z+Mf?y9<;DiVnEF}d&`SVr{f>Q7p1jS?>TVJKy(p5{~DKqC44(E?uV|i;#rAg-e=di z2BgVH#n?}08ZBJCdj(f(l7Nj4tn0e(zuG(VXsG)=jt|)rvSf*dY(th|tb?)+W0@Mu zpp5L2ElaYCM=^-U7N&)?$i769LMD+x_B9lR$WDxu%XIH^yZ4X#JazALpYDBruXE;{ z&pC5u=KK5pzGpt)&-?fOe!qfqxO&-pMo$fg%J#P65bY*Yk|!#g{6OuvqTbvY#THH^ zAw5~C0O@fI{L2mDGocHTADLR9BulmCr(peR zk1_@w;!4xClNY#b2as%{HUrPYE?o6+>vtj|iqeW|4e=;nZ1Yl_II*d$ON1F6agey1 zjWgrg9*1#rtpPN8mGN!4shids6AP}Ima z@tCT;kaC8(VA7v6GBJHNUnlJSToRGV=P00rf?1xr&Hb|Q{r%W5*hH-(PXg(PvIOZ! z?$~mPz^a^UHwQ%l5AqX*5IXMhT3NUD>(P-zF@2WZDNbPV{X^x19zR#}sVj|;W!AS5 z+AbTf-cdJG56Ku@^!y;%80#1QN*BjGjTT-g@@*yL8M#Nt`F>1$xh6CW^PKqh`;V7n8FQy6n8pJ|-J z>b@I*Gis+v^xd?nYBv_VG=J!!&-{v!l@#R!6ooq<;CmDCIqH0X+6T-PxodZY3eQ=j zcF(QbEAP^v&Q=}bG&9nr#IP3M`e?i#Ndv9mD%a$>-psm^!tk)Gc`<9cDje&(enVb8 z>=XH@vwHFSSBF7ok5r$^Qx7UcZ`#WeLWW>Lu@(%x1>s#$H7-5vXKT<3N-|+PN1f#- z)s{DdYYKQ(CIf7(;L!VQGWg8qt5XC`j*_q#v01QFU&PZZEjDAWqo*BX`C?q zOxy+jnKm)_an@3gYwP*}p?!m@{+*?-Eyvg}pQ{LzZ%j;=g)!J6N`Le+AHs70&R~K_ z{Y(-64xB@-@5n1m{$8nWS9rfH*!YiEmgM64n=3?eflgjm@>Me{e#d4~>_`LuKZl+H z{K9YYfBc(Efxbikl>z*p{~f;N-$3R&cYq*2ar$A&ybMN*TXPMoO&x5|`zb${&f9Vak)6@!xf;va{vUv60ku*-{ zn>F>neg6kKa=J=V7TEqVzkk+$O}{LI{96x8+wTlV?=Rk?GcHhRDd}%YT7Mm;zt6XV zsCTYm`?Yfog*!b2`b7(7QUA3LqJ6d957Yq&^5?%~dNKEK+Uh1OArx!WCRO}wt;;qq{|fr}9j94HjI7<(q;}#_xAOf(SB7cFV_#?XjVI70 zhyO5g(w{91?{Vb^wBPRvERf-!bt9ku;kWQl8`e$Bv(Wqi0|5yBJi!(sE6zUw6}n_W zgw#?R;E{ECv~r4+d*eqFlwixua32TnhpnTsE%IwnIY9s{b-<7auv zLWlEdNZn5xZdnSL?Zy=j1Za?uOgli8Kk&d0(erS=M__oPrIOw;YUZL+``6y}1vCmSbg zhhmY9C3!298YxI*dK*5dAO9E)NqA`6A-Rf(jhhkake6+*$Jnor0Fo=khfaz&kWdNI{VeK40Cr;u4mHFgS>rO8{G zP!m0(Z6@qfzgwadVwj!4mOUc6>!>+9+60as5<;K#Sk|*h%1d-4x}HI%p1(C{TEVFb zRWoM`EP@1L*wsXR1MjPd4o`QQwo6#l?@@0*1EEdgC)rVXTJ%Kt9x#;!i=<@zd_T&N*KUDYR~0H*V(kbw(jhwP#10^d>7w;E&%6#w zWviXLAsl_OltxbM(qwRA^eg-QCz|WtA;A|ZyO1Hh#v>UUdI6I+;elf+D{GmJ7_ZX| z`R)Z5weCn2oYQmpxsx^Df}d|mz-n){;4J~C>QJ+!GvSQoKKgjR#e&hqQXAc17_<-3 z@5jf<$!YyVVR`op2(|&l2n|y-p-#$kUJraP)D-dicNAZJAyk$${vt6vC!4j~XJb(d zRfyu}qgz8k#RMZ1bC9l39Gn{!Jg|pnZ|oR7X03psk>mLl zWy~I|O5>v}y8vY;#nWd4q=)a#*A;c0EFW`tW#ZV!hq>XBaiE$M#V#nJ;%*<+LNQ0D z%q`*HBtT1XqN?UVNy59bI7t;}pKu8-+(kLB46BmYIET{?c2*+Rf(`KECXJ)4a<~zc z9*e`P=jPMFI-&yOhKr7Ke1kK&C`Y(kdNHqqd!Du3r09||2Hy%+^)2AwAOjfp3Io*<{gBQW zSU7Wv>*3s??uSi!;7``;87V<`+HBHV=$v{_s&)!ChyEGp$nCb7k+}n|_ zWJS}0exF3)Ga7hllbK@Kd#q53TLi6RIe%9wclP;O;DLx3hrs)=Hv9)f!NHuAkH*Yt zj5a*APd$~MIbGLdxN0$cvCT={Z zRf2iA?tr*G#0yH(wy%57y^BK5v~g(*&dK39u`#t*+rWqCR4ZAi4kG#9Y=KBky-QKn z{bg*b!-eqvW;iJeqXmDQS{&VOm%1*NJ@T}&GiLc2oLeNc0a9b#OXBf%B7j)gq!O;L zTKQkzjKOTBSwwzh9|*qC<0(z?sD;FI!%s5gwo5*0i_&(FycW3%CM)LToJX$hx9i|v zr0CzN3MY#a-&{?Tg$=T9{#9dVfA_{x>Get("histos"); + + for(Int_t iList=0; iListGetEntries(); iList++) { + hadd = (TH1F*)hlist->At(iList); + const char* str = hadd->GetName(); + int md,X,Z; + if (sscanf(str,"%d_%d_%d",&md,&X,&Z)) { + hst[md][X][Z]->Add(hadd); + //printf("Added hst[%d][%d][%d]\n",md,X,Z); + } + else { + printf("Trying to add histogram %s to hmgg.\n",hadd->GetName()); + hmgg->Add(hadd); + } + } + + printf("Deleting list..\n"); + hlist->Delete(); + printf("OK!\n"); + ifile++; + + printf("File %s processed.\n",fpath); + if(f) delete f; + } + + printf("%d processed.\n",ifile); + + TFile outfile(newname,"recreate"); + + for(Int_t iMod=0; iMod<5; iMod++) { + for(Int_t iX=0; iX<64; iX++) { + for(Int_t iZ=0; iZ<56; iZ++) { + if(hst[iMod][iX][iZ]->GetEntries()) hst[iMod][iX][iZ]->Print(); + hst[iMod][iX][iZ]->Write(); + } + } + } + + hmgg->Write(); + outfile.Close(); +} diff --git a/PWG4/CaloCalib/macros/anaTask.C b/PWG4/CaloCalib/macros/anaTask.C new file mode 100644 index 00000000000..408a58defbe --- /dev/null +++ b/PWG4/CaloCalib/macros/anaTask.C @@ -0,0 +1,59 @@ +void anaTask() +{ + + AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB"); + AliCDBManager::Instance()->SetSpecificStorage("PHOS/*","local://./"); + + // load analysis framework + gSystem->Load("libANALYSIS"); + gSystem->Load("libANALYSISalice"); //AliAnalysisTaskSE + gSystem->Load("libPWG4CaloCalib"); + + gROOT->LoadMacro("$ALICE_ROOT/PWG0/CreateESDChain.C"); + TChain* chain = CreateESDChain("list.txt", 15); + + // for includes use either global setting in $HOME/.rootrc + // ACLiC.IncludePaths: -I$ALICE_ROOT/include + // or in each macro + // gSystem->AddIncludePath("$ALICE_ROOT/include"); + + // Create the analysis manager + AliAnalysisManager *mgr = new AliAnalysisManager("PHOSPi0Calib"); + + //Input event handler + AliVEventHandler* esdH = new AliESDInputHandler(); + mgr->SetInputEventHandler(esdH); + + //Output event handler + AliAODHandler* aodoutHandler = new AliAODHandler(); + aodoutHandler->SetOutputFileName("aod.root"); + mgr->SetOutputEventHandler(aodoutHandler); + + // ESD filter task + gROOT->LoadMacro("$ALICE_ROOT/PWG4/macros/AddTaskESDfilter.C"); + AliAnalysisTaskESDfilter *esdfilter = AddTaskESDfilter(kFALSE); + + // Calibration task + // + AliAnalysisTaskPHOSPi0CalibSelection *task = new AliAnalysisTaskPHOSPi0CalibSelection("PHOSPi0CalibSelection"); + task->SetClusterMinEnergy(0.4); + mgr->AddTask(task); + + // Create containers for input/output + AliAnalysisDataContainer *cinput = mgr->GetCommonInputContainer(); + AliAnalysisDataContainer *coutput2 = mgr->CreateContainer("histos", TList::Class(), AliAnalysisManager::kOutputContainer, "PHOShistos.root"); + + // Connect input/output + mgr->ConnectInput (task, 0, cinput); + mgr->ConnectOutput(task, 1, coutput2); + + // Enable debug printouts + //mgr->SetDebugLevel(10); + + if (!mgr->InitAnalysis()) + return; + + mgr->PrintStatus(); + + mgr->StartAnalysis("local", chain); +} diff --git a/PWG4/CaloCalib/macros/aod.root b/PWG4/CaloCalib/macros/aod.root new file mode 100644 index 0000000000000000000000000000000000000000..d9b9d9d747f7a6815f984c9b49b9452e917e2f2a GIT binary patch literal 212 zcmXTQ&o5zMIOEH}z>osOSAZA>7=a8E79as)Kmen0f%Bf6Ucr0Q#TSL2JGk#XOo9+y zzyLDH&GOQZi40m`13|Viu!gv0=A?2Y=BMZtfgFNhF|dNvg4ILJHUUy#Jzy?ghX4Ra CQYQld literal 0 HcmV?d00001 diff --git a/PWG4/CaloCalib/macros/list.txt b/PWG4/CaloCalib/macros/list.txt new file mode 100644 index 00000000000..dec8a98cb3f --- /dev/null +++ b/PWG4/CaloCalib/macros/list.txt @@ -0,0 +1,15 @@ +/Users/Gustavo/Work/data/BJ/72_86GeV/0/AliESDs.root +/Users/Gustavo/Work/data/BJ/72_86GeV/3/AliESDs.root +/Users/Gustavo/Work/data/GJ/50_60GeV/1/AliESDs.root +/Users/Gustavo/Work/data/GJ/50_60GeV/4/AliESDs.root +/Users/Gustavo/Work/data/JJ/72_86GeV/2/AliESDs.root +/Users/Gustavo/Work/data/BJ/72_86GeV/1/AliESDs.root +/Users/Gustavo/Work/data/BJ/72_86GeV/4/AliESDs.root +/Users/Gustavo/Work/data/GJ/50_60GeV/2/AliESDs.root +/Users/Gustavo/Work/data/JJ/72_86GeV/0/AliESDs.root +/Users/Gustavo/Work/data/JJ/72_86GeV/3/AliESDs.root +/Users/Gustavo/Work/data/BJ/72_86GeV/2/AliESDs.root +/Users/Gustavo/Work/data/GJ/50_60GeV/0/AliESDs.root +/Users/Gustavo/Work/data/GJ/50_60GeV/3/AliESDs.root +/Users/Gustavo/Work/data/JJ/72_86GeV/1/AliESDs.root +/Users/Gustavo/Work/data/JJ/72_86GeV/4/AliESDs.root diff --git a/PWG4/CaloCalib/macros/minbias_LHC09a4_81040_81050.xml b/PWG4/CaloCalib/macros/minbias_LHC09a4_81040_81050.xml new file mode 100644 index 00000000000..3adf3df7750 --- /dev/null +++ b/PWG4/CaloCalib/macros/minbias_LHC09a4_81040_81050.xml @@ -0,0 +1,28620 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PWG4/CaloCalib/macros/pi0Calib.C b/PWG4/CaloCalib/macros/pi0Calib.C new file mode 100644 index 00000000000..68119279526 --- /dev/null +++ b/PWG4/CaloCalib/macros/pi0Calib.C @@ -0,0 +1,121 @@ +Double_t rpol2(Double_t *x, Double_t *par) +{ + Double_t rp2 = par[0] + par[1]*x[0] + par[2]*x[0]*x[0]; + return rp2; +} + +TF1* InitPol2() +{ + TF1* f1 = new TF1("rpol2",rpol2,0.,300.,3); + f1->SetParNames("p0","p1","p2"); + + f1->SetParameter("p0",1.); + f1->SetParameter("p1",1.); + f1->SetParameter("p2",1.); + + return f1; +} + +Double_t gausPol2(Double_t *x, Double_t *par) +{ + //gaus+second order polynomial. + + Double_t gp2 = par[0] * TMath::Exp( -(x[0]-par[1])*(x[0]-par[1]) / + (2*par[2]*par[2]) ) / + + par[3] + par[4]*x[0] + par[5]*x[0]*x[0]; + + return gp2; +} + + + +void pi0Calib(const char* file="Sum_All_Emc.root") +{ + + AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT"); + AliCDBManager::Instance()->SetSpecificStorage("PHOS/*","local://./"); + + AliPHOSCalibData cdb(0); + + Int_t fMinEntr = 50; // min 50 pi0 canditates per cell + Double_t xmin = 100; // fit range lower end + Double_t xmax = 170; // fit range upper end + + const Float_t pi0m = 134.98; + Double_t pi0f; + const Int_t fMod=2; + char hname[128]; + TH1F* h1=0; + Double_t cc_i, cc_ii; + + TH1F* hPi0Mass = new TH1F("pi0_mass","#pi^{0} mass in calibrated cells",100,0.,300.); + + TFile f(file); + + for(Int_t iMod=0; iMod<5; iMod++) { + for(Int_t iX=0; iX<64; iX++) { + for(Int_t iZ=0; iZ<56; iZ++) { + + sprintf(hname,"%d_%d_%d",iMod,iX,iZ); + h1 = (TH1F*)f.Get(hname); + if(!h1) continue; + if(h1->GetEntries()SetRange(180,260); +// rp2->SetRange(50.,110.); + h1->Fit(rp2,"RNQ"); + rp2->Print(); + + h1->GetXaxis()->SetRange(17,210); + Double_t max = h1->GetBinCenter(h1->GetMaximumBin()); // peak + + TF1* f1 = new TF1("gpol2",gausPol2,xmin,xmax,6); + f1->SetParNames("Constant","Mean","Sigma","p0","p1","p2"); + + printf("Trying to fit %s, %d entries, peak at %.3f\n", + h1->GetName(),h1->GetEntries(),max); + + f1->SetParameter("Constant",h1->GetMaximum()); + f1->SetParameter("Mean",max); + f1->SetParameter("Sigma",1.); + f1->SetParameter("p0",rp2->GetParameter("p0")); + f1->SetParameter("p1",rp2->GetParameter("p1")); + f1->SetParameter("p2",rp2->GetParameter("p2")); + + f1->SetLineColor(kBlue); + h1->Fit(f1,"R+"); + + pi0f = f1->GetParameter("Mean"); + hPi0Mass->Fill(pi0f); + + //CC from the previous iteration. + cc_i = cdb.GetADCchannelEmc(iMod+1,iZ+1,iX+1); + + if(pi0f>100. && pi0f<200.) { + Double_t k = pi0m/pi0f; + cc_ii = cc_i*(1+k**2)/2.; + cdb.SetADCchannelEmc(iMod+1,iZ+1,iX+1,cc_ii); + } + + printf("%s: %d entries, mean=%.3f, peak=%.3f, rms= %.3f. pi0 = %.3f, + cc_i=%f, cc_ii=%f\n", + h1->GetName(),h1->GetEntries(),h1->GetMean(),max,h1->GetRMS(), + pi0f,cc_i,cc_ii); + + } + } + } + + TFile ff("pi0Calib.root","recreate"); + hPi0Mass->Write(); + + //Writing new calibration coefficients (CCs) to OCDB + + AliCDBMetaData *md= new AliCDBMetaData(); + md->SetResponsible("Boris Polishchuk"); + + cdb.WriteEmc(0,999999,md); + cdb.WriteCpv(0,999999,md); + +} diff --git a/PWG4/CaloCalib/macros/pi0Select.sh b/PWG4/CaloCalib/macros/pi0Select.sh new file mode 100644 index 00000000000..4ef2ca3f06b --- /dev/null +++ b/PWG4/CaloCalib/macros/pi0Select.sh @@ -0,0 +1,13 @@ +#!/bin/bash +export GCLIENT_SERVER_LIST="pcapiserv04.cern.ch:10000|pcapiserv05.cern.ch:10000|pcapiserv06.cern.ch:10000|pcapiserv07.cern.ch:10000" +export GRID_TOKEN=OK +echo =========================== +echo $PATH +echo $ROOTSYS +echo $LD_LIBRARY_PATH +echo $GRID_TOKEN +echo ========================== + +aliroot -b -q AnaPi0Select.C +echo "######################## Train finished ###########################" + diff --git a/PWG4/PROOF-INF.PWG4CaloCalib/BUILD.sh b/PWG4/PROOF-INF.PWG4CaloCalib/BUILD.sh new file mode 100755 index 00000000000..fc9490a6c2d --- /dev/null +++ b/PWG4/PROOF-INF.PWG4CaloCalib/BUILD.sh @@ -0,0 +1,3 @@ +#! /bin/sh + +make diff --git a/PWG4/PROOF-INF.PWG4CaloCalib/SETUP.C b/PWG4/PROOF-INF.PWG4CaloCalib/SETUP.C new file mode 100755 index 00000000000..b08351e4aaf --- /dev/null +++ b/PWG4/PROOF-INF.PWG4CaloCalib/SETUP.C @@ -0,0 +1,13 @@ +void SETUP() +{ + + // Load the ESD library + gSystem->Load("libPWG4CaloCalib"); + + // Set the Include paths + gSystem->SetIncludePath("-I$ROOTSYS/include -IPWG4CaloCalib"); + gROOT->ProcessLine(".include PWG4CaloCalib/CaloCalib"); + + // Set our location, so that other packages can find us + gSystem->Setenv("PWG4CaloCalib_INCLUDE", "PWG4CaloCalib/CaloCalib"); +} diff --git a/PWG4/PWG4CaloCalibLinkDef.h b/PWG4/PWG4CaloCalibLinkDef.h new file mode 100644 index 00000000000..474b464c1a8 --- /dev/null +++ b/PWG4/PWG4CaloCalibLinkDef.h @@ -0,0 +1,9 @@ +#ifdef __CINT__ + +#pragma link off all globals; +#pragma link off all classes; +#pragma link off all functions; + +#pragma link C++ class AliAnalysisTaskPHOSPi0CalibSelection+; + +#endif diff --git a/PWG4/PartCorrDep/AliAnaCalorimeterQA.cxx b/PWG4/PartCorrDep/AliAnaCalorimeterQA.cxx index 54c73fdcacb..bf298f0f099 100755 --- a/PWG4/PartCorrDep/AliAnaCalorimeterQA.cxx +++ b/PWG4/PartCorrDep/AliAnaCalorimeterQA.cxx @@ -927,7 +927,7 @@ void AliAnaCalorimeterQA::MakeAnalysisFillHistograms() continue ; } - //cout<<"LABEL > "<Particle(label); Int_t pdg = primary->GetPdgCode(); @@ -940,18 +940,16 @@ void AliAnaCalorimeterQA::MakeAnalysisFillHistograms() fhEMR ->Fill(e,r); } - // printf("reco e %f, pt %f, phi %f, eta %f \n", e, pt, phi, eta); - // printf("prim e %f, pt %f, phi %f, eta %f \n", primary->Energy(),primary->Pt() ,primary->Phi() ,primary->Eta() ); - // printf("vertex: vx %f, vy %f, vz %f, r %f \n", vx, vy, vz, r); + //printf("reco e %f, pt %f, phi %f, eta %f \n", e, pt, phi, eta); + //printf("prim e %f, pt %f, phi %f, eta %f \n", primary->Energy(),primary->Pt() ,primary->Phi() ,primary->Eta() ); + //printf("vertex: vx %f, vy %f, vz %f, r %f \n", vx, vy, vz, r); //Get final particle, no conversion products Int_t status = primary->GetStatusCode(); Int_t mother= primary->GetFirstMother(); - Int_t finallabel = -1; if(status == 0){ while(mother >= 0){ primary = GetMCStack()->Particle(mother); - finallabel = mother; status = primary->GetStatusCode(); mother= primary->GetFirstMother(); if(status == 1) break; @@ -974,7 +972,7 @@ void AliAnaCalorimeterQA::MakeAnalysisFillHistograms() //cout<<"Final Label "<GetPdgCode(); - Double_t charge = TDatabasePDG::Instance()->GetParticle(pdg)->Charge(); + Double_t charge = TDatabasePDG::Instance()->GetParticle(pdg)->Charge(); if(pdg == 22){ //cout<<"pdg "<GetStatusCode()<= 0){ pi0 = GetMCStack()->Particle(mother); pdgpi0 = pi0->GetPdgCode(); - if(pdgpi0 == 111) break; + if(pdgpi0 == 111) { + //cout<<"pi0!!!"<GetFirstMother(); //printf("mother %d\n",mother); } } else pi0 = primary; - //cout<<"MOTHER PI0 LABEL "<Pt()<GetPdgCode()<Pt()<<" status "<GetStatusCode()<GetNDaughters() == 2){ - // cout<<"pi0, 2 daughters "<GetFirstDaughter(); Int_t id2 = pi0->GetFirstDaughter()+1; p1=GetMCStack()->Particle(id1); @@ -1238,7 +1242,7 @@ void AliAnaCalorimeterQA::MakeAnalysisFillHistograms() fhNCells->Fill(ncells) ; for (Int_t iCell = 0; iCell < ncells; iCell++) { - if(GetDebug() > 2) printf("AliAnaCalorimeterQA::MakeAnalysisFillHistograms() - Cell : amp %f, absId %d \n", cell->GetAmplitude(iCell), cell->GetCellNumber(iCell)); + if(GetDebug() > 10) printf("AliAnaCalorimeterQA::MakeAnalysisFillHistograms() - Cell : amp %f, absId %d \n", cell->GetAmplitude(iCell), cell->GetCellNumber(iCell)); fhAmplitude->Fill(cell->GetAmplitude(iCell)); } diff --git a/PWG4/libPWG4CaloCalib.pkg b/PWG4/libPWG4CaloCalib.pkg new file mode 100644 index 00000000000..419525cbc16 --- /dev/null +++ b/PWG4/libPWG4CaloCalib.pkg @@ -0,0 +1,17 @@ +#-*- Mode: Makefile -*- + +SRCS = CaloCalib/AliAnalysisTaskPHOSPi0CalibSelection.cxx + +HDRS:= $(SRCS:.cxx=.h) + +DHDR:= PWG4CaloCalibLinkDef.h + +EXPORT:=$(SRCS:.cxx=.h) + +EINCLUDE= PHOS + +ifeq (win32gcc,$(ALICE_TARGET)) +PACKSOFLAGS:= $(SOFLAGS) -L$(ALICE_ROOT)/lib/tgt_$(ALICE_TARGET) -lSTEERBase \ + -lESD -lAOD -lANALYSIS -lANALYSISalice -lPHOSbase \ + -L$(shell root-config --libdir) -lEG +endif -- 2.43.0