FemtoDstAnalyzer_BBC_ShiftCorr.C 24 KB

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