00001
00017 #include "StEEmcSmdCluster.h"
00018 #include <TMath.h>
00019 #include <TH1F.h>
00020
00021 #include "StEvent/StEmcCluster.h"
00022
00023 ClassImp(StEEmcSmdCluster);
00024
00025
00026 StEEmcSmdCluster::StEEmcSmdCluster() : StEEmcBaseCluster()
00027 {
00028 mEnergy=0.;
00029 mSumXW=0.;
00030 mSumX2W=0.;
00031 mEmcCluster = 0;
00032 mLeft=999;
00033 mRight=-999;
00034 }
00035
00036
00037 StEEmcSmdCluster::StEEmcSmdCluster( const StEEmcSmdCluster &c ) : StEEmcBaseCluster()
00038 {
00039 mStrips=c.mStrips;
00040 mWeights=c.mWeights;
00041 mEnergy=c.mEnergy;
00042 mSumXW=c.mSumXW;
00043 mSumX2W=c.mSumX2W;
00044 mMean=c.mMean;
00045 mSigma=c.mSigma;
00046 mSize=c.mSize;
00047 mKey=c.mKey;
00048 mMatchedTowers=c.mMatchedTowers;
00049 mEmcCluster=c.mEmcCluster;
00050 mPlane=c.mPlane;
00051 mSector=c.mSector;
00052 }
00053
00054
00055 void StEEmcSmdCluster::print(Option_t *opts) const
00056 {
00057 const Char_t *names[]={"u","v"};
00058 std::cout << "smd cluster plane=" << names[plane()] << std::endl;
00059 std::cout << "key = " << key() << std::endl;
00060 std::cout << "energy= " << energy() << std::endl;
00061 std::cout << "mean = " << mean() << std::endl;
00062 if ( TString(opts).Contains("all") ) {
00063 for ( UInt_t ii=0;ii<mStrips.size();ii++ )
00064 {
00065 mStrips[ii].print();
00066 std::cout <<" w=" << mWeights[ii] << std::endl;
00067 }
00068 }
00069 }
00070
00071
00072 void StEEmcSmdCluster::printLine(Bool_t endline) const
00073 {
00074 std::cout << strip(0).name() << " "
00075 << energy() << " "
00076 << mStrips.size() << " "
00077 << mean() << " "
00078 << sigma();
00079 if ( endline ) std::cout << std::endl;
00080 }
00081
00082
00083 void StEEmcSmdCluster::copy( TH1F *h ) const
00084 {
00085 for ( UInt_t ii=0;ii<mStrips.size();ii++ )
00086 h->AddBinContent( mStrips[ii].index()+1, mStrips[ii].energy()*1000.*mWeights[ii] );
00087 }
00088
00089
00090 void StEEmcSmdCluster::add(const StEEmcStripVec_t &strips)
00091 {
00092 for ( UInt_t ii=0;ii<strips.size();ii++ ) add( strips[ii] );
00093 }
00094
00095
00096 void StEEmcSmdCluster::add(const StEEmcStrip &strip, Float_t weight)
00097 {
00098
00099 if ( mStrips.size() == 0 )
00100 {
00101 mPlane=strip.plane();
00102 mSector=strip.sector();
00103 }
00104
00105 mWeights.push_back(weight);
00106 mStrips.push_back(strip);
00107
00108 Float_t energy = strip.energy() * weight;
00109
00110 mEnergy += energy;
00111 mSumXW += ( strip.index() + 0.5 ) * energy;
00112 mSumX2W += ( strip.index() + 0.5 ) * ( strip.index() + 0.5 ) * energy;
00113
00114 mMean = mSumXW / mEnergy;
00115 mSigma = mSumX2W / mEnergy - mMean*mMean;
00116 mSigma = TMath::Sqrt(mSigma);
00117
00118 mSize=(Int_t)mStrips.size();
00119 mNumberOfElements=mSize;
00120
00121 if ( strip.index()<=mLeft ) mLeft=strip.index()-1;
00122 if ( strip.index()>=mRight ) mRight=strip.index()+1;
00123
00124 }
00125
00126
00127 StEmcCluster *StEEmcSmdCluster::stemc()
00128 {
00129
00130 if ( mEmcCluster ) return mEmcCluster;
00131
00132 mEmcCluster=new StEmcCluster();
00133 Int_t iuv=( mStrips[0].plane()==1 );
00134
00135 if ( iuv==0 ) {
00136 mEmcCluster->setEta( mean() );
00137 mEmcCluster->setSigmaEta( sigma() );
00138 mEmcCluster->setPhi( -1. );
00139 mEmcCluster->setSigmaPhi( -1. );
00140 }
00141 else {
00142 mEmcCluster->setEta( -1. );
00143 mEmcCluster->setSigmaEta( -1. );
00144 mEmcCluster->setPhi( mean() );
00145 mEmcCluster->setSigmaPhi( sigma() );
00146 }
00147 mEmcCluster->setEnergy( energy() );
00148
00149 for ( Int_t i=0; i<numberOfStrips(); i++ ) {
00150 StEmcRawHit *hit=mStrips[i].stemc();
00151 if (hit) mEmcCluster->addHit( hit );
00152 }
00153
00154 return mEmcCluster;
00155
00156 }
00157
00158
00159 Float_t StEEmcSmdCluster::energy(Int_t nmax, Option_t *opts) const
00160 {
00161
00162 Float_t mymean;
00163 if ( TString(opts).Contains("seed") )
00164 {
00165 mymean=mStrips[0].index()+0.5;
00166 }
00167 else
00168 {
00169 mymean=mean();
00170 }
00171 Int_t min=(Int_t)(mymean-(Float_t)nmax);
00172 Int_t max=(Int_t)(mymean+(Float_t)nmax);
00173
00174 Float_t esum=0.;
00175
00176 for ( UInt_t i=0;i<mStrips.size();i++ )
00177 {
00178 const StEEmcStrip &s=mStrips[i];
00179 if ( s.index() >= min && s.index() <= max ) esum+=s.energy();
00180 }
00181
00182 return esum;
00183
00184 }
00185
00186
00187 Float_t StEEmcSmdCluster::sigma(Int_t nmax, Option_t *opts) const
00188 {
00189
00190 Float_t mymean;
00191 if ( TString(opts).Contains("seed") )
00192 {
00193 mymean=mStrips[0].index()+0.5;
00194 }
00195 else
00196 {
00197 mymean=mean();
00198 }
00199 Int_t min=(Int_t)(mymean-(Float_t)nmax);
00200 Int_t max=(Int_t)(mymean+(Float_t)nmax);
00201
00202 std::cout << "mymean=" << mymean << std::endl;
00203 std::cout << "min =" << min << std::endl;
00204 std::cout << "max =" << max << std::endl;
00205
00206 Float_t esum=0.;
00207 Float_t xsum=0.;
00208 Float_t x2sum=0.;
00209
00210 for ( UInt_t i=0;i<mStrips.size();i++ )
00211 {
00212 const StEEmcStrip &s=mStrips[i];
00213 std::cout << i << " " << s.index() << std::endl;
00214 if ( s.index() >= min && s.index() <= max ) {
00215 esum+=s.energy();
00216 xsum+=(s.index()+0.5)*s.energy();
00217 x2sum+=(s.index()+0.5)*(s.index()+0.5)*s.energy();
00218 }
00219 }
00220 Float_t sig=0.;
00221 if ( esum>0. )
00222 {
00223 sig=TMath::Sqrt( x2sum/esum - (xsum/esum)*(xsum/esum) );
00224 }
00225
00226
00227 return sig;
00228
00229 }
00230
00231
00232 ostream& operator<<(ostream &out, const StEEmcSmdCluster &c)
00233 {
00234 out << "seed="
00235 << c.strip(0).name() << " "
00236 << "key="
00237 << c.key() << " "
00238 << c.energy() << " "
00239 << c.size() << " "
00240 << c.mean() << " "
00241 << c.sigma();
00242 return out;
00243 }