MpdFemtoV0.cxx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. //
  2. // A special type of particle dealing with the V0
  3. //
  4. // C++ headers
  5. #include <utility>
  6. // MpdFemtoMaker headers
  7. #include "MpdFemtoV0.h"
  8. // ROOT headers
  9. #include "TLorentzVector.h"
  10. ClassImp(MpdFemtoV0)
  11. //_________________
  12. MpdFemtoV0::MpdFemtoV0() :
  13. mPrimaryVertexX(0), mPrimaryVertexY(0), mPrimaryVertexZ(0),
  14. mV0DecayPointX(0), mV0DecayPointY(0), mV0DecayPointZ(0),
  15. mV0MomX(0), mV0MomY(0), mV0MomZ(0), mV0PtotPos(0), mV0PtotNeg(0), mV0DcaDaughters(0),
  16. mV0DcaToPrimVertex(0), mChi2V0(0), mClV0(0), mAlphaV0(0), mPtArmV0(0),
  17. mPosId(0), mPosMomX(0), mPosMomY(0), mPosMomZ(0),
  18. mPosDca2PrimVertexX(0), mPosDca2PrimVertexY(0), mPosDca2PrimVertexZ(0),
  19. mPosNHits(0), mPosNHitsPoss(0), mPosNHitsDedx(0), mPosTopologyMap{},
  20. mPosChi2(0), mPosDedx(0), mPosNSigmaElectron(0), mPosNSigmaPion(0),
  21. mPosNSigmaKaon(0), mPosNSigmaProton(0), mPosTofBeta(0),
  22. mNegId(0), mNegMomX(0), mNegMomY(0), mNegMomZ(0),
  23. mNegDca2PrimVertexX(0), mNegDca2PrimVertexY(0), mNegDca2PrimVertexZ(0),
  24. mNegNHits(0), mNegNHitsPoss(0), mNegNHitsDedx(0), mNegTopologyMap{},
  25. mNegChi2(0), mNegDedx(0), mNegNSigmaElectron(0), mNegNSigmaPion(0),
  26. mNegNSigmaKaon(0), mNegNSigmaProton(0), mNegTofBeta(0), mHiddenInfo(nullptr) {
  27. // Default constructor
  28. /* no-op */
  29. }
  30. //_________________
  31. MpdFemtoV0::MpdFemtoV0(const MpdFemtoV0& v) {
  32. // Copy constructor
  33. // Copy V0 information
  34. mPrimaryVertexX = v.mPrimaryVertexX;
  35. mPrimaryVertexY = v.mPrimaryVertexY;
  36. mPrimaryVertexZ = v.mPrimaryVertexZ;
  37. mV0DecayPointX = v.mV0DecayPointX;
  38. mV0DecayPointY = v.mV0DecayPointY;
  39. mV0DecayPointZ = v.mV0DecayPointZ;
  40. mV0PtotPos = v.mV0PtotPos;
  41. mV0PtotNeg = v.mV0PtotNeg;
  42. mV0DcaDaughters = v.mV0DcaDaughters;
  43. mV0DcaToPrimVertex = v.mV0DcaToPrimVertex;
  44. mChi2V0 = v.mChi2V0;
  45. mClV0 = v.mClV0;
  46. mAlphaV0 = v.mAlphaV0;
  47. mPtArmV0 = v.mPtArmV0;
  48. // Copy positive daughter information
  49. mPosId = v.mPosId;
  50. mPosMomX = v.mPosMomX;
  51. mPosMomY = v.mPosMomY;
  52. mPosMomZ = v.mPosMomZ;
  53. mPosDca2PrimVertexX = v.mPosDca2PrimVertexX;
  54. mPosDca2PrimVertexY = v.mPosDca2PrimVertexY;
  55. mPosDca2PrimVertexZ = v.mPosDca2PrimVertexZ;
  56. mPosNHits = v.mPosNHits;
  57. mPosNHitsPoss = v.mPosNHitsPoss;
  58. mPosNHitsDedx = v.mPosNHitsDedx;
  59. mPosTopologyMap[0] = v.mPosTopologyMap[0];
  60. mPosTopologyMap[1] = v.mPosTopologyMap[1];
  61. mPosChi2 = v.mPosChi2;
  62. mPosDedx = v.mPosDedx;
  63. mPosNSigmaElectron = v.mPosNSigmaElectron;
  64. mPosNSigmaPion = v.mPosNSigmaPion;
  65. mPosNSigmaKaon = v.mPosNSigmaKaon;
  66. mPosNSigmaProton = v.mPosNSigmaProton;
  67. mPosTofBeta = v.mPosTofBeta;
  68. // Copy negative daughter information
  69. mNegId = v.mNegId;
  70. mNegMomX = v.mNegMomX;
  71. mNegMomY = v.mNegMomY;
  72. mNegMomZ = v.mNegMomZ;
  73. mNegDca2PrimVertexX = v.mNegDca2PrimVertexX;
  74. mNegDca2PrimVertexY = v.mNegDca2PrimVertexY;
  75. mNegDca2PrimVertexZ = v.mNegDca2PrimVertexZ;
  76. mNegNHits = v.mNegNHits;
  77. mNegNHitsPoss = v.mNegNHitsPoss;
  78. mNegNHitsDedx = v.mNegNHitsDedx;
  79. mNegTopologyMap[0] = v.mNegTopologyMap[0];
  80. mNegTopologyMap[1] = v.mNegTopologyMap[1];
  81. mNegChi2 = v.mNegChi2;
  82. mNegDedx = v.mNegDedx;
  83. mNegNSigmaElectron = v.mNegNSigmaElectron;
  84. mNegNSigmaPion = v.mNegNSigmaPion;
  85. mNegNSigmaKaon = v.mNegNSigmaKaon;
  86. mNegNSigmaProton = v.mNegNSigmaProton;
  87. mNegTofBeta = v.mNegTofBeta;
  88. // Copy theoretical part
  89. if (mHiddenInfo) delete mHiddenInfo;
  90. mHiddenInfo = v.mHiddenInfo ? v.mHiddenInfo->clone() : nullptr;
  91. updateV0();
  92. }
  93. //_________________
  94. MpdFemtoV0& MpdFemtoV0::operator=(const MpdFemtoV0& v0) {
  95. // Assignment operator
  96. if (this != &v0) {
  97. // V0 information
  98. mPrimaryVertexX = v0.mPrimaryVertexX;
  99. mPrimaryVertexY = v0.mPrimaryVertexY;
  100. mPrimaryVertexZ = v0.mPrimaryVertexZ;
  101. mBField = v0.mBField;
  102. mV0DecayPointX = v0.mV0DecayPointX;
  103. mV0DecayPointY = v0.mV0DecayPointY;
  104. mV0DecayPointZ = v0.mV0DecayPointZ;
  105. mV0MomX = v0.mV0MomX;
  106. mV0MomY = v0.mV0MomY;
  107. mV0MomZ = v0.mV0MomZ;
  108. mV0PtotPos = v0.mV0PtotPos;
  109. mV0PtotNeg = v0.mV0PtotNeg;
  110. mV0DcaDaughters = v0.mV0DcaDaughters;
  111. mV0DcaToPrimVertex = v0.mV0DcaToPrimVertex;
  112. mChi2V0 = v0.mChi2V0;
  113. mClV0 = v0.mClV0;
  114. mAlphaV0 = v0.mAlphaV0;
  115. mPtArmV0 = mPtArmV0;
  116. // Positive daughter
  117. mPosId = v0.mPosId;
  118. mPosMomX = v0.mPosMomX;
  119. mPosMomY = v0.mPosMomY;
  120. mPosMomZ = v0.mPosMomZ;
  121. mPosDca2PrimVertexX = v0.mPosDca2PrimVertexX;
  122. mPosDca2PrimVertexY = v0.mPosDca2PrimVertexY;
  123. mPosDca2PrimVertexZ = v0.mPosDca2PrimVertexZ;
  124. mPosNHits = v0.mPosNHits;
  125. mPosNHitsPoss = v0.mPosNHitsPoss;
  126. mPosNHitsDedx = v0.mPosNHitsDedx;
  127. mPosTopologyMap[0] = v0.mPosTopologyMap[0];
  128. mPosTopologyMap[1] = v0.mPosTopologyMap[1];
  129. mPosChi2 = v0.mPosChi2;
  130. mPosDedx = v0.mPosDedx;
  131. mPosNSigmaElectron = v0.mPosNSigmaElectron;
  132. mPosNSigmaPion = v0.mPosNSigmaPion;
  133. mPosNSigmaKaon = v0.mPosNSigmaKaon;
  134. mPosNSigmaProton = v0.mPosNSigmaProton;
  135. mPosTofBeta = v0.mPosTofBeta;
  136. // Negative daughter
  137. mNegId = v0.mNegId;
  138. mNegMomX = v0.mNegMomX;
  139. mNegMomY = v0.mNegMomY;
  140. mNegMomZ = v0.mNegMomZ;
  141. mNegDca2PrimVertexX = v0.mNegDca2PrimVertexX;
  142. mNegDca2PrimVertexY = v0.mNegDca2PrimVertexY;
  143. mNegDca2PrimVertexZ = v0.mNegDca2PrimVertexZ;
  144. mNegNHits = v0.mNegNHits;
  145. mNegNHitsPoss = v0.mNegNHitsPoss;
  146. mNegNHitsDedx = v0.mNegNHitsDedx;
  147. mNegTopologyMap[0] = v0.mNegTopologyMap[0];
  148. mNegTopologyMap[1] = v0.mNegTopologyMap[1];
  149. mNegChi2 = v0.mNegChi2;
  150. mNegDedx = v0.mNegDedx;
  151. mNegNSigmaElectron = v0.mNegNSigmaElectron;
  152. mNegNSigmaPion = v0.mNegNSigmaPion;
  153. mNegNSigmaKaon = v0.mNegNSigmaKaon;
  154. mNegNSigmaProton = v0.mNegNSigmaProton;
  155. mNegTofBeta = v0.mNegTofBeta;
  156. if (mHiddenInfo) delete mHiddenInfo;
  157. mHiddenInfo = (v0.mHiddenInfo) ? v0.mHiddenInfo->clone() : nullptr;
  158. updateV0();
  159. }
  160. return *this;
  161. }
  162. //_________________
  163. MpdFemtoV0::~MpdFemtoV0() {
  164. // Destructor
  165. if (mHiddenInfo) {
  166. delete mHiddenInfo;
  167. }
  168. }
  169. //_________________
  170. void MpdFemtoV0::updateV0() {
  171. // Retrieve positive and negative particle helices
  172. MpdFemtoPhysicalHelix posHelix = helixPos();
  173. MpdFemtoPhysicalHelix negHelix = helixNeg();
  174. // Find DCA between two helices
  175. std::pair<double, double> length = posHelix.pathLength(negHelix);
  176. // Search for the decay point
  177. TVector3 positionAtDCAPos = posHelix.at(length.first);
  178. TVector3 positionAtDCANeg = negHelix.at(length.second);
  179. TVector3 vectorAtDCA = positionAtDCAPos - positionAtDCANeg;
  180. // DCA between positive and negative tracks at decay point
  181. mV0DcaDaughters = vectorAtDCA.Mag();
  182. // Obtain V0 decay point coordinates
  183. TVector3 v0DecayPoint = (positionAtDCAPos + positionAtDCANeg) * 0.5;
  184. mV0DecayPointX = v0DecayPoint.X();
  185. mV0DecayPointY = v0DecayPoint.Y();
  186. mV0DecayPointZ = v0DecayPoint.Z();
  187. // Momentum of daughters at DCA to V0 decay point
  188. TVector3 momAtDecayPointPos = posHelix.momentumAt(length.first, mBField * kilogauss);
  189. TVector3 momAtDecayPointNeg = negHelix.momentumAt(length.second, mBField * kilogauss);
  190. mV0PtotPos = momAtDecayPointPos.Mag();
  191. mV0PtotNeg = momAtDecayPointNeg.Mag();
  192. // Momentum of V0 at decay point
  193. mV0MomX = momAtDecayPointPos.X() + momAtDecayPointNeg.X();
  194. mV0MomY = momAtDecayPointPos.Y() + momAtDecayPointNeg.Y();
  195. mV0MomZ = momAtDecayPointPos.Z() + momAtDecayPointNeg.Z();
  196. // Obtain DCA of V0 to primary vertex
  197. float angle = v0DecayVector().Angle(momV0());
  198. mV0DcaToPrimVertex = v0DecayLength() * TMath::Sin(angle);
  199. // Calculating Podolianski-Armenteros parameters
  200. float momPosAlongV0 = momAtDecayPointPos * momV0() / ptotV0();
  201. float momNegAlongV0 = momAtDecayPointNeg * momV0() / ptotV0();
  202. mAlphaV0 = (momPosAlongV0 - momNegAlongV0) / (momPosAlongV0 + momNegAlongV0);
  203. mPtArmV0 = TMath::Sqrt(mV0PtotPos * mV0PtotPos - momPosAlongV0 * momPosAlongV0);
  204. }
  205. //_________________
  206. float MpdFemtoV0::rapidityPhi() const {
  207. TLorentzVector fourVector(momV0X(), momV0Y(), momV0Z(), ePhi());
  208. return fourVector.Rapidity();
  209. }
  210. //_________________
  211. float MpdFemtoV0::rapidityLambda() const {
  212. TLorentzVector fourVector(momV0X(), momV0Y(), momV0Z(), eLambda());
  213. return fourVector.Rapidity();
  214. }
  215. //_________________
  216. float MpdFemtoV0::rapidityK0Short() const {
  217. TLorentzVector fourVector(momV0X(), momV0Y(), momV0Z(), eK0Short());
  218. return fourVector.Rapidity();
  219. }
  220. //_________________
  221. MpdFemtoPhysicalHelix MpdFemtoV0::helixPos() const {
  222. return MpdFemtoPhysicalHelix(momPos(), originPos(),
  223. bField() * kilogauss,
  224. static_cast<float> (1));
  225. }
  226. //_________________
  227. void MpdFemtoV0::setNSigmaElectronPos(const float& ns) {
  228. mPosNSigmaElectron = (TMath::Abs(ns * 1000.f) > std::numeric_limits<short>::max() ?
  229. std::numeric_limits<short>::max() :
  230. (short) (ns * 1000.f));
  231. }
  232. //_________________
  233. void MpdFemtoV0::setNSigmaPionPos(const float& ns) {
  234. mPosNSigmaPion = (TMath::Abs(ns * 1000.f) > std::numeric_limits<short>::max() ?
  235. std::numeric_limits<short>::max() :
  236. (short) (ns * 1000.f));
  237. }
  238. //_________________
  239. void MpdFemtoV0::setNSigmaKaonPos(const float& ns) {
  240. mPosNSigmaKaon = (TMath::Abs(ns * 1000.f) > std::numeric_limits<short>::max() ?
  241. std::numeric_limits<short>::max() :
  242. (short) (ns * 1000.f));
  243. }
  244. //_________________
  245. void MpdFemtoV0::setNSigmaProtonPos(const float& ns) {
  246. mPosNSigmaProton = (TMath::Abs(ns * 1000.f) > std::numeric_limits<short>::max() ?
  247. std::numeric_limits<short>::max() :
  248. (short) (ns * 1000.f));
  249. }
  250. //_________________
  251. void MpdFemtoV0::setTofBetaPos(const float& beta) {
  252. if (beta < 0) {
  253. mPosTofBeta = 0;
  254. } else {
  255. mPosTofBeta = ((beta * 20000.) > std::numeric_limits<unsigned short>::max() ?
  256. std::numeric_limits<unsigned short>::max() :
  257. (unsigned short) (beta * 20000.f));
  258. }
  259. }
  260. //_________________
  261. MpdFemtoPhysicalHelix MpdFemtoV0::helixNeg() const {
  262. return MpdFemtoPhysicalHelix(momPos(), originNeg(),
  263. bField() * kilogauss,
  264. static_cast<float> (-1));
  265. }
  266. //_________________
  267. void MpdFemtoV0::setNSigmaElectronNeg(const float& ns) {
  268. mNegNSigmaElectron = (TMath::Abs(ns * 1000.f) > std::numeric_limits<short>::max() ?
  269. std::numeric_limits<short>::max() :
  270. (short) (ns * 1000.f));
  271. }
  272. //_________________
  273. void MpdFemtoV0::setNSigmaPionNeg(const float& ns) {
  274. mNegNSigmaPion = (TMath::Abs(ns * 1000.f) > std::numeric_limits<short>::max() ?
  275. std::numeric_limits<short>::max() :
  276. (short) (ns * 1000.f));
  277. }
  278. //_________________
  279. void MpdFemtoV0::setNSigmaKaonNeg(const float& ns) {
  280. mNegNSigmaKaon = (TMath::Abs(ns * 1000.f) > std::numeric_limits<short>::max() ?
  281. std::numeric_limits<short>::max() :
  282. (short) (ns * 1000.f));
  283. }
  284. //_________________
  285. void MpdFemtoV0::setNSigmaProtonNeg(const float& ns) {
  286. mNegNSigmaProton = (TMath::Abs(ns * 1000.f) > std::numeric_limits<short>::max() ?
  287. std::numeric_limits<short>::max() :
  288. (short) (ns * 1000.f));
  289. }
  290. //_________________
  291. void MpdFemtoV0::setTofBetaNeg(const float& beta) {
  292. if (beta < 0) {
  293. mNegTofBeta = 0;
  294. } else {
  295. mNegTofBeta = ((beta * 20000.f) > std::numeric_limits<unsigned short>::max() ?
  296. std::numeric_limits<unsigned short>::max() :
  297. (unsigned short) (beta * 20000.f));
  298. }
  299. }
  300. //_________________
  301. void MpdFemtoV0::setChi2V0(const float& chi2) {
  302. if (chi2 < 0) {
  303. mChi2V0 = chi2;
  304. } else {
  305. mChi2V0 = ((chi2 * 10.f) > std::numeric_limits<unsigned char>::max() ?
  306. std::numeric_limits<unsigned char>::max() :
  307. (unsigned char) (chi2 * 10.f));
  308. }
  309. }