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
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 #include "StHbtMaker/Reader/StStandardHbtEventReader.h"
00156 #include "StChain.h"
00157
00158
00159 #include "StEvent.h"
00160 #include "StEventTypes.h"
00161 #include "StEventUtilities/StuRefMult.hh"
00162 #include "StEventSummary.h"
00163 #include "StGlobalTrack.h"
00164 #include "StTrackNode.h"
00165 #include "StContainers.h"
00166 #include "StPrimaryVertex.h"
00167 #include "StVertex.h"
00168 #include "StMeasuredPoint.h"
00169 #include "StDedxPidTraits.h"
00170 #include "StTrackPidTraits.h"
00171 #include "StTrackGeometry.h"
00172 #include "StTrackDetectorInfo.h"
00173 #include "StParticleTypes.hh"
00174 #include "StTpcDedxPidAlgorithm.h"
00175 #include "StHit.h"
00176 #include "StEventInfo.h"
00177
00178 #include <math.h>
00179
00180
00181 #include "SystemOfUnits.h"
00182 #include "StHbtMaker/Infrastructure/StHbtTrackCollection.hh"
00183 #include "StHbtMaker/Infrastructure/StHbtV0Collection.hh"
00184 #include "StHbtMaker/Infrastructure/StHbtXiCollection.hh"
00185 #include "StHbtMaker/Infrastructure/StHbtKinkCollection.hh"
00186 #include "StHbtMaker/Infrastructure/StHbtEvent.hh"
00187 #include "StHbtMaker/Base/StHbtEventCut.h"
00188 #include "StHbtMaker/Base/StHbtTrackCut.h"
00189 #include "StHbtMaker/Base/StHbtV0Cut.h"
00190 #include "StHbtMaker/Base/StHbtXiCut.h"
00191 #include "StHbtMaker/Base/StHbtKinkCut.h"
00192 #include "StStrangeMuDstMaker/StStrangeMuDstMaker.h"
00193 #include "StStrangeMuDstMaker/StV0MuDst.hh"
00194 #include "StStrangeMuDstMaker/StXiMuDst.hh"
00195 #include "StStrangeMuDstMaker/StKinkMuDst.hh"
00196
00197 #include "StEventMaker/StEventMaker.h"
00198
00199 #include "StFlowMaker/StFlowMaker.h"
00200 #include "StFlowMaker/StFlowEvent.h"
00201 #include "StFlowAnalysisMaker/StFlowAnalysisMaker.h"
00202 #include "StFlowMaker/StFlowSelection.h"
00203
00204
00205
00206 #ifdef __ROOT__
00207 ClassImp(StStandardHbtEventReader)
00208 #endif
00209
00210 #if !(ST_NO_NAMESPACES)
00211 using namespace units;
00212 #endif
00213
00214
00215
00216 StStandardHbtEventReader::StStandardHbtEventReader() : mTrackType(primary), mReadTracks(1), mReadV0s(1), mReadXis(1), mReadKinks(1) {
00217 mTheEventMaker=0;
00218 mTheV0Maker=0;
00219 mTheTagReader = 0;
00220 mReaderStatus = 0;
00221 mFlowMaker = 0;
00222 mFlowAnalysisMaker = 0;
00223 }
00224
00225 StStandardHbtEventReader::~StStandardHbtEventReader(){
00226 if (mEventCut) delete mEventCut;
00227 if (mTrackCut) delete mTrackCut;
00228 if (mV0Cut) delete mV0Cut;
00229 if (mXiCut) delete mXiCut;
00230 if (mKinkCut) delete mKinkCut;
00231 }
00232
00233 StHbtString StStandardHbtEventReader::Report(){
00234 StHbtString temp = "\n This is the StStandardHbtEventReader\n";
00235 char ccc[100];
00236 sprintf(ccc," Track type is %d\n",mTrackType);
00237 temp += ccc;
00238 sprintf(ccc," mReadTracks is %d\n",mReadTracks);
00239 temp += ccc;
00240 sprintf(ccc," mReadV0s is %d\n",mReadV0s);
00241 temp += ccc;
00242 sprintf(ccc," mReadXis is %d\n",mReadXis);
00243 temp += ccc;
00244 temp += "---> EventCuts in Reader: ";
00245 if (mEventCut) {
00246 temp += mEventCut->Report();
00247 }
00248 else {
00249 temp += "NONE";
00250 }
00251 temp += "\n---> TrackCuts in Reader: ";
00252 if (mTrackCut) {
00253 temp += mTrackCut->Report();
00254 }
00255 else {
00256 temp += "NONE";
00257 }
00258 temp += "\n---> V0Cuts in Reader: ";
00259 if (mV0Cut) {
00260 temp += mV0Cut->Report();
00261 }
00262 else {
00263 temp += "NONE";
00264 }
00265 temp += "\n---> XiCuts in Reader: ";
00266 if (mXiCut) {
00267 temp += mXiCut->Report();
00268 }
00269 else {
00270 temp += "NONE";
00271 }
00272 temp += "\n---> KinkCuts in Reader: ";
00273 if (mKinkCut) {
00274 temp += mKinkCut->Report();
00275 }
00276 else {
00277 temp += "NONE";
00278 }
00279 temp += "\n";
00280 return temp;
00281 }
00282
00283 StHbtEvent* StStandardHbtEventReader::ReturnHbtEvent(){
00284 cout << " StStandardHbtEventReader::ReturnHbtEvent()" << endl;
00285
00287
00289 StEvent* rEvent = 0;
00290
00291 if (mTheEventMaker) {
00292 StEventMaker* tempMaker = (StEventMaker*) mTheEventMaker;
00293 rEvent = tempMaker->event();
00294 }
00295 else {
00296 cout << " read from event.root file " << endl;
00297 rEvent = (StEvent *) GetInputDS("StEvent");
00298 cout << " read from event.root file " << endl;
00299 }
00300 if (!rEvent){
00301 cout << " StStandardHbtEventReader::ReturnHbtEvent() - No StEvent!!! " << endl;
00302 return 0;
00303 }
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 if (!mTheTagReader)
00315 cout << " StStandardHbtEventReader::ReturnHbtEvent() - no tag reader " << endl;
00316
00317 if (mTheTagReader) {
00318 cout << " StStandardHbtEventReader::ReturnHbtEvent() - tag reader is switched on " << endl;
00319 if (!mTheTagReader->EventMatch(rEvent->info()->runId() , rEvent->info()->id()) ) {
00320 cout << " StStandardHbtEventReader::ReturnHbtEvent() - no tags for this event" << endl;
00321 return 0;
00322 }
00323 }
00324
00325
00326 StHbtEvent* hbtEvent = new StHbtEvent;
00327 unsigned int mult = rEvent->trackNodes().size();
00328
00329 if ( rEvent->numberOfPrimaryVertices() != 1) {
00330 cout << " StStandardHbtEventReader::ReturnHbtEvent() - rEvent->numberOfPrimaryVertices()=" <<
00331 rEvent->numberOfPrimaryVertices() << endl;
00332 delete hbtEvent;
00333 return 0;
00334 }
00335 StHbtThreeVector vp = rEvent->primaryVertex()->position();
00336 hbtEvent->SetPrimVertPos(vp);
00337 cout << " StStandardHbtEventReader::ReturnHbtEvent() - primary vertex : " << vp << endl;
00338
00339
00340 hbtEvent->SetRunNumber( rEvent->runId() );
00341
00342 if ( rEvent->summary() ) {
00343 hbtEvent->SetMagneticField(rEvent->summary()->magneticField());
00344 cout <<" StStandardHbtEventReader - magnetic field " << hbtEvent->MagneticField() << endl;
00345
00346 }
00347 else {
00348 cout << "StStandardHbtEventReader - no StEvent summary -> no magnetic field written to HbtEvent" << endl;
00349 }
00350
00351 if ( rEvent->l0Trigger() ) {
00352 hbtEvent->SetTriggerWord(rEvent->l0Trigger()->triggerWord());
00353 hbtEvent->SetTriggerActionWord(rEvent->l0Trigger()->triggerActionWord());
00354 }
00355 else {
00356 cout << "StStandardHbtEventReader - no StEvent l0Trigger" << endl;
00357 }
00358
00359 int nL3Processed,nL3Accept,nL3Build;
00360 unsigned int firedL3TriggerAlgorithm=0;
00361 if ( rEvent->l3Trigger() && rEvent->l3Trigger()->l3EventSummary()) {
00362 const StL3EventSummary* mL3EventSummary = rEvent->l3Trigger()->l3EventSummary();
00363 unsigned int nAlgorithms = mL3EventSummary->numberOfAlgorithms();
00364 cout << "Number of L3 algorithms for this run: " << nAlgorithms << endl;
00365 const StSPtrVecL3AlgorithmInfo& mL3AlgInfo = mL3EventSummary->algorithms();
00366 for (unsigned int i=0; i<nAlgorithms; i++) {
00367 int algId = mL3AlgInfo[i]->id();
00368 nL3Processed = mL3AlgInfo[i]->numberOfProcessedEvents();
00369 nL3Accept = mL3AlgInfo[i]->numberOfAcceptedEvents();
00370 nL3Build = mL3AlgInfo[i]->numberOfBuildEvents();
00371 if (mL3AlgInfo[i]->build()) cout << "**";
00372 cout << " alg id " << algId << ":\t #proc " << nL3Processed << "\t #accept " << nL3Accept << "\t #build " << nL3Build << endl;
00373 }
00374
00375
00376 const StPtrVecL3AlgorithmInfo& mL3TriggerAlgInfo = mL3EventSummary->algorithmsAcceptingEvent();
00377 cout << "Number of L3 algorithms which triggered this event: " << mL3TriggerAlgInfo.size() << endl;
00378 cout << "triggered algorithms: ";
00379 for (unsigned int i=0; i<mL3TriggerAlgInfo.size(); i++) cout << mL3TriggerAlgInfo[i]->id() << " ";
00380 cout << endl;
00381
00382 firedL3TriggerAlgorithm=0;
00383 for (StPtrVecL3AlgorithmInfoConstIterator theIter = mL3TriggerAlgInfo.begin(); theIter != mL3TriggerAlgInfo.end(); ++theIter) {
00384 firedL3TriggerAlgorithm |= ( 1<<((*theIter)->id()) );
00385 cout << ((*theIter)->id()) << " " << firedL3TriggerAlgorithm << endl;
00386 }
00387 hbtEvent->SetL3TriggerAlgorithm(0,firedL3TriggerAlgorithm);
00388 }
00389 else {
00390 cout << "StStandardHbtEventReader - no StEvent l3Trigger" << endl;
00391 }
00392 cout << "StStandardHbtEventReader - done" << endl;
00393
00394
00395
00396
00397 if (mEventCut){
00398 if (!(mEventCut->Pass(hbtEvent))){
00399 delete hbtEvent;
00400 return 0;
00401 }
00402 }
00403
00404 StTrack* pTrack;
00405 StTrack* gTrack;
00406 StTrack* cTrack;
00407
00408 cout << "StStandardHbtReader::ReturnHbtEvent() - We have " << mult << " tracks to store - we skip tracks with nhits==0" << endl;
00409
00410 StTpcDedxPidAlgorithm* PidAlgorithm = new StTpcDedxPidAlgorithm();
00411
00412 if (!PidAlgorithm) cout << " StStandardHbtEventReader::ReturnHbtEvent() - Whoa!! No PidAlgorithm!! " << endl;
00413
00414
00415
00416
00417
00418
00419
00420 int iNoHits = 0;
00421 int iNoPidTraits = 0;
00422 int iFailedCut =0;
00423 int iNoBestGuess =0;
00424 int iBadFlag =0;
00425 int iTracks = 0;
00426 int iGoodTracks =0;
00427 int iWrongTrackType =0;
00428
00429
00430 for (unsigned int icount=0; icount<(unsigned int)mult; icount++){
00431 cTrack = rEvent->trackNodes()[icount]->track(mTrackType);
00432 if (cTrack) {
00433 iTracks++;
00434 if (cTrack->flag()>=0) iGoodTracks++;
00435 #ifdef STHBTDEBUG
00436 cout << iTracks << " " << iGoodTracks << " : ";
00437 cout << cTrack->type() << " ";
00438 cout << cTrack->flag() << " ";
00439 cout << cTrack->key() << " ";
00440 cout << cTrack->impactParameter() << " ";
00441 cout << cTrack->numberOfPossiblePoints() << " ";
00442 cout << endl;
00443 #endif
00444 }
00445 }
00446
00447 hbtEvent->SetNumberOfTracks(iTracks);
00448 hbtEvent->SetNumberOfGoodTracks(iGoodTracks);
00449
00450 hbtEvent->SetUncorrectedNumberOfPositivePrimaries(uncorrectedNumberOfPositivePrimaries(*rEvent));
00451 hbtEvent->SetUncorrectedNumberOfNegativePrimaries(uncorrectedNumberOfNegativePrimaries(*rEvent));
00452 hbtEvent->SetEventNumber(rEvent->info()->id());
00453
00454 if (rEvent->triggerDetectorCollection()) {
00455 StZdcTriggerDetector zdc = rEvent->triggerDetectorCollection()->zdc();
00456 hbtEvent->SetZdcAdcWest((int)zdc.adc(10));
00457 hbtEvent->SetZdcAdcEast((int)zdc.adc(13));
00458 }
00459 else {
00460 cout << "StStandardHbtEventReader::Return(...) - no triggerDetectorCollection " << endl;
00461 }
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483 if (mReadTracks) {
00484 for (unsigned int icount=0; icount<(unsigned int)mult; icount++){
00485 #ifdef STHBTDEBUG
00486 cout << " track# " << icount;
00487 cout << " -1- ";
00488 #endif
00489 gTrack = rEvent->trackNodes()[icount]->track(global);
00490 pTrack = rEvent->trackNodes()[icount]->track(primary);
00491 cTrack = rEvent->trackNodes()[icount]->track(mTrackType);
00492
00493
00494 if (!cTrack) { iWrongTrackType++; continue; }
00495 if (cTrack->flag() < 0) { iBadFlag++; continue; }
00496
00497 if (!gTrack) {
00498 cout << "StStandardHbtEventReader::Return(...) - no global track pointer !?! " << endl;
00499 continue;
00500 }
00501
00502
00503 if (!cTrack->detectorInfo()) {
00504 cout << "StStandardHbtEventReader::Return(...) - no detector info " << endl;
00505 assert(0);
00506 }
00507
00508 int nhits = cTrack->detectorInfo()->numberOfPoints(kTpcId);
00509 if (nhits==0) {
00510 iNoHits++;
00511 #ifdef STHBTDEBUG
00512 cout << "No hits -- skipping track (because it crashes otherwise)" << endl;
00513 #endif
00514 continue;
00515 }
00516
00517
00518
00519 StParticleDefinition* BestGuess = (StParticleDefinition*)cTrack->pidTraits(*PidAlgorithm);
00520
00521 if (!BestGuess){
00522 #ifdef STHBTDEBUG
00523 cout << " noGuess ";
00524 #endif
00525 iNoBestGuess++;
00526 continue;
00527 }
00528
00529 #ifdef STHBTDEBUG
00530 cout << "Getting readty to instantiate new StHbtTrack " << endl;
00531 #endif
00532
00533
00534 StHbtTrack* hbtTrack = new StHbtTrack(rEvent,cTrack);
00535
00536 if (mTrackCut){
00537 #ifdef STHBTDEBUG
00538 cout << " -cut- ";
00539 cout << endl;
00540 #endif
00541 if (!(mTrackCut->Pass(hbtTrack))){
00542 iFailedCut++;
00543 delete hbtTrack;
00544 continue;
00545 }
00546 }
00547
00548 #ifdef STHBTDEBUG
00549 cout << " -p- ";
00550 cout << endl;
00551 #endif
00552 hbtEvent->TrackCollection()->push_back(hbtTrack);
00553 }
00554 }
00555 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i tracks of type %i \n",iTracks,mTrackType);
00556 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i good tracks of type %i \n",iGoodTracks,mTrackType);
00557 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i wrong type tracks \n",iWrongTrackType);
00558 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i no hits, tracks skipped \n",iNoHits);
00559 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i no tpcPidTraits, tracks skipped \n",iNoPidTraits);
00560 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i failed tracks cuts, track skipped \n",iFailedCut);
00561 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i bad flag, track skipped \n",iBadFlag);
00562 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i(%i) tracks pushed into collection \n",hbtEvent->TrackCollection()->size(), mult);
00563
00564 delete PidAlgorithm;
00565
00566
00567
00568
00569 StStrangeMuDstMaker* muDstMaker = (StStrangeMuDstMaker *) mTheV0Maker;
00570
00571
00572
00573
00574 if( muDstMaker && mReadV0s ) {
00575 for( int i= 0; i < muDstMaker->GetNV0(); i++){
00576 StV0MuDst* v0FromMuDst = muDstMaker->GetV0(i);
00577
00578 StHbtV0* hbtV0 = new StHbtV0(*v0FromMuDst);
00579
00580
00581 if (mV0Cut){
00582 if (!(mV0Cut->Pass(hbtV0))){
00583 delete hbtV0;
00584 continue;
00585 }
00586 }
00587 hbtEvent->V0Collection()->push_back(hbtV0);
00588 }
00589 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i(%i) V0s pushed into collection \n",
00590 hbtEvent->V0Collection()->size(),
00591 muDstMaker->GetNV0());
00592 }
00593
00594
00595
00596
00597 if( muDstMaker && mReadXis ) {
00598 for( int i= 0; i < muDstMaker->GetNXi(); i++){
00599 StXiMuDst* xiFromMuDst = muDstMaker->GetXi(i);
00600
00601 StHbtXi* hbtXi = new StHbtXi(*xiFromMuDst);
00602
00603
00604 if (mXiCut){
00605 if (!(mXiCut->Pass(hbtXi))){
00606 delete hbtXi;
00607 continue;
00608 }
00609 }
00610 hbtEvent->XiCollection()->push_back(hbtXi);
00611 }
00612 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i(%i) Xis pushed into collection \n",
00613 hbtEvent->XiCollection()->size(),
00614 muDstMaker->GetNXi());
00615 }
00616
00617
00618
00619
00620
00621
00622
00623 StHbtKink* hbtKink;
00624 if( mReadKinks ) {
00625 for (unsigned int icount=0; icount<(unsigned int)rEvent->kinkVertices().size(); icount++)
00626 {
00627 StKinkVertex* starKink = rEvent->kinkVertices()[icount];
00628 hbtKink = new StHbtKink(*starKink, vp);
00629
00630 if (mKinkCut){
00631 if (!(mKinkCut->Pass(hbtKink))){
00632 delete hbtKink;
00633 continue;
00634 }
00635 }
00636 hbtEvent->KinkCollection()->push_back(hbtKink);
00637 }
00638 printf(" StStandardHbtEventReader::ReturnHbtEvent() - %8i(%i) Kinks pushed into collection \n",
00639 hbtEvent->KinkCollection()->size(),
00640 rEvent->kinkVertices().size());
00641 }
00642
00643
00644 if ( mFlowMaker && hbtEvent ) {
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659 }
00660
00661
00662
00663
00664
00665 if (mEventCut){
00666 if (!(mEventCut->Pass(hbtEvent))){
00667 delete hbtEvent;
00668 return 0;
00669 }
00670 }
00671
00672 return hbtEvent;
00673 }
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694