Message: Re: drawing histograms using ROOT in Example N02 Not Logged In (login)
 Next-in-Thread Next-in-Thread
 Next-in-Forum Next-in-Forum

None Re: drawing histograms using ROOT in Example N02 

Forum: Documentation and Examples
Re: None drawing histograms using ROOT in Example N02
Re: None Re: drawing histograms using ROOT in Example N02 (Michael H. Kelsey)
Date: 23 Aug, 2012
From: <nimisha.kumari@polytechnique.edu>

Hello Sir

I wrote the codes as far as I understood from your answer but still in the root file, there are no histograms. My code is as following:

#include "ExoSimulationRunAction.hh"

#include "ExoSimulationTrackerHit.hh"

#include "G4SDManager.hh"

#include "G4Event.hh"
#include "G4HCofThisEvent.hh"

#include "G4Run.hh"

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

ExoSimulationRunAction::ExoSimulationRunAction()
{
  fCollID=-1;
}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

ExoSimulationRunAction::~ExoSimulationRunAction() {}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

void ExoSimulationRunAction::BeginOfRunAction(const G4Run* aRun)
{
  G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl;
 G4SDManager * SDman = G4SDManager::GetSDMpointer();
 G4String colNam;
 fCollID = SDman->GetCollectionID(colNam="fHitsCollection");

  f = new TFile("edep.root","RECREATE");
  h = new TH1F("h","Energy deposit in the detector",1000,0.,1000.);
  h->GetXaxis()->SetTitle("Energy [keV]");

  G4cout << "ROOT at creation" << G4endl;
  G4cout << "h = " << h << G4endl;
  G4cout << "f = " << f << G4endl;
}                                                                           

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

void ExoSimulationRunAction::RecordEvent(const G4Event* evt)
{
  G4HCofThisEvent* HCE = evt->GetHCofThisEvent();
  ExoSimulationTrackerHitsCollection* THC = 0;
  THC = (ExoSimulationTrackerHitsCollection*)(HCE->GetHC(fCollID));
   if(THC)
  {
    int n_hit = THC->entries();
    G4cout << "     " << n_hit <<  G4endl;

    for(int i=0;i<n_hit;i++)
    {
      h->Fill((*THC)[i]->GetEdep()/keV); }

  }
}

void ExoSimulationRunAction::EndOfRunAction(const G4Run*)
{
    f->Write();
    f->Close();
    delete f;
}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

Rest of the codes are same as that of N02. Also when I'm running the program and I'm printing "h" and "f" as in "BeginofRunAction", the values are different for each event. I don't understand the reason of it. Since it's in the same histogram, the value of "h" for each event should be same. It would be very kind if you could help me.

On Fri, 10 Aug 2012 16:03:33 GMT, Michael H. Kelsey wrote:

> On Thu, 09 Aug 2012 19:34:27 GMT, nimishak wrote:
> 
> > I'm working on Example N02 given in the section Novice Examples of
> > Geant4 documentation. I wish to draw histograms for the energy deposited
> > in each step of the process, by using ROOT.
> 
> I guess that you want to have one histogram for your job, which will
> show the range of energies deposited at each step. Is that correct?
> 
> > For this, in the source code
> > of N02TrackerHit.cc, I'm adding the following commands in the
> > constructor N02TrackerHit:
> > 
> > f= new TFile("edep.root", "RECREATE"); h = new TH1F("h", "energy
> > deposited", 1000, 0, 1000); h = GetXAxis()->SetTitle("Energy (keV)");
> 
> This is going to create a new TFile (all writing to the same file on
> disk!) for every hit which is created. I don't think that was your
> intention.
> 
> > In the deconstructor, I do:
> > 
> > f->Write(); f->Close(); Delete f;
> > 
> > In the class Print, I added:
> > 
> > h->fill(fEdep);
> > 
> > But this code is not working. I think that there can be two following
> > reasons:
> > 
> > 1. The commands of root in the constructor are called for each hit, so
> > it's creating a histogram for the energy deposited in each step for each
> > hit, instead of one histogram for the energy deposited in the entire
> > process.
> 
> Correct; see above.
> 
> You should probably do the histogramming in G4UserRunAction.
> 
> You want to open just one ROOT file for the whole job (or a new ROOT
> file for each beamOn, and use the run number (G4Run::GetRunID()) as part
> of the filename), and you want to create a single histogram at that
> point. Do this in yourRunAction::BeginOfRunAction(), and save the
> histogram pointer in a data member of that class.
> 
> Then, in yourRunAction::transferEvent(), you can get the hit collection
> you created out of the G4Event pointer, loop over the hits in the
> collection, and fill the histogram.
> 
> Finally, in yourRunAction::EndOfRunAction(), you should call h->Write()
> to make sure the histogram data is written to the file, then close the
> file and delete everything.
> 

Inline Depth:
 1 1
 All All
Outline Depth:
 1 1
 2 2
 All All
Add message: (add)

1 None: Re: drawing histograms using ROOT in Example N02   (nimisha.kumari@polytechnique.edu - 28 Aug, 2012)
 Add Message Add Message
to: "Re: drawing histograms using ROOT in Example N02"

 Subscribe Subscribe

This site runs SLAC HyperNews version 1.11-slac-98, derived from the original HyperNews


[ Geant 4 Home | Geant 4 HyperNews | Search | Request New Forum | Feedback ]