00001 #include "StEEmcGenericClusterMaker.h"
00002
00003 #include "TH1F.h"
00004 #include "TH2F.h"
00005 #include "TLine.h"
00006
00007 #include "StEEmcPool/StEEmcA2EMaker/StEEmcA2EMaker.h"
00008
00009 #include "StEvent.h"
00010 #include "StEmcDetector.h"
00011 #include "StEmcCollection.h"
00012
00013 #include "StMessMgr.h"
00014
00015 #include "StMuDSTMaker/COMMON/StMuTrack.h"
00016 #include "StMuDSTMaker/COMMON/StMuDst.h"
00017 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
00018
00019 #include "StEEmcUtil/EEmcGeom/EEmcGeomDefs.h"
00020
00021 ClassImp(StEEmcGenericClusterMaker);
00022
00023
00024 StEEmcGenericClusterMaker::StEEmcGenericClusterMaker( const Char_t *name, const StEEmcA2EMaker *a2e )
00025 : StMaker(name)
00026 {
00027
00028 mEEanalysis=a2e;
00029
00030
00031
00032 mEEmcGeom=new EEmcGeomSimple();
00033 mESmdGeom=EEmcSmdGeom::instance();
00034 mESmdMap =EEmcSmdMap::instance();
00035
00048
00049 StEEmcClusterVec_t t;
00050 std::vector< StEEmcClusterVec_t > layers;
00051 for ( Int_t i = 0; i < 4; i++ ) layers.push_back(t);
00052 for ( Int_t i = 0; i < 12; i++ ) mTowerClusters.push_back(layers);
00053
00054 StEEmcSmdClusterVec_t s;
00055 std::vector< StEEmcSmdClusterVec_t > planes;
00056 planes.push_back(s);
00057 planes.push_back(s);
00058 for ( Int_t i = 0; i < 12; i++ ) mSmdClusters.push_back(planes);
00059
00060 mSmdMatchRange = 40;
00061
00062
00063
00068 mClusterTrackSeparation[0] = 0.05;
00069 mClusterTrackSeparation[1] = 0.075;
00070 mClusterTrackSeparation[2] = 0.075;
00071 mClusterTrackSeparation[3] = 0.075;
00072 mClusterTrackSeparation[4] = 3.0;
00073 mClusterTrackSeparation[5] = 3.0;
00075 Clear();
00076
00077 }
00078
00079
00080 Int_t StEEmcGenericClusterMaker::Init()
00081 {
00082
00083
00084
00085
00086 if (!mEEanalysis) mEEanalysis=(StEEmcA2EMaker*)GetMaker("EEmcAdc2Energy");
00087 assert(mEEanalysis);
00088
00089 return StMaker::Init();
00090 }
00091
00092
00093 Int_t StEEmcGenericClusterMaker::Make()
00094 {
00095 Int_t result = StMaker::Make();
00096 makeClusterMap();
00097 makeTrackMap();
00098 makeStEvent();
00099 makeHistograms();
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 return result;
00125
00126 }
00127
00128 void StEEmcGenericClusterMaker::makeHistograms()
00129 {
00130
00131
00132 }
00133
00134 void StEEmcGenericClusterMaker::makeClusterMap()
00135 {
00136
00137
00138
00139 for ( UInt_t sec=0;sec<12;sec++ )
00140 {
00141
00142
00143 StEEmcClusterVec_t &Tclusters = mTowerClusters[sec][0];
00144 StEEmcClusterVec_t &Pclusters = mTowerClusters[sec][1];
00145 StEEmcClusterVec_t &Qclusters = mTowerClusters[sec][2];
00146 StEEmcClusterVec_t &Rclusters = mTowerClusters[sec][3];
00147 StEEmcSmdClusterVec_t &Uclusters = mSmdClusters[sec][0];
00148 StEEmcSmdClusterVec_t &Vclusters = mSmdClusters[sec][1];
00149
00150
00151 for ( UInt_t t=0;t<Tclusters.size(); t++ )
00152 {
00153
00154 StEEmcCluster &c = Tclusters[t];
00155 EEmatch *mymatch = &mClusterMap[c.key()];
00156
00157 for ( UInt_t p=0;p<Pclusters.size();p++ )
00158 if ( match(c,Pclusters[p]) ) mymatch->pre1.push_back(Pclusters[p]);
00159 for ( UInt_t q=0;q<Qclusters.size();q++ )
00160 if ( match(c,Qclusters[q]) ) mymatch->pre2.push_back(Qclusters[q]);
00161 for ( UInt_t r=0;r<Rclusters.size();r++ )
00162 if ( match(c,Rclusters[r]) ) mymatch->post.push_back(Rclusters[r]);
00163 for ( UInt_t u=0;u<Uclusters.size();u++ )
00164 if ( match(c,Uclusters[u]) ) mymatch->smdu.push_back(Uclusters[u]);
00165 for ( UInt_t v=0;v<Vclusters.size();v++ )
00166 if ( match(c,Vclusters[v]) ) mymatch->smdv.push_back(Vclusters[v]);
00167
00168
00169 for ( UInt_t p=0;p<Pclusters.size();p++ )
00170 if ( match(c,Pclusters[p]) ) c.addMatch( Pclusters[p].key(), 1 );
00171 for ( UInt_t q=0;q<Qclusters.size();q++ )
00172 if ( match(c,Qclusters[q]) ) c.addMatch( Qclusters[q].key(), 2 );
00173 for ( UInt_t r=0;r<Rclusters.size();r++ )
00174 if ( match(c,Rclusters[r]) ) c.addMatch( Rclusters[r].key(), 3 );
00175 for ( UInt_t u=0;u<Uclusters.size();u++ )
00176 if ( match(c,Uclusters[u]) ) c.addMatch( Uclusters[u].key(), 4 );
00177 for ( UInt_t v=0;v<Vclusters.size();v++ )
00178 if ( match(c,Vclusters[v]) ) c.addMatch( Vclusters[v].key(), 5 );
00179
00180 }
00181
00182 #if 0
00183
00184 for ( UInt_t i=0;i<Tclusters.size();i++ )
00185 {
00186
00187 std::cout << "sec=" << sec << " i=" << i << " ------------------------------------" << std::endl;
00188 StEEmcCluster c=Tclusters[i];
00189 c.print();
00190 Int_t k=c.key();
00191 EEmatch m=mClusterMap[k];
00192 for ( UInt_t j=0;j<m.pre1.size();j++ )
00193 m.pre1[j].print();
00194 for ( UInt_t j=0;j<m.pre2.size();j++ )
00195 m.pre2[j].print();
00196 for ( UInt_t j=0;j<m.post.size();j++ )
00197 m.post[j].print();
00198 for ( UInt_t j=0;j<m.smdu.size();j++ )
00199 m.smdu[j].printLine();
00200 for ( UInt_t j=0;j<m.smdv.size();j++ )
00201 m.smdv[j].printLine();
00202
00203 }
00204
00205 #endif
00206 #if 0
00207
00208 for ( UInt_t i=0;i<Tclusters.size();i++ )
00209 {
00210 std::cout << "sec=" << sec << " i=" << i << " ------------------------------------" << std::endl;
00211 StEEmcCluster c=Tclusters[i];
00212 c.print();
00213
00214 std::cout << "pre1 matches: ";
00215 for ( Int_t j=0;j<c.numberOfMatchingClusters(1);j++ )
00216 std::cout << c.getMatch(j,1) << " ";
00217 std::cout << std::endl;
00218
00219 std::cout << "pre2 matches: ";
00220 for ( Int_t j=0;j<c.numberOfMatchingClusters(2);j++ )
00221 std::cout << c.getMatch(j,2) << " ";
00222 std::cout << std::endl;
00223
00224
00225 std::cout << "post matches: ";
00226 for ( Int_t j=0;j<c.numberOfMatchingClusters(3);j++ )
00227 std::cout << c.getMatch(j,3) << " ";
00228 std::cout << std::endl;
00229
00230
00231 }
00232 #endif
00233
00234
00235 }
00236
00237
00238
00239
00240
00241 }
00242
00243 void StEEmcGenericClusterMaker::makeTrackMap()
00244 {
00245
00246 LOG_DEBUG << GetName() << " -I- entering makeTrackMap()" << endm;
00247
00248 StMuDstMaker *maker = (StMuDstMaker*)GetMaker("MuDst");
00249 if ( !maker )
00250 {
00251 LOG_DEBUG << GetName() << " -I- mudst maker not in chain?" << endm;
00252 return;
00253 }
00254
00255 StMuDst *mudst = maker->muDst();
00256
00257
00258
00259
00260 Int_t nprimary = (Int_t)mudst->numberOfPrimaryTracks();
00261
00262 LOG_DEBUG<<" checking nprimary="<<nprimary<< " tracks"<<endm;
00263
00264 for ( Int_t iprimary = 0; iprimary < nprimary; iprimary++ )
00265 {
00266 StMuTrack *track = mudst->primaryTracks(iprimary);
00267 if (!track)continue;
00268
00270 for ( Int_t sec=0;sec<12;sec++ )
00271 {
00272
00274 for ( Int_t layer = 0; layer < 4; layer++ )
00275 {
00276
00277 for ( Int_t ii=0;ii<numberOfClusters(sec,layer); ii++ )
00278 {
00279 StEEmcCluster mycluster = cluster(sec,layer,ii);
00280 if ( match(mycluster, track) )
00281 {
00282 LOG_DEBUG << GetName() << " -I- matched cluster to track in layer=" << layer << endm;
00283
00284
00285
00286 mClusterTrackMap[ mycluster.key() ].push_back( track );
00287 }
00288 }
00289
00290 }
00291 }
00292
00293 }
00294
00295
00296
00297
00298
00299
00300
00301 Int_t nglobal = (Int_t)mudst->numberOfGlobalTracks();
00302 for ( Int_t iglobal = 0; iglobal < nglobal; iglobal++ )
00303 {
00304 StMuTrack *track = mudst->globalTracks(iglobal);
00305 if (!track) continue;
00306
00307
00308 if (! (track->flag()==901) ) continue;
00309
00311 for ( Int_t sec=0;sec<12;sec++ )
00312 {
00313
00315 for ( Int_t layer = 0; layer < 4; layer++ )
00316 {
00317
00318 for ( Int_t ii=0;ii<numberOfClusters(sec,layer); ii++ )
00319 {
00320 StEEmcCluster mycluster = cluster(sec,layer,ii);
00321 if ( matchBackgroundTrack(mycluster, track) )
00322 {
00323 LOG_DEBUG << GetName() << " -I- matched cluster to background track in layer=" << layer << endm;
00324
00325
00326
00327 mBackgroundTrackMap[ mycluster.key() ].push_back( track );
00328 }
00329 }
00330
00331 }
00332 }
00333
00334 }
00335
00336
00337
00338 }
00339
00340
00341
00342 void StEEmcGenericClusterMaker::makeStEvent()
00343 {
00344
00345
00346
00347
00348
00349 StEvent *stevent=(StEvent*)GetInputDS("StEvent");
00350 if ( !stevent ) {
00351
00352 return;
00353 }
00354
00358 StEmcDetector *detector=stevent->emcCollection()->detector(kEndcapEmcTowerId);
00359 if ( !detector )
00360 {
00361
00362 return;
00363 }
00367 detector=stevent->emcCollection()->detector(kEndcapEmcPreShowerId);
00368 if ( !detector )
00369 {
00370
00371 return;
00372 }
00376 StDetectorId ids[]={ kEndcapSmdUStripId, kEndcapSmdVStripId };
00377
00378
00379 for ( Int_t iplane=0; iplane<2; iplane++ )
00380 {
00381
00382 detector=stevent->emcCollection()->detector(ids[iplane]);
00383 if ( !detector )
00384 {
00385
00386 return;
00387 }
00388
00389 }
00390
00391
00392 return;
00393 }
00394
00395
00396 void StEEmcGenericClusterMaker::Clear(Option_t *opts)
00397 {
00398 StMaker::Clear();
00399
00400 for ( Int_t sector=0; sector<12; sector++ ) {
00401 for ( Int_t layer=0; layer<4; layer++ )
00402 mTowerClusters[sector][layer].clear();
00403 for ( Int_t plane=0; plane<2; plane++ )
00404 mSmdClusters[sector][plane].clear();
00405 }
00406 for ( Int_t i=0;i<6;i++ ) mNumberOfClusters[i]=0;
00407
00408
00409 mClusterMap.clear();
00410 mClusterTrackMap.clear();
00411 mBackgroundTrackMap.clear();
00412
00413
00414 mClusterId = 0;
00415
00416
00417
00418
00419
00420 }
00421
00422
00423 void StEEmcGenericClusterMaker::add(const StEEmcCluster &cluster)
00424 {
00425 StEEmcCluster c = cluster;
00426 assert( c.towers().size() );
00427
00428 Int_t key = nextClusterId();
00429 Int_t sector = c.tower(0).sector();
00430 Int_t layer = c.tower(0).layer();
00431 c.key(key);
00432 mTowerClusters[sector][layer].push_back(c);
00433
00434 assert( mTowerClusters[sector][layer].back().towers().size() );
00435
00436
00437 EEmatch match;
00438 match.tower.push_back(c);
00439 mClusterMap[ key ] = match;
00440
00441
00442 std::vector< StMuTrack* > v, u;
00443 mClusterTrackMap[ key ] = v;
00444 mBackgroundTrackMap[ key ] = u;
00445
00446 mNumberOfClusters[c.tower(0).layer()]++;
00447
00448
00449 }
00450
00451
00452 Bool_t StEEmcGenericClusterMaker::match(const StEEmcCluster &c1, const StEEmcCluster &c2) const
00453 {
00454 return c1.tower(0).isNeighbor( c2.tower(0) );
00455 }
00456
00457 Bool_t StEEmcGenericClusterMaker::match(const StEEmcCluster &c1, const StEEmcSmdCluster &c2) const
00458 {
00459 StEEmcTower seed=c1.tower(0);
00460 if ( seed.sector() != c2.sector() ) return false;
00461
00462 Int_t min[2],max[2];
00463 mESmdMap -> getRangeU( seed.sector(), seed.subsector(), seed.etabin(), min[0], max[0] );
00464 mESmdMap -> getRangeV( seed.sector(), seed.subsector(), seed.etabin(), min[1], max[1] );
00465
00466 Int_t plane = c2.plane();
00467 Float_t mean = c2.mean();
00468 Int_t mid = (max[plane]+min[plane])/2;
00469 Float_t del = mean - mid;
00470
00471 return TMath::Abs(del)<mSmdMatchRange;
00472 }
00473
00474 Bool_t StEEmcGenericClusterMaker::match(const StEEmcSmdCluster &c1, const StEEmcSmdCluster &c2) const
00475 {
00476
00477 Bool_t myMatch = false;
00478 if ( ( c1.energy() > 0.8 * c2.energy() &&
00479 c1.energy() < 1.2 * c2.energy() ) ||
00480 ( c2.energy() > 0.8 * c1.energy() &&
00481 c2.energy() < 1.2 * c1.energy() ) ) myMatch = true;
00482
00483 if ( !myMatch ) return false;
00484
00485 for ( Int_t sec=0;sec<12;sec++ )
00486 for ( UInt_t i=0; i < mTowerClusters[sec][0].size(); i++ )
00487 {
00488
00489 const StEEmcCluster &c=mTowerClusters[sec][0][i];
00490 if ( match ( c, c1 ) && match( c, c2 ) ) return true;
00491
00492 }
00493
00494 return false;
00495
00496 }
00497
00498 Bool_t StEEmcGenericClusterMaker::match(const StEEmcCluster &cluster, const StMuTrack *track) const
00499 {
00500
00501 const StPhysicalHelixD helix = track -> outerHelix();
00502 const Float_t match_at_z[]={
00503 kEEmcZSMD,
00504 kEEmcZPRE1,
00505 kEEmcZPRE2,
00506 kEEmcZPOST
00507 };
00508
00509 Int_t layer = cluster.tower(0).layer();
00510
00511 TVector3 r(0.,0.,-1.);
00512 if ( extrapolateToZ( helix, match_at_z[ layer ], r ) )
00513 {
00514 TVector3 position = cluster.position();
00515 Float_t dphi = fmod( position.Phi() - r.Phi(), TMath::TwoPi() );
00516 Float_t deta = position.Eta() - r.Eta();
00517 Float_t dr=TMath::Sqrt(deta*deta+dphi*dphi);
00518
00519 if ( dr < mClusterTrackSeparation[layer] ) return true;
00520
00521 }
00522
00523 return false;
00524
00525 }
00526
00527 Bool_t StEEmcGenericClusterMaker::extrapolateToZ( const StPhysicalHelixD &helix, const double z, TVector3 &r) const
00528 {
00529 const double kMinDipAngle = 1.0e-13;
00530 double dipAng = helix.dipAngle();
00531 double z0 = helix.origin().z();
00532 if(dipAng<kMinDipAngle)
00533 return kFALSE;
00534 double s = ( z - z0 ) / sin(dipAng) ;
00535 StThreeVectorD hit = helix.at(s);
00536 r.SetXYZ(hit.x(),hit.y(),hit.z());
00537 return kTRUE;
00538 }
00539
00540
00541 Bool_t StEEmcGenericClusterMaker::matchBackgroundTrack(const StEEmcCluster &cluster, const StMuTrack *track ) const
00542 {
00543
00544
00545
00546
00547
00548 StPhysicalHelixD outer = track -> outerHelix();
00549 StPhysicalHelixD inner = track -> helix();
00550 StThreeVectorD p1 = inner.origin();
00551 StThreeVectorD p2 = outer.origin();
00552
00553 Int_t layer = cluster.tower(0).layer();
00554
00555 Double_t z1 = p1.z();
00556 Double_t z2 = p2.z();
00557
00558 if ( z2 <= z1 ) return false;
00559
00560 const Float_t match_at_z[]={
00561 kEEmcZSMD,
00562 kEEmcZPRE1,
00563 kEEmcZPRE2,
00564 kEEmcZPOST
00565 };
00566
00567 Double_t zmatch = match_at_z[ layer ];
00568
00569
00570
00571
00572
00573 Double_t scale = zmatch - z1;
00574 scale /= z2 - z1;
00575
00576 StThreeVectorD myposition = p1 + scale * (p2 - p1);
00577
00578
00579 TVector3 r(myposition.x(),myposition.y(),myposition.z());
00580 TVector3 position = cluster.position();
00581
00582 Float_t dphi = fmod( position.Phi() - r.Phi(), TMath::TwoPi() );
00583 Float_t deta = position.Eta() - r.Eta();
00584 Float_t dr=TMath::Sqrt(deta*deta+dphi*dphi);
00585
00586 if ( dr < mClusterTrackSeparation[layer] ) return true;
00587
00588 return false;
00589
00590 }
00591
00592
00593
00594 Int_t StEEmcGenericClusterMaker::numberOfMatchingSmdClusters(const StEEmcCluster &cluster, Int_t plane ) const
00595 {
00596 const EEmatch &matches = clusterMatch( cluster );
00597 return (plane==0)? (Int_t)matches.smdu.size() : (Int_t)matches.smdv.size();
00598 }
00599
00600 StEEmcSmdCluster &StEEmcGenericClusterMaker::matchingSmdCluster (const StEEmcCluster &cluster, Int_t plane, Int_t index )
00601 {
00602 EEmatch &matches = clusterMatch( cluster );
00603 return (plane==0)? matches.smdu[index] : matches.smdv[index];
00604 }
00605
00606 const StEEmcSmdCluster &StEEmcGenericClusterMaker::matchingSmdCluster (const StEEmcCluster &cluster, Int_t plane, Int_t index ) const
00607 {
00608 const EEmatch &matches = clusterMatch( cluster );
00609 return (plane==0)? matches.smdu[index] : matches.smdv[index];
00610 }
00611
00612