From 7101948c54b4453237ceaf30507bea915aa6c353 Mon Sep 17 00:00:00 2001 From: masera Date: Wed, 1 Jul 2009 16:17:55 +0000 Subject: [PATCH] 1) AliITSRecoParam -> flag for using the bad channels in the SSD CF 2) AliITSRecPoint.cxx -> correctly set the out-of-diagonal elements of the covariance matrix in the recpoint constructor 3) AliITSClusterFinderV2SSD -> flag for using bad channels + fix in the value of sigma_z E. Fragiacomo --- ITS/AliITSClusterFinderV2SSD.cxx | 454 +++++++++--------- ITS/AliITSRecPoint.cxx | 4 +- ITS/AliITSRecoParam.cxx | 3 +- ITS/AliITSRecoParam.h | 7 +- .../Calib/RecoParam/Run0_999999999_v0_s0.root | Bin 7681 -> 7890 bytes 5 files changed, 242 insertions(+), 226 deletions(-) diff --git a/ITS/AliITSClusterFinderV2SSD.cxx b/ITS/AliITSClusterFinderV2SSD.cxx index b20bbdb23bc..36f5ff95524 100644 --- a/ITS/AliITSClusterFinderV2SSD.cxx +++ b/ITS/AliITSClusterFinderV2SSD.cxx @@ -744,6 +744,18 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, const TGeoHMatrix *mT2L=AliITSgeomTGeo::GetTracking2LocalMatrix(fModule); + //--------------------------------------- + // load recoparam + // + static AliITSRecoParam *repa = NULL; + if(!repa){ + repa = (AliITSRecoParam*) AliITSReconstructor::GetRecoParam(); + if(!repa){ + repa = AliITSRecoParam::GetHighFluxParam(); + AliWarning("Using default AliITSRecoParam class"); + } + } + TClonesArray &cl=*clusters; AliITSsegmentationSSD *seg = dynamic_cast(fDetTypeRec->GetSegmentationModel(2)); @@ -838,15 +850,6 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, Double_t ratio; - static AliITSRecoParam *repa = NULL; - if(!repa){ - repa = (AliITSRecoParam*) AliITSReconstructor::GetRecoParam(); - if(!repa){ - repa = AliITSRecoParam::GetHighFluxParam(); - AliWarning("Using default AliITSRecoParam class"); - } - } - if(repa->GetUseChargeMatchingInClusterFinderSSD()==kTRUE) { @@ -914,7 +917,7 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, lp[5]=-0.00006; } else { - lp[3]=0.0093*0.0093; + lp[3]=0.093*0.093; if (info[0]==1) { lp[5]=-0.00014;} else { lp[2]=0.0017*0.0017; lp[5]=-0.00004;} } @@ -1024,7 +1027,7 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, lp[5]=-0.00006; } else { - lp[3]=0.0093*0.0093; + lp[3]=0.093*0.093; if (info[0]==1) { lp[5]=-0.00014;} else { lp[2]=0.0017*0.0017; lp[5]=-0.00004;} } @@ -1100,7 +1103,7 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, lp[5]=-0.00006; } else { - lp[3]=0.0093*0.0093; + lp[3]=0.093*0.093; if (info[0]==1) { lp[5]=-0.00014;} else { lp[2]=0.0017*0.0017; lp[5]=-0.00004;} } @@ -1209,7 +1212,7 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, lp[5]=-0.00006; } else { - lp[3]=0.0093*0.0093; + lp[3]=0.093*0.093; if (info[0]==1) { lp[5]=-0.00014;} else { lp[2]=0.0017*0.0017; lp[5]=-0.00004;} } @@ -1285,7 +1288,7 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, lp[5]=-0.00006; } else { - lp[3]=0.0093*0.0093; + lp[3]=0.093*0.093; if (info[0]==1) { lp[5]=-0.00014;} else { lp[2]=0.0017*0.0017; lp[5]=-0.00004;} } @@ -1425,7 +1428,7 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, lp[5]=-0.00006; } else { - lp[3]=0.0093*0.0093; + lp[3]=0.093*0.093; if (info[0]==1) { lp[5]=-0.00014;} else { lp[2]=0.0017*0.0017; lp[5]=-0.00004;} } @@ -1557,7 +1560,7 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, lp[5]=-0.00006; } else { - lp[3]=0.0093*0.0093; + lp[3]=0.093*0.093; if (info[0]==1) { lp[5]=-0.00014;} else { lp[2]=0.0017*0.0017; lp[5]=-0.00004;} } @@ -1652,7 +1655,7 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, lp[5]=-0.00006; } else { - lp[3]=0.0093*0.0093; + lp[3]=0.093*0.093; if (info[0]==1) { lp[5]=-0.00014;} else { lp[2]=0.0017*0.0017; lp[5]=-0.00004;} } @@ -1684,233 +1687,238 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, } - //--------------------------------------------------------- - // recover crosses of good 1D clusters with bad strips on the other side - // Note1: at first iteration skip modules with a bad side (or almost), (would produce too many fake!) - // Note2: for modules with a bad side see below - - AliITSCalibrationSSD* cal = (AliITSCalibrationSSD*)GetResp(fModule); - Int_t countPbad=0, countNbad=0; - for(Int_t ib=0; ib<768; ib++) { - if(cal->IsPChannelBad(ib)) countPbad++; - if(cal->IsNChannelBad(ib)) countNbad++; - } - // AliInfo(Form("module %d has %d P- and %d N-bad strips",fModule,countPbad,countNbad)); - if( (countPbad<100) && (countNbad<100) ) { // no bad side!! + if(repa->GetUseBadChannelsInClusterFinderSSD()==kTRUE) { + + //--------------------------------------------------------- + // recover crosses of good 1D clusters with bad strips on the other side + // Note1: at first iteration skip modules with a bad side (or almost), (would produce too many fake!) + // Note2: for modules with a bad side see below + + AliITSCalibrationSSD* cal = (AliITSCalibrationSSD*)GetResp(fModule); + Int_t countPbad=0, countNbad=0; + for(Int_t ib=0; ib<768; ib++) { + if(cal->IsPChannelBad(ib)) countPbad++; + if(cal->IsNChannelBad(ib)) countNbad++; + } + // AliInfo(Form("module %d has %d P- and %d N-bad strips",fModule,countPbad,countNbad)); - for (Int_t i=0; iIsPChannelBad(ib)) { // check if strips is bad - Float_t yN=pos[i].GetY(); - Float_t xt, zt; - seg->GetPadCxz(1.*ib, yN, xt, zt); + // for(Int_t ib=0; ib<768; ib++) { // loop over all Pstrips + for(Int_t ib=15; ib<753; ib++) { // loop over all Pstrips - //---------- - // bad Pstrip is crossing the Nside 1Dcluster -> create recpoint - // - if ( (TMath::Abs(xt)MasterToLocal(loc,trk); - lp[0]=trk[1]; - lp[1]=trk[2]; - lp[4]=pos[i].GetQ(); //Q - for (Int_t ilab=0;ilab<10;ilab++) milab[ilab]=-2; - for (Int_t ilab=0;ilab<3;ilab++) milab[ilab] = pos[i].GetLabel(ilab); - CheckLabels2(milab); - milab[3]=( (i<<10) << 10 ) + idet; // pos|neg|det - Int_t info[3] = {pos[i].GetNd(),0,fNlayer[fModule]}; + if(cal->IsPChannelBad(ib)) { // check if strips is bad + Float_t yN=pos[i].GetY(); + Float_t xt, zt; + seg->GetPadCxz(1.*ib, yN, xt, zt); - // out-of-diagonal element of covariance matrix - if (info[0]==1) lp[5]=0.0065; - else lp[5]=0.0093; - - lp[2]=0.0022*0.0022; //SigmaY2 - lp[3]=0.110*0.110; //SigmaZ2 - lp[5]=-0.00012; // out-of-diagonal element of covariance matrix - - AliITSRecPoint * cl2; - if(clusters){ - cl2 = new (cl[ncl]) AliITSRecPoint(milab,lp,info); - cl2->SetChargeRatio(1.); + //---------- + // bad Pstrip is crossing the Nside 1Dcluster -> create recpoint + // + if ( (TMath::Abs(xt)MasterToLocal(loc,trk); + lp[0]=trk[1]; + lp[1]=trk[2]; + lp[4]=pos[i].GetQ(); //Q + for (Int_t ilab=0;ilab<10;ilab++) milab[ilab]=-2; + for (Int_t ilab=0;ilab<3;ilab++) milab[ilab] = pos[i].GetLabel(ilab); + CheckLabels2(milab); + milab[3]=( (i<<10) << 10 ) + idet; // pos|neg|det + Int_t info[3] = {pos[i].GetNd(),0,fNlayer[fModule]}; + + // out-of-diagonal element of covariance matrix + if (info[0]==1) lp[5]=0.0065; + else lp[5]=0.0093; + + lp[2]=0.0022*0.0022; //SigmaY2 + lp[3]=0.110*0.110; //SigmaZ2 + lp[5]=-0.00012; // out-of-diagonal element of covariance matrix + + AliITSRecPoint * cl2; + if(clusters){ + cl2 = new (cl[ncl]) AliITSRecPoint(milab,lp,info); + cl2->SetChargeRatio(1.); cl2->SetType(50); - } - else{ - cl2 = new AliITSRecPoint(milab,lp,info); - cl2->SetChargeRatio(1.); - cl2->SetType(50); - fDetTypeRec->AddRecPoint(*cl2); - } - ncl++; - } // cross is within the detector - // - //-------------- + } + else{ + cl2 = new AliITSRecPoint(milab,lp,info); + cl2->SetChargeRatio(1.); + cl2->SetType(50); + fDetTypeRec->AddRecPoint(*cl2); + } + ncl++; + } // cross is within the detector + // + //-------------- + + } // bad Pstrip - } // bad Pstrip + } // end loop over Pstrips - } // end loop over Pstrips + } // end loop over Nside 1D clusters - } // end loop over Nside 1D clusters + for (Int_t j=0; jIsNChannelBad(ib)) { // check if strip is bad + Float_t yP=neg[j].GetY(); + Float_t xt, zt; + seg->GetPadCxz(yP, 1.*ib, xt, zt); + + //---------- + // bad Nstrip is crossing the Pside 1Dcluster -> create recpoint + // + if ( (TMath::Abs(xt)MasterToLocal(loc,trk); + lp[0]=trk[1]; + lp[1]=trk[2]; + lp[4]=neg[j].GetQ(); //Q + for (Int_t ilab=0;ilab<10;ilab++) milab[ilab]=-2; + for (Int_t ilab=0;ilab<3;ilab++) milab[ilab] = neg[j].GetLabel(ilab); + CheckLabels2(milab); + milab[3]=( j << 10 ) + idet; // pos|neg|det + Int_t info[3]={0,(Int_t)neg[j].GetNd(),fNlayer[fModule]}; + + lp[2]=0.0022*0.0022; //SigmaY2 + lp[3]=0.110*0.110; //SigmaZ2 + lp[5]=-0.00012; // out-of-diagonal element of covariance matrix + + AliITSRecPoint * cl2; + if(clusters){ + cl2 = new (cl[ncl]) AliITSRecPoint(milab,lp,info); + cl2->SetChargeRatio(1.); + cl2->SetType(60); + } + else{ + cl2 = new AliITSRecPoint(milab,lp,info); + cl2->SetChargeRatio(1.); + cl2->SetType(60); + fDetTypeRec->AddRecPoint(*cl2); + } + ncl++; + } // cross is within the detector + // + //-------------- + + } // bad Nstrip + } // end loop over Nstrips + } // end loop over Pside 1D clusters + + } // no bad sides + + //--------------------------------------------------------- - for (Int_t j=0; j700) && (countNbad<100) ) { // bad Pside!! - // for(Int_t ib=0; ib<768; ib++) { // loop over all Nside strips - for(Int_t ib=15; ib<753; ib++) { // loop over all Nside strips + for (Int_t i=0; iIsNChannelBad(ib)) { // check if strip is bad - Float_t yP=neg[j].GetY(); - Float_t xt, zt; - seg->GetPadCxz(yP, 1.*ib, xt, zt); + Float_t xt, zt; + Float_t yN=pos[i].GetY(); + Float_t yP=0.; + if (seg->GetLayer()==5) yP = yN + (7.6/1.9); + else yP = yN - (7.6/1.9); + seg->GetPadCxz(yP, yN, xt, zt); + + if ( (TMath::Abs(xt)MasterToLocal(loc,trk); + lp[0]=trk[1]; + lp[1]=trk[2]; + lp[4]=pos[i].GetQ(); //Q + for (Int_t ilab=0;ilab<10;ilab++) milab[ilab]=-2; + for (Int_t ilab=0;ilab<3;ilab++) milab[ilab] = pos[i].GetLabel(ilab); + CheckLabels2(milab); + milab[3]=( (i<<10) << 10 ) + idet; // pos|neg|det + Int_t info[3] = {(Int_t)pos[i].GetNd(),0,fNlayer[fModule]}; - //---------- - // bad Nstrip is crossing the Pside 1Dcluster -> create recpoint - // - if ( (TMath::Abs(xt)MasterToLocal(loc,trk); - lp[0]=trk[1]; - lp[1]=trk[2]; - lp[4]=neg[j].GetQ(); //Q - for (Int_t ilab=0;ilab<10;ilab++) milab[ilab]=-2; - for (Int_t ilab=0;ilab<3;ilab++) milab[ilab] = neg[j].GetLabel(ilab); - CheckLabels2(milab); - milab[3]=( j << 10 ) + idet; // pos|neg|det - Int_t info[3]={0,(Int_t)neg[j].GetNd(),fNlayer[fModule]}; - - lp[2]=0.0022*0.0022; //SigmaY2 - lp[3]=0.110*0.110; //SigmaZ2 - lp[5]=-0.00012; // out-of-diagonal element of covariance matrix - - AliITSRecPoint * cl2; - if(clusters){ - cl2 = new (cl[ncl]) AliITSRecPoint(milab,lp,info); - cl2->SetChargeRatio(1.); - cl2->SetType(60); - } - else{ - cl2 = new AliITSRecPoint(milab,lp,info); - cl2->SetChargeRatio(1.); - cl2->SetType(60); - fDetTypeRec->AddRecPoint(*cl2); - } - ncl++; - } // cross is within the detector - // - //-------------- + lp[2]=0.031*0.031; //SigmaY2 + lp[3]=1.15*1.15; //SigmaZ2 + lp[5]=-0.036; - } // bad Nstrip - } // end loop over Nstrips - } // end loop over Pside 1D clusters + AliITSRecPoint * cl2; + if(clusters){ + cl2 = new (cl[ncl]) AliITSRecPoint(milab,lp,info); + cl2->SetChargeRatio(1.); + cl2->SetType(70); + } + else{ + cl2 = new AliITSRecPoint(milab,lp,info); + cl2->SetChargeRatio(1.); + cl2->SetType(70); + fDetTypeRec->AddRecPoint(*cl2); + } + ncl++; + } // cross is within the detector + // + //-------------- + + } // end loop over Nside 1D clusters + + } // bad Pside module - } // no bad sides - - //--------------------------------------------------------- - - else if( (countPbad>700) && (countNbad<100) ) { // bad Pside!! - - for (Int_t i=0; i700) && (countPbad<100) ) { // bad Nside!! - Float_t xt, zt; - Float_t yN=pos[i].GetY(); - Float_t yP=0.; - if (seg->GetLayer()==5) yP = yN + (7.6/1.9); - else yP = yN - (7.6/1.9); - seg->GetPadCxz(yP, yN, xt, zt); + for (Int_t j=0; jGetLayer()==5) yN = yP - (7.6/1.9); + else yN = yP + (7.6/1.9); + seg->GetPadCxz(yP, yN, xt, zt); + + if ( (TMath::Abs(xt)MasterToLocal(loc,trk); + lp[0]=trk[1]; + lp[1]=trk[2]; + lp[4]=neg[j].GetQ(); //Q + for (Int_t ilab=0;ilab<10;ilab++) milab[ilab]=-2; + for (Int_t ilab=0;ilab<3;ilab++) milab[ilab] = neg[j].GetLabel(ilab); + CheckLabels2(milab); + milab[3]=( j << 10 ) + idet; // pos|neg|det + Int_t info[3] = {0,(Int_t)neg[j].GetNd(),fNlayer[fModule]}; - if ( (TMath::Abs(xt)MasterToLocal(loc,trk); - lp[0]=trk[1]; - lp[1]=trk[2]; - lp[4]=pos[i].GetQ(); //Q - for (Int_t ilab=0;ilab<10;ilab++) milab[ilab]=-2; - for (Int_t ilab=0;ilab<3;ilab++) milab[ilab] = pos[i].GetLabel(ilab); - CheckLabels2(milab); - milab[3]=( (i<<10) << 10 ) + idet; // pos|neg|det - Int_t info[3] = {(Int_t)pos[i].GetNd(),0,fNlayer[fModule]}; - - lp[2]=0.031*0.031; //SigmaY2 - lp[3]=1.15*1.15; //SigmaZ2 - lp[5]=-0.036; - - AliITSRecPoint * cl2; - if(clusters){ - cl2 = new (cl[ncl]) AliITSRecPoint(milab,lp,info); - cl2->SetChargeRatio(1.); - cl2->SetType(70); - } - else{ - cl2 = new AliITSRecPoint(milab,lp,info); - cl2->SetChargeRatio(1.); - cl2->SetType(70); - fDetTypeRec->AddRecPoint(*cl2); - } - ncl++; - } // cross is within the detector - // - //-------------- + lp[2]=0.0085*0.0085; //SigmaY2 + lp[3]=1.15*1.15; //SigmaZ2 + lp[5]=0.0093; + + AliITSRecPoint * cl2; + if(clusters){ + cl2 = new (cl[ncl]) AliITSRecPoint(milab,lp,info); + cl2->SetChargeRatio(1.); + cl2->SetType(80); + } + else{ + cl2 = new AliITSRecPoint(milab,lp,info); + cl2->SetChargeRatio(1.); + cl2->SetType(80); + fDetTypeRec->AddRecPoint(*cl2); + } + ncl++; + } // cross is within the detector + // + //-------------- + + } // end loop over Pside 1D clusters - } // end loop over Nside 1D clusters + } // bad Nside module - } // bad Pside module - - else if( (countNbad>700) && (countPbad<100) ) { // bad Nside!! + //--------------------------------------------------------- - for (Int_t j=0; jGetLayer()==5) yN = yP - (7.6/1.9); - else yN = yP + (7.6/1.9); - seg->GetPadCxz(yP, yN, xt, zt); - - if ( (TMath::Abs(xt)MasterToLocal(loc,trk); - lp[0]=trk[1]; - lp[1]=trk[2]; - lp[4]=neg[j].GetQ(); //Q - for (Int_t ilab=0;ilab<10;ilab++) milab[ilab]=-2; - for (Int_t ilab=0;ilab<3;ilab++) milab[ilab] = neg[j].GetLabel(ilab); - CheckLabels2(milab); - milab[3]=( j << 10 ) + idet; // pos|neg|det - Int_t info[3] = {0,(Int_t)neg[j].GetNd(),fNlayer[fModule]}; - - lp[2]=0.0085*0.0085; //SigmaY2 - lp[3]=1.15*1.15; //SigmaZ2 - lp[5]=0.0093; - - AliITSRecPoint * cl2; - if(clusters){ - cl2 = new (cl[ncl]) AliITSRecPoint(milab,lp,info); - cl2->SetChargeRatio(1.); - cl2->SetType(80); - } - else{ - cl2 = new AliITSRecPoint(milab,lp,info); - cl2->SetChargeRatio(1.); - cl2->SetType(80); - fDetTypeRec->AddRecPoint(*cl2); - } - ncl++; - } // cross is within the detector - // - //-------------- - - } // end loop over Pside 1D clusters + } // use bad channels - } // bad Nside module - - //--------------------------------------------------------- - //cout<LocalToMaster(txyz,lxyz); fXloc = lxyz[0]; fZloc = lxyz[2]; + if(fLayer==5) hit[5]=-hit[5]; + if( (fLayer==4) || (fLayer=5) ) SetSigmaYZ(hit[5]); } else { switch (fLayer) { @@ -215,4 +217,4 @@ istream &operator>>(istream &is,AliITSRecPoint &r){ r.Read(&is); return is; } -//---------------------------------------------------------------------- +//---------------------------------------------------------------------- \ No newline at end of file diff --git a/ITS/AliITSRecoParam.cxx b/ITS/AliITSRecoParam.cxx index 3282a76fb48..2e0d877277c 100644 --- a/ITS/AliITSRecoParam.cxx +++ b/ITS/AliITSRecoParam.cxx @@ -152,6 +152,7 @@ fStoreLikeSignV0s(kFALSE), fUseUnfoldingInClusterFinderSPD(kFALSE), fUseUnfoldingInClusterFinderSDD(kTRUE), fUseUnfoldingInClusterFinderSSD(kFALSE), +fUseBadChannelsInClusterFinderSSD(kFALSE), fUseSDDCorrectionMaps(kTRUE), fUseSDDClusterSizeSelection(kFALSE), fMinClusterChargeSDD(0.), @@ -643,4 +644,4 @@ void AliITSRecoParam::PrintParameters() const Dump(); return; -} +} \ No newline at end of file diff --git a/ITS/AliITSRecoParam.h b/ITS/AliITSRecoParam.h index 3d29ff18d71..c33218d6141 100644 --- a/ITS/AliITSRecoParam.h +++ b/ITS/AliITSRecoParam.h @@ -303,6 +303,9 @@ class AliITSRecoParam : public AliDetectorRecoParam void SetUseUnfoldingInClusterFinderSSD(Bool_t use=kTRUE) { fUseUnfoldingInClusterFinderSSD=use; return; } Bool_t GetUseUnfoldingInClusterFinderSSD() const { return fUseUnfoldingInClusterFinderSSD; } + void SetUseBadChannelsInClusterFinderSSD(Bool_t use=kFALSE) { fUseBadChannelsInClusterFinderSSD=use; return; } + Bool_t GetUseBadChannelsInClusterFinderSSD() const { return fUseBadChannelsInClusterFinderSSD; } + void SetUseSDDCorrectionMaps(Bool_t use=kTRUE) {fUseSDDCorrectionMaps=use;} Bool_t GetUseSDDCorrectionMaps() const {return fUseSDDCorrectionMaps;} void SetUseSDDClusterSizeSelection(Bool_t use=kTRUE) {fUseSDDClusterSizeSelection=use;} @@ -540,6 +543,8 @@ class AliITSRecoParam : public AliDetectorRecoParam Bool_t fUseUnfoldingInClusterFinderSDD; // SDD Bool_t fUseUnfoldingInClusterFinderSSD; // SSD + Bool_t fUseBadChannelsInClusterFinderSSD; // flag to switch on bad channels in CF SSD + Bool_t fUseSDDCorrectionMaps; // flag for use of SDD maps in C.F. Bool_t fUseSDDClusterSizeSelection; // cut on SDD cluster size Float_t fMinClusterChargeSDD; // cut on SDD cluster charge @@ -582,7 +587,7 @@ class AliITSRecoParam : public AliDetectorRecoParam Bool_t fAlignFilterFillQANtuples; // fill QA ntuples - ClassDef(AliITSRecoParam,22) // ITS reco parameters + ClassDef(AliITSRecoParam,23) // ITS reco parameters }; #endif diff --git a/OCDB/ITS/Calib/RecoParam/Run0_999999999_v0_s0.root b/OCDB/ITS/Calib/RecoParam/Run0_999999999_v0_s0.root index 9f1853378894648dd666c34f7f32ed4518aab9cb..8f7b0e0e136562dcd16f09bc2f37102a817bda2a 100644 GIT binary patch literal 7890 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 literal 7681 zcmb`Mbxd8+v+oanaCbdGai?g3;_e3y?ojL$m*VaeD^78DD^j$$yF0~-7pM58y}8Nn zub21o?n+kHBs(+vJCikQW$%xZy}b(nFscjy0L%dZ3K#%@JmuB4d7ZB|AP4@x4frSk zfXEd9Q^&U?qMgx3;IngqZ)eytWI?|LymD2^~CXZ1UaM9d@=GW5ZLU6bmXn`m# zwoS`@^Sae?Z)!2GCxh7WgT=A5F|pwhx^O^GqEtk|m^xR+*XeTYcu)SB+_zuLDh&`Y%ojj%Q*N#c;< z;F+edw_0mjusgD9RG&w-G8Vzxl?Qfm{5&-Cgqn-f5tOh6=ApOFK?wbyb7jw(XE884 zfnrn0rw9XO15tMT;OkFkSJ(6u%E$6o-X|nz+#TM}C;dSx?Iz+n0yl?;XXHafzV2nC zRfc|XYBx~IPo$3?KYAkamuJ%9Hkk|j+}&wdFRG<_v}N){ z=5IxDn17N3`NBi#nD6i7!`^V8*q3--YK5UPPH4QfInx^IsqK$vZ}J;jf0!$LKxN)J zXCBY*y`$th>33DwF=6WgqDLnWz6}mkMLt2CBSM7K&Q?*da`Lai_u1lty!)k|6^ZIH zMo>FQbJmMRe**UMw$hqX@*_9{=?!wM9{((2fle^wb^W<9zYWxy? zgN<1DG#R`dgz;LO$8&8m^~12I66(=yzxHmomTtHF#QU;**HYePL^`iT#qZmfYtyFU z3={@0@~#;n(jTOImJ3sqpT}%`YGIqMHD&)`tniyGM$xM4IajU;(H1g&3aL4o@#qlI zU9frwnRQ};dWOI2+pS!Dc+2paHnsrDjMcCu*E%z=&s;lWUi{_I#(9f;=!e`RZ4LRm zIb#0+7_Ft*CiqXwzHl}%5;LHYvG8a$2qvrdB3_aepNbCwDGd-FO-wK71-ipS+m%8@-puCd}%ZxX86@de-$JM zFCuW?UChkxl>LI79U+gWExm>^oOOaq_5{krMRE|>n2d;OBG50^7UbEN>dHHNalbU$ z)<$A$AH^if?9d0on#J3RunVTx_h?c@sThWTh@5An`L@6RW-8)$y(wG=<`EvB(q<`y zXE}s9vy6DT?8CZA-^PNuY(om06G1kFo8z`1CReK ze^xMe%v|*UIH!^V`($hwp2~x4zb%8^?ik;5OI(z)H{&u~L>@ z)eIi~U>Lrv`3?U;fjaCr>f@Ey^*ppOta6ZnIDSe~>plGK$hF=#?xOfr1@sJs^DnKI zrnOz|9%?%dVyhXqN3*TRPW*zub-FOJJ9>zVK_3@NkU?%{W&%AOyO!IG8}95LQ z{nX;#ij1v3Bs^cWfASoPq>A;eQ564nE=Ltn1M?M2(LG8I}PFxy{U1Mfw`lHGKh*+FeHlTN=15H z>vRC3j&1M#k$FCrfw_%@(yxcM?HbCN+p}n`B8}Q5QCMoqE%+;Sz6U(58_vS+;;nLT zJR1Gxm!tl2%uS}w>$UJEX5zUNmLv@ZxHBHGWoWT zJbHe)b2a?6!1mdQMjGqSWo+YS>VTyk*Tizav=Dev*Wo1D_#t;|Wo5LUt4@@Lz)DktT+EA`8NL5N z0Ouv)h}PPMrIl*NnEBnnu|k8z-)tb_9g$l_Ls#;4yr0k=t7F7?;izIuUJZP7p9PCw z?(MqULv$^0TjZzKhs=IL&{{wBtoU0R0}?ksSGp5go#Lf z!*FLsuHDZk^)jZ0j(+G}h3Dv(u$Qd3xt4gjng;tHBPRv3H{2wOu0jDO99E4J^9 zw4&2@D2TTynm-) zjx&-`IJ<-jc&ZQ7W@tz__7fA;!|ukN1|`R7l9>W~c58#V7~AZiJ4W$zg+7P*w&6{9 zyINAOMN?3`vlZNZ7jY3zIU6D9c*j3=?O>eNj3fcRW`yT7j{KRd-i&kjX&LgPno+1l z!f^T=x^RvcYlyl>2Xof|d%^u-RAw}ln0ydK4&+2!zPvK+2}2?i{JCvyytWy~<>Mp# zBn&6>edfc~NT#a5MLopK=i)K|_8|rB<{g@wI?_tgph{MdOsdgSCe>F=`XzOS8xZp@AKhIqjp91jM>b(^7)e1Se&m?UnooNpjcfjqFx%rDyJ~A zo_vaJUONs!R7fMXVd9!_V5a+ye|u1=O^q94Z$L*QC9P#8J>?N|pvaj?Bbb@VTN-Q; z;sW=vj6v7POgBi;wn@2sM&$ictv{W)`tOfIH{IrL4-5Tf#dP(gr*1wI*A97Wmepb8 zCn8?LLLLz0ejS2nHG*g_m#)P;E-9eLJdf3ah6?mW9xQ7VjiBs9oq7_QY+AW^GE3TC zX9C|YqvCQ)X?E?a5hYtMf8?&A*E#gjCtxK#^6V!5nL$bEkEKL;YU;{<0Kuol76xWC zi0q3GO>DZ3Vw0%-_6H8dXWFR`A$lm&(t38f*0pKo}<=hP< z;0Nc-`?VD))Xcx3gA5C2Ik^*KuMC0f}p1)Y`eykIw_J)-&E zk*un`fTqCA7D9W3hzBf8EzY2OlG%!N&B7o2$>o{%#5I^c-MCgI3CV|@q6WNE#j>i& z89KEQu1C6!uz5gQz4`69l0CE1vB1_`_1-9ra}$le=Mb4hRw9HuNz7WjQ<_WiOIL)> zEPO(8m}3I#4r$6gontaLTBi|Xcs55bC8wlJSTlWT6xuWv@cX12Nh8+WHiJV|4Z1ON z;-B9_8e6F~NR!vg_#2OlW-7Ya?<+EhmVGy##KoRcb2}zf$C6bAqAhU;{9xne%q^{^zV4BuCMe_WL)FPtQA%^3a; zjZNLnZ4Rxn>|rm&s*o2_z#Qq@J{4WTxo}n?wj!e3XK^S#l21hFfg(sgLhr;sWT8A) z+s5=Jjw?E00rt;UzeU^I~T z)$Es7D8au}O)Yx1AXkhX3O%>S?>FM^S0OgbF$=cTG6&~Kkm`qLE|9xP4X4ti) zhxsQ3<;;k46O-6M3CVj>WQAkuB;TPhPL%ko#MUS4$vgA}u)2;?M>viNy7iJ9*QocZ zYj>WPIbRjmp7%hoil|gYMPzOgq5^15f)gQd3~2EJ{}YQE<$&jCX5R_Oh*QOJr>b}c z2fQ{er2UnL@Zs{h7l1R_k@O;4d-X6n-IP{1amcb}okDB`%Y{kYKmepH4Mx;~TT=4H zc}56DLUpaJ{XLI#&JeCqEA$9BK31^%OZ(yJhLihCLThU&_mzmt?WGcZ z4c>GeA4)du=9W2ZOQK}Ia4>AWrIjJRnVMbO&jVxJmq-mbQ7r?-P#|O81QqZl$KfT$ z@g>=@)4^xeV)~eIRV5%B;vlYd7Y-hjO>3_s8zP1af&Zh|h#obf>u+E3V1lqW#1tgWGOD&5 zn|xsee}Ux+|M7q_{|@a4J=9g1Fra-0B`Xq_-z2X@nMt)aOojwVN7;cNJVk3%c$%Ta zL`8gNG^o#t|H4IOYq2Lxz625v)o$9u>DY>fnQ}>?BG3xsM-MLG-F(JHA{~c4HLCzh z)!ZtHPK*yX;WHbVK{`e&$mU^w(>DmhSEr-hm!MBt#11Q%Hz<|M&+P13a(uyb!;|?W zj)wkmoRQAn>;Fb8frr1V*XsFifpe|>I>EDE1( z4A7225|);VJem$xQFC%{!_H!$grHz{3+&IWzR$ugKjvgsg!8G#$XJ#aS0^57zrm7D zpwvLA^;21DJ_8(eQz6SS+>LMpbcDDBs49!Zi=BRCoM4YiK>ZQIk~57)<$~*II=Ph9 zKO~JH6iSd(NU+so$XP6^QOKzK^~0!i{aIv|n3VD*pj+xj>WSc|82K9XF|4sR$ErM! z5W$--=tiMz&3W|{vFX9lfD)STmd$xMQv~B0_jYX;t_eM$wkBGXbCZtxlg#<1>t2`U zURU^d5dWXZ0fJHTX`7_(^I&|YsK%XzvbGEy~q>XX7*pGlA;laKKQ<*<_?5eq_$u zA;iY_t-q#huDmr<$Q%&UrvcP0l(M83%R& zTg#s`EqGJO!gCV6Xp0TC>h!#_mWYH~h;qrIbuM0V5Yf7X_#I|>Mtze)tXg$hCAl39 zR$X;{d20+(4lxA`F!#7`f~8(DZrpFv->UtayA~m)S!zNP3>Tia)IkVFWDKS!l8w!# z-yI`eJJY?Cv1W-B%j$?*9uN>f=0Mlbnr=$}5Y?+BH3#_zlu%;`f~RR<~};wuWjYr`4sEt`B* z^0$j|C08Cs)KHox->IRR4ky=lqwmT>%j7OrJ;a4{R^+di=LRETdqKUbhX%Sc2N&5d zBkLv}9aG;khFNDzdk7GFvswpF5X)8T5PONz2;0p)eW!iGMJknLY9@-8kxs#Bv*u26 ziELrhi)}0Xlc%zyguw4^yE#dd&xt>pAt;o{G8g$IJ598+7r!fw3#?CnmtgT&K}<$D zd8Yc_fD-G?J3F+=4Ms$t@xV)BRON!GV*{a_B~4;`&m`i381a(doKPHBb_LT)CJbwe z&uHmcWcx>6f8aYP;@6Z)3}GW?J3usM1i8-jV!TZ+*okeN2w`j^`|$0>#+^eoMiz^u z5!$KgT#(4ZkG<~QQYbk{`wF4`)CePTkzM)qau+m`kXataG}4-!^reCmgOEdX>1&jH zPhHEsQwxo^A;D)?O|X4SG)Zya#S|+859?yAC#K7$K{U}!u6Xt1?hDa$>cg@P-Na=B zT#cfI5a+hI&-oREWUguY@&yfK#BL8Tux|Rw)|pL61I9$rKO;hEndyrL`s7kji>cO zWQpY;Nd7Fk&6*?f&G4pE_nN+NvSEGp06Erg)=x1p*_qEh_>=p+?N80OX2-GO&aRt8 z%pA+V_L95{^oGxIscQEBt#e4yG_DI zMX?b|_##DV~pIQT<#j0@fA)LCZw}(mT)BOzsM&M$LMs)0CZ8hE(U- zmLf+3K~tRHRUCx{>29ZnV?a?(8SfAkE(D+B2*r&O+?&<|-yL((q<_y3s2&rQu@}#4 zC@A-B{E?a~sKmFs?GBpSzIF!{{^?wjF5y$23E%~@4B!TxL8EjW>gnzn6STUdmaSjQdC!e?@+Ovg|tq8h2S*?j~!fN ziNW`6l~s$%OR27$86rt44^olx9Kk2sj0^a3OR6PePO>o5&bA8McF4@b4jji<8S$)A zjOJDG$-;byKN`QSuG4q#=yA$SK&edW>)3dCSBssnX1#?W>-LL>$r6{Xc`N}PwYzPW zyQCD)hh<5)$TJ0xAVG@ToZa00!m|{&5PT(AiCggVK!y%u@7#$ILCk17-cxCS?g8!a z!EOUP#U0wlaYAI9grgBVRH|MZW_Uikvf@>~e>-sXz;mB!gp=DRTnFUlS(Cs|PftmD zJ}P^Ry8r$JC+Nd0-@G1_ih3zQ-GdIA)86dBP*yCTdiTa@KLxoFu5?Pl zUMfQpJaz(2As?;HN!9xH8|UZu>!+qb-!D&TYZTY!4oG89ulj7Y5K_qPL? zV-B@`Ol@QbFVEJp{r#wJu!tXFxd!#Ncmo@FX;p-{rmEhJ2a=ouIf>ut^Vz!f^W1V3 zA`_l2ecT+kecXIO3b|_|sf-!iJ*N<%pm}P!S}$Gi)`rg)cbd5AHJpjZ;$*@&Ka=WN z=H;Raa>28;_W5a4He8R6E6{_uha#A2;NuWM1+kz-Vtj*J$1@?`oTOhMG+BAW*cOS4 zPd>ocq`XZ()n)(I;a%gA{6>HM(8H7doCtX5LfktuZ8@LYl^(%ryMvN(A;2(8){pU} z^lKu^7#F^1e7kQeG4V**hWKm?yj|ou+ zGjI8{J(kF5O@_IYoWLpmLU-P`#(LNFCa@upbHA{o-#xE*A>|*N