#include "hrtextractor.h"
#include "hcategory.h"
#include "hades.h"
#include "hiterator.h"
#include "hgeantmdc.h"
#include "hgeantkine.h"
HRtExtractor::HRtExtractor(const Text_t name[],const Text_t title[]) :
HReconstructor(name,title) {
fCatMdc = 0;
fCatKine = 0;
fMdcIter = 0;
fKineIter = 0;
fData = 0;
}
HRtExtractor::~HRtExtractor(void) {
}
Bool_t HRtExtractor::init(void) {
HEvent *ev = 0;
if (!gHades) return kFALSE;
if ( (ev=gHades->getCurrentEvent())==0 ) return kFALSE;
fCatMdc = ev->getCategory(catMdcGeantRaw);
if (!fCatMdc) {
Error("init","Geant MDC category not found!");
return kFALSE;
}
fMdcIter = (HIterator *)fCatMdc->MakeIterator();
fCatKine = ev->getCategory(catGeantKine);
if (!fCatKine) {
Error("init","Kine category not found in input");
return kFALSE;
}
fKineIter = (HIterator *)fCatKine->MakeIterator();
if (gHades->getOutputFile()) {
gHades->getOutputFile()->cd();
fData = new TNtuple("data","data",
"p:r:z:theta:phi:x1:y1:x2:y2:x3:y3:x4:y4");
} else {
Warning("init","No output file found!");
fData = 0;
}
return kTRUE;
}
Bool_t HRtExtractor::finalize(void) {
return kTRUE;
}
Int_t HRtExtractor::execute(void) {
const Int_t theLayer = 6;
HGeantMdc *geMdc = 0;
HGeantKine *geKine = 0;
Float_t x[4],y[4];
Float_t tof,pMdc[4];
Float_t px,py,pz,p;
Float_t theta,phi;
Float_t rho,z;
Int_t module;
Int_t count = 0;
Int_t trackN,pid;
Float_t momentum;
Float_t xv,yv,zv;
Float_t x0,y0;
fKineIter->Reset();
while ( (geKine = (HGeantKine *)fKineIter->Next()) != 0) {
geKine->resetMdcIter();
for (Int_t i=0;i<4;i++) {x[i]=y[i]=pMdc[i]=10000.;}
count = 0;
while ( (geMdc = (HGeantMdc *)geKine->nextMdcHit()) != 0) {
if (geMdc->getLayer() == theLayer) {
module = geMdc->getModule();
geMdc->getHit(x[module],y[module],tof,pMdc[module]);
count++;
}
}
if (count>0) {
geKine->getMomentum(px,py,pz);
geKine->getVertex(xv,yv,zv);
geKine->getParticle(trackN,pid);
x0 = xv - zv*(px/pz);
y0 = yv - zv*(py/pz);
p = TMath::Sqrt(px*px + py*py + pz*pz);
theta = TMath::ACos(pz/p);
phi = TMath::ATan2(py,px);
rho = y0*cos(phi)-x0*sin(phi);
z=-(x0*cos(phi)+y0*sin(phi))*cos(theta)/sin(theta);
momentum = (pMdc[0]<9000.)?pMdc[0]:p;
if (pid == 3) {
momentum = -momentum;
} else if (pid!=2) Error("execute","Unknown PID");
fData->Fill(momentum,rho,z,theta,phi,
x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]);
}
}
return 0;
}
ClassImp(HRtExtractor)
Last change: Sat May 22 13:11:34 2010
Last generated: 2010-05-22 13:11
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.