FemtoDstAnalyzer_ReCentering.C 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  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 "TH2.h"
  27. #include "TMath.h"
  28. #include "TProfile2D.h"
  29. #include "TStopwatch.h"
  30. // FemtoDst headers
  31. #include "StFemtoDstReader.h"
  32. #include "StFemtoDst.h"
  33. #include "StFemtoEvent.h"
  34. #include "StFemtoTrack.h"
  35. // Load libraries (for ROOT_VERSTION_CODE >= 393215)
  36. #if ROOT_VERSION_CODE >= ROOT_VERSION(6, 0, 0)
  37. R__LOAD_LIBRARY(/mnt/pool/rhic/4/parfenovpeter/STAR/build/libStFemtoDst.so)
  38. #endif
  39. #include "Constants.h"
  40. // inFile - is a name of name.FemtoDst.root file or a name
  41. // of a name.lis(t) files, that contains a list of
  42. // name1.FemtoDst.root, name2.FemtoDst.root, ... files
  43. //Used functions (see them below)
  44. Bool_t isGoodEvent(StFemtoEvent *const &event);
  45. Bool_t isGoodTrack(StFemtoTrack *const &track, Float_t _energy, TVector3 pVtx);
  46. Double_t GetWeight(StFemtoTrack *const &track);
  47. TVector2 CalcQvector(StFemtoTrack *const &track, Int_t _harm);
  48. Int_t GetVzBin(Double_t vtxZ);
  49. //_________________
  50. void FemtoDstAnalyzer_ReCentering(const Char_t *inFile = "st_physics_12150008_raw_4030001.femtoDst.root",
  51. const Char_t *outFile = "./oReCenteringTest.root")
  52. {
  53. std::cout << "Hi! Lets do some physics, Master!" << std::endl;
  54. TStopwatch timer;
  55. timer.Start();
  56. #if ROOT_VERSION_CODE < ROOT_VERSION(6, 0, 0)
  57. gSystem->Load("../libStFemtoDst.so");
  58. #endif
  59. StFemtoDstReader *femtoReader = new StFemtoDstReader(inFile);
  60. femtoReader->Init();
  61. // This is a way if you want to spead up IO
  62. std::cout << "Explicit read status for some branches" << std::endl;
  63. femtoReader->SetStatus("*", 0);
  64. femtoReader->SetStatus("Event", 1);
  65. femtoReader->SetStatus("Track", 1);
  66. std::cout << "Status has been set" << std::endl;
  67. std::cout << "Now I know what to read, Master!" << std::endl;
  68. if (!femtoReader->chain())
  69. {
  70. std::cout << "No chain has been found." << std::endl;
  71. }
  72. Long64_t eventsInTree = femtoReader->tree()->GetEntries();
  73. std::cout << "eventsInTree: " << eventsInTree << std::endl;
  74. Long64_t events2read = femtoReader->chain()->GetEntries();
  75. std::cout << "Number of events to read: " << events2read << std::endl;
  76. //Manage ReCentering output
  77. TProfile2D *p_Qx_FULL_EP[fNharmonics][fArraySize];
  78. TProfile2D *p_Qy_FULL_EP[fNharmonics][fArraySize];
  79. TProfile2D *p_Qx_FULL_SP[fNharmonics][fArraySize];
  80. TProfile2D *p_Qy_FULL_SP[fNharmonics][fArraySize];
  81. TProfile2D *p_Qx_EAST_EP[fNharmonics][fArraySize][NEtaGaps];
  82. TProfile2D *p_Qy_EAST_EP[fNharmonics][fArraySize][NEtaGaps];
  83. TProfile2D *p_Qx_EAST_SP[fNharmonics][fArraySize][NEtaGaps];
  84. TProfile2D *p_Qy_EAST_SP[fNharmonics][fArraySize][NEtaGaps];
  85. TProfile2D *p_Qx_WEST_EP[fNharmonics][fArraySize][NEtaGaps];
  86. TProfile2D *p_Qy_WEST_EP[fNharmonics][fArraySize][NEtaGaps];
  87. TProfile2D *p_Qx_WEST_SP[fNharmonics][fArraySize][NEtaGaps];
  88. TProfile2D *p_Qy_WEST_SP[fNharmonics][fArraySize][NEtaGaps];
  89. for (int iHarm=0; iHarm<fNharmonics; iHarm++)
  90. {
  91. for (int iVtx=0; iVtx<fArraySize; iVtx++)
  92. {
  93. p_Qx_FULL_EP[iHarm][iVtx] = new TProfile2D(Form("p_Q%ix_FULL_EP%i",iHarm,iVtx),Form("p_Q%ix_FULL_EP%i",iHarm,iVtx),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  94. p_Qy_FULL_EP[iHarm][iVtx] = new TProfile2D(Form("p_Q%iy_FULL_EP%i",iHarm,iVtx),Form("p_Q%iy_FULL_EP%i",iHarm,iVtx),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  95. p_Qx_FULL_SP[iHarm][iVtx] = new TProfile2D(Form("p_Q%ix_FULL_SP%i",iHarm,iVtx),Form("p_Q%ix_FULL_SP%i",iHarm,iVtx),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  96. p_Qy_FULL_SP[iHarm][iVtx] = new TProfile2D(Form("p_Q%iy_FULL_SP%i",iHarm,iVtx),Form("p_Q%iy_FULL_SP%i",iHarm,iVtx),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  97. for (int iEtaGap=0; iEtaGap<NEtaGaps; iEtaGap++)
  98. {
  99. p_Qx_EAST_EP[iHarm][iVtx][iEtaGap] = new TProfile2D(Form("p_Q%ix_EAST_EP%i_gap%i",iHarm,iVtx,iEtaGap),Form("p_Q%ix_EAST_EP%i_gap%i",iHarm,iVtx,iEtaGap),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  100. p_Qy_EAST_EP[iHarm][iVtx][iEtaGap] = new TProfile2D(Form("p_Q%iy_EAST_EP%i_gap%i",iHarm,iVtx,iEtaGap),Form("p_Q%iy_EAST_EP%i_gap%i",iHarm,iVtx,iEtaGap),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  101. p_Qx_EAST_SP[iHarm][iVtx][iEtaGap] = new TProfile2D(Form("p_Q%ix_EAST_SP%i_gap%i",iHarm,iVtx,iEtaGap),Form("p_Q%ix_EAST_SP%i_gap%i",iHarm,iVtx,iEtaGap),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  102. p_Qy_EAST_SP[iHarm][iVtx][iEtaGap] = new TProfile2D(Form("p_Q%iy_EAST_SP%i_gap%i",iHarm,iVtx,iEtaGap),Form("p_Q%iy_EAST_SP%i_gap%i",iHarm,iVtx,iEtaGap),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  103. p_Qx_WEST_EP[iHarm][iVtx][iEtaGap] = new TProfile2D(Form("p_Q%ix_WEST_EP%i_gap%i",iHarm,iVtx,iEtaGap),Form("p_Q%ix_WEST_EP%i_gap%i",iHarm,iVtx,iEtaGap),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  104. p_Qy_WEST_EP[iHarm][iVtx][iEtaGap] = new TProfile2D(Form("p_Q%iy_WEST_EP%i_gap%i",iHarm,iVtx,iEtaGap),Form("p_Q%iy_WEST_EP%i_gap%i",iHarm,iVtx,iEtaGap),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  105. p_Qx_WEST_SP[iHarm][iVtx][iEtaGap] = new TProfile2D(Form("p_Q%ix_WEST_SP%i_gap%i",iHarm,iVtx,iEtaGap),Form("p_Q%ix_WEST_SP%i_gap%i",iHarm,iVtx,iEtaGap),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  106. p_Qy_WEST_SP[iHarm][iVtx][iEtaGap] = new TProfile2D(Form("p_Q%iy_WEST_SP%i_gap%i",iHarm,iVtx,iEtaGap),Form("p_Q%iy_WEST_SP%i_gap%i",iHarm,iVtx,iEtaGap),fNBins,runId_min-0.5,runId_max+0.5,16,-0.5,15.5);
  107. }
  108. }
  109. }
  110. //Q-vectors
  111. TVector2 QvTMP;
  112. Double_t weight;
  113. Int_t VtxSign;
  114. Long64_t goodEventCounter = 0;
  115. // Loop over events
  116. for (Long64_t iEvent = 0; iEvent < events2read; iEvent++)
  117. {
  118. if ((iEvent+1) % 1000 == 0){
  119. std::cout << "Working on event #[" << (iEvent + 1)
  120. << "/" << events2read << "]" << std::endl;
  121. }
  122. Bool_t readEvent = femtoReader->readFemtoEvent(iEvent);
  123. if (!readEvent)
  124. {
  125. std::cout << "Something went wrong, Master! Nothing to analyze..." << std::endl;
  126. break;
  127. }
  128. // Retrieve femtoDst
  129. StFemtoDst *dst = femtoReader->femtoDst();
  130. // Retrieve event information
  131. StFemtoEvent *event = dst->event();
  132. if (!event)
  133. {
  134. std::cout << "Something went wrong, Master! Event is hiding from me..." << std::endl;
  135. break;
  136. }
  137. // Event selection
  138. if ( !isGoodEvent(event) ) continue;
  139. goodEventCounter++;
  140. TVector3 pVtx = event->primaryVertex();
  141. // Track analysis
  142. Int_t nTracks = dst->numberOfTracks();
  143. // Vertex sign
  144. VtxSign = GetVzBin(pVtx.Z());
  145. if (VtxSign == -1) continue;
  146. // Track loop
  147. for (Int_t iTrk = 0; iTrk < nTracks; iTrk++)
  148. {
  149. // Retrieve i-th femto track
  150. StFemtoTrack *femtoTrack = dst->track(iTrk);
  151. if (!femtoTrack)
  152. continue;
  153. // Must be a primary track
  154. if (!femtoTrack->isPrimary())
  155. continue;
  156. //Track selection
  157. if (!isGoodTrack(femtoTrack, energy, pVtx)) continue;
  158. //Fill recentered Q-vectors for all TPC (FULL)
  159. weight = GetWeight(femtoTrack);
  160. // 2-nd harmonics
  161. QvTMP.Set(0.,0.);
  162. QvTMP = CalcQvector(femtoTrack,2);
  163. p_Qx_FULL_EP[0][VtxSign]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X(),weight);
  164. p_Qy_FULL_EP[0][VtxSign]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y(),weight);
  165. p_Qx_FULL_SP[0][VtxSign]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X());
  166. p_Qy_FULL_SP[0][VtxSign]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y());
  167. for (int iGap=0; iGap<NEtaGaps; iGap++)
  168. {
  169. //fill Qvectors from EAST arm
  170. if (femtoTrack->eta() > -1.*cutEta && femtoTrack->eta() < 0.)//cutEtaGap[iGap])
  171. {
  172. p_Qx_EAST_EP[0][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X(),weight);
  173. p_Qy_EAST_EP[0][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y(),weight);
  174. p_Qx_EAST_SP[0][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X());
  175. p_Qy_EAST_SP[0][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y());
  176. }
  177. //fill Qvectors from WEST arm
  178. if (femtoTrack->eta() < 1.*cutEta && femtoTrack->eta() > 0.)//cutEtaGap[iGap])
  179. {
  180. p_Qx_WEST_EP[0][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X(),weight);
  181. p_Qy_WEST_EP[0][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y(),weight);
  182. p_Qx_WEST_SP[0][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X());
  183. p_Qy_WEST_SP[0][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y());
  184. }
  185. }
  186. // 3-rd harmonics
  187. QvTMP.Set(0.,0.);
  188. QvTMP = CalcQvector(femtoTrack,3);
  189. p_Qx_FULL_EP[1][VtxSign]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X(),weight);
  190. p_Qy_FULL_EP[1][VtxSign]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y(),weight);
  191. p_Qx_FULL_SP[1][VtxSign]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X());
  192. p_Qy_FULL_SP[1][VtxSign]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y());
  193. for (int iGap=0; iGap<NEtaGaps; iGap++)
  194. {
  195. //fill Qvectors from EAST arm
  196. if (femtoTrack->eta() > -1.*cutEta && femtoTrack->eta() < 0.)//cutEtaGap[iGap])
  197. {
  198. p_Qx_EAST_EP[1][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X(),weight);
  199. p_Qy_EAST_EP[1][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y(),weight);
  200. p_Qx_EAST_SP[1][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X());
  201. p_Qy_EAST_SP[1][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y());
  202. }
  203. //fill Qvectors from WEST arm
  204. if (femtoTrack->eta() < 1.*cutEta && femtoTrack->eta() > 0.)//cutEtaGap[iGap])
  205. {
  206. p_Qx_WEST_EP[1][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X(),weight);
  207. p_Qy_WEST_EP[1][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y(),weight);
  208. p_Qx_WEST_SP[1][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.X());
  209. p_Qy_WEST_SP[1][VtxSign][iGap]->Fill((Double_t) event->runId(),(Double_t) event->cent16(),(Double_t) QvTMP.Y());
  210. }
  211. }
  212. // Check if track has TOF signal
  213. if (femtoTrack->isTofTrack())
  214. {
  215. } //if( isTofTrack() )
  216. } //for(Int_t iTrk=0; iTrk<nTracks; iTrk++)
  217. } //for(Long64_t iEvent=0; iEvent<events2read; iEvent++)
  218. femtoReader->Finish();
  219. TFile *output = new TFile(outFile,"recreate");
  220. for (int iHarm=0; iHarm<fNharmonics; iHarm++)
  221. {
  222. for (int iVtx=0; iVtx<fArraySize; iVtx++)
  223. {
  224. p_Qx_FULL_EP[iHarm][iVtx]->Write();
  225. p_Qy_FULL_EP[iHarm][iVtx]->Write();
  226. p_Qx_FULL_SP[iHarm][iVtx]->Write();
  227. p_Qy_FULL_SP[iHarm][iVtx]->Write();
  228. for (int iEtaGap=0; iEtaGap<NEtaGaps; iEtaGap++)
  229. {
  230. p_Qx_EAST_EP[iHarm][iVtx][iEtaGap]->Write();
  231. p_Qy_EAST_EP[iHarm][iVtx][iEtaGap]->Write();
  232. p_Qx_EAST_SP[iHarm][iVtx][iEtaGap]->Write();
  233. p_Qy_EAST_SP[iHarm][iVtx][iEtaGap]->Write();
  234. p_Qx_WEST_EP[iHarm][iVtx][iEtaGap]->Write();
  235. p_Qy_WEST_EP[iHarm][iVtx][iEtaGap]->Write();
  236. p_Qx_WEST_SP[iHarm][iVtx][iEtaGap]->Write();
  237. p_Qy_WEST_SP[iHarm][iVtx][iEtaGap]->Write();
  238. }
  239. }
  240. }
  241. output->Close();
  242. std::cout << "I'm done with analysis. We'll have a Nobel Prize, Master!"
  243. << std::endl;
  244. std::cout << "Good events: " << goodEventCounter << std::endl;
  245. timer.Stop();
  246. timer.Print();
  247. }
  248. Bool_t isGoodEvent(StFemtoEvent *const &event)
  249. {
  250. if (!event) return false;
  251. if (event == nullptr) return false;
  252. if (event->primaryVertex().Perp() > cutVtxR) return false;
  253. if (TMath::Abs(event->primaryVertex().Z()) > cutVtxZEnergy.at(energy)) return false;
  254. if ((energy == 200.) && TMath::Abs(event->primaryVertex().Z() - event->vpdVz()) > cutVpdVz) return false;
  255. return true;
  256. }
  257. Bool_t isGoodTrack(StFemtoTrack *const &track, Float_t _energy, TVector3 pVtx)
  258. {
  259. if (!track) return false;
  260. // if (!track->isPrimary()) return false;
  261. if (track->nHitsFit() < cutNhits) return false;
  262. if (track->nHitsPoss() <= cutNhitsPoss) return false;
  263. if ((Double_t) track->nHitsFit()/track->nHitsPoss() < cutNhitsRatio) return false;
  264. if (TMath::Abs(track->eta()) >= cutEta) return false;
  265. if (track->pt() <= cutPtMin.at(_energy)) return false;
  266. if (track->pt() > cutPtMax) return false;
  267. if (track->ptot() > cutPMax) return false;
  268. if (track->gDCA(pVtx).Mag() >= cutDCA.at(_energy)) return false;
  269. return true;
  270. }
  271. Double_t GetWeight(StFemtoTrack *const &track)
  272. {
  273. Double_t weight;
  274. if (track->pt() <= cutPtWeightEP)
  275. {
  276. weight = track->pt();
  277. }
  278. else
  279. {
  280. weight = cutPtWeightEP;
  281. }
  282. return weight;
  283. }
  284. TVector2 CalcQvector(StFemtoTrack *const &track, Int_t _harm)
  285. {
  286. TVector2 qv(0.,0.);
  287. qv.Set(TMath::Cos(_harm*track->phi()),TMath::Sin(_harm*track->phi()));
  288. return qv;
  289. }
  290. Int_t GetVzBin(Double_t vtxZ)
  291. {
  292. for (Int_t i=0; i<fArraySize;i++)
  293. {
  294. if (vtxZ >= VtxBins[i] && vtxZ < VtxBins[i+1]) return i;
  295. }
  296. return -1;
  297. }