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 #include "StHbtMaker/Infrastructure/StHbtThreeParticleAnalysis.h"
00043 #include "StHbtMaker/Infrastructure/StHbtParticleCollection.hh"
00044 #include "StHbtMaker/Base/StHbtTrackCut.h"
00045 #include "StHbtMaker/Base/StHbtV0Cut.h"
00046 #include "TFile.h"
00047
00048 #ifdef __ROOT__
00049 ClassImp(StHbtThreeParticleAnalysis)
00050 #endif
00051
00052
00053 int Factorial(int arg) {
00054 int fact=1;
00055 for (int i=arg; i>0; i--) fact*=i;
00056 return fact;
00057 }
00058
00059
00060 int StHbtThreeParticleAnalysis::Index(int binx, int biny, int binz)
00061 {
00062 if (binx==-1 || binx==mNumBinsX || biny==-1 || biny==mNumBinsY || binz==-1 || binz==mNumBinsZ)
00063 return -1;
00064 return binx + biny*mNumBinsX + binz*mNumBinsX*mNumBinsY;
00065 }
00066
00067
00068
00069
00070
00071
00072 void StHbtThreeParticleAnalysis::SortHbtParticleCollection(StHbtParticleCut* partCut,
00073 StHbtEvent* hbtEvent,
00074 StHbtParticleCollection** SectoredPicoEvent)
00075 {
00076 int i,j,k;
00077 switch (partCut->Type()) {
00078 case hbtTrack:
00079 {
00080 StHbtTrackCut* pCut = (StHbtTrackCut*) partCut;
00081 StHbtTrack* pParticle;
00082 StHbtTrackIterator pIter;
00083 StHbtTrackIterator startLoop = hbtEvent->TrackCollection()->begin();
00084 StHbtTrackIterator endLoop = hbtEvent->TrackCollection()->end();
00085 float pxave=0.0, pyave=0.0, pzave=0.0, pxhigh=0.0, pxlow=0.0, pyhigh=0.0, pylow=0.0, pzhigh=0.0, pzlow=0.0;
00086 int num=0;
00087
00088 for (pIter=startLoop;pIter!=endLoop;pIter++){
00089 pParticle = *pIter;
00090 bool tmpPassParticle = pCut->Pass(pParticle);
00091 pCut->FillCutMonitor(pParticle, tmpPassParticle);
00092 if (tmpPassParticle){
00093 StHbtParticle* particle = new StHbtParticle(pParticle,pCut->Mass());
00094 i = (int) floor((particle->FourMomentum().px()-mPXmin)/mDeltaP);
00095 j = (int) floor((particle->FourMomentum().py()-mPYmin)/mDeltaP);
00096 k = (int) floor((particle->FourMomentum().pz()-mPZmin)/mDeltaP);
00097 if (particle->FourMomentum().px() > pxhigh) pxhigh = particle->FourMomentum().px();
00098 if (particle->FourMomentum().px() < pxlow) pxlow = particle->FourMomentum().px();
00099 if (particle->FourMomentum().py() > pyhigh) pyhigh = particle->FourMomentum().py();
00100 if (particle->FourMomentum().py() < pylow) pylow = particle->FourMomentum().py();
00101 if (particle->FourMomentum().pz() > pzhigh) pzhigh = particle->FourMomentum().pz();
00102 if (particle->FourMomentum().pz() < pzlow) pzlow = particle->FourMomentum().pz();
00103 if (i<mNumBinsX && j<mNumBinsY && k<mNumBinsZ && i>=0 && j>=0 && k>=0) {
00104 SectoredPicoEvent[Index(i,j,k)]->push_back(particle);
00105 pxave+=particle->FourMomentum().px();
00106 pyave+=particle->FourMomentum().py();
00107 pzave+=particle->FourMomentum().pz();
00108 num++;
00109 }
00110 }
00111 }
00112 pxave /= num;
00113 pyave /= num;
00114 pzave /= num;
00115
00116 cout << "AVE px=" << pxave << " AVE py="<<pyave<<" AVE pz="<<pzave<< endl;
00117 cout << "HIGH px=" << pxhigh << " LOW px="<<pxlow<< " HIGH py=" << pyhigh << " LOW py="<<pylow<<" HIGH pz=" << pzhigh << " LOW pz="<<pzlow<<endl;
00118
00119 break;
00120 }
00121
00122 case hbtV0:
00123 {
00124 StHbtV0Cut* pCut = (StHbtV0Cut*) partCut;
00125 StHbtV0* pParticle;
00126 StHbtV0Iterator pIter;
00127 StHbtV0Iterator startLoop = hbtEvent->V0Collection()->begin();
00128 StHbtV0Iterator endLoop = hbtEvent->V0Collection()->end();
00129
00130
00131 for (pIter=startLoop;pIter!=endLoop;pIter++){
00132 pParticle = *pIter;
00133 bool tmpPassV0 = pCut->Pass(pParticle);
00134 pCut->FillCutMonitor(pParticle, tmpPassV0);
00135 if (tmpPassV0){
00136 StHbtParticle* particle = new StHbtParticle(pParticle,pCut->Mass());
00137 i = (int) floor((particle->FourMomentum().px()-mPXmin)/mDeltaP);
00138 j = (int) floor((particle->FourMomentum().py()-mPYmin)/mDeltaP);
00139 k = (int) floor((particle->FourMomentum().pz()-mPZmin)/mDeltaP);
00140 SectoredPicoEvent[Index(i,j,k)]->push_back(particle);
00141 }
00142 }
00143 break;
00144 }
00145 default:
00146 cout << "FillHbtParticleCollection function (in StHbtThreeParticleAnalysis.cxx) - undefined Particle Cut type!!! \n";
00147 }
00148 }
00149
00150
00151
00152
00153 void FillHbtParticleCollection(StHbtParticleCut* partCut,
00154 StHbtEvent* hbtEvent,
00155 StHbtParticleCollection* partCollection);
00156
00157
00158
00159 StHbtThreeParticleAnalysis::StHbtThreeParticleAnalysis(){
00160
00161 mEventCut = 0;
00162 mFirstParticleCut = 0;
00163 mSecondParticleCut = 0;
00164 mThirdParticleCut = 0;
00165 mTripletCut = 0;
00166 mCorrFctnCollection= 0;
00167 mNeventsProcessed = 0;
00168 mCalcCosPhi = false;
00169 mPXmax = 5.0;
00170 mPXmin = -5.0;
00171 mPYmax = 5.0;
00172 mPYmin = -5.0;
00173 mPZmax = 5.0;
00174 mPZmin = -5.0;
00175 mDeltaP = 1.0;
00176 mNumBinsX = 1;
00177 mNumBinsY = 1;
00178 mNumBinsZ = 1;
00179 mNormFactor = 1.0;
00180 mCorrFctnCollection = new StHbtCorrFctnCollection;
00181 mMixingBuffer = new StHbtPicoEventCollection;
00182 mSectoredMixingBuffer = new StHbtSectoredPicoEventCollection;
00183 mIsSectoring=0;
00184 }
00185
00186
00187 StHbtThreeParticleAnalysis::~StHbtThreeParticleAnalysis(){
00188
00189 delete mEventCut ;
00190 delete mFirstParticleCut ;
00191 delete mSecondParticleCut ;
00192 delete mThirdParticleCut ;
00193 delete mTripletCut ;
00194
00195 StHbtCorrFctnIterator iter;
00196 for (iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
00197 delete *iter;
00198 }
00199 delete mCorrFctnCollection;
00200
00201 StHbtPicoEventIterator piter;
00202 for (piter=mMixingBuffer->begin();piter!=mMixingBuffer->end();piter++){
00203 delete *piter;
00204 }
00205 delete mMixingBuffer;
00206
00207 StHbtSectoredPicoEventIterator spiter;
00208 for (spiter=mSectoredMixingBuffer->begin();spiter!=mSectoredMixingBuffer->end();spiter++){
00209 delete *spiter;
00210 }
00211 delete mSectoredMixingBuffer;
00212
00213 mNeventsProcessed = 0;
00214
00215 if (mCalcCosPhi) delete mCosPhiE;
00216 }
00217
00218 StHbtCorrFctn* StHbtThreeParticleAnalysis::CorrFctn(int n){
00219 if ( n<0 || n > (int)mCorrFctnCollection->size() )
00220 return NULL;
00221 StHbtCorrFctnIterator iter=mCorrFctnCollection->begin();
00222 for (int i=0; i<n ;i++){
00223 iter++;
00224 }
00225 return *iter;
00226 }
00227
00228 StHbtString StHbtThreeParticleAnalysis::Report()
00229 {
00230 char Sect[100];
00231 sprintf(Sect, "Sector bounds: %4.2f<px<%4.2f %4.2f<py<%4.2f %4.2f<pz<%4.2f, DeltaP=%4.2f", mPXmin, mPXmax, mPYmin, mPYmax, mPZmin, mPZmax, mDeltaP);
00232 if (mCalcCosPhi)
00233 cout << "CosPhiAnalysis - constructing Report..."<<endl;
00234 else
00235 cout << "StHbtThreeParticleAnalysis - constructing Report..."<<endl;
00236 string temp = "-----------\nHbt Analysis Report:\n";
00237 temp += "\nEvent Cuts:\n";
00238 temp += mEventCut->Report();
00239 temp += "\nParticle Cuts - First Particle:\n";
00240 temp += mFirstParticleCut->Report();
00241 temp += "\nParticle Cuts - Second Particle:\n";
00242 temp += mSecondParticleCut->Report();
00243 temp += "\nParticle Cuts - Third Particle:\n";
00244 temp += mThirdParticleCut->Report();
00245 temp += "\nTriplet Cuts:\n";
00246 temp += mTripletCut->Report();
00247 temp += "\nCorrelation Functions:\n";
00248 StHbtCorrFctnIterator iter;
00249 if ( mCorrFctnCollection->size()==0 ) {
00250 cout << "StHbtThreeParticleAnalysis-Warning : no correlations functions in this analysis " << endl;
00251 }
00252 for (iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
00253 temp += (*iter)->Report();
00254 temp += "\n";
00255 }
00256
00257 if (mIsSectoring) {
00258 temp += "\nSectoring Information:\n";
00259 temp += Sect;
00260 }
00261 temp += "-------------\n";
00262 StHbtString returnThis=temp;
00263 return returnThis;
00264 }
00265
00266 void StHbtThreeParticleAnalysis::ProcessEvent(const StHbtEvent* hbtEvent) {
00267
00268
00269 AddEventProcessed();
00270
00271 if (!mIsSectoring) {
00272
00273 if (!mCalcCosPhi) {
00274 int NumTriplets=0, NumParticles, NumMixedParticles1, NumMixedParticles2;
00275 double TotalRealTriplets, TotalMixedTriplets=0.0, Rate;
00276 time_t TotalTime, StartTime;
00277
00278 EventBegin(hbtEvent);
00279
00280 bool tmpPassEvent = mEventCut->Pass(hbtEvent);
00281 mEventCut->FillCutMonitor(hbtEvent, tmpPassEvent);
00282 if (tmpPassEvent) {
00283 cout << "StHbtThreeParticleAnalysis::ProcessEvent() - Event has passed cut - build picoEvent from " <<
00284 hbtEvent->TrackCollection()->size() << " tracks in TrackCollection" << endl;
00285
00286 StHbtPicoEvent* picoEvent = new StHbtPicoEvent;
00287 FillHbtParticleCollection(mFirstParticleCut,(StHbtEvent*)hbtEvent,picoEvent->FirstParticleCollection());
00288 if ( !(AnalyzeIdenticalParticles()) ) {
00289 FillHbtParticleCollection(mSecondParticleCut,(StHbtEvent*)hbtEvent,picoEvent->SecondParticleCollection());
00290 FillHbtParticleCollection(mThirdParticleCut,(StHbtEvent*)hbtEvent,picoEvent->ThirdParticleCollection());}
00291 cout <<"StHbtThreeParticleAnalysis::ProcessEvent - #particles in First, Second, Third Collections: " <<
00292 picoEvent->FirstParticleCollection()->size() << " " <<
00293 picoEvent->SecondParticleCollection()->size() << " " <<
00294 picoEvent->ThirdParticleCollection()->size() << endl;
00295
00296 NumParticles = picoEvent->FirstParticleCollection()->size();
00297 TotalRealTriplets = (NumParticles)*(NumParticles-1.0)*(NumParticles-2.0)/6.0;
00298
00299
00300
00301
00302
00303
00304
00305 StHbtTriplet* TheTriplet = new StHbtTriplet;
00306
00307 StHbtParticleIterator PartIter1;
00308 StHbtParticleIterator PartIter2;
00309 StHbtParticleIterator PartIter3;
00310 StHbtCorrFctnIterator CorrFctnIter;
00311 StHbtParticleIterator StartOuterLoop = picoEvent->FirstParticleCollection()->begin();
00312 StHbtParticleIterator EndOuterLoop = picoEvent->FirstParticleCollection()->end();
00313 StHbtParticleIterator StartMiddleLoop;
00314 StHbtParticleIterator EndMiddleLoop;
00315 StHbtParticleIterator StartInnerLoop;
00316 StHbtParticleIterator EndInnerLoop;
00317
00318 if (NumParticles>2) {
00319 if (AnalyzeIdenticalParticles()) {
00320 EndOuterLoop--;
00321 EndOuterLoop--;
00322 EndMiddleLoop = picoEvent->FirstParticleCollection()->end() ;
00323 EndMiddleLoop--;
00324 EndInnerLoop = picoEvent->FirstParticleCollection()->end() ;
00325 }
00326 else {
00327 StartMiddleLoop = picoEvent->SecondParticleCollection()->begin();
00328 EndMiddleLoop = picoEvent->SecondParticleCollection()->end() ;
00329 StartInnerLoop = picoEvent->ThirdParticleCollection()->begin();
00330 EndInnerLoop = picoEvent->ThirdParticleCollection()->end() ;
00331 }
00332
00333 StartTime = time(NULL);
00334 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
00335 if (AnalyzeIdenticalParticles()){
00336 StartMiddleLoop = PartIter1;
00337 StartMiddleLoop++;
00338 }
00339 TheTriplet->SetTrack1(*PartIter1);
00340 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
00341 if (AnalyzeIdenticalParticles()){
00342 StartInnerLoop = PartIter2;
00343 StartInnerLoop++;
00344 }
00345 TheTriplet->SetTrack2(*PartIter2);
00346 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
00347 TheTriplet->SetTrack3(*PartIter3);
00348
00349
00350
00351
00352
00353 if (mTripletCut->Pass(TheTriplet)){
00354 NumTriplets++;
00355 for (CorrFctnIter=mCorrFctnCollection->begin();
00356 CorrFctnIter!=mCorrFctnCollection->end();CorrFctnIter++){
00357 StHbtCorrFctn* CorrFctn = *CorrFctnIter;
00358 CorrFctn->AddRealTriplet(TheTriplet);
00359 }
00360 }
00361 }
00362 }
00363 }
00364 }
00365
00366
00367
00368 TotalTime = time(NULL) - StartTime;
00369 Rate = (double)NumTriplets/(double)TotalTime;
00370
00371 cout << "StHbtThreeParticleAnalysis::ProcessEvent() - reals done, " << NumTriplets << " triplets entered out of " << TotalRealTriplets << "." << endl;
00372 cout << "Total time: " << TotalTime << "seconds. This is " << Rate << " triplets per second." << endl;
00373 if (MixingBufferFull()){
00374 cout << "Mixing Buffer is full - lets rock and roll" << endl;
00375 }
00376 else {
00377 cout << "Mixing Buffer not full -gotta wait " << MixingBuffer()->size() << endl;
00378 }
00379 NumTriplets=0;
00380 if (MixingBufferFull()){
00381 StartOuterLoop = picoEvent->FirstParticleCollection()->begin();
00382 EndOuterLoop = picoEvent->FirstParticleCollection()->end();
00383 StHbtPicoEvent* storedEvent1;
00384 StHbtPicoEventIterator picoEventIter1;
00385 StHbtPicoEventIterator BeginPicoEvent1;
00386 StHbtPicoEventIterator EndPicoEvent1;
00387 StHbtPicoEvent* storedEvent2;
00388 StHbtPicoEventIterator picoEventIter2;
00389 StHbtPicoEventIterator BeginPicoEvent2;
00390 StHbtPicoEventIterator EndPicoEvent2;
00391
00392
00393 BeginPicoEvent1 = MixingBuffer()->begin();
00394 EndPicoEvent1 = MixingBuffer()->end();
00395 EndPicoEvent1--;
00396 EndPicoEvent2 = MixingBuffer()->end();
00397
00398 StartTime = time(NULL);
00399 for (picoEventIter1=BeginPicoEvent1;picoEventIter1!=EndPicoEvent1;picoEventIter1++){
00400 cout << "Outer Event Done" << endl;
00401 BeginPicoEvent2 = picoEventIter1;
00402 BeginPicoEvent2++;
00403 for (picoEventIter2=BeginPicoEvent2;picoEventIter2!=EndPicoEvent2;picoEventIter2++){
00404 storedEvent1 = *picoEventIter1;
00405 storedEvent2 = *picoEventIter2;
00406 if (AnalyzeIdenticalParticles()){
00407 StartMiddleLoop = storedEvent1->FirstParticleCollection()->begin();
00408 EndMiddleLoop = storedEvent1->FirstParticleCollection()->end();
00409 StartInnerLoop = storedEvent2->FirstParticleCollection()->begin();
00410 EndInnerLoop = storedEvent2->FirstParticleCollection()->end();
00411 }
00412 else{
00413
00414 StartMiddleLoop = storedEvent1->SecondParticleCollection()->begin();
00415 EndMiddleLoop = storedEvent1->SecondParticleCollection()->end();
00416 StartInnerLoop = storedEvent2->ThirdParticleCollection()->begin();
00417 EndInnerLoop = storedEvent2->ThirdParticleCollection()->end();
00418 }
00419
00420 NumMixedParticles1 = storedEvent1->FirstParticleCollection()->size();
00421 NumMixedParticles2 = storedEvent2->FirstParticleCollection()->size();
00422 TotalMixedTriplets += NumParticles*NumMixedParticles1*NumMixedParticles2;
00423
00424 if (NumMixedParticles1>0 && NumMixedParticles2>0) {
00425 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
00426 TheTriplet->SetTrack1(*PartIter1);
00427 for (PartIter2=StartMiddleLoop;PartIter2!=EndMiddleLoop;PartIter2++){
00428 TheTriplet->SetTrack2(*PartIter2);
00429 for (PartIter3=StartInnerLoop;PartIter3!=EndInnerLoop;PartIter3++){
00430 TheTriplet->SetTrack3(*PartIter3);
00431 if (mTripletCut->Pass(TheTriplet)){
00432
00433 NumTriplets++;
00434 for (CorrFctnIter=mCorrFctnCollection->begin();
00435 CorrFctnIter!=mCorrFctnCollection->end();CorrFctnIter++){
00436 StHbtCorrFctn* CorrFctn = *CorrFctnIter;
00437 CorrFctn->AddMixedTriplet(TheTriplet);
00438
00439 }
00440 }
00441 }
00442 }
00443 }
00444 }
00445 }
00446 }
00447
00448 TotalTime = time(NULL) - StartTime;
00449 Rate = NumTriplets/(double)TotalTime;
00450
00451
00452 picoEventIter1 = MixingBuffer()->end();
00453 picoEventIter1--;
00454 delete *picoEventIter1;
00455 MixingBuffer()->pop_back();
00456 }
00457 delete TheTriplet;
00458 MixingBuffer()->push_front(picoEvent);
00459 }
00460 EventEnd(hbtEvent);
00461 cout << "StHbtThreeParticleAnalysis::ProcessEvent() - return to caller ... " << NumTriplets << " triplets out of " << TotalMixedTriplets << " in mixing buffer." << endl;
00462 cout << "Total time: " << TotalTime << "seconds. This is " << Rate << " triplets per second." << endl;
00463 }
00464
00465 if (mCalcCosPhi) {
00466 double C2Q12,C2Q23,C2Q31,C3,arg1,arg2,arg3,arg4,cosphi,cosphiError,termt;
00467 int bin1,bin2,bin3,bin4;
00468
00469 bool tmpPassEvent = mEventCut->Pass(hbtEvent);
00470 mEventCut->FillCutMonitor(hbtEvent, tmpPassEvent);
00471 if (tmpPassEvent) {
00472 cout << "StHbtThreeParticleAnalysis::ProcessCosPhi() - Event has passed cut - build picoEvent from " <<
00473 hbtEvent->TrackCollection()->size() << " tracks in TrackCollection" << endl;
00474
00475 StHbtPicoEvent* picoEvent = new StHbtPicoEvent;
00476 FillHbtParticleCollection(mFirstParticleCut,(StHbtEvent*)hbtEvent,picoEvent->FirstParticleCollection());
00477 if ( !(AnalyzeIdenticalParticles()) ) {
00478 FillHbtParticleCollection(mSecondParticleCut,(StHbtEvent*)hbtEvent,picoEvent->SecondParticleCollection());
00479 FillHbtParticleCollection(mThirdParticleCut,(StHbtEvent*)hbtEvent,picoEvent->ThirdParticleCollection());}
00480 cout <<"StHbtThreeParticleAnalysis::ProcessCosPhi - #particles in First, Second, Third Collections: " <<
00481 picoEvent->FirstParticleCollection()->size() << " " <<
00482 picoEvent->SecondParticleCollection()->size() << " " <<
00483 picoEvent->ThirdParticleCollection()->size() << endl;
00484
00485
00486
00487
00488
00489
00490
00491 StHbtTriplet* TheTriplet = new StHbtTriplet;
00492
00493 if (picoEvent->FirstParticleCollection()->size()>2) {
00494
00495 StHbtParticleIterator PartIter1;
00496 StHbtParticleIterator PartIter2;
00497 StHbtParticleIterator PartIter3;
00498 StHbtParticleIterator StartOuterLoop = picoEvent->FirstParticleCollection()->begin();
00499 StHbtParticleIterator EndOuterLoop = picoEvent->FirstParticleCollection()->end();
00500 StHbtParticleIterator StartMiddleLoop;
00501 StHbtParticleIterator EndMiddleLoop;
00502 StHbtParticleIterator StartInnerLoop;
00503 StHbtParticleIterator EndInnerLoop;
00504 if (AnalyzeIdenticalParticles()) {
00505 EndOuterLoop--;
00506 EndOuterLoop--;
00507 EndMiddleLoop = picoEvent->FirstParticleCollection()->end() ;
00508 EndMiddleLoop--;
00509 EndInnerLoop = picoEvent->FirstParticleCollection()->end() ;
00510 }
00511 else {
00512 StartMiddleLoop = picoEvent->SecondParticleCollection()->begin();
00513 EndMiddleLoop = picoEvent->SecondParticleCollection()->end() ;
00514 StartInnerLoop = picoEvent->ThirdParticleCollection()->begin();
00515 EndInnerLoop = picoEvent->ThirdParticleCollection()->end() ;
00516 }
00517 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
00518 if (AnalyzeIdenticalParticles()){
00519 StartMiddleLoop = PartIter1;
00520 StartMiddleLoop++;
00521 }
00522 TheTriplet->SetTrack1(*PartIter1);
00523 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
00524 if (AnalyzeIdenticalParticles()){
00525 StartInnerLoop = PartIter2;
00526 StartInnerLoop++;
00527 }
00528 TheTriplet->SetTrack2(*PartIter2);
00529 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
00530 TheTriplet->SetTrack3(*PartIter3);
00531 if (mTripletCut->Pass(TheTriplet)){
00532 bin1 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv12());
00533 bin2 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv23());
00534 bin3 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv31());
00535 bin4 = mQ3CF->GetXaxis()->FindBin(TheTriplet->qInv());
00536
00537 C2Q12 = mQ2CF->GetBinContent(bin1);
00538 C2Q23 = mQ2CF->GetBinContent(bin2);
00539 C2Q31 = mQ2CF->GetBinContent(bin3);
00540 C3 = mNormFactor*(mQ3CF->GetBinContent(bin4));
00541
00542 termt = ::sqrt(fabs((C2Q12-1.0)*(C2Q23-1.0)*(C2Q31-1.0)));
00543 if (termt) {
00544 cosphi = ((C3-1.0) - (C2Q12-1.0) - (C2Q23-1.0) - (C2Q31-1.0))/(2.0*termt);
00545
00546 arg1 = mQ3CF->GetBinError(bin4);
00547 arg2 = mQ2CF->GetBinError(bin1)*(1.0 + (C2Q23-1.0)*(C2Q31-1.0)*cosphi/termt);
00548 arg3 = mQ2CF->GetBinError(bin2)*(1.0 + (C2Q31-1.0)*(C2Q12-1.0)*cosphi/termt);
00549 arg4 = mQ2CF->GetBinError(bin3)*(1.0 + (C2Q12-1.0)*(C2Q23-1.0)*cosphi/termt);
00550 cosphiError = (1.0/(2.0*termt))*::sqrt(arg1*arg1+arg2*arg2+arg3*arg3+arg4*arg4);
00551 }
00552 else {
00553 cosphi = 0.0;
00554 cosphiError = 0.0;
00555 }
00556
00557
00558 mCosPhi->AddBinContent(bin4, cosphi);
00559 mCosPhiE->AddBinContent(bin4, cosphiError);
00560 mCosPhiN->AddBinContent(bin4);
00561 }
00562 }
00563 }
00564 }
00565
00566 cout << "StHbtThreeParticleAnalysis::ProcessCosPhi() - done" << endl;
00567
00568 }
00569
00570 delete picoEvent;
00571 delete TheTriplet;
00572 }
00573 cout << "StHbtThreeParticleAnalysis::ProcessCosPhi() - return to caller ... " << endl;
00574 }
00575
00576 }
00577
00578
00579 if (mIsSectoring) {
00580
00581 if (!mCalcCosPhi) {
00582 int NumTriplets=0, NumParticles, i, j, k, i2, j2, k2, i3, j3, k3;
00583 int size1=0, size2=0, size3=0;
00584 double TotalRealTriplets, Rate;
00585 time_t TotalTime, StartTime;
00586
00587
00588 EventBegin(hbtEvent);
00589
00590 bool tmpPassEvent = mEventCut->Pass(hbtEvent);
00591 mEventCut->FillCutMonitor(hbtEvent, tmpPassEvent);
00592 if (tmpPassEvent) {
00593 cout << "StHbtThreeParticleAnalysis::ProcessEvent() - Event has passed cut - build sectoredpicoEvent from " <<
00594 hbtEvent->TrackCollection()->size() << " tracks in TrackCollection" << endl;
00595
00596
00597
00598 StHbtSectoredPicoEvent* picoEvent = new StHbtSectoredPicoEvent(mNumBinsX, mNumBinsY, mNumBinsZ);
00599
00600 SortHbtParticleCollection(mFirstParticleCut,(StHbtEvent*)hbtEvent,picoEvent->FirstSectoredCollection());
00601 if ( !(AnalyzeIdenticalParticles()) ) {
00602 SortHbtParticleCollection(mSecondParticleCut,(StHbtEvent*)hbtEvent,picoEvent->SecondSectoredCollection());
00603 SortHbtParticleCollection(mThirdParticleCut,(StHbtEvent*)hbtEvent,picoEvent->ThirdSectoredCollection());
00604 }
00605
00606 for (k=0; k<mNumBinsZ; k++)
00607 for (j=0; j<mNumBinsY; j++)
00608 for (i=0; i<mNumBinsX; i++) {
00609 size1 += picoEvent->FirstSectoredCollection()[Index(i,j,k)]->size();
00610
00611 if ( !(AnalyzeIdenticalParticles()) ) {
00612 size2 += picoEvent->SecondSectoredCollection()[Index(i,j,k)]->size();
00613 size3 += picoEvent->ThirdSectoredCollection()[Index(i,j,k)]->size();
00614 }
00615 }
00616
00617 cout <<"StHbtThreeParticleAnalysis::ProcessEvent (Sect) - #particles in First, Second, Third Collections: " <<
00618 size1 << " " << size2 << " " << size3 << endl;
00619
00620 NumParticles = size1;
00621 TotalRealTriplets = (NumParticles)*(NumParticles-1.0)*(NumParticles-2.0)/6.0;
00622
00623 StartTime = time(NULL);
00624
00625 if (AnalyzeIdenticalParticles()) {
00626
00627 for (k=0; k<mNumBinsZ; k++)
00628 for (j=0; j<mNumBinsY; j++)
00629 for (i=0; i<mNumBinsX; i++) {
00630
00631
00632
00633 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j-1,k+1));
00634 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j-1,k+1), Index(i-1,j,k+1));
00635 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j-1,k+1), Index(i,j-1,k+1));
00636 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j-1,k+1), Index(i,j,k+1));
00637
00638 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j-1,k+1));
00639 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i-1,j,k+1));
00640 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i+1,j-1,k+1));
00641 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i,j,k+1));
00642 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i+1,j,k));
00643 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i+1,j,k+1));
00644
00645 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j-1,k+1));
00646 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j-1,k+1), Index(i,j,k+1));
00647 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j-1,k+1), Index(i+1,j,k));
00648 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j-1,k+1), Index(i+1,j,k+1));
00649
00650 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j,k+1));
00651 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i-1,j+1,k));
00652 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i-1,j+1,k+1));
00653 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i,j,k+1));
00654 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i,j+1,k));
00655 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i,j+1,k+1));
00656
00657 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j,k+1));
00658 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i-1,j+1,k));
00659 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i-1,j+1,k+1));
00660 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i,j+1,k));
00661 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i,j+1,k+1));
00662 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i+1,j,k));
00663 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i+1,j,k+1));
00664 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i+1,j+1,k));
00665 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i+1,j+1,k+1));
00666
00667 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j,k+1));
00668 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i,j+1,k));
00669 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i,j+1,k+1));
00670 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i+1,j,k));
00671 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i+1,j+1,k));
00672 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i+1,j+1,k+1));
00673
00674 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j+1,k+1));
00675 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j+1,k+1), Index(i-1,j+1,k));
00676 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j+1,k+1), Index(i,j+1,k));
00677 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j+1,k+1), Index(i,j+1,k+1));
00678
00679 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j+1,k+1));
00680 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i-1,j+1,k));
00681 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i,j+1,k));
00682 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i+1,j,k));
00683 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i+1,j+1,k));
00684 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i+1,j+1,k+1));
00685
00686 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j+1,k+1));
00687 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j+1,k+1), Index(i,j+1,k));
00688 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j+1,k+1), Index(i+1,j,k));
00689 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j+1,k+1), Index(i+1,j+1,k));
00690
00691
00692 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j+1,k));
00693 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i-1,j+1,k), Index(i,j+1,k));
00694
00695 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j+1,k));
00696 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j+1,k), Index(i+1,j,k));
00697 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i,j+1,k), Index(i+1,j+1,k));
00698
00699 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j+1,k));
00700 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j+1,k), Index(i+1,j,k));
00701
00702
00703 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k), Index(i+1,j,k));
00704
00705
00706 NumTriplets+=CreateRealTriplets(picoEvent, Index(i,j,k));
00707 }
00708 cout << "done" << endl;
00709 }
00710 else {
00711
00712 for (i=0; i<mNumBinsX; i++)
00713 for (j=0; j<mNumBinsY; j++)
00714 for (k=0; k<mNumBinsZ; k++)
00715 for (i2=i-1; i2<i+1; i2++)
00716 for (j2=j-1; j2<j+1; j2++)
00717 for (k2=k-1; k2<k+1; k2++)
00718 if (i2<mNumBinsX && j2<mNumBinsY && k2<mNumBinsZ && i2!=-1 && j2!=-1 && k2!=-1)
00719 for (i3=i-1; i3<i+1; i3++)
00720 for (j3=j-1; j3<j+1; j3++)
00721 for (k3=k-1; k3<k+1; k3++)
00722 if (i3<mNumBinsX && j3<mNumBinsY && k3<mNumBinsZ && i3!=-1 && j3!=-1 && k3!=-1)
00723 CreateRealTriplets(picoEvent, Index(i,j,k), Index(i2,j2,k2), Index(i3,j3,k3));
00724 }
00725
00726 TotalTime = time(NULL) - StartTime;
00727 Rate = (double)NumTriplets/(double)TotalTime;
00728
00729 cout << "StHbtThreeParticleAnalysis::ProcessEvent() (Sect) - reals done, " << NumTriplets << " triplets entered out of " << (int)TotalRealTriplets << "." << endl;
00730 cout << "Total time: " << TotalTime << "seconds. This is " << Rate << " triplets per second." << endl;
00731
00732
00733
00734 if (SectoredMixingBufferFull()){
00735 cout << "Mixing Buffer is full - lets rock and roll" << endl;
00736 }
00737 else {
00738 cout << "Mixing Buffer not full -gotta wait " << SectoredMixingBuffer()->size() << endl;
00739 }
00740 NumTriplets=0;
00741 if (SectoredMixingBufferFull()){
00742 StHbtSectoredPicoEvent* storedEvent1;
00743 StHbtSectoredPicoEventIterator picoEventIter1;
00744 StHbtSectoredPicoEventIterator BeginPicoEvent1;
00745 StHbtSectoredPicoEventIterator EndPicoEvent1;
00746 StHbtSectoredPicoEvent* storedEvent2;
00747 StHbtSectoredPicoEventIterator picoEventIter2;
00748 StHbtSectoredPicoEventIterator BeginPicoEvent2;
00749 StHbtSectoredPicoEventIterator EndPicoEvent2;
00750
00751 BeginPicoEvent1 = SectoredMixingBuffer()->begin();
00752 EndPicoEvent1 = SectoredMixingBuffer()->end();
00753 EndPicoEvent1--;
00754 EndPicoEvent2 = SectoredMixingBuffer()->end();
00755
00756 StartTime = time(NULL);
00757 for (picoEventIter1=BeginPicoEvent1;picoEventIter1!=EndPicoEvent1;picoEventIter1++){
00758 BeginPicoEvent2 = picoEventIter1;
00759 BeginPicoEvent2++;
00760 for (picoEventIter2=BeginPicoEvent2;picoEventIter2!=EndPicoEvent2;picoEventIter2++){
00761 storedEvent1 = *picoEventIter1;
00762 storedEvent2 = *picoEventIter2;
00763 if (AnalyzeIdenticalParticles()){
00764
00765 for (i=0; i<mNumBinsX; i++)
00766 for (j=0; j<mNumBinsY; j++)
00767 for (k=0; k<mNumBinsZ; k++)
00768 for (i2=i-1; i2<=i+1; i2++)
00769 for (j2=j-1; j2<=j+1; j2++)
00770 for (k2=k-1; k2<=k+1; k2++)
00771 if (i2<mNumBinsX && j2<mNumBinsY && k2<mNumBinsZ && i2!=-1 && j2!=-1 && k2!=-1)
00772 for (i3=i-1; i3<=i+1; i3++)
00773 for (j3=j-1; j3<=j+1; j3++)
00774 for (k3=k-1; k3<=k+1; k3++)
00775 if (i3<mNumBinsX && j3<mNumBinsY && k3<mNumBinsZ && i3!=-1 && j3!=-1 && k3!=-1 && i3!=i2-2 && i3!=i2+2 && j3!=j2-2 && j3!=j2+2 && k3!=k2-2 && k3!=k2+2)
00776 NumTriplets+=CreateMixedTriplets(picoEvent->FirstSectoredCollection()[Index(i,j,k)], storedEvent1->FirstSectoredCollection()[Index(i2,j2,k2)], storedEvent2->FirstSectoredCollection()[Index(i3,j3,k3)]);
00777 }
00778 else{
00779
00780
00781 for (i=0; i<mNumBinsX; i++)
00782 for (j=0; j<mNumBinsY; j++)
00783 for (k=0; k<mNumBinsZ; k++)
00784 for (i2=i-1; i2<i+1; i2++)
00785 for (j2=j-1; j2<j+1; j2++)
00786 for (k2=k-1; k2<k+1; k2++)
00787 if (i2<mNumBinsX && j2<mNumBinsY && k2<mNumBinsZ && i2!=-1 && j2!=-1 && k2!=-1)
00788 for (i3=i-1; i3<i+1; i3++)
00789 for (j3=j-1; j3<j+1; j3++)
00790 for (k3=k-1; k3<k+1; k3++)
00791 if (i3<mNumBinsX && j3<mNumBinsY && k3<mNumBinsZ && i3!=-1 && j3!=-1 && k3!=-1)
00792 CreateMixedTriplets(picoEvent->FirstSectoredCollection()[Index(i,j,k)], storedEvent1->SecondSectoredCollection()[Index(i2,j2,k2)], storedEvent2->ThirdSectoredCollection()[Index(i3,j3,k3)]);
00793 }
00794 }
00795 }
00796
00797 TotalTime = time(NULL) - StartTime;
00798 Rate = NumTriplets/(double)TotalTime;
00799
00800
00801
00802 picoEventIter1 = SectoredMixingBuffer()->end();
00803 picoEventIter1--;
00804 delete *picoEventIter1;
00805
00806 SectoredMixingBuffer()->pop_back();
00807 }
00808 SectoredMixingBuffer()->push_front(picoEvent);
00809 }
00810 EventEnd(hbtEvent);
00811 cout << "StHbtThreeParticleAnalysis::ProcessEvent() (Sect) - return to caller ... " << NumTriplets << " triplets out of about " << size1*size1*size1 << " in mixing buffer." << endl;
00812 cout << "Total time: " << TotalTime << "seconds. This is " << Rate << " triplets per second." << endl;
00813
00814 }
00815
00816 if (mCalcCosPhi) {
00817 int NumTriplets=0, NumParticles, i, j, k, i2, j2, k2, i3, j3, k3;
00818 int size1=0, size2=0, size3=0;
00819 double TotalRealTriplets, Rate;
00820 time_t TotalTime, StartTime;
00821
00822
00823 bool tmpPassEvent = mEventCut->Pass(hbtEvent);
00824 mEventCut->FillCutMonitor(hbtEvent, tmpPassEvent);
00825 if (tmpPassEvent) {
00826 cout << "StHbtThreeParticleAnalysis::ProcessEvent() - Event has passed cut - build sectoredpicoEvent from " <<
00827 hbtEvent->TrackCollection()->size() << " tracks in TrackCollection" << endl;
00828
00829
00830
00831 StHbtSectoredPicoEvent* picoEvent = new StHbtSectoredPicoEvent(mNumBinsX, mNumBinsY, mNumBinsZ);
00832
00833 SortHbtParticleCollection(mFirstParticleCut,(StHbtEvent*)hbtEvent,picoEvent->FirstSectoredCollection());
00834 if ( !(AnalyzeIdenticalParticles()) ) {
00835 SortHbtParticleCollection(mSecondParticleCut,(StHbtEvent*)hbtEvent,picoEvent->SecondSectoredCollection());
00836 SortHbtParticleCollection(mThirdParticleCut,(StHbtEvent*)hbtEvent,picoEvent->ThirdSectoredCollection());
00837 }
00838
00839 for (k=0; k<mNumBinsZ; k++)
00840 for (j=0; j<mNumBinsY; j++)
00841 for (i=0; i<mNumBinsX; i++) {
00842 size1 += picoEvent->FirstSectoredCollection()[Index(i,j,k)]->size();
00843
00844 if ( !(AnalyzeIdenticalParticles()) ) {
00845 size2 += picoEvent->SecondSectoredCollection()[Index(i,j,k)]->size();
00846 size3 += picoEvent->ThirdSectoredCollection()[Index(i,j,k)]->size();
00847 }
00848 }
00849
00850 cout <<"StHbtThreeParticleAnalysis::ProcessEvent (Sect) - #particles in First, Second, Third Collections: " <<
00851 size1 << " " << size2 << " " << size3 << endl;
00852
00853 NumParticles = size1;
00854 TotalRealTriplets = (NumParticles)*(NumParticles-1.0)*(NumParticles-2.0)/6.0;
00855
00856 StartTime = time(NULL);
00857
00858 if (AnalyzeIdenticalParticles()) {
00859
00860 for (k=0; k<mNumBinsZ; k++)
00861 for (j=0; j<mNumBinsY; j++)
00862 for (i=0; i<mNumBinsX; i++) {
00863
00864
00865
00866 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j-1,k+1));
00867 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j-1,k+1), Index(i-1,j,k+1));
00868 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j-1,k+1), Index(i,j-1,k+1));
00869 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j-1,k+1), Index(i,j,k+1));
00870
00871 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j-1,k+1));
00872 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i-1,j,k+1));
00873 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i+1,j-1,k+1));
00874 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i,j,k+1));
00875 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i+1,j,k));
00876 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j-1,k+1), Index(i+1,j,k+1));
00877
00878 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j-1,k+1));
00879 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j-1,k+1), Index(i,j,k+1));
00880 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j-1,k+1), Index(i+1,j,k));
00881 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j-1,k+1), Index(i+1,j,k+1));
00882
00883 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j,k+1));
00884 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i-1,j+1,k));
00885 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i-1,j+1,k+1));
00886 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i,j,k+1));
00887 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i,j+1,k));
00888 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j,k+1), Index(i,j+1,k+1));
00889
00890 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j,k+1));
00891 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i-1,j+1,k));
00892 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i-1,j+1,k+1));
00893 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i,j+1,k));
00894 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i,j+1,k+1));
00895 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i+1,j,k));
00896 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i+1,j,k+1));
00897 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i+1,j+1,k));
00898 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j,k+1), Index(i+1,j+1,k+1));
00899
00900 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j,k+1));
00901 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i,j+1,k));
00902 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i,j+1,k+1));
00903 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i+1,j,k));
00904 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i+1,j+1,k));
00905 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j,k+1), Index(i+1,j+1,k+1));
00906
00907 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j+1,k+1));
00908 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j+1,k+1), Index(i-1,j+1,k));
00909 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j+1,k+1), Index(i,j+1,k));
00910 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j+1,k+1), Index(i,j+1,k+1));
00911
00912 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j+1,k+1));
00913 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i-1,j+1,k));
00914 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i,j+1,k));
00915 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i+1,j,k));
00916 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i+1,j+1,k));
00917 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j+1,k+1), Index(i+1,j+1,k+1));
00918
00919 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j+1,k+1));
00920 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j+1,k+1), Index(i,j+1,k));
00921 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j+1,k+1), Index(i+1,j,k));
00922 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j+1,k+1), Index(i+1,j+1,k));
00923
00924
00925 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j+1,k));
00926 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i-1,j+1,k), Index(i,j+1,k));
00927
00928 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j+1,k));
00929 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j+1,k), Index(i+1,j,k));
00930 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i,j+1,k), Index(i+1,j+1,k));
00931
00932 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j+1,k));
00933 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j+1,k), Index(i+1,j,k));
00934
00935
00936 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k), Index(i+1,j,k));
00937
00938
00939 NumTriplets+=CalculateCosPhi(picoEvent, Index(i,j,k));
00940 }
00941 cout << "done" << endl;
00942 }
00943 else {
00944
00945 for (i=0; i<mNumBinsX; i++)
00946 for (j=0; j<mNumBinsY; j++)
00947 for (k=0; k<mNumBinsZ; k++)
00948 for (i2=i-1; i2<i+1; i2++)
00949 for (j2=j-1; j2<j+1; j2++)
00950 for (k2=k-1; k2<k+1; k2++)
00951 if (i2<mNumBinsX && j2<mNumBinsY && k2<mNumBinsZ && i2!=-1 && j2!=-1 && k2!=-1)
00952 for (i3=i-1; i3<i+1; i3++)
00953 for (j3=j-1; j3<j+1; j3++)
00954 for (k3=k-1; k3<k+1; k3++)
00955 if (i3<mNumBinsX && j3<mNumBinsY && k3<mNumBinsZ && i3!=-1 && j3!=-1 && k3!=-1)
00956 CalculateCosPhi(picoEvent, Index(i,j,k), Index(i2,j2,k2), Index(i3,j3,k3));
00957 }
00958
00959 TotalTime = time(NULL) - StartTime;
00960 Rate = (double)NumTriplets/(double)TotalTime;
00961
00962 cout << "StHbtThreeParticleAnalysis::ProcessCosPhi() (Sect) - done, " << NumTriplets << " triplets entered out of " << (int)TotalRealTriplets << "." << endl;
00963 cout << "Total time: " << TotalTime << "seconds. This is " << Rate << " triplets per second." << endl;
00964
00965 delete picoEvent;
00966
00967 }
00968 cout << "StHbtThreeParticleAnalysis::ProcessCosPhi() (Sect) - return to caller ... " << endl;
00969 }
00970
00971 }
00972
00973 }
00974
00975
00976 int StHbtThreeParticleAnalysis::CreateRealTriplets(StHbtSectoredPicoEvent *picoEvent, int Index1) {
00977
00978 int NumTriplets=0;
00979
00980 StHbtParticleCollection *partColl1 = picoEvent->FirstSectoredCollection()[Index1];
00981
00982 if (partColl1->size()<3) return 0;
00983
00984 StHbtTriplet* TheTriplet = new StHbtTriplet;
00985
00986 StHbtParticleIterator PartIter1;
00987 StHbtParticleIterator PartIter2;
00988 StHbtParticleIterator PartIter3;
00989 StHbtCorrFctnIterator CorrFctnIter;
00990 StHbtParticleIterator StartOuterLoop = partColl1->begin();
00991 StHbtParticleIterator EndOuterLoop = partColl1->end();
00992 StHbtParticleIterator StartMiddleLoop;
00993 StHbtParticleIterator EndMiddleLoop;
00994 StHbtParticleIterator StartInnerLoop;
00995 StHbtParticleIterator EndInnerLoop;
00996
00997 EndOuterLoop--;
00998 EndOuterLoop--;
00999 EndMiddleLoop = partColl1->end() ;
01000 EndMiddleLoop--;
01001 EndInnerLoop = partColl1->end() ;
01002
01003 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
01004 StartMiddleLoop = PartIter1;
01005 StartMiddleLoop++;
01006 TheTriplet->SetTrack1(*PartIter1);
01007 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
01008 StartInnerLoop = PartIter2;
01009 StartInnerLoop++;
01010 TheTriplet->SetTrack2(*PartIter2);
01011 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
01012 TheTriplet->SetTrack3(*PartIter3);
01013
01014
01015
01016
01017
01018 if (mTripletCut->Pass(TheTriplet)){
01019 NumTriplets++;
01020 for (CorrFctnIter=mCorrFctnCollection->begin();
01021 CorrFctnIter!=mCorrFctnCollection->end();CorrFctnIter++){
01022 StHbtCorrFctn* CorrFctn = *CorrFctnIter;
01023 CorrFctn->AddRealTriplet(TheTriplet);
01024 }
01025 }
01026 }
01027 }
01028 }
01029
01030 delete TheTriplet;
01031
01032 return NumTriplets;
01033
01034 }
01035
01036
01037
01038
01039 int StHbtThreeParticleAnalysis::CreateRealTriplets(StHbtSectoredPicoEvent *picoEvent, int Index1, int Index2) {
01040
01041 int NumTriplets=0;
01042
01043 if (Index1==-1 || Index2==-1) return 0;
01044
01045 StHbtParticleCollection *partColl1 = picoEvent->FirstSectoredCollection()[Index1];
01046 StHbtParticleCollection *partColl2 = picoEvent->FirstSectoredCollection()[Index2];
01047
01048 StHbtTriplet* TheTriplet = new StHbtTriplet;
01049
01050
01051
01052 if (partColl1->size()>=2 && partColl2->size()>=1) {
01053
01054 StHbtParticleIterator PartIter1;
01055 StHbtParticleIterator PartIter2;
01056 StHbtParticleIterator PartIter3;
01057 StHbtCorrFctnIterator CorrFctnIter;
01058 StHbtParticleIterator StartOuterLoop = partColl1->begin();
01059 StHbtParticleIterator EndOuterLoop = partColl1->end();
01060 StHbtParticleIterator StartMiddleLoop;
01061 StHbtParticleIterator EndMiddleLoop = partColl1->end();
01062 StHbtParticleIterator StartInnerLoop = partColl2->begin();
01063 StHbtParticleIterator EndInnerLoop = partColl2->end();
01064
01065 EndOuterLoop--;
01066
01067 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
01068 StartMiddleLoop = PartIter1;
01069 StartMiddleLoop++;
01070 TheTriplet->SetTrack1(*PartIter1);
01071 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
01072 TheTriplet->SetTrack2(*PartIter2);
01073 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
01074 TheTriplet->SetTrack3(*PartIter3);
01075
01076
01077
01078
01079
01080 if (mTripletCut->Pass(TheTriplet)){
01081 NumTriplets++;
01082 for (CorrFctnIter=mCorrFctnCollection->begin();
01083 CorrFctnIter!=mCorrFctnCollection->end();CorrFctnIter++){
01084 StHbtCorrFctn* CorrFctn = *CorrFctnIter;
01085 CorrFctn->AddRealTriplet(TheTriplet);
01086 }
01087 }
01088 }
01089 }
01090 }
01091
01092 }
01093
01094
01095
01096
01097 if (partColl1->size()>=1 && partColl2->size()>=2) {
01098
01099 StHbtParticleIterator PartIter1;
01100 StHbtParticleIterator PartIter2;
01101 StHbtParticleIterator PartIter3;
01102 StHbtCorrFctnIterator CorrFctnIter;
01103 StHbtParticleIterator StartOuterLoop = partColl2->begin();
01104 StHbtParticleIterator EndOuterLoop = partColl2->end();
01105 StHbtParticleIterator StartMiddleLoop;
01106 StHbtParticleIterator EndMiddleLoop = partColl2->end();
01107 StHbtParticleIterator StartInnerLoop = partColl1->begin();
01108 StHbtParticleIterator EndInnerLoop = partColl1->end();
01109
01110 EndOuterLoop--;
01111
01112 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
01113 StartMiddleLoop = PartIter1;
01114 StartMiddleLoop++;
01115 TheTriplet->SetTrack1(*PartIter1);
01116 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
01117 TheTriplet->SetTrack2(*PartIter2);
01118 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
01119 TheTriplet->SetTrack3(*PartIter3);
01120
01121
01122
01123
01124
01125 if (mTripletCut->Pass(TheTriplet)){
01126 NumTriplets++;
01127 for (CorrFctnIter=mCorrFctnCollection->begin();
01128 CorrFctnIter!=mCorrFctnCollection->end();CorrFctnIter++){
01129 StHbtCorrFctn* CorrFctn = *CorrFctnIter;
01130 CorrFctn->AddRealTriplet(TheTriplet);
01131 }
01132 }
01133 }
01134 }
01135 }
01136
01137 }
01138
01139 delete TheTriplet;
01140
01141 return NumTriplets;
01142
01143 }
01144
01145
01146
01147 int StHbtThreeParticleAnalysis::CreateRealTriplets(StHbtSectoredPicoEvent *picoEvent, int Index1, int Index2, int Index3) {
01148
01149 int NumTriplets=0;
01150
01151 if (Index1==-1 || Index2==-1 || Index3==-1) return 0;
01152
01153 StHbtParticleCollection *partColl1 = picoEvent->FirstSectoredCollection()[Index1];
01154 StHbtParticleCollection *partColl2 = picoEvent->FirstSectoredCollection()[Index2];
01155 StHbtParticleCollection *partColl3 = picoEvent->FirstSectoredCollection()[Index3];
01156
01157 if (!partColl1->size() || !partColl2->size() || !partColl2->size()) return 0;
01158
01159 StHbtTriplet* TheTriplet = new StHbtTriplet;
01160
01161 StHbtParticleIterator PartIter1;
01162 StHbtParticleIterator PartIter2;
01163 StHbtParticleIterator PartIter3;
01164 StHbtCorrFctnIterator CorrFctnIter;
01165 StHbtParticleIterator StartOuterLoop = partColl1->begin();
01166 StHbtParticleIterator EndOuterLoop = partColl1->end();
01167 StHbtParticleIterator StartMiddleLoop = partColl2->begin();
01168 StHbtParticleIterator EndMiddleLoop = partColl2->end();
01169 StHbtParticleIterator StartInnerLoop = partColl3->begin();
01170 StHbtParticleIterator EndInnerLoop = partColl3->end();
01171
01172 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
01173 TheTriplet->SetTrack1(*PartIter1);
01174 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
01175 TheTriplet->SetTrack2(*PartIter2);
01176 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
01177 TheTriplet->SetTrack3(*PartIter3);
01178
01179
01180
01181
01182
01183 if (mTripletCut->Pass(TheTriplet)){
01184 NumTriplets++;
01185 for (CorrFctnIter=mCorrFctnCollection->begin();
01186 CorrFctnIter!=mCorrFctnCollection->end();CorrFctnIter++){
01187 StHbtCorrFctn* CorrFctn = *CorrFctnIter;
01188 CorrFctn->AddRealTriplet(TheTriplet);
01189 }
01190 }
01191 }
01192 }
01193 }
01194
01195 delete TheTriplet;
01196
01197 return NumTriplets;
01198
01199 }
01200
01201
01202
01203 int StHbtThreeParticleAnalysis::CalculateCosPhi(StHbtSectoredPicoEvent *picoEvent, int Index1) {
01204
01205 double C2Q12,C2Q23,C2Q31,C3,arg1,arg2,arg3,arg4,cosphi,cosphiError,termt;
01206 int bin1,bin2,bin3,bin4,NumTriplets=0;
01207
01208 StHbtParticleCollection *partColl1 = picoEvent->FirstSectoredCollection()[Index1];
01209
01210 if (partColl1->size()<3) return 0;
01211
01212 StHbtTriplet* TheTriplet = new StHbtTriplet;
01213
01214 StHbtParticleIterator PartIter1;
01215 StHbtParticleIterator PartIter2;
01216 StHbtParticleIterator PartIter3;
01217 StHbtParticleIterator StartOuterLoop = partColl1->begin();
01218 StHbtParticleIterator EndOuterLoop = partColl1->end();
01219 StHbtParticleIterator StartMiddleLoop;
01220 StHbtParticleIterator EndMiddleLoop;
01221 StHbtParticleIterator StartInnerLoop;
01222 StHbtParticleIterator EndInnerLoop;
01223
01224 EndOuterLoop--;
01225 EndOuterLoop--;
01226 EndMiddleLoop = partColl1->end() ;
01227 EndMiddleLoop--;
01228 EndInnerLoop = partColl1->end() ;
01229
01230 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
01231 StartMiddleLoop = PartIter1;
01232 StartMiddleLoop++;
01233 TheTriplet->SetTrack1(*PartIter1);
01234 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
01235 StartInnerLoop = PartIter2;
01236 StartInnerLoop++;
01237 TheTriplet->SetTrack2(*PartIter2);
01238 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
01239 TheTriplet->SetTrack3(*PartIter3);
01240
01241
01242
01243
01244
01245 if (mTripletCut->Pass(TheTriplet)){
01246 NumTriplets++;
01247 bin1 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv12());
01248 bin2 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv23());
01249 bin3 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv31());
01250 bin4 = mQ3CF->GetXaxis()->FindBin(TheTriplet->qInv());
01251
01252 C2Q12 = mQ2CF->GetBinContent(bin1);
01253 C2Q23 = mQ2CF->GetBinContent(bin2);
01254 C2Q31 = mQ2CF->GetBinContent(bin3);
01255 C3 = mNormFactor*(mQ3CF->GetBinContent(bin4));
01256
01257 termt = ::sqrt(fabs((C2Q12-1.0)*(C2Q23-1.0)*(C2Q31-1.0)));
01258 if (termt) {
01259 cosphi = ((C3-1.0) - (C2Q12-1.0) - (C2Q23-1.0) - (C2Q31-1.0))/(2.0*termt);
01260 arg1 = mQ3CF->GetBinError(bin4);
01261 arg2 = mQ2CF->GetBinError(bin1)*(1.0 + (C2Q23-1.0)*(C2Q31-1.0)*cosphi/termt);
01262 arg3 = mQ2CF->GetBinError(bin2)*(1.0 + (C2Q31-1.0)*(C2Q12-1.0)*cosphi/termt);
01263 arg4 = mQ2CF->GetBinError(bin3)*(1.0 + (C2Q12-1.0)*(C2Q23-1.0)*cosphi/termt);
01264 cosphiError = (1.0/(2.0*termt))*::sqrt(arg1*arg1+arg2*arg2+arg3*arg3+arg4*arg4);
01265 }
01266 else {
01267 cosphi = 0.0;
01268 cosphiError = 0.0;
01269 }
01270
01271 mCosPhi->AddBinContent(bin4, cosphi);
01272 mCosPhiE->AddBinContent(bin4, cosphiError);
01273 mCosPhiN->AddBinContent(bin4);
01274
01275 }
01276 }
01277 }
01278 }
01279
01280 delete TheTriplet;
01281
01282 return NumTriplets;
01283
01284 }
01285
01286
01287
01288
01289 int StHbtThreeParticleAnalysis::CalculateCosPhi(StHbtSectoredPicoEvent *picoEvent, int Index1, int Index2) {
01290
01291 double C2Q12,C2Q23,C2Q31,C3,arg1,arg2,arg3,arg4,cosphi,cosphiError,termt;
01292 int bin1,bin2,bin3,bin4,NumTriplets=0;
01293
01294 if (Index1==-1 || Index2==-1) return 0;
01295
01296 StHbtParticleCollection *partColl1 = picoEvent->FirstSectoredCollection()[Index1];
01297 StHbtParticleCollection *partColl2 = picoEvent->FirstSectoredCollection()[Index2];
01298
01299 StHbtTriplet* TheTriplet = new StHbtTriplet;
01300
01301
01302
01303 if (partColl1->size()>=2 && partColl2->size()>=1) {
01304
01305 StHbtParticleIterator PartIter1;
01306 StHbtParticleIterator PartIter2;
01307 StHbtParticleIterator PartIter3;
01308 StHbtParticleIterator StartOuterLoop = partColl1->begin();
01309 StHbtParticleIterator EndOuterLoop = partColl1->end();
01310 StHbtParticleIterator StartMiddleLoop;
01311 StHbtParticleIterator EndMiddleLoop = partColl1->end();
01312 StHbtParticleIterator StartInnerLoop = partColl2->begin();
01313 StHbtParticleIterator EndInnerLoop = partColl2->end();
01314
01315 EndOuterLoop--;
01316
01317 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
01318 StartMiddleLoop = PartIter1;
01319 StartMiddleLoop++;
01320 TheTriplet->SetTrack1(*PartIter1);
01321 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
01322 TheTriplet->SetTrack2(*PartIter2);
01323 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
01324 TheTriplet->SetTrack3(*PartIter3);
01325
01326
01327
01328
01329
01330 if (mTripletCut->Pass(TheTriplet)){
01331 NumTriplets++;
01332 bin1 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv12());
01333 bin2 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv23());
01334 bin3 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv31());
01335 bin4 = mQ3CF->GetXaxis()->FindBin(TheTriplet->qInv());
01336
01337 C2Q12 = mQ2CF->GetBinContent(bin1);
01338 C2Q23 = mQ2CF->GetBinContent(bin2);
01339 C2Q31 = mQ2CF->GetBinContent(bin3);
01340 C3 = mNormFactor*(mQ3CF->GetBinContent(bin4));
01341
01342 termt = ::sqrt(fabs((C2Q12-1.0)*(C2Q23-1.0)*(C2Q31-1.0)));
01343 if (termt) {
01344 cosphi = ((C3-1.0) - (C2Q12-1.0) - (C2Q23-1.0) - (C2Q31-1.0))/(2.0*termt);
01345 arg1 = mQ3CF->GetBinError(bin4);
01346 arg2 = mQ2CF->GetBinError(bin1)*(1.0 + (C2Q23-1.0)*(C2Q31-1.0)*cosphi/termt);
01347 arg3 = mQ2CF->GetBinError(bin2)*(1.0 + (C2Q31-1.0)*(C2Q12-1.0)*cosphi/termt);
01348 arg4 = mQ2CF->GetBinError(bin3)*(1.0 + (C2Q12-1.0)*(C2Q23-1.0)*cosphi/termt);
01349 cosphiError = (1.0/(2.0*termt))*::sqrt(arg1*arg1+arg2*arg2+arg3*arg3+arg4*arg4);
01350 }
01351 else {
01352 cosphi = 0.0;
01353 cosphiError = 0.0;
01354 }
01355
01356 mCosPhi->AddBinContent(bin4, cosphi);
01357 mCosPhiE->AddBinContent(bin4, cosphiError);
01358 mCosPhiN->AddBinContent(bin4);
01359
01360 }
01361 }
01362 }
01363 }
01364
01365 }
01366
01367
01368
01369
01370 if (partColl1->size()>=1 && partColl2->size()>=2) {
01371
01372 StHbtParticleIterator PartIter1;
01373 StHbtParticleIterator PartIter2;
01374 StHbtParticleIterator PartIter3;
01375 StHbtParticleIterator StartOuterLoop = partColl2->begin();
01376 StHbtParticleIterator EndOuterLoop = partColl2->end();
01377 StHbtParticleIterator StartMiddleLoop;
01378 StHbtParticleIterator EndMiddleLoop = partColl2->end();
01379 StHbtParticleIterator StartInnerLoop = partColl1->begin();
01380 StHbtParticleIterator EndInnerLoop = partColl1->end();
01381
01382 EndOuterLoop--;
01383
01384 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
01385 StartMiddleLoop = PartIter1;
01386 StartMiddleLoop++;
01387 TheTriplet->SetTrack1(*PartIter1);
01388 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
01389 TheTriplet->SetTrack2(*PartIter2);
01390 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
01391 TheTriplet->SetTrack3(*PartIter3);
01392
01393
01394
01395
01396
01397 if (mTripletCut->Pass(TheTriplet)){
01398 NumTriplets++;
01399 bin1 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv12());
01400 bin2 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv23());
01401 bin3 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv31());
01402 bin4 = mQ3CF->GetXaxis()->FindBin(TheTriplet->qInv());
01403
01404 C2Q12 = mQ2CF->GetBinContent(bin1);
01405 C2Q23 = mQ2CF->GetBinContent(bin2);
01406 C2Q31 = mQ2CF->GetBinContent(bin3);
01407 C3 = mNormFactor*(mQ3CF->GetBinContent(bin4));
01408
01409 termt = ::sqrt(fabs((C2Q12-1.0)*(C2Q23-1.0)*(C2Q31-1.0)));
01410 if (termt) {
01411 cosphi = ((C3-1.0) - (C2Q12-1.0) - (C2Q23-1.0) - (C2Q31-1.0))/(2.0*termt);
01412 arg1 = mQ3CF->GetBinError(bin4);
01413 arg2 = mQ2CF->GetBinError(bin1)*(1.0 + (C2Q23-1.0)*(C2Q31-1.0)*cosphi/termt);
01414 arg3 = mQ2CF->GetBinError(bin2)*(1.0 + (C2Q31-1.0)*(C2Q12-1.0)*cosphi/termt);
01415 arg4 = mQ2CF->GetBinError(bin3)*(1.0 + (C2Q12-1.0)*(C2Q23-1.0)*cosphi/termt);
01416 cosphiError = (1.0/(2.0*termt))*::sqrt(arg1*arg1+arg2*arg2+arg3*arg3+arg4*arg4);
01417 }
01418 else {
01419 cosphi = 0.0;
01420 cosphiError = 0.0;
01421 }
01422
01423 mCosPhi->AddBinContent(bin4, cosphi);
01424 mCosPhiE->AddBinContent(bin4, cosphiError);
01425 mCosPhiN->AddBinContent(bin4);
01426
01427 }
01428 }
01429 }
01430 }
01431
01432 }
01433
01434 delete TheTriplet;
01435
01436 return NumTriplets;
01437
01438 }
01439
01440
01441
01442 int StHbtThreeParticleAnalysis::CalculateCosPhi(StHbtSectoredPicoEvent *picoEvent, int Index1, int Index2, int Index3) {
01443
01444 double C2Q12,C2Q23,C2Q31,C3,arg1,arg2,arg3,arg4,cosphi,cosphiError,termt;
01445 int bin1,bin2,bin3,bin4,NumTriplets=0;
01446
01447 if (Index1==-1 || Index2==-1 || Index3==-1) return 0;
01448
01449 StHbtParticleCollection *partColl1 = picoEvent->FirstSectoredCollection()[Index1];
01450 StHbtParticleCollection *partColl2 = picoEvent->FirstSectoredCollection()[Index2];
01451 StHbtParticleCollection *partColl3 = picoEvent->FirstSectoredCollection()[Index3];
01452
01453 if (!partColl1->size() || !partColl2->size() || !partColl2->size()) return 0;
01454
01455 StHbtTriplet* TheTriplet = new StHbtTriplet;
01456
01457 StHbtParticleIterator PartIter1;
01458 StHbtParticleIterator PartIter2;
01459 StHbtParticleIterator PartIter3;
01460 StHbtParticleIterator StartOuterLoop = partColl1->begin();
01461 StHbtParticleIterator EndOuterLoop = partColl1->end();
01462 StHbtParticleIterator StartMiddleLoop = partColl2->begin();
01463 StHbtParticleIterator EndMiddleLoop = partColl2->end();
01464 StHbtParticleIterator StartInnerLoop = partColl3->begin();
01465 StHbtParticleIterator EndInnerLoop = partColl3->end();
01466
01467 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
01468 TheTriplet->SetTrack1(*PartIter1);
01469 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
01470 TheTriplet->SetTrack2(*PartIter2);
01471 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
01472 TheTriplet->SetTrack3(*PartIter3);
01473
01474
01475
01476
01477
01478 if (mTripletCut->Pass(TheTriplet)){
01479 NumTriplets++;
01480 bin1 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv12());
01481 bin2 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv23());
01482 bin3 = mQ2CF->GetXaxis()->FindBin(TheTriplet->qInv31());
01483 bin4 = mQ3CF->GetXaxis()->FindBin(TheTriplet->qInv());
01484
01485 C2Q12 = mQ2CF->GetBinContent(bin1);
01486 C2Q23 = mQ2CF->GetBinContent(bin2);
01487 C2Q31 = mQ2CF->GetBinContent(bin3);
01488 C3 = mNormFactor*(mQ3CF->GetBinContent(bin4));
01489
01490 termt = ::sqrt(fabs((C2Q12-1.0)*(C2Q23-1.0)*(C2Q31-1.0)));
01491 if (termt) {
01492 cosphi = ((C3-1.0) - (C2Q12-1.0) - (C2Q23-1.0) - (C2Q31-1.0))/(2.0*termt);
01493 arg1 = mQ3CF->GetBinError(bin4);
01494 arg2 = mQ2CF->GetBinError(bin1)*(1.0 + (C2Q23-1.0)*(C2Q31-1.0)*cosphi/termt);
01495 arg3 = mQ2CF->GetBinError(bin2)*(1.0 + (C2Q31-1.0)*(C2Q12-1.0)*cosphi/termt);
01496 arg4 = mQ2CF->GetBinError(bin3)*(1.0 + (C2Q12-1.0)*(C2Q23-1.0)*cosphi/termt);
01497 cosphiError = (1.0/(2.0*termt))*::sqrt(arg1*arg1+arg2*arg2+arg3*arg3+arg4*arg4);
01498 }
01499 else {
01500 cosphi = 0.0;
01501 cosphiError = 0.0;
01502 }
01503
01504 mCosPhi->AddBinContent(bin4, cosphi);
01505 mCosPhiE->AddBinContent(bin4, cosphiError);
01506 mCosPhiN->AddBinContent(bin4);
01507
01508 }
01509 }
01510 }
01511 }
01512
01513 delete TheTriplet;
01514
01515 return NumTriplets;
01516
01517 }
01518
01519
01520 int StHbtThreeParticleAnalysis::CreateMixedTriplets(StHbtParticleCollection *partColl1, StHbtParticleCollection *partColl2, StHbtParticleCollection *partColl3) {
01521
01522 int NumTriplets=0;
01523
01524 if (!partColl1->size() || !partColl1->size() || !partColl1->size()) return 0;
01525
01526 StHbtTriplet* TheTriplet = new StHbtTriplet;
01527
01528 StHbtParticleIterator PartIter1;
01529 StHbtParticleIterator PartIter2;
01530 StHbtParticleIterator PartIter3;
01531 StHbtCorrFctnIterator CorrFctnIter;
01532 StHbtParticleIterator StartOuterLoop = partColl1->begin();
01533 StHbtParticleIterator EndOuterLoop = partColl1->end();
01534 StHbtParticleIterator StartMiddleLoop = partColl2->begin();
01535 StHbtParticleIterator EndMiddleLoop = partColl2->end();
01536 StHbtParticleIterator StartInnerLoop = partColl3->begin();
01537 StHbtParticleIterator EndInnerLoop = partColl3->end();
01538
01539 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
01540 TheTriplet->SetTrack1(*PartIter1);
01541 for (PartIter2 = StartMiddleLoop; PartIter2!=EndMiddleLoop;PartIter2++){
01542 TheTriplet->SetTrack2(*PartIter2);
01543 for (PartIter3 = StartInnerLoop; PartIter3!=EndInnerLoop;PartIter3++){
01544 TheTriplet->SetTrack3(*PartIter3);
01545
01546
01547
01548
01549
01550 if (mTripletCut->Pass(TheTriplet)){
01551 NumTriplets++;
01552 for (CorrFctnIter=mCorrFctnCollection->begin();
01553 CorrFctnIter!=mCorrFctnCollection->end();CorrFctnIter++){
01554 StHbtCorrFctn* CorrFctn = *CorrFctnIter;
01555 CorrFctn->AddMixedTriplet(TheTriplet);
01556 }
01557 }
01558 }
01559 }
01560 }
01561
01562 delete TheTriplet;
01563
01564 return NumTriplets;
01565
01566 }
01567
01568
01569 void StHbtThreeParticleAnalysis::EventBegin(const StHbtEvent* ev){
01570 mFirstParticleCut->EventBegin(ev);
01571 mSecondParticleCut->EventBegin(ev);
01572 mThirdParticleCut->EventBegin(ev);
01573 for (StHbtCorrFctnIterator iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
01574 (*iter)->EventBegin(ev);
01575 }
01576 }
01577
01578 void StHbtThreeParticleAnalysis::EventEnd(const StHbtEvent* ev){
01579 mFirstParticleCut->EventBegin(ev);
01580 mSecondParticleCut->EventBegin(ev);
01581 mThirdParticleCut->EventBegin(ev);
01582 for (StHbtCorrFctnIterator iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
01583 (*iter)->EventEnd(ev);
01584 }
01585 }
01586
01587 void StHbtThreeParticleAnalysis::Finish(){
01588 if (mCalcCosPhi) {
01589
01590 mCosPhiE->Divide(mCosPhiN);
01591 mCosPhi->Divide(mCosPhiN);
01592 for (int Iter1=1; Iter1<=mCosPhiN->GetNbinsX();Iter1++)
01593 mCosPhi->SetBinError(Iter1, mCosPhiE->GetBinContent(Iter1));
01594
01595 cout << "Writing to file: CosPhi" << endl;
01596 TFile cosfile(mSaveFile, "NEW");
01597 mCosPhi->Write("cosphi");
01598 mCosPhiN->Write("cosphiN");
01599 cosfile.Close();
01600 cout << "Done writing: CosPhi" << endl;
01601 }
01602 StHbtCorrFctnIterator iter;
01603 for (iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
01604 (*iter)->Finish();
01605 }
01606 }
01607
01608
01609 void StHbtThreeParticleAnalysis::AddEventProcessed() {
01610 mNeventsProcessed++;
01611 }
01612