00001
00008
00009
00010
00011
00012
00013
00014 #include "StV0TofCorrection.h"
00015 #include "TError.h"
00016
00017 Float_t *PathAB;
00018 Float_t *TofAB;
00019 const Float_t low_lims[3] = {0.015,0.2,0.8085};
00020 const Float_t upp_lims[3] = {0.025,0.3,1.15};
00021
00022 ClassImp(StV0TofCorrection)
00023 StV0TofCorrection::StV0TofCorrection() {
00024 clight = 29.9792458;
00025 NrDecays = 0;
00026 cleared = kTRUE;
00027 cleared2 = kTRUE;
00028 Vectors3D = NULL;
00029 tracks = NULL;
00030 }
00031 StV0TofCorrection::~StV0TofCorrection() { }
00032
00034 inline Float_t StV0TofCorrection::calcTof(StLorentzVectorD trackAB, Float_t PathAB) {
00035 StThreeVectorD mom = trackAB.vect();
00036 Float_t MomentumAB = TMath::Sqrt(mom.x()*mom.x()+mom.y()*mom.y()+mom.z()*mom.z());
00037 Float_t BetaAB = MomentumAB/trackAB.e();
00038 return PathAB / (BetaAB*clight);
00039 }
00040
00043 Float_t StV0TofCorrection::calcPathOnHelixToPoint(StPhysicalHelixD helixA, StThreeVectorD space_vec) {
00044 Float_t pA[2] = {0.0,-100.0};
00045 Float_t distarray[2];
00046 StThreeVectorD testA;
00047 for(Int_t r = 0; r < 2; r++) {
00048 testA = helixA.at(pA[r]);
00049 distarray[r] = (testA-space_vec).mag();
00050 }
00051 Int_t loopcounter = 0;
00052 Float_t scale = 1.0;
00053 Float_t flip = 1.0;
00054 Float_t scale_length = 100.0;
00055
00056 while(fabs(scale_length) > 0.05 && loopcounter < 100) {
00057 if(distarray[0] > distarray[1]) {
00058 if(loopcounter != 0) {
00059
00060 if(flip == 1.0) scale = 0.4;
00061 else scale = 0.7;
00062 }
00063 scale_length = (pA[1]-pA[0])*scale;
00064 pA[0] = pA[1] + scale_length;
00065 testA = helixA.at(pA[0]);
00066 distarray[0] = (testA-space_vec).mag();
00067 flip = 1.0;
00068 }
00069 else {
00070 if(loopcounter != 0) {
00071 if(flip == -1.0) scale = 0.4;
00072 else scale = 0.7;
00073 }
00074 scale_length = (pA[0]-pA[1])*scale;
00075 pA[1] = pA[0] + scale_length;
00076 testA = helixA.at(pA[1]);
00077 distarray[1] = (testA-space_vec).mag();
00078 flip = -1.0;
00079 }
00080 loopcounter++;
00081 }
00082
00083 if(distarray[0] < distarray[1]) return pA[0];
00084 else return pA[1];
00085 }
00086
00087
00089 Float_t StV0TofCorrection::calcPathCorr(StPhysicalHelixD helixA, StThreeVectorD vectorAB, StThreeVectorD vectorTof) {
00090 Float_t path_tof = calcPathOnHelixToPoint(helixA,vectorTof);
00091 Float_t path_dec = calcPathOnHelixToPoint(helixA,vectorAB);
00092 return path_tof-path_dec;
00093 }
00094
00096 inline Bool_t StV0TofCorrection::inputOk() {
00097 if ( Vectors3D != NULL ) {
00098 if ( tracks != NULL ) {
00099 if ( (Vectors3D->getNrArgs()-2) == (tracks->getNrArgs()) )
00100 return kTRUE;
00101 else {
00102 Error("StV0TofCorrection::correctBeta","number of 3d-vectors not consistent to number of tracks!");
00103 return kFALSE;
00104 }
00105 }
00106 else {
00107 Error("StV0TofCorrection::correctBeta","You forgot to call setMotherTracks()!");
00108 return kFALSE;
00109 }
00110 }
00111 else {
00112 Error("StV0TofCorrection::correctBeta","You forgot to call setVectors3D()!");
00113 return kFALSE;
00114 }
00115 }
00116
00119 inline Bool_t StV0TofCorrection::cutOnMass2(Float_t Mass2, Int_t pidnr) {
00120 if ( Mass2 > low_lims[pidnr] && Mass2 < upp_lims[pidnr] )
00121 return kTRUE;
00122 else return kFALSE;
00123 }
00124
00126 Bool_t StV0TofCorrection::correctBeta(StPhysicalHelixD helixA, Float_t TofA, Float_t& BetaCorr, Float_t MomentumA, Int_t pidnr) {
00127 if ( inputOk() ) {
00128 setNrDecays(Vectors3D->getNrArgs()-2);
00129 PathAB = new Float_t[NrDecays]; TofAB = new Float_t[NrDecays];
00130 Float_t TofCorr = TofA;
00131 for ( Int_t i=0; i < NrDecays; i++ ) {
00132
00133 PathAB[i] = ( (*Vectors3D)[i+1] - (*Vectors3D)[i] ).mag();
00134 TofAB[i] = calcTof((*tracks)[i], PathAB[i]);
00135 TofCorr -= TofAB[i];
00136 }
00137 Float_t PathCorr = calcPathCorr(helixA,(*Vectors3D)[NrDecays],(*Vectors3D)[NrDecays+1]);
00138 BetaCorr = PathCorr / (TofCorr*clight);
00139 if ( pidnr > -1 ) {
00140
00141 Float_t Mass2Corr = MomentumA * MomentumA * (1./(BetaCorr*BetaCorr)-1.);
00142 return cutOnMass2(Mass2Corr,pidnr);
00143 }
00144 else return kTRUE;
00145 }
00146 else {
00147 Error("StV0TofCorrection::correctBeta","check your Input!! BetaCorr set to -998.!");
00148 BetaCorr = -998.;
00149 return kFALSE;
00150 }
00151 }
00152