00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "StHbtMaker/ThCorrFctn/StHbtEvtGenPair.h"
00017 #include "StHbtMaker/ThCorrFctn/StHbtEvtGenHiddenInfo.hh"
00018 #include "StHbtMaker/Infrastructure/StHbtParticle.hh"
00019
00020 #include "TRandom.h"
00021 #include "TMath.h"
00022
00023 ClassImp(StHbtEvtGenPair)
00024
00025 StHbtEvtGenPair::StHbtEvtGenPair(short aDecoralate) :
00026 StHbtThPair(),mDecoralate(aDecoralate) {
00027 if(mDecoralate==2){
00028 mNStoredPos=100;
00029 mPosArray1 = new StHbtLorentzVector[mNStoredPos];
00030 mValidPos1 = new short[mNStoredPos];
00031 mPosArray2 = new StHbtLorentzVector[mNStoredPos];
00032 mValidPos2 = new short[mNStoredPos];
00033 for(int ti=0; ti< mNStoredPos; ti++){
00034 mValidPos1[ti]=0;
00035 mValidPos2[ti]=0;
00036 }
00037 }
00038 }
00039
00040 StHbtEvtGenPair::~StHbtEvtGenPair(){
00041 if(mDecoralate==2){
00042 delete[] mPosArray1;
00043 delete[] mValidPos1;
00044 delete[] mPosArray2;
00045 delete[] mValidPos2;
00046 }
00047 }
00048
00049 void StHbtEvtGenPair::setVariables(const StHbtPair* aPair){
00050 double tTimeShift = 3.75;
00051 double SpaceShift = -4.21; if(SpaceShift){};
00052
00053 StHbtEvtGenHiddenInfo* tEvtGenHiddenInfoV[2];
00054 tEvtGenHiddenInfoV[0] =
00055 (StHbtEvtGenHiddenInfo*)(aPair->track1()->getHiddenInfo());
00056 tEvtGenHiddenInfoV[1] =
00057 (StHbtEvtGenHiddenInfo*)(aPair->track2()->getHiddenInfo());
00058
00059 mMomentum1=tEvtGenHiddenInfoV[0]->getFreezeOutMomEn();
00060 mMomentum2=tEvtGenHiddenInfoV[1]->getFreezeOutMomEn();
00061
00062 for(int ti=0; ti<2; ti++){
00063 StHbtEvtGenHiddenInfo* tEvtGenHiddenInfo = tEvtGenHiddenInfoV[ti];
00064
00065 if(tEvtGenHiddenInfo->posHaveNotBeenModified()){
00066 StHbtLorentzVector* tEmPoint=tEvtGenHiddenInfo->getEmPoint();
00067
00068 switch(mDecoralate){
00069 case 1:
00070 {
00071 static TRandom tRand;
00072 double tR = tEmPoint->perp();
00073 double tPhi = tRand.Rndm()*2.*TMath::Pi();
00074 tEmPoint->setX(tR*cos(tPhi));
00075 tEmPoint->setY(tR*sin(tPhi));
00076 break;
00077 }
00078 case 2:
00079 {
00080 static TRandom tRand;
00081 static StHbtLorentzVector tVect;
00082 int tIndex = (int)(tRand.Rndm()*mNStoredPos);
00083 StHbtLorentzVector* tPosArray;
00084 short* tValidPos;
00085 if(ti==0){
00086 tPosArray = mPosArray1;
00087 tValidPos = mValidPos1;
00088 }
00089 else{
00090 tPosArray = mPosArray2;
00091 tValidPos = mValidPos2;
00092 }
00093 if(tValidPos[tIndex]==0){
00094 tPosArray[tIndex]=(*tEmPoint);
00095 tValidPos[tIndex]=1;
00096 }
00097 else{
00098 tVect = (*tEmPoint);
00099 (*tEmPoint) = tPosArray[tIndex];
00100 tPosArray[tIndex] = tVect;
00101 }
00102 break;
00103 }
00104 case 3:
00105 {
00106 if(ti==1) tEmPoint->setT(tEmPoint->t()+tTimeShift/mMomentum2->e()*
00107 mMomentum2->mt());
00108 break;
00109 }
00110 case 4:
00111 {
00112 static TRandom tRand;
00113 double tR = tEmPoint->perp();
00114 double tPhi = tRand.Rndm()*2.*TMath::Pi();
00115 tEmPoint->setX(tR*cos(tPhi));
00116 tEmPoint->setY(tR*sin(tPhi));
00117 if(ti==1) tEmPoint->setT(tEmPoint->t()+tTimeShift/mMomentum2->e()*
00118 mMomentum2->mt());
00119 break;
00120 }
00121 case 5:
00122 {
00123 static TRandom tRand;
00124 static double sigma=9.0;
00125 static double mu=3.0;
00126 double mRandVar[3];
00127 if (ti==0)
00128 {
00129 tEmPoint->setX(0.0);
00130 tEmPoint->setY(0.0);
00131 tEmPoint->setZ(0.0);
00132 tEmPoint->setT(0.0);
00133 }
00134 else
00135 {
00136 mRandVar[0] = tRand.Gaus(0.,1.);
00137 mRandVar[1] = tRand.Gaus(0.,1.);
00138 mRandVar[2] = tRand.Gaus(0.,1.);
00139
00140
00141 double tPx = mMomentum1->x()+mMomentum2->x();
00142 double tPy = mMomentum1->y()+mMomentum2->y();
00143 double tPz = mMomentum1->z()+mMomentum2->z();
00144 double tE = mMomentum1->e()+mMomentum2->e();
00145 double tPt = tPx*tPx + tPy*tPy;
00146
00147 double tMt = tE*tE - tPz*tPz;
00148
00149
00150 double tM = ::sqrt(tMt - tPt);
00151 tMt = ::sqrt(tMt);
00152 tPt = ::sqrt(tPt);
00153
00154 double tROut = mRandVar[0]*sigma+mu;
00155 double tRSide = mRandVar[1]*sigma;
00156 double ttz = mRandVar[2]*sigma;
00157 double ttt = tROut;
00158
00159
00160
00161 tROut *= (tMt/tM);
00162 ttt *= (tPt/tM);
00163 double ttDTime = ttt;
00164 ttt += (tPz/tE*ttz);
00165 ttt *= (tE/tMt);
00166 ttz += (tPz/tE*ttDTime);
00167 ttz *= (tE/tMt);
00168
00169 tPx /= tPt;
00170 tPy /= tPt;
00171
00172 tEmPoint->setX(tROut*tPx-tRSide*tPy);
00173 tEmPoint->setY(tROut*tPy+tRSide*tPx);
00174 tEmPoint->setZ(ttz);
00175 tEmPoint->setT(ttt);
00176 }
00177 break;
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187 }
00188 tEvtGenHiddenInfo->setPosHaveBeenModified();
00189 }
00190 }
00191 mEmPoint1 = tEvtGenHiddenInfoV[0]->getEmPoint();
00192 mEmPoint2 = tEvtGenHiddenInfoV[1]->getEmPoint();
00193 mPid1=tEvtGenHiddenInfoV[0]->getPdgPid();
00194 mPid2=tEvtGenHiddenInfoV[1]->getPdgPid();
00195
00196 mMomParCalculated=0;
00197 mPosParCalculated=0;
00198
00199 mMeasPair=aPair;
00200 mWeightOk=false;
00201 }
00202