00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 #include "StStrangeTagsMaker.h"
00075 #include "StEvent.h"
00076 #include "StV0Vertex.h"
00077 #include "StXiVertex.h"
00078 #include "StEventTypes.h"
00079 #include "StTrack.h"
00080 #include "TMath.h"
00081 #include "PhysicalConstants.h"
00082 #include "phys_constants.h"
00083
00084 ClassImp(StStrangeTagsMaker)
00085
00086 StStrangeTagsMaker::StStrangeTagsMaker(const char *name, const char *title)
00087 : StMaker(name, title)
00088 {
00089 mEvent = 0;
00090 mTagTable = 0;
00091 }
00092
00093 StStrangeTagsMaker::~StStrangeTagsMaker()
00094 {
00095 mTagTable = 0;
00096 }
00097
00098 Int_t StStrangeTagsMaker::Init()
00099 {
00100 mRange = 0.025;
00101 m2Range = 2*mRange;
00102 mMasspi2 = pion_plus_mass_c2 * pion_plus_mass_c2;
00103 mMasspr2 = proton_mass_c2 * proton_mass_c2;
00104 mMassla2 = lambda_mass_c2 * lambda_mass_c2;
00105 mMasska2 = M_KAON_MINUS * M_KAON_MINUS;
00106
00107 return StMaker::Init();
00108 }
00109
00110 Int_t StStrangeTagsMaker::Make()
00111 {
00112 mTagTable = new StrangeTag_st;
00113 mEvent = (StEvent *) GetInputDS("StEvent");
00114 if (!mEvent) return kStOK;
00115
00116 fillTag();
00117 St_StrangeTag *StrangeTag = new St_StrangeTag("StrangeTag",1);
00118 AddData(StrangeTag);
00119 StrangeTag->AddAt(mTagTable,0);
00120 delete mTagTable; mTagTable=0;
00121 return kStOK;
00122 }
00123
00124
00125 StrangeTag_st* StStrangeTagsMaker::tag()
00126 {
00127 return mTagTable;
00128 }
00129
00130 void StStrangeTagsMaker::fillTag()
00131 {
00132 StSPtrVecV0Vertex& v0Vertices = mEvent->v0Vertices();
00133 size_t v0tot = v0Vertices.size();
00134 StSPtrVecXiVertex& xiVertices = mEvent->xiVertices();
00135 size_t castot = xiVertices.size();
00136
00137 Int_t nbelowK0 = 0;
00138 Int_t nK0 = 0;
00139 Int_t naboveK0 = 0;
00140 Int_t nbelowLa = 0;
00141 Int_t nLa = 0;
00142 Int_t naboveLa = 0;
00143 Int_t nbelowLb = 0;
00144 Int_t nLb = 0;
00145 Int_t naboveLb = 0;
00146 Int_t nbelowXi = 0;
00147 Int_t nXi = 0;
00148 Int_t naboveXi = 0;
00149 Int_t nbelowXibar = 0;
00150 Int_t nXibar = 0;
00151 Int_t naboveXibar = 0;
00152 Int_t nbelowOm = 0;
00153 Int_t nOm = 0;
00154 Int_t naboveOm = 0;
00155 Int_t nbelowOmbar = 0;
00156 Int_t nOmbar = 0;
00157 Int_t naboveOmbar = 0;
00158 Int_t nKinkPos = 0;
00159 Int_t nKinkNeg = 0;
00160
00161 Float_t perc;
00162
00163 size_t i;
00164
00165
00166 Float_t maxPtK0=0.0;
00167 Float_t maxPtLa=0.0;
00168 Float_t maxPtLb=0.0;
00169 Float_t maxPtXi=0.0;
00170 Float_t maxPtXibar=0.0;
00171 Float_t maxPtOm=0.0;
00172 Float_t maxPtOmbar=0.0;
00173 Float_t maxPtKinkPos=0.0;
00174 Float_t maxPtKinkNeg=0.0;
00175
00176
00177
00178 for (i=0; i<v0tot; i++) {
00179 StV0Vertex *vertex = v0Vertices[i];
00180 const StThreeVectorF& nMom = vertex->momentumOfDaughter(negative);
00181 const StThreeVectorF& pMom = vertex->momentumOfDaughter(positive);
00182 StThreeVectorF vMom = nMom + pMom;
00183 Float_t pN2 = nMom.mag2();
00184 Float_t pP2 = pMom.mag2();
00185 Float_t pV2 = vMom.mag2();
00186 Float_t eNpi = ::sqrt(pN2 + mMasspi2);
00187 Float_t eNpr = ::sqrt(pN2 + mMasspr2);
00188 Float_t ePpi = ::sqrt(pP2 + mMasspi2);
00189 Float_t ePpr = ::sqrt(pP2 + mMasspr2);
00190 Float_t eK0 = eNpi + ePpi;
00191 Float_t eLa = eNpi + ePpr;
00192 Float_t eLb = eNpr + ePpi;
00193 Float_t maK0 = ::sqrt(eK0*eK0 - pV2);
00194 Float_t maLa = ::sqrt(eLa*eLa - pV2);
00195 Float_t maLb = ::sqrt(eLb*eLb - pV2);
00196
00197
00198 Float_t ptV0 = TMath::Sqrt((vMom.x()*vMom.x())+(vMom.y()*vMom.y()));
00199
00200
00201 perc = (maK0/kaon_0_short_mass_c2) - 1.;
00202 if (TMath::Abs(perc) < (2.0*mRange))
00203 {
00204 nK0++;
00205 if(ptV0>maxPtK0) maxPtK0=ptV0;
00206 }
00207 else if (TMath::Abs(perc + (2.0*m2Range)) < (2.0*mRange)) nbelowK0++;
00208 else if (TMath::Abs(perc - (2.0*m2Range)) < (2.0*mRange)) naboveK0++;
00209
00210 perc = (maLa/lambda_mass_c2) - 1.;
00211 if (TMath::Abs(perc) < (0.5*mRange))
00212 {
00213 nLa++;
00214 if(ptV0>maxPtLa) maxPtLa=ptV0;
00215 }
00216 else if (TMath::Abs(perc + (0.5*m2Range)) < (0.5*mRange)) nbelowLa++;
00217 else if (TMath::Abs(perc - (0.5*m2Range)) < (0.5*mRange)) naboveLa++;
00218
00219 perc = (maLb/antilambda_mass_c2) - 1.;
00220 if (TMath::Abs(perc) < (0.5*mRange))
00221 {
00222 nLb++;
00223 if(ptV0>maxPtLb) maxPtLb=ptV0;
00224 }
00225 else if (TMath::Abs(perc + (0.5*m2Range)) < (0.5*mRange)) nbelowLb++;
00226 else if (TMath::Abs(perc - (0.5*m2Range)) < (0.5*mRange)) naboveLb++;
00227
00228 }
00229
00230
00231
00232 for (i=0; i<castot; i++) {
00233 StXiVertex *vertex = xiVertices[i];
00234 const StThreeVectorF& bMom = vertex->momentumOfBachelor();
00235 double pcharge = vertex->chargeOfBachelor();
00236 StThreeVectorF lMom = vertex->momentumOfV0();
00237 StThreeVectorF cMom = lMom + bMom;
00238 Float_t pB2 = bMom.mag2();
00239 Float_t pL2 = lMom.mag2();
00240 Float_t pC2 = cMom.mag2();
00241 Float_t epi = ::sqrt(pB2 + mMasspi2);
00242 Float_t eka = ::sqrt(pB2 + mMasska2);
00243 Float_t ela = ::sqrt(pL2 + mMassla2);
00244 Float_t eXi = ela + epi;
00245 Float_t maXi = ::sqrt(eXi*eXi - pC2);
00246 Float_t eOm = ela + eka;
00247 Float_t maOm = ::sqrt(eOm*eOm - pC2);
00248
00249 Float_t ptCas = TMath::Sqrt((cMom.x()*cMom.x())+(cMom.y()*cMom.y()));
00250 perc = (maXi/xi_minus_mass_c2) - 1.;
00251
00252 if(pcharge<0)
00253 {
00254 if (TMath::Abs(perc) < mRange)
00255 {
00256 nXi++;
00257 if(ptCas>maxPtXi) maxPtXi=ptCas;
00258 }
00259 else if (TMath::Abs(perc + m2Range) < mRange) nbelowXi++;
00260 else if (TMath::Abs(perc - m2Range) < mRange) naboveXi++;
00261 }
00262 else
00263 {
00264 if (TMath::Abs(perc) < mRange)
00265 {
00266 nXibar++;
00267 if(ptCas>maxPtXibar) maxPtXibar=ptCas;
00268 }
00269 else if (TMath::Abs(perc + m2Range) < mRange) nbelowXibar++;
00270 else if (TMath::Abs(perc - m2Range) < mRange) naboveXibar++;
00271 }
00272
00273
00274 perc = (maOm/M_OMEGA_MINUS) - 1.;
00275 if(pcharge<0)
00276 {
00277 if (TMath::Abs(perc) < mRange)
00278 {
00279 nOm++;
00280 if(ptCas>maxPtOm) maxPtOm=ptCas;
00281 }
00282 else if (TMath::Abs(perc + m2Range) < mRange) nbelowOm++;
00283 else if (TMath::Abs(perc - m2Range) < mRange) naboveOm++;
00284 }
00285 else
00286 {
00287 if (TMath::Abs(perc) < mRange)
00288 {
00289 nOmbar++;
00290 if(ptCas>maxPtOmbar) maxPtOmbar=ptCas;
00291 }
00292 else if (TMath::Abs(perc + m2Range) < mRange) nbelowOmbar++;
00293 else if (TMath::Abs(perc - m2Range) < mRange) naboveOmbar++;
00294 }
00295
00296
00297 }
00298
00299
00300 StSPtrVecKinkVertex& kinkVertices = mEvent->kinkVertices();
00301 for(StSPtrVecKinkVertexIterator i=kinkVertices.begin();i != kinkVertices.end();i++){
00302 StTrack* parentTrack=(*i)->parent();
00303 Int_t charge = parentTrack->geometry()->charge();
00304 Float_t ptKink = parentTrack->geometry()->momentum().perp();
00305 if(charge > 0){
00306 nKinkPos++;
00307 if(ptKink > maxPtKinkPos) maxPtKinkPos = ptKink;
00308 }
00309 else if (charge < 0){
00310 nKinkNeg++;
00311 if(ptKink > maxPtKinkNeg) maxPtKinkNeg = ptKink;
00312 }
00313 }
00314
00315 mTagTable->NV0 = v0tot;
00316 mTagTable->NbelowK0 = nbelowK0;
00317 mTagTable->NK0 = nK0;
00318 mTagTable->NaboveK0 = naboveK0;
00319 mTagTable->NbelowLa = nbelowLa;
00320 mTagTable->NLa = nLa;
00321 mTagTable->NaboveLa = naboveLa;
00322 mTagTable->NbelowLb = nbelowLb;
00323 mTagTable->NLb = nLb;
00324 mTagTable->NaboveLb = naboveLb;
00325 mTagTable->NbelowXi = nbelowXi;
00326 mTagTable->NXi = nXi;
00327 mTagTable->NaboveXi = naboveXi;
00328 mTagTable->NbelowXibar = nbelowXibar;
00329 mTagTable->NXibar = nXibar;
00330 mTagTable->NaboveXibar = naboveXibar;
00331 mTagTable->NbelowOm = nbelowOm;
00332 mTagTable->NOm = nOm;
00333 mTagTable->NaboveOm = naboveOm;
00334 mTagTable->NbelowOmbar = nbelowOmbar;
00335 mTagTable->NOmbar = nOmbar;
00336 mTagTable->NaboveOmbar = naboveOmbar;
00337
00338 mTagTable->MaxPtK0 = maxPtK0;
00339 mTagTable->MaxPtLa = maxPtLa;
00340 mTagTable->MaxPtLb = maxPtLb;
00341 mTagTable->MaxPtXi = maxPtXi;
00342 mTagTable->MaxPtXibar = maxPtXibar;
00343 mTagTable->MaxPtOm = maxPtOm;
00344 mTagTable->MaxPtOmbar = maxPtOmbar;
00345
00346 mTagTable->range = mRange;
00347
00348 mTagTable->NKinkPos = nKinkPos;
00349 mTagTable->NKinkNeg = nKinkNeg;
00350 mTagTable->MaxPtKinkPos = maxPtKinkPos;
00351 mTagTable->MaxPtKinkNeg = maxPtKinkNeg;
00352
00353 }
00354
00355 void StStrangeTagsMaker::printTag(ostream& os)
00356 {
00357 os << "--- Strangeness Tag Table ---" << endl;
00358 if (!mTagTable)
00359 os << "(empty)" << endl;
00360 else {
00361 os << "Range used: +/-" << mTagTable->range << " * M" << endl;
00362 os << "No. V0's: " << mTagTable->NV0 << endl;
00363 os << "No. K0's: " << mTagTable->NK0 << endl;
00364 os << "No. La's: " << mTagTable->NLa << endl;
00365 os << "No. Lb's: " << mTagTable->NLb << endl;
00366 os << "No. Xi's: " << mTagTable->NXi << endl;
00367 os << "No. Xibar's: " << mTagTable->NXi << endl;
00368 os << "No. Om's: " << mTagTable->NOm << endl;
00369 os << "No. Ombar's: " << mTagTable->NOmbar << endl;
00370 os << "Backgrounds: (same bin size)" << endl;
00371 os << "No. below K0's: " << mTagTable->NbelowK0 << endl;
00372 os << "No. above K0's: " << mTagTable->NaboveK0 << endl;
00373 os << "No. below La's: " << mTagTable->NbelowLa << endl;
00374 os << "No. above La's: " << mTagTable->NaboveLa << endl;
00375 os << "No. below Lb's: " << mTagTable->NbelowLb << endl;
00376 os << "No. above Lb's: " << mTagTable->NaboveLb << endl;
00377 os << "No. below Xi's: " << mTagTable->NbelowXi << endl;
00378 os << "No. above Xi's: " << mTagTable->NaboveXi << endl;
00379 os << "No. below Xibar's: " << mTagTable->NbelowXibar << endl;
00380 os << "No. above Xibar's: " << mTagTable->NaboveXibar << endl;
00381 os << "No. below Om's: " << mTagTable->NbelowOm << endl;
00382 os << "No. above Om's: " << mTagTable->NaboveOm << endl;
00383 os << "No. below Ombar's: " << mTagTable->NbelowOmbar << endl;
00384 os << "No. above Ombar's: " << mTagTable->NaboveOmbar << endl;
00385 os << "Rare probe tags: (same ranges)" << endl;
00386 os << "max Pt K0: " << mTagTable->MaxPtK0 << endl;
00387 os << "max Pt La: " << mTagTable->MaxPtLa << endl;
00388 os << "max Pt Lb: " << mTagTable->MaxPtLb << endl;
00389 os << "max Pt Xi: " << mTagTable->MaxPtXi << endl;
00390 os << "max Pt Xibar: " << mTagTable->MaxPtXibar << endl;
00391 os << "max Pt Om: " << mTagTable->MaxPtOm << endl;
00392 os << "max Pt Ombar: " << mTagTable->MaxPtOmbar << endl;
00393 }
00394 }