///////////////////////////////////////////////////
//                                               //
// Base class for all hits makers                //
//                                               //
///////////////////////////////////////////////////
#include "StarMaker.h"
#include "StarRun.h"
#include <TClass.h>
#include <TRandom.h>
 
ClassImp(StarMaker)
 
//___________________________________________
 StarMaker::StarMaker()
{
   fNhits      = 0;
   fNdigits    = 0;
   fHistograms = 0;
}
 
//___________________________________________
 StarMaker::StarMaker(const char *name, const char *title)
         : TNamed(name,title)
{
// normal constructor invoked by all detector makers.
// Create the list for detector specific histograms
// Add this Maker to the global list of makers in Run.
   fNhits      = 0;
   fNdigits    = 0;
   fHistograms = new TList();
   Run->Makers()->Add(this);
}
 
//___________________________________________
 void StarMaker::Browse(TBrowser *b)
{
//  Insert Maker objects in the list of objects to be browsed.
   char name[64];
   if( fHits == 0) return;
   TObject *obj;
   Int_t i, nobjects;
 
   nobjects = fHits->GetEntries();
   for (i=0;i<nobjects;i++) {
      obj = fHits->At(i);
      sprintf(name,"%s_%d",obj->GetName(),i);
      b->Add(obj, &name[0]);
   }
 
   if( fDigits == 0) return;
   nobjects = fDigits->GetEntries();
   for (i=0;i<nobjects;i++) {
      obj = fDigits->At(i);
      sprintf(name,"%s_%d",obj->GetName(),i);
      b->Add(obj, &name[0]);
   }
}
 
//___________________________________________
 void StarMaker::Clear(Option_t *option)
{
// Reset number of hits and the hits array for this detector
   fNhits   = 0;
   fNdigits = 0;
   if (fHits)   fHits->Clear(option);
   if (fDigits) fDigits->Clear(option);
}
 
//___________________________________________
 Int_t StarMaker::DistancetoPrimitive(Int_t, Int_t)
{
   return 9999;
}
 
//___________________________________________
 void StarMaker::FakeHits(Int_t nh, Int_t snh)
{
//  Generate random hits and add these hits to the list
//  of hits of this detector.
//  This function loops on all existing tracks and
//  for each track generates a number hits following
//  a gaussian of mean nh and standard deviation snh
 
   Int_t vol[10];
   Float_t hits[20];
   Int_t det   = 1;
   Int_t i, hit, track, nhits, ntracks;
   ntracks = Run->Particles()->GetEntriesFast();
   for (track=0;track<ntracks;track++) {
      nhits = Int_t(gRandom->Gaus(nh,snh));
      for (hit=0;hit<nhits;hit++) {
         for (i=0;i<fNV;i++) {
            vol[i] = Int_t(5*gRandom->Rndm());
         }
         for (i=0;i<fNH;i++) {
            hits[i] = gRandom->Rndm();
         }
         AddHit(det, track, vol, hits);
      }
   }
}
 
//___________________________________________
 void StarMaker::FakeDigits(Int_t nd, Int_t snd)
{
//  Generate random digits and add these digits to the list
//  of digits of this detector.
//  This function loops on all existing tracks and
//  for each track generates a number digits following
//  a gaussian of mean nd and standard deviation snd
 
   Int_t vol[10];
   Int_t digits[20];
   Int_t det   = 1;
   Int_t i, digit, track, ndigits, ntracks;
   ntracks = Run->Particles()->GetEntriesFast();
   for (track=0;track<ntracks;track++) {
      ndigits = Int_t(gRandom->Gaus(nd,snd));
      for (digit=0;digit<ndigits;digit++) {
         for (i=0;i<fNV;i++) {
            vol[i] = Int_t(5*gRandom->Rndm());
         }
         for (i=0;i<fND;i++) {
            digits[i] = 100*Int_t(gRandom->Rndm());
         }
         AddDigit(det, 1, &track, vol, digits);
      }
   }
}
 
//___________________________________________
 void StarMaker::Finish()
{
// function called at the end of a run.
}
 
//___________________________________________
 Int_t StarMaker::ImportGeantDigits()
{
   fNdigits = Run->ImportGeantDigits(this,fGset,fGndet,fGdet);
   return fNdigits;
}
 
//___________________________________________
 Int_t StarMaker::ImportGeantHits()
{
   fNhits = Run->ImportGeantHits(this,fGset,fGndet,fGdet);
   return fNhits;
}
 
//___________________________________________
 void StarMaker::MakeBranch()
{
// Create a new branch in the current Root Tree.
// The branch of fHits is automatically split
 
   Int_t buffersize = 4000;
   char branchname[10];
   sprintf(branchname,"%s%s",fSetName.Data(),fDetName.Data());
   if (fHits && Run->TreeH()) Run->TreeH()->Branch(branchname,&fHits, buffersize);
   if (fDigits && Run->TreeD()) Run->TreeD()->Branch(branchname,&fDigits, buffersize);
}
 
//___________________________________________
 void StarMaker::Paint(Option_t*)
{
}
//___________________________________________
 void StarMaker::Streamer(TBuffer &R__b)
{
   // Stream an object of class XMaker.
 
   TBranch *branch;
   char branchname[10];
   if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion(); if (R__v) { }
      TNamed::Streamer(R__b);
      R__b >> fNV;
      R__b >> fNH;
      R__b >> fND;
      R__b >> fNhits;
      R__b >> fNdigits;
      R__b >> fGset;
      R__b >> fGndet;
      R__b.ReadFastArray(fGdet,fGndet);
      R__b.ReadFastArray(fNbitsV,fNV);
      R__b.ReadFastArray(fNbitsH,fNH);
      R__b.ReadFastArray(fNbitsD,fND);
      R__b.ReadFastArray(fOrigin,fNH);
      R__b.ReadFastArray(fFactor,fNH);
      fSetName.Streamer(R__b);
      fDetName.Streamer(R__b);
      R__b >> fHistograms;
      R__b >> fHits; // diff
      R__b >> fDigits; // diff
          //this is an addition to the standard rootcint version of Streamer
          //branch address for this maker is set automatically
      sprintf(branchname,"%s%s",fSetName.Data(),fDetName.Data());
      TTree *treeH = Run->TreeH();
      if (treeH && fHits) {
         branch = treeH->GetBranch(branchname);
         if (branch) branch->SetAddress(&fHits);
      }
      TTree *treeD = Run->TreeD();
      if (treeD && fDigits) {
         branch = treeD->GetBranch(branchname);
         if (branch) branch->SetAddress(&fDigits);
      }
   } else {
      R__b.WriteVersion(StarMaker::IsA());
      TNamed::Streamer(R__b);
      R__b << fNV;
      R__b << fNH;
      R__b << fND;
      R__b << fNhits;
      R__b << fNdigits;
      R__b << fGset;
      R__b << fGndet;
      R__b.WriteFastArray(fGdet,fGndet);
      R__b.WriteFastArray(fNbitsV,fNV);
      R__b.WriteFastArray(fNbitsH,fNH);
      R__b.WriteFastArray(fNbitsD,fND);
      R__b.WriteFastArray(fOrigin,fNH);
      R__b.WriteFastArray(fFactor,fNH);
      fSetName.Streamer(R__b);
      fDetName.Streamer(R__b);
      R__b << fHistograms;
      R__b << fHits; // diff
      R__b << fDigits; // diff
   }
}
 


ROOT page - Class index - Top of the page

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.