FemtoDstAnalyzer_BBC_ReCentering.C 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  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. #include "TRandom3.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. Int_t GetVzBin(Double_t vtxZ);
  47. Float_t BBC_GetPhi(const Int_t eastWest, const Int_t tileId);
  48. //_________________
  49. void FemtoDstAnalyzer_BBC_ReCentering(const Char_t *inFile = "st_physics_12150008_raw_4030001.femtoDst.root",
  50. const Char_t *outFile = "./oReCenteringTest.root",
  51. const Char_t *gainBBC = "")
  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. //Manage gain correction
  60. TProfile2D *BBCgain_East[fArraySize];
  61. TProfile2D *BBCgain_West[fArraySize];
  62. TFile *fiGain = new TFile(gainBBC, "read");
  63. fiGain->cd();
  64. for (int iVtx = 0; iVtx < fArraySize; iVtx++)
  65. {
  66. BBCgain_East[iVtx] = (TProfile2D *)fiGain->Get(Form("p_gainBBC_East_Vtx%i", iVtx));
  67. BBCgain_West[iVtx] = (TProfile2D *)fiGain->Get(Form("p_gainBBC_West_Vtx%i", iVtx));
  68. }
  69. //Manage output
  70. TProfile2D *p_BBC_Qx_Full_EP[fNharmonics+1][fArraySize];
  71. TProfile2D *p_BBC_Qy_Full_EP[fNharmonics+1][fArraySize];
  72. TProfile2D *p_BBC_Qx_East_EP[fNharmonics+1][fArraySize];
  73. TProfile2D *p_BBC_Qy_East_EP[fNharmonics+1][fArraySize];
  74. TProfile2D *p_BBC_Qx_West_EP[fNharmonics+1][fArraySize];
  75. TProfile2D *p_BBC_Qy_West_EP[fNharmonics+1][fArraySize];
  76. // TH2D *h_BBC_East_EP[fNharmonics][fArraySize];
  77. for (int iHarm = 0; iHarm < fNharmonics+1; iHarm++)
  78. {
  79. for (int iVtx = 0; iVtx < fArraySize; iVtx++)
  80. {
  81. p_BBC_Qx_Full_EP[iHarm][iVtx] = new TProfile2D(Form("p_BBC_Qx_Full_EP%i_vtx%i", iHarm, iVtx), Form("p_BBC_Qx_Full_EP%i_vtx%i", iHarm, iVtx), fNBins, runId_min - 0.5, runId_max + 0.5, 16, -0.5, 15.5);
  82. p_BBC_Qy_Full_EP[iHarm][iVtx] = new TProfile2D(Form("p_BBC_Qy_Full_EP%i_vtx%i", iHarm, iVtx), Form("p_BBC_Qy_Full_EP%i_vtx%i", iHarm, iVtx), fNBins, runId_min - 0.5, runId_max + 0.5, 16, -0.5, 15.5);
  83. p_BBC_Qx_East_EP[iHarm][iVtx] = new TProfile2D(Form("p_BBC_Qx_East_EP%i_vtx%i", iHarm, iVtx), Form("p_BBC_Qx_East_EP%i_vtx%i", iHarm, iVtx), fNBins, runId_min - 0.5, runId_max + 0.5, 16, -0.5, 15.5);
  84. p_BBC_Qy_East_EP[iHarm][iVtx] = new TProfile2D(Form("p_BBC_Qy_East_EP%i_vtx%i", iHarm, iVtx), Form("p_BBC_Qy_East_EP%i_vtx%i", iHarm, iVtx), fNBins, runId_min - 0.5, runId_max + 0.5, 16, -0.5, 15.5);
  85. p_BBC_Qx_West_EP[iHarm][iVtx] = new TProfile2D(Form("p_BBC_Qx_West_EP%i_vtx%i", iHarm, iVtx), Form("p_BBC_Qx_West_EP%i_vtx%i", iHarm, iVtx), fNBins, runId_min - 0.5, runId_max + 0.5, 16, -0.5, 15.5);
  86. p_BBC_Qy_West_EP[iHarm][iVtx] = new TProfile2D(Form("p_BBC_Qy_West_EP%i_vtx%i", iHarm, iVtx), Form("p_BBC_Qy_West_EP%i_vtx%i", iHarm, iVtx), fNBins, runId_min - 0.5, runId_max + 0.5, 16, -0.5, 15.5);
  87. // h_BBC_East_EP[iHarm][iVtx] = new TH2D(Form("h_BBC_East_EP%i_vtx%i", iHarm, iVtx), Form("EP east (%i harm) angle from BBC w/ rec %i vs centrality bin", iHarm, iVtx), 360, -TMath::Pi(), TMath::Pi(), 16, -0.5, 15.5);
  88. }
  89. }
  90. StFemtoDstReader *femtoReader = new StFemtoDstReader(inFile);
  91. femtoReader->Init();
  92. // This is a way if you want to spead up IO
  93. std::cout << "Explicit read status for some branches" << std::endl;
  94. femtoReader->SetStatus("*", 0);
  95. femtoReader->SetStatus("Event", 1);
  96. femtoReader->SetStatus("Track", 1);
  97. std::cout << "Status has been set" << std::endl;
  98. std::cout << "Now I know what to read, Master!" << std::endl;
  99. if (!femtoReader->chain())
  100. {
  101. std::cout << "No chain has been found." << std::endl;
  102. }
  103. Long64_t eventsInTree = femtoReader->tree()->GetEntries();
  104. std::cout << "eventsInTree: " << eventsInTree << std::endl;
  105. Long64_t events2read = femtoReader->chain()->GetEntries();
  106. std::cout << "Number of events to read: " << events2read << std::endl;
  107. Int_t VtxSign;
  108. // Loop over events
  109. for (Long64_t iEvent = 0; iEvent < events2read; iEvent++)
  110. {
  111. if ((iEvent + 1) % 1000 == 0)
  112. {
  113. std::cout << "Working on event #[" << (iEvent + 1)
  114. << "/" << events2read << "]" << std::endl;
  115. }
  116. Bool_t readEvent = femtoReader->readFemtoEvent(iEvent);
  117. if (!readEvent)
  118. {
  119. std::cout << "Something went wrong, Master! Nothing to analyze..." << std::endl;
  120. break;
  121. }
  122. // Retrieve femtoDst
  123. StFemtoDst *dst = femtoReader->femtoDst();
  124. // Retrieve event information
  125. StFemtoEvent *event = dst->event();
  126. if (!event)
  127. {
  128. std::cout << "Something went wrong, Master! Event is hiding from me..." << std::endl;
  129. break;
  130. }
  131. // Event selection
  132. if (!isGoodEvent(event))
  133. continue;
  134. VtxSign = GetVzBin(event->primaryVertex().Z());
  135. if (VtxSign == -1)
  136. continue;
  137. Double_t adcNormEastInner = BBCgain_East[VtxSign]->Integral(BBCgain_East[VtxSign]->GetXaxis()->FindBin(event->runId()),BBCgain_East[VtxSign]->GetXaxis()->FindBin(event->runId()),1,6)/6.;
  138. Double_t adcNormEastOuter = BBCgain_East[VtxSign]->Integral(BBCgain_East[VtxSign]->GetXaxis()->FindBin(event->runId()),BBCgain_East[VtxSign]->GetXaxis()->FindBin(event->runId()),7,16)/10.;
  139. Double_t adcNormWestInner = BBCgain_West[VtxSign]->Integral(BBCgain_East[VtxSign]->GetXaxis()->FindBin(event->runId()),BBCgain_East[VtxSign]->GetXaxis()->FindBin(event->runId()),1,6)/6.;
  140. Double_t adcNormWestOuter = BBCgain_West[VtxSign]->Integral(BBCgain_East[VtxSign]->GetXaxis()->FindBin(event->runId()),BBCgain_East[VtxSign]->GetXaxis()->FindBin(event->runId()),7,16)/10.;
  141. float egain[16]={
  142. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),1))/adcNormEastInner),
  143. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),2))/adcNormEastInner),
  144. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),3))/adcNormEastInner),
  145. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),4))/adcNormEastInner),
  146. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),5))/adcNormEastInner),
  147. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),6))/adcNormEastInner),
  148. (float)((0.5)*BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),7))/adcNormEastOuter),
  149. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),8))/adcNormEastOuter),
  150. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),9))/adcNormEastOuter),
  151. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),10))/adcNormEastOuter),
  152. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),11))/adcNormEastOuter),
  153. (float)((0.5)*BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),12))/adcNormEastOuter),
  154. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),13))/adcNormEastOuter),
  155. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),14))/adcNormEastOuter),
  156. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),15))/adcNormEastOuter),
  157. (float)(BBCgain_East[VtxSign]->GetBinContent(BBCgain_East[VtxSign]->FindBin(event->runId(),16))/adcNormEastOuter)
  158. };
  159. float wgain[16]={
  160. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),1))/adcNormWestInner),
  161. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),2))/adcNormWestInner),
  162. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),3))/adcNormWestInner),
  163. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),4))/adcNormWestInner),
  164. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),5))/adcNormWestInner),
  165. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),6))/adcNormWestInner),
  166. (float)((0.5)*BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),7))/adcNormWestOuter),
  167. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),8))/adcNormWestOuter),
  168. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),9))/adcNormWestOuter),
  169. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),10))/adcNormWestOuter),
  170. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),11))/adcNormWestOuter),
  171. (float)((0.5)*BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),12))/adcNormWestOuter),
  172. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),13))/adcNormWestOuter),
  173. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),14))/adcNormWestOuter),
  174. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),15))/adcNormWestOuter),
  175. (float)(BBCgain_West[VtxSign]->GetBinContent(BBCgain_West[VtxSign]->FindBin(event->runId(),16))/adcNormWestOuter)
  176. };
  177. float nHitE_Gain[16], nHitW_Gain[16];
  178. for(int i=0;i<16;i++){
  179. nHitE_Gain[i] = event->bbcAdcEast(i)/egain[i];
  180. nHitW_Gain[i] = event->bbcAdcWest(i)/wgain[i];
  181. }
  182. Double_t psiWest[fNharmonics+1];
  183. Double_t psiEast[fNharmonics+1];
  184. TVector2 qGainEast[fNharmonics+1], qGainWest[fNharmonics+1], qGainFull[fNharmonics+1];
  185. for (int iHarm=0; iHarm<fNharmonics+1; iHarm++)
  186. {
  187. //BBC Full
  188. //v1*y > 0 by conventions most reasonable to the STAR event plane
  189. //therefore the west event plane has the right sign for the event plane
  190. //more simply (Psi_w = 0 => QWest . x_STAR > 0) and (Psi_e = 0 => QEast . x_STAR < 0)
  191. //The east event plane points opposite that of the west and the west finds the "correct" EP for the STAR coordinates, use West-East
  192. Double_t QVector_GainX = 0., QVector_GainY = 0.;
  193. Float_t eXFsum_Gain = 0., wXFsum_Gain = 0., eYFsum_Gain = 0., wYFsum_Gain = 0., eWFgt_Gain=0., wWFgt_Gain = 0.;
  194. TVector2 QFullGain;
  195. for(int iTile = 0; iTile < 16; iTile++) {
  196. eXFsum_Gain += cos((iHarm+1.)*BBC_GetPhi(0,iTile))*nHitE_Gain[iTile];
  197. wXFsum_Gain += cos((iHarm+1.)*BBC_GetPhi(1,iTile))*nHitW_Gain[iTile];
  198. eYFsum_Gain += sin((iHarm+1.)*BBC_GetPhi(0,iTile))*nHitE_Gain[iTile];
  199. wYFsum_Gain += sin((iHarm+1.)*BBC_GetPhi(1,iTile))*nHitW_Gain[iTile];
  200. eWFgt_Gain += nHitE_Gain[iTile];
  201. wWFgt_Gain += nHitW_Gain[iTile];
  202. }
  203. QVector_GainX=(eWFgt_Gain > 0. && wWFgt_Gain > 0.) ? wXFsum_Gain/wWFgt_Gain + eXFsum_Gain/eWFgt_Gain:0.;
  204. QVector_GainY=(eWFgt_Gain > 0. && wWFgt_Gain > 0.) ? wYFsum_Gain/wWFgt_Gain + eYFsum_Gain/eWFgt_Gain:0.;
  205. QFullGain.Set(QVector_GainX,QVector_GainY);
  206. qGainFull[iHarm] = QFullGain;
  207. //BBC West
  208. //v1*y > 0 by conventions most reasonable to the STAR event plane
  209. //therefore the west event plane has the right sign for the event plane
  210. //more simply (Psi_w = 0 => QWest . x_STAR > 0) and (Psi_e = 0 => QEast . x_STAR < 0)
  211. Double_t QVectorW_GainX = 0., QVectorW_GainY = 0.;
  212. Double_t EventPlaneGainWest = 0.;
  213. Float_t wXsum_Gain = 0., wYsum_Gain = 0., wWgt_Gain = 0.;
  214. TVector2 QWestGain;
  215. for(int iTile = 0; iTile < 16; iTile++) {
  216. wXsum_Gain += cos((iHarm+1.)*BBC_GetPhi(1,iTile))*nHitW_Gain[iTile];
  217. wYsum_Gain += sin((iHarm+1.)*BBC_GetPhi(1,iTile))*nHitW_Gain[iTile];
  218. wWgt_Gain += nHitW_Gain[iTile];
  219. }
  220. QVectorW_GainX = (wWgt_Gain > 0.0) ? wXsum_Gain/wWgt_Gain:0.0;
  221. QVectorW_GainY = (wWgt_Gain > 0.0) ? wYsum_Gain/wWgt_Gain:0.0;
  222. QWestGain.Set(QVectorW_GainX,QVectorW_GainY);
  223. if(QWestGain.Mod()){
  224. EventPlaneGainWest = QWestGain.Phi();
  225. if(EventPlaneGainWest < 0.0) {EventPlaneGainWest += 2.*TMath::Pi()/(iHarm+1.);}
  226. }
  227. psiWest[iHarm] = EventPlaneGainWest;
  228. qGainWest[iHarm] = QWestGain;
  229. //BBC East
  230. //in BBC_GetPhi the fact that the tile numbering scheme is reversed about the y axis for the east BBC is accounted for
  231. //The east event plane points opposite that of the west since the spectators are on different sides -- see west comments
  232. Double_t QVectorE_GainX = 0., QVectorE_GainY = 0.;
  233. Double_t EventPlaneGainEast = 0.;
  234. Float_t eXsum_Gain = 0., eYsum_Gain = 0., eWgt_Gain = 0.;
  235. TVector2 QEastGain;
  236. for(int iTile = 0; iTile < 16; iTile++) {
  237. eXsum_Gain += cos((iHarm+1.)*BBC_GetPhi(0,iTile))*nHitE_Gain[iTile];
  238. eYsum_Gain += sin((iHarm+1.)*BBC_GetPhi(0,iTile))*nHitE_Gain[iTile];
  239. eWgt_Gain += nHitE_Gain[iTile];
  240. }
  241. QVectorE_GainX = (eWgt_Gain > 0.0) ? eXsum_Gain/eWgt_Gain:0.0;
  242. QVectorE_GainY = (eWgt_Gain > 0.0) ? eYsum_Gain/eWgt_Gain:0.0;
  243. QEastGain.Set(QVectorE_GainX,QVectorE_GainY);
  244. if(QEastGain.Mod()){
  245. EventPlaneGainEast = QEastGain.Phi();
  246. if(EventPlaneGainEast < 0.0) {EventPlaneGainEast += 2.*TMath::Pi()/(iHarm+1.);}
  247. }
  248. psiEast[iHarm] = EventPlaneGainEast;
  249. qGainEast[iHarm] = QEastGain;
  250. }
  251. for (int iHarm = 0; iHarm < fNharmonics+1; iHarm++)
  252. {
  253. p_BBC_Qx_Full_EP[iHarm][VtxSign]->Fill(event->runId(), event->cent16(), qGainFull[iHarm].X());
  254. p_BBC_Qy_Full_EP[iHarm][VtxSign]->Fill(event->runId(), event->cent16(), qGainFull[iHarm].Y());
  255. p_BBC_Qx_East_EP[iHarm][VtxSign]->Fill(event->runId(), event->cent16(), qGainEast[iHarm].X());
  256. p_BBC_Qy_East_EP[iHarm][VtxSign]->Fill(event->runId(), event->cent16(), qGainEast[iHarm].Y());
  257. p_BBC_Qx_West_EP[iHarm][VtxSign]->Fill(event->runId(), event->cent16(), qGainWest[iHarm].X());
  258. p_BBC_Qy_West_EP[iHarm][VtxSign]->Fill(event->runId(), event->cent16(), qGainWest[iHarm].Y());
  259. }
  260. } // end iEvent loop
  261. femtoReader->Finish();
  262. TFile *output = new TFile(outFile, "recreate");
  263. for (int iHarm = 0; iHarm < fNharmonics+1; iHarm++)
  264. {
  265. for (int iVtx = 0; iVtx < fArraySize; iVtx++)
  266. {
  267. p_BBC_Qx_Full_EP[iHarm][iVtx]->Write();
  268. p_BBC_Qy_Full_EP[iHarm][iVtx]->Write();
  269. p_BBC_Qx_East_EP[iHarm][iVtx]->Write();
  270. p_BBC_Qy_East_EP[iHarm][iVtx]->Write();
  271. p_BBC_Qx_West_EP[iHarm][iVtx]->Write();
  272. p_BBC_Qy_West_EP[iHarm][iVtx]->Write();
  273. }
  274. }
  275. // fo/* r (int iHarm = 0; iHarm < fNharmonics+1; iHarm++)
  276. // {
  277. // for (int iVtx = 0; iVtx < fArraySize; iVtx++)
  278. // {
  279. // h_BBC_East_EP[iHarm][iVtx]->Write();
  280. // }
  281. // } */
  282. output->Close();
  283. std::cout << "I'm done with analysis. We'll have a Nobel Prize, Master!"
  284. << std::endl;
  285. timer.Stop();
  286. timer.Print();
  287. }
  288. Bool_t isGoodEvent(StFemtoEvent *const &event)
  289. {
  290. if (!event)
  291. return false;
  292. if (event == nullptr)
  293. return false;
  294. if (event->primaryVertex().Perp() > cutVtxR)
  295. return false;
  296. if (TMath::Abs(event->primaryVertex().Z()) > cutVtxZEnergy.at(energy))
  297. return false;
  298. if ((energy == 200.) && TMath::Abs(event->primaryVertex().Z() - event->vpdVz()) > cutVpdVz)
  299. return false;
  300. return true;
  301. }
  302. Bool_t isGoodTrack(StFemtoTrack *const &track, Float_t _energy, TVector3 pVtx)
  303. {
  304. if (!track)
  305. return false;
  306. // if (!track->isPrimary()) return false;
  307. if (track->nHitsFit() < cutNhits)
  308. return false;
  309. if (track->nHitsPoss() <= cutNhitsPoss)
  310. return false;
  311. if ((Double_t)track->nHitsFit() / track->nHitsPoss() < cutNhitsRatio)
  312. return false;
  313. if (TMath::Abs(track->eta()) >= cutEta)
  314. return false;
  315. if (track->pt() <= cutPtMin.at(_energy))
  316. return false;
  317. if (track->pt() > cutPtMax)
  318. return false;
  319. if (track->ptot() > cutPMax)
  320. return false;
  321. if (track->gDCA(pVtx).Mag() >= cutDCA.at(_energy))
  322. return false;
  323. return true;
  324. }
  325. Double_t GetWeight(StFemtoTrack *const &track)
  326. {
  327. Double_t weight;
  328. if (track->pt() <= cutPtWeightEP)
  329. {
  330. weight = track->pt();
  331. }
  332. else
  333. {
  334. weight = cutPtWeightEP;
  335. }
  336. return weight;
  337. }
  338. TVector2 CalcQvector(StFemtoTrack *const &track, Int_t _harm)
  339. {
  340. TVector2 qv(0., 0.);
  341. qv.Set(TMath::Cos(_harm * track->phi()), TMath::Sin(_harm * track->phi()));
  342. return qv;
  343. }
  344. Int_t GetVzBin(Double_t vtxZ)
  345. {
  346. for (Int_t i = 0; i < fArraySize; i++)
  347. {
  348. if (vtxZ >= VtxBins[i] && vtxZ < VtxBins[i + 1])
  349. return i;
  350. }
  351. return -1;
  352. }
  353. //--------------------------------------------------------------------------------------------------------------------------//
  354. //this function simply connects the gain values read in to the BBC azimuthal distribution
  355. //since tiles 7 and 9 (+ 13 and 15) share a gain value it is ambiguous how to assign the geometry here
  356. //I prefer assigning the angle between the tiles thus "greying out" the adcs.
  357. //Others have assigned all of the adc to one (exclusive) or the the other.
  358. Float_t BBC_GetPhi(const Int_t eastWest, const Int_t tileId)
  359. {
  360. //float GetPhiInBBC(int eastWest, int bbcN) { //tileId=0 to 23
  361. const float Pi = TMath::Pi();
  362. const float Phi_div = Pi / 6;
  363. float bbc_phi = Phi_div;
  364. switch(tileId) {
  365. case 0: bbc_phi = 3.*Phi_div;
  366. break;
  367. case 1: bbc_phi = Phi_div;
  368. break;
  369. case 2: bbc_phi = -1.*Phi_div;
  370. break;
  371. case 3: bbc_phi = -3.*Phi_div;
  372. break;
  373. case 4: bbc_phi = -5.*Phi_div;
  374. break;
  375. case 5: bbc_phi = 5.*Phi_div;
  376. break;
  377. //case 6: bbc_phi= (mRndm.Rndm() > 0.5) ? 2.*Phi_div:4.*Phi_div; //tiles 7 and 9 are gained together we randomly assign the gain to one XOR the other
  378. case 6: bbc_phi = 3.*Phi_div;
  379. break;
  380. case 7: bbc_phi = 3.*Phi_div;
  381. break;
  382. case 8: bbc_phi = Phi_div;
  383. break;
  384. case 9: bbc_phi = 0.;
  385. break;
  386. case 10: bbc_phi = -1.*Phi_div;
  387. break;
  388. //case 11: bbc_phi = (mRndm.Rndm() > 0.5) ? -2.*Phi_div:-4.*Phi_div; //tiles 13 and 15 are gained together
  389. case 11: bbc_phi = -3.*Phi_div;
  390. break;
  391. case 12: bbc_phi = -3.*Phi_div;
  392. break;
  393. case 13: bbc_phi = -5.*Phi_div;
  394. break;
  395. case 14: bbc_phi = Pi;
  396. break;
  397. case 15: bbc_phi = 5.*Phi_div;
  398. break;
  399. }
  400. //if we're looking at the east BBC we need to flip around x in the STAR coordinates,
  401. //a line parallel to the beam would go through tile 1 on the W BBC and tile 3 on the
  402. if(0 == eastWest){
  403. if (bbc_phi > -0.001){ //this is not a >= since we are talking about finite adcs -- not to important
  404. bbc_phi = Pi - bbc_phi;
  405. }
  406. else {
  407. bbc_phi= -Pi - bbc_phi;
  408. }
  409. }
  410. if(bbc_phi < 0.0) bbc_phi += 2.*Pi;
  411. if(bbc_phi > 2.*Pi) bbc_phi -= 2.*Pi;
  412. return bbc_phi;
  413. }