00001
00002
00003
00004
00005
00006
00007
00008
00010
00011
00012
00014
00015 #include <Stiostream.h>
00016 #include <stdlib.h>
00017 #include <math.h>
00018 #include "StFlowEvent.h"
00019 #include "StFlowTrackCollection.h"
00020 #include "StFlowSelection.h"
00021 #include "StFlowConstants.h"
00022 #include "PhysicalConstants.h"
00023 #include "SystemOfUnits.h"
00024 #include "StEnumerations.h"
00025 #include "TVector2.h"
00026 #include "TComplex.h"
00027 #include "TH1.h"
00028 #define PR(x) cout << "##### FlowEvent: " << (#x) << " = " << (x) << endl;
00029
00030 ClassImp(StFlowEvent)
00031 Double_t StFlowEvent::mZDCSMDCenterex = Flow::zdcsmd_ex0;
00032 Double_t StFlowEvent::mZDCSMDCenterey = Flow::zdcsmd_ey0;
00033 Double_t StFlowEvent::mZDCSMDCenterwx = Flow::zdcsmd_wx0;
00034 Double_t StFlowEvent::mZDCSMDCenterwy = Flow::zdcsmd_wy0;
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 Float_t StFlowEvent::mV1TPCDetctWgtG_Mix[Flow::nSels] ={1., 0.};
00047 Float_t StFlowEvent::mV1FtpcWestDetctWgtG_Mix[Flow::nSels] ={1., 1.};
00048 Float_t StFlowEvent::mV1FtpcEastDetctWgtG_Mix[Flow::nSels] ={1., 1.};
00049
00050 Float_t StFlowEvent::mV2TPCDetctWgtG_Mix[Flow::nSels] ={1., 1.};
00051 Float_t StFlowEvent::mV2FtpcWestDetctWgtG_Mix[Flow::nSels] ={1., 0.};
00052 Float_t StFlowEvent::mV2FtpcEastDetctWgtG_Mix[Flow::nSels] ={1., 0.};
00053
00054 Float_t StFlowEvent::mEtaTpcCuts[2][2][Flow::nSels] = {{{0.,0.5},
00055 {0.,0.} },
00056 {{1.0,2.},
00057 {1.0,1.} }};
00058
00059
00060
00061
00062 Float_t StFlowEvent::mEtaFtpcCuts[4][2][Flow::nSels] = {{{-4.0,-4.0},
00063 {-4.0,-4.0}},
00064 {{-2.7,-2.7},
00065 {-2.7,-2.7} },
00066 {{2.7,2.7},
00067 {2.7,2.7} },
00068 {{4.0,4.0},
00069 {4.0,4.0} }};
00070
00071 Float_t StFlowEvent::mPtTpcCuts[2][2][Flow::nSels] = {{{0.15,0.15},
00072 {0.15,0.15} },
00073 {{2.,2.},
00074 {2.,2.} }};
00075 Float_t StFlowEvent::mPtFtpcCuts[2][2][Flow::nSels] = {{{0.15,0.15},
00076 {0.15,0.15} },
00077 {{2.,2.},
00078 {2.,2.} }};
00079
00080 Float_t StFlowEvent::mPiPlusCuts[2] = {-3., 3.};
00081 Float_t StFlowEvent::mPiMinusCuts[2] = {-3., 3.};
00082 Float_t StFlowEvent::mProtonCuts[2] = {-3., 3.};
00083 Float_t StFlowEvent::mAntiProtonCuts[2] = {-3., 3.};
00084 Float_t StFlowEvent::mKMinusCuts[2] = {-3., 3.};
00085 Float_t StFlowEvent::mKPlusCuts[2] = {-3., 3.};
00086 Float_t StFlowEvent::mDeuteronCuts[2] = {-3., 3.};
00087 Float_t StFlowEvent::mAntiDeuteronCuts[2] = {-3., 3.};
00088 Float_t StFlowEvent::mElectronCuts[2] = {-3., 3.};
00089 Float_t StFlowEvent::mPositronCuts[2] = {-3., 3.};
00090 Float_t StFlowEvent::mDcaGlobalTpcCuts[2] = { 0., 0.};
00091 Float_t StFlowEvent::mDcaGlobalFtpcCuts[2] = { 0., 0.};
00092 Float_t StFlowEvent::mPtWgtSaturation = 2.;
00093 Bool_t StFlowEvent::mPtWgt = kTRUE;
00094 Bool_t StFlowEvent::mEtaWgt = kTRUE;
00095 Bool_t StFlowEvent::mProbPid = kFALSE;
00096 Bool_t StFlowEvent::mEtaSubs = kFALSE;
00097 Bool_t StFlowEvent::mRanSubs = kFALSE;
00098 Bool_t StFlowEvent::mFirstLastPhiWgt = kFALSE;
00099 Bool_t StFlowEvent::mFirstLastPoints = kFALSE;
00100 Bool_t StFlowEvent::mUseZDCSMD = kFALSE;
00101 Char_t StFlowEvent::mPid[10] = {'\0'};
00102
00103
00104
00105 StFlowEvent::StFlowEvent() {
00106
00107
00108 pTrackCollection = new StFlowTrackCollection;
00109
00110 }
00111
00112
00113
00114 StFlowEvent::~StFlowEvent() {
00115
00116 delete pTrackCollection;
00117
00118 }
00119
00120
00121
00122 Double_t StFlowEvent::PhiWeightRaw(Int_t selN, Int_t harN, StFlowTrack*
00123 pFlowTrack) const {
00124
00125
00126 bool oddHar = (harN+1) % 2;
00127 harN = oddHar ? 0 : 1;
00128
00129 StTrackTopologyMap map = pFlowTrack->TopologyMap();
00130 float phi = pFlowTrack->Phi();
00131 if (phi < 0.) phi += twopi;
00132 float eta = pFlowTrack->Eta();
00133
00134 Double_t phiWgt = 0.;
00135 int n = 0;
00136
00137 float vertexZ = mVertexPos.z();
00138 if (map.hasHitInDetector(kTpcId) || (map.data(0) == 0 && map.data(1) == 0)) {
00139
00140 n = (int)((phi/twopi)*Flow::nPhiBins);
00141 if (mFirstLastPhiWgt) {
00142 float zFirstPoint = pFlowTrack->ZFirstPoint();
00143 float zLastPoint = pFlowTrack->ZLastPoint();
00144 if (zFirstPoint > 0. && zLastPoint > 0.) {
00145 phiWgt = mPhiWgtFarWest[selN][harN][n];
00146 } else if (zFirstPoint > 0. && zLastPoint < 0.) {
00147 phiWgt = mPhiWgtWest[selN][harN][n];
00148 } else if (zFirstPoint < 0. && zLastPoint > 0.) {
00149 phiWgt = mPhiWgtEast[selN][harN][n];
00150 } else {
00151 phiWgt = mPhiWgtFarEast[selN][harN][n];
00152 }
00153 } else {
00154 if (eta > 0. && vertexZ > 0.) {
00155 phiWgt = mPhiWgtFarWest[selN][harN][n];
00156 } else if (eta > 0. && vertexZ < 0.) {
00157 phiWgt = mPhiWgtWest[selN][harN][n];
00158 } else if (eta < 0. && vertexZ > 0.) {
00159 phiWgt = mPhiWgtEast[selN][harN][n];
00160 } else {
00161 phiWgt = mPhiWgtFarEast[selN][harN][n];
00162 }
00163 }
00164 }
00165
00166 else if (map.trackFtpcEast()) {
00167 n = (int)((phi/twopi)*Flow::nPhiBinsFtpc);
00168 if (vertexZ < 0.) {
00169 phiWgt = mPhiWgtFtpcFarEast[selN][harN][n];
00170 }
00171 else {
00172 phiWgt = mPhiWgtFtpcEast[selN][harN][n];
00173 }
00174 }
00175
00176 else if (map.trackFtpcWest()) {
00177 n = (int)((phi/twopi)*Flow::nPhiBinsFtpc);
00178 if (vertexZ > 0.) {
00179 phiWgt = mPhiWgtFtpcFarWest[selN][harN][n];
00180 }
00181 else {
00182 phiWgt = mPhiWgtFtpcWest[selN][harN][n];
00183 }
00184 }
00185
00186 return phiWgt;
00187 }
00188
00189
00190
00191 Double_t StFlowEvent::Weight(Int_t selN, Int_t harN, StFlowTrack*
00192 pFlowTrack) const {
00193
00194
00195
00196 Double_t wgt = 1.;
00197 wgt *= PtAbsWgtValue(pFlowTrack->Pt());
00198 float eta = pFlowTrack->Eta();
00199 wgt *= EtaAbsWgtValue(eta);
00200
00201 if (harN == 0 && eta < 0.) { wgt *= -1. ; }
00202
00203 return wgt;
00204 }
00205
00206
00207
00208 Double_t StFlowEvent::PtAbsWgtValue(Double_t pt) const {
00209
00210 return ((mPtWgt) ? ((pt < mPtWgtSaturation) ? pt : mPtWgtSaturation) : 1.);
00211 }
00212
00213
00214
00215 Double_t StFlowEvent::EtaAbsWgtValue(Double_t eta) const {
00216
00217 return ((mEtaWgt) ? ((fabs(eta)<0.005) ? 0.005 : fabs(eta)) : 1.);
00218 }
00219
00220
00221
00222 Double_t StFlowEvent::PhiWeight(Int_t selN, Int_t harN, StFlowTrack*
00223 pFlowTrack) const {
00224
00225
00226
00227 Double_t phiWgtRaw = PhiWeightRaw(selN, harN, pFlowTrack);
00228 Double_t weight = Weight(selN, harN, pFlowTrack);
00229
00230 return phiWgtRaw * weight;
00231 }
00232
00233
00234
00235 Double_t StFlowEvent::ZDCSMD_PsiWgtEast() {
00236
00237
00238 TH1F *mZDCSMD_PsiWgt = new TH1F("ZDCSMD_PsiWgt","ZDCSMD_PsiWgt",
00239 Flow::zdcsmd_nPsiBins,-twopi/2.,twopi/2.);
00240 Int_t n = mZDCSMD_PsiWgt->FindBin(ZDCSMD_PsiEst());
00241 mZDCSMD_PsiWgt->Delete();
00242
00243 return mZDCSMD_PsiWgtEast[n-1];
00244 }
00245
00246
00247
00248 Double_t StFlowEvent::ZDCSMD_PsiWgtWest() {
00249
00250
00251 TH1F *mZDCSMD_PsiWgt = new TH1F("ZDCSMD_PsiWgt","ZDCSMD_PsiWgt",
00252 Flow::zdcsmd_nPsiBins,-twopi/2.,twopi/2.);
00253 Int_t n = mZDCSMD_PsiWgt->FindBin(ZDCSMD_PsiWst());
00254 mZDCSMD_PsiWgt->Delete();
00255
00256 return mZDCSMD_PsiWgtWest[n-1];
00257 }
00258
00259
00260 Double_t StFlowEvent::ZDCSMD_PsiWgtFull() {
00261
00262 TH1F *mZDCSMD_PsiWgt=new TH1F("ZDCSMD_PsiWgt","ZDCSMD_PsiWgt",Flow::zdcsmd_nPsiBins,0.,twopi);
00263 StFlowSelection* mFlowSelect;
00264 Int_t n =mZDCSMD_PsiWgt->FindBin(Q(mFlowSelect).Phi());
00265 mZDCSMD_PsiWgt->Delete();
00266
00267 return mZDCSMD_PsiWgtFull[n-1];
00268 }
00269
00270
00271
00272 UInt_t StFlowEvent::Mult(StFlowSelection* pFlowSelect) {
00273
00274
00275 UInt_t mult = 0;
00276
00277 StFlowTrackIterator itr;
00278 for (itr = TrackCollection()->begin();
00279 itr != TrackCollection()->end(); itr++) {
00280 StFlowTrack* pFlowTrack = *itr;
00281 if (pFlowSelect->Select(pFlowTrack)) mult++;
00282 }
00283
00284 return mult;
00285 }
00286
00287
00288
00289 UInt_t StFlowEvent::MultPart(StFlowSelection* pFlowSelect) {
00290
00291
00292 UInt_t mult = 0;
00293
00294 StFlowTrackIterator itr;
00295 for (itr = TrackCollection()->begin();
00296 itr != TrackCollection()->end(); itr++) {
00297 StFlowTrack* pFlowTrack = *itr;
00298 if (pFlowSelect->SelectPart(pFlowTrack)) mult++;
00299 }
00300
00301 return mult;
00302 }
00303
00304
00305
00306 Float_t StFlowEvent::MeanPt(StFlowSelection* pFlowSelect) {
00307
00308
00309 float sumPt = 0.;
00310 UInt_t mult = 0;
00311
00312 StFlowTrackIterator itr;
00313 for (itr = TrackCollection()->begin();
00314 itr != TrackCollection()->end(); itr++) {
00315 StFlowTrack* pFlowTrack = *itr;
00316 if (pFlowSelect->Select(pFlowTrack)) {
00317 sumPt += pFlowTrack->Pt();
00318 mult++;
00319 }
00320 }
00321
00322 return (mult) ? sumPt/(float)mult : 0.;
00323 }
00324
00325
00326
00327 TVector2 StFlowEvent::Q(StFlowSelection* pFlowSelect) {
00328
00329
00330 TVector2 mQ, reCent;
00331 Double_t mQx=0., mQy=0.;
00332
00333 if (mUseZDCSMD) {
00334 Float_t eXsum=0., eYsum=0., wXsum=0., wYsum=0.;
00335 Float_t eXWgt=0., eYWgt=0., wXWgt=0., wYWgt=0.;
00336 for (int v=1; v<8; v++) {
00337 eXsum += ZDCSMD_GetPosition(0,0,v)*ZDCSMD(0,0,v);
00338 wXsum += ZDCSMD_GetPosition(1,0,v)*ZDCSMD(1,0,v);
00339 eXWgt += ZDCSMD(0,0,v);
00340 wXWgt += ZDCSMD(1,0,v);
00341 }
00342 for (int h=1;h<9;h++) {
00343 eYsum += ZDCSMD_GetPosition(0,1,h)*ZDCSMD(0,1,h);
00344 wYsum += ZDCSMD_GetPosition(1,1,h)*ZDCSMD(1,1,h);
00345 eYWgt += ZDCSMD(0,1,h);
00346 wYWgt += ZDCSMD(1,1,h);
00347 }
00348 mQx= (eXWgt>0. && wXWgt>0. && eYWgt>0. && wYWgt>0.) ?
00349 eXsum/eXWgt - wXsum/wXWgt:0.;
00350 mQy= (eXWgt>0. && wXWgt>0. && eYWgt>0. && wYWgt>0.) ?
00351 eYsum/eYWgt - wYsum/wYWgt:0.;
00352 }
00353 else {
00354 int selN = pFlowSelect->Sel();
00355 int harN = pFlowSelect->Har();
00356 double order = (double)(harN + 1);
00357
00358 StFlowTrackIterator itr;
00359 for (itr = TrackCollection()->begin();
00360 itr != TrackCollection()->end(); itr++) {
00361 StFlowTrack* pFlowTrack = *itr;
00362 if (pFlowSelect->Select(pFlowTrack)) {
00363 double phiWgt = PhiWeight(selN, harN, pFlowTrack);
00364 float phi = pFlowTrack->Phi();
00365 reCent = ReCentEP(selN, harN, pFlowTrack);
00366 mQx += (phiWgt * cos(order * phi) - reCent.X());
00367 mQy += (phiWgt * sin(order * phi) - reCent.Y());
00368 }
00369 }
00370 }
00371
00372 mQ.Set(mQx, mQy);
00373
00374 return mQ;
00375 }
00376
00377
00378
00379 TVector2 StFlowEvent::ReCentPar(StFlowSelection* pFlowSelect, char* TPC) {
00380
00381
00382
00383
00384
00385 TVector2 mQ;
00386 Double_t mQx=0., mQy=0., SumOfWeight=0.;
00387
00388 int selN = pFlowSelect->Sel();
00389 int harN = pFlowSelect->Har();
00390 double order = (double)(harN + 1);
00391 StTrackTopologyMap map;
00392
00393 StFlowTrackIterator itr;
00394 for (itr = TrackCollection()->begin();
00395 itr != TrackCollection()->end(); itr++) {
00396 StFlowTrack* pFlowTrack = *itr;
00397 if (pFlowSelect->SelectPart(pFlowTrack)) {
00398 map = pFlowTrack->TopologyMap();
00399 if ((!strcmp(TPC,"TPCE") && map.trackFtpcEast()) ||
00400 (!strcmp(TPC,"TPCW") && map.trackFtpcWest()) ||
00401 (!strcmp(TPC,"TPC") && map.hasHitInDetector(kTpcId))) {
00402 float phi = pFlowTrack->Phi();
00403 double wgt = fabs(Weight(selN, harN, pFlowTrack));
00404 mQx += wgt * cos(order * phi);
00405 mQy += wgt * sin(order * phi);
00406 SumOfWeight += wgt;
00407 }
00408 }
00409 }
00410
00411 if (SumOfWeight)
00412 mQ.Set(mQx/SumOfWeight, mQy/SumOfWeight);
00413 else mQ.Set(0.,0.);
00414
00415 return mQ;
00416 }
00417
00418
00419
00420 TVector2 StFlowEvent::ReCentEPPar(StFlowSelection* pFlowSelect, char* TPC) {
00421
00422
00423
00424
00425
00426 TVector2 mQ;
00427 Double_t mult=0., mQx=0., mQy=0.;
00428
00429 int selN = pFlowSelect->Sel();
00430 int harN = pFlowSelect->Har();
00431 double order = (double)(harN + 1);
00432 StTrackTopologyMap map;
00433
00434 StFlowTrackIterator itr;
00435 for (itr = TrackCollection()->begin();
00436 itr != TrackCollection()->end(); itr++) {
00437 StFlowTrack* pFlowTrack = *itr;
00438 if (pFlowSelect->Select(pFlowTrack)) {
00439 map = pFlowTrack->TopologyMap();
00440 float eta = pFlowTrack->Eta();
00441 if ((!strcmp(TPC,"FTPCE") && map.trackFtpcEast()) ||
00442 (!strcmp(TPC,"FTPCW") && map.trackFtpcWest()) ||
00443 (!strcmp(TPC,"TPCE") && eta < 0. && map.hasHitInDetector(kTpcId)) ||
00444 (!strcmp(TPC,"TPCW") && eta > 0. && map.hasHitInDetector(kTpcId)) ) {
00445 float phi = pFlowTrack->Phi();
00446 double phiWgt = PhiWeight(selN, harN, pFlowTrack);
00447 mQx += phiWgt * cos(order * phi);
00448 mQy += phiWgt * sin(order * phi);
00449 mult++;
00450 }
00451 }
00452 }
00453
00454 if (mult) { mQ.Set(mQx/mult, mQy/mult); }
00455 else { mQ.Set(0.,0.); }
00456
00457 return mQ;
00458 }
00459
00460
00461
00462 TVector2 StFlowEvent::ReCent(Int_t selN, Int_t harN, StFlowTrack* pFlowTrack) const {
00463
00464
00465 TVector2 reCent;
00466 Double_t reCentX, reCentY;
00467 StTrackTopologyMap map = pFlowTrack->TopologyMap();
00468
00469 if (map.hasHitInDetector(kTpcId)) {
00470 reCentX = mReCentX[selN][harN][2];
00471 reCentY = mReCentY[selN][harN][2];
00472 } else if (map.trackFtpcEast()) {
00473 reCentX = mReCentX[selN][harN][0];
00474 reCentY = mReCentY[selN][harN][0];
00475 } else if (map.trackFtpcWest()) {
00476 reCentX = mReCentX[selN][harN][1];
00477 reCentY = mReCentY[selN][harN][1];
00478 } else {
00479 reCentX = 0.;
00480 reCentY = 0.;
00481 }
00482
00483 reCent.Set(reCentX, reCentY);
00484 return reCent;
00485 }
00486
00487
00488
00489 TVector2 StFlowEvent::ReCentEP(Int_t selN, Int_t harN, StFlowTrack* pFlowTrack) const {
00490
00491
00492 TVector2 reCent;
00493 Double_t reCentX, reCentY;
00494 StTrackTopologyMap map = pFlowTrack->TopologyMap();
00495
00496 if (map.hasHitInDetector(kTpcId)) {
00497 float eta = pFlowTrack->Eta();
00498 if (eta > 0.) {
00499 reCentX = mReCentX[selN][harN][3];
00500 reCentY = mReCentY[selN][harN][3];
00501 } else {
00502 reCentX = mReCentX[selN][harN][2];
00503 reCentY = mReCentY[selN][harN][2];
00504 }
00505 } else if (map.trackFtpcEast()) {
00506 reCentX = mReCentX[selN][harN][0];
00507 reCentY = mReCentY[selN][harN][0];
00508 } else if (map.trackFtpcWest()) {
00509 reCentX = mReCentX[selN][harN][1];
00510 reCentY = mReCentY[selN][harN][1];
00511 } else {
00512 reCentX = 0.;
00513 reCentY = 0.;
00514 }
00515
00516 reCent.Set(reCentX, reCentY);
00517 return reCent;
00518 }
00519
00520
00521
00522 TVector2 StFlowEvent::QPart(StFlowSelection* pFlowSelect) {
00523
00524
00525 TVector2 reCent, mQ;
00526 Double_t mQx=0., mQy=0.;
00527
00528 int selN = pFlowSelect->Sel();
00529 int harN = pFlowSelect->Har();
00530 double order = (double)(harN + 1);
00531
00532 StFlowTrackIterator itr;
00533 for (itr = TrackCollection()->begin();
00534 itr != TrackCollection()->end(); itr++) {
00535 StFlowTrack* pFlowTrack = *itr;
00536 if (pFlowSelect->SelectPart(pFlowTrack)) {
00537 double phiWgt = PhiWeight(selN, harN, pFlowTrack);
00538 float phi = pFlowTrack->Phi();
00539 reCent = ReCent(selN, harN, pFlowTrack);
00540 mQx += phiWgt * (cos(order * phi) - reCent.X());
00541 mQy += phiWgt * (sin(order * phi) - reCent.Y());
00542 }
00543 }
00544
00545 mQ.Set(mQx, mQy);
00546 return mQ;
00547 }
00548
00549
00550
00551 TVector2 StFlowEvent::NormQ(StFlowSelection* pFlowSelect) {
00552
00553
00554
00555 TVector2 mQ, reCent;
00556 Double_t mQx=0., mQy=0.;
00557 int selN = pFlowSelect->Sel();
00558 int harN = pFlowSelect->Har();
00559 double order = (double)(harN + 1);
00560 double SumOfWeightSqr = 0;
00561
00562
00563 StFlowTrackIterator itr;
00564 for (itr = TrackCollection()->begin();
00565 itr != TrackCollection()->end(); itr++) {
00566 StFlowTrack* pFlowTrack = *itr;
00567 if (pFlowSelect->Select(pFlowTrack)) {
00568
00569 double phiWgt = PhiWeight(selN, harN, pFlowTrack);
00570 SumOfWeightSqr += phiWgt*phiWgt;
00571
00572 float phi = pFlowTrack->Phi();
00573 reCent = ReCent(selN, harN, pFlowTrack);
00574 mQx += phiWgt * (cos(order * phi) - reCent.X());
00575 mQy += phiWgt * (sin(order * phi) - reCent.Y());
00576 }
00577 }
00578
00579 if (SumOfWeightSqr)
00580 mQ.Set(mQx/::sqrt(SumOfWeightSqr), mQy/::sqrt(SumOfWeightSqr));
00581 else mQ.Set(0.,0.);
00582
00583 return mQ;
00584 }
00585
00586
00587
00588 Float_t StFlowEvent::q(StFlowSelection* pFlowSelect) {
00589
00590
00591 TVector2 mQ, reCent;
00592 Double_t mQx=0., mQy=0.;
00593 int selN = pFlowSelect->Sel();
00594 int harN = pFlowSelect->Har();
00595 double order = (double)(harN + 1);
00596 double SumOfWeightSqr = 0;
00597
00598
00599 StFlowTrackIterator itr;
00600 for (itr = TrackCollection()->begin();
00601 itr != TrackCollection()->end(); itr++) {
00602 StFlowTrack* pFlowTrack = *itr;
00603 if (pFlowSelect->Select(pFlowTrack)) {
00604
00605 double phiWgt = PhiWeightRaw(selN, harN, pFlowTrack);
00606 SumOfWeightSqr += phiWgt*phiWgt;
00607
00608 float phi = pFlowTrack->Phi();
00609 reCent = ReCent(selN, harN, pFlowTrack);
00610 mQx += phiWgt * (cos(order * phi) - reCent.X());
00611 mQy += phiWgt * (sin(order * phi) - reCent.Y());
00612 }
00613 }
00614
00615 if (SumOfWeightSqr)
00616 mQ.Set(mQx/::sqrt(SumOfWeightSqr), mQy/::sqrt(SumOfWeightSqr));
00617 else mQ.Set(0.,0.);
00618
00619 return mQ.Mod();
00620 }
00621
00622
00623
00624 Double_t StFlowEvent::SumWeightSquare(StFlowSelection* pFlowSelect) {
00625
00626
00627
00628
00629
00630
00631
00632 int selN = pFlowSelect->Sel();
00633 int harN = pFlowSelect->Har();
00634 Double_t SumOfWeightSqr = 0;
00635
00636 StFlowTrackIterator itr;
00637 for (itr = TrackCollection()->begin();
00638 itr != TrackCollection()->end(); itr++) {
00639 StFlowTrack* pFlowTrack = *itr;
00640 if (pFlowSelect->Select(pFlowTrack)) {
00641
00642 double phiWgt = Weight(selN, harN, pFlowTrack);
00643 SumOfWeightSqr += phiWgt*phiWgt;
00644 }
00645 }
00646
00647 if (SumOfWeightSqr < 0.) return Mult(pFlowSelect);
00648
00649 return SumOfWeightSqr;
00650 }
00651
00652
00653
00654 Float_t StFlowEvent::Qtheta(StFlowSelection* pFlowSelect, Float_t theta) {
00655
00656
00657
00658 Float_t Qtheta = 0.;
00659
00660 int selN = pFlowSelect->Sel();
00661 int harN = pFlowSelect->Har();
00662 double order = (double)(harN + 1);
00663 double reCentTheta;
00664 TVector2 reCent;
00665
00666 StFlowTrackIterator itr;
00667 for (itr = TrackCollection()->begin();
00668 itr != TrackCollection()->end(); itr++) {
00669 StFlowTrack* pFlowTrack = *itr;
00670 if (pFlowSelect->SelectPart(pFlowTrack)) {
00671 double wgt = Weight(selN, harN, pFlowTrack);
00672 float phi = pFlowTrack->Phi();
00673 reCent = ReCent(selN, harN, pFlowTrack);
00674 reCentTheta = reCent.X() * cos(order*theta) + reCent.Y() * sin(order*theta);
00675 Qtheta += wgt * (cos(order * (phi - theta)) - reCentTheta);
00676 }
00677 }
00678
00679 return Qtheta;
00680 }
00681
00682
00683
00684 TComplex StFlowEvent::Grtheta(StFlowSelection* pFlowSelect, Float_t r, Float_t theta) {
00685
00686
00687
00688 TComplex G = TComplex::One();
00689 int selN = pFlowSelect->Sel();
00690 int harN = pFlowSelect->Har();
00691 double order = (double)(harN + 1);
00692 double reCentTheta;
00693 TVector2 reCent;
00694
00695 StFlowTrackIterator itr;
00696 for (itr = TrackCollection()->begin();
00697 itr != TrackCollection()->end(); itr++) {
00698 StFlowTrack* pFlowTrack = *itr;
00699 if (pFlowSelect->SelectPart(pFlowTrack)) {
00700 double wgt = Weight(selN, harN, pFlowTrack);
00701 float phi = pFlowTrack->Phi();
00702 reCent = ReCent(selN, harN, pFlowTrack);
00703 reCentTheta = reCent.X() * cos(order*theta) + reCent.Y() * sin(order*theta);
00704 double Gim = r * wgt * (cos(order * (phi - theta)) - reCentTheta);
00705 TComplex G_i(1., Gim);
00706 G *= G_i;
00707 }
00708 }
00709
00710 return G;
00711 }
00712
00713
00714
00715
00716 TComplex StFlowEvent::GV1r0theta(StFlowSelection* pFlowSelect, Float_t r0, Float_t theta1, Float_t theta) {
00717
00718
00719
00720 TComplex G = TComplex::One();
00721 double reCentTheta;
00722 TVector2 reCent;
00723
00724 StFlowTrackIterator itr;
00725 for (itr = TrackCollection()->begin();
00726 itr != TrackCollection()->end(); itr++) {
00727 StFlowTrack* pFlowTrack = *itr;
00728 if (pFlowSelect->SelectPart(pFlowTrack)) {
00729 double wgt1 = Weight(1, 0, pFlowTrack);
00730 double wgt2 = Weight(1, 1, pFlowTrack);
00731 float phi = pFlowTrack->Phi();
00732
00733 reCent.Set(0.,0.);
00734 reCentTheta = reCent.X() * cos(1.*theta1) + reCent.Y() * sin(1.*theta1);
00735 double Gim1 = r0 * Flow::epsV1 * wgt1 * (cos(phi - theta1) - reCentTheta);
00736
00737 reCent.Set(0.,0.);
00738 reCentTheta = reCent.X() * cos(2.*theta) + reCent.Y() * sin(2.*theta);
00739 double Gim2 = r0 * wgt2 * (cos(2*(phi - theta)) - reCentTheta);
00740 TComplex G_i(1., Gim1+Gim2);
00741 G *= G_i;
00742 }
00743 }
00744
00745 return G;
00746 }
00747
00748
00749 TComplex StFlowEvent::Gder_r0theta(StFlowSelection* pFlowSelect, Float_t r0, Float_t theta) {
00750
00751
00752
00753
00754
00755 TComplex Gder(0.,0.);
00756 int selN = pFlowSelect->Sel();
00757 int harN = pFlowSelect->Har();
00758 double order = (double)(harN + 1);
00759 double reCentTheta;
00760 TVector2 reCent;
00761
00762 StFlowTrackIterator itr;
00763 for (itr = TrackCollection()->begin();
00764 itr != TrackCollection()->end(); itr++) {
00765 StFlowTrack* pFlowTrack = *itr;
00766 if (pFlowSelect->SelectPart(pFlowTrack)) {
00767 double wgt = Weight(selN, harN, pFlowTrack);
00768 float phi = pFlowTrack->Phi();
00769 reCent = ReCent(selN, harN, pFlowTrack);
00770 reCentTheta = reCent.X() * cos(order*theta) + reCent.Y() * sin(order*theta);
00771 double cosTerm = wgt * (cos(order * (phi - theta)) - reCentTheta);
00772 TComplex denom(1., r0*cosTerm);
00773 Gder += (cosTerm / denom);
00774 }
00775 }
00776
00777 return Gder;
00778 }
00779
00780
00781
00782 Float_t StFlowEvent::Psi(StFlowSelection* pFlowSelect) {
00783
00784
00785 int harN = pFlowSelect->Har();
00786 float order = (float)(harN + 1);
00787 Float_t psi = 0.;
00788
00789 TVector2 mQ = Q(pFlowSelect);
00790
00791 if (mQ.Mod()) {
00792 psi= mQ.Phi() / order;
00793 if (psi < 0.) { psi += twopi / order; }
00794 }
00795
00796 return psi;
00797 }
00798
00799
00800
00801 Float_t StFlowEvent::ZDCSMD_PsiCorr() {
00802
00803
00804 Float_t psi_e = ZDCSMD_PsiEst();
00805 Float_t psi_w = ZDCSMD_PsiWst();
00806 Float_t psi_w_shift = psi_w + twopi/2.;
00807
00808 if(psi_w_shift > twopi/2.) psi_w_shift -= twopi;
00809 if(psi_w_shift < -twopi/2.) psi_w_shift += twopi;
00810
00811 Float_t psi_delta = psi_e - psi_w_shift;
00812
00813 if(psi_delta > twopi/2.) psi_delta -= twopi;
00814 if(psi_delta < -twopi/2.) psi_delta += twopi;
00815
00816 return psi_delta;
00817 }
00818
00819
00820
00821 Float_t StFlowEvent::ZDCSMD_PsiEst() {
00822
00823
00824 Float_t eXsum=0., eYsum=0., eXWgt=0., eYWgt=0.;
00825
00826 for(int v=1; v<8; v++) {
00827 eXsum += ZDCSMD_GetPosition(0,0,v)*ZDCSMD(0,0,v);
00828 eXWgt += ZDCSMD(0,0,v);
00829 }
00830 for(int h=1; h<9; h++) {
00831 eYsum += ZDCSMD_GetPosition(0,1,h)*ZDCSMD(0,1,h);
00832 eYWgt += ZDCSMD(0,1,h);
00833 }
00834
00835 Float_t psi_e = atan2((eYWgt>0.) ? eYsum/eYWgt:0.,(eXWgt>0.) ? eXsum/eXWgt:0.);
00836
00837 return psi_e;
00838 }
00839
00840
00841
00842 Float_t StFlowEvent::ZDCSMD_PsiWst() {
00843
00844
00845 Float_t wXsum=0.,wYsum=0.,wXWgt=0.,wYWgt=0.;
00846
00847 for(int v=1;v<8;v++) {
00848 wXsum += ZDCSMD_GetPosition(1,0,v)*ZDCSMD(1,0,v);
00849 wXWgt += ZDCSMD(1,0,v);
00850 }
00851 for(int h=1;h<9;h++) {
00852 wYsum += ZDCSMD_GetPosition(1,1,h)*ZDCSMD(1,1,h);
00853 wYWgt += ZDCSMD(1,1,h);
00854 }
00855
00856 Float_t psi_w = atan2((wYWgt>0.) ? wYsum/wYWgt:0.,(wXWgt>0.) ? wXsum/wXWgt:0.);
00857
00858 return psi_w;
00859 }
00860
00861
00862
00863 Float_t StFlowEvent::ZDCSMD_GetPosition(int eastwest,int verthori,int strip) {
00864
00865
00866 Float_t zdcsmd_x[7] = {0.5,2,3.5,5,6.5,8,9.5};
00867 Float_t zdcsmd_y[8] = {1.25,3.25,5.25,7.25,9.25,11.25,13.25,15.25};
00868
00869 if(eastwest==0 && verthori==0) return zdcsmd_x[strip-1]-mZDCSMDCenterex;
00870 if(eastwest==1 && verthori==0) return mZDCSMDCenterwx-zdcsmd_x[strip-1];
00871 if(eastwest==0 && verthori==1) return zdcsmd_y[strip-1]/sqrt(2.)-mZDCSMDCenterey;
00872 if(eastwest==1 && verthori==1) return zdcsmd_y[strip-1]/sqrt(2.)-mZDCSMDCenterwy;
00873
00874 return 0;
00875 }
00876
00877
00878
00879 Double_t StFlowEvent::G_New(StFlowSelection* pFlowSelect, Double_t Zx, Double_t Zy) {
00880
00881
00882 int selN = pFlowSelect->Sel();
00883 int harN = pFlowSelect->Har();
00884 double order = (double)(harN + 1);
00885
00886 double mult = (double)Mult(pFlowSelect);
00887 Double_t theG = 1.;
00888
00889 StFlowTrackIterator itr;
00890 for (itr = TrackCollection()->begin();
00891 itr != TrackCollection()->end(); itr++) {
00892 StFlowTrack* pFlowTrack = *itr;
00893 if (pFlowSelect->Select(pFlowTrack)) {
00894
00895 double phiWgt = Weight(selN, harN, pFlowTrack);
00896 float phi = pFlowTrack->Phi();
00897 theG *= (1. + (phiWgt/mult) * (2.* Zx * cos(order * phi) +
00898 2.* Zy * sin(order * phi) ) );
00899 }
00900 }
00901
00902 return theG;
00903 }
00904
00905
00906
00907 Double_t StFlowEvent::G_Mix(StFlowSelection* pFlowSelect, Double_t Z1x, Double_t Z1y, Double_t Z2x, Double_t Z2y) {
00908
00909
00910
00911
00912 int selN = pFlowSelect->Sel();
00913 int harN = pFlowSelect->Har();
00914 double order = (double)(harN + 1);
00915
00916 bool oddHar = (harN+1) % 2;
00917 double etaWgt=1.;
00918 double ptWgt=1.;
00919
00920 double mult = (double)Mult(pFlowSelect);
00921 Double_t theG = 1.;
00922
00923 StFlowTrackIterator itr;
00924 for (itr = TrackCollection()->begin();
00925 itr != TrackCollection()->end(); itr++) {
00926 StFlowTrack* pFlowTrack = *itr;
00927 if (pFlowSelect->Select(pFlowTrack)) {
00928
00929 double detectorV1Wgt = 1.;
00930
00931 if (pFlowTrack->TopologyMap().hasHitInDetector(kTpcId) ||
00932 (pFlowTrack->TopologyMap().data(0) == 0 &&
00933 pFlowTrack->TopologyMap().data(1) == 0)) {
00934
00935 detectorV1Wgt =mV1TPCDetctWgtG_Mix[selN];
00936 } else if (pFlowTrack->TopologyMap().trackFtpcEast() ) {
00937 detectorV1Wgt =mV1FtpcEastDetctWgtG_Mix[selN];
00938 } else if (pFlowTrack->TopologyMap().trackFtpcWest() ) {
00939 detectorV1Wgt =mV1FtpcWestDetctWgtG_Mix[selN];
00940 }
00941
00942 double detectorV2Wgt = 1.;
00943
00944 if (pFlowTrack->TopologyMap().hasHitInDetector(kTpcId) ||
00945 (pFlowTrack->TopologyMap().data(0) == 0 &&
00946 pFlowTrack->TopologyMap().data(1) == 0)) {
00947
00948 detectorV2Wgt =mV2TPCDetctWgtG_Mix[selN];
00949 } else if (pFlowTrack->TopologyMap().trackFtpcEast() ) {
00950 detectorV2Wgt =mV2FtpcEastDetctWgtG_Mix[selN];
00951 } else if (pFlowTrack->TopologyMap().trackFtpcWest() ) {
00952 detectorV2Wgt =mV2FtpcWestDetctWgtG_Mix[selN];
00953 }
00954
00955 double phiWgt = 1.;
00956 float phi = pFlowTrack->Phi();
00957 double pt = pFlowTrack->Pt();
00958 double eta = pFlowTrack->Eta();
00959
00960 if (oddHar) etaWgt =( (eta>0) ? (EtaAbsWgtValue(eta)) : (-1.*EtaAbsWgtValue(eta)) );
00961
00962 ptWgt = PtAbsWgtValue(pt);
00963
00964 theG *=
00965 (1. + (phiWgt*etaWgt*detectorV1Wgt/mult) * (2.* Z1x * cos(order * phi) +
00966 2.* Z1y * sin(order * phi) )
00967 + (phiWgt*ptWgt*detectorV2Wgt/mult) * (2.* Z2x * cos(phi * order*2.) +
00968 2.* Z2y * sin(phi * order*2.) ) );
00969
00970 }
00971 }
00972
00973 return theG;
00974 }
00975
00976
00977 void StFlowEvent::SetSelections() {
00978
00979
00980 StFlowTrackIterator itr;
00981 for (itr = TrackCollection()->begin();
00982 itr != TrackCollection()->end(); itr++) {
00983 StFlowTrack* pFlowTrack = *itr;
00984 double eta = (double)(pFlowTrack->Eta());
00985 float Pt = pFlowTrack->Pt();
00986 StTrackTopologyMap map = pFlowTrack->TopologyMap();
00987
00988
00989 if (mPid[0] != '\0') {
00990 if (strstr(mPid, "h")!=0) {
00991 int charge = pFlowTrack->Charge();
00992 if (strcmp("h+", mPid)==0 && charge != 1) continue;
00993 if (strcmp("h-", mPid)==0 && charge != -1) continue;
00994 } else {
00995 Char_t pid[10];
00996 strcpy(pid, pFlowTrack->Pid());
00997 if (strstr(pid, mPid)==0) continue;
00998 }
00999 }
01000
01001
01002 float gDca = pFlowTrack->DcaGlobal();
01003
01004 if (map.hasHitInDetector(kTpcId) || (map.data(0) == 0 && map.data(1) == 0)) {
01005
01006
01007 if (mDcaGlobalTpcCuts[1] > mDcaGlobalTpcCuts[0] &&
01008 (gDca < mDcaGlobalTpcCuts[0] || gDca >= mDcaGlobalTpcCuts[1])) continue;
01009 }
01010 else if (map.trackFtpcEast() || map.trackFtpcWest()) {
01011
01012
01013 if (mDcaGlobalFtpcCuts[1] > mDcaGlobalFtpcCuts[0] &&
01014 (gDca < mDcaGlobalFtpcCuts[0] || gDca >= mDcaGlobalFtpcCuts[1])) continue;
01015 }
01016
01017 for (int selN = 0; selN < Flow::nSels; selN++) {
01018 for (int harN = 0; harN < Flow::nHars; harN++) {
01019
01020 if (map.hasHitInDetector(kTpcId) || (map.data(0) == 0 && map.data(1) == 0)) {
01021
01022
01023
01024
01025
01026
01027 int etaCut = harN ? 1 : 0;
01028 if (mEtaTpcCuts[1][etaCut][selN] > mEtaTpcCuts[0][etaCut][selN] &&
01029 (fabs(eta) < mEtaTpcCuts[0][etaCut][selN] ||
01030 fabs(eta) >= mEtaTpcCuts[1][etaCut][selN])) continue;
01031
01032
01033 if (mPtTpcCuts[1][harN%2][selN] > mPtTpcCuts[0][harN%2][selN] &&
01034 (Pt < mPtTpcCuts[0][harN%2][selN] ||
01035 Pt >= mPtTpcCuts[1][harN%2][selN])) continue;
01036 }
01037 else if (map.trackFtpcEast() || map.trackFtpcWest()) {
01038
01039
01040
01041 if (eta < 0.) {
01042 if (mEtaFtpcCuts[1][harN%2][selN] > mEtaFtpcCuts[0][harN%2][selN] &&
01043 (eta < mEtaFtpcCuts[0][harN%2][selN] ||
01044 eta >= mEtaFtpcCuts[1][harN%2][selN])) continue;
01045 }
01046 else {
01047 if (mEtaFtpcCuts[3][harN%2][selN] > mEtaFtpcCuts[2][harN%2][selN] &&
01048 (eta < mEtaFtpcCuts[2][harN%2][selN] ||
01049 eta >= mEtaFtpcCuts[3][harN%2][selN])) continue;
01050 }
01051
01052
01053 if (mPtFtpcCuts[1][harN%2][selN] > mPtFtpcCuts[0][harN%2][selN] &&
01054 (Pt < mPtFtpcCuts[0][harN%2][selN] ||
01055 Pt >= mPtFtpcCuts[1][harN%2][selN])) continue;
01056 }
01057
01058 pFlowTrack->SetSelect(harN, selN);
01059 }
01060 }
01061 }
01062 }
01063
01064
01065
01066 void StFlowEvent::MakeSubEvents() {
01067
01068
01069 StFlowTrackIterator itr;
01070 int eventMult[Flow::nHars][Flow::nSels] = {{0}};
01071 int harN, selN, subN = 0;
01072
01073
01074 for (itr = TrackCollection()->begin();
01075 itr != TrackCollection()->end(); itr++) {
01076 StFlowTrack* pFlowTrack = *itr;
01077 for (selN = 0; selN < Flow::nSels; selN++) {
01078 for (harN = 0; harN < Flow::nHars; harN++) {
01079 if (pFlowTrack->Select(harN, selN)) {
01080 eventMult[harN][selN]++;
01081 }
01082 }
01083 }
01084 }
01085
01086
01087 for (selN = 0; selN < Flow::nSels; selN++) {
01088 for (harN = 0; harN < Flow::nHars; harN++) {
01089 int subEventMult = eventMult[harN][selN] / Flow::nSubs;
01090 if (subEventMult) {
01091 subN = 0;
01092 int countN = 0;
01093 for (itr = TrackCollection()->begin();
01094 itr != TrackCollection()->end(); itr++) {
01095 StFlowTrack* pFlowTrack = *itr;
01096 if (pFlowTrack->Select(harN, selN)) {
01097 pFlowTrack->SetSubevent(harN, selN, subN);
01098 countN++;
01099 if (countN % subEventMult == 0.) subN++;
01100 }
01101 }
01102 }
01103 }
01104 }
01105
01106 }
01107
01108
01109
01110 void StFlowEvent::MakeEtaSubEvents() {
01111
01112
01113 StFlowTrackIterator itr;
01114 int harN, selN = 0;
01115
01116
01117 for (selN = 0; selN < Flow::nSels; selN++) {
01118 for (harN = 0; harN < Flow::nHars; harN++) {
01119 for (itr = TrackCollection()->begin();
01120 itr != TrackCollection()->end(); itr++) {
01121 StFlowTrack* pFlowTrack = *itr;
01122 if (pFlowTrack->Select(harN, selN)) {
01123 float eta = pFlowTrack->Eta();
01124 if (eta > 0.) {
01125 pFlowTrack->SetSubevent(harN, selN, 0);
01126 } else {
01127 pFlowTrack->SetSubevent(harN, selN, 1);
01128 }
01129 }
01130 }
01131 }
01132 }
01133
01134 }
01135
01136
01137
01138 void StFlowEvent::SetPidsDeviant() {
01139
01140
01141 StFlowTrackIterator itr;
01142
01143 for (itr = TrackCollection()->begin();
01144 itr != TrackCollection()->end(); itr++) {
01145
01146 StFlowTrack* pFlowTrack = *itr;
01147 Char_t pid[10] = "NA";
01148 Short_t charge = pFlowTrack->Charge();
01149
01150 bool bPiPlus = kFALSE;
01151 bool bPiMinus = kFALSE;
01152 bool bProton = kFALSE;
01153 bool bAntiProton = kFALSE;
01154 bool bKplus = kFALSE;
01155 bool bKminus = kFALSE;
01156 bool bDeuteron = kFALSE;
01157 bool bAntiDeuteron = kFALSE;
01158 bool bElectron = kFALSE;
01159 bool bPositron = kFALSE;
01160
01161 if (charge == 1) {
01162 float piPlus = pFlowTrack->PidPiPlus();
01163 float proton = pFlowTrack->PidProton();
01164 float kPlus = pFlowTrack->PidKaonPlus();
01165 float deuteron = pFlowTrack->PidDeuteron();
01166 float positron = pFlowTrack->PidPositron();
01167 if (piPlus > mPiPlusCuts[0] &&
01168 piPlus < mPiPlusCuts[1]) {
01169 bPiPlus = kTRUE;
01170 }
01171 if ( proton > mProtonCuts[0] &&
01172 proton < mProtonCuts[1]) {
01173 bProton = kTRUE;
01174 }
01175 if ( kPlus > mKPlusCuts[0] &&
01176 kPlus < mKPlusCuts[1]) {
01177 bKplus = kTRUE;
01178 }
01179 if ( deuteron > mDeuteronCuts[0] &&
01180 deuteron < mDeuteronCuts[1]) {
01181 bDeuteron = kTRUE;
01182 }
01183 if ( positron > mPositronCuts[0] &&
01184 positron < mPositronCuts[1]) {
01185 bPositron = kTRUE;
01186 }
01187 } else if (charge == -1) {
01188 float piMinus = pFlowTrack->PidPiMinus();
01189 float antiProton = pFlowTrack->PidAntiProton();
01190 float kMinus = pFlowTrack->PidKaonMinus();
01191 float antiDeuteron = pFlowTrack->PidAntiDeuteron();
01192 float electron = pFlowTrack->PidElectron();
01193 if (piMinus > mPiMinusCuts[0] &&
01194 piMinus < mPiMinusCuts[1]) {
01195 bPiMinus = kTRUE;
01196 }
01197 if ( antiProton > mAntiProtonCuts[0] &&
01198 antiProton < mAntiProtonCuts[1]) {
01199 bAntiProton = kTRUE;
01200 }
01201 if ( kMinus > mKMinusCuts[0] &&
01202 kMinus < mKMinusCuts[1]) {
01203 bKminus = kTRUE;
01204 }
01205 if ( antiDeuteron > mAntiDeuteronCuts[0] &&
01206 antiDeuteron < mAntiDeuteronCuts[1]) {
01207 bAntiDeuteron = kTRUE;
01208 }
01209 if ( electron > mElectronCuts[0] &&
01210 electron < mElectronCuts[1]) {
01211 bElectron = kTRUE;
01212 }
01213 }
01214
01215 if (bPiPlus && !bPiMinus && !bProton && !bAntiProton &&
01216 !bKplus && !bKminus && !bDeuteron && !bAntiDeuteron &&
01217 !bElectron && !bPositron) { strcpy(pid, "pi+"); }
01218 if (!bPiPlus && bPiMinus && !bProton && !bAntiProton &&
01219 !bKplus && !bKminus && !bDeuteron && !bAntiDeuteron &&
01220 !bElectron && !bPositron) { strcpy(pid, "pi-"); }
01221 if (!bPiPlus && !bPiMinus && bProton && !bAntiProton &&
01222 !bKplus && !bKminus && !bDeuteron && !bAntiDeuteron &&
01223 !bElectron && !bPositron) { strcpy(pid, "pr+"); }
01224 if (!bPiPlus && !bPiMinus && !bProton && bAntiProton &&
01225 !bKplus && !bKminus && !bDeuteron && !bAntiDeuteron &&
01226 !bElectron && !bPositron) { strcpy(pid, "pr-"); }
01227 if (!bPiPlus && !bPiMinus && !bProton && !bAntiProton &&
01228 bKplus && !bKminus && !bDeuteron && !bAntiDeuteron &&
01229 !bElectron && !bPositron) { strcpy(pid, "k+"); }
01230 if (!bPiPlus && !bPiMinus && !bProton && !bAntiProton &&
01231 !bKplus && bKminus && !bDeuteron && !bAntiDeuteron &&
01232 !bElectron && !bPositron) { strcpy(pid, "k-"); }
01233 if (!bPiPlus && !bPiMinus && !bProton && !bAntiProton &&
01234 !bKplus && !bKminus && bDeuteron && !bAntiDeuteron &&
01235 !bElectron && !bPositron) { strcpy(pid, "d+"); }
01236 if (!bPiPlus && !bPiMinus && !bProton && !bAntiProton &&
01237 !bKplus && !bKminus && !bDeuteron && bAntiDeuteron &&
01238 !bElectron && !bPositron) { strcpy(pid, "d-"); }
01239 if (!bPiPlus && !bPiMinus && !bProton && !bAntiProton &&
01240 !bKplus && !bKminus && !bDeuteron && !bAntiDeuteron &&
01241 bElectron && !bPositron) { strcpy(pid, "e-"); }
01242 if (!bPiPlus && !bPiMinus && !bProton && !bAntiProton &&
01243 !bKplus && !bKminus && !bDeuteron && !bAntiDeuteron &&
01244 !bElectron && bPositron) { strcpy(pid, "e+"); }
01245
01246 pFlowTrack->SetPid(pid);
01247
01248 }
01249 }
01250
01251
01252
01253 void StFlowEvent::SetPidsProb() {
01254
01255
01256 StFlowTrackIterator itr;
01257
01258 for (itr = TrackCollection()->begin();
01259 itr != TrackCollection()->end(); itr++) {
01260
01261 StFlowTrack* pFlowTrack = *itr;
01262 Char_t pid[10] = "NA";
01263
01264 if (pFlowTrack->MostLikelihoodPID() == 8 &&
01265 pFlowTrack->MostLikelihoodProb() > 0.9)
01266 { strcpy(pid, "pi+"); }
01267 if (pFlowTrack->MostLikelihoodPID() == 9 &&
01268 pFlowTrack->MostLikelihoodProb() > 0.9)
01269 { strcpy(pid, "pi-"); }
01270 if (pFlowTrack->MostLikelihoodPID() == 14 &&
01271 pFlowTrack->MostLikelihoodProb() > 0.9)
01272 { strcpy(pid, "pr+"); }
01273 if (pFlowTrack->MostLikelihoodPID() == 15 &&
01274 pFlowTrack->MostLikelihoodProb() > 0.9)
01275 { strcpy(pid, "pr-"); }
01276 if (pFlowTrack->MostLikelihoodPID() == 11 &&
01277 pFlowTrack->MostLikelihoodProb() > 0.9)
01278 { strcpy(pid, "k+"); }
01279 if (pFlowTrack->MostLikelihoodPID() == 12 &&
01280 pFlowTrack->MostLikelihoodProb() > 0.9)
01281 { strcpy(pid, "k-"); }
01282 if (pFlowTrack->MostLikelihoodPID() == 45 &&
01283 pFlowTrack->MostLikelihoodProb() > 0.9)
01284 { strcpy(pid, "d+"); }
01285
01286
01287
01288 if (pFlowTrack->MostLikelihoodPID() == 3 &&
01289 pFlowTrack->MostLikelihoodProb() > 0.9)
01290 { strcpy(pid, "e-"); }
01291 if (pFlowTrack->MostLikelihoodPID() == 2 &&
01292 pFlowTrack->MostLikelihoodProb() > 0.9)
01293 { strcpy(pid, "e+"); }
01294
01295 pFlowTrack->SetPid(pid);
01296
01297 }
01298 }
01299
01300
01301
01302 void StFlowEvent::SetCentrality() {
01303
01304
01305 Int_t* cent = 0;
01306 Int_t tracks = mMultEta;
01307
01308 if (mRunID > 8000000) {
01309 cent = Flow::cent200Year7;
01310 } else if (mRunID > 4000000) {
01311 if (mCenterOfMassEnergy >= 199.) {
01312 if (fabs(mMagneticField) >= 4.) {
01313 cent = Flow::cent200Year4Full;
01314 } else {
01315 cent = Flow::cent200Year4Half;
01316 }
01317 } else if (mCenterOfMassEnergy >60. && mCenterOfMassEnergy < 65.) {
01318 cent = Flow::cent62;
01319 }
01320 } else if (mCenterOfMassEnergy >= 199.) {
01321 if (fabs(mMagneticField) >= 4.) {
01322 cent = Flow::cent200Full;
01323 } else {
01324 cent = Flow::cent200Half;
01325 }
01326 } else if (mCenterOfMassEnergy == 0.) {
01327 cent = Flow::cent130;
01328 } else if (mCenterOfMassEnergy <= 25.){
01329 cent = Flow::cent22;
01330 }
01331
01332 if (tracks < cent[0]) { mCentrality = 0; }
01333 else if (tracks < cent[1]) { mCentrality = 1; }
01334 else if (tracks < cent[2]) { mCentrality = 2; }
01335 else if (tracks < cent[3]) { mCentrality = 3; }
01336 else if (tracks < cent[4]) { mCentrality = 4; }
01337 else if (tracks < cent[5]) { mCentrality = 5; }
01338 else if (tracks < cent[6]) { mCentrality = 6; }
01339 else if (tracks < cent[7]) { mCentrality = 7; }
01340 else if (tracks < cent[8]) { mCentrality = 8; }
01341 else { mCentrality = 9; }
01342
01343 }
01344
01345
01346
01347 void StFlowEvent::PrintSelectionList() {
01348
01349
01350
01351 cout << "#######################################################" << endl;
01352 cout << "# Weighting and Striping:" << endl;
01353 if (mPtWgt) {
01354 cout << "# PtWgt= TRUE, also for output of PhiWgt file" << endl;
01355 cout << "# PtWgt Saturation= " << mPtWgtSaturation << endl;
01356 } else {
01357 cout << "# PtWgt= FALSE" << endl;
01358 }
01359 if (mEtaWgt) {
01360 cout << "# EtaWgt= TRUE, also for output of PhiWgt file for 1st harmonic" << endl;
01361 } else {
01362 cout << "# EtaWgt= FALSE" << endl;
01363 }
01364 if (mEtaSubs) {
01365 cout << "# EtaSubs= TRUE" << endl;
01366 } else {
01367 cout << "# EtaSubs= FALSE" << endl;
01368 }
01369 if (mRanSubs) {
01370 cout << "# RanSubs= TRUE" << endl;
01371 } else {
01372 cout << "# RanSubs= FALSE" << endl;
01373 }
01374 cout << "#######################################################" << endl;
01375 cout << "# Pid Deviant Cuts:" << endl;
01376 cout << "# PiPlus cuts= " << mPiPlusCuts[0] << ", "
01377 << mPiPlusCuts[1] << endl;
01378 cout << "# PiMinus cuts= " << mPiMinusCuts[0] << ", "
01379 << mPiMinusCuts[1] << endl;
01380 cout << "# Proton cuts= " << mProtonCuts[0] << ", "
01381 << mProtonCuts[1] << endl;
01382 cout << "# Anti Proton cuts= " << mAntiProtonCuts[0] << ", "
01383 << mAntiProtonCuts[1] << endl;
01384 cout << "# Deuteron cuts= " << mDeuteronCuts[0] << ", "
01385 << mDeuteronCuts[1] << endl;
01386 cout << "# Anti Deuteron cuts= " << mAntiDeuteronCuts[0] << ", "
01387 << mAntiDeuteronCuts[1] << endl;
01388 cout << "# K- cuts= " << mKMinusCuts[0] << ", "
01389 << mKMinusCuts[1] << endl;
01390 cout << "# K+ cuts= " << mKPlusCuts[0] << ", "
01391 << mKPlusCuts[1] << endl;
01392 cout << "# Electron cuts= " << mElectronCuts[0] << ", "
01393 << mElectronCuts[1] << endl;
01394 cout << "# Positron cuts= " << mPositronCuts[0] << ", "
01395 << mPositronCuts[1] << endl;
01396 cout << "#######################################################" << endl;
01397 cout << "# Tracks used for the event plane:" << endl;
01398 cout << "# Particle ID= " << mPid << endl;
01399 cout << "# Global Dca Tpc cuts= " << mDcaGlobalTpcCuts[0] << ", "
01400 << mDcaGlobalTpcCuts[1] << endl;
01401 cout << "# Global Dca Ftpc cuts= " << mDcaGlobalFtpcCuts[0] << ", "
01402 << mDcaGlobalFtpcCuts[1] << endl;
01403 for (int k = 0; k < Flow::nSels; k++) {
01404 for (int j = 0; j < 2; j++) {
01405 cout << "# selection= " << k+1 << " harmonic= "
01406 << j+1 << endl;
01407 cout << "# abs(Eta) Tpc cuts= " << mEtaTpcCuts[0][j][k] << ", "
01408 << mEtaTpcCuts[1][j][k] << endl;
01409 cout << "# Eta Ftpc cuts= " << mEtaFtpcCuts[0][j][k] << ", "
01410 << mEtaFtpcCuts[1][j][k] << ", " << mEtaFtpcCuts[2][j][k] << ", "
01411 << mEtaFtpcCuts[3][j][k] << endl;
01412 cout << "# Pt Tpc cuts= " << mPtTpcCuts[0][j][k] << ", "
01413 << mPtTpcCuts[1][j][k] << endl;
01414 cout << "# Pt Ftpc cuts= " << mPtFtpcCuts[0][j][k] << ", "
01415 << mPtFtpcCuts[1][j][k] << endl;
01416 }
01417 }
01418 cout << "#######################################################" << endl;
01419
01420 }
01421
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469
01470
01471
01472
01473
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507
01508
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592
01593
01594
01595
01596
01597
01598
01599
01600
01601
01602
01603
01604
01605
01606
01607
01608
01609
01610
01611
01612
01613
01614
01615
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652
01653
01654
01655
01656
01657
01658
01659
01660
01661
01662
01663
01664
01665
01666
01667
01668