00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #ifndef StHbtThreeParticleAnalysis_hh
00045 #define StHbtThreeParticleAnalysis_hh
00046
00047 #include "StHbtMaker/Base/StHbtBaseAnalysis.h"
00048 #include "StHbtMaker/Base/StHbtTripletCut.h"
00049 #include "StHbtMaker/Base/StHbtEventCut.h"
00050 #include "StHbtMaker/Base/StHbtParticleCut.h"
00051 #include "StHbtMaker/Base/StHbtCorrFctn.hh"
00052 #include "StHbtMaker/Infrastructure/StHbtCorrFctnCollection.hh"
00053 #include "StHbtMaker/Infrastructure/StHbtPicoEventCollection.hh"
00054 #include "StHbtMaker/Infrastructure/StHbtSectoredPicoEventCollection.hh"
00055
00056 class StHbtThreeParticleAnalysis : public StHbtBaseAnalysis {
00057
00058 public:
00059
00060 StHbtThreeParticleAnalysis();
00061 virtual ~StHbtThreeParticleAnalysis();
00062
00063 int CreateRealTriplets(StHbtSectoredPicoEvent*, int Index1);
00064 int CreateRealTriplets(StHbtSectoredPicoEvent*, int Index1, int Index2);
00065 int CreateRealTriplets(StHbtSectoredPicoEvent*, int Index1, int Index2, int Index3);
00066 int CalculateCosPhi(StHbtSectoredPicoEvent*, int Index1);
00067 int CalculateCosPhi(StHbtSectoredPicoEvent*, int Index1, int Index2);
00068 int CalculateCosPhi(StHbtSectoredPicoEvent*, int Index1, int Index2, int Index3);
00069 int CreateMixedTriplets(StHbtParticleCollection*, StHbtParticleCollection*, StHbtParticleCollection*);
00070 void SortHbtParticleCollection(StHbtParticleCut*, StHbtEvent*, StHbtParticleCollection**);
00071 int Index(int, int, int);
00072
00073
00074
00075 StHbt1DHisto* Q2CF();
00076 StHbt1DHisto* Q3CF();
00077 StHbt1DHisto* CosPhi();
00078 StHbt1DHisto* CosPhiN();
00079 bool CalcCosPhi();
00080 bool IsSectoring();
00081
00082 virtual StHbtTripletCut* TripletCut();
00083 virtual StHbtEventCut* EventCut();
00084 virtual StHbtParticleCut* FirstParticleCut();
00085 virtual StHbtParticleCut* SecondParticleCut();
00086 virtual StHbtParticleCut* ThirdParticleCut();
00087
00088 StHbtCorrFctnCollection* CorrFctnCollection();
00089 virtual StHbtCorrFctn* CorrFctn(int n);
00090 void AddCorrFctn(StHbtCorrFctn*);
00091 void AddEventProcessed();
00092
00093 void SetTripletCut(StHbtTripletCut*);
00094 void SetEventCut(StHbtEventCut*);
00095 void SetFirstParticleCut(StHbtParticleCut*);
00096 void SetSecondParticleCut(StHbtParticleCut*);
00097 void SetThirdParticleCut(StHbtParticleCut*);
00098 void SetQ2CF(StHbt1DHisto*);
00099 void SetQ3CF(StHbt1DHisto*);
00100 void SetCosPhi(StHbt1DHisto*);
00101 void SetCosPhiN(StHbt1DHisto*);
00102 void SetCalcCosPhi(const char*);
00103 void SetSectoring(bool);
00104 void SetNormFactor(const double);
00105
00106 int NumBinsX();
00107 int NumBinsY();
00108 int NumBinsZ();
00109 float PXmax();
00110 float PXmin();
00111 float PYmax();
00112 float PYmin();
00113 float PZmax();
00114 float PZmin();
00115 float DeltaP();
00116
00117 void SetPXmax(float);
00118 void SetPXmin(float);
00119 void SetPYmax(float);
00120 void SetPYmin(float);
00121 void SetPZmax(float);
00122 void SetPZmin(float);
00123 void SetDeltaP(float);
00124
00125 unsigned int NumEventsToMix();
00126 void SetNumEventsToMix(const unsigned int&);
00127 StHbtPicoEventCollection* MixingBuffer();
00128 bool MixingBufferFull();
00129 StHbtSectoredPicoEventCollection* SectoredMixingBuffer();
00130 bool SectoredMixingBufferFull();
00131
00132 bool AnalyzeIdenticalParticles();
00133 virtual StHbtString Report();
00134
00135 virtual void ProcessEvent(const StHbtEvent*);
00136 void EventBegin(const StHbtEvent*);
00137 void EventEnd(const StHbtEvent*);
00138 int GetNeventsProcessed();
00139
00140 virtual void Finish();
00141
00142
00143 protected:
00144 unsigned int mNumEventsToMix;
00145 unsigned int mNeventsProcessed;
00146 StHbtTripletCut* mTripletCut;
00147 StHbtCorrFctnCollection* mCorrFctnCollection;
00148 StHbtEventCut* mEventCut;
00149 StHbtParticleCut* mFirstParticleCut;
00150 StHbtParticleCut* mSecondParticleCut;
00151 StHbtParticleCut* mThirdParticleCut;
00152 StHbtPicoEventCollection* mMixingBuffer;
00153 StHbtSectoredPicoEventCollection* mSectoredMixingBuffer;
00154
00155 float mPXmax;
00156 float mPXmin;
00157 float mPYmax;
00158 float mPYmin;
00159 float mPZmax;
00160 float mPZmin;
00161 float mDeltaP;
00162 int mNumBinsX;
00163 int mNumBinsY;
00164 int mNumBinsZ;
00165
00166 double mNormFactor;
00167
00168 StHbt1DHisto* mQ2CF;
00169 StHbt1DHisto* mQ3CF;
00170 StHbt1DHisto* mCosPhi;
00171 StHbt1DHisto* mCosPhiN;
00172 StHbt1DHisto* mCosPhiE;
00173 bool mCalcCosPhi;
00174 bool mIsSectoring;
00175 char mSaveFile[100];
00176
00177 #ifdef __ROOT__
00178 ClassDef(StHbtThreeParticleAnalysis, 0)
00179 #endif
00180
00181 };
00182
00183
00184 inline StHbtTripletCut* StHbtThreeParticleAnalysis::TripletCut() {return mTripletCut;}
00185 inline StHbtEventCut* StHbtThreeParticleAnalysis::EventCut() {return mEventCut;}
00186 inline StHbtParticleCut* StHbtThreeParticleAnalysis::FirstParticleCut() {return mFirstParticleCut;}
00187 inline StHbtParticleCut* StHbtThreeParticleAnalysis::SecondParticleCut() {return mSecondParticleCut;}
00188 inline StHbtParticleCut* StHbtThreeParticleAnalysis::ThirdParticleCut() {return mThirdParticleCut;}
00189 inline StHbtCorrFctnCollection* StHbtThreeParticleAnalysis::CorrFctnCollection() {return mCorrFctnCollection;}
00190 inline unsigned int StHbtThreeParticleAnalysis::NumEventsToMix(){return mNumEventsToMix;}
00191
00192 inline StHbt1DHisto* StHbtThreeParticleAnalysis::Q2CF() {return mQ2CF;}
00193 inline StHbt1DHisto* StHbtThreeParticleAnalysis::Q3CF() {return mQ3CF;}
00194 inline StHbt1DHisto* StHbtThreeParticleAnalysis::CosPhi() {return mCosPhi;}
00195 inline StHbt1DHisto* StHbtThreeParticleAnalysis::CosPhiN() {return mCosPhiN;}
00196 inline bool StHbtThreeParticleAnalysis::CalcCosPhi() {return mCalcCosPhi;}
00197 inline bool StHbtThreeParticleAnalysis::IsSectoring() {return mIsSectoring;}
00198
00199 inline StHbtPicoEventCollection* StHbtThreeParticleAnalysis::MixingBuffer() {return mMixingBuffer;}
00200 inline StHbtSectoredPicoEventCollection* StHbtThreeParticleAnalysis::SectoredMixingBuffer() {return mSectoredMixingBuffer;}
00201
00202 inline float StHbtThreeParticleAnalysis::PXmax() {return mPXmax;}
00203 inline float StHbtThreeParticleAnalysis::PXmin() {return mPXmin;}
00204 inline float StHbtThreeParticleAnalysis::PYmax() {return mPYmax;}
00205 inline float StHbtThreeParticleAnalysis::PYmin() {return mPYmin;}
00206 inline float StHbtThreeParticleAnalysis::PZmax() {return mPZmax;}
00207 inline float StHbtThreeParticleAnalysis::PZmin() {return mPZmin;}
00208 inline float StHbtThreeParticleAnalysis::DeltaP() {return mDeltaP;}
00209 inline int StHbtThreeParticleAnalysis::NumBinsX() {return mNumBinsX;}
00210 inline int StHbtThreeParticleAnalysis::NumBinsY() {return mNumBinsY;}
00211 inline int StHbtThreeParticleAnalysis::NumBinsZ() {return mNumBinsZ;}
00212
00213
00214 inline bool StHbtThreeParticleAnalysis::AnalyzeIdenticalParticles(){return ((mFirstParticleCut==mSecondParticleCut) && (mSecondParticleCut==mThirdParticleCut));}
00215 inline void StHbtThreeParticleAnalysis::SetTripletCut(StHbtTripletCut* x) { mTripletCut = x; x->SetAnalysis((StHbtBaseAnalysis*)this);}
00216 inline void StHbtThreeParticleAnalysis::AddCorrFctn(StHbtCorrFctn* cf) {mCorrFctnCollection->push_back(cf); cf->SetAnalysis((StHbtBaseAnalysis*)this);}
00217 inline void StHbtThreeParticleAnalysis::SetEventCut(StHbtEventCut* x) {mEventCut = x; x->SetAnalysis((StHbtBaseAnalysis*)this);}
00218 inline void StHbtThreeParticleAnalysis::SetFirstParticleCut(StHbtParticleCut* x) {mFirstParticleCut = x; x->SetAnalysis((StHbtBaseAnalysis*)this);}
00219 inline void StHbtThreeParticleAnalysis::SetSecondParticleCut(StHbtParticleCut* x) {mSecondParticleCut = x; x->SetAnalysis((StHbtBaseAnalysis*)this);}
00220 inline void StHbtThreeParticleAnalysis::SetThirdParticleCut(StHbtParticleCut* x) {mThirdParticleCut = x; }
00221
00222 inline void StHbtThreeParticleAnalysis::SetQ2CF(StHbt1DHisto* x) {mQ2CF = x;}
00223 inline void StHbtThreeParticleAnalysis::SetQ3CF(StHbt1DHisto* x) {mQ3CF = x;}
00224 inline void StHbtThreeParticleAnalysis::SetCosPhi(StHbt1DHisto* x) {mCosPhi = x;}
00225 inline void StHbtThreeParticleAnalysis::SetCosPhiN(StHbt1DHisto* x) {mCosPhiN = x;}
00226 inline void StHbtThreeParticleAnalysis::SetNormFactor(const double x) {mNormFactor = x;}
00227
00228 inline void StHbtThreeParticleAnalysis::SetCalcCosPhi(const char* x)
00229 {
00230 mCalcCosPhi = true;
00231
00232 sprintf(mSaveFile, "%s", x);
00233
00234 mCosPhiE = new StHbt1DHisto("CosPhiE", "Error Histo", mCosPhi->GetNbinsX(), mCosPhi->GetXaxis()->GetBinUpEdge(0), mCosPhi->GetXaxis()->GetBinUpEdge(mCosPhi->GetNbinsX()));
00235 }
00236
00237 inline void StHbtThreeParticleAnalysis::SetNumEventsToMix(const unsigned int& nmix){ mNumEventsToMix = nmix;}
00238 inline bool StHbtThreeParticleAnalysis::MixingBufferFull(){return (mMixingBuffer->size() >= mNumEventsToMix);}
00239 inline bool StHbtThreeParticleAnalysis::SectoredMixingBufferFull(){return (mSectoredMixingBuffer->size() >= NumEventsToMix());}
00240 inline int StHbtThreeParticleAnalysis::GetNeventsProcessed() {return mNeventsProcessed;}
00241
00242 inline void StHbtThreeParticleAnalysis::SetSectoring(bool x) {mIsSectoring = x;}
00243 inline void StHbtThreeParticleAnalysis::SetPXmax(float x) {
00244 mPXmax = x;
00245 if (mPXmax<mPXmin) mNumBinsX=0;
00246 else mNumBinsX = (int)ceil((mPXmax-mPXmin)/mDeltaP);
00247 }
00248 inline void StHbtThreeParticleAnalysis::SetPXmin(float x) {
00249 mPXmin = x;
00250 if (mPXmax<mPXmin) mNumBinsX=0;
00251 else mNumBinsX = (int)ceil((mPXmax-mPXmin)/mDeltaP);
00252 }
00253 inline void StHbtThreeParticleAnalysis::SetPYmax(float x) {
00254 mPYmax = x;
00255 if (mPYmax<mPYmin) mNumBinsY=0;
00256 else mNumBinsY = (int)ceil((mPYmax-mPYmin)/mDeltaP);
00257 }
00258 inline void StHbtThreeParticleAnalysis::SetPYmin(float x) {
00259 mPYmin = x;
00260 if (mPYmax<mPYmin) mNumBinsY=0;
00261 else mNumBinsY = (int)ceil((mPYmax-mPYmin)/mDeltaP);
00262 }
00263 inline void StHbtThreeParticleAnalysis::SetPZmax(float x) {
00264 mPZmax = x;
00265 if (mPZmax<mPZmin) mNumBinsZ=0;
00266 else mNumBinsZ = (int)ceil((mPZmax-mPZmin)/mDeltaP);
00267 }
00268 inline void StHbtThreeParticleAnalysis::SetPZmin(float x) {
00269 mPZmin = x;
00270 if (mPZmax<mPZmin) mNumBinsZ=0;
00271 else mNumBinsZ = (int)ceil((mPZmax-mPZmin)/mDeltaP);
00272 }
00273 inline void StHbtThreeParticleAnalysis::SetDeltaP(float x) {
00274 if (x<=0) {
00275 mDeltaP = 1.0;
00276 cout << "****ERROR**** DeltaP must be greater than zero...setting DeltaP to 1.0" << endl;
00277 }
00278 else {
00279 mDeltaP = x;
00280 mNumBinsX = (int)ceil((mPXmax-mPXmin)/mDeltaP);
00281 mNumBinsY = (int)ceil((mPYmax-mPYmin)/mDeltaP);
00282 mNumBinsZ = (int)ceil((mPZmax-mPZmin)/mDeltaP);
00283 }
00284 }
00285
00286 #endif