00001 #include "StNuclei.h"
00002 #include "StRareTrack.h"
00003 #include "StEventTypes.h"
00004 #include <stdlib.h>
00005 ClassImp(StNuclei)
00006
00007 StNuclei::StNuclei(float plow,float phigh, int charge, int mass){
00008 pcut[0] = plow;
00009 pcut[1] = phigh;
00010 chargeToAccept = charge;
00011 minMass = mass;
00012 }
00013
00014 int StNuclei::Accept(StPrimaryTrack* trk){
00015 int iret = 0;
00016 int chargeOK = 0;
00017 int dedxOK = 0;
00018 int pOK=0;
00019 StRareTrack track(trk);
00020 if (chargeToAccept==0) {chargeOK = 1;}
00021 else if (chargeToAccept<0 && track.chargesign()<0) {chargeOK=1;}
00022 else if (chargeToAccept>0 && track.chargesign()>0) {chargeOK=1;}
00023 float dedxmin;
00024 int theCharge = 1;
00025 if (abs(chargeToAccept)>1) theCharge=2;
00026 float dedxExp =track.dedxExpected(minMass*0.939,theCharge);
00027 dedxmin = 0.6*dedxExp;
00028 float dedx = track.dedx();
00029
00030 float dedxbad;
00031 if (minMass>1) dedxbad = 1.1*track.dedxExpected((minMass-1)*0.939,theCharge);
00032 if (minMass==1) dedxbad = 1.1*track.dedxExpected(0.494,1);
00033 if (dedx>dedxmin&&dedx>dedxbad) dedxOK=1;
00034 float random_number = (float)rand()/(float)RAND_MAX;
00035
00036 if (random_number<0.005){dedxOK=1;}
00037 if (track.p()>pcut[0]&&track.p()<pcut[1]&&track.npntfit()>20&&track.iflag()>=0) pOK = 1;
00038
00039
00040
00041 iret = chargeOK*dedxOK*pOK;
00042 return iret;
00043 }
00044 void StNuclei::Report(){
00045 cout << "StNuclei: charge = " << chargeToAccept << endl;
00046 cout << "StNuclei: mass >= " << minMass << endl;
00047 cout << "StNuclei: momentum > " << pcut << endl;
00048 }