MpdFemtoTrack.cxx 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. //
  2. // Main class holding track information
  3. //
  4. // MpdFemtoMaker headers
  5. #include "MpdFemtoTrack.h"
  6. #include "phys_constants.h"
  7. //________________
  8. MpdFemtoTrack::MpdFemtoTrack() :
  9. mId(0), mFlag(0), mNHits(0), mNHitsPoss(0), mNHitsDedx(0), mChi2(0), mDedx(0),
  10. mNSigmaElectron(-30), mNSigmaPion(-30), mNSigmaKaon(-30), mNSigmaProton(-30),
  11. mPidProbElectron(0), mPidProbPion(0), mPidProbKaon(0), mPidProbProton(0),
  12. mMap(0), mTofBeta(0),
  13. mPrimaryPx(0), mPrimaryPy(0), mPrimaryPz(0), mGlobalPx(0), mGlobalPy(0), mGlobalPz(0),
  14. mDcaX(-999), mDcaY(-999), mDcaZ(-999),
  15. mPrimaryVertexX(0), mPrimaryVertexY(0), mPrimaryVertexZ(0), mBField(0),
  16. mHiddenInfo(nullptr) {
  17. // Default constructor
  18. }
  19. //________________
  20. MpdFemtoTrack::MpdFemtoTrack(const MpdFemtoTrack& t) {
  21. // Copy constructor
  22. mId = t.mId;
  23. mFlag = t.mFlag;
  24. mNHits = t.mNHits;
  25. mNHitsPoss = t.mNHitsPoss;
  26. mNHitsDedx = t.mNHitsDedx;
  27. mChi2 = t.mChi2;
  28. mDedx = t.mDedx;
  29. mNSigmaElectron = t.mNSigmaElectron;
  30. mNSigmaPion = t.mNSigmaPion;
  31. mNSigmaKaon = t.mNSigmaKaon;
  32. mNSigmaProton = t.mNSigmaProton;
  33. mPidProbElectron = t.mPidProbElectron;
  34. mPidProbPion = t.mPidProbPion;
  35. mPidProbKaon = t.mPidProbKaon;
  36. mPidProbProton = t.mPidProbProton;
  37. mDcaX = t.mDcaX;
  38. mDcaY = t.mDcaY;
  39. mDcaZ = t.mDcaZ;
  40. mMap = t.mMap;
  41. mTofBeta = t.mTofBeta;
  42. mPrimaryPx = t.mPrimaryPx;
  43. mPrimaryPy = t.mPrimaryPy;
  44. mPrimaryPz = t.mPrimaryPz;
  45. mGlobalPx = t.mGlobalPx;
  46. mGlobalPy = t.mGlobalPy;
  47. mGlobalPz = t.mGlobalPz;
  48. mPrimaryVertexX = t.mPrimaryVertexX;
  49. mPrimaryVertexY = t.mPrimaryVertexY;
  50. mPrimaryVertexZ = t.mPrimaryVertexZ;
  51. mBField = t.mBField;
  52. if (t.validHiddenInfo()) {
  53. mHiddenInfo = t.getHiddenInfo()->clone();
  54. } else {
  55. mHiddenInfo = nullptr;
  56. }
  57. }
  58. //_________________
  59. MpdFemtoTrack& MpdFemtoTrack::operator=(const MpdFemtoTrack& trk) {
  60. // Assignment operator
  61. if (this != &trk) {
  62. mId = trk.mId;
  63. mFlag = trk.mFlag;
  64. mNHits = trk.mNHits;
  65. mNHitsPoss = trk.mNHitsPoss;
  66. mNHitsDedx = trk.mNHitsDedx;
  67. mChi2 = trk.mChi2;
  68. mDedx = trk.mDedx;
  69. mNSigmaElectron = trk.mNSigmaElectron;
  70. mNSigmaPion = trk.mNSigmaPion;
  71. mNSigmaKaon = trk.mNSigmaKaon;
  72. mNSigmaProton = trk.mNSigmaProton;
  73. mPidProbElectron = trk.mPidProbElectron;
  74. mPidProbPion = trk.mPidProbPion;
  75. mPidProbKaon = trk.mPidProbKaon;
  76. mPidProbProton = trk.mPidProbProton;
  77. mMap = trk.mMap;
  78. mTofBeta = trk.mTofBeta;
  79. mPrimaryPx = trk.mPrimaryPx;
  80. mPrimaryPy = trk.mPrimaryPy;
  81. mPrimaryPz = trk.mPrimaryPz;
  82. mGlobalPx = trk.mGlobalPx;
  83. mGlobalPy = trk.mGlobalPy;
  84. mGlobalPz = trk.mGlobalPz;
  85. mDcaX = trk.mDcaX;
  86. mDcaY = trk.mDcaY;
  87. mDcaZ = trk.mDcaZ;
  88. mPrimaryVertexX = trk.mPrimaryVertexX;
  89. mPrimaryVertexY = trk.mPrimaryVertexY;
  90. mPrimaryVertexZ = trk.mPrimaryVertexZ;
  91. mBField = trk.mBField;
  92. if (mHiddenInfo) delete mHiddenInfo;
  93. mHiddenInfo = trk.validHiddenInfo() ? trk.getHiddenInfo()->clone() : nullptr;
  94. }
  95. return *this;
  96. }
  97. //_________________
  98. MpdFemtoTrack::~MpdFemtoTrack() {
  99. if (mHiddenInfo) delete mHiddenInfo;
  100. }
  101. //_________________
  102. float MpdFemtoTrack::massSqr() const {
  103. // Set squared mass
  104. float massSqr = -999.;
  105. if (isPrimary() && isTofTrack()) {
  106. massSqr = ptot2() * (invBeta2() - 1.);
  107. }
  108. return massSqr;
  109. }
  110. //_________________
  111. void MpdFemtoTrack::setNSigmaElectron(const float& ns) {
  112. // Set nSigma(e)
  113. mNSigmaElectron = (TMath::Abs(ns * 1000.) > std::numeric_limits<short>::max() ?
  114. ((ns > 0) ? std::numeric_limits<short>::max() : std::numeric_limits<short>::min()) :
  115. (short) (ns * 1000.));
  116. }
  117. //_________________
  118. void MpdFemtoTrack::setNSigmaPion(const float& ns) {
  119. // Set nSigma(pi)
  120. mNSigmaPion = (TMath::Abs(ns * 1000.) > std::numeric_limits<short>::max() ?
  121. ((ns > 0) ? std::numeric_limits<short>::max() : std::numeric_limits<short>::min()) :
  122. (short) (ns * 1000.));
  123. }
  124. //_________________
  125. void MpdFemtoTrack::setNSigmaKaon(const float& ns) {
  126. // Set nSigma(K)
  127. mNSigmaKaon = (TMath::Abs(ns * 1000.) > std::numeric_limits<short>::max() ?
  128. ((ns > 0) ? std::numeric_limits<short>::max() : std::numeric_limits<short>::min()) :
  129. (short) (ns * 1000.));
  130. }
  131. //_________________
  132. void MpdFemtoTrack::setNSigmaProton(const float& ns) {
  133. // Set nSigma(p)
  134. mNSigmaProton = (TMath::Abs(ns * 1000.) > std::numeric_limits<short>::max() ?
  135. ((ns > 0) ? std::numeric_limits<short>::max() : std::numeric_limits<short>::min()) :
  136. (short) (ns * 1000.));
  137. }
  138. //_________________
  139. void MpdFemtoTrack::setChi2(const float& x) {
  140. // Set chi2
  141. if (x < 0) {
  142. mChi2 = 0;
  143. } else {
  144. mChi2 = ((x * 1000.) > std::numeric_limits<unsigned short>::max() ?
  145. std::numeric_limits<unsigned short>::max() :
  146. (unsigned short) (x * 1000.));
  147. }
  148. }
  149. //_________________
  150. void MpdFemtoTrack::setPidProbElectron(const float& prob) {
  151. // Set probability(e)
  152. if (prob < 0) {
  153. mPidProbElectron = 0;
  154. } else {
  155. mPidProbElectron = ((prob * 10000.) > std::numeric_limits<unsigned short>::max() ?
  156. std::numeric_limits<unsigned short>::max() :
  157. (unsigned short) (prob * 10000.));
  158. }
  159. }
  160. //_________________
  161. void MpdFemtoTrack::setPidProbPion(const float& prob) {
  162. // Set probability(pi)
  163. if (prob < 0) {
  164. mPidProbPion = 0;
  165. } else {
  166. mPidProbPion = ((prob * 10000.) > std::numeric_limits<unsigned short>::max() ?
  167. std::numeric_limits<unsigned short>::max() :
  168. (unsigned short) (prob * 10000.));
  169. }
  170. }
  171. //_________________
  172. void MpdFemtoTrack::setPidProbKaon(const float& prob) {
  173. // Set probability(K)
  174. if (prob < 0) {
  175. mPidProbKaon = 0;
  176. } else {
  177. mPidProbKaon = ((prob * 10000.) > std::numeric_limits<unsigned short>::max() ?
  178. std::numeric_limits<unsigned short>::max() :
  179. (unsigned short) (prob * 10000.));
  180. }
  181. }
  182. //_________________
  183. void MpdFemtoTrack::setPidProbProton(const float& prob) {
  184. // Set probability(p)
  185. if (prob < 0) {
  186. mPidProbProton = 0;
  187. } else {
  188. mPidProbProton = ((prob * 10000.) > std::numeric_limits<unsigned short>::max() ?
  189. std::numeric_limits<unsigned short>::max() :
  190. (unsigned short) (prob * 10000.));
  191. }
  192. }
  193. //_________________
  194. void MpdFemtoTrack::setDedx(const double& dEdx) {
  195. // Set dE/dx (from GeV/cm)
  196. if (dEdx < 0) {
  197. mDedx = 0;
  198. } else {
  199. mDedx = ((dEdx * 1e9) > std::numeric_limits<unsigned short>::max() ?
  200. std::numeric_limits<unsigned short>::max() :
  201. (unsigned short) (dEdx * 1e9));
  202. }
  203. }
  204. //_________________
  205. void MpdFemtoTrack::setDedxFromKeV(const double& dEdx) {
  206. // Set dE/dx (from keV/cm)
  207. if (dEdx < 0) {
  208. mDedx = 0;
  209. } else {
  210. mDedx = ((dEdx * 1e3) > std::numeric_limits<unsigned short>::max() ?
  211. std::numeric_limits<unsigned short>::max() :
  212. (unsigned short) (dEdx * 1e3));
  213. }
  214. }
  215. //_________________
  216. void MpdFemtoTrack::setBeta(const float& beta) {
  217. // Set relativistik velocity (from TOF)
  218. // Zero means there is no signal in TOF (track did not match TOF)
  219. if (beta <= 0) {
  220. mTofBeta = 0;
  221. } else {
  222. mTofBeta = ((beta * 20000.) > std::numeric_limits<unsigned short>::max() ?
  223. std::numeric_limits<unsigned short>::max() :
  224. (unsigned short) (beta * 20000.));
  225. }
  226. }
  227. //_________________
  228. MpdFemtoPhysicalHelix MpdFemtoTrack::helix() const {
  229. // Return helix of the primary track
  230. return MpdFemtoPhysicalHelix(pMom(), primaryVertex(),
  231. mBField * kilogauss,
  232. static_cast<float> (charge()));
  233. }
  234. //_________________
  235. MpdFemtoPhysicalHelix MpdFemtoTrack::gHelix() const {
  236. // Return helix of the global track
  237. return MpdFemtoPhysicalHelix(gMom(), origin(),
  238. mBField * kilogauss,
  239. static_cast<float> (charge()));
  240. }
  241. //_________________
  242. float MpdFemtoTrack::invBetaDiffElectron() const {
  243. // Calculate 1/beta-1/beta(electron) for TOF-matched primary track
  244. if (isPrimary() && isTofTrack()) {
  245. return ( invBeta() - TMath::Sqrt(M_ELECTRON * M_ELECTRON + pMom().Mag2()) / pMom().Mag());
  246. } else {
  247. return -999.;
  248. }
  249. }
  250. //_________________
  251. float MpdFemtoTrack::invBetaDiffPion() const {
  252. // Calculate 1/beta-1/beta(pion) for TOF-matched primary track
  253. if (isPrimary() && isTofTrack()) {
  254. return ( invBeta() - TMath::Sqrt(M_PION_PLUS * M_PION_PLUS + pMom().Mag2()) / pMom().Mag());
  255. } else {
  256. return -999.;
  257. }
  258. }
  259. //_________________
  260. float MpdFemtoTrack::invBetaDiffKaon() const {
  261. // Calculate 1/beta-1/beta(kaon) for TOF-matched primary track
  262. if (isPrimary() && isTofTrack()) {
  263. return ( invBeta() - TMath::Sqrt(M_KAON_PLUS * M_KAON_PLUS + pMom().Mag2()) / pMom().Mag());
  264. } else {
  265. return -999.;
  266. }
  267. }
  268. //_________________
  269. float MpdFemtoTrack::invBetaDiffProton() const {
  270. // Calculate 1/beta-1/beta(proton) for TOF-matched primary track
  271. if (isPrimary() && isTofTrack()) {
  272. return ( invBeta() - TMath::Sqrt(M_PROTON * M_PROTON + pMom().Mag2()) / pMom().Mag());
  273. } else {
  274. return -999.;
  275. }
  276. }
  277. ClassImp(MpdFemtoTrack)