#include "hmdcvertexwriter.h"
#include "hades.h"
#include "hevent.h"
#include "heventheader.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;
HMdcVertexWriter::HMdcVertexWriter(void)
{
outfile = NULL;
vertex = NULL;
filename = "";
fileNameFromInput = kTRUE;
isEmbedding = kFALSE;
}
HMdcVertexWriter::HMdcVertexWriter(const Text_t* name,const Text_t* title)
: HReconstructor(name,title)
{
outfile = NULL;
vertex = NULL;
filename = "";
fileNameFromInput = kTRUE;
isEmbedding = kFALSE;
}
HMdcVertexWriter::~HMdcVertexWriter(void) {
if (outfile){
vertex ->Write();
outfile->Close();
outfile = NULL;
vertex = NULL;
}
}
Bool_t HMdcVertexWriter::init(void)
{
HDataSource* datasource = gHades->getDataSource();
if(datasource){
filename = datasource->getCurrentFileName();
if(filename.Last('.') >= 0 )
{
filename.Replace(filename.Last('.'),filename.Length() - filename.Last('.'),"_vertex.root");
} 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);
}
TString dir = filename;
if(dir.Last('/') >= 0){
dir.Replace(dir.Last('/') + 1,dir.Length() - filename.Last('/') + 1,"");
} else {
dir = gSystem->WorkingDirectory();
}
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())
{
if(fileNameFromInput && outfile){
outfile->cd();
vertex ->Write();
delete vertex;
outfile->Close();
gSystem->Exec(Form("rm %s",filename.Data()));
vertex = NULL;
outfile = NULL;
}
TString currentfile = gHades->getOutputFile()->GetName();
if(currentfile.Last('.') >= 0 )
{
currentfile.Replace(currentfile.Last('.'),currentfile.Length() - currentfile.Last('.'),"_vertex.root");
}
if(currentfile.CompareTo(filename.Data()) != 0)
{
filename = currentfile;
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 = header->getVertex();
if(doSkipNoVertex)
{
if(event_vertex.getX() != -1000 &&
event_vertex.getY() != -1000 &&
event_vertex.getZ() != -1000
)
{
vertex->Fill(event_vertex.getX(),
event_vertex.getY(),
event_vertex.getZ(),
header->getEventSeqNumber()
);
}
} else {
vertex->Fill(event_vertex.getX(),
event_vertex.getY(),
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;
}
Last change: Sat May 22 13:04:21 2010
Last generated: 2010-05-22 13:04
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.