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
00156
00157 #include <assert.h>
00158 #include <Stiostream.h>
00159 #include <stdlib.h>
00160 #include <string>
00161 #include <vector>
00162 #include <set>
00163 #include <map>
00164 #include <cmath>
00165
00166 #include "TStyle.h"
00167 #include "TCanvas.h"
00168 #include "TH1.h"
00169 #include "TH2.h"
00170 #include "TNtuple.h"
00171 #include "TFile.h"
00172
00173 #include "StMcAnalysisMaker.h"
00174 #include "PhysicalConstants.h"
00175 #include "SystemOfUnits.h"
00176
00177 #include "StMessMgr.h"
00178
00179 #include "StAssociationMaker/StAssociationMaker.h"
00180 #include "StAssociationMaker/StTrackPairInfo.hh"
00181
00182 #include "StThreeVectorF.hh"
00183
00184 #include "StEventTypes.h"
00185
00186 #include "StMcEventTypes.hh"
00187
00188 #include "StMcEvent.hh"
00189
00190
00191 const Int_t StMcAnalysisMaker::mNumDeltaX = 50;
00192 const Int_t StMcAnalysisMaker::mNumDeltaZ = 50;
00193 const Float_t StMcAnalysisMaker::mMinDeltaX = -0.52;
00194 const Float_t StMcAnalysisMaker::mMaxDeltaX = 0.52;
00195 const Float_t StMcAnalysisMaker::mMinDeltaZ = -0.52;
00196 const Float_t StMcAnalysisMaker::mMaxDeltaZ = 0.52;
00197 struct TpcHitMRPair_t {
00198 Float_t sector, row, isDet,
00199 xM, yM, zM, pxM, pyM, pzM, dEM, dSM, nM,
00200 xR, yR, zR, dER, IdM, IdR, qR, nR;
00201 };
00202 static const Char_t *vTpcHitMRPair = "sector:row:isDet:xM:yM:zM:pxM:pyM:pzM:dEM:dSM:nM:xR:yR:zR:dER:IdM:IdR:qR:nR";
00203 static TpcHitMRPair_t TpcHitMRPair;
00204 struct SvtHitMRPair_t {
00205 Float_t barrel, layer, ladder, wafer, hybrid, index,
00206 xM, yM, zM, pxM, pyM, pzM, dEM, dSM, nM,
00207 xR, yR, zR, dER, IdM, IdR, qR, nR;
00208 };
00209 static const Char_t *vSvtHitMRPair = "barrel:layer:ladder:wafer:hybrid:index:xM:yM:zM:pxM:pyM:pzM:dEM:dSM:nM:xR:yR:zR:dER:IdM:IdR:qR:nR";
00210 static SvtHitMRPair_t SvtHitMRPair;
00211 struct SsdHitMRPair_t {
00212 Float_t ladder, wafer,
00213 xM, yM, zM, pxM, pyM, pzM, dEM, dSM, nM,
00214 xR, yR, zR, dER, IdM, IdR, qR, nR;
00215 };
00216 static const Char_t *vSsdHitMRPair = "ladder:wafer:xM:yM:zM:pxM:pyM:pzM:dEM:dSM:nM:xR:yR:zR:dER:IdM:IdR:qR:nR";
00217 static SsdHitMRPair_t SsdHitMRPair;
00218 ClassImp(StMcAnalysisMaker)
00219
00220
00221 StMcAnalysisMaker::StMcAnalysisMaker(const char *name, const char *title):
00222 StMaker(name,title), mNtupleFile(0)
00223 {
00224
00225
00226 mAssociationCanvas = 0;
00227 mMomResolution = 0;
00228 mHitResolution = 0;
00229 mSvtHitResolution = 0;
00230 mSsdHitResolution = 0;
00231 coordRec = 0;
00232 coordMcPartner = 0;
00233 mTrackNtuple = 0;
00234 mTpcHitNtuple = 0;
00235 mSvtHitNtuple = 0;
00236 mSsdHitNtuple = 0;
00237 }
00238
00239
00240 StMcAnalysisMaker::~StMcAnalysisMaker()
00241 {
00242
00243
00244 cout << "Inside StMcAnalysisMaker Destructor" << endl;
00245 SafeDelete(mAssociationCanvas);
00246
00247
00248
00249
00250
00251 }
00252
00253
00254
00255 void StMcAnalysisMaker::Clear(const char*)
00256 {
00257
00258
00259
00260 StMaker::Clear();
00261 }
00262
00263
00264 Int_t StMcAnalysisMaker::Finish()
00265 {
00266 if (mNtupleFile) {
00267 mNtupleFile->Write();
00268 mNtupleFile->Close();
00269 }
00270 return StMaker::Finish();
00271 }
00272
00273
00274
00275 Int_t StMcAnalysisMaker::Init()
00276 {
00277
00278 SetZones();
00279
00280 mNtupleFile = GetTFile();
00281 if (mNtupleFile) {mNtupleFile->cd(); mNtupleFile = 0;}
00282 else {mNtupleFile = new TFile("TrackMapNtuple.root","RECREATE","Track Ntuple");}
00283
00284 mHitResolution = new TH2F("hitRes","Delta Z Vs Delta X for Hits",
00285 mNumDeltaX,mMinDeltaX,mMaxDeltaX,mNumDeltaZ,mMinDeltaZ,mMaxDeltaZ);
00286 mHitResolution->SetXTitle("Delta X (cm)");
00287 mHitResolution->SetYTitle("Delta Z (cm)");
00288 mSvtHitResolution = new TH2F("SvtHitRes","Delta Z Vs Delta X for SvtHits",
00289 mNumDeltaX,mMinDeltaX,mMaxDeltaX,mNumDeltaZ,mMinDeltaZ,mMaxDeltaZ);
00290 mSvtHitResolution->SetXTitle("Delta X (cm)");
00291 mSvtHitResolution->SetYTitle("Delta Z (cm)");
00292
00293 mSsdHitResolution = new TH2F("SsdHitRes","Delta Z Vs Delta X for SsdHits",
00294 mNumDeltaX,mMinDeltaX,mMaxDeltaX,mNumDeltaZ,mMinDeltaZ,mMaxDeltaZ);
00295 mSsdHitResolution->SetXTitle("Delta X (cm)");
00296 mSsdHitResolution->SetYTitle("Delta Z (cm)");
00297
00298 mMomResolution = new TH1F("momRes","(|p| - |pmc|)/|pmc|",100,-1.,1.);
00299 mMomResolution->SetXTitle("Resolution (%)");
00300
00301 coordRec = new TH2F("coordRc","X vs Y pos. of Hits", 100, -200, 200, 100, -200, 200);
00302 coordRec->SetXTitle("X (cm)");
00303 coordRec->SetYTitle("Y (cm)");
00304
00305 coordMcPartner = new TH2F("coordMc","X vs Y pos. of Hits", 100, -200, 200, 100, -200, 200);
00306 coordMcPartner->SetXTitle("X (cm)");
00307 coordMcPartner->SetYTitle("Y (cm)");
00308
00309
00310
00311
00312
00313 mNtupleFile = new TFile("TrackMapNtuple.root","RECREATE","Track Ntuple");
00314
00315 const char* vars = "px:py:pz:p:pxrec:pyrec:pzrec:prec:commTpcHits:hitDiffX:hitDiffY:hitDiffZ:mcTrkId:mostCommIdTruth:nHitsIdTruth:nMcHits:nFitPts:nDetPts:quality";
00316 mTrackNtuple = new TNtuple("TrackNtuple","Track Pair Info",vars);
00317 mTrackNtuple->SetAutoSave(100000000);
00318 if (! m_Mode || m_Mode & 0x1) {
00319 mTpcHitNtuple = new TNtuple("TpcHitNtuple","the TPC hit pairs Info",vTpcHitMRPair);
00320 mTpcHitNtuple->SetAutoSave(100000000);
00321 }
00322 if (! m_Mode || m_Mode & 0x2) {
00323 mSvtHitNtuple = new TNtuple("SvtHitNtuple","the SVT hit pairs Info",vSvtHitMRPair);
00324 mSvtHitNtuple->SetAutoSave(100000000);
00325 }
00326 if (! m_Mode || m_Mode & 0x4) {
00327 mSsdHitNtuple = new TNtuple("SsdHitNtuple","the SSD hit pairs Info",vSsdHitMRPair);
00328 mSsdHitNtuple->SetAutoSave(100000000);
00329 }
00330 return StMaker::Init();
00331 }
00332
00333 Int_t StMcAnalysisMaker::Make()
00334 {
00335
00336
00337
00338
00339 StEvent* rEvent = (StEvent*) GetInputDS("StEvent");
00340 const StMcTrack *mTrack = 0;
00341
00342
00343 StMcEvent* mEvent = (StMcEvent*) GetDataSet("StMcEvent");
00344
00345
00346 StAssociationMaker* assoc = 0;
00347 assoc = (StAssociationMaker*) GetMaker("StAssociationMaker");
00348
00349
00350 rcTpcHitMapType* theHitMap = assoc->rcTpcHitMap();
00351 mcTpcHitMapType* theMcHitMap = assoc->mcTpcHitMap();
00352 rcSvtHitMapType* svtHitMap = assoc->rcSvtHitMap();
00353 mcSvtHitMapType* svtMcHitMap = assoc->mcSvtHitMap();
00354 rcSsdHitMapType* ssdHitMap = assoc->rcSsdHitMap();
00355 mcSsdHitMapType* ssdMcHitMap = assoc->mcSsdHitMap();
00356 rcTrackMapType* theTrackMap = assoc->rcTrackMap();
00357 mcV0MapType* theMcV0Map = assoc->mcV0Map();
00358
00359 if (!theHitMap) {
00360 gMessMgr->Warning() << "----------WARNING----------\n"
00361 << "No Hit Map found for this event!" << endm;
00362 return kStWarn;
00363 }
00364
00365
00366
00367
00368
00369 StThreeVectorD VertexPos(0,0,0);
00370 if (rEvent->primaryVertex()) {
00371 VertexPos = rEvent->primaryVertex()->position();
00372 cout << "Position of Primary Vertex from StEvent:" << endl;
00373 cout << VertexPos << endl;
00374 }
00375 else {
00376 cout << "----------- WARNING ------------" << endl;
00377 cout << "No primary vertex from StEvent!!" << endl;
00378 cout << "Assume it is at (0,0,0) " << endl;
00379
00380 }
00381 cout << "Position of Primary Vertex from StMcEvent:" << endl;
00382 cout << mEvent->primaryVertex()->position() << endl;
00383
00384
00385
00386 StTpcHit* firstHit;
00387 Bool_t gotOneHit;
00388 StTpcHitCollection* tpcColl = rEvent->tpcHitCollection();
00389 unsigned int j,k, nhits;
00390 nhits = tpcColl->numberOfHits();
00391 if (tpcColl && nhits) {
00392 gotOneHit = kFALSE;
00393 memset (&TpcHitMRPair, 0, sizeof(TpcHitMRPair_t));
00394 for (k=0; !gotOneHit && k<tpcColl->numberOfSectors(); k++)
00395 for (j=0; !gotOneHit && j<tpcColl->sector(k)->numberOfPadrows(); j++)
00396 if (tpcColl->sector(k)->padrow(j)->hits().size()) {
00397
00398 firstHit = tpcColl->sector(k)->padrow(j)->hits()[0];
00399 cout << "First Hit Found in Sector "
00400 << firstHit->sector() << " Padrow "
00401 << firstHit->padrow() << endl;
00402 gotOneHit = kTRUE;
00403 }
00404 cout << "This hit has " << theHitMap->count(firstHit) << " MC Hits associated with it."<< endl;
00405
00406
00407
00408 cout << "Position of First Rec. Hit and Associated (if any) MC Hit:" << endl;
00409 pair<rcTpcHitMapIter,rcTpcHitMapIter> hitBounds = theHitMap->equal_range(firstHit);
00410 for (rcTpcHitMapIter it=hitBounds.first; it!=hitBounds.second; ++it)
00411 cout << "[" << (*it).first->position() << ", " << (*it).second->position() << "]" << endl;
00412 }
00413 else {
00414 cout << "There are no reconstructed TPC Hits in this event" << endl;
00415 }
00416
00417
00418
00419 float DeltaX;
00420 float DeltaZ;
00421 if (theHitMap && mTpcHitNtuple) {
00422 StTpcHitCollection* recHits = rEvent->tpcHitCollection();
00423 StMcTpcHitCollection* mcHits = mEvent->tpcHitCollection();
00424 assert (recHits || mcHits);
00425 cout << "Making Hit Resolution Histogram..." << endl;
00426
00427
00428 for (unsigned int iSector=0; iSector< recHits->numberOfSectors(); iSector++) {
00429 for (unsigned int iPadrow=0; iPadrow<recHits->sector(iSector)->numberOfPadrows();
00430 iPadrow++) {
00431 for (StTpcHitIterator iter = recHits->sector(iSector)->padrow(iPadrow)->hits().begin();
00432 iter != recHits->sector(iSector)->padrow(iPadrow)->hits().end();
00433 iter++) {
00434 const StTpcHit *rhit = dynamic_cast<const StTpcHit *> (*iter);
00435 assert(rhit);
00436 if (rhit->TestBit(StMcHit::kMatched))
00437 {
00438 pair<rcTpcHitMapIter,rcTpcHitMapIter>
00439 recBounds = theHitMap->equal_range(rhit);
00440
00441 for (rcTpcHitMapIter it2=recBounds.first; it2!=recBounds.second; ++it2){
00442
00443 const StMcTpcHit *mhit = dynamic_cast<const StMcTpcHit *> ((*it2).second);
00444 assert ( mhit);
00445 DeltaX = rhit->position().x() - mhit->position().x();
00446 DeltaZ = rhit->position().z() - mhit->position().z();
00447
00448 mHitResolution->Fill(DeltaX,DeltaZ);
00449
00450 memset (&TpcHitMRPair, 0, sizeof(TpcHitMRPair));
00451 TpcHitMRPair.sector = rhit->sector();
00452 TpcHitMRPair.row = rhit->padrow();
00453 TpcHitMRPair.xR = rhit->position().x();
00454 TpcHitMRPair.yR = rhit->position().y();
00455 TpcHitMRPair.zR = rhit->position().z();
00456 TpcHitMRPair.dER = rhit->charge();
00457 TpcHitMRPair.IdR = rhit->idTruth();
00458 TpcHitMRPair.qR = rhit->qaTruth();
00459 TpcHitMRPair.nR = theHitMap->count(rhit);
00460 TpcHitMRPair.isDet = mhit->isDet();
00461 TpcHitMRPair.xM = mhit->position().x();
00462 TpcHitMRPair.yM = mhit->position().y();
00463 TpcHitMRPair.zM = mhit->position().z();
00464 TpcHitMRPair.pxM = mhit->localMomentum().x();
00465 TpcHitMRPair.pyM = mhit->localMomentum().y();
00466 TpcHitMRPair.pzM = mhit->localMomentum().z();
00467 TpcHitMRPair.dEM = mhit->dE();
00468 TpcHitMRPair.dSM = mhit->dS();
00469 mTrack = mhit->parentTrack();
00470 if (mTrack) TpcHitMRPair.IdM = mTrack->key();
00471 else TpcHitMRPair.IdM = 0;
00472 TpcHitMRPair.nM = theMcHitMap->count(mhit);
00473 mTpcHitNtuple->Fill(&TpcHitMRPair.sector);
00474 }
00475 }
00476 else {
00477 memset (&TpcHitMRPair, 0, sizeof(TpcHitMRPair));
00478 TpcHitMRPair.sector = rhit->sector();
00479 TpcHitMRPair.row = rhit->padrow();
00480 TpcHitMRPair.xR = rhit->position().x();
00481 TpcHitMRPair.yR = rhit->position().y();
00482 TpcHitMRPair.zR = rhit->position().z();
00483 TpcHitMRPair.dER = rhit->charge();
00484 TpcHitMRPair.IdR = rhit->idTruth();
00485 TpcHitMRPair.qR = rhit->qaTruth();
00486 TpcHitMRPair.nR = theHitMap->count(rhit);
00487 mTpcHitNtuple->Fill(&TpcHitMRPair.sector);
00488 }
00489 }
00490 }
00491 }
00492 for (unsigned int iSector=0;
00493 iSector<mcHits->numberOfSectors(); iSector++) {
00494
00495 if (Debug()) {cout << iSector + 1 << " "; flush(cout);}
00496 StMcTpcSectorHitCollection* tpcSectHitColl = mcHits->sector(iSector);
00497 for (unsigned int iPadrow=0;
00498 iPadrow<tpcSectHitColl->numberOfPadrows();
00499 iPadrow++) {
00500 StMcTpcPadrowHitCollection* tpcPadRowHitColl = tpcSectHitColl->padrow(iPadrow);
00501 for (unsigned int iHit=0;
00502 iHit<tpcPadRowHitColl->hits().size();
00503 iHit++){
00504 const StMcTpcHit *mhit = dynamic_cast<const StMcTpcHit *> (tpcPadRowHitColl->hits()[iHit]);
00505 assert (mhit);
00506 if (mhit->TestBit(StMcHit::kMatched)) continue;
00507 memset (&TpcHitMRPair, 0, sizeof(TpcHitMRPair));
00508 TpcHitMRPair.sector = mhit->sector();
00509 TpcHitMRPair.row = mhit->padrow();
00510 TpcHitMRPair.isDet = mhit->isDet();
00511 TpcHitMRPair.xM = mhit->position().x();
00512 TpcHitMRPair.yM = mhit->position().y();
00513 TpcHitMRPair.zM = mhit->position().z();
00514 TpcHitMRPair.pxM = mhit->localMomentum().x();
00515 TpcHitMRPair.pyM = mhit->localMomentum().y();
00516 TpcHitMRPair.pzM = mhit->localMomentum().z();
00517 TpcHitMRPair.dEM = mhit->dE();
00518 TpcHitMRPair.dSM = mhit->dS();
00519 mTrack = mhit->parentTrack();
00520 if (mTrack) TpcHitMRPair.IdM = mTrack->key();
00521 else TpcHitMRPair.IdM = 0;
00522 mTpcHitNtuple->Fill(&TpcHitMRPair.sector);
00523 }
00524 }
00525 }
00526 }
00527 if (svtHitMap && svtMcHitMap && mSvtHitNtuple) {
00528 StSvtHitCollection* recHits = rEvent->svtHitCollection();
00529 StMcSvtHitCollection* mcHits = mEvent->svtHitCollection();
00530 if (recHits && mcHits) {
00531 for (unsigned int iBarrel=0; iBarrel< recHits->numberOfBarrels(); iBarrel++) {
00532 for (unsigned int iLadder=0; iLadder<recHits->barrel(iBarrel)->numberOfLadders(); iLadder++) {
00533 for (unsigned int iWafer = 0; iWafer < recHits->barrel(iBarrel)->ladder(iLadder)->numberOfWafers(); iWafer++) {
00534 for (StSvtHitIterator iter = recHits->barrel(iBarrel)->ladder(iLadder)->wafer(iWafer)->hits().begin();
00535 iter != recHits->barrel(iBarrel)->ladder(iLadder)->wafer(iWafer)->hits().end();
00536 iter++) {
00537 const StSvtHit *rhit = dynamic_cast<const StSvtHit *> (*iter);
00538 assert(rhit);
00539 if (rhit->TestBit(StMcHit::kMatched))
00540 {
00541 pair<rcSvtHitMapIter,rcSvtHitMapIter> recBounds = svtHitMap->equal_range(rhit);
00542 for (rcSvtHitMapIter it2=recBounds.first; it2!=recBounds.second; ++it2){
00543 const StMcSvtHit *mhit = dynamic_cast<const StMcSvtHit *> ((*it2).second);
00544 assert ( mhit);
00545 DeltaX = rhit->position().x() - mhit->position().x();
00546 DeltaZ = rhit->position().z() - mhit->position().z();
00547 mSvtHitResolution->Fill(DeltaX,DeltaZ);
00548 memset (&SvtHitMRPair, 0, sizeof(SvtHitMRPair));
00549 SvtHitMRPair.barrel = rhit->barrel();
00550 SvtHitMRPair.ladder = rhit->ladder();
00551 SvtHitMRPair.layer = rhit->layer();
00552 SvtHitMRPair.wafer = rhit->wafer();
00553 SvtHitMRPair.hybrid = rhit->hybrid();
00554 SvtHitMRPair.index = rhit->index();
00555 SvtHitMRPair.xR = rhit->position().x();
00556 SvtHitMRPair.yR = rhit->position().y();
00557 SvtHitMRPair.zR = rhit->position().z();
00558 SvtHitMRPair.dER = rhit->charge();
00559 SvtHitMRPair.IdR = rhit->idTruth();
00560 SvtHitMRPair.qR = rhit->qaTruth();
00561 SvtHitMRPair.nR = svtHitMap->count(rhit);
00562 SvtHitMRPair.xM = mhit->position().x();
00563 SvtHitMRPair.yM = mhit->position().y();
00564 SvtHitMRPair.zM = mhit->position().z();
00565 SvtHitMRPair.pxM = mhit->localMomentum().x();
00566 SvtHitMRPair.pyM = mhit->localMomentum().y();
00567 SvtHitMRPair.pzM = mhit->localMomentum().z();
00568 SvtHitMRPair.dEM = mhit->dE();
00569 SvtHitMRPair.dSM = mhit->dS();
00570 mTrack = mhit->parentTrack();
00571 if (mTrack) SvtHitMRPair.IdM = mTrack->key();
00572 else SvtHitMRPair.IdM = 0;
00573 SvtHitMRPair.nM = svtMcHitMap->count(mhit);
00574 mSvtHitNtuple->Fill(&SvtHitMRPair.barrel);
00575 }
00576 }
00577 else {
00578 memset (&SvtHitMRPair, 0, sizeof(SvtHitMRPair));
00579 SvtHitMRPair.barrel = rhit->barrel();
00580 SvtHitMRPair.ladder = rhit->ladder();
00581 SvtHitMRPair.layer = rhit->layer();
00582 SvtHitMRPair.wafer = rhit->wafer();
00583 SvtHitMRPair.hybrid = rhit->hybrid();
00584 SvtHitMRPair.index = rhit->index();
00585 SvtHitMRPair.xR = rhit->position().x();
00586 SvtHitMRPair.yR = rhit->position().y();
00587 SvtHitMRPair.zR = rhit->position().z();
00588 SvtHitMRPair.dER = rhit->charge();
00589 SvtHitMRPair.IdR = rhit->idTruth();
00590 SvtHitMRPair.qR = rhit->qaTruth();
00591 SvtHitMRPair.nR = svtHitMap->count(rhit);
00592 mSvtHitNtuple->Fill(&SvtHitMRPair.barrel);
00593 }
00594 }
00595 }
00596 }
00597 }
00598 for (unsigned int iBarrel=0; iBarrel< mcHits->numberOfBarrels(); iBarrel++) {
00599 for (unsigned int iLadder=0; iLadder<mcHits->barrel(iBarrel)->numberOfLadders(); iLadder++) {
00600 for (unsigned int iWafer = 0; iWafer < mcHits->barrel(iBarrel)->ladder(iLadder)->numberOfWafers(); iWafer++) {
00601 for (StMcSvtHitIterator iter = mcHits->barrel(iBarrel)->ladder(iLadder)->wafer(iWafer)->hits().begin();
00602 iter != mcHits->barrel(iBarrel)->ladder(iLadder)->wafer(iWafer)->hits().end();
00603 iter++) {
00604 const StMcSvtHit *mhit = dynamic_cast<const StMcSvtHit *> (*iter);
00605 assert (mhit);
00606 if (mhit->TestBit(StMcHit::kMatched)) continue;
00607 memset (&SvtHitMRPair, 0, sizeof(SvtHitMRPair));
00608 SvtHitMRPair.barrel = mhit->barrel();
00609 SvtHitMRPair.ladder = mhit->ladder();
00610 SvtHitMRPair.layer = mhit->layer();
00611 SvtHitMRPair.wafer = mhit->wafer();
00612 SvtHitMRPair.hybrid = mhit->hybrid();
00613 SvtHitMRPair.index = -1;
00614 SvtHitMRPair.barrel = mhit->barrel();
00615 SvtHitMRPair.ladder = mhit->ladder();
00616 SvtHitMRPair.xM = mhit->position().x();
00617 SvtHitMRPair.yM = mhit->position().y();
00618 SvtHitMRPair.zM = mhit->position().z();
00619 SvtHitMRPair.pxM = mhit->localMomentum().x();
00620 SvtHitMRPair.pyM = mhit->localMomentum().y();
00621 SvtHitMRPair.pzM = mhit->localMomentum().z();
00622 SvtHitMRPair.dEM = mhit->dE();
00623 SvtHitMRPair.dSM = mhit->dS();
00624 mTrack = mhit->parentTrack();
00625 if (mTrack) SvtHitMRPair.IdM = mTrack->key();
00626 else SvtHitMRPair.IdM = 0;
00627 mSvtHitNtuple->Fill(&SvtHitMRPair.barrel);
00628 }
00629 }
00630 }
00631 }
00632 }
00633 }
00634 if (ssdHitMap && ssdMcHitMap && mSsdHitNtuple) {
00635 StSsdHitCollection* recHits = rEvent->ssdHitCollection();
00636 StMcSsdHitCollection* mcHits = mEvent->ssdHitCollection();
00637 if (recHits && mcHits) {
00638 for (unsigned int iLadder=0; iLadder<recHits->numberOfLadders(); iLadder++) {
00639 for (unsigned int iWafer = 0; iWafer < recHits->ladder(iLadder)->numberOfWafers(); iWafer++) {
00640 for (StSsdHitIterator iter = recHits->ladder(iLadder)->wafer(iWafer)->hits().begin();
00641 iter != recHits->ladder(iLadder)->wafer(iWafer)->hits().end();
00642 iter++) {
00643 const StSsdHit *rhit = dynamic_cast<const StSsdHit *> (*iter);
00644 assert(rhit);
00645 if (rhit->TestBit(StMcHit::kMatched))
00646 {
00647 pair<rcSsdHitMapIter,rcSsdHitMapIter> recBounds = ssdHitMap->equal_range(rhit);
00648 for (rcSsdHitMapIter it2=recBounds.first; it2!=recBounds.second; ++it2){
00649 const StMcSsdHit *mhit = dynamic_cast<const StMcSsdHit *> ((*it2).second);
00650 assert ( mhit);
00651 DeltaX = rhit->position().x() - mhit->position().x();
00652 DeltaZ = rhit->position().z() - mhit->position().z();
00653 mSsdHitResolution->Fill(DeltaX,DeltaZ);
00654 memset (&SsdHitMRPair, 0, sizeof(SsdHitMRPair));
00655 SsdHitMRPair.ladder = rhit->ladder();
00656 SsdHitMRPair.wafer = rhit->wafer();
00657 SsdHitMRPair.xR = rhit->position().x();
00658 SsdHitMRPair.yR = rhit->position().y();
00659 SsdHitMRPair.zR = rhit->position().z();
00660 SsdHitMRPair.dER = rhit->charge();
00661 SsdHitMRPair.IdR = rhit->idTruth();
00662 SsdHitMRPair.qR = rhit->qaTruth();
00663 SsdHitMRPair.nR = ssdHitMap->count(rhit);
00664 SsdHitMRPair.xM = mhit->position().x();
00665 SsdHitMRPair.yM = mhit->position().y();
00666 SsdHitMRPair.zM = mhit->position().z();
00667 SsdHitMRPair.pxM = mhit->localMomentum().x();
00668 SsdHitMRPair.pyM = mhit->localMomentum().y();
00669 SsdHitMRPair.pzM = mhit->localMomentum().z();
00670 SsdHitMRPair.dEM = mhit->dE();
00671 SsdHitMRPair.dSM = mhit->dS();
00672 mTrack = mhit->parentTrack();
00673 if (mTrack) SsdHitMRPair.IdM = mTrack->key();
00674 else SsdHitMRPair.IdM = 0;
00675 SsdHitMRPair.nM = ssdMcHitMap->count(mhit);
00676 mSsdHitNtuple->Fill(&SsdHitMRPair.ladder);
00677 }
00678 }
00679 else {
00680 memset (&SsdHitMRPair, 0, sizeof(SsdHitMRPair));
00681 SsdHitMRPair.ladder = rhit->ladder();
00682 SsdHitMRPair.wafer = rhit->wafer();
00683 SsdHitMRPair.xR = rhit->position().x();
00684 SsdHitMRPair.yR = rhit->position().y();
00685 SsdHitMRPair.zR = rhit->position().z();
00686 SsdHitMRPair.dER = rhit->charge();
00687 SsdHitMRPair.IdR = rhit->idTruth();
00688 SsdHitMRPair.qR = rhit->qaTruth();
00689 SsdHitMRPair.nR = ssdHitMap->count(rhit);
00690 mSsdHitNtuple->Fill(&SsdHitMRPair.ladder);
00691 }
00692 }
00693 }
00694 }
00695 for (unsigned int iLadder=0; iLadder<mcHits->numberOfLadders(); iLadder++) {
00696 for (unsigned int iWafer = 0; iWafer < mcHits->ladder(iLadder)->numberOfWafers(); iWafer++) {
00697 for (StMcSsdHitIterator iter = mcHits->ladder(iLadder)->wafer(iWafer)->hits().begin();
00698 iter != mcHits->ladder(iLadder)->wafer(iWafer)->hits().end();
00699 iter++) {
00700 const StMcSsdHit *mhit = dynamic_cast<const StMcSsdHit *> (*iter);
00701 assert (mhit);
00702 if (mhit->TestBit(StMcHit::kMatched)) continue;
00703 memset (&SsdHitMRPair, 0, sizeof(SsdHitMRPair));
00704 SsdHitMRPair.ladder = mhit->ladder();
00705 SsdHitMRPair.wafer = mhit->wafer();
00706 SsdHitMRPair.ladder = mhit->ladder();
00707 SsdHitMRPair.xM = mhit->position().x();
00708 SsdHitMRPair.yM = mhit->position().y();
00709 SsdHitMRPair.zM = mhit->position().z();
00710 SsdHitMRPair.pxM = mhit->localMomentum().x();
00711 SsdHitMRPair.pyM = mhit->localMomentum().y();
00712 SsdHitMRPair.pzM = mhit->localMomentum().z();
00713 SsdHitMRPair.dEM = mhit->dE();
00714 SsdHitMRPair.dSM = mhit->dS();
00715 mTrack = mhit->parentTrack();
00716 if (mTrack) SsdHitMRPair.IdM = mTrack->key();
00717 else SsdHitMRPair.IdM = 0;
00718 mSsdHitNtuple->Fill(&SsdHitMRPair.ladder);
00719 }
00720 }
00721 }
00722 }
00723 }
00724 cout << "Finished Making Histogram." << endl;
00725
00726 if (!theTrackMap) {
00727 gMessMgr->Warning() << "----------WARNING----------\n"
00728 << "No Track Map found for this event!" << endm;
00729 return kStWarn;
00730 }
00731
00732
00733
00734 StSPtrVecTrackNode& rcTrackNodes = rEvent->trackNodes();
00735 StTrackNode* firstTrackNode = 0;
00736 const StGlobalTrack* firstTrack = 0;
00737 if (! rcTrackNodes.size()) {
00738 cout << "Track Nodes List is empty!" << endl;
00739 return kStWarn;
00740 }
00741 firstTrackNode = *(rcTrackNodes.begin());
00742 if (! firstTrackNode) {
00743 cout << "No tracks in Track Nodes List!" << endl;
00744 return kStWarn;
00745 }
00746 firstTrack = dynamic_cast<const StGlobalTrack*>(firstTrackNode->track(global));
00747 if (! firstTrack) {
00748 cout << "GlobalTrack for first Track Nodehas not been found!" << endl;
00749 return kStWarn;
00750 }
00751 cout << "MC Tracks associated with first Track in collection: " << theTrackMap->count(firstTrack) << endl;
00752 if (!theTrackMap->count(firstTrack) && theTrackMap->size()) {
00753 cout << "First track in track node container was not associated. Pick first track in map." << endl;
00754 firstTrack = theTrackMap->begin()->first;
00755 }
00756 pair<rcTrackMapIter,rcTrackMapIter> trackBounds = theTrackMap->equal_range(firstTrack);
00757 cout << "Momentum of First Track and of Associated Tracks (if there are any):" << endl;
00758
00759
00760 const StPrimaryTrack* pTrk = dynamic_cast<const StPrimaryTrack*>(firstTrack->node()->track(primary));
00761 StThreeVectorD recMom(0,0,0);
00762 if (pTrk)
00763 recMom = pTrk->geometry()->momentum();
00764 else
00765 recMom = firstTrack->geometry()->momentum();
00766 for (rcTrackMapIter trkIt=trackBounds.first; trkIt!=trackBounds.second; ++trkIt) {
00767 const StMcTrack* origTrk = (*trkIt).second->partnerMcTrack();
00768 cout << "[" << abs(recMom) << ", ";
00769 cout << abs((*trkIt).second->partnerMcTrack()->momentum()) << "]" << endl;
00770 cout << "These tracks have : \n";
00771 cout << (*trkIt).second->commonTpcHits() << " TPC hits in common, out of " << origTrk->tpcHits().size() << endl;
00772 cout << (*trkIt).second->commonSvtHits() << " SVT hits in common, out of " << origTrk->svtHits().size() << endl;
00773 cout << (*trkIt).second->commonFtpcHits() <<" FTPC hits in common, out of " << origTrk->ftpcHits().size() << endl;
00774 }
00775
00776
00777 const StGlobalTrack* recTrack;
00778 const StPrimaryTrack* primTrk;
00779 const StMcTrack* mcTrack;
00780 StThreeVectorD p(0,0,0);
00781 StThreeVectorD pmc(0,0,0);
00782 float diff =0;
00783
00784 float* values = new float[19];
00785
00786 for (rcTrackMapIter tIter=theTrackMap->begin();
00787 tIter!=theTrackMap->end(); ++tIter){
00788
00789 recTrack = (*tIter).first;
00790
00791 mcTrack = (*tIter).second->partnerMcTrack();
00792 pmc = mcTrack->momentum();
00793 for (int k=0; k<3; k++) values[k] = pmc[k];
00794 values[3]=pmc.mag();
00795
00796 primTrk = dynamic_cast<const StPrimaryTrack*>(recTrack->node()->track(primary));
00797 if (primTrk)
00798 p = primTrk->geometry()->momentum();
00799 else
00800 p = recTrack->geometry()->momentum();
00801
00802 for (int j=0; j<3; j++) values[j+4] = p[j];
00803 values[7]=p.mag();
00804 values[8]=(*tIter).second->commonTpcHits();
00805
00806
00807 diff = (p.mag() - pmc.mag())/pmc.mag();
00808 mMomResolution->Fill(diff,1.);
00809
00810 StThreeVectorF rHitPos(0,0,0);
00811 StThreeVectorF mHitPos(0,0,0);
00812
00813 StPtrVecHit recTpcHits = recTrack->detectorInfo()->hits(kTpcId);
00814 multimap<int,float> idTruths;
00815 set<int> uniqueIdTruths;
00816 for (StHitIterator hi=recTpcHits.begin();
00817 hi!=recTpcHits.end(); hi++) {
00818 StHit* hit = *hi;
00819 StTpcHit* rHit = dynamic_cast<StTpcHit*>(hit);
00820 if (!rHit) { cout << "This Hit is not a TPC Hit"<< endl; continue;}
00821 idTruths.insert( multimap<int,float>::value_type(rHit->idTruth(),rHit->qaTruth()));
00822 uniqueIdTruths.insert(static_cast<int>(rHit->idTruth()));
00823 pair<rcTpcHitMapIter,rcTpcHitMapIter> rBounds = theHitMap->equal_range(rHit);
00824 for (rcTpcHitMapIter hIter=rBounds.first; hIter!=rBounds.second; hIter++) {
00825 const StMcTpcHit* mHit = (*hIter).second;
00826 if (mHit->parentTrack() != mcTrack) continue;
00827 rHitPos += rHit->position();
00828 mHitPos += mHit->position();
00829 }
00830
00831 }
00832
00833 rHitPos /=(float) (*tIter).second->commonTpcHits();
00834 mHitPos /=(float) (*tIter).second->commonTpcHits();
00835 for (int jj=0; jj<3; jj++) values[9+jj] = rHitPos[jj] - mHitPos[jj];
00836 values[12] = mcTrack->key();
00837
00838 int mostCommonIdTruth = -9;
00839 int cachedNHitsIdTruth = 0;
00840 for (set<int>::iterator si=uniqueIdTruths.begin(); si!=uniqueIdTruths.end(); ++si) {
00841 int currentNHitsIdTruth = idTruths.count(static_cast<int>(*si));
00842 if (currentNHitsIdTruth>cachedNHitsIdTruth) {
00843 mostCommonIdTruth = *si;
00844 cachedNHitsIdTruth = currentNHitsIdTruth;
00845 }
00846 }
00847
00848
00849
00850 float idQuality = 0;
00851
00852 pair<multimap<int,float>::iterator,multimap<int,float>::iterator> mostCommRange = idTruths.equal_range(mostCommonIdTruth);
00853 for (multimap<int,float>::iterator mi=mostCommRange.first; mi!=mostCommRange.second; ++mi) {
00854 idQuality+=mi->second;
00855 }
00856 idQuality/=cachedNHitsIdTruth;
00857
00858 values[13] = mostCommonIdTruth;
00859 values[14] = cachedNHitsIdTruth;
00860 values[15] = mcTrack->tpcHits().size();
00861 values[16] = recTrack->fitTraits().numberOfFitPoints(kTpcId);
00862 values[17] = recTpcHits.size();
00863 values[18] = idQuality;
00864 mTrackNtuple->Fill(values);
00865 }
00866 cout << "Finished Track Loop, Made Ntuple" << endl;
00867
00868 delete [] values;
00869
00870
00871
00872
00873
00874
00875 unsigned int maxCommonTpcHits = 0;
00876 const StMcTrack* partner = 0;
00877 trackBounds = theTrackMap->equal_range(firstTrack);
00878 for (rcTrackMapIter rcIt = trackBounds.first;
00879 rcIt != trackBounds.second;
00880 ++rcIt) {
00881 if ((*rcIt).second->commonTpcHits() > maxCommonTpcHits) {
00882 partner = (*rcIt).second->partnerMcTrack();
00883 maxCommonTpcHits = (*rcIt).second->commonTpcHits();
00884 }
00885 }
00886 StHitIterator rcHitIt;
00887 StMcTpcHitIterator mcHitIt;
00888 StMcSvtHitIterator mcSitIt;
00889 StPtrVecHit theHits = firstTrack->detectorInfo()->hits();
00890 for (rcHitIt = theHits.begin();
00891 rcHitIt != theHits.end();
00892 rcHitIt++) coordRec->Fill((*rcHitIt)->position().x(),(*rcHitIt)->position().y());
00893 if (partner) {
00894 for (mcHitIt = ((std::vector<StMcTpcHit*> *)&partner->tpcHits() )->begin();
00895 mcHitIt != partner->tpcHits().end();
00896 mcHitIt++) coordMcPartner->Fill((*mcHitIt)->position().x(),(*mcHitIt)->position().y());
00897 for (mcSitIt = ((std::vector<StMcSvtHit*> *)&partner->svtHits())->begin();
00898 mcSitIt != partner->svtHits().end();
00899 mcSitIt++) coordMcPartner->Fill((*mcSitIt)->position().x(),(*mcSitIt)->position().y());
00900
00901 }
00902 if (!theMcV0Map) {
00903 gMessMgr->Warning() << "----------WARNING----------\n"
00904 << "No V0 Map found for this event!" << endm;
00905 return kStWarn;
00906 }
00907
00908
00909 StSPtrVecMcVertex& mcVertices = mEvent->vertices();
00910 const StV0Vertex* rcV0Partner;
00911 StMcVertexIterator mcVertexIt;
00912
00913
00914 bool foundV0Pair = false;
00915 for (mcVertexIt = mcVertices.begin(); mcVertexIt != mcVertices.end();
00916 mcVertexIt++){
00917
00918 pair<mcV0MapIter,mcV0MapIter> mcV0Bounds = theMcV0Map->equal_range(*mcVertexIt);
00919
00920
00921
00922 if (mcV0Bounds.first != mcV0Bounds.second) {
00923 cout << "Printing Position of a V0 pair:\n";
00924 cout << "Position of MC V0 vertex: " << (*mcVertexIt)->position() << endl;
00925 foundV0Pair = true;
00926 }
00927
00928 for(mcV0MapIter mcV0MapIt = mcV0Bounds.first;
00929 mcV0MapIt != mcV0Bounds.second; ++mcV0MapIt){
00930 rcV0Partner = (*mcV0MapIt).second;
00931 cout << "Position of rc V0 vertex: " << rcV0Partner->position() << endl;
00932
00933 }
00934 if (foundV0Pair) break;
00935 }
00936
00937
00938
00939
00940
00941 return kStOK;
00942 }