#include "hmdcvertexwriter.h"
#include "hades.h"
#include "hevent.h"
#include "heventheader.h"
#include "hcategorymanager.h"
#include "hdatasource.h"
#include "hcategory.h"
#include "hgeantkine.h"
#include "hgeantdef.h"
#include "TFile.h"
#include "TSystem.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
ClassImp(HMdcVertexWriter)
Bool_t HMdcVertexWriter::doSkipNoVertex = kTRUE;
Int_t HMdcVertexWriter::vertextype = 2;
Double_t HMdcVertexWriter::fMeanX = -1000.;
Double_t HMdcVertexWriter::fMeanY = -1000.;
HMdcVertexWriter::HMdcVertexWriter(void)
{
outfile = NULL;
vertex = NULL;
filename = "";
outputdir = "";
fileNameFromInput = kTRUE;
fileNameManual = kFALSE;
isEmbedding = kFALSE;
pUserSelectEvent = NULL;
pUserParams = NULL;
}
HMdcVertexWriter::HMdcVertexWriter(const Text_t* name,const Text_t* title)
: HReconstructor(name,title)
{
outfile = NULL;
vertex = NULL;
filename = "";
outputdir = "";
fileNameFromInput = kTRUE;
fileNameManual = kFALSE;
isEmbedding = kFALSE;
pUserSelectEvent = NULL;
pUserParams = NULL;
}
HMdcVertexWriter::~HMdcVertexWriter(void) {
if (outfile){
vertex ->Write();
outfile->Close();
outfile = NULL;
vertex = NULL;
}
}
Bool_t HMdcVertexWriter::init(void)
{
HDataSource* datasource = gHades->getDataSource();
Bool_t isROOT= kFALSE;
TString type = gHades->getDataSource()->ClassName();
if(type.CompareTo("HRootSource") == 0) isROOT=kTRUE;
if(isROOT && !fileNameManual) {
Error("HMdcVertexWriter::init()","Use setOutputFile(TString file = "") to define outputfile manual when running from HRootSource !");
exit(1);
}
TString fname = "";
TString fullname = "";
TString dir = "";
if(!isROOT && !fileNameManual){
if(datasource){
filename = datasource->getCurrentFileName();
if(filename.Last('.') >= 0 )
{
filename.Replace(filename.Last('.'),filename.Length() - filename.Last('.'),"_vertex.root");
fname = gSystem->BaseName(filename.Data());
} else {
Error("HMdcVertexWriter::init()","Could not retrieve current input file name = %s ! Something seems to be wrong!",filename.Data());
exit(1);
}
} else {
Error("HMdcVertexWriter::init()","Retrieve NULL pointer for datasource!");
exit(1);
}
if(outputdir != ""){
dir = outputdir;
fullname = dir + "/" + fname;
} else {
dir = filename;
if(dir.Last('/') >= 0){
dir.Replace(dir.Last('/') + 1,dir.Length() - filename.Last('/') + 1,"");
} else {
dir = gSystem->WorkingDirectory();
}
fullname = filename;
}
filename = fullname;
filename.ReplaceAll("//","/");
} else {
filename=Form("%s/%s",outputdir.Data(),filename.Data());
dir = outputdir;
}
Bool_t check = gSystem->AccessPathName(dir.Data(), kWritePermission);
if(check == kFALSE)
{
outfile = new TFile(filename.Data(),"RECREATE");
if(!outfile){
Error("HMdcVertexWriter::init()","Retrieve NULL for root output file = %s!",filename.Data());
exit(1);
}
outfile->cd();
vertex = new TNtuple("vertex","vertex","vX:vY:vZ:seqNumber");
} else {
Warning("HMdcVertexWriter::init()","No Permission to write outputfile file = %s! \n Will try with outputfile name!",filename.Data());
}
HCategory* catKine = (HCategory*)gHades->getCurrentEvent()->getCategory(catGeantKine);
if(catKine && gHades ->getEmbeddingMode() > 0) {
isEmbedding = kTRUE;
}
return kTRUE;
}
Int_t HMdcVertexWriter::execute(void)
{
if(gHades->getOutputFile() && !fileNameManual)
{
if(fileNameFromInput && outfile){
outfile->cd();
vertex ->Write();
delete vertex;
outfile->Close();
gSystem->Exec(Form("rm %s",filename.Data()));
vertex = NULL;
outfile = NULL;
}
TString dir = "";
TString fname = "";
TString fullname = "";
TString currentfile = gHades->getOutputFile()->GetName();
if(currentfile.Last('.') >= 0 )
{
currentfile.Replace(currentfile.Last('.'),currentfile.Length() - currentfile.Last('.'),"_vertex.root");
}
if(outputdir != ""){
fname = gSystem->BaseName(filename.Data());
fullname = outputdir + "/" + fname;
fullname.ReplaceAll("//","/");
}
if(fullname.CompareTo(filename.Data()) != 0)
{
filename = fullname;
if(outfile){
outfile->cd();
vertex ->Write();
delete vertex;
outfile ->Close();
vertex = NULL;
outfile = NULL;
}
outfile = new TFile(filename.Data(),"RECREATE");
if(!outfile){
Error("HMdcVertexWriter::init()","Retrieve NULL for root output file = %s!",filename.Data());
exit(1);
}
outfile->cd();
vertex = new TNtuple("vertex","vertex","vX:vY:vZ:seqNumber");
}
fileNameFromInput = kFALSE;
} else {
if(!outfile){
Error("HMdcVertexWriter::execute()","Could not create filename from output and input file !");
exit(1);
}
}
if(outfile){
HEvent* event = gHades->getCurrentEvent();
if(event){
HEventHeader* header = event ->getHeader();
if(header){
HVertex event_vertex ;
if(vertextype == 1) event_vertex = header->getVertexCluster();
if(vertextype == 2) event_vertex = header->getVertex();
if(vertextype == 3) event_vertex = header->getVertexReco();
if(vertextype == 4) event_vertex = header->getVertexCluster();
if(vertextype == 5)
{
HGeantKine* kine;
Float_t vx,vy,vz;
HCategory* kineCat = HCategoryManager::getCategory(catGeantKine);
if(!kineCat) {
Error("execute()","No catGeantKine in current Event! Cannot extract vertex from HGeantKine.");
return 0;
}
Int_t n = kineCat->getEntries();
for(Int_t j = 0; j < n; j ++){
kine = HCategoryManager::getObject(kine,kineCat,j);
if(kine) {
if(kine->isPrimary())
{
kine->getVertex(vx,vy,vz);
if(doSkipNoVertex)
{
Bool_t acceptedEvent = kTRUE;
if(pUserSelectEvent){
acceptedEvent=(*pUserSelectEvent)(pUserParams);
}
if(acceptedEvent)vertex->Fill(vx,vy,vz,header->getEventSeqNumber());
} else {
vertex->Fill(vx,vy,vz,header->getEventSeqNumber());
}
break;
}
}
}
} else {
Double_t x,y,z;
x = event_vertex.getX();
y = event_vertex.getY();
z = event_vertex.getZ();
if(vertextype == 4){
x = fMeanX;
y = fMeanY;
}
if(doSkipNoVertex)
{
Bool_t acceptedEvent = kTRUE;
if(pUserSelectEvent){
acceptedEvent=(*pUserSelectEvent)(pUserParams);
}
if(event_vertex.getX() != -1000 &&
event_vertex.getY() != -1000 &&
event_vertex.getZ() != -1000 &&
acceptedEvent
)
{
vertex->Fill(x,y,z,
header->getEventSeqNumber()
);
}
} else {
vertex->Fill(x,y,z,
event_vertex.getZ(),
header->getEventSeqNumber()
);
}
}
}
}
}
return 0;
}
Bool_t HMdcVertexWriter::finalize(void)
{
if(outfile) {
outfile->cd();
vertex ->Write();
delete vertex;
outfile->Close();
outfile = NULL;
vertex = NULL;
}
return kTRUE;
}