00001
00054 #include "StEEmcPointFitMaker.h"
00055 #include "EEmcSectorFit.h"
00056 #include "StEEmcPool/StEEmcA2EMaker/StEEmcA2EMaker.h"
00057 #include "StEEmcUtil/StEEmcSmd/EEmcSmdGeom.h"
00058 #include <algorithm>
00059 #include "TString.h"
00060 #include "StEEmcPool/StEEmcClusterMaker/StEEmcSmdCluster.h"
00061
00062 ClassImp(StEEmcPointFitMaker);
00063
00064
00065 StEEmcPointFitMaker::StEEmcPointFitMaker(const Char_t *n):StEEmcPointMaker(n)
00066 {
00067 for ( Int_t sec=0;sec<12;sec++ )
00068 {
00069 mSectorFit[sec]=0;
00070 }
00071
00072 mPermutations=true;
00073
00074 mLimitFits=10;
00075
00076 }
00077
00078
00079 Int_t StEEmcPointFitMaker::Init()
00080 {
00081 return StEEmcPointMaker::Init();
00082 }
00083
00084
00085 Int_t StEEmcPointFitMaker::Make()
00086 {
00087 mClusterId=10000;
00089 for ( Int_t sec=0;sec<12;sec++ )
00090 {
00091 mSectorFit[sec]=new EEmcSectorFit(10);
00092 mSectorFit[sec]->doPermutations=mPermutations;
00093
00094 }
00095
00097 for ( Int_t i=0;i<12;i++ )
00098 {
00099 FitSector(i);
00100 }
00101
00103 if ( mEnergyMode == 0 )
00104 shareEnergySmd();
00105 else if ( mEnergyMode == 1 )
00106 shareEnergySimple();
00107
00108
00109 return kStOK;
00110 }
00111
00112 Int_t StEEmcPointFitMaker::FitSector(Int_t sector)
00113 {
00114
00115 EEmcSectorFit *fitter = mSectorFit[sector];
00116
00120 Float_t etowers = mEEanalysis->energy(sector,0);
00121 Float_t eproject = etowers * 0.007 * 1000.0;
00122 Float_t nproject = eproject / 1.3;
00123
00124
00126 TString uname="h";uname+=(sector+1<10)?"0":"";uname+=sector+1;uname+="U";
00127 TString vname="h";vname+=(sector+1<10)?"0":"";vname+=sector+1;vname+="V";
00128 TH1F *hU=new TH1F(uname,"SMD-u energy distribution [nmips]",288,0.,288.);
00129 TH1F *hV=new TH1F(vname,"SMD-v energy distribution [nmips]",288,0.,288.);
00130
00131 for ( Int_t hit=0;hit<mEEanalysis->numberOfHitStrips(sector,0);hit++ ) {
00132 StEEmcStrip strip=mEEanalysis->hitstrip(sector,0,hit);
00133 if ( strip.fail() ) continue;
00134 hU->SetBinContent( strip.index()+1, strip.energy() * 1000.0 / 1.3 );
00135 }
00136 for ( Int_t hit=0;hit<mEEanalysis->numberOfHitStrips(sector,1);hit++ ) {
00137 StEEmcStrip strip=mEEanalysis->hitstrip(sector,1,hit);
00138 if ( strip.fail() ) continue;
00139 hV->SetBinContent( strip.index()+1, strip.energy() * 1000.0 / 1.3 );
00140 }
00141
00144 mSectorFit[sector]->SetHistograms(hU,hV);
00145
00146
00148 if ( etowers < 1.0 ) return kStOK;
00149
00150
00151 Float_t nfit = 0.;
00152 Float_t nlast = 5.0;
00153 Int_t count = 0;
00154
00155 while ( nfit < 0.90 * nproject && nlast >= 4.0 && count < mLimitFits ) {
00156
00158 Double_t res5umax=0.;
00159 Double_t res5vmax=0.;
00160 Double_t resu=0.;
00161 Double_t resv=0.;
00162 Double_t res5u=0.;
00163 Double_t res5v=0.;
00164 Int_t maxu=-1;
00165 Int_t maxv=-1;
00166 for ( Int_t i=0;i<288;i++ )
00167 {
00168 res5u=fitter->Residual(i,0,2);
00169 res5v=fitter->Residual(i,1,2);
00170 resu=fitter->Residual(i,0);
00171 resv=fitter->Residual(i,1);
00172 if ( res5u > res5umax ) {
00173 res5umax=res5u;
00174 maxu=i;
00175 }
00176 if ( res5v > res5vmax ) {
00177 res5vmax=res5v;
00178 maxv=i;
00179 }
00180 }
00181
00183 if ( maxu<0 || maxv<0 ) {
00184
00185 break;
00186 }
00187 if ( res5umax < 4.0 && res5vmax < 4.0 ) {
00188
00189 break;
00190 }
00191
00193
00194 fitter -> AddCandidate( (res5umax+res5vmax)/2., 0.85, (Double_t)maxu+0.5, (Double_t)maxv+0.5 );
00195
00197 fitter -> Migrad();
00198
00200 Double_t e,s,u,v;
00201 fitter->GetLastCandidate( e, s, u, v );
00202 nlast = e;
00203
00206 if ( count && count < 5 ) fitter -> TryPermutations();
00207
00209 nfit = 0.;
00210 for ( Int_t i=0;i<fitter->numberOfCandidates();i++ ){
00211
00212 fitter->GetCandidate(i,e,s,u,v);
00213 nfit += e;
00214
00215 }
00216
00217 count++;
00218 if ( nlast < 4.0 ) break;
00219
00220 }
00221
00222
00223
00224
00225
00228 std::vector<Bool_t> drop( fitter->numberOfCandidates(), false );
00229 for ( Int_t ifit=0;ifit<fitter->numberOfCandidates()-1;ifit++ )
00230 {
00231 Double_t e1,s1,u1,v1;
00232 fitter->GetCandidate(ifit,e1,s1,u1,v1);
00233 for ( Int_t jfit=ifit+1;jfit<fitter->numberOfCandidates();jfit++ )
00234 {
00235 Double_t e2,s2,u2,v2;
00236 fitter->GetCandidate(jfit,e2,s2,u2,v2);
00237
00239 Float_t dist = TMath::Sqrt( (u1-u2)*(u1-u2) + (v1-v2)*(v1-v2) );
00240
00242 if ( e1 < 0.15 * e2 ) {
00243 Float_t min_dist = TMath::Abs(s1) * 3.5;
00244 if ( dist < min_dist ) drop[ifit]=true;
00245 }
00246
00248 if ( e2 < 0.15 * e1 ) {
00249 Float_t min_dist = TMath::Abs(s2) * 3.5;
00250 if ( dist < min_dist ) drop[jfit]=true;
00251 }
00252
00253 }
00254 }
00255
00256
00257
00261
00262 for ( Int_t ifit=0;ifit<fitter->numberOfCandidates();ifit++ )
00263 {
00264
00266 if ( drop[ifit] ) continue;
00267
00268 Double_t nmip,sigma,u,v;
00269 fitter->GetCandidate( ifit, nmip, sigma, u, v );
00270 StEEmcPoint point;
00271 point.sector( sector );
00272 point.sigma( sigma );
00273 point.u(u);
00274 point.v(v);
00275 point.energy( (Float_t)(nmip * 1.3 / 0.007 / 1000.0) );
00276 TVector3 position = mEEsmd->getIntersection( sector, (Int_t)u, (Int_t)v );
00277 point.position( position );
00278 StEEmcTower *tower = mEEanalysis->tower(position,0);
00279 if ( !tower ) continue;
00280 point.tower( *tower );
00282 point.residueU( (Float_t)fitter -> Residual( (Int_t)u, 0, 60 ) * 1.3 / 1000.0 );
00283 point.residueV( (Float_t)fitter -> Residual( (Int_t)v, 1, 60 ) * 1.3 / 1000.0 );
00284
00285
00287 StEEmcSmdCluster uc;
00288 uc.energy( (float)(nmip * 1.3 / 1000.0) );
00289 uc.mean( (float)u );
00290 uc.sigma( (float)sigma );
00291 uc.sector ( sector );
00292 uc.plane( 0 );
00293 uc.key( mClusterId++ );
00294 StEEmcSmdCluster vc;
00295 vc.energy( (float)(nmip * 1.3 / 1000.0) );
00296 vc.mean ( (float)v );
00297 vc.sigma( (float)sigma );
00298 vc.plane( 1 );
00299 vc.key( mClusterId++ );
00300 point.cluster( uc, 0 );
00301 point.cluster( vc, 1 );
00302 point.energy( (float)(nmip * 1.3 / 1000.0) );
00303 point.sector( sector );
00304
00305 mPoints.push_back(point);
00306
00307 }
00308
00309 return kStOK;
00310
00311 }
00312
00313 void StEEmcPointFitMaker::Clear(Option_t *opts)
00314 {
00316 for ( Int_t i=0;i<12;i++ )
00317 if ( mSectorFit[i] ) delete mSectorFit[i];
00318
00319 StEEmcPointMaker::Clear(opts);
00320 }
00321
00322
00323 void StEEmcPointFitMaker::print() const
00324 {
00325 for ( Int_t i=0;i<12;i++ )
00326 {
00327 mSectorFit[i]->print();
00328 }
00329 for ( UInt_t i=0;i<mPoints.size();i++ )
00330 {
00331 mPoints[i].print();
00332 }
00333 }