00001 #ifndef __StEEmcGenericClusterMaker_h__
00002 #define __StEEmcGenericClusterMaker_h__
00003
00067 #include "StMaker.h"
00068 #include "StEEmcCluster.h"
00069 #include "StEEmcSmdCluster.h"
00070
00071 class TH1F;
00072 class TH2F;
00073 class StEEmcA2EMaker;
00074
00075 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00076 #include "StEEmcUtil/StEEmcSmd/EEmcSmdGeom.h"
00077 #include "StEEmcUtil/EEmcSmdMap/EEmcSmdMap.h"
00078
00079 #include <map>
00080
00081 #include "TRefArray.h"
00082 #include "TClonesArray.h"
00083
00084 class TH1F;
00085 class TH2F;
00086
00087
00088
00089 class StMuTrack;
00090 #include "StarClassLibrary/StPhysicalHelixD.hh"
00091
00092 class StEEmcGenericClusterMaker : public StMaker
00093 {
00094 public:
00095
00096 StEEmcGenericClusterMaker( const Char_t *name, const StEEmcA2EMaker *a2e=NULL );
00097 virtual ~StEEmcGenericClusterMaker(){ }
00098
00099 virtual Int_t Init();
00100
00101 virtual Int_t Make();
00102
00103 void makeHistograms();
00104 void makeClusterMap();
00105 void makeStEvent();
00106 void makeTrackMap();
00107
00108 virtual void Clear(Option_t *opts="");
00109
00111 void add(const StEEmcCluster &cluster);
00112
00114 void add(const StEEmcSmdCluster &cluster) {
00115 StEEmcSmdCluster c = cluster;
00116 c.key(nextClusterId());
00117 mSmdClusters[ c.sector() ][ c.plane() ].push_back( c );
00118 mNumberOfClusters[c.strip(0).plane()+4]++;
00119 }
00120
00123 void remove(const StEEmcCluster &cluster){ }
00124
00126 void remove(const StEEmcSmdCluster &cluster){ }
00127
00129 StEEmcClusterVec_t &clusters( Int_t sec, Int_t layer ) { return mTowerClusters[sec][layer]; }
00130 const StEEmcClusterVec_t &clusters( Int_t sec, Int_t layer ) const { return mTowerClusters[sec][layer]; }
00131
00133 StEEmcSmdClusterVec_t &smdclusters( Int_t sec, Int_t plane ) { return mSmdClusters[sec][plane]; }
00134 const StEEmcSmdClusterVec_t &smdclusters( Int_t sec, Int_t plane ) const { return mSmdClusters[sec][plane]; }
00135
00140 StEEmcCluster &cluster(Int_t sector, Int_t layer, Int_t index) { return mTowerClusters[sector][layer][index]; }
00141 const StEEmcCluster &cluster(Int_t sector, Int_t layer, Int_t index) const { return mTowerClusters[sector][layer][index]; }
00142
00147 StEEmcSmdCluster &smdcluster(Int_t sector, Int_t plane, Int_t index) { if ( plane < 2 ) return mSmdClusters[sector][plane][index]; else assert(0); }
00148 const StEEmcSmdCluster &smdcluster(Int_t sector, Int_t plane, Int_t index) const { if ( plane < 2 ) return mSmdClusters[sector][plane][index]; else assert(0); }
00149
00152 Int_t numberOfTracks(const StEEmcCluster &cluster) const { return (Int_t)(*(mClusterTrackMap.find(cluster.key()))).second.size(); }
00153 Int_t numberOfBackgroundTracks(const StEEmcCluster &cluster) const { return (Int_t)(*(mBackgroundTrackMap.find(cluster.key()))).second.size(); }
00154
00159 StMuTrack *track(const StEEmcCluster &cluster, Int_t index) const { return (*(mClusterTrackMap.find(cluster.key()))).second[index]; }
00160 StMuTrack *backgroundTrack(const StEEmcCluster &cluster, Int_t index) const { return (*(mBackgroundTrackMap.find(cluster.key()))).second[index]; }
00161
00165 Int_t numberOfClusters(Int_t sector, Int_t layer) const{
00166 if ( layer < 4 )
00167 return (Int_t)mTowerClusters[ sector ][ layer ].size();
00168 else if ( layer < 6 )
00169 return (Int_t)mSmdClusters[ sector ][ layer-4 ].size();
00170 else
00171 return -1;
00172 }
00174 Int_t numberOfClusters(Int_t layer) const{ return mNumberOfClusters[layer]; }
00176 Int_t numberOfClusters() const { return mClusterId; }
00177
00180 struct EEmatch
00181 {
00182 StEEmcClusterVec_t tower;
00183 StEEmcClusterVec_t pre1;
00184 StEEmcClusterVec_t pre2;
00185 StEEmcClusterVec_t post;
00186 StEEmcSmdClusterVec_t smdu;
00187 StEEmcSmdClusterVec_t smdv;
00188 StEEmcStripVec_t ustrips;
00189 StEEmcStripVec_t vstrips;
00190 };
00191
00194 EEmatch &clusterMatch(const StEEmcCluster &c) { return mClusterMap[ c.key() ]; }
00195 const EEmatch &clusterMatch(const StEEmcCluster &c) const { return (*(mClusterMap.find(c.key()))).second; }
00196
00198 Int_t lastClusterId() const { return mClusterId; }
00199
00203 Int_t numberOfMatchingSmdClusters(const StEEmcCluster &cluster, Int_t plane ) const;
00204
00209 StEEmcSmdCluster &matchingSmdCluster (const StEEmcCluster &cluster, Int_t plane, Int_t index );
00210 const StEEmcSmdCluster &matchingSmdCluster (const StEEmcCluster &cluster, Int_t plane, Int_t index ) const;
00211
00214 void setTrackMatching( Float_t distance, Int_t layer ){ mClusterTrackSeparation[layer] = distance; }
00215
00217 Bool_t extrapolateToZ( const StPhysicalHelixD &helix, const double z, TVector3 &r) const;
00218
00222 void buildHistograms(const StEEmcCluster &cluster);
00223
00227 Int_t nextClusterId() { return mClusterId++; }
00228 Int_t maxClusterId() const { return mClusterId; }
00229
00230 virtual const char* GetCVS() const
00231 {static const char cvs[]="Tag $Name: $ $Id: StEEmcGenericClusterMaker.h,v 1.7 2010/08/26 22:49:25 ogrebeny Exp $ built "__DATE__" "__TIME__; return cvs;}
00232
00233 protected:
00234
00235
00236 const StEEmcA2EMaker *mEEanalysis;
00237
00238
00239
00240
00241 Int_t mClusterId;
00242
00243
00244
00245
00246 std::vector< std::vector< StEEmcClusterVec_t > > mTowerClusters;
00247
00248
00249
00250 std::vector< std::vector< StEEmcSmdClusterVec_t > > mSmdClusters;
00251
00252
00253 Int_t mNumberOfClusters[6];
00254
00255
00256 const EEmcGeomSimple *mEEmcGeom;
00257 const EEmcSmdGeom *mESmdGeom;
00258 const EEmcSmdMap *mESmdMap;
00259
00261 virtual Int_t buildTowerClusters(){ return kStOK; }
00263 virtual Int_t buildPreshowerClusters(){ return kStOK; }
00265 virtual Int_t buildPostshowerClusters(){ return kStOK; }
00267 virtual Int_t buildSmdClusters(){ return kStOK; }
00268
00273 Bool_t match(const StEEmcCluster &c1, const StEEmcCluster &c2 ) const;
00274 Bool_t match(const StEEmcCluster &c1, const StEEmcSmdCluster &c2 ) const;
00275 Bool_t match(const StEEmcSmdCluster &c1, const StEEmcSmdCluster &c2 ) const;
00276
00277 Bool_t match(const StEEmcCluster &c1, const StMuTrack *track ) const;
00278 Bool_t match(const StEEmcSmdCluster &c1, const StMuTrack *track ) const { return false; }
00279
00280 Bool_t matchBackgroundTrack(const StEEmcCluster &c1, const StMuTrack *track) const;
00281
00282 Int_t mSmdMatchRange;
00283
00284
00285
00286
00287
00288
00289 std::map< Int_t, EEmatch > mClusterMap;
00290
00291
00292
00293 std::map< Int_t, std::vector< StMuTrack* > > mClusterTrackMap;
00294 std::map< Int_t, std::vector< StMuTrack* > > mBackgroundTrackMap;
00295
00296
00297
00298 std::map< Int_t, EEmatch > mTrackClusterMap;
00299
00300
00301
00302 Float_t mClusterTrackSeparation[6];
00303
00304 ClassDef(StEEmcGenericClusterMaker,1);
00305 };
00306
00307 #endif