15 #include "StEvent/StEvent.h"
16 #include "StGenericVertexMaker/Minuit/StMinuitVertexFinder.h"
17 #include "StGenericVertexMaker/StFixedVertexFinder.h"
18 #include "StGenericVertexMaker/StGenericVertexFinder.h"
19 #include "StGenericVertexMaker/StGenericVertexMaker.h"
20 #include "StGenericVertexMaker/StiPPVertex/StPPVertexFinder.h"
21 #include "StGenericVertexMaker/StppLMVVertexFinder.h"
22 #include "StGenericVertexMaker/StvPPVertex/StPPVertexFinder.h"
23 #include "St_base/StMessMgr.h"
24 #include "St_db_Maker/St_db_Maker.h"
25 #include "tables/St_g2t_vertex_Table.h"
38 StGenericVertexMaker::StGenericVertexMaker(
const char *name):
StMaker(name),
45 externalFindUse(true),
57 StGenericVertexMaker::~StGenericVertexMaker()
59 SafeDelete(theFinder);
81 useITTF = IAttr(
"ITTF");
82 useBeamline = IAttr(
"beamLine");
83 useCTB = IAttr(
"CTB");
84 usePCT = IAttr(
"PCT");
85 useBTOF = IAttr(
"BTOF");
87 minTracks = IAttr(
"minTracks");
89 bool isMinuit = ( IAttr(
"VFMinuit") || IAttr(
"VFMinuit2") || IAttr(
"VFMinuit3") );
90 bool isPPV = ( IAttr(
"VFPPV") || IAttr(
"VFPPVnoCTB") || IAttr(
"VFPPVEv") || IAttr(
"VFPPVEvNoBTof") );
93 StGenericVertexFinder::VertexFit_t vertexFitMode;
95 if ( IAttr(
"beamline") && isPPV)
96 vertexFitMode = StGenericVertexFinder::VertexFit_t::BeamlineNoFit;
97 else if ( IAttr(
"beamline") && isMinuit )
98 vertexFitMode = StGenericVertexFinder::VertexFit_t::Beamline1D;
99 else if ( IAttr(
"beamline1D") )
100 vertexFitMode = StGenericVertexFinder::VertexFit_t::Beamline1D;
101 else if ( IAttr(
"beamline3D") )
102 vertexFitMode = StGenericVertexFinder::VertexFit_t::Beamline3D;
104 vertexFitMode = StGenericVertexFinder::VertexFit_t::NoBeamline;
109 LOG_INFO <<
"StMinuitVertexFinder::StMinuitVertexFinder is in use." << endm;
117 }
else if ( IAttr(
"VFppLMV")){
119 theFinder->SetMode(0);
121 }
else if ( IAttr(
"VFppLMV5")){
123 theFinder->SetMode(1);
125 }
else if ( (IAttr(
"VFPPV") || IAttr(
"VFPPVnoCTB")) && !IAttr(
"VFPPVev")) {
127 LOG_INFO <<
"StGenericVertexMaker::Init: uses PPVertex finder"<< endm;
128 LOG_INFO <<
"StPPVertexFinder::StPPVertexFinder is in use" << endm;
132 if ( IAttr(
"VFPPVnoCTB")) theFinder->UseCTB(kFALSE);
135 int vfstore = IAttr(
"VFstore");
140 LOG_INFO <<
"StGenericVertexMaker::Init: Using VFStore depth = " << vfstore << endm;
143 if ( IAttr(
"useBTOFmatchOnly") ){
144 LOG_INFO <<
"StGenericVertexMaker::Init: UseBTOFmatchOnly option enabled" << endm;
149 }
else if ( IAttr(
"VFPPVEv") || IAttr(
"VFPPVEvNoBTof") ) {
150 LOG_INFO <<
"StGenericVertexMaker::Init: uses StvPPVertex finder(StEvent based)"<< endm;
151 LOG_INFO <<
"StPPVertexFinder::StPPVertexFinder is in use" << endm;
154 useBTOF = (IAttr(
"VFPPVEvNoBTof"))? 0:1;
156 }
else if ( IAttr(
"VFFV") || IAttr(
"VFMCE")) {
159 LOG_INFO <<
"StGenericVertexMaker::Init: fixed vertex using MC vertex" << endm;
160 theFinder->SetMode(1);
162 theFinder->SetVertexPosition(0.,0.,0);
163 LOG_INFO <<
"StGenericVertexMaker::Init: fixed vertex 'finder' selected" << endm;
167 LOG_INFO <<
"StMinuitVertexFinder::StMinuitVertexFinder is in use." << endm;
176 theFinder->UsePCT(usePCT);
177 theFinder->UseBTOF(useBTOF);
187 mEvalNtuple =
new TNtuple(
"results",
"results",
"thX:thY:thZ:thStat:goodGlob:evX:evY:evZ:evStat:nPrim:nCTB:geantX:geantY:geantZ");
190 return StMaker::Init();
194 void StGenericVertexMaker::Clear(
const char* opt){
195 LOG_INFO <<
" StGenericVertexMaker::Clear()"<<endm;
213 theFinder->InitRun(runnumber, st_db_maker);
215 return StMaker::InitRun(runnumber);
223 LOG_INFO <<
"StGenericVertexMaker::Finish " <<
GetName() <<endm;
224 LOG_INFO <<
" Total events: " << nEvTotal << endm;
225 LOG_INFO <<
" Good events: " << nEvGood << endm;
230 TFile out(
"MinuitVertexEval.root",
"RECREATE");
231 mEvalNtuple->Write();
235 if(theFinder) theFinder->Finish();
242 Bool_t StGenericVertexMaker::DoFit(){
244 if (theFinder->fit(mEvent)) {
245 theFinder->printInfo();
247 LOG_ERROR <<
"StGenericVertexMaker::DoFit: vertex fit failed, no vertex." << endm;
265 if (IAttr(
"useMuDst")) {
267 TClonesArray* vtxArray = 0;
268 WhiteBoard(
"muDst",&muDst);
269 WhiteBoard(
"vtxArray",&vtxArray);
270 if (!(vtxArray && muDst)) {
271 LOG_ERROR <<
"problems for refitting MuDst" << endm;
274 theFinder->fit(*muDst);
275 theFinder->result(*vtxArray);
279 mEvent = (
StEvent*) GetInputDS(
"StEvent");
280 LOG_DEBUG <<
"StGenericVertexMaker::Make: StEvent pointer " << mEvent << endm;
281 LOG_DEBUG <<
"StGenericVertexMaker::Make: external find use " << externalFindUse << endm;
283 if(!externalFindUse){
287 if (eval)MakeEvalNtuple();
289 if(!externalFindUse){
291 if (theFinder->size()>0){
301 void StGenericVertexMaker::MakeEvalNtuple(){
305 St_g2t_vertex *g2t_ver=0;
306 g2t_vertex_st *gver=0;
307 if(gds) g2t_ver=( St_g2t_vertex *)gds->
Find(
"g2t_vertex");
308 if(g2t_ver)gver=g2t_ver->GetTable();
322 primV=mEvent->primaryVertex();
327 LOG_INFO <<
"primaryVertex()=NULL"<<endm;
329 float x=999,y=999,z=999;
330 mEvalNtuple->Fill(x,y,z,stat,mEvent->summary()->numberOfGoodTracks(),-999.,-999.,-999.,-999.,-999.,nCtb,gx,gy,gz);
333 LOG_INFO << Form(
"primaryVertex()= %f, %f %f, nTracks=%d\n",
334 primV->position().x(), primV->position().y(), primV->position().z(),
335 primV->numberOfDaughters()) << endm;
337 mEvalNtuple->Fill(primV->position().x(), primV->position().y(), primV->position().z(),
338 stat, mEvent->summary()->numberOfGoodTracks(),
339 primV->position().x(), primV->position().y(), primV->position().z(), primV->flag(),
340 primV->numberOfDaughters(), nCtb, gx, gy, gz);
virtual Int_t InitRun(Int_t runumber)
StGenericVertexFinder implementation for fixing vertex.
void FillStEvent(StEvent *)
virtual const char * GetName() const
special overload
virtual TDataSet * Find(const char *path) const