FemtoDstAnalyzer_PIDQA.C 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. /**
  2. * \brief Example of how to read a file (list of files) using StFemtoEvent classes
  3. *
  4. * RunFemtoDstAnalyzer.C is an example of reading FemtoDst format.
  5. * One can use either FemtoDst file or a list of femtoDst files (inFile.lis or
  6. * inFile.list) as an input, and preform physics analysis
  7. *
  8. * \author Grigory Nigmatkulov
  9. * \date May 29, 2018
  10. */
  11. // This is needed for calling standalone classes
  12. #define _VANILLA_ROOT_
  13. // C++ headers
  14. #include <iostream>
  15. #include <vector>
  16. #include <map>
  17. // ROOT headers
  18. #include "TROOT.h"
  19. #include "TFile.h"
  20. #include "TChain.h"
  21. #include "TVector2.h"
  22. #include "TVector3.h"
  23. #include "TTree.h"
  24. #include "TSystem.h"
  25. #include "TH1.h"
  26. #include "TF1.h"
  27. #include "TH2.h"
  28. #include "TMath.h"
  29. #include "TProfile2D.h"
  30. #include "TStopwatch.h"
  31. // FemtoDst headers
  32. #include "StFemtoDstReader.h"
  33. #include "StFemtoDst.h"
  34. #include "StFemtoEvent.h"
  35. #include "StFemtoTrack.h"
  36. // Load libraries (for ROOT_VERSTION_CODE >= 393215)
  37. #if ROOT_VERSION_CODE >= ROOT_VERSION(6, 0, 0)
  38. R__LOAD_LIBRARY(/mnt/pool/rhic/4/parfenovpeter/STAR/build/libStFemtoDst.so)
  39. #endif
  40. #include "Constants.h"
  41. // inFile - is a name of name.FemtoDst.root file or a name
  42. // of a name.lis(t) files, that contains a list of
  43. // name1.FemtoDst.root, name2.FemtoDst.root, ... files
  44. //Used functions (see them below)
  45. Bool_t isGoodEvent(StFemtoEvent *const &event);
  46. Bool_t isGoodTrack(StFemtoTrack *const &track, Float_t _energy, TVector3 pVtx);
  47. Bool_t isGoodTrackFlow(StFemtoTrack *const &track, Float_t _energy, TVector3 pVtx);
  48. Double_t GetWeight(StFemtoTrack *const &track);
  49. TVector2 CalcQvector(StFemtoTrack *const &track, Int_t _harm);
  50. Double_t AngleShift(Double_t Psi, Double_t order);
  51. Bool_t isGoodPID(StFemtoTrack *const &track);
  52. Double_t GetMeanNsig(StFemtoTrack *const &track, const Int_t PID);
  53. Double_t GetWidthM2(StFemtoTrack *const &track, const Int_t PID);
  54. Double_t GetRotAngle(StFemtoTrack *const &track);
  55. std::pair<Double_t,Double_t> GetNewXY(StFemtoTrack *const &track);
  56. Bool_t isMesonXY(Double_t x, Double_t y);
  57. Double_t GetSigmWidth(StFemtoTrack *const &track, Int_t PID);
  58. Double_t GetSigmNewX(StFemtoTrack *const &track, Int_t PID);
  59. Double_t GetSigmNewY(StFemtoTrack *const &track, Int_t PID);
  60. //_________________
  61. void FemtoDstAnalyzer_PIDQA(const Char_t *inFile = "st_physics_12150008_raw_4030001.femtoDst.root",
  62. const Char_t *outFile = "./oPIDTest.root",
  63. const Char_t *pidFile = "")
  64. {
  65. std::cout << "Hi! Lets do some physics, Master!" << std::endl;
  66. TStopwatch timer;
  67. timer.Start();
  68. #if ROOT_VERSION_CODE < ROOT_VERSION(6, 0, 0)
  69. gSystem->Load("../libStFemtoDst.so");
  70. #endif
  71. StFemtoDstReader *femtoReader = new StFemtoDstReader(inFile);
  72. femtoReader->Init();
  73. // This is a way if you want to spead up IO
  74. std::cout << "Explicit read status for some branches" << std::endl;
  75. femtoReader->SetStatus("*", 0);
  76. femtoReader->SetStatus("Event", 1);
  77. femtoReader->SetStatus("Track", 1);
  78. std::cout << "Status has been set" << std::endl;
  79. std::cout << "Now I know what to read, Master!" << std::endl;
  80. if (!femtoReader->chain())
  81. {
  82. std::cout << "No chain has been found." << std::endl;
  83. }
  84. Long64_t eventsInTree = femtoReader->tree()->GetEntries();
  85. std::cout << "eventsInTree: " << eventsInTree << std::endl;
  86. Long64_t events2read = femtoReader->chain()->GetEntries();
  87. std::cout << "Number of events to read: " << events2read << std::endl;
  88. //Read PID fit parameters
  89. TFile *fiPID = new TFile(pidFile, "read");
  90. fiPID->cd();
  91. TF1 *sigMsqrPion = (TF1 *)fiPID->Get("polPion");
  92. TF1 *sigMsqrKaon = (TF1 *)fiPID->Get("polKaon");
  93. TF1 *sigMsqrProton = (TF1 *)fiPID->Get("polProton");
  94. const int NptBins = 18;
  95. const double ptBin [NptBins+1] = {0.2,0.4,0.6,0.8,1.,1.2,1.4,1.6,1.8,2.,2.2,2.4,2.6,2.8,3.,3.2,3.4,3.6,3.8};
  96. TH2F *hNsigPionMSqr[NptBins];
  97. TH2F *hNsigKaonMSqr[NptBins];
  98. TH2F *hNsigProtonMSqr[NptBins];
  99. TH2F *hNsigPionMSqrAfter[NptBins];
  100. TH2F *hNsigKaonMSqrAfter[NptBins];
  101. TH2F *hNsigProtonMSqrAfter[NptBins];
  102. TH1F *hPionMSqrAfter[NptBins];
  103. TH1F *hKaonMSqrAfter[NptBins];
  104. TH1F *hProtonMSqrAfter[NptBins];
  105. //Initialization
  106. for (int i = 0; i < NptBins; i++)
  107. {
  108. hNsigPionMSqr[i] = new TH2F(Form("hNsigPionMSqr%i", i), Form("n#sigma_{#pi} vs M^{2} for %.2f < p_{T} < %.2f GeV/c;n#sigma_{#pi};m^{2} [GeV/c^{2}]^{2}", ptBin[i], ptBin[i + 1]), 1400, -35., 35., 1400, -2., 5.);
  109. hNsigKaonMSqr[i] = new TH2F(Form("hNsigKaonMSqr%i", i), Form("n#sigma_{K} vs M^{2} for %.2f < p_{T} < %.2f GeV/c;n#sigma_{K};m^{2} [GeV/c^{2}]^{2}", ptBin[i], ptBin[i + 1]), 1400, -35., 35., 1400, -2., 5.);
  110. hNsigProtonMSqr[i] = new TH2F(Form("hNsigProtonMSqr%i", i), Form("n#sigma_{p} vs M^{2} for %.2f < p_{T} < %.2f GeV/c;n#sigma_{p};m^{2} [GeV/c^{2}]^{2}", ptBin[i], ptBin[i + 1]), 1400, -35., 35., 1400, -2., 5.);
  111. hNsigPionMSqrAfter[i] = new TH2F(Form("hNsigPionMSqrAfter%i", i), Form("n#sigma_{#pi} vs M^{2} for %.2f < p_{T} < %.2f GeV/c;n#sigma_{#pi};m^{2} [GeV/c^{2}]^{2}", ptBin[i], ptBin[i + 1]), 1400, -35.,35., 1400, -2., 5.);
  112. hNsigKaonMSqrAfter[i] = new TH2F(Form("hNsigKaonMSqrAfter%i", i), Form("n#sigma_{K} vs M^{2} for %.2f < p_{T} < %.2f GeV/c;n#sigma_{K};m^{2} [GeV/c^{2}]^{2}", ptBin[i], ptBin[i + 1]), 1400, -35., 35., 1400, -2., 5.);
  113. hNsigProtonMSqrAfter[i] = new TH2F(Form("hNsigProtonMSqrAfter%i", i), Form("n#sigma_{p} vs M^{2} for %.2f < p_{T} < %.2f GeV/c;n#sigma_{p};m^{2} [GeV/c^{2}]^{2}", ptBin[i], ptBin[i + 1]), 1400, -35., 35., 1400, -2., 5.);
  114. hPionMSqrAfter[i] = new TH1F(Form("hPionMSqrAfter%i", i), Form("M^{2} for %.2f < p_{T} < %.2f GeV/c;m^{2} [GeV/c^{2}]^{2};N_{counts}", ptBin[i], ptBin[i + 1]), 1400, -2., 5.);
  115. hKaonMSqrAfter[i] = new TH1F(Form("hKaonMSqrAfter%i", i), Form("M^{2} for %.2f < p_{T} < %.2f GeV/c;m^{2} [GeV/c^{2}]^{2};N_{counts}", ptBin[i], ptBin[i + 1]), 1400, -2., 5.);
  116. hProtonMSqrAfter[i] = new TH1F(Form("hProtonMSqrAfter%i", i), Form("M^{2} for %.2f < p_{T} < %.2f GeV/c;m^{2} [GeV/c^{2}]^{2};N_{counts}", ptBin[i], ptBin[i + 1]), 1400, -2., 5.);
  117. }
  118. int i_part=-1;
  119. std::pair<Double_t, Double_t> XY_pid;
  120. // Loop over events
  121. for (Long64_t iEvent = 0; iEvent < events2read; iEvent++)
  122. {
  123. if ((iEvent + 1) % 1000 == 0)
  124. {
  125. std::cout << "Working on event #[" << (iEvent + 1)
  126. << "/" << events2read << "]" << std::endl;
  127. }
  128. Bool_t readEvent = femtoReader->readFemtoEvent(iEvent);
  129. if (!readEvent)
  130. {
  131. std::cout << "Something went wrong, Master! Nothing to analyze..." << std::endl;
  132. break;
  133. }
  134. // Retrieve femtoDst
  135. StFemtoDst *dst = femtoReader->femtoDst();
  136. // Retrieve event information
  137. StFemtoEvent *event = dst->event();
  138. if (!event)
  139. {
  140. std::cout << "Something went wrong, Master! Event is hiding from me..." << std::endl;
  141. break;
  142. }
  143. TVector3 pVtx = event->primaryVertex();
  144. // Event selection
  145. if (!isGoodEvent(event))
  146. continue;
  147. // Track analysis
  148. Int_t nTracks = dst->numberOfTracks();
  149. // Track loop
  150. for (Int_t iTrk = 0; iTrk < nTracks; iTrk++)
  151. {
  152. // Retrieve i-th femto track
  153. StFemtoTrack *femtoTrack = dst->track(iTrk);
  154. if (!femtoTrack)
  155. continue;
  156. // Must be a primary track
  157. if (!femtoTrack->isPrimary())
  158. continue;
  159. //Track selection
  160. if (!isGoodTrackFlow(femtoTrack, energy, pVtx))
  161. continue;
  162. // Determine pt bin for PID plots
  163. int i_pt = -1;
  164. for (int i = 0; i < NptBins; i++)
  165. {
  166. if (femtoTrack->pt() >= (ptBin[i] + cutPtMin.at(energy)) && femtoTrack->pt() < (ptBin[i + 1] + cutPtMin.at(energy)))
  167. {
  168. i_pt = i;
  169. }
  170. }
  171. if (i_pt == -1)
  172. continue;
  173. if (femtoTrack->gDCA(pVtx).Mag() >= 1.)
  174. continue;
  175. if (!femtoTrack->isTofTrack())
  176. {
  177. i_part = -1;
  178. //pion id
  179. if (femtoTrack->ptot() >= 0.2 && femtoTrack->ptot() < 0.6 &&
  180. TMath::Abs(femtoTrack->nSigmaPion()) < 2)
  181. {
  182. i_part = 0;
  183. }
  184. // kaon id
  185. if (femtoTrack->ptot() >= 0.2 && femtoTrack->ptot() < 0.5 &&
  186. TMath::Abs(femtoTrack->nSigmaKaon()) < 2)
  187. {
  188. i_part = 1;
  189. }
  190. // proton id
  191. if (femtoTrack->ptot() >= 0.4 && femtoTrack->ptot() < 0.9 &&
  192. TMath::Abs(femtoTrack->nSigmaProton()) < 2)
  193. {
  194. i_part = 2;
  195. }
  196. //pion id
  197. if (femtoTrack->ptot() >= 0.6 && femtoTrack->ptot() < 0.7 &&
  198. TMath::Abs(femtoTrack->nSigmaPion()) < 2 &&
  199. TMath::Abs(femtoTrack->nSigmaKaon()) > 2)
  200. {
  201. i_part = 0;
  202. }
  203. // kaon id
  204. if (femtoTrack->ptot() >= 0.5 && femtoTrack->ptot() < 0.7 &&
  205. TMath::Abs(femtoTrack->nSigmaKaon()) < 2 &&
  206. TMath::Abs(femtoTrack->nSigmaPion()) > 3)
  207. {
  208. i_part = 1;
  209. }
  210. // proton id
  211. if (femtoTrack->ptot() >= 0.9 && femtoTrack->ptot() < 1.2 &&
  212. TMath::Abs(femtoTrack->nSigmaProton()) < 2 &&
  213. TMath::Abs(femtoTrack->nSigmaPion()) > 3)
  214. {
  215. i_part = 2;
  216. }
  217. }
  218. // Check if track has TOF signal
  219. if (femtoTrack->isTofTrack())
  220. {
  221. hNsigPionMSqr[i_pt]->Fill(femtoTrack->nSigmaPion(), femtoTrack->massSqr());
  222. hNsigKaonMSqr[i_pt]->Fill(femtoTrack->nSigmaKaon(), femtoTrack->massSqr());
  223. hNsigProtonMSqr[i_pt]->Fill(femtoTrack->nSigmaProton(), femtoTrack->massSqr());
  224. i_part = -1;
  225. /*
  226. XY_pid = GetNewXY(femtoTrack);
  227. if (isMesonXY(XY_pid.first, XY_pid.second))
  228. {
  229. if ( TMath::Power(XY_pid.first / (2*GetSigmNewX(femtoTrack,0)),2) + TMath::Power(XY_pid.second / (2*GetSigmNewY(femtoTrack,0)),2) < 1. &&
  230. TMath::Power((XY_pid.first - 0.23) / (1*GetSigmNewX(femtoTrack,1)),2) + TMath::Power(XY_pid.second / (1*GetSigmNewY(femtoTrack,1)),2) > 1. )
  231. {
  232. i_part = 0;
  233. }
  234. if ( TMath::Power((XY_pid.first - 0.23) / (2*GetSigmNewX(femtoTrack,1)),2) + TMath::Power(XY_pid.second / (2*GetSigmNewY(femtoTrack,1)),2) < 1. &&
  235. TMath::Power(XY_pid.first / (2*GetSigmNewX(femtoTrack,0)),2) + TMath::Power(XY_pid.second / (2*GetSigmNewY(femtoTrack,0)),2) > 1. )
  236. {
  237. i_part = 1;
  238. }
  239. }
  240. else
  241. {
  242. i_part = 2;
  243. }
  244. */
  245. //TPC-only
  246. //TPC+TOF
  247. if (isGoodPID(femtoTrack))
  248. {
  249. // pion id - asymmetry cut
  250. if (femtoTrack->ptot() >= 0.2 && femtoTrack->ptot() < 3.4 &&
  251. TMath::Abs(femtoTrack->nSigmaPion()) < 3 &&
  252. femtoTrack->massSqr() >= -0.15 && femtoTrack->massSqr() < 0.1)// &&
  253. /*
  254. TMath::Abs(femtoTrack->massSqr() - pionMassSqr) < 2*GetSigmWidth(femtoTrack,0) &&
  255. TMath::Abs(femtoTrack->massSqr() - kaonMassSqr) > 2*GetSigmWidth(femtoTrack,1) &&
  256. TMath::Abs(femtoTrack->massSqr() - protMassSqr) > 2*GetSigmWidth(femtoTrack,2) )
  257. */
  258. /*
  259. femtoTrack->massSqr() > pionMassSqr - 2.*sigMsqrPion->Eval(femtoTrack->pt()) &&
  260. femtoTrack->massSqr() < pionMassSqr + 2.*sigMsqrPion->Eval(femtoTrack->pt()) &&
  261. (femtoTrack->massSqr() < kaonMassSqr - 2.*sigMsqrKaon->Eval(femtoTrack->pt()) ||
  262. femtoTrack->massSqr() > kaonMassSqr + 2.*sigMsqrKaon->Eval(femtoTrack->pt())) &&
  263. (femtoTrack->massSqr() < protMassSqr - 2.*sigMsqrProton->Eval(femtoTrack->pt()) ||
  264. femtoTrack->massSqr() > protMassSqr + 2.*sigMsqrProton->Eval(femtoTrack->pt())) )
  265. */
  266. {
  267. i_part = 0;
  268. }
  269. // kaon id - asymmetry cut
  270. if (femtoTrack->pt() >= 0.2 && femtoTrack->ptot() < 3.4 &&
  271. TMath::Abs(femtoTrack->nSigmaKaon()) < 3 &&
  272. femtoTrack->massSqr() >= 0.2 && femtoTrack->massSqr() < 0.32)// &&
  273. /*
  274. TMath::Abs(femtoTrack->massSqr() - pionMassSqr) > 2.5*GetSigmWidth(femtoTrack,0) &&
  275. TMath::Abs(femtoTrack->massSqr() - kaonMassSqr) < 2*GetSigmWidth(femtoTrack,1) &&
  276. TMath::Abs(femtoTrack->massSqr() - protMassSqr) > 2*GetSigmWidth(femtoTrack,2) )
  277. */
  278. /*
  279. femtoTrack->massSqr() > kaonMassSqr - 2.*sigMsqrKaon->Eval(femtoTrack->pt()) &&
  280. femtoTrack->massSqr() < kaonMassSqr + 2.*sigMsqrKaon->Eval(femtoTrack->pt()) &&
  281. (femtoTrack->massSqr() < pionMassSqr - 2.5*sigMsqrPion->Eval(femtoTrack->pt()) ||
  282. femtoTrack->massSqr() > pionMassSqr + 2.5*sigMsqrPion->Eval(femtoTrack->pt())) &&
  283. (femtoTrack->massSqr() < protMassSqr - 2.*sigMsqrProton->Eval(femtoTrack->pt()) ||
  284. femtoTrack->massSqr() > protMassSqr + 2.*sigMsqrProton->Eval(femtoTrack->pt())) )
  285. */
  286. {
  287. i_part = 1;
  288. }
  289. // proton id
  290. if (femtoTrack->ptot() >= 0.4 && femtoTrack->ptot() < 3.4 &&
  291. TMath::Abs(femtoTrack->nSigmaProton()) < 3 &&
  292. femtoTrack->massSqr() >= 0.75 && femtoTrack->massSqr() < 1.2)// &&
  293. /*
  294. TMath::Abs(femtoTrack->massSqr() - pionMassSqr) > 2*GetSigmWidth(femtoTrack,0) &&
  295. TMath::Abs(femtoTrack->massSqr() - kaonMassSqr) > 2*GetSigmWidth(femtoTrack,1) &&
  296. TMath::Abs(femtoTrack->massSqr() - protMassSqr) < 2*GetSigmWidth(femtoTrack,2) )
  297. */
  298. /*
  299. femtoTrack->massSqr() > protMassSqr - 2.*sigMsqrProton->Eval(femtoTrack->pt()) &&
  300. femtoTrack->massSqr() < protMassSqr + 2.*sigMsqrProton->Eval(femtoTrack->pt()) &&
  301. (femtoTrack->massSqr() < pionMassSqr - 2.*sigMsqrPion->Eval(femtoTrack->pt()) ||
  302. femtoTrack->massSqr() > pionMassSqr + 2.*sigMsqrPion->Eval(femtoTrack->pt())) &&
  303. (femtoTrack->massSqr() < kaonMassSqr - 2.*sigMsqrKaon->Eval(femtoTrack->pt()) ||
  304. femtoTrack->massSqr() > kaonMassSqr + 2.*sigMsqrKaon->Eval(femtoTrack->pt())) )
  305. */
  306. {
  307. i_part = 2;
  308. }
  309. }
  310. if (i_part == -1) continue;
  311. if (i_part == 0)
  312. {
  313. hNsigPionMSqrAfter[i_pt]->Fill(femtoTrack->nSigmaPion(),femtoTrack->massSqr());
  314. hPionMSqrAfter[i_pt]->Fill(femtoTrack->massSqr());
  315. }
  316. if (i_part == 1)
  317. {
  318. hNsigKaonMSqrAfter[i_pt]->Fill(femtoTrack->nSigmaKaon(),femtoTrack->massSqr());
  319. hKaonMSqrAfter[i_pt]->Fill(femtoTrack->massSqr());
  320. }
  321. if (i_part == 2)
  322. {
  323. hNsigProtonMSqrAfter[i_pt]->Fill(femtoTrack->nSigmaProton(),femtoTrack->massSqr());
  324. hProtonMSqrAfter[i_pt]->Fill(femtoTrack->massSqr());
  325. }
  326. } //if( isTofTrack() )
  327. } //for(Int_t iTrk=0; iTrk<nTracks; iTrk++)
  328. } //for(Long64_t iEvent=0; iEvent<events2read; iEvent++)
  329. femtoReader->Finish();
  330. TFile *output = new TFile(outFile, "recreate");
  331. for (int i = 0; i < NptBins; i++)
  332. {
  333. hNsigPionMSqr[i]->Write();
  334. hNsigKaonMSqr[i]->Write();
  335. hNsigProtonMSqr[i]->Write();
  336. }
  337. for (int i = 0; i < NptBins; i++)
  338. {
  339. hNsigPionMSqrAfter[i]->Write();
  340. hNsigKaonMSqrAfter[i]->Write();
  341. hNsigProtonMSqrAfter[i]->Write();
  342. }
  343. for (int i = 0; i < NptBins; i++)
  344. {
  345. hPionMSqrAfter[i]->Write();
  346. hKaonMSqrAfter[i]->Write();
  347. hProtonMSqrAfter[i]->Write();
  348. }
  349. output->Close();
  350. std::cout << "I'm done with analysis. We'll have a Nobel Prize, Master!"
  351. << std::endl;
  352. timer.Stop();
  353. timer.Print();
  354. }
  355. Bool_t isGoodEvent(StFemtoEvent *const &event)
  356. {
  357. if (!event)
  358. return false;
  359. if (event == nullptr)
  360. return false;
  361. if (event->primaryVertex().Perp() > cutVtxR)
  362. return false;
  363. if (TMath::Abs(event->primaryVertex().Z()) > cutVtxZEnergy.at(energy))
  364. return false;
  365. if ((energy == 200.) && TMath::Abs(event->primaryVertex().Z() - event->vpdVz()) > cutVpdVz)
  366. return false;
  367. return true;
  368. }
  369. Bool_t isGoodTrack(StFemtoTrack *const &track, Float_t _energy, TVector3 pVtx)
  370. {
  371. if (!track)
  372. return false;
  373. // if (!track->isPrimary()) return false;
  374. if (track->nHitsFit() < cutNhits)
  375. return false;
  376. if (track->nHitsPoss() <= cutNhitsPoss)
  377. return false;
  378. if ((Double_t)track->nHitsFit() / track->nHitsPoss() < cutNhitsRatio)
  379. return false;
  380. if (TMath::Abs(track->eta()) >= cutEta)
  381. return false;
  382. if (track->pt() <= cutPtMin.at(_energy))
  383. return false;
  384. if (track->pt() > cutPtMax)
  385. return false;
  386. if (track->ptot() > cutPMax)
  387. return false;
  388. if (track->gDCA(pVtx).Mag() >= cutDCA.at(_energy))
  389. return false;
  390. return true;
  391. }
  392. Bool_t isGoodTrackFlow(StFemtoTrack *const &track, Float_t _energy, TVector3 pVtx)
  393. {
  394. if (!track)
  395. return false;
  396. // if (!track->isPrimary()) return false;
  397. if (track->nHitsFit() < cutNhits)
  398. return false;
  399. if (track->nHitsPoss() <= cutNhitsPoss)
  400. return false;
  401. if ((Double_t)track->nHitsFit() / track->nHitsPoss() < cutNhitsRatio)
  402. return false;
  403. if (TMath::Abs(track->eta()) >= cutEta)
  404. return false;
  405. if (track->pt() <= cutPtMin.at(_energy))
  406. return false;
  407. //if (track->pt() > cutPtMax) return false;
  408. if (track->ptot() > cutPMax)
  409. return false;
  410. if (track->gDCA(pVtx).Mag() >= cutDCA.at(_energy))
  411. return false;
  412. return true;
  413. }
  414. Double_t GetWeight(StFemtoTrack *const &track)
  415. {
  416. Double_t weight;
  417. if (track->pt() <= cutPtWeightEP)
  418. {
  419. weight = track->pt();
  420. }
  421. else
  422. {
  423. weight = cutPtWeightEP;
  424. }
  425. return weight;
  426. }
  427. TVector2 CalcQvector(StFemtoTrack *const &track, Int_t _harm)
  428. {
  429. TVector2 qv(0., 0.);
  430. qv.Set(TMath::Cos(_harm * track->phi()), TMath::Sin(_harm * track->phi()));
  431. return qv;
  432. }
  433. Double_t AngleShift(Double_t Psi, Double_t order)
  434. {
  435. Double_t PsiCorr = Psi;
  436. if (PsiCorr > TMath::Pi() / order)
  437. {
  438. PsiCorr = Psi - 2. * TMath::Pi() / order;
  439. }
  440. if (PsiCorr < -1. * TMath::Pi() / order)
  441. {
  442. PsiCorr = Psi + 2. * TMath::Pi() / order;
  443. }
  444. return PsiCorr;
  445. }
  446. Bool_t isGoodPID(StFemtoTrack *const &track)
  447. {
  448. if (!track->isTofTrack()) return false;
  449. if (track->massSqr() < cutMass2Min) return false;
  450. //NhitsDedx cut applied in StFemtoDst?
  451. // ToFYLocal cut applied in StFemtoDst?
  452. return true;
  453. }
  454. Double_t GetSigmWidth(StFemtoTrack *const &track, Int_t PID)
  455. {
  456. Double_t pol0, pol1, pol2, pol3;
  457. Double_t pt = track->pt();
  458. if (PID != 0 && PID != 1 && PID != 2) return 0.;
  459. if (PID == 0) // pion
  460. {
  461. pol0 = -0.036277878;
  462. pol1 = 0.10230040;
  463. pol2 = -0.069674611;
  464. pol3 = 0.020434016;
  465. }
  466. if (PID == 1) // kaon
  467. {
  468. pol0 = 0.011004116;
  469. pol1 = -0.022878517;
  470. pol2 = 0.038562140;
  471. pol3 = -0.0060050387;
  472. }
  473. if (PID == 2) // proton
  474. {
  475. pol0 = 0.035215709;
  476. pol1 = -0.038627269;
  477. pol2 = 0.046936935;
  478. pol3 = -0.0063598115;
  479. }
  480. return ( pol0 + pol1*pt + pol2*pt*pt + pol3*pt*pt*pt );
  481. }
  482. Double_t GetSigmNewX(StFemtoTrack *const &track, Int_t PID)
  483. {
  484. if (PID != 0 && PID != 1 && PID != 2) return 0.;
  485. Double_t pol0, pol1, pol2, pol3;
  486. Double_t pt = track->pt();
  487. if (PID == 0) // pion
  488. {
  489. pol0 = 0.00061920122;
  490. pol1 = 0.00064431355;
  491. pol2 = 0.013672155;
  492. pol3 = 0.0012772833;
  493. }
  494. if (PID == 1) // kaon
  495. {
  496. pol0 = 0.0057203659;
  497. pol1 = 0.0013767144;
  498. pol2 = 0.0063761902;
  499. pol3 = 0.0073111853;
  500. }
  501. return ( pol0 + pol1*pt + pol2*pt*pt + pol3*pt*pt*pt );
  502. }
  503. Double_t GetSigmNewY(StFemtoTrack *const &track, Int_t PID)
  504. {
  505. if (PID != 0 && PID != 1 && PID != 2) return 0.;
  506. Double_t pol0, pol1, pol2, pol3;
  507. Double_t pt = track->pt();
  508. if (PID == 0) // pion
  509. {
  510. pol0 = 0.0017345792;
  511. pol1 = -0.0059824003;
  512. pol2 = 0.029537517;
  513. pol3 = -0.0037990834;
  514. }
  515. if (PID == 1) // kaon
  516. {
  517. pol0 = 0.0041058086;
  518. pol1 = -0.0041708451;
  519. pol2 = 0.026109827;
  520. pol3 = -0.0018772891;
  521. }
  522. return ( pol0 + pol1*pt + pol2*pt*pt + pol3*pt*pt*pt );
  523. }
  524. Double_t GetMeanNsig(StFemtoTrack *const &track, const Int_t PID)
  525. {
  526. Double_t pt, par0, par1, par2, par3;
  527. if (PID == 0) return 0.;
  528. if (PID == 1)
  529. {
  530. par0 = 5.84263e+00;
  531. par1 = -6.65912e+00;
  532. par2 = 8.32204e-01;
  533. par3 = 8.28440e-01;
  534. }
  535. if (PID == 2)
  536. {
  537. par0 = 1.09685e+01;
  538. par1 = -8.61499e+00;
  539. par2 = 8.92938e-01;
  540. par3 = 8.08397e-01;
  541. }
  542. pt = track->pt();
  543. if (pt != 0)
  544. {
  545. return (par0*TMath::Power(1./pt,par2) + par1 + par3*pt);
  546. }
  547. else
  548. {
  549. return 0.;
  550. }
  551. }
  552. Double_t GetWidthM2(StFemtoTrack *const &track, const Int_t PID)
  553. {
  554. Double_t pt, pol0, pol1, pol2;
  555. if (PID != 0) return 0.;
  556. pol0 = 8.74975e-04;
  557. pol1 = -1.62659e-03;
  558. pol2 = 2.89828e-02;
  559. pt = track->pt();
  560. return (pol0 + pol1*pt + pol2*pt*pt);
  561. }
  562. Double_t GetScaleFactor(StFemtoTrack *const &track)
  563. {
  564. Double_t wM2pion = GetWidthM2(track,0);
  565. Double_t exScale = 1./0.8273; // = 1. for BES energies
  566. if (wM2pion == 0) return 1.;
  567. else return (exScale/wM2pion);
  568. }
  569. Double_t GetRotAngle(StFemtoTrack *const &track)
  570. {
  571. Double_t scaleFactor = GetScaleFactor(track);
  572. Double_t MeanKaonNsig = GetMeanNsig(track,1);
  573. Double_t new_x = (MeanKaonNsig - 0.)/scaleFactor;
  574. Double_t new_y = (kaonMassSqr - pionMassSqr);
  575. return ( -TMath::ATan2(new_y,new_x) );
  576. }
  577. std::pair<Double_t,Double_t> GetNewXY(StFemtoTrack *const &track)
  578. {
  579. std::pair<Double_t,Double_t> coord;
  580. Double_t scaleFactor = GetScaleFactor(track);
  581. Double_t new_x = (track->nSigmaPion() - 0.)/scaleFactor;
  582. Double_t new_y = (track->massSqr() - pionMassSqr);
  583. Double_t rotAngle = GetRotAngle(track);
  584. coord.first = new_x * TMath::Cos(rotAngle) - new_y * TMath::Sin(rotAngle);
  585. coord.second = new_x * TMath::Sin(rotAngle) + new_y * TMath::Cos(rotAngle);
  586. return coord;
  587. }
  588. Bool_t isMesonXY(Double_t x, Double_t y)
  589. // Used to exclude proton peak from new XY coord distribution
  590. {
  591. Double_t pol0, pol1;
  592. pol0 = -0.92857143;
  593. pol1 = 1.4285714;
  594. // Not a proton
  595. if (y > (pol0 + pol1*x)) return true;
  596. // Proton
  597. if (y <= (pol0 + pol1*x)) return false;
  598. // just in case...
  599. return false;
  600. }