00001
00002
00003
00004
00005
00006
00007
00008
00010
00011
00012
00013
00015
00016 #include <Stiostream.h>
00017 #include <stdlib.h>
00018 #include <math.h>
00019 #include "StFlowMaker.h"
00020 #include "StFlowEvent.h"
00021 #include "StFlowPicoEvent.h"
00022 #include "StFlowCutEvent.h"
00023 #include "StFlowCutTrack.h"
00024 #include "StFlowSelection.h"
00025 #include "StFlowConstants.h"
00026 #include "PhysicalConstants.h"
00027 #include "SystemOfUnits.h"
00028 #include "StEvent.h"
00029 #include "StEventTypes.h"
00030 #include "StThreeVector.hh"
00031 #include "StIOMaker/StIOMaker.h"
00032 #include "TFile.h"
00033 #include "TTree.h"
00034 #include "TBranch.h"
00035 #include "TChain.h"
00036 #include "TText.h"
00037 #include "TH1.h"
00038 #include "TH2.h"
00039 #include "TProfile.h"
00040 #include "TProfile2D.h"
00041 #include "StuRefMult.hh"
00042 #include "StPionPlus.hh"
00043 #include "StPionMinus.hh"
00044 #include "StProton.hh"
00045 #include "StKaonMinus.hh"
00046 #include "StKaonPlus.hh"
00047 #include "StAntiProton.hh"
00048 #include "StDeuteron.hh"
00049 #include "StElectron.hh"
00050 #include "StPositron.hh"
00051 #include "StTpcDedxPidAlgorithm.h"
00052 #include "StuProbabilityPidAlgorithm.h"
00053 #include "StMessMgr.h"
00054 #include "StMuDSTMaker/COMMON/StMuEvent.h"
00055 #include "StMuDSTMaker/COMMON/StMuTrack.h"
00056 #include "TClass.h"
00057 #include "TDatime.h"
00058 #include "StHbtMaker/StHbtMaker.h"
00059 #include "StHbtMaker/Infrastructure/StHbtTrack.hh"
00060 #define PR(x) cout << "##### FlowMaker: " << (#x) << " = " << (x) << endl;
00061
00062 ClassImp(StFlowMaker)
00063
00064
00065
00066 StFlowMaker::StFlowMaker(const Char_t* name):
00067 StMaker(name),
00068 mPicoEventWrite(kFALSE), mPicoEventRead(kFALSE), mMuEventRead(kFALSE),
00069 pEvent(NULL) {
00070 pFlowSelect = new StFlowSelection();
00071 SetPicoEventDir("./");
00072 StMuTrack::Class()->IgnoreTObjectStreamer();
00073 StMuHelix::Class()->IgnoreTObjectStreamer();
00074 pFlowEvent = NULL;
00075 }
00076
00077 StFlowMaker::StFlowMaker(const Char_t* name,
00078 const StFlowSelection& flowSelect) :
00079 StMaker(name),
00080 mPicoEventWrite(kFALSE), mPicoEventRead(kFALSE), mMuEventRead(kFALSE),
00081 pEvent(NULL) {
00082 pFlowSelect = new StFlowSelection(flowSelect);
00083 SetPicoEventDir("./");
00084 StMuTrack::Class()->IgnoreTObjectStreamer();
00085 StMuHelix::Class()->IgnoreTObjectStreamer();
00086 pFlowEvent = NULL;
00087 }
00088
00089
00090
00091 StFlowMaker::~StFlowMaker() {
00092 }
00093
00094
00095
00096 Int_t StFlowMaker::Make() {
00097 if (Debug()) gMessMgr->Info() << "FlowMaker: Make() " << endm;
00098
00099
00100 if (pFlowEvent) delete pFlowEvent;
00101 pFlowEvent = NULL;
00102
00103
00104 if (!mPicoEventRead && pIOMaker) {
00105 mEventFileName = strrchr(pIOMaker->GetFile(),'/')+1;
00106 if (Debug()) {
00107 gMessMgr->Info() << "FlowMaker: filename: " << mEventFileName << endm;
00108 gMessMgr->Info() << "FlowMaker: Old filename: " << mEventFileNameOld << endm;
00109 }
00110
00111
00112 if (mEventFileName != mEventFileNameOld) {
00113
00114 if (Debug()) gMessMgr->Info() << "##### FlowMaker: " << mEventFileName << endm;
00115 if (mPicoEventWrite) {
00116 if (pPicoDST->IsOpen()) {
00117 pPicoDST->Write(0, TObject::kOverwrite);
00118 pPicoDST->Close();
00119 }
00120 if (pPicoEvent) delete pPicoEvent;
00121 if (pPicoDST) delete pPicoDST;
00122 pPicoEvent = NULL;
00123 pPicoDST = NULL;
00124 InitPicoEventWrite();
00125 }
00126 mEventFileNameOld = mEventFileName;
00127 }
00128 }
00129
00130
00131 pFlowEvent = new StFlowEvent;
00132 if (!pFlowEvent) return kStOK;
00133
00134
00135 if (mPicoEventRead) {
00136 if (!FillFromPicoDST(pPicoEvent)) return kStEOF;
00137 if (!pFlowEvent) return kStOK;
00138
00139 } else if (mMuEventRead) {
00140 pMu = (StMuDst*)GetInputDS("MuDst");
00141 if (pMu) {
00142 pMuEvent = pMu->event();
00143 pMuTracks = pMu->primaryTracks();
00144 pMuGlobalTracks = pMu->globalTracks();
00145 if (!FillFromMuDST()) return kStEOF;
00146 if (!pFlowEvent) return kStOK;
00147 if (mPicoEventWrite) FillPicoEvent();
00148 }
00149 } else {
00150
00151 pEvent = dynamic_cast<StEvent*>(GetInputDS("StEvent"));
00152 if (!pEvent) {
00153 if (Debug()) { gMessMgr->Info() << "FlowMaker: no StEvent " << endm; }
00154 return kStOK;
00155 }
00156
00157 if (StFlowCutEvent::CheckEvent(pEvent)) {
00158 FillFlowEvent();
00159 if (!pFlowEvent) return kStOK;
00160 if (mPicoEventWrite) FillPicoEvent();
00161 } else {
00162 Long_t eventID = pEvent->id();
00163 gMessMgr->Info() << "##### FlowMaker: event " << eventID
00164 << " cut" << endm;
00165 return kStOK;
00166 }
00167 }
00168
00169
00170 UInt_t flowEventMult;
00171 if (!pFlowEvent) { flowEventMult = 0; }
00172 else { flowEventMult = pFlowEvent->FlowEventMult(); }
00173
00174 if (flowEventMult) {
00175
00176 int runID = pFlowEvent->RunID();
00177 if (runID != mRunID) {
00178 double beamEnergy = pFlowEvent->CenterOfMassEnergy();
00179 double magneticField = pFlowEvent->MagneticField();
00180 short beamMassE = pFlowEvent->BeamMassNumberEast();
00181 short beamMassW = pFlowEvent->BeamMassNumberWest();
00182 if (Debug()) gMessMgr->Info() << "##### FlowMaker: " << runID << ", " <<
00183 beamEnergy << " GeV/A " << beamMassE << "+" << beamMassW <<
00184 ", B= " << magneticField << endm;
00185 mRunID = runID;
00186 if (pFlowEvent->UseZDCSMD()) {
00187 Float_t RawZDCSMD[2][2][8];
00188 Float_t ex,ey,wx,wy;
00189 for (int strip=1; strip<9; strip++) {
00190 RawZDCSMD[0][1][strip-1] = (pFlowEvent->ZDCSMD(0,1,strip))*
00191 Flow::zdcsmdGainFac[0][1][strip-1] + mZDCSMDPed[0][1][strip-1];
00192 RawZDCSMD[0][0][strip-1] = (pFlowEvent->ZDCSMD(0,0,strip))*
00193 Flow::zdcsmdGainFac[0][0][strip-1] + mZDCSMDPed[0][0][strip-1];
00194 RawZDCSMD[1][1][strip-1] = (pFlowEvent->ZDCSMD(1,1,strip))*
00195 Flow::zdcsmdGainFac[1][1][strip-1] + mZDCSMDPed[1][1][strip-1];
00196 RawZDCSMD[1][0][strip-1] = (pFlowEvent->ZDCSMD(1,0,strip))*
00197 Flow::zdcsmdGainFac[1][0][strip-1] + mZDCSMDPed[1][0][strip-1];
00198 }
00199 ReadZDCSMDFile();
00200 for (int strip=1; strip<9; strip++) {
00201 ey = (RawZDCSMD[0][1][strip-1] - mZDCSMDPed[0][1][strip-1])/
00202 Flow::zdcsmdGainFac[0][1][strip-1];
00203 ex = (RawZDCSMD[0][0][strip-1] - mZDCSMDPed[0][0][strip-1])/
00204 Flow::zdcsmdGainFac[0][0][strip-1];
00205 wy = (RawZDCSMD[1][1][strip-1] - mZDCSMDPed[1][1][strip-1])/
00206 Flow::zdcsmdGainFac[1][1][strip-1];
00207 wx = (RawZDCSMD[1][0][strip-1] - mZDCSMDPed[1][0][strip-1])/
00208 Flow::zdcsmdGainFac[1][0][strip-1];
00209 if (!mPicoEventRead) {
00210 pFlowEvent->SetZDCSMD(0,1,strip,ey);
00211 pFlowEvent->SetZDCSMD(0,0,strip,ex);
00212 pFlowEvent->SetZDCSMD(1,0,strip,wx);
00213 pFlowEvent->SetZDCSMD(1,1,strip,wy);
00214 }
00215 }
00216 pFlowEvent->SetZDCSMD_BeamCenter(mZDCSMDCenterEx, mZDCSMDCenterEy,
00217 mZDCSMDCenterWx, mZDCSMDCenterWy);
00218 if (mPicoEventWrite)
00219 for (int i=0; i<2; i++) for (int j=0; j<2; j++) for (int k=1; k<9; k++)
00220 pPicoEvent->SetZDCSMD(i,j,k,pFlowEvent->ZDCSMD(i,j,k));
00221 }
00222 }
00223 }
00224
00225 if (Debug()) StMaker::PrintInfo();
00226
00227 return kStOK;
00228 }
00229
00230
00231
00232 Int_t StFlowMaker::Init() {
00233
00234
00235 gMessMgr->MemoryOn();
00236 gMessMgr->SetLimit("##### FlowMaker", 5);
00237 gMessMgr->Info("##### FlowMaker: $Id: StFlowMaker.cxx,v 1.119 2010/09/30 19:30:28 posk Exp $");
00238
00239 if (Debug()) gMessMgr->Info() << "FlowMaker: Init()" << endm;
00240
00241
00242 ReadPhiWgtFile();
00243 ReadReCentFile();
00244
00245 if (!mPicoEventRead || !mMuEventRead) {
00246 pIOMaker = (StIOMaker*)GetMaker("IO");
00247 if (pIOMaker) {
00248 mEventFileName = "";
00249 mEventFileNameOld = mEventFileName;
00250 }
00251 }
00252 StuProbabilityPidAlgorithm::readParametersFromFile("PIDTable.root");
00253
00254 Int_t kRETURN = kStOK;
00255 if (mPicoEventWrite) kRETURN += InitPicoEventWrite();
00256 if (mPicoEventRead) kRETURN += InitPicoEventRead();
00257 if (mMuEventRead) kRETURN += InitMuEventRead();;
00258
00259 if (kRETURN) gMessMgr->Info() << "##### FlowMaker: Init return = " << kRETURN << endm;
00260 return kRETURN;
00261 }
00262
00263
00264
00265 Int_t StFlowMaker::InitRun(int runID) {
00266 if (Debug()) gMessMgr->Info() << "FlowMaker: InitRun()" << endm;
00267 PR(runID);
00268
00269 return kStOK;
00270 }
00271
00272
00273
00274 Int_t StFlowMaker::Finish() {
00275 if (Debug()) gMessMgr->Info() << "FlowMaker: Finish()" << endm;
00276
00277
00278 cout << endl;
00279 gMessMgr->Summary(3);
00280 cout << endl;
00281
00282
00283 TDatime now;
00284 cout << "#######################################################" << endl;
00285 cout << "##### Finish time: " << now.AsString() << endl;
00286
00287
00288 pFlowSelect->PrintList();
00289
00290
00291 cout << "#######################################################" << endl;
00292 cout << "##### FlowMaker: Cut Lists" << endl;
00293 StFlowCutEvent::PrintCutList();
00294 StFlowCutTrack::PrintCutList();
00295 pFlowEvent->PrintSelectionList();
00296
00297 if (mPicoEventWrite && pPicoDST->IsOpen()) {
00298 pPicoDST->Write(0, TObject::kOverwrite);
00299 pPicoDST->Close();
00300 }
00301
00302 return StMaker::Finish();
00303 }
00304
00305
00306
00307 Int_t StFlowMaker::ReadPhiWgtFile() {
00308
00309
00310 if (Debug()) gMessMgr->Info() << "FlowMaker: ReadPhiWgtFile()" << endm;
00311
00312 TDirectory* dirSave = gDirectory;
00313 TFile* pPhiWgtFile = new TFile("flowPhiWgt.hist.root", "READ");
00314 if (!pPhiWgtFile->IsOpen() || !mPhiWgtCalc) {
00315 gMessMgr->Info("##### FlowMaker: No PhiWgt, will set weights = 1.");
00316 }
00317 if (!pPhiWgtFile->IsOpen() && mPhiWgtCalc) {
00318 gMessMgr->Info("##### FlowMaker: Calculating PhiWgts");
00319 }
00320 gDirectory = dirSave;
00321
00322
00323 if (pPhiWgtFile->IsOpen() && mPhiWgtCalc) {
00324 gMessMgr->Info("##### FlowMaker: PhiWgt flattening being done");
00325 TText* textInfo = dynamic_cast<TText*>(pPhiWgtFile->Get("info"));
00326 if (textInfo) {
00327 mFirstLastPhiWgt = kTRUE;
00328 gMessMgr->Info("##### FlowMaker: File uses z of first-last points");
00329 cout << "##### FlowMaker: PhiWgt file written with " ;
00330 textInfo->ls();
00331 } else {
00332 gMessMgr->Info("##### FlowMaker: File uses vertex z and eta");
00333 }
00334 }
00335
00336
00337 for (int k = 0; k < Flow::nSels; k++) {
00338 for (int j = 0; j < 2; j++) {
00339
00340 TString* histTitleFarEast = new TString("Flow_Phi_Weight_FarEast_Sel");
00341 *histTitleFarEast += k+1;
00342 histTitleFarEast->Append("_Har");
00343 *histTitleFarEast += j+1;
00344
00345 TString* histTitleEast = new TString("Flow_Phi_Weight_East_Sel");
00346 *histTitleEast += k+1;
00347 histTitleEast->Append("_Har");
00348 *histTitleEast += j+1;
00349
00350 TString* histTitleWest = new TString("Flow_Phi_Weight_West_Sel");
00351 *histTitleWest += k+1;
00352 histTitleWest->Append("_Har");
00353 *histTitleWest += j+1;
00354
00355 TString* histTitleFarWest = new TString("Flow_Phi_Weight_FarWest_Sel");
00356 *histTitleFarWest += k+1;
00357 histTitleFarWest->Append("_Har");
00358 *histTitleFarWest += j+1;
00359
00360 TString* histTitleFtpcFarEast = new TString("Flow_Phi_Weight_FtpcFarEast_Sel");
00361 *histTitleFtpcFarEast += k+1;
00362 histTitleFtpcFarEast->Append("_Har");
00363 *histTitleFtpcFarEast += j+1;
00364
00365 TString* histTitleFtpcEast = new TString("Flow_Phi_Weight_FtpcEast_Sel");
00366 *histTitleFtpcEast += k+1;
00367 histTitleFtpcEast->Append("_Har");
00368 *histTitleFtpcEast += j+1;
00369
00370 TString* histTitleFtpcWest = new TString("Flow_Phi_Weight_FtpcWest_Sel");
00371 *histTitleFtpcWest += k+1;
00372 histTitleFtpcWest->Append("_Har");
00373 *histTitleFtpcWest += j+1;
00374
00375 TString* histTitleFtpcFarWest = new TString("Flow_Phi_Weight_FtpcFarWest_Sel");
00376 *histTitleFtpcFarWest += k+1;
00377 histTitleFtpcFarWest->Append("_Har");
00378 *histTitleFtpcFarWest += j+1;
00379 if (pPhiWgtFile->IsOpen() && mPhiWgtCalc) {
00380 TH1* phiWgtHistFarEast = dynamic_cast<TH1*>(pPhiWgtFile->
00381 Get(histTitleFarEast->Data()));
00382 TH1* phiWgtHistEast = dynamic_cast<TH1*>(pPhiWgtFile->
00383 Get(histTitleEast->Data()));
00384 TH1* phiWgtHistWest = dynamic_cast<TH1*>(pPhiWgtFile->
00385 Get(histTitleWest->Data()));
00386 TH1* phiWgtHistFarWest = dynamic_cast<TH1*>(pPhiWgtFile->
00387 Get(histTitleFarWest->Data()));
00388 for (int n = 0; n < Flow::nPhiBins; n++) {
00389 mPhiWgtFarEast[k][j][n] = (phiWgtHistFarEast) ?
00390 phiWgtHistFarEast->GetBinContent(n+1) : 1.;
00391 mPhiWgtEast[k][j][n] = (phiWgtHistEast) ?
00392 phiWgtHistEast->GetBinContent(n+1) : 1.;
00393 mPhiWgtWest[k][j][n] = (phiWgtHistWest) ?
00394 phiWgtHistWest->GetBinContent(n+1) : 1.;
00395 mPhiWgtFarWest[k][j][n] = (phiWgtHistFarWest) ?
00396 phiWgtHistFarWest->GetBinContent(n+1) : 1.;
00397 }
00398 TH1* phiWgtHistFtpcFarEast = dynamic_cast<TH1*>(pPhiWgtFile->
00399 Get(histTitleFtpcFarEast->Data()));
00400 TH1* phiWgtHistFtpcEast = dynamic_cast<TH1*>(pPhiWgtFile->
00401 Get(histTitleFtpcEast->Data()));
00402 TH1* phiWgtHistFtpcWest = dynamic_cast<TH1*>(pPhiWgtFile->
00403 Get(histTitleFtpcWest->Data()));
00404 TH1* phiWgtHistFtpcFarWest = dynamic_cast<TH1*>(pPhiWgtFile->
00405 Get(histTitleFtpcFarWest->Data()));
00406 for (int n = 0; n < Flow::nPhiBinsFtpc; n++) {
00407 mPhiWgtFtpcFarEast[k][j][n] = (phiWgtHistFtpcFarEast) ?
00408 phiWgtHistFtpcFarEast->GetBinContent(n+1) : 1.;
00409 mPhiWgtFtpcEast[k][j][n] = (phiWgtHistFtpcEast) ?
00410 phiWgtHistFtpcEast->GetBinContent(n+1) : 1.;
00411 mPhiWgtFtpcWest[k][j][n] = (phiWgtHistFtpcWest) ?
00412 phiWgtHistFtpcWest->GetBinContent(n+1) : 1.;
00413 mPhiWgtFtpcFarWest[k][j][n] = (phiWgtHistFtpcFarWest) ?
00414 phiWgtHistFtpcFarWest->GetBinContent(n+1) : 1.;
00415 }
00416
00417 } else {
00418 for (int n = 0; n < Flow::nPhiBins; n++) {
00419 mPhiWgt[k][j][n] = 1.;
00420 mPhiWgtFarEast[k][j][n] = 1.;
00421 mPhiWgtEast[k][j][n] = 1.;
00422 mPhiWgtWest[k][j][n] = 1.;
00423 mPhiWgtFarWest[k][j][n] = 1.;
00424 }
00425
00426 for (int n = 0; n < Flow::nPhiBinsFtpc; n++) {
00427 mPhiWgtFtpcFarEast[k][j][n] = 1.;
00428 mPhiWgtFtpcWest[k][j][n] = 1.;
00429 mPhiWgtFtpcEast[k][j][n] = 1.;
00430 mPhiWgtFtpcFarWest[k][j][n] = 1.;
00431 }
00432
00433 }
00434
00435 delete histTitleFarEast;
00436 delete histTitleEast;
00437 delete histTitleWest;
00438 delete histTitleFarWest;
00439 delete histTitleFtpcFarEast;
00440 delete histTitleFtpcEast;
00441 delete histTitleFtpcWest;
00442 delete histTitleFtpcFarWest;
00443 }
00444 }
00445
00446
00447 if (pPhiWgtFile->IsOpen()) {
00448 TH1* mZDCSMDPsiWest = (TH1*)pPhiWgtFile->Get("Flow_ZDCSMDPsiWgtWest");
00449 TH1* mZDCSMDPsiEast = (TH1*)pPhiWgtFile->Get("Flow_ZDCSMDPsiWgtEast");
00450 TH1* mZDCSMDPsiFull = (TH1*)pPhiWgtFile->Get("Flow_ZDCSMDPsiWgtFull");
00451 if (mZDCSMDPsiWest && mZDCSMDPsiEast) {
00452 Float_t mZDCSMDPsiWest_mean = (mZDCSMDPsiWest->Integral())/(mZDCSMDPsiWest->GetNbinsX());
00453 Float_t mZDCSMDPsiEast_mean = (mZDCSMDPsiEast->Integral())/(mZDCSMDPsiEast->GetNbinsX());
00454 for (int n = 0; n < Flow::zdcsmd_nPsiBins; n++) {
00455 mZDCSMD_PsiWgtWest[n] = ((mZDCSMDPsiWest->GetBinContent(n+1))>0.) ?
00456 mZDCSMDPsiWest_mean/(mZDCSMDPsiWest->GetBinContent(n+1)):1.;
00457 mZDCSMD_PsiWgtEast[n] = ((mZDCSMDPsiEast->GetBinContent(n+1))>0.) ?
00458 mZDCSMDPsiEast_mean/(mZDCSMDPsiEast->GetBinContent(n+1)):1.;
00459 }
00460 if (mZDCSMDPsiFull) {
00461 Float_t mZDCSMDPsiFull_mean = (mZDCSMDPsiFull->Integral())/(mZDCSMDPsiFull->GetNbinsX());
00462 for (int n = 0; n < Flow::zdcsmd_nPsiBins; n++) {
00463 mZDCSMD_PsiWgtFull[n] = ((mZDCSMDPsiFull->GetBinContent(n+1))>0.) ?
00464 mZDCSMDPsiFull_mean/(mZDCSMDPsiFull->GetBinContent(n+1)):1.;
00465 }
00466 } else{
00467 for (int n=0;n < Flow::zdcsmd_nPsiBins;n++) {
00468 mZDCSMD_PsiWgtFull[n] = 1.;
00469 }
00470 }
00471 } else {
00472 for (int n=0;n < Flow::zdcsmd_nPsiBins;n++) {
00473 mZDCSMD_PsiWgtWest[n] = 1.;
00474 mZDCSMD_PsiWgtEast[n] = 1.;
00475 mZDCSMD_PsiWgtFull[n] = 1.;
00476 }
00477 }
00478 } else {
00479 for (int n=0;n < Flow::zdcsmd_nPsiBins;n++) {
00480 mZDCSMD_PsiWgtWest[n] = 1.;
00481 mZDCSMD_PsiWgtEast[n] = 1.;
00482 mZDCSMD_PsiWgtFull[n] = 1.;
00483 }
00484 }
00485
00486
00487 if (pPhiWgtFile->IsOpen()) pPhiWgtFile->Close();
00488
00489 return kStOK;
00490 }
00491
00492
00493
00494 Int_t StFlowMaker::ReadReCentFile() {
00495
00496
00497 if (Debug()) gMessMgr->Info() << "FlowMaker: ReadReCentFile()" << endm;
00498
00499 TDirectory* dirSave = gDirectory;
00500 TFile* pReCentFile = new TFile("flow.reCentAna.root", "READ");
00501 if (pReCentFile->IsOpen() && mReCentCalc) {
00502 gMessMgr->Info("##### FlowMaker: ReCentering being done.");
00503 }
00504 if (mReCentCalc) {
00505 gMessMgr->Info("##### FlowMaker: Calculating ReCentering parameters.");
00506 } else {
00507 gMessMgr->Info("##### FlowMaker: Will set ReCentering parameters = 0.");
00508 }
00509 gDirectory = dirSave;
00510
00511
00512 if (pReCentFile->IsOpen() && mReCentCalc) {
00513 for (int k = 0; k < Flow::nSels; k++) {
00514 for (int j = 0; j < Flow::nHars; j++) {
00515 TString* histTitleTPC_x = new TString("FlowReCentX_Sel");
00516 *histTitleTPC_x += k+1;
00517 *histTitleTPC_x += "_Har";
00518 *histTitleTPC_x += j+1;
00519 TString* histTitleTPC_y = new TString("FlowReCentY_Sel");
00520 *histTitleTPC_y += k+1;
00521 *histTitleTPC_y += "_Har";
00522 *histTitleTPC_y += j+1;
00523 TProfile* histCentX = dynamic_cast<TProfile*>(pReCentFile->Get(histTitleTPC_x->Data()));
00524 TProfile* histCentY = dynamic_cast<TProfile*>(pReCentFile->Get(histTitleTPC_y->Data()));
00525 if (!histCentX || !histCentY) {
00526 gMessMgr->Info("##### FlowMaker: No ReCent hists.");
00527 }
00528 for (int n = 0; n < 4; n++) {
00529 mReCentX[k][j][n] = (histCentX) ? histCentX->GetBinContent(n+1) : 0.;
00530 mReCentY[k][j][n] = (histCentY) ? histCentY->GetBinContent(n+1) : 0.;
00531
00532 }
00533 delete histTitleTPC_x;
00534 delete histTitleTPC_y;
00535 }
00536 }
00537 } else {
00538 for (int k = 0; k < Flow::nSels; k++) {
00539 for (int j = 0; j < Flow::nHars; j++) {
00540 for (int n = 0; n < 4; n++) {
00541 mReCentX[k][j][n] = 0.;
00542 mReCentY[k][j][n] = 0.;
00543 }
00544 }
00545 }
00546 }
00547
00548
00549 if (pReCentFile->IsOpen()) pReCentFile->Close();
00550
00551 return kStOK;
00552 }
00553
00554
00555
00556 Int_t StFlowMaker::ReadZDCSMDFile() {
00557
00558
00559 if (Debug()) gMessMgr->Info() << "FlowMaker: ReadZDCSMDFile()" << endm;
00560
00561 TDirectory* dirSave = gDirectory;
00562 TFile* pZDCSMDConstFile = new TFile("zdcsmdConstants.root", "READ");
00563 if (!pZDCSMDConstFile->IsOpen()) {
00564 gMessMgr->Info("##### FlowMaker: No ZDCSMD constant file. Will use default.");
00565 } else { gMessMgr->Info("##### FlowMaker: ZDCSMD constant file read."); }
00566 gDirectory = dirSave;
00567 int mRealRunID = mRunID;
00568 Double_t HistTest = 0.;
00569 if (pZDCSMDConstFile->IsOpen()) {
00570 TH2* mZDCSMDBeamCenter2D = (TH2D *)pZDCSMDConstFile->Get("ZDCSMDBeamCenter");
00571 while (HistTest < 1.) {
00572 HistTest = mZDCSMDBeamCenter2D->GetBinContent(1,mRealRunID-5050000);
00573 if (HistTest > 1.) break;
00574 mRealRunID -= 1;
00575 if (mRealRunID < 5050000) break;
00576 }
00577 if (mRealRunID < 5050000) {
00578 mZDCSMDCenterEx = Flow::zdcsmd_ex0;
00579 mZDCSMDCenterEy = Flow::zdcsmd_ey0;
00580 mZDCSMDCenterWx = Flow::zdcsmd_wx0;
00581 mZDCSMDCenterWy = Flow::zdcsmd_wy0;
00582 } else {
00583 mZDCSMDCenterEx = HistTest;
00584 mZDCSMDCenterEy = mZDCSMDBeamCenter2D->GetBinContent(2,mRealRunID-5050000);
00585 mZDCSMDCenterWx = mZDCSMDBeamCenter2D->GetBinContent(3,mRealRunID-5050000);
00586 mZDCSMDCenterWy = mZDCSMDBeamCenter2D->GetBinContent(4,mRealRunID-5050000);
00587 }
00588 } else {
00589 mZDCSMDCenterEx = Flow::zdcsmd_ex0;
00590 mZDCSMDCenterEy = Flow::zdcsmd_ey0;
00591 mZDCSMDCenterWx = Flow::zdcsmd_wx0;
00592 mZDCSMDCenterWy = Flow::zdcsmd_wy0;
00593 }
00594 if (pZDCSMDConstFile->IsOpen()) {
00595 mRealRunID = mRunID;
00596 HistTest = 0.;
00597 TH2* mZDCSMDPed2D = (TH2D*)pZDCSMDConstFile->Get("ZDCSMDPedestal");
00598 while(HistTest < .1) {
00599 HistTest = mZDCSMDPed2D->GetBinContent(1,mRealRunID-5050000);
00600 if (HistTest > .1) break;
00601 mRealRunID -= 1;
00602 if (mRealRunID < 5050000) break;
00603 }
00604 if (mRealRunID < 5050000) {
00605 for (int i=0;i<2;i++) {for (int j=0;j<2;j++){for (int k=0;k<8;k++) {
00606 mZDCSMDPed[i][j][k] = Flow::zdcsmdPedstal[i][j][k];
00607 }}}
00608 } else {
00609 int zdcsmd_map[2][2][8] = {
00610 { { 7, 6, 5, 4, 3, 2, 1, 11} ,
00611 { 0,15,14,13,12,8,10, 9} } ,
00612 { {23,22,21,20,19,18,17,(mRealRunID < 8083000)?24:26} ,
00613 {16,31,30,29,28,27,(mRealRunID < 8083000)?26:24,25} }
00614 };
00615 for (int i=0;i<2;i++) {for (int j=0;j<2;j++){for (int k=0;k<8;k++) {
00616 mZDCSMDPed[i][j][k] = mZDCSMDPed2D->GetBinContent(zdcsmd_map[i][j][k]+1,
00617 mRealRunID-5050000);
00618 }}}
00619 }
00620 } else {
00621 for (int i=0;i<2;i++) {for (int j=0;j<2;j++){for (int k=0;k<8;k++) {
00622 mZDCSMDPed[i][j][k] = Flow::zdcsmdPedstal[i][j][k];
00623 }}}
00624 }
00625
00626
00627 if (pZDCSMDConstFile->IsOpen()) pZDCSMDConstFile->Close();
00628
00629 return kStOK;
00630 }
00631
00632
00633
00634 void StFlowMaker::FillFlowEvent() {
00635
00636
00637 if (Debug()) gMessMgr->Info() << "FlowMaker: FillFlowEvent()" << endm;
00638
00639
00640 if (mFirstLastPhiWgt) pFlowEvent->SetFirstLastPhiWgt();
00641 pFlowEvent->SetPhiWeightFarEast(mPhiWgtFarEast);
00642 pFlowEvent->SetPhiWeightEast(mPhiWgtEast);
00643 pFlowEvent->SetPhiWeightWest(mPhiWgtWest);
00644 pFlowEvent->SetPhiWeightFarWest(mPhiWgtFarWest);
00645 pFlowEvent->SetPhiWeightFtpcFarEast(mPhiWgtFtpcFarEast);
00646 pFlowEvent->SetPhiWeightFtpcEast(mPhiWgtFtpcEast);
00647 pFlowEvent->SetPhiWeightFtpcWest(mPhiWgtFtpcWest);
00648 pFlowEvent->SetPhiWeightFtpcFarWest(mPhiWgtFtpcFarWest);
00649 pFlowEvent->SetFirstLastPoints();
00650 pFlowEvent->SetZDCSMD_PsiWeightWest(mZDCSMD_PsiWgtWest);
00651 pFlowEvent->SetZDCSMD_PsiWeightEast(mZDCSMD_PsiWgtEast);
00652 pFlowEvent->SetZDCSMD_PsiWeightFull(mZDCSMD_PsiWgtFull);
00653 pFlowEvent->SetZDCSMD_BeamCenter(mZDCSMDCenterEx,mZDCSMDCenterEy,mZDCSMDCenterWx,
00654 mZDCSMDCenterWy);
00655
00656
00657 pFlowEvent->SetReCentX(mReCentX);
00658 pFlowEvent->SetReCentY(mReCentY);
00659
00660
00661 pFlowEvent->SetEventID((Int_t)(pEvent->id()));
00662 pFlowEvent->SetRunID((Int_t)(pEvent->runId()));
00663
00664 if (pEvent->runInfo()) {
00665 pFlowEvent->SetCenterOfMassEnergy(pEvent->runInfo()->centerOfMassEnergy());
00666 pFlowEvent->SetMagneticField(pEvent->runInfo()->magneticField());
00667 pFlowEvent->SetBeamMassNumberEast(pEvent->runInfo()->beamMassNumber(east));
00668 pFlowEvent->SetBeamMassNumberWest(pEvent->runInfo()->beamMassNumber(west));
00669 } else {
00670 gMessMgr->Info() << "FlowMaker: no Run Info, reverting to year 1 settings "
00671 << endm;
00672 pFlowEvent->SetCenterOfMassEnergy(130);
00673 pFlowEvent->SetMagneticField(4.98);
00674 pFlowEvent->SetBeamMassNumberEast(197);
00675 pFlowEvent->SetBeamMassNumberWest(197);
00676 }
00677
00678
00679 if (pEvent->runId() > 4000000) {
00680 pFlowEvent->SetL0TriggerWord(StFlowCutEvent::TriggersFound());
00681 } else {
00682 StL0Trigger* pTrigger = pEvent->l0Trigger();
00683 if (pTrigger) { pFlowEvent->SetL0TriggerWord(pTrigger->triggerWord()); }
00684 }
00685
00686
00687 const StThreeVectorF& vertex = pEvent->primaryVertex(0)->position();
00688 pFlowEvent->SetVertexPos(vertex);
00689
00690
00691 Float_t ctb = -1.;
00692 Float_t zdce = -1.;
00693 Float_t zdcw = -1.;
00694 Float_t zdcsmdEastHorizontal = -1.;
00695 Float_t zdcsmdEastVertical = -1.;
00696 Float_t zdcsmdWestHorizontal = -1.;
00697 Float_t zdcsmdWestVertical = -1.;
00698 StTriggerDetectorCollection *triggers = pEvent->triggerDetectorCollection();
00699 if (triggers) {
00700 StCtbTriggerDetector &CTB = triggers->ctb();
00701 StZdcTriggerDetector &ZDC = triggers->zdc();
00702
00703 for (UInt_t slat = 0; slat < CTB.numberOfSlats(); slat++) {
00704 for (UInt_t tray = 0; tray < CTB.numberOfTrays(); tray++) {
00705 ctb += CTB.mips(tray,slat,0);
00706 }
00707 }
00708
00709 zdce = ZDC.adcSum(east);
00710 zdcw = ZDC.adcSum(west);
00711
00712 for (int strip=1;strip<9;strip++) {
00713 if (ZDC.zdcSmd(east,1,strip)) {
00714 zdcsmdEastHorizontal = (ZDC.zdcSmd(east,1,strip)
00715 -mZDCSMDPed[0][1][strip-1])/Flow::zdcsmdGainFac[0][1][strip-1];
00716 pFlowEvent->SetZDCSMD(0,1,strip,zdcsmdEastHorizontal);
00717 }
00718 if (ZDC.zdcSmd(east,0,strip)) {
00719 zdcsmdEastVertical = (ZDC.zdcSmd(east,0,strip)
00720 -mZDCSMDPed[0][0][strip-1])/Flow::zdcsmdGainFac[0][0][strip-1];
00721 pFlowEvent->SetZDCSMD(0,0,strip,zdcsmdEastVertical);
00722 }
00723 if (ZDC.zdcSmd(west,1,strip)) {
00724 zdcsmdWestHorizontal = (ZDC.zdcSmd(west,1,strip)
00725 -mZDCSMDPed[1][1][strip-1])/Flow::zdcsmdGainFac[1][1][strip-1];
00726 pFlowEvent->SetZDCSMD(1,1,strip,zdcsmdWestHorizontal);
00727 }
00728 if (ZDC.zdcSmd(west,0,strip)) {
00729 zdcsmdWestVertical = (ZDC.zdcSmd(west,0,strip)
00730 -mZDCSMDPed[1][0][strip-1])/Flow::zdcsmdGainFac[1][0][strip-1];
00731 pFlowEvent->SetZDCSMD(1,0,strip,zdcsmdWestVertical);
00732 }
00733 }
00734 }
00735 pFlowEvent->SetCTB(ctb);
00736 pFlowEvent->SetZDCe(zdce);
00737 pFlowEvent->SetZDCw(zdcw);
00738
00739
00740 UInt_t origMult = pEvent->primaryVertex(0)->numberOfDaughters();
00741 pFlowEvent->SetOrigMult(origMult);
00742
00743 pFlowEvent->SetUncorrNegMult(uncorrectedNumberOfNegativePrimaries(*pEvent));
00744 pFlowEvent->SetUncorrPosMult(uncorrectedNumberOfPositivePrimaries(*pEvent));
00745
00746
00747 StuProbabilityPidAlgorithm uPid(*pEvent);
00748
00749
00750 int goodTracks = 0;
00751 int goodTracksEta = 0;
00752 StTpcDedxPidAlgorithm tpcDedxAlgo;
00753 Float_t nSigma;
00754 Float_t dcaSigned;
00755
00756 StSPtrVecTrackNode& trackNode = pEvent->trackNodes();
00757
00758 for (unsigned int j=0; j < trackNode.size(); j++) {
00759 StGlobalTrack* gTrack =
00760 static_cast<StGlobalTrack*>(trackNode[j]->track(global));
00761 StPrimaryTrack* pTrack =
00762 static_cast<StPrimaryTrack*>(trackNode[j]->track(primary));
00763
00764
00765
00766
00767 if (pTrack && pTrack->flag() > 0) {
00768 StThreeVectorD p = pTrack->geometry()->momentum();
00769 StThreeVectorD g = gTrack->geometry()->momentum();
00770
00771 if (fabs(p.pseudoRapidity()) < 0.75) goodTracksEta++;
00772 if (StFlowCutTrack::CheckTrack(pTrack)) {
00773
00774 StFlowTrack* pFlowTrack = new StFlowTrack;
00775 if (!pFlowTrack) return;
00776 pFlowTrack->SetPhi(p.phi());
00777 pFlowTrack->SetPhiGlobal(g.phi());
00778 pFlowTrack->SetEta(p.pseudoRapidity());
00779 pFlowTrack->SetEtaGlobal(g.pseudoRapidity());
00780 pFlowTrack->SetPt(p.perp());
00781 pFlowTrack->SetPtGlobal(g.perp());
00782 pFlowTrack->SetCharge(pTrack->geometry()->charge());
00783
00784 dcaSigned = CalcDcaSigned(vertex,gTrack);
00785 pFlowTrack->SetDcaSigned(dcaSigned);
00786 pFlowTrack->SetDca(pTrack->impactParameter());
00787 pFlowTrack->SetDcaGlobal(gTrack->impactParameter());
00788 pFlowTrack->SetChi2((Float_t)(pTrack->fitTraits().chi2()));
00789 pFlowTrack->SetTopologyMap(pTrack->topologyMap());
00790
00791 pFlowTrack->SetNhits(pTrack->detectorInfo()->numberOfPoints());
00792 pFlowTrack->SetFitPts(pTrack->fitTraits().numberOfFitPoints() -
00793 pTrack->fitTraits().numberOfFitPoints(kSvtId) -
00794 pTrack->fitTraits().numberOfFitPoints(kSsdId) - 1);
00795 pFlowTrack->SetMaxPts(pTrack->numberOfPossiblePoints() -
00796 pTrack->numberOfPossiblePoints(kSvtId) -
00797 pTrack->numberOfPossiblePoints(kSsdId) - 1);
00798
00799 Double_t pathLength = gTrack->geometry()->helix().pathLength(vertex);
00800 StThreeVectorD distance = gTrack->geometry()->helix().at(pathLength);
00801 pFlowTrack->SetDcaGlobal3(distance - vertex);
00802
00803 pFlowTrack->SetTrackLength(pTrack->length());
00804
00805 if (pTrack->topologyMap().hasHitInDetector(kFtpcEastId) ||
00806 pTrack->topologyMap().hasHitInDetector(kFtpcWestId)) {
00807 pFlowTrack->SetZFirstPoint(pTrack->detectorInfo()->firstPoint().z());
00808 pFlowTrack->SetZLastPoint(pTrack->detectorInfo()->lastPoint().z());
00809 }
00810
00811 else if (pTrack->topologyMap().hasHitInDetector(kTpcId)) {
00812 Double_t innerFieldCageRadius = 46.107;
00813 Double_t innerPadrowRadius = 60.0;
00814 Double_t x, y;
00815
00816 pFlowTrack->SetZLastPoint(pTrack->detectorInfo()->lastPoint().z());
00817
00818 x = pTrack->detectorInfo()->firstPoint().x();
00819 y = pTrack->detectorInfo()->firstPoint().y();
00820 if (TMath::Sqrt(x*x+y*y) >= innerFieldCageRadius) {
00821 pFlowTrack->SetZFirstPoint(pTrack->detectorInfo()->firstPoint().z());
00822 } else {
00823 pairD pathL = pTrack->geometry()->helix().pathLength(innerPadrowRadius);
00824
00825 Double_t s = 0.;
00826 Double_t s1 = pathL.first;
00827 Double_t s2 = pathL.second;
00828
00829
00830
00831
00832 if (finite(s1) != 0 || finite(s2) != 0) {
00833 if (s1 >= 0 && s2 >= 0) s = s1;
00834 else if (s1 >= 0 && s2 < 0) s = s1;
00835 else if (s1 < 0 && s2 >= 0) s = s2;
00836 pFlowTrack->SetZFirstPoint(pTrack->geometry()->helix().z(s));
00837 } else {
00838 pFlowTrack->SetZFirstPoint(0.);
00839 }
00840 }
00841 }
00842
00843 pTrack->pidTraits(tpcDedxAlgo);
00844 nSigma = (float)tpcDedxAlgo.numberOfSigma(StPionPlus::instance());
00845 pFlowTrack->SetPidPiPlus(nSigma);
00846 nSigma = (float)tpcDedxAlgo.numberOfSigma(StPionMinus::instance());
00847 pFlowTrack->SetPidPiMinus(nSigma);
00848 nSigma = (float)tpcDedxAlgo.numberOfSigma(StProton::instance());
00849 pFlowTrack->SetPidProton(nSigma);
00850 nSigma = (float)tpcDedxAlgo.numberOfSigma(StAntiProton::instance());
00851 pFlowTrack->SetPidAntiProton(nSigma);
00852 nSigma = (float)tpcDedxAlgo.numberOfSigma(StKaonMinus::instance());
00853 pFlowTrack->SetPidKaonMinus(nSigma);
00854 nSigma = (float)tpcDedxAlgo.numberOfSigma(StKaonPlus::instance());
00855 pFlowTrack->SetPidKaonPlus(nSigma);
00856 nSigma = (float)tpcDedxAlgo.numberOfSigma(StDeuteron::instance());
00857 pFlowTrack->SetPidDeuteron(nSigma);
00858 if (pTrack->geometry()->charge() < 0) {
00859 pFlowTrack->SetPidAntiDeuteron(nSigma);
00860 }
00861 nSigma = (float)tpcDedxAlgo.numberOfSigma(StElectron::instance());
00862 pFlowTrack->SetPidElectron(nSigma);
00863 nSigma = (float)tpcDedxAlgo.numberOfSigma(StPositron::instance());
00864 pFlowTrack->SetPidPositron(nSigma);
00865
00866
00867 StPtrVecTrackPidTraits traits = pTrack->pidTraits(kTpcId);
00868 unsigned int size = traits.size();
00869 if (size) {
00870 StDedxPidTraits* pid = 0;
00871 for (unsigned int i = 0; i < traits.size(); i++) {
00872 pid = dynamic_cast<StDedxPidTraits*>(traits[i]);
00873 if (pid && pid->method() == kTruncatedMeanId) break;
00874 }
00875 assert(pid);
00876 pFlowTrack->SetDedx(pid->mean());
00877 pFlowTrack->SetNdedxPts(pid->numberOfPoints());
00878 }
00879
00880
00881
00882 (void*)pTrack->pidTraits(uPid);
00883 pFlowTrack->SetMostLikelihoodPID(uPid.mostLikelihoodParticleGeantID());
00884 pFlowTrack->SetMostLikelihoodProb(uPid.mostLikelihoodProbability());
00885 if (uPid.isExtrap()) pFlowTrack->SetExtrapTag(1);
00886 else pFlowTrack->SetExtrapTag(0);
00887 if (pTrack->geometry()->charge() < 0) {
00888 pFlowTrack->SetElectronPositronProb(uPid.beingElectronProb());
00889 pFlowTrack->SetPionPlusMinusProb(uPid.beingPionMinusProb());
00890 pFlowTrack->SetKaonPlusMinusProb(uPid.beingKaonMinusProb());
00891 pFlowTrack->SetProtonPbarProb(uPid.beingAntiProtonProb());
00892 } else if (pTrack->geometry()->charge() > 0) {
00893 pFlowTrack->SetElectronPositronProb(uPid.beingPositronProb());
00894 pFlowTrack->SetPionPlusMinusProb(uPid.beingPionPlusProb());
00895 pFlowTrack->SetKaonPlusMinusProb(uPid.beingKaonPlusProb());
00896 pFlowTrack->SetProtonPbarProb(uPid.beingProtonProb());
00897 }
00898
00899 pFlowEvent->TrackCollection()->push_back(pFlowTrack);
00900 goodTracks++;
00901 }
00902 }
00903 }
00904
00905
00906 if (!StFlowCutEvent::CheckEtaSymmetry(pEvent)) {
00907 delete pFlowEvent;
00908 pFlowEvent = NULL;
00909 return;
00910 }
00911
00912
00913 UInt_t rawMult = pFlowEvent->UncorrNegMult() + pFlowEvent->UncorrPosMult();
00914 pFlowEvent->SetMultEta(rawMult);
00915
00916
00917 pFlowEvent->SetCentrality();
00918
00919
00920 (pFlowEvent->ProbPid()) ? pFlowEvent->SetPidsProb() :
00921 pFlowEvent->SetPidsDeviant();
00922
00923
00924 pFlowEvent->TrackCollection()->random_shuffle();
00925
00926
00927 pFlowEvent->SetSelections();
00928
00929
00930 (pFlowEvent->EtaSubs()) ? pFlowEvent->MakeEtaSubEvents() :
00931 pFlowEvent->MakeSubEvents();
00932
00933 }
00934
00935
00936
00937 void StFlowMaker::FillPicoEvent() {
00938
00939
00940 if (Debug()) gMessMgr->Info() << "FlowMaker: FillPicoEvent()" << endm;
00941
00942 if (!pPicoEvent) {
00943 gMessMgr->Warning("##### FlowMaker: No FlowPicoEvent");
00944 return;
00945 }
00946 StFlowPicoTrack* pFlowPicoTrack = new StFlowPicoTrack();
00947
00948 pPicoEvent->SetVersion(7);
00949 pPicoEvent->SetEventID(pFlowEvent->EventID());
00950 pPicoEvent->SetRunID(pFlowEvent->RunID());
00951 pPicoEvent->SetL0TriggerWord(pFlowEvent->L0TriggerWord());
00952
00953 pPicoEvent->SetCenterOfMassEnergy(pFlowEvent->CenterOfMassEnergy());
00954 pPicoEvent->SetMagneticField(pFlowEvent->MagneticField());
00955 pPicoEvent->SetBeamMassNumberEast(pFlowEvent->BeamMassNumberEast());
00956 pPicoEvent->SetBeamMassNumberWest(pFlowEvent->BeamMassNumberWest());
00957
00958 pPicoEvent->SetOrigMult(pFlowEvent->OrigMult());
00959 pPicoEvent->SetUncorrNegMult(pFlowEvent->UncorrNegMult());
00960 pPicoEvent->SetUncorrPosMult(pFlowEvent->UncorrPosMult());
00961 pPicoEvent->SetMultEta(pFlowEvent->MultEta());
00962 pPicoEvent->SetCentrality(pFlowEvent->Centrality());
00963 pPicoEvent->SetVertexPos(pFlowEvent->VertexPos().x(),
00964 pFlowEvent->VertexPos().y(),
00965 pFlowEvent->VertexPos().z());
00966 pPicoEvent->SetCTB(pFlowEvent->CTB());
00967 pPicoEvent->SetZDCe(pFlowEvent->ZDCe());
00968 pPicoEvent->SetZDCw(pFlowEvent->ZDCw());
00969
00970 for (int i=0; i<2; i++)
00971 for (int j=0; j<2; j++)
00972 for (int k=1; k<9; k++)
00973 pPicoEvent->SetZDCSMD(i,j,k,pFlowEvent->ZDCSMD(i,j,k));
00974
00975 StFlowTrackIterator itr;
00976 StFlowTrackCollection* pFlowTracks = pFlowEvent->TrackCollection();
00977
00978 for (itr = pFlowTracks->begin(); itr != pFlowTracks->end(); itr++) {
00979 StFlowTrack* pFlowTrack = *itr;
00980 pFlowPicoTrack->SetPt(pFlowTrack->Pt());
00981 pFlowPicoTrack->SetPtGlobal(pFlowTrack->PtGlobal());
00982 pFlowPicoTrack->SetEta(pFlowTrack->Eta());
00983 pFlowPicoTrack->SetEtaGlobal(pFlowTrack->EtaGlobal());
00984 pFlowPicoTrack->SetDedx(pFlowTrack->Dedx());
00985 pFlowPicoTrack->SetPhi(pFlowTrack->Phi());
00986 pFlowPicoTrack->SetPhiGlobal(pFlowTrack->PhiGlobal());
00987 pFlowPicoTrack->SetCharge(pFlowTrack->Charge());
00988 pFlowPicoTrack->SetDcaSigned(pFlowTrack->DcaSigned());
00989 pFlowPicoTrack->SetDca(pFlowTrack->Dca());
00990 pFlowPicoTrack->SetDcaGlobal(pFlowTrack->DcaGlobal());
00991 pFlowPicoTrack->SetZFirstPoint(pFlowTrack->ZFirstPoint());
00992 pFlowPicoTrack->SetZLastPoint(pFlowTrack->ZLastPoint());
00993 pFlowPicoTrack->SetChi2(pFlowTrack->Chi2());
00994 pFlowPicoTrack->SetFitPts(pFlowTrack->FitPts() + 1);
00995 pFlowPicoTrack->SetMaxPts(pFlowTrack->MaxPts());
00996 pFlowPicoTrack->SetNhits(pFlowTrack->Nhits());
00997 pFlowPicoTrack->SetNdedxPts(pFlowTrack->NdedxPts());
00998 pFlowPicoTrack->SetDcaGlobal3(pFlowTrack->DcaGlobal3().x(),
00999 pFlowTrack->DcaGlobal3().y(),
01000 pFlowTrack->DcaGlobal3().z());
01001 pFlowPicoTrack->SetTrackLength(pFlowTrack->TrackLength());
01002 pFlowPicoTrack->SetMostLikelihoodPID(pFlowTrack->MostLikelihoodPID());
01003 pFlowPicoTrack->SetMostLikelihoodProb(pFlowTrack->MostLikelihoodProb());
01004 pFlowPicoTrack->SetExtrapTag(pFlowTrack->ExtrapTag());
01005 pFlowPicoTrack->SetElectronPositronProb(pFlowTrack->ElectronPositronProb());
01006 pFlowPicoTrack->SetPionPlusMinusProb(pFlowTrack->PionPlusMinusProb());
01007 pFlowPicoTrack->SetKaonPlusMinusProb(pFlowTrack->KaonPlusMinusProb());
01008 pFlowPicoTrack->SetProtonPbarProb(pFlowTrack->ProtonPbarProb());
01009 if (pFlowPicoTrack->Charge() > 0) {
01010 pFlowPicoTrack->SetPidPion(pFlowTrack->PidPiPlus());
01011 pFlowPicoTrack->SetPidProton(pFlowTrack->PidProton());
01012 pFlowPicoTrack->SetPidKaon(pFlowTrack->PidKaonPlus());
01013 pFlowPicoTrack->SetPidDeuteron(pFlowTrack->PidDeuteron());
01014 pFlowPicoTrack->SetPidElectron(pFlowTrack->PidPositron());
01015 } else {
01016 pFlowPicoTrack->SetPidPion(pFlowTrack->PidPiMinus());
01017 pFlowPicoTrack->SetPidProton(pFlowTrack->PidAntiProton());
01018 pFlowPicoTrack->SetPidKaon(pFlowTrack->PidKaonMinus());
01019 pFlowPicoTrack->SetPidDeuteron(pFlowTrack->PidAntiDeuteron());
01020 pFlowPicoTrack->SetPidElectron(pFlowTrack->PidElectron());
01021 }
01022 pFlowPicoTrack->SetTopologyMap(pFlowTrack->TopologyMap().data(0),
01023 pFlowTrack->TopologyMap().data(1));
01024 pPicoEvent->AddTrack(pFlowPicoTrack);
01025 }
01026
01027 pFlowTree->Fill();
01028 pPicoEvent->Clear();
01029
01030 delete pFlowPicoTrack;
01031 }
01032
01033
01034
01035 Bool_t StFlowMaker::FillFromPicoDST(StFlowPicoEvent* pPicoEvent) {
01036
01037
01038 if (Debug()) gMessMgr->Info() << "FlowMaker: FillFromPicoDST()" << endm;
01039 if (Debug()) gMessMgr->Info() << "FlowMaker: Pico Version: " <<
01040 pPicoEvent->Version() << endm;
01041
01042 if (!pPicoEvent || !pPicoChain->GetEntry(mEventCounter++)) {
01043 cout << "##### FlowMaker: no more events" << endl;
01044 return kFALSE;
01045 }
01046
01047
01048 if (mFirstLastPhiWgt) pFlowEvent->SetFirstLastPhiWgt();
01049 pFlowEvent->SetPhiWeightFarEast(mPhiWgtFarEast);
01050 pFlowEvent->SetPhiWeightEast(mPhiWgtEast);
01051 pFlowEvent->SetPhiWeightWest(mPhiWgtWest);
01052 pFlowEvent->SetPhiWeightFarWest(mPhiWgtFarWest);
01053 pFlowEvent->SetPhiWeightFtpcFarEast(mPhiWgtFtpcFarEast);
01054 pFlowEvent->SetPhiWeightFtpcEast(mPhiWgtFtpcEast);
01055 pFlowEvent->SetPhiWeightFtpcWest(mPhiWgtFtpcWest);
01056 pFlowEvent->SetPhiWeightFtpcFarWest(mPhiWgtFtpcFarWest);
01057
01058
01059 pFlowEvent->SetReCentX(mReCentX);
01060 pFlowEvent->SetReCentY(mReCentY);
01061
01062
01063 if (!StFlowCutEvent::CheckEvent(pPicoEvent)) {
01064 Int_t eventID = pPicoEvent->EventID();
01065 gMessMgr->Info() << "##### FlowMaker: picoevent " << eventID
01066 << " cut" << endm;
01067 delete pFlowEvent;
01068 pFlowEvent = NULL;
01069 return kTRUE;
01070 }
01071
01072
01073 switch (pPicoEvent->Version()) {
01074 case 7: FillFromPicoVersion7DST(pPicoEvent); break;
01075 default:
01076 cout << "##### FlowMaker: Illegal pico file version" << endl;
01077 return kStFatal;
01078 }
01079
01080
01081 if (!StFlowCutEvent::CheckEtaSymmetry(pPicoEvent)) {
01082 Int_t eventID = pPicoEvent->EventID();
01083 gMessMgr->Info() << "##### FlowMaker: picoevent " << eventID
01084 << " cut" << endm;
01085 delete pFlowEvent;
01086 pFlowEvent = NULL;
01087 return kTRUE;
01088 }
01089
01090 (pFlowEvent->ProbPid()) ? pFlowEvent->SetPidsProb() :
01091 pFlowEvent->SetPidsDeviant();
01092
01093 pFlowEvent->TrackCollection()->random_shuffle();
01094
01095 pFlowEvent->SetSelections();
01096 (pFlowEvent->EtaSubs()) ? pFlowEvent->MakeEtaSubEvents() :
01097 pFlowEvent->MakeSubEvents();
01098
01099 return kTRUE;
01100 }
01101
01102
01103
01104 Bool_t StFlowMaker::FillFromPicoVersion7DST(StFlowPicoEvent* pPicoEvent) {
01105
01106
01107 if (Debug()) gMessMgr->Info() << "FlowMaker: FillFromPicoVersion7DST()" << endm;
01108
01109 StuProbabilityPidAlgorithm uPid;
01110
01111 pFlowEvent->SetFirstLastPoints();
01112 pFlowEvent->SetEventID(pPicoEvent->EventID());
01113 UInt_t origMult = pPicoEvent->OrigMult();
01114 pFlowEvent->SetOrigMult(origMult);
01115
01116 pFlowEvent->SetUncorrNegMult(pPicoEvent->UncorrNegMult());
01117 pFlowEvent->SetUncorrPosMult(pPicoEvent->UncorrPosMult());
01118 pFlowEvent->SetVertexPos(StThreeVectorF(pPicoEvent->VertexX(),
01119 pPicoEvent->VertexY(),
01120 pPicoEvent->VertexZ()) );
01121
01122 pFlowEvent->SetRunID(pPicoEvent->RunID());
01123 pFlowEvent->SetL0TriggerWord(pPicoEvent->L0TriggerWord());
01124
01125 pFlowEvent->SetCenterOfMassEnergy(pPicoEvent->CenterOfMassEnergy());
01126 pFlowEvent->SetMagneticField(pPicoEvent->MagneticField());
01127 pFlowEvent->SetBeamMassNumberEast(pPicoEvent->BeamMassNumberEast());
01128 pFlowEvent->SetBeamMassNumberWest(pPicoEvent->BeamMassNumberWest());
01129 pFlowEvent->SetMultEta(pPicoEvent->MultEta());
01130 pFlowEvent->SetCentrality();
01131
01132 pFlowEvent->SetCTB(pPicoEvent->CTB());
01133 pFlowEvent->SetZDCe(pPicoEvent->ZDCe());
01134 pFlowEvent->SetZDCw(pPicoEvent->ZDCw());
01135
01136 for (int i=0; i<2; i++)
01137 for (int j=0; j<2; j++)
01138 for (int k=1; k<9; k++)
01139 pFlowEvent->SetZDCSMD(i,j,k,pPicoEvent->ZDCSMD(i,j,k));
01140
01141 pFlowEvent->SetZDCSMD_PsiWeightWest(mZDCSMD_PsiWgtWest);
01142 pFlowEvent->SetZDCSMD_PsiWeightEast(mZDCSMD_PsiWgtEast);
01143 pFlowEvent->SetZDCSMD_PsiWeightFull(mZDCSMD_PsiWgtFull);
01144 pFlowEvent->SetZDCSMD_BeamCenter(mZDCSMDCenterEx,mZDCSMDCenterEy,mZDCSMDCenterWx,
01145 mZDCSMDCenterWy);
01146 int goodTracks = 0;
01147
01148 for (Int_t nt=0; nt < pPicoEvent->GetNtrack(); nt++) {
01149 StFlowPicoTrack* pPicoTrack = (StFlowPicoTrack*)pPicoEvent->Tracks()
01150 ->UncheckedAt(nt);
01151 if (pPicoTrack && (pPicoTrack->Dca())!=(pPicoTrack->DcaGlobal())
01152 && StFlowCutTrack::CheckTrack(pPicoTrack)) {
01153
01154 StFlowTrack* pFlowTrack = new StFlowTrack;
01155 if (!pFlowTrack) return kFALSE;
01156 pFlowTrack->SetPt(pPicoTrack->Pt());
01157 pFlowTrack->SetPtGlobal(pPicoTrack->PtGlobal());
01158 pFlowTrack->SetPhi(pPicoTrack->Phi());
01159 pFlowTrack->SetPhiGlobal(pPicoTrack->PhiGlobal());
01160 pFlowTrack->SetEta(pPicoTrack->Eta());
01161 pFlowTrack->SetEtaGlobal(pPicoTrack->EtaGlobal());
01162 pFlowTrack->SetZFirstPoint(pPicoTrack->ZFirstPoint());
01163 pFlowTrack->SetZLastPoint(pPicoTrack->ZLastPoint());
01164 pFlowTrack->SetDedx(pPicoTrack->Dedx());
01165 pFlowTrack->SetCharge(pPicoTrack->Charge());
01166 pFlowTrack->SetDcaSigned(pPicoTrack->DcaSigned());
01167 pFlowTrack->SetDca(pPicoTrack->Dca());
01168 pFlowTrack->SetDcaGlobal(pPicoTrack->DcaGlobal());
01169 pFlowTrack->SetChi2(pPicoTrack->Chi2());
01170 pFlowTrack->SetFitPts(pPicoTrack->FitPts() - 1);
01171 pFlowTrack->SetMaxPts(pPicoTrack->MaxPts());
01172 pFlowTrack->SetNhits(pPicoTrack->Nhits());
01173 pFlowTrack->SetNdedxPts(pPicoTrack->NdedxPts());
01174 pFlowTrack->SetDcaGlobal3(StThreeVectorD(pPicoTrack->DcaGlobalX(),
01175 pPicoTrack->DcaGlobalY(),
01176 pPicoTrack->DcaGlobalZ()) );
01177 pFlowTrack->SetTrackLength(pPicoTrack->TrackLength());
01178
01179 if (StFlowEvent::ProbPid() && StuProbabilityPidAlgorithm::isPIDTableRead()) {
01180 uPid.processPIDAsFunction(uPid.getCentrality(pPicoEvent->UncorrNegMult()),
01181 pPicoTrack->DcaGlobal(),
01182 pPicoTrack->Charge(),
01183 fabs((pPicoTrack->Pt()/sqrt(1-(tanh(pPicoTrack->Eta())
01184 *tanh(pPicoTrack->Eta()))))/float(pPicoTrack->Charge())),
01185 pPicoTrack->Eta(),
01186 pPicoTrack->NdedxPts(),
01187 pPicoTrack->Dedx() );
01188
01189 pFlowTrack->SetMostLikelihoodPID(uPid.mostLikelihoodParticleGeantID());
01190 pFlowTrack->SetMostLikelihoodProb(uPid.mostLikelihoodProbability());
01191 pFlowTrack->SetExtrapTag(int(uPid.isExtrap()));
01192
01193 pFlowTrack->SetElectronPositronProb( (pPicoTrack->Charge()>0) ?
01194 float(uPid.beingPositronProb()) :
01195 float(uPid.beingElectronProb()) );
01196
01197 pFlowTrack->SetPionPlusMinusProb( (pPicoTrack->Charge()>0) ?
01198 float(uPid.beingPionPlusProb()) :
01199 float(uPid.beingPionMinusProb()) );
01200
01201 pFlowTrack->SetKaonPlusMinusProb( (pPicoTrack->Charge()>0) ?
01202 float(uPid.beingKaonPlusProb()) :
01203 float(uPid.beingKaonMinusProb()) );
01204
01205 pFlowTrack->SetProtonPbarProb( (pPicoTrack->Charge()>0) ?
01206 float(uPid.beingProtonProb()) :
01207 float(uPid.beingAntiProtonProb()) );
01208
01209 } else {
01210 pFlowTrack->SetMostLikelihoodPID(pPicoTrack->MostLikelihoodPID());
01211 pFlowTrack->SetMostLikelihoodProb(pPicoTrack->MostLikelihoodProb());
01212 pFlowTrack->SetExtrapTag(pPicoTrack->ExtrapTag());
01213 pFlowTrack->SetElectronPositronProb(pPicoTrack->ElectronPositronProb());
01214 pFlowTrack->SetPionPlusMinusProb(pPicoTrack->PionPlusMinusProb());
01215 pFlowTrack->SetKaonPlusMinusProb(pPicoTrack->KaonPlusMinusProb());
01216 pFlowTrack->SetProtonPbarProb(pPicoTrack->ProtonPbarProb());
01217 }
01218
01219 if (pPicoTrack->Charge() < 0) {
01220 pFlowTrack->SetPidPiMinus(pPicoTrack->PidPion());
01221 pFlowTrack->SetPidAntiProton(pPicoTrack->PidProton());
01222 pFlowTrack->SetPidKaonMinus(pPicoTrack->PidKaon());
01223 pFlowTrack->SetPidAntiDeuteron(pPicoTrack->PidDeuteron());
01224 pFlowTrack->SetPidElectron(pPicoTrack->PidElectron());
01225 } else {
01226 pFlowTrack->SetPidPiPlus(pPicoTrack->PidPion());
01227 pFlowTrack->SetPidProton(pPicoTrack->PidProton());
01228 pFlowTrack->SetPidKaonPlus(pPicoTrack->PidKaon());
01229 pFlowTrack->SetPidDeuteron(pPicoTrack->PidDeuteron());
01230 pFlowTrack->SetPidPositron(pPicoTrack->PidElectron());
01231 }
01232
01233 if (pPicoTrack->TopologyMap0() || pPicoTrack->TopologyMap1()) {
01234
01235 pFlowTrack->SetTopologyMap(StTrackTopologyMap(pPicoTrack->TopologyMap0(),
01236 pPicoTrack->TopologyMap1()) );
01237 }
01238
01239 pFlowEvent->TrackCollection()->push_back(pFlowTrack);
01240 goodTracks++;
01241 }
01242 }
01243
01244 return kTRUE;
01245 }
01246
01247
01248
01249 Bool_t StFlowMaker::FillFromMuDST() {
01250
01251
01252 if (Debug()) gMessMgr->Info() << "FlowMaker: FillFromMuDST()" << endm;
01253
01254
01255 if (!StFlowCutEvent::CheckEvent(pMu)) {
01256 Int_t eventID = pMuEvent->eventId();
01257 gMessMgr->Info() << "##### FlowMaker: MuEvent " << eventID
01258 << " cut" << endm;
01259 delete pFlowEvent;
01260 pFlowEvent = NULL;
01261 return kTRUE;
01262 }
01263
01264
01265 if (mFirstLastPhiWgt) pFlowEvent->SetFirstLastPhiWgt();
01266 pFlowEvent->SetPhiWeightFarEast(mPhiWgtFarEast);
01267 pFlowEvent->SetPhiWeightEast(mPhiWgtEast);
01268 pFlowEvent->SetPhiWeightWest(mPhiWgtWest);
01269 pFlowEvent->SetPhiWeightFarWest(mPhiWgtFarWest);
01270 pFlowEvent->SetPhiWeightFtpcFarEast(mPhiWgtFtpcFarEast);
01271 pFlowEvent->SetPhiWeightFtpcEast(mPhiWgtFtpcEast);
01272 pFlowEvent->SetPhiWeightFtpcWest(mPhiWgtFtpcWest);
01273 pFlowEvent->SetPhiWeightFtpcFarWest(mPhiWgtFtpcFarWest);
01274 pFlowEvent->SetFirstLastPoints();
01275 pFlowEvent->SetZDCSMD_PsiWeightWest(mZDCSMD_PsiWgtWest);
01276 pFlowEvent->SetZDCSMD_PsiWeightEast(mZDCSMD_PsiWgtEast);
01277 pFlowEvent->SetZDCSMD_PsiWeightFull(mZDCSMD_PsiWgtFull);
01278 pFlowEvent->SetZDCSMD_BeamCenter(mZDCSMDCenterEx, mZDCSMDCenterEy,
01279 mZDCSMDCenterWx, mZDCSMDCenterWy);
01280
01281
01282 pFlowEvent->SetReCentX(mReCentX);
01283 pFlowEvent->SetReCentY(mReCentY);
01284
01285
01286 pFlowEvent->SetRunID(pMuEvent->runId());
01287
01288 pFlowEvent->SetCenterOfMassEnergy(pMuEvent->runInfo().centerOfMassEnergy());
01289 pFlowEvent->SetMagneticField(pMuEvent->runInfo().magneticField());
01290 pFlowEvent->SetUncorrNegMult(pMuEvent->refMultNeg());
01291 pFlowEvent->SetUncorrPosMult(pMuEvent->refMultPos());
01292 if (pMuEvent->runId() > 8000000) {
01293 pFlowEvent->SetMultEta(pMuEvent->grefmult());
01294 } else {
01295 pFlowEvent->SetMultEta(pMuEvent->refMult());
01296 }
01297 pFlowEvent->SetCentrality();
01298 pFlowEvent->SetEventID(pMuEvent->eventId());
01299 pFlowEvent->SetVertexPos(pMuEvent->primaryVertexPosition());
01300 pFlowEvent->SetL0TriggerWord(StFlowCutEvent::TriggersFound());
01301 pFlowEvent->SetBeamMassNumberEast(pMuEvent->runInfo().beamMassNumber(east));
01302 pFlowEvent->SetBeamMassNumberWest(pMuEvent->runInfo().beamMassNumber(west));
01303
01304 StuProbabilityPidAlgorithm uPid;
01305
01306 pFlowEvent->SetCTB(pMuEvent->ctbMultiplicity());
01307 pFlowEvent->SetZDCe(pMuEvent->zdcAdcAttentuatedSumEast());
01308 pFlowEvent->SetZDCw(pMuEvent->zdcAdcAttentuatedSumWest());
01309
01310
01311 Float_t zdcsmdEastHorizontal = -1.;
01312 Float_t zdcsmdEastVertical = -1.;
01313 Float_t zdcsmdWestHorizontal = -1.;
01314 Float_t zdcsmdWestVertical = -1.;
01315 StZdcTriggerDetector &ZDC = pMuEvent->zdcTriggerDetector();
01316 for (int strip=1; strip<9; strip++) {
01317 if (ZDC.zdcSmd(east,1,strip)) {
01318 zdcsmdEastHorizontal = (ZDC.zdcSmd(east,1,strip)
01319 -mZDCSMDPed[0][1][strip-1])/Flow::zdcsmdGainFac[0][1][strip-1];
01320 pFlowEvent->SetZDCSMD(0,1,strip,zdcsmdEastHorizontal);
01321 }
01322 if (ZDC.zdcSmd(east,0,strip)) {
01323 zdcsmdEastVertical = (ZDC.zdcSmd(east,0,strip)
01324 -mZDCSMDPed[0][0][strip-1])/Flow::zdcsmdGainFac[0][0][strip-1];
01325 pFlowEvent->SetZDCSMD(0,0,strip,zdcsmdEastVertical);
01326 }
01327 if (ZDC.zdcSmd(west,1,strip)) {
01328 zdcsmdWestHorizontal = (ZDC.zdcSmd(west,1,strip)
01329 -mZDCSMDPed[1][1][strip-1])/Flow::zdcsmdGainFac[1][1][strip-1];
01330 pFlowEvent->SetZDCSMD(1,1,strip,zdcsmdWestHorizontal);
01331 }
01332 if (ZDC.zdcSmd(west,0,strip)) {
01333 zdcsmdWestVertical = (ZDC.zdcSmd(west,0,strip)
01334 -mZDCSMDPed[1][0][strip-1])/Flow::zdcsmdGainFac[1][0][strip-1];
01335 pFlowEvent->SetZDCSMD(1,0,strip,zdcsmdWestVertical);
01336 }
01337 }
01338
01339
01340 UInt_t origMult = pMuTracks->GetEntries();
01341 pFlowEvent->SetOrigMult(origMult);
01342
01343 int goodTracks = 0;
01344
01345 for (Int_t nt=0; nt < (Int_t)origMult; nt++) {
01346 StMuTrack* pMuTrack = (StMuTrack*)pMuTracks->UncheckedAt(nt);
01347 if (pMuTrack && pMuTrack->flag()>0 && StFlowCutTrack::CheckTrack(pMuTrack)) {
01348
01349 StFlowTrack* pFlowTrack = new StFlowTrack;
01350 if (!pFlowTrack) return kFALSE;
01351 pFlowTrack->SetPt(pMuTrack->pt());
01352 if (pMuTrack->index2Global()<0) {
01353 gMessMgr->Info() << "FlowMaker: FillFromMuVersion0DST(): WARNING! primary track has no reference to global track (index2Global < 0)" << endl;
01354 continue;
01355 }
01356 StMuTrack* pMuGlobalTrack = (StMuTrack*)pMuGlobalTracks->
01357 At(pMuTrack->index2Global());
01358 if (!pMuGlobalTrack) {
01359 gMessMgr->Info() << "FlowMaker: FillFromMuVersion0DST(): WARNING! primary track has no reference to global track (pMuGlobalTrack = 0)" << endl;
01360 continue;
01361 }
01362 pFlowTrack->Setid(pMuTrack->id());
01363 pFlowTrack->SetPtGlobal(pMuGlobalTrack->pt());
01364 pFlowTrack->SetPhi(pMuTrack->phi());
01365 pFlowTrack->SetPhiGlobal(pMuGlobalTrack->phi());
01366 pFlowTrack->SetEta(pMuTrack->eta());
01367 pFlowTrack->SetEtaGlobal(pMuGlobalTrack->eta());
01368 pFlowTrack->SetDedx(pMuTrack->dEdx());
01369 pFlowTrack->SetCharge(pMuTrack->charge());
01370 pFlowTrack->SetDcaSigned(CalcDcaSigned(pMuEvent->primaryVertexPosition(),
01371 pMuTrack->helix()));
01372 pFlowTrack->SetDca(pMuTrack->dca().mag());
01373 pFlowTrack->SetDcaGlobal(pMuTrack->dcaGlobal().mag());
01374 pFlowTrack->SetChi2(pMuTrack->chi2xy());
01375 pFlowTrack->SetTopologyMap(pMuTrack->topologyMap());
01376
01377 pFlowTrack->SetNhits(pMuTrack->nHits());
01378 pFlowTrack->SetFitPts(pMuTrack->nHitsFit() -
01379 pMuTrack->nHitsFit(kSvtId) -
01380 pMuTrack->nHitsFit(kSsdId) - 1);
01381 pFlowTrack->SetMaxPts(pMuTrack->nHitsPoss() -
01382 pMuTrack->nHitsPoss(kSvtId) -
01383 pMuTrack->nHitsPoss(kSsdId) - 1);
01384
01385 pFlowTrack->SetNdedxPts(pMuTrack->nHitsDedx());
01386 pFlowTrack->SetDcaGlobal3(pMuTrack->dcaGlobal());
01387 pFlowTrack->SetTrackLength(pMuTrack->helix().pathLength(pMuEvent->
01388 primaryVertexPosition()));
01389
01390 if (pFlowTrack->TopologyMap().hasHitInDetector(kFtpcEastId)
01391 || pFlowTrack->TopologyMap().hasHitInDetector(kFtpcWestId)) {
01392 pFlowTrack->SetZFirstPoint(pMuTrack->firstPoint().z());
01393 pFlowTrack->SetZLastPoint(pMuTrack->lastPoint().z());
01394 }
01395 else if (pFlowTrack->TopologyMap().hasHitInDetector(kTpcId)) {
01396 Double_t innerFieldCageRadius = 46.107;
01397 Double_t innerPadrowRadius = 60.0;
01398 Double_t x, y;
01399 pFlowTrack->SetZLastPoint(pMuTrack->lastPoint().z());
01400
01401 x = pMuTrack->firstPoint().x();
01402 y = pMuTrack->firstPoint().y();
01403 if (TMath::Sqrt(x*x+y*y) >= innerFieldCageRadius) {
01404 pFlowTrack->SetZFirstPoint(pMuTrack->firstPoint().z());
01405 } else {
01406 pairD pathL = pMuTrack->helix().pathLength(innerPadrowRadius);
01407
01408 Double_t s = 0.;
01409 Double_t s1 = pathL.first;
01410 Double_t s2 = pathL.second;
01411
01412
01413
01414 if (finite(s1) != 0 || finite(s2) != 0) {
01415 if (s1 >= 0 && s2 >= 0) s = s1;
01416 else if (s1 >= 0 && s2 < 0) s = s1;
01417 else if (s1 < 0 && s2 >= 0) s = s2;
01418 pFlowTrack->SetZFirstPoint(pMuTrack->helix().z(s));
01419 } else {
01420 pFlowTrack->SetZFirstPoint(0.);
01421 }
01422 }
01423 }
01424
01425 if (StFlowEvent::ProbPid() && StuProbabilityPidAlgorithm::isPIDTableRead()) {
01426 PR(StuProbabilityPidAlgorithm::isPIDTableRead());
01427 uPid.processPIDAsFunction(uPid.getCentrality(pMuEvent->refMultNeg()),
01428 pMuTrack->dcaGlobal().mag(),
01429 pMuTrack->charge(),
01430 fabs((pMuTrack->p().mag())/float(pMuTrack->charge())),
01431 pMuTrack->eta(),
01432 pMuTrack->nHitsDedx(),
01433 pMuTrack->dEdx() );
01434
01435 pFlowTrack->SetMostLikelihoodPID(uPid.mostLikelihoodParticleGeantID());
01436 pFlowTrack->SetMostLikelihoodProb(uPid.mostLikelihoodProbability());
01437 pFlowTrack->SetExtrapTag(int(uPid.isExtrap()));
01438
01439 pFlowTrack->SetElectronPositronProb( (pMuTrack->charge()>0) ?
01440 float(uPid.beingPositronProb()) :
01441 float(uPid.beingElectronProb()) );
01442
01443 pFlowTrack->SetPionPlusMinusProb( (pMuTrack->charge()>0) ?
01444 float(uPid.beingPionPlusProb()) :
01445 float(uPid.beingPionMinusProb()) );
01446
01447 pFlowTrack->SetKaonPlusMinusProb( (pMuTrack->charge()>0) ?
01448 float(uPid.beingKaonPlusProb()) :
01449 float(uPid.beingKaonMinusProb()) );
01450
01451 pFlowTrack->SetProtonPbarProb( (pMuTrack->charge()>0) ?
01452 float(uPid.beingProtonProb()) :
01453 float(uPid.beingAntiProtonProb()) );
01454 } else {
01455 pFlowTrack->SetElectronPositronProb(pMuTrack->pidProbElectron());
01456 pFlowTrack->SetPionPlusMinusProb(pMuTrack->pidProbPion());
01457 pFlowTrack->SetKaonPlusMinusProb(pMuTrack->pidProbKaon());
01458 pFlowTrack->SetProtonPbarProb(pMuTrack->pidProbProton());
01459 pFlowTrack->SetProtonPbarProb(pMuTrack->pidProbProton());
01460 int mostLikelihoodPid=0;
01461 double mostLikelihoodPidProbability=0;
01462 if (pFlowTrack->ElectronPositronProb()>mostLikelihoodPidProbability) {
01463 mostLikelihoodPidProbability=pFlowTrack->ElectronPositronProb();
01464 if (pMuTrack->charge() < 0)
01465 mostLikelihoodPid=3;
01466 else
01467 mostLikelihoodPid=2;
01468 }
01469 if (pFlowTrack->PionPlusMinusProb()>mostLikelihoodPidProbability) {
01470 mostLikelihoodPidProbability=pFlowTrack->PionPlusMinusProb();
01471 if (pMuTrack->charge() < 0)
01472 mostLikelihoodPid=9;
01473 else
01474 mostLikelihoodPid=8;
01475 }
01476 if (pFlowTrack->KaonPlusMinusProb()>mostLikelihoodPidProbability) {
01477 mostLikelihoodPidProbability=pFlowTrack->KaonPlusMinusProb();
01478 if (pMuTrack->charge() < 0)
01479 mostLikelihoodPid=12;
01480 else
01481 mostLikelihoodPid=11;
01482 }
01483 if (pFlowTrack->ProtonPbarProb()>mostLikelihoodPidProbability) {
01484 mostLikelihoodPidProbability=pFlowTrack->ProtonPbarProb();
01485 if (pMuTrack->charge() < 0)
01486 mostLikelihoodPid=15;
01487 else
01488 mostLikelihoodPid=14;
01489 }
01490
01491 pFlowTrack->SetMostLikelihoodPID(mostLikelihoodPid);
01492 pFlowTrack->SetMostLikelihoodProb(mostLikelihoodPidProbability);
01493
01494 }
01495
01496 if (pMuTrack->charge() < 0) {
01497 pFlowTrack->SetPidPiMinus(pMuTrack->nSigmaPion());
01498 pFlowTrack->SetPidAntiProton(pMuTrack->nSigmaProton());
01499 pFlowTrack->SetPidKaonMinus(pMuTrack->nSigmaKaon());
01500 pFlowTrack->SetPidAntiDeuteron( 999.0 );
01501 pFlowTrack->SetPidElectron(pMuTrack->nSigmaElectron());
01502 } else {
01503 pFlowTrack->SetPidPiPlus(pMuTrack->nSigmaPion());
01504 pFlowTrack->SetPidProton(pMuTrack->nSigmaProton());
01505 pFlowTrack->SetPidKaonPlus(pMuTrack->nSigmaKaon());
01506 pFlowTrack->SetPidDeuteron( 999.0 );
01507 pFlowTrack->SetPidPositron(pMuTrack->nSigmaElectron());
01508 }
01509
01510 pFlowEvent->TrackCollection()->push_back(pFlowTrack);
01511 goodTracks++;
01512
01513 }
01514 }
01515
01516
01517 if (!StFlowCutEvent::CheckEtaSymmetry(pMuEvent)) {
01518 Int_t eventID = pMuEvent->eventId();
01519 gMessMgr->Info() << "##### FlowMaker: MuEvent " << eventID
01520 << " cut" << endm;
01521 delete pFlowEvent;
01522 pFlowEvent = NULL;
01523 return kTRUE;
01524 }
01525
01526
01527 (pFlowEvent->ProbPid()) ? pFlowEvent->SetPidsProb() :
01528 pFlowEvent->SetPidsDeviant();
01529
01530
01531 pFlowEvent->TrackCollection()->random_shuffle();
01532
01533
01534 pFlowEvent->SetSelections();
01535
01536
01537 (pFlowEvent->RanSubs()) ? pFlowEvent->MakeSubEvents() :
01538 pFlowEvent->MakeEtaSubEvents();
01539
01540 return kTRUE;
01541 }
01542
01543
01544
01545 void StFlowMaker::PrintSubeventMults() {
01546
01547
01548 if (Debug()) gMessMgr->Info() << "FlowMaker: PrintSubeventMults()" << endm;
01549
01550 int j, k, n;
01551
01552 pFlowSelect->SetSubevent(-1);
01553 for (j = 0; j < Flow::nHars; j++) {
01554 pFlowSelect->SetHarmonic(j);
01555 for (k = 0; k < Flow::nSels; k++) {
01556 pFlowSelect->SetSelection(k);
01557 cout << "j,k= " << j << k << " : " << pFlowEvent->Mult(pFlowSelect) << endl;
01558 }
01559 }
01560
01561 for (j = 0; j < Flow::nHars; j++) {
01562 pFlowSelect->SetHarmonic(j);
01563 for (k = 0; k <Flow:: nSels; k++) {
01564 pFlowSelect->SetSelection(k);
01565 for (n = 0; n < Flow::nSubs+1; n++) {
01566 pFlowSelect->SetSubevent(n);
01567 cout << "j,k,n= " << j << k << n << " : " <<
01568 pFlowEvent->Mult(pFlowSelect) << endl;
01569 }
01570 }
01571 }
01572
01573 }
01574
01575
01576
01577 Int_t StFlowMaker::InitPicoEventWrite() {
01578 if (Debug()) gMessMgr->Info() << "FlowMaker: InitPicoEventWrite()" << endm;
01579
01580 Int_t split = 99;
01581 Int_t comp = 1;
01582 Int_t bufsize = 256000;
01583 if (split) bufsize /= 16;
01584
01585
01586 pPicoEvent = new StFlowPicoEvent();
01587
01588 TString* filestring = new TString(mPicoEventDir);
01589 filestring->Append(mEventFileName);
01590 if (filestring->EndsWith(".event.root")) {
01591 int nameLength = filestring->Length();
01592 filestring->Remove(nameLength - 11);
01593 }
01594 if (filestring->EndsWith(".MuDst.root")) {
01595 int nameLength = filestring->Length();
01596 filestring->Remove(nameLength - 11);
01597 }
01598
01599 filestring->Append(".flowpicoevent.root");
01600 pPicoDST = new TFile(filestring->Data(),"RECREATE","Flow Pico DST file");
01601 if (!pPicoDST) {
01602 cout << "##### FlowMaker: Warning: no PicoEvents file = "
01603 << filestring->Data() << endl;
01604 return kStFatal;
01605 }
01606 pPicoDST->SetCompressionLevel(comp);
01607 if (Debug()) gMessMgr->Info() << "##### FlowMaker: PicoEvents file = "
01608 << filestring->Data() << endm;
01609
01610
01611 pFlowTree = new TTree("FlowTree", "Flow Pico Tree");
01612 if (!pFlowTree) {
01613 cout << "##### FlowMaker: Warning: No FlowPicoTree" << endl;
01614 return kStFatal;
01615 }
01616
01617 pFlowTree->SetAutoSave(1000000);
01618 pFlowTree->Branch("pPicoEvent", "StFlowPicoEvent", &pPicoEvent,
01619 bufsize, split);
01620
01621 delete filestring;
01622
01623 return kStOK;
01624 }
01625
01626
01627
01628 Int_t StFlowMaker::InitPicoEventRead() {
01629 if (Debug()) gMessMgr->Info() << "FlowMaker: InitPicoEventRead()" << endm;
01630
01631 pPicoEvent = new StFlowPicoEvent();
01632 pPicoChain = new TChain("FlowTree");
01633
01634 for (Int_t ilist = 0; ilist < pPicoFileList->GetNBundles(); ilist++) {
01635 pPicoFileList->GetNextBundle();
01636
01637 TFile dummyFile(pPicoFileList->GetFileName(0),"READ");
01638
01639 if (!(dummyFile.IsOpen())) {
01640 gMessMgr->Info() <<pPicoFileList->GetFileName(0)<<" open failed ! not chained"<<endm;
01641 continue;
01642 }
01643
01644 if (dummyFile.IsZombie()) {
01645 gMessMgr->Info() <<" sth. very wrong (overwritten, invalid) with "<<pPicoFileList->GetFileName(0)<<", not chained "<<endm;
01646 continue;
01647 }
01648
01649 if (dummyFile.TestBit(1024)) {
01650 gMessMgr->Info() <<" revocer procedure applied to "<<pPicoFileList->GetFileName(0)<<", maybe useful but still not chained for flow analyses"<<endm;
01651 continue;
01652 }
01653
01654 if (Debug()) gMessMgr->Info() << " doFlowEvents - input fileList = "
01655 << pPicoFileList->GetFileName(0) << endm;
01656 pPicoChain->Add(pPicoFileList->GetFileName(0));
01657 }
01658
01659 pPicoChain->SetBranchAddress("pPicoEvent", &pPicoEvent);
01660
01661 Int_t nEntries = (Int_t)pPicoChain->GetEntries();
01662 if (Debug()) gMessMgr->Info() << "##### FlowMaker: events in Pico-DST file = "
01663 << nEntries << endm;
01664
01665 mEventCounter = 0;
01666
01667 return kStOK;
01668 }
01669
01670
01671
01672
01673
01674
01675
01676
01677
01678
01679
01680
01681
01682
01683
01684
01685
01686
01687
01688
01689
01690
01691
01692
01693
01694
01695
01696
01697
01698
01699
01700
01701
01702
01703
01704
01705
01706
01707
01708
01709
01710
01711
01712
01713
01714
01715
01716
01717
01718
01719
01720
01721
01722
01723
01724
01725
01726
01727
01728
01729
01730
01731
01732
01733
01734
01735
01736
01737
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748 Int_t StFlowMaker::InitMuEventRead() {
01749
01750 if (Debug()) gMessMgr->Info() << "FlowMaker: InitMuEventRead()" << endm;
01751
01752 mEventCounter = 0;
01753
01754 return kStOK;
01755 }
01756
01757
01758
01759 Float_t StFlowMaker::CalcDcaSigned(const StThreeVectorF vertex,
01760 const StTrack* gTrack) {
01761
01762
01763
01764
01765 double xCenter = gTrack->geometry()->helix().xcenter();
01766 double yCenter = gTrack->geometry()->helix().ycenter();
01767 double radius = 1.0/gTrack->geometry()->helix().curvature();
01768
01769 double dPosCenter = ::sqrt( (vertex.x() - xCenter) * (vertex.x() - xCenter) +
01770 (vertex.y() - yCenter) * (vertex.y() - yCenter));
01771
01772 return (Float_t)(radius - dPosCenter);
01773 }
01774
01775
01776
01777 Float_t StFlowMaker::CalcDcaSigned(const StThreeVectorF vertex,
01778 const StPhysicalHelixD helix) {
01779
01780
01781
01782
01783 double xCenter = helix.xcenter();
01784 double yCenter = helix.ycenter();
01785 double radius = 1.0/helix.curvature();
01786
01787 double dPosCenter = ::sqrt( (vertex.x() - xCenter) * (vertex.x() - xCenter) +
01788 (vertex.y() - yCenter) * (vertex.y() - yCenter));
01789
01790 return (Float_t)(radius - dPosCenter);
01791 }
01792
01793
01794
01795 void StFlowMaker::FillFlowEvent(StHbtEvent* hbtEvent) {
01796
01797
01798 if (Debug()) gMessMgr->Info() << "FlowMaker: FillFlowEvent(HbtEvent)" << endm;
01799
01800
01801 if (pFlowEvent) delete pFlowEvent;
01802 pFlowEvent = NULL;
01803
01804 pFlowEvent = new StFlowEvent;
01805
01806 cout << "Inside FlowMaker::FillFlowEvent(HbtEvent)..." << endl;
01807
01808
01809 if (mFirstLastPhiWgt) pFlowEvent->SetFirstLastPhiWgt();
01810 pFlowEvent->SetPhiWeightFarEast(mPhiWgtFarEast);
01811 pFlowEvent->SetPhiWeightEast(mPhiWgtEast);
01812 pFlowEvent->SetPhiWeightWest(mPhiWgtWest);
01813 pFlowEvent->SetPhiWeightFarWest(mPhiWgtFarWest);
01814 pFlowEvent->SetPhiWeightFtpcFarEast(mPhiWgtFtpcFarEast);
01815 pFlowEvent->SetPhiWeightFtpcEast(mPhiWgtFtpcEast);
01816 pFlowEvent->SetPhiWeightFtpcWest(mPhiWgtFtpcWest);
01817 pFlowEvent->SetPhiWeightFtpcFarWest(mPhiWgtFtpcFarWest);
01818
01819
01820
01821
01822 pFlowEvent->SetVertexPos( hbtEvent->PrimVertPos() );
01823
01824 pFlowEvent->SetCTB( hbtEvent->CtbMult() );
01825 pFlowEvent->SetZDCe( hbtEvent->ZdcAdcEast() );
01826 pFlowEvent->SetZDCw( hbtEvent->ZdcAdcWest() );
01827
01828 UInt_t origMult = hbtEvent->NumberOfTracks();
01829 pFlowEvent->SetOrigMult(origMult);
01830
01831
01832 int goodTracks = 0;
01833 int goodTracksEta = 0;
01834 StHbtTrack* pParticle;
01835 StHbtTrackIterator pIter;
01836 StHbtTrackIterator startLoop = hbtEvent->TrackCollection()->begin();
01837 StHbtTrackIterator endLoop = hbtEvent->TrackCollection()->end();
01838 for (pIter=startLoop; pIter!=endLoop; pIter++){
01839 pParticle = *pIter;
01840
01841 StFlowTrack* pFlowTrack = new StFlowTrack;
01842 if (!pFlowTrack) return;
01843 double px = pParticle->P().x();
01844 double py = pParticle->P().y();
01845 double phi = atan2(py,px);
01846 if (phi<0.0) phi+=twopi;
01847 pFlowTrack->SetPhi( phi );
01848 pFlowTrack->SetPhiGlobal( phi );
01849 double pz = pParticle->P().z();
01850 double pTotal = pParticle->P().mag();
01851 double eta = 0.5*::log( (1.0+pz/pTotal)/(1.0-pz/pTotal) );
01852 pFlowTrack->SetEta( eta );
01853 pFlowTrack->SetEtaGlobal( eta );
01854 pFlowTrack->SetPt( pParticle->Pt() );
01855 pFlowTrack->SetPtGlobal( pParticle->Pt() );
01856 pFlowTrack->SetCharge( int(pParticle->Charge()) );
01857 double dcaXY = pParticle->DCAxy();
01858 double dcaZ = pParticle->DCAz();
01859 double dca = ::sqrt( dcaXY*dcaXY + dcaZ*dcaZ );
01860
01861 pFlowTrack->SetDcaGlobal( dca );
01862 pFlowTrack->SetChi2( pParticle->ChiSquaredXY() );
01863 pFlowTrack->SetFitPts( pParticle->NHits() );
01864 pFlowTrack->SetMaxPts( pParticle->NHitsPossible() );
01865 cout << "pParticle->NHits(), pParticle->NHitsPossible() in StFlowMaker::FillFlowEvent(StHbtEvent* hbtEvent) might be wrong!" << endl;
01866 cout << "(MuDst, StEvent were changed and nFitPts might be different from nHits.)" << endl;
01867 cout << "Whoever uses them, check it, please!" << endl;
01868
01869 pFlowTrack->SetPidPiPlus( pParticle->NSigmaPion() );
01870 pFlowTrack->SetPidPiMinus( pParticle->NSigmaPion() );
01871 pFlowTrack->SetPidProton( pParticle->NSigmaProton() );
01872 pFlowTrack->SetPidAntiProton( pParticle->NSigmaProton() );
01873 pFlowTrack->SetPidKaonMinus( pParticle->NSigmaKaon() );
01874 pFlowTrack->SetPidKaonPlus( pParticle->NSigmaKaon() );
01875 pFlowTrack->SetPidDeuteron( 0.0 );
01876 pFlowTrack->SetPidAntiDeuteron( 0.0 );
01877 pFlowTrack->SetPidElectron( pParticle->NSigmaElectron() );
01878 pFlowTrack->SetPidPositron( pParticle->NSigmaElectron() );
01879
01880 if ( pParticle->NSigmaKaon() > 2.0 ) {
01881 if (pParticle->Charge() > 0 ) {
01882 pFlowTrack->SetMostLikelihoodPID(14);
01883 pFlowTrack->SetMostLikelihoodProb( 0.99 );
01884 }
01885 else {
01886 pFlowTrack->SetMostLikelihoodPID(15);
01887 pFlowTrack->SetMostLikelihoodProb( 0.99 );
01888 }
01889 }
01890 if ( pParticle->NSigmaPion() > 2.0 ) {
01891 if (pParticle->Charge() > 0 ) {
01892 pFlowTrack->SetMostLikelihoodPID(11);
01893 pFlowTrack->SetMostLikelihoodProb( 0.99 );
01894 }
01895 else {
01896 pFlowTrack->SetMostLikelihoodPID(12);
01897 pFlowTrack->SetMostLikelihoodProb( 0.99 );
01898 }
01899 }
01900 if ( pParticle->NSigmaPion() < -2.0 ) {
01901 if (pParticle->Charge() < 0 ) {
01902 pFlowTrack->SetMostLikelihoodPID(3);
01903 pFlowTrack->SetMostLikelihoodProb( 0.99 );
01904 }
01905 else {
01906 pFlowTrack->SetMostLikelihoodPID(2);
01907 pFlowTrack->SetMostLikelihoodProb( 0.99 );
01908 }
01909 }
01910 pFlowTrack->SetExtrapTag(0);
01911 pFlowEvent->TrackCollection()->push_back(pFlowTrack);
01912 goodTracks++;
01913 }
01914
01915 pFlowEvent->SetMultEta(goodTracksEta);
01916 pFlowEvent->SetCentrality();
01917 pFlowEvent->TrackCollection()->random_shuffle();
01918 pFlowEvent->SetSelections();
01919 pFlowEvent->MakeSubEvents();
01920 }
01921
01922
01923
01925
01926
01927
01928
01929
01930
01931
01932
01933
01934
01935
01936
01937
01938
01939
01940
01941
01942
01943
01944
01945
01946
01947
01948
01949
01950
01951
01952
01953
01954
01955
01956
01957
01958
01959
01960
01961
01962
01963
01964
01965
01966
01967
01968
01969
01970
01971
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994
01995
01996
01997
01998
01999
02000
02001
02002
02003
02004
02005
02006
02007
02008
02009
02010
02011
02012
02013
02014
02015
02016
02017
02018
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035
02036
02037
02038
02039
02040
02041
02042
02043
02044
02045
02046
02047
02048
02049
02050
02051
02052
02053
02054
02055
02056
02057
02058
02059
02060
02061
02062
02063
02064
02065
02066
02067
02068
02069
02070
02071
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081
02082
02083
02084
02085
02086
02087
02088
02089
02090
02091
02092
02093
02094
02095
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114
02115
02116
02117
02118
02119
02120
02121
02122
02123
02124
02125
02126
02127
02128
02129
02130
02131
02132
02133
02134
02135
02136
02137
02138
02139
02140
02141
02142
02143
02144
02145
02146
02147
02148
02149
02150
02151
02152
02153
02154
02155
02156
02157
02158
02159
02160
02161
02162
02163
02164
02165
02166
02167
02168
02169
02170
02171
02172
02173
02174
02175
02176
02177
02178
02179
02180
02181
02182
02183
02184
02185
02186
02187
02188
02189
02190
02191
02192
02193
02194
02195
02196
02197
02198
02199
02200
02201
02202
02203
02204
02205
02206
02207
02208
02209