15 #include "TTreeHelper.h"
17 #include "StarRoot/TUnixTime.h"
19 #include "StMessMgr.h"
20 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
21 #include "StMuDSTMaker/COMMON/StMuDst.h"
22 #include "StMuDSTMaker/COMMON/StMuEvent.h"
23 #include "StMuDSTMaker/COMMON/StMuTrack.h"
24 #include "StMuDSTMaker/COMMON/StMuPrimaryVertex.h"
25 #include "StBTofHeader.h"
26 #include "StThreeVectorF.hh"
27 #include "StPhysicalHelixD.hh"
30 void makeMuDstQA(TString InputFileList, Int_t nFiles = 1, Int_t nEvents = 0, TString OutputDir =
"output/" );
32 void makeMuDstQA(TString InputFileList, Int_t nFiles, Int_t nEvents, TString OutputDir )
37 gROOT -> Macro(
"loadMuDst.C");
47 muDstMaker -> SetStatus(
"*",0) ;
48 muDstMaker -> SetStatus(
"MuEvent",1) ;
49 muDstMaker -> SetStatus(
"PrimaryVertices",1) ;
50 muDstMaker -> SetStatus(
"PrimaryTracks",1) ;
51 muDstMaker -> SetStatus(
"GlobalTracks",1) ;
52 muDstMaker -> SetStatus(
"CovGlobTrack",1);
53 muDstMaker -> SetStatus(
"BTofHeader",1) ;
54 muDstMaker -> SetDebug(0) ;
56 if ( nEvents == 0 ) nEvents = 10000000 ;
60 TString oFile(muDstMaker->
GetFile());
62 int fileBeginIndex = oFile.Index(
"st_",0);
63 oFile.Remove(0,fileBeginIndex);
64 short indx1 = oFile.First(
'.');
65 short indx2 = oFile.Last(
'.');
66 if (indx1!=indx2) oFile.Remove(indx1+1,(indx2-indx1));
68 oFile.Insert(indx1+1,
"moretags.");
69 oFile.Prepend(OutputDir);
70 oChopFile.Insert(indx1+1,
"chopper.");
71 oChopFile.ReplaceAll(
"root",
"txt");
72 oChopFile.Prepend(OutputDir);
74 ofstream chop_output(oChopFile);
76 TFile *tags_output =
new TFile( oFile,
"recreate" ) ;
84 Int_t mnRefMult, mnRefMult2, mnRefMult3, mnRefMult4, mngRefMult, mnTofMatch;
85 Double_t mVX, mVY, mVZ;
86 Double_t mVXsigma, mVYsigma, mVZsigma;
89 Double_t mEvtTime, mProdTime, mmagField;
90 TTree *mMoreTagsTree =
new TTree(
"MoreTags",
"MoreTags");
91 mMoreTagsTree->Branch(
"RunId",&mRunId,
"RunId/I");
92 mMoreTagsTree->Branch(
"EvtId",&mEvtId,
"EvtId/I");
93 mMoreTagsTree->Branch(
"EvtTime",&mEvtTime,
"EvtTime/D");
94 mMoreTagsTree->Branch(
"ProdTime",&mProdTime,
"ProdTime/D");
95 mMoreTagsTree->Branch(
"magField",&mmagField,
"magField/D");
96 mMoreTagsTree->Branch(
"nRefMult",&mnRefMult,
"nRefMult/I");
97 mMoreTagsTree->Branch(
"nRefMult2",&mnRefMult2,
"nRefMult2/I");
98 mMoreTagsTree->Branch(
"nRefMult3",&mnRefMult3,
"nRefMult3/I");
99 mMoreTagsTree->Branch(
"nRefMult4",&mnRefMult4,
"nRefMult4/I");
100 mMoreTagsTree->Branch(
"ngRefMult",&mngRefMult,
"ngRefMult/I");
101 mMoreTagsTree->Branch(
"nTofMatch",&mnTofMatch,
"nTofMatch/I");
102 mMoreTagsTree->Branch(
"VX",&mVX,
"VX/D");
103 mMoreTagsTree->Branch(
"VY",&mVY,
"VY/D");
104 mMoreTagsTree->Branch(
"VZ",&mVZ,
"VZ/D");
105 mMoreTagsTree->Branch(
"VXsigma",&mVXsigma,
"VXsigma/D");
106 mMoreTagsTree->Branch(
"VYsigma",&mVYsigma,
"VYsigma/D");
107 mMoreTagsTree->Branch(
"VZsigma",&mVZsigma,
"VZsigma/D");
108 mMoreTagsTree->Branch(
"VpdVz",&mVpdVz,
"VpdVz/F");
109 mMoreTagsTree->Branch(
"PVRank",&mPVRank,
"PVRank/F");
110 mMoreTagsTree->SetAutoSave(10000000);
116 Int_t iInit = chain -> Init() ;
117 if (iInit) chain->FatalErr(iInit,
"on init");
120 Int_t istat = 0, i = 1;
121 while (i <= nEvents && istat != 2) {
122 if(i%10==0)cout << endl <<
"== Event " << i <<
" start ==" << endl;
124 istat = chain->
Make(i);
127 cout <<
"Last event processed. Status = " << istat << endl;
129 cout <<
"Error event processed. Status = " << istat << endl;
132 if(istat !=
kStOK)
continue;
141 LOG_WARN <<
" No MuDst " << endm;
continue;
146 LOG_WARN <<
" No MuEvent " << endm;
continue;
152 if (mBTofHeader) vzVpd = mBTofHeader->vpdVz();
156 enum PicoVtxMode {NotSet=0, Default=1, Vpd=2, VpdOrDefault=3};
157 PicoVtxMode mVtxMode;
160 mVtxMode = VpdOrDefault;
161 const double mTpcVpdVzDiffCut = 3;
167 if (mVtxMode == Default) {
172 else if (mVtxMode == Vpd || mVtxMode == VpdOrDefault) {
174 if(mVtxMode == VpdOrDefault) {
181 if (mBTofHeader && fabs(mBTofHeader->vpdVz()) < 200) {
182 float vzVPD = mBTofHeader->vpdVz();
184 for (
unsigned int iVtx = 0; iVtx < mMuDst->numberOfPrimaryVertices(); ++iVtx) {
188 if (fabs(vzVPD - vtx->position().z()) < mTpcVpdVzDiffCut) {
197 LOG_ERROR <<
"Pico Vtx Mode not set!" << endm;
202 if ( ! selectedVertex ){
203 LOG_INFO <<
"Vertex is not valid" << endm;
210 mRunId = mMuEvent->runNumber();
211 mEvtId = mMuEvent->eventNumber();
215 TDatime EventTime, ProdTime;
216 TUnixTime unixTime(mMuEvent->eventInfo().time());
218 unixTime.GetGTime(dat,tim);
219 EventTime.Set(dat,tim);
220 unixTime.SetUTime(mMuEvent->runInfo().productionTime());
221 unixTime.GetGTime(dat,tim);
222 ProdTime.Set(dat,tim);
223 mEvtTime = EventTime.GetDate() + EventTime.GetTime()/1000000.;
224 mProdTime= ProdTime.GetDate() + ProdTime.GetTime()/1000000. ;
227 mmagField = mMuEvent->runInfo().magneticField();
229 mnRefMult = mMuEvent->
refMult();
231 Int_t nTofMatPrTrack = 0;
236 TObjArrayIter GetPrTracks(prtracks) ;
238 while ( ( prtrack = (
StMuTrack*)GetPrTracks.Next() ) )
240 if(prtrack->btofPidTraits().
matchFlag()) nTofMatPrTrack ++;
242 if (prtrack->
flag() < 0 || fabs(prtrack->
momentum().mag()) < 1.e-10
243 || prtrack->
dca().mag() > 3 || fabs(prtrack->
momentum().pseudoRapidity()) > 1)
continue;
244 double const eta = prtrack->
momentum().pseudoRapidity() ;
245 double const beta = prtrack->btofPidTraits().beta();
246 double const mass2 = beta <= 1.e-5 ? -999. : prtrack->
momentum().mag2() * (std::pow(1. / beta, 2) - 1);
247 if (prtrack->
nHitsFit(kTpcId) >= 10) {
249 if (fabs(eta) > 0.5) nprTrack2 += 1;
251 if (prtrack->
nSigmaProton() < -3. && mass2 < 0.4) nprTrack3 += 1;
253 if (prtrack->
nHitsFit(kTpcId) >= 15) {
255 if ((mass2 <= -990. && fabs(prtrack->
nSigmaKaon()) > 3) ||
256 (mass2 > -990. && (mass2 > 0.6 || mass2 < 0.1)))
260 mnTofMatch = nTofMatPrTrack;
261 mnRefMult2 = nprTrack2;
262 mnRefMult3 = nprTrack3;
263 mnRefMult4 = nprTrack4;
268 mVXsigma = mMuEvent->primaryVertexErrors().x();
269 mVYsigma = mMuEvent->primaryVertexErrors().y();
270 mVZsigma = mMuEvent->primaryVertexErrors().z();
278 TObjArrayIter GetGlTracks(gltracks) ;
280 while ( ( gltrack = (
StMuTrack*)GetGlTracks.Next() ) )
282 if(fabs(gltrack->
eta())>=0.5)
continue;
284 if(gltrack->
dca().mag()>=3.0)
continue;
287 mngRefMult = nGlTrack;
290 mMoreTagsTree->Fill();
300 if ( ! selectedVertex )
continue;
302 if ( ! mMuEvent->triggerIdCollection().nominal().isTrigger(520001) && ! mMuEvent->triggerIdCollection().nominal().isTrigger(520011) && ! mMuEvent->triggerIdCollection().nominal().isTrigger(520021) && ! mMuEvent->triggerIdCollection().nominal().isTrigger(520031) && ! mMuEvent->triggerIdCollection().nominal().isTrigger(520041) && ! mMuEvent->triggerIdCollection().nominal().isTrigger(520051) )
continue ;
313 chop_output<<mRunId<<
'\t'<<mEvtId<<endl;
337 if (nEvents > 1) chain ->
Finish() ;
339 if(tags_output!=NULL) tags_output ->
Write() ;
340 if(tags_output!=NULL) tags_output -> Close() ;
static StMuPrimaryVertex * primaryVertex()
return pointer to current primary vertex
static TObjArray * globalTracks()
returns pointer to the global tracks list
StThreeVectorF primaryVertexPosition(int vtx_id=-1) const
The StMuDst is supposed to be structured in 'physical events'. Therefore there is only 1 primary vert...
virtual void Clear(Option_t *option="")
User defined functions.
virtual const char * GetFile() const
Returns name of current input or output file, depending on mode (GetFileName does the same...
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
unsigned char matchFlag() const
Matching information.
UShort_t nHitsFit() const
Return total number of hits used in fit.
short flag() const
Returns flag, (see StEvent manual for type information)
Double_t eta() const
Returns pseudo rapidity at point of dca to primary vertex.
static TObjArray * primaryTracks()
returns pointer to a list of tracks belonging to the selected primary vertex
unsigned short refMult(int vtx_id=-1)
Reference multiplicity of charged particles as defined in StEventUtilities/StuRefMult.hh for vertex vtx_id (-1 is default index from StMuDst)
static StMuEvent * event()
returns pointer to current StMuEvent (class holding the event wise information, e.g. event number, run number)
const StThreeVectorF & momentum() const
Returns 3-momentum at dca to primary vertex.
StThreeVectorF dca(Int_t vtx_id=-1) const
Returns 3D distance of closest approach to primary vertex.
static StBTofHeader * btofHeader()
returns pointer to the btofHeader - dongx
Double_t nSigmaProton() const
Returns Craig's distance to the calculated dE/dx band for protons in units of sigma.
static Int_t currentVertexIndex()
Get the index number of the current primary vertex.
Double_t nSigmaKaon() const
Returns Craig's distance to the calculated dE/dx band for kaons in units of sigma.
static void setVertexIndex(Int_t vtx_id)
Set the index number of the current primary vertex (used by both primaryTracks() functions and for St...