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
00052 #include <Stiostream.h>
00053 #include "StPeCPair.h"
00054 #include "StEventTypes.h"
00055
00056 ClassImp(StPeCPair)
00057
00058 StPeCPair::StPeCPair() {
00059 }
00060
00061 StPeCPair::~StPeCPair() {
00062 }
00063
00064 void StPeCPair::Clear(const char *) {
00065 pCharge=0;
00066 pPt=0.;
00067 pPz =0.;
00068 pPsi =0.;
00069 pAngle =0.;
00070 pXyAngle =0.;
00071 pPtArm =0.;
00072 pAlpha =0.;
00073 pPartDca =0.;
00074 pV0Dca =0.;
00075 rV0 =0.;
00076 phiV0 =0.;
00077 zV0 =0.;
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 track1=NULL;
00089 track2=NULL;
00090 muTrack1=NULL;
00091 muTrack2=NULL;
00092 }
00093
00094 #ifndef __CINT__
00095 StPeCPair::StPeCPair ( StTrack* trk1, StTrack* trk2,
00096 Bool_t primaryFlag, StEvent* event ) {
00097 this->Clear();
00098 if(trk1->geometry()->charge() < 0 && trk2->geometry()->charge()>0 ) {
00099 track1 = trk2;
00100 track2 = trk1;
00101 } else {
00102 track1 = trk1;
00103 track2 = trk2;
00104 }
00105 muTrack1=0;
00106 muTrack2=0;
00107 fill ( primaryFlag, event ) ;
00108 }
00109
00110 StPeCPair::StPeCPair ( StMuTrack* trk1, StMuTrack* trk2,
00111 Bool_t primaryFlag, StMuEvent* event ) {
00112 this->Clear();
00113 if (trk1->charge() <0 && trk2->charge() >0 ) {
00114 muTrack1 = trk2;
00115 muTrack2 = trk1;
00116 } else {
00117 muTrack1 = trk1;
00118 muTrack2 = trk2;
00119 }
00120 track1=0;
00121 track2=0;
00122 fill ( primaryFlag, event ) ;
00123 }
00124
00125
00126
00127 void StPeCPair::setTrack1(StTrack* trk) {
00128 track1 = trk;
00129 }
00130 void StPeCPair::setTrack2(StTrack* trk) {
00131 track2 = trk;
00132 }
00133
00134 void StPeCPair::setTrack1(StMuTrack* trk) {
00135 muTrack1 = trk;
00136 }
00137 void StPeCPair::setTrack2(StMuTrack* trk) {
00138 muTrack2 = trk;
00139 }
00140
00141 StTrack* StPeCPair::getTrack1() { return track1; }
00142 StTrack* StPeCPair::getTrack2() { return track2; }
00143
00144 StMuTrack* StPeCPair::getMuTrack1() { return muTrack1; }
00145 StMuTrack* StPeCPair::getMuTrack2() { return muTrack2; }
00146
00147 StLorentzVectorF StPeCPair::getPair4Momentum(StPeCSpecies pid) const{
00148 StLorentzVectorF p4pair(0.0,0.0,0.0,0.0);
00149 if ( pid == 0 ) return pionH.Mom4 ;
00150 else if ( pid == 1 ) return kaonH.Mom4 ;
00151 else if ( pid == 2 ) return protonH.Mom4 ;
00152 else if ( pid == 3 ) return electronH.Mom4 ;
00153 else if ( pid == 4 ) return muonH.Mom4 ;
00154 else {
00155 printf ( "StPeCPair::getPair4Momentum: wrong pid %d \n", pid ) ;
00156 return p4pair ;
00157 }
00158 }
00159 #endif
00160
00161
00162
00163 Int_t StPeCPair::fill ( Bool_t primaryFlag, StEventSummary* summary,
00164 StThreeVectorF& p1, StPhysicalHelixD& h1, short charge1,
00165 StThreeVectorF& p2, StPhysicalHelixD& h2, short charge2,
00166 StThreeVectorF& primaryVertexPosition ) {
00167
00168
00169
00170
00171
00172 pPartDca = 0. ;
00173 pV0Dca = 0. ;
00174 rV0 = 0. ;
00175 phiV0 = 0. ;
00176 zV0 = 0. ;
00177
00178
00179 pairD dcaLengths ;
00180 dcaLengths = h1.pathLengths(h2);
00181
00182 Float_t bField ;
00183 if ( summary != 0 ) bField = summary->magneticField();
00184 else bField = 2.5 ;
00185
00186
00187 if ( !primaryFlag ) {
00188 p1 = h1.momentumAt(dcaLengths.first, tesla*bField*0.1 ) ;
00189 p2 = h2.momentumAt(dcaLengths.second, tesla*bField*0.1 ) ;
00190 }
00191
00192 StThreeVectorD x1 = h1.at(dcaLengths.first);
00193 StThreeVectorD x2 = h2.at(dcaLengths.second);
00194 StThreeVectorD x = (x1-x2) ;
00195 pPartDca = x.mag();
00196
00197
00198
00199
00200 StThreeVectorD xMean = (x1+x2)/2. ;
00201 rV0 = xMean.perp();
00202 phiV0 = xMean.phi();
00203 zV0 = xMean.z();
00204
00205 StThreeVectorD pSum = p1+p2 ;
00206 StPhysicalHelixD v0Helix ( pSum, xMean, 0.1*bField/tesla, 100000./GeV ) ;
00207 pV0Dca = v0Helix.distance ( primaryVertexPosition ) ;
00208
00209 StThreeVectorF p = p1 + p2 ;
00210 pPt = p.perp() ;
00211 pPz = p.z() ;
00212 pPsi = p.phi();
00213
00214
00215 Float_t ScalarProduct = p1*p2;
00216 Float_t Denominator = p1.mag()*p2.mag();
00217 if(Denominator) {
00218 pAngle = acos(ScalarProduct/Denominator);
00219 }else{
00220 pAngle = -999;
00221 }
00222 if (p1.perp() * p2.perp()) {
00223 pXyAngle = acos((p1.x()*p2.x()+p1.y()*p2.y())/p1.perp()/p2.perp());
00224 } else {
00225 pXyAngle = -999;
00226 }
00227
00228
00229
00230 Float_t p1AlongPtot = p*p1/p.mag() ;
00231 Float_t p2AlongPtot = p*p2/p.mag() ;
00232
00233 Float_t pt1Ptot = ::sqrt(p1.mag()*p1.mag()-p1AlongPtot*p1AlongPtot);
00234
00235 pPtArm = pt1Ptot ;
00236 pAlpha = (p1AlongPtot-p2AlongPtot)/(p1AlongPtot+p2AlongPtot);
00237
00238
00239
00240
00241
00242
00243 Float_t mptcle=0.0;
00244
00245
00246
00247 Float_t mInv, cosThetaStar ;
00248 StLorentzVectorF FourMomentum ;
00249 StPeCSpec* species ;
00250 for ( int i = 0 ; i < nSpecies ; i++ )
00251 {
00252 if ( i == pion ) {
00253 mptcle = pion_plus_mass_c2;
00254 species = &pionH ;
00255 }
00256 else if ( i == kaon ) {
00257 mptcle = 493.677*MeV;
00258 species = &kaonH ;
00259 }
00260 else if ( i == proton ) {
00261 mptcle = proton_mass_c2;
00262 species = &protonH ;
00263 }
00264 else if ( i == electron ) {
00265 mptcle = electron_mass_c2;
00266 species = &electronH ;
00267 }
00268 else if ( i == muon ) {
00269 mptcle = 105.6584*MeV;
00270 species = &muonH ;
00271 }
00272 else {
00273 printf ( "StPecPair:calculatePair4Momentum; wrong pid %d \n", i ) ;
00274 continue ;
00275 }
00276
00277 StLorentzVectorF p4pair(0.0,0.0,0.0,0.0);
00278 Float_t e1 = p1.massHypothesis(mptcle);
00279 Float_t e2 = p2.massHypothesis(mptcle);
00280 StLorentzVectorF pf1(e1,p1);
00281 StLorentzVectorF pf2(e2,p2);
00282 p4pair = pf1 + pf2;
00283 FourMomentum = p4pair ;
00284 mInv = p4pair.m() ;
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299 StThreeVectorF sp = -1.0*p4pair.vect();
00300 p4pair.setVect(sp);
00301 pf1 = pf1.boost(p4pair);
00302 pf2 = pf2.boost(p4pair);
00303 Float_t d1th = pf1.cosTheta();
00304 Float_t d2th = pf2.cosTheta();
00305
00306 if( d1th > 0 ) cosThetaStar = d1th;
00307 else cosThetaStar = d2th;
00308
00309 species->pid = i ;
00310 species->mInv = mInv ;
00311 species->yRap = FourMomentum.rapidity() ;
00312 species->Mom4 = FourMomentum ;
00313 species->cosThetaStar = cosThetaStar ;
00314 }
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 return 0 ;
00334 }
00335
00336
00337
00338
00339 Int_t StPeCPair::fill ( Bool_t primaryFlag, StMuEvent* event ) {
00340
00341 pCharge = muTrack1->charge()+muTrack2->charge();
00342
00343 StThreeVectorF p1 ;
00344 StThreeVectorF p2 ;
00345 StPhysicalHelixD h1 ;
00346 StPhysicalHelixD h2 ;
00347 short charge1, charge2 ;
00348
00349 p1 = muTrack1->momentum();
00350 p2 = muTrack2->momentum();
00351 charge1 = muTrack1->charge();
00352 charge2 = muTrack2->charge();
00353 h1 = muTrack1->helix() ;
00354 h2 = muTrack2->helix() ;
00355
00356 StThreeVectorF vtx = event->primaryVertexPosition() ;
00357
00358 fill ( primaryFlag, &(event->eventSummary()),
00359 p1, h1, charge1, p2, h2, charge2, vtx ) ;
00360
00361 #ifndef __CINT__
00362 tr1.set(1,muTrack1);
00363 tr2.set(1,muTrack2);
00364 #endif
00365 return 0 ;
00366
00367 }
00368 Int_t StPeCPair::fill ( Bool_t primaryFlag, StEvent* event ) {
00369
00370 pCharge = track1->geometry()->charge()+track2->geometry()->charge();
00371
00372 StThreeVectorF p1 ;
00373 StThreeVectorF p2 ;
00374 StPhysicalHelixD h1 ;
00375 StPhysicalHelixD h2 ;
00376 short charge1, charge2 ;
00377
00378 p1 = track1->geometry()->momentum();
00379 p2 = track2->geometry()->momentum();
00380 charge1 = track1->geometry()->charge();
00381 charge2 = track2->geometry()->charge();
00382
00383 h1 = track1->geometry()->helix() ;
00384 h2 = track2->geometry()->helix() ;
00385
00386
00387 StEventSummary* summary = 0 ;
00388 StPrimaryVertex* vtx = 0;
00389 vtx = event->primaryVertex();
00390 summary = event->summary();
00391 StThreeVectorF vtxP ;
00392
00393
00394
00395 if ( vtx ) {
00396 vtxP = vtx->position() ;
00397 } else {
00398 vtxP.setX(0.);
00399 vtxP.setY(0.);
00400 vtxP.setZ(0.);
00401 }
00402
00403 fill ( primaryFlag, summary, p1, h1, charge1, p2, h2, charge2, vtxP ) ;
00404
00405
00406 #ifndef __CINT__
00407 tr1.set(1,track1);
00408 tr2.set(1,track2);
00409 #endif
00410 return 0 ;
00411 }
00412
00413
00414 Int_t StPeCPair::getSumCharge() const{
00415 return pCharge ;
00416 }
00417
00418 Float_t StPeCPair::getSumPt() const{
00419 return pPt ;
00420 }
00421
00422 Float_t StPeCPair::getSumPz() const{
00423 return pPz ;
00424 }
00425
00426 Float_t StPeCPair::getMInv(StPeCSpecies pid) const{
00427 if ( pid == 0 ) return pionH.mInv ;
00428 else if ( pid == 1 ) return kaonH.mInv ;
00429 else if ( pid == 2 ) return protonH.mInv ;
00430 else if ( pid == 3 ) return electronH.mInv ;
00431 else if ( pid == 4 ) return muonH.mInv ;
00432 else {
00433 printf ( "StPeCPair::getMInv: wrong pid %d \n", pid ) ;
00434 return 0 ;
00435 }
00436 }
00437
00438 Float_t StPeCPair::getOpeningAngle() const{
00439 return pAngle ;
00440 }
00441 Float_t StPeCPair::getCosThetaStar(StPeCSpecies pid) const{
00442 if ( pid == 0 ) return pionH.cosThetaStar ;
00443 else if ( pid == 1 ) return kaonH.cosThetaStar ;
00444 else if ( pid == 2 ) return protonH.cosThetaStar ;
00445 else if ( pid == 3 ) return electronH.cosThetaStar ;
00446 else if ( pid == 4 ) return muonH.cosThetaStar ;
00447 else {
00448 printf ( "StPeCPair::getCosThetaStar: wrong pid %d \n", pid ) ;
00449 return 0 ;
00450 }
00451 }
00452
00453