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 #include <assert.h>
00043
00044 #include "TError.h"
00045 #include "TH1.h"
00046 #include "TStyle.h"
00047
00048 #include "StEmbeddingQAUtilities.h"
00049 #include "StMessMgr.h"
00050 #include "StParticleDefinition.hh"
00051 #include "StParticleTable.hh"
00052
00053 StEmbeddingQAUtilities* StEmbeddingQAUtilities::mInstance = 0 ;
00054
00055
00056 StEmbeddingQAUtilities::StEmbeddingQAUtilities()
00057 {
00059
00069
00070 mCategory[0] = MC ; mCategoryName[0] = "MC"; mCategoryTitle[0] = "MC tracks";
00071 mCategory[1] = MATCHED ; mCategoryName[1] = "MATCHED"; mCategoryTitle[1] = "Matched pairs" ;
00072 mCategory[2] = GHOST ; mCategoryName[2] = "GHOST"; mCategoryTitle[2] = "Ghost pairs" ;
00073 mCategory[3] = CONTAM ; mCategoryName[3] = "CONTAM"; mCategoryTitle[3] = "Contaminated pairs" ;
00074 mCategory[4] = MATGLOB ; mCategoryName[4] = "MATGLOB"; mCategoryTitle[4] = "Matched global pairs" ;
00075 mCategoryName[5] = "PRIMARY"; mCategoryTitle[5] = "Primary tracks (real)";
00076 mCategoryName[6] = "GLOBAL"; mCategoryTitle[6] = "Global tracks (real)";
00077
00078 mCategoryId.insert( pair<const TString, const UInt_t>(mCategoryName[0], 0) );
00079 mCategoryId.insert( pair<const TString, const UInt_t>(mCategoryName[1], 1) );
00080 mCategoryId.insert( pair<const TString, const UInt_t>(mCategoryName[2], 2) );
00081 mCategoryId.insert( pair<const TString, const UInt_t>(mCategoryName[3], 3) );
00082 mCategoryId.insert( pair<const TString, const UInt_t>(mCategoryName[4], 4) );
00083 mCategoryId.insert( pair<const TString, const UInt_t>(mCategoryName[5], 5) );
00084 mCategoryId.insert( pair<const TString, const UInt_t>(mCategoryName[6], 6) );
00085
00086
00087 mPtMinCut = 0.1 ;
00088 mPtMaxCut = 10.0 ;
00089 mEtaCut = 1.5 ;
00090 mNHitCut = 10 ;
00091 mNHitToNPossCut = 0.51 ;
00092 mDcaCut = 3.0 ;
00093 mNSigmaCut = 2.0 ;
00094 mRapidityCut = 10.0 ;
00095 mZVertexCut = 30.0 ;
00096 mRefMultMinCut = 0 ;
00097 mRefMultMaxCut = 1000 ;
00098 mTriggerIdCut.clear() ;
00099 }
00100
00101
00102 StEmbeddingQAUtilities::~StEmbeddingQAUtilities()
00103 {
00105 }
00106
00107
00108 StEmbeddingQAUtilities* StEmbeddingQAUtilities::instance()
00109 {
00111
00113 if ( !mInstance ) mInstance = new StEmbeddingQAUtilities();
00114
00116 return mInstance ;
00117 }
00118
00119
00120
00121 Category StEmbeddingQAUtilities::getCategory(const UInt_t id) const
00122 {
00124 if ( id >= StEmbeddingQAConst::mNEmbedding ){
00125 Error("StEmbeddingQAUtilities::getCategory", "Unknown category id, id=%3d. Return MC", id);
00126 return mCategory[0] ;
00127 }
00128
00129 return mCategory[id] ;
00130 }
00131
00132
00133 TString StEmbeddingQAUtilities::getCategoryName(const UInt_t id) const
00134 {
00136 if( id >= StEmbeddingQAConst::mNCategory ){
00137 Error("StEmbeddingQAUtilities::getCategoryName", "Unknown category id, id=%3d. Return MC name", id);
00138 return mCategoryName[0];
00139 }
00140
00141 return mCategoryName[id] ;
00142 }
00143
00144
00145 TString StEmbeddingQAUtilities::getCategoryTitle(const UInt_t id) const
00146 {
00148 if( id >= StEmbeddingQAConst::mNCategory ){
00149 Error("StEmbeddingQAUtilities::getCategoryTitle", "Unknown category id, id=%3d. Return MC title", id);
00150 return mCategoryTitle[0] ;
00151 }
00152
00153 return mCategoryTitle[id] ;
00154 }
00155
00156
00157 Int_t StEmbeddingQAUtilities::getCategoryId(const TString name) const
00158 {
00160
00161 map<const TString, const UInt_t>::const_iterator iter = mCategoryId.find(name);
00162
00163 if( iter != mCategoryId.end() ) return iter->second ;
00164 else{
00165 Error("StEmbeddingQAUtilities::getCategoryId", "Unknown category name, name=%s. Return MC id", name.Data());
00166 return 0;
00167 }
00168 }
00169
00170
00171 Bool_t StEmbeddingQAUtilities::CompareString(const TString s0, const TString s1, const Bool_t isExact) const
00172 {
00176
00177 return (isExact) ? s0.CompareTo(s1)==0 : s0.CompareTo(s1, TString::kIgnoreCase)==0 ;
00178 }
00179
00180
00181 Bool_t StEmbeddingQAUtilities::isMc(const TString name) const
00182 {
00184
00185 return CompareString(name, mCategoryName[0]);
00186 }
00187
00188
00189 Bool_t StEmbeddingQAUtilities::isMatched(const TString name) const
00190 {
00192
00193 return CompareString(name, mCategoryName[1]);
00194 }
00195
00196
00197 Bool_t StEmbeddingQAUtilities::isGhost(const TString name) const
00198 {
00200
00201 return CompareString(name, mCategoryName[2]);
00202 }
00203
00204
00205 Bool_t StEmbeddingQAUtilities::isContaminated(const TString name) const
00206 {
00208
00209 return CompareString(name, mCategoryName[3]);
00210 }
00211
00212
00213 Bool_t StEmbeddingQAUtilities::isMatchedGlobal(const TString name) const
00214 {
00216
00217 return CompareString(name, mCategoryName[4]);
00218 }
00219
00220
00221 Bool_t StEmbeddingQAUtilities::isPrimary(const TString name) const
00222 {
00224
00225 return CompareString(name, mCategoryName[5]) ;
00226 }
00227
00228
00229 Bool_t StEmbeddingQAUtilities::isGlobal(const TString name) const
00230 {
00232
00233 return CompareString(name, mCategoryName[6]) ;
00234 }
00235
00236
00237 Bool_t StEmbeddingQAUtilities::isEmbedding(const TString name) const
00238 {
00241
00242 return isMatched(name) || isGhost(name) || isContaminated(name) || isMatchedGlobal(name) ;
00243 }
00244
00245
00246 Bool_t StEmbeddingQAUtilities::isReal(const TString name) const
00247 {
00250
00251 return isPrimary(name) || isGlobal(name) ;
00252 }
00253
00254
00255 Bool_t StEmbeddingQAUtilities::isPositron(const Int_t geantid) const { return geantid==2 ; }
00256
00257
00258 Bool_t StEmbeddingQAUtilities::isElectron(const Int_t geantid) const { return geantid==3 ; }
00259
00260
00261 Bool_t StEmbeddingQAUtilities::isPiPlus(const Int_t geantid) const { return geantid==8 ; }
00262
00263
00264 Bool_t StEmbeddingQAUtilities::isPiMinus(const Int_t geantid) const { return geantid==9 ; }
00265
00266
00267 Bool_t StEmbeddingQAUtilities::isKPlus(const Int_t geantid) const { return geantid==11 ; }
00268
00269
00270 Bool_t StEmbeddingQAUtilities::isKMinus(const Int_t geantid) const { return geantid==12 ; }
00271
00272
00273 Bool_t StEmbeddingQAUtilities::isProton(const Int_t geantid) const { return geantid==14 ; }
00274
00275
00276 Bool_t StEmbeddingQAUtilities::isPBar(const Int_t geantid) const { return geantid==15 ; }
00277
00278
00279 Bool_t StEmbeddingQAUtilities::isElectrons(const Int_t geantid) const
00280 {
00283
00284 return (isElectron(geantid) || isPositron(geantid));
00285 }
00286
00287
00288 Bool_t StEmbeddingQAUtilities::isPions(const Int_t geantid) const
00289 {
00292
00293 return (isPiPlus(geantid) || isPiMinus(geantid));
00294 }
00295
00296
00297 Bool_t StEmbeddingQAUtilities::isKaons(const Int_t geantid) const
00298 {
00301
00302 return (isKPlus(geantid) || isKMinus(geantid));
00303 }
00304
00305
00306 Bool_t StEmbeddingQAUtilities::isProtons(const Int_t geantid) const
00307 {
00310
00311 return (isProton(geantid) || isPBar(geantid)) ;
00312 }
00313
00314
00315 Bool_t StEmbeddingQAUtilities::isEPiKP(const Int_t geantid) const
00316 {
00318
00319 return isElectrons(geantid) || isPions(geantid) || isKaons(geantid) || isProtons(geantid) ;
00320 }
00321
00322
00323 Bool_t StEmbeddingQAUtilities::isGamma(const Int_t geantid) const
00324 {
00326
00327 return (geantid == 1) ;
00328 }
00329
00330
00331 void StEmbeddingQAUtilities::setStyle() const
00332 {
00333
00334
00336 const Int_t font = 42;
00337
00338
00340 gStyle->SetOptStat(0);
00341
00343 gStyle->SetPalette(1);
00344
00345
00347 gStyle->SetPadColor(10);
00348 gStyle->SetCanvasColor(10);
00349 gStyle->SetFrameLineWidth(2);
00350 gStyle->SetPadTickX(1);
00351 gStyle->SetPadTickY(1);
00352 gStyle->SetPadRightMargin(0.15);
00353 gStyle->SetPadLeftMargin(0.21);
00354 gStyle->SetPadTopMargin(0.10);
00355 gStyle->SetPadBottomMargin(0.20);
00356
00357
00359 gStyle->SetStatColor(10);
00360
00361
00363 gStyle->SetTextSize(0.07);
00364 gStyle->SetTextFont(font);
00365
00366
00369 gStyle->SetNdivisions(505,"XYZ");
00370
00372 gStyle->SetLabelSize(0.07, "XYZ");
00373 gStyle->SetLabelOffset(0.011, "XYZ");
00374 gStyle->SetLabelFont(font, "XYZ");
00375
00377 gStyle->SetTitleSize(0.085, "XYZ");
00378 gStyle->SetTitleOffset(1.05, "X");
00379 gStyle->SetTitleOffset(1.18, "Y");
00380 gStyle->SetTitleFont(font, "XYZ");
00381
00383 gStyle->SetTitleFont(42, "t");
00384
00386 gStyle->SetTitleH(0.07);
00387 gStyle->SetTitleW(0.6);
00388 gStyle->SetTitleBorderSize(0);
00389 gStyle->SetTitleFillColor(10);
00390 gStyle->SetTitleX(0.1);
00391
00392
00394 gStyle->SetLegendBorderSize(0);
00395
00397 gStyle->SetOptDate(3);
00398 gStyle->GetAttDate()->SetTextFont(52);
00399 gStyle->GetAttDate()->SetTextColor(10);
00400 gStyle->GetAttDate()->SetTextSize(0.03);
00401 }
00402
00403
00404 void StEmbeddingQAUtilities::setStyle(TH1* h) const
00405 {
00407
00408 LOG_DEBUG << "setStyle() for " << h->GetName() << endm;
00409
00411 const Int_t font = 42 ;
00412 h->GetXaxis()->SetTitleFont(font);
00413 h->GetYaxis()->SetTitleFont(font);
00414 h->GetZaxis()->SetTitleFont(font);
00415
00417 h->SetTitleSize(0.085, "X"); h->SetTitleSize(0.085, "Y"); h->SetTitleSize(0.085, "Z");
00418 h->SetTitleOffset(1.05, "X");
00419 h->SetTitleOffset(1.18, "Y");
00420
00422 h->SetLabelSize(0.07, "X"); h->SetLabelSize(0.07, "Y"); h->SetLabelSize(0.07, "Z");
00423 h->SetLabelOffset(0.011, "X"); h->SetLabelOffset(0.011, "Y"); h->SetLabelOffset(0.011, "Z");
00424 h->SetLabelFont(font, "X"); h->SetLabelFont(font, "Y"); h->SetLabelFont(font, "Z");
00425 h->SetNdivisions(505,"X"); h->SetNdivisions(505,"Y"); h->SetNdivisions(505,"Z");
00426
00428 h->SetLineWidth(2);
00429 }
00430
00431
00432 StParticleDefinition* StEmbeddingQAUtilities::getParticleDefinition(const UInt_t geantid) const
00433 {
00435 if(!isGeantIdOk(geantid)) {
00436 LOG_ERROR << Form("StEmbeddingQAUtilities::getParticleDefinition Cannot find geantid=%d in StParticleTable", geantid) << endm;
00437 LOG_ERROR << "StEmbeddingQAUtilities::getParticleDefinition You should check out the latest StRoot/StarClassLibrary from CVS" << endm;
00438 assert(0);
00439 }
00440
00441 return StParticleTable::instance()->findParticleByGeantId(geantid);
00442 }
00443
00444
00445 Bool_t StEmbeddingQAUtilities::isGeantIdOk(const UInt_t geantid) const
00446 {
00449
00450 return StParticleTable::instance()->containsGeantId(geantid);
00451 }
00452
00453
00454 Int_t StEmbeddingQAUtilities::getGeantId(const UInt_t geantid) const
00455 {
00458 return ( geantid > 50000 ) ? geantid%50000 : geantid ;
00459 }
00460
00461
00462 Float_t StEmbeddingQAUtilities::getPtMinCut() const { return mPtMinCut ; }
00463
00464
00465 Float_t StEmbeddingQAUtilities::getPtMaxCut() const { return mPtMaxCut ; }
00466
00467
00468 Float_t StEmbeddingQAUtilities::getEtaCut() const { return mEtaCut ; }
00469
00470
00471 Short_t StEmbeddingQAUtilities::getNHitCut() const { return mNHitCut ; }
00472
00473
00474 Float_t StEmbeddingQAUtilities::getNHitToNPossCut() const { return mNHitToNPossCut ; }
00475
00476
00477 Float_t StEmbeddingQAUtilities::getDcaCut() const { return mDcaCut ; }
00478
00479
00480 Double_t StEmbeddingQAUtilities::getNSigmaCut() const { return mNSigmaCut ; }
00481
00482
00483 Float_t StEmbeddingQAUtilities::getRapidityCut() const { return mRapidityCut ; }
00484
00485
00486 Int_t StEmbeddingQAUtilities::getRefMultMinCut() const { return mRefMultMinCut ; }
00487
00488
00489 Int_t StEmbeddingQAUtilities::getRefMultMaxCut() const { return mRefMultMaxCut ; }
00490
00491
00492 Float_t StEmbeddingQAUtilities::getZVertexCut() const { return mZVertexCut ; }
00493
00494
00495 vector<UInt_t> StEmbeddingQAUtilities::getTriggerIdCut() const { return mTriggerIdCut ; }
00496
00497
00498 Float_t StEmbeddingQAUtilities::setPtMinCut(const Float_t val)
00499 {
00500 mPtMinCut = val ;
00501 LOG_INFO << "StEmbeddingQAUtilities::setPtMinCut Minimum pt cut off = " << mPtMinCut
00502 << endm;
00503 return getPtMinCut() ;
00504 }
00505
00506
00507 Float_t StEmbeddingQAUtilities::setPtMaxCut(const Float_t val)
00508 {
00509 mPtMaxCut = val ;
00510 LOG_INFO << "StEmbeddingQAUtilities::setPtMaxCut Maximum pt cut off = " << mPtMaxCut
00511 << endm;
00512 return getPtMaxCut() ;
00513 }
00514
00515
00516 Float_t StEmbeddingQAUtilities::setEtaCut(const Float_t val)
00517 {
00518 mEtaCut = val ;
00519 LOG_INFO << "StEmbeddingQAUtilities::setEtaCut eta cut = " << mEtaCut
00520 << endm;
00521 return getEtaCut() ;
00522 }
00523
00524
00525 Short_t StEmbeddingQAUtilities::setNHitCut(const Short_t val)
00526 {
00527 mNHitCut = val ;
00528 LOG_INFO << "StEmbeddingQAUtilities::setNHitCut nHitsFit cut = " << mNHitCut
00529 << endm;
00530 return getNHitCut() ;
00531 }
00532
00533
00534 Float_t StEmbeddingQAUtilities::setNHitToNPossCut(const Float_t val)
00535 {
00536 mNHitToNPossCut = val ;
00537 LOG_INFO << "StEmbeddingQAUtilities::setNHitToNPossCut Ratio of nHitsFit to nHitsPoss cut = " << mNHitToNPossCut
00538 << endm;
00539 return getNHitToNPossCut() ;
00540 }
00541
00542
00543 Float_t StEmbeddingQAUtilities::setDcaCut(const Float_t val)
00544 {
00545 mDcaCut = val ;
00546 LOG_INFO << "StEmbeddingQAUtilities::setDcaCut Dca cut = " << mDcaCut
00547 << endm;
00548 return getDcaCut() ;
00549 }
00550
00551
00552 Double_t StEmbeddingQAUtilities::setNSigmaCut(const Double_t val)
00553 {
00554 mNSigmaCut = val ;
00555 LOG_INFO << "StEmbeddingQAUtilities::setNSigmaCut NSigma cut = " << mNSigmaCut
00556 << endm;
00557 return getNSigmaCut() ;
00558 }
00559
00560
00561 Float_t StEmbeddingQAUtilities::setRapidityCut(const Float_t val)
00562 {
00563 mRapidityCut = val ;
00564 LOG_INFO << "StEmbeddingQAUtilities::setRapidityCut Rapidity cut = " << mRapidityCut
00565 << endm;
00566 return getRapidityCut() ;
00567 }
00568
00569
00570 Int_t StEmbeddingQAUtilities::setRefMultMinCut(const Int_t val)
00571 {
00572 mRefMultMinCut = val ;
00573 LOG_INFO << "StEmbeddingQAUtilities::setRefMultCut refMult cut >= " << mRefMultMinCut
00574 << endm;
00575 return getRefMultMinCut() ;
00576 }
00577
00578
00579 Int_t StEmbeddingQAUtilities::setRefMultMaxCut(const Int_t val)
00580 {
00581 mRefMultMaxCut = val ;
00582 LOG_INFO << "StEmbeddingQAUtilities::setRefMultCut refMult cut < " << mRefMultMaxCut
00583 << endm;
00584 return getRefMultMaxCut() ;
00585 }
00586
00587
00588 Float_t StEmbeddingQAUtilities::setZVertexCut(const Float_t val)
00589 {
00590 mZVertexCut = val ;
00591 LOG_INFO << "StEmbeddingQAUtilities::setZVertexCut z-vertex cut = " << mZVertexCut
00592 << endm;
00593 return getZVertexCut() ;
00594 }
00595
00596
00597 void StEmbeddingQAUtilities::addTriggerIdCut(const UInt_t val)
00598 {
00599 mTriggerIdCut.push_back(val);
00600 LOG_INFO << "StEmbeddingQAUtilities::addTriggerIdCut add new trigger id = " << val
00601 << endm;
00602 }
00603
00604
00605 Bool_t StEmbeddingQAUtilities::isPtOk(const Float_t pt) const
00606 {
00607 return (pt > mPtMinCut && pt < mPtMaxCut ) ;
00608 }
00609
00610
00611 Bool_t StEmbeddingQAUtilities::isEtaOk(const Float_t eta) const
00612 {
00613 return TMath::Abs(eta) < mEtaCut ;
00614 }
00615
00616
00617 Bool_t StEmbeddingQAUtilities::isNHitsFitOk(const Float_t nHitsFit) const
00618 {
00619 return nHitsFit > mNHitCut ;
00620 }
00621
00622 Bool_t StEmbeddingQAUtilities::isNHitToNPossOk(const Float_t ratio) const
00623 {
00624 return ratio > mNHitToNPossCut ;
00625 }
00626
00627 Bool_t StEmbeddingQAUtilities::isDcaOk(const Float_t dca) const
00628 {
00629 return ( dca > -mDcaCut && dca < mDcaCut ) ;
00630 }
00631
00632 Bool_t StEmbeddingQAUtilities::isNSigmaOk(const Float_t nsigma) const
00633 {
00634 return TMath::Abs(nsigma) < mNSigmaCut ;
00635 }
00636
00637
00638 Bool_t StEmbeddingQAUtilities::isRapidityOk(const Float_t y) const
00639 {
00640 return TMath::Abs(y) < mRapidityCut ;
00641 }
00642
00643
00644 Bool_t StEmbeddingQAUtilities::isRefMultOk(const Int_t refMult) const
00645 {
00646 return ((refMult >= mRefMultMinCut) && (refMult < mRefMultMaxCut)) ;
00647 }
00648
00649
00650 Bool_t StEmbeddingQAUtilities::isZVertexOk(const Float_t vz) const
00651 {
00652 return TMath::Abs(vz) < mZVertexCut ;
00653 }
00654
00655
00656 Bool_t StEmbeddingQAUtilities::isTriggerOk(const UInt_t trigger) const
00657 {
00658
00659 if ( mTriggerIdCut.empty() ) return kTRUE ;
00660
00661 for(UInt_t i=0; i<mTriggerIdCut.size(); i++) {
00662 if ( trigger == mTriggerIdCut[i] ) return kTRUE ;
00663 }
00664
00665
00666 return kFALSE ;
00667 }
00668
00669
00670 void StEmbeddingQAUtilities::PrintCuts() const
00671 {
00672 LOG_INFO << "#----------------------------------------------------------------------------------------------------" << endm;
00673 LOG_INFO << " StEmbeddingQAUtilities::PrintCuts()" << endm;
00674 LOG_INFO << " Track-wise selections ==================================================" << endm;
00675 LOG_INFO << Form(" pt cut : %1.1f - %1.1f GeV/c", getPtMinCut(), getPtMaxCut()) << endm;
00676 LOG_INFO << Form(" eta cut : |eta| < %1.1f", getEtaCut()) << endm;
00677 LOG_INFO << Form(" nHitsFit cut : nHitsfit > %2d", getNHitCut()) << endm;
00678 LOG_INFO << Form(" nHits/nHitsMax cut : ratio > %1.2f", getNHitToNPossCut()) << endm;
00679 LOG_INFO << Form(" dca cut : dca < %1.1f cm", getDcaCut()) << endm;
00680 LOG_INFO << Form(" nsigma cut : nsigma < %1.1f", getNSigmaCut()) << endm;
00681 LOG_INFO << Form(" rapidity cut : |y| < %1.1f", getRapidityCut()) << endm;
00682 LOG_INFO << " Event-wise selections ==================================================" << endm;
00683 LOG_INFO << Form(" z-vertex cut : |vz| < %1.1f cm", getZVertexCut()) << endm;
00684 LOG_INFO << Form(" refMult cut : %i <= refMult < %i", getRefMultMinCut(), getRefMultMaxCut()) << endm;
00685 if ( !mTriggerIdCut.empty() ) {
00686 for(UInt_t i=0; i<mTriggerIdCut.size(); i++) {
00687 LOG_INFO << Form(" trigger id cut : id = %10d", mTriggerIdCut[i]) << endm;
00688 }
00689 }
00690 LOG_INFO << "#----------------------------------------------------------------------------------------------------" << endm;
00691 }
00692
00693