MpdFemtoTriplet.cxx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. //
  2. // The class allows to perform three-particle analysis
  3. //
  4. // MpdFemtoMaker headers
  5. #include "MpdFemtoTriplet.h"
  6. // ROOT headers
  7. #include "TMath.h"
  8. //_________________
  9. double Triplet_Quality_Calc(MpdFemtoParticle* Track1, MpdFemtoParticle* Track2) {
  10. // unsigned long mapMask0 = 0xFFFFFF00;
  11. // unsigned long mapMask1 = 0x1FFFFF;
  12. // unsigned long padRow1To24Track1 = Track1->topologyMap(0) & mapMask0;
  13. // unsigned long padRow25To45Track1 = Track1->topologyMap(1) & mapMask1;
  14. // unsigned long padRow1To24Track2 = Track2->topologyMap(0) & mapMask0;
  15. // unsigned long padRow25To45Track2 = Track2->topologyMap(1) & mapMask1;
  16. // // AND logic
  17. // unsigned long bothPads1To24 = padRow1To24Track1 & padRow1To24Track2;
  18. // unsigned long bothPads25To45 = padRow25To45Track1 & padRow25To45Track2;
  19. // // XOR logic
  20. // unsigned long onePad1To24 = padRow1To24Track1 ^ padRow1To24Track2;
  21. // unsigned long onePad25To45 = padRow25To45Track1 ^ padRow25To45Track2;
  22. // unsigned long bitI;
  23. // int ibits;
  24. int Quality = 0;
  25. double normQual = 0.0;
  26. // for (ibits = 8; ibits <= 31; ibits++) {
  27. // bitI = 0;
  28. // bitI |= 1UL << (ibits);
  29. // if (onePad1To24 & bitI) {
  30. // Quality++;
  31. // continue;
  32. // } else {
  33. // if (bothPads1To24 & bitI) Quality--;
  34. // }
  35. // }
  36. // for (ibits = 0; ibits <= 20; ibits++) {
  37. // bitI = 0;
  38. // bitI |= 1UL << (ibits);
  39. // if (onePad25To45 & bitI) {
  40. // Quality++;
  41. // continue;
  42. // } else {
  43. // if (bothPads25To45 & bitI) Quality--;
  44. // }
  45. // }
  46. normQual = (double) Quality / ((double) (Track1->nHits() + Track2->nHits()));
  47. return ( normQual);
  48. }
  49. //_________________
  50. MpdFemtoTriplet::MpdFemtoTriplet() :
  51. mTrack1(nullptr),
  52. mTrack2(nullptr),
  53. mTrack3(nullptr) {
  54. // Default constructor
  55. /* empty */
  56. }
  57. //_________________
  58. MpdFemtoTriplet::MpdFemtoTriplet(MpdFemtoParticle* a, MpdFemtoParticle* b, MpdFemtoParticle* c) :
  59. mTrack1(a),
  60. mTrack2(b),
  61. mTrack3(c) {
  62. // Parametrized constructor
  63. /* empty */
  64. }
  65. //_________________
  66. MpdFemtoTriplet::MpdFemtoTriplet(const MpdFemtoTriplet& trio) :
  67. mTrack1(trio.mTrack1),
  68. mTrack2(trio.mTrack2),
  69. mTrack3(trio.mTrack3) {
  70. // Copy constructor
  71. /* emtpy */
  72. }
  73. //_________________
  74. MpdFemtoTriplet::~MpdFemtoTriplet() {
  75. // Destructor
  76. if (mTrack1) delete mTrack1;
  77. if (mTrack2) delete mTrack2;
  78. if (mTrack3) delete mTrack3;
  79. }
  80. //_________________
  81. double MpdFemtoTriplet::qInv() const {
  82. double dq = TMath::Sqrt(TMath::Abs((mTrack1->fourMomentum() - mTrack2->fourMomentum()).M2()) +
  83. TMath::Abs((mTrack2->fourMomentum() - mTrack3->fourMomentum()).M2()) +
  84. TMath::Abs((mTrack3->fourMomentum() - mTrack1->fourMomentum()).M2()));
  85. return dq;
  86. }
  87. //_________________
  88. double MpdFemtoTriplet::qInv12() const {
  89. return TMath::Sqrt(TMath::Abs((mTrack1->fourMomentum() - mTrack2->fourMomentum()).M2()));
  90. }
  91. //_________________
  92. double MpdFemtoTriplet::qInv23() const {
  93. return TMath::Sqrt(TMath::Abs((mTrack2->fourMomentum() - mTrack3->fourMomentum()).M2()));
  94. }
  95. //_________________
  96. double MpdFemtoTriplet::qInv31() const {
  97. return TMath::Sqrt(TMath::Abs((mTrack3->fourMomentum() - mTrack1->fourMomentum()).M2()));
  98. }
  99. //_________________
  100. double MpdFemtoTriplet::mInv() const {
  101. return ( mTrack1->fourMomentum() + mTrack2->fourMomentum() + mTrack3->fourMomentum()).Mag();
  102. }
  103. //_________________
  104. double MpdFemtoTriplet::kT() const {
  105. return (mTrack1->fourMomentum() + mTrack2->fourMomentum() + mTrack3->fourMomentum()).Perp() / 3.0f;
  106. }
  107. //_________________
  108. TLorentzVector MpdFemtoTriplet::fourMomentum() const {
  109. TLorentzVector temp(mTrack1->fourMomentum() + mTrack2->fourMomentum() + mTrack3->fourMomentum());
  110. return temp;
  111. }
  112. //_________________
  113. double MpdFemtoTriplet::quality() const {
  114. double Q1 = Triplet_Quality_Calc(mTrack1, mTrack2);
  115. double Q2 = Triplet_Quality_Calc(mTrack2, mTrack3);
  116. double Q3 = Triplet_Quality_Calc(mTrack3, mTrack1);
  117. if (Q1 > Q2) {
  118. if (Q1 > Q3) return Q1;
  119. else return Q3;
  120. } else
  121. if (Q2 > Q3) return Q2;
  122. else return Q3;
  123. }
  124. //_________________
  125. double MpdFemtoTriplet::nominalTpcExitSeparation() const {
  126. TVector3 diff1 = mTrack1->nominalTpcExitPoint() - mTrack2->nominalTpcExitPoint();
  127. TVector3 diff2 = mTrack2->nominalTpcExitPoint() - mTrack3->nominalTpcExitPoint();
  128. TVector3 diff3 = mTrack3->nominalTpcExitPoint() - mTrack1->nominalTpcExitPoint();
  129. if (diff1.Mag() < diff2.Mag()) {
  130. if (diff1.Mag() < diff3.Mag()) return (diff1.Mag());
  131. else return (diff3.Mag());
  132. } else if (diff2.Mag() < diff3.Mag()) return (diff2.Mag());
  133. else return (diff3.Mag());
  134. }
  135. //_________________
  136. double MpdFemtoTriplet::nominalTpcEntranceSeparation() const {
  137. TVector3 diff1 = mTrack1->nominalTpcEntrancePoint() - mTrack2->nominalTpcEntrancePoint();
  138. TVector3 diff2 = mTrack2->nominalTpcEntrancePoint() - mTrack3->nominalTpcEntrancePoint();
  139. TVector3 diff3 = mTrack3->nominalTpcEntrancePoint() - mTrack1->nominalTpcEntrancePoint();
  140. if (diff1.Mag() < diff2.Mag()) {
  141. if (diff1.Mag() < diff3.Mag()) return (diff1.Mag());
  142. else return (diff3.Mag());
  143. } else if (diff2.Mag() < diff3.Mag()) return (diff2.Mag());
  144. else return (diff3.Mag());
  145. }
  146. //_________________
  147. double MpdFemtoTriplet::nominalTpcAverageSeparation() const {
  148. TVector3 diff1, diff2, diff3;
  149. double AveSep1 = 0.0;
  150. double AveSep2 = 0.0;
  151. double AveSep3 = 0.0;
  152. int ipt = 0;
  153. for (ipt = 0; ipt < (mTrack1->mNumberOfPoints); ipt++) {
  154. diff1 = mTrack1->nominalPosSample(ipt) - mTrack2->nominalPosSample(ipt);
  155. AveSep1 += diff1.Mag();
  156. diff2 = mTrack2->nominalPosSample(ipt) - mTrack3->nominalPosSample(ipt);
  157. AveSep2 += diff2.Mag();
  158. diff3 = mTrack3->nominalPosSample(ipt) - mTrack1->nominalPosSample(ipt);
  159. AveSep3 += diff3.Mag();
  160. }
  161. AveSep1 = AveSep1 / (mTrack1->mNumberOfPoints);
  162. AveSep2 = AveSep1 / (mTrack1->mNumberOfPoints);
  163. AveSep3 = AveSep1 / (mTrack1->mNumberOfPoints);
  164. if (AveSep1 < AveSep2) {
  165. if (AveSep1 < AveSep3) return (AveSep1);
  166. else return (AveSep3);
  167. } else if (AveSep2 < AveSep3) return (AveSep2);
  168. else return (AveSep3);
  169. }
  170. ClassImp(MpdFemtoTriplet)