/*
$Log$
+Revision 1.16 2001/05/16 14:57:23 alibrary
+New files for folders and Stack
+
+Revision 1.15 2001/03/20 06:28:49 alibrary
+New detector loop split in 2
+
+Revision 1.14 2000/12/20 08:39:39 fca
+Support for Cerenkov and process list in Virtual MC
+
+Revision 1.13 2000/11/30 07:12:54 alibrary
+Introducing new Rndm and QA classes
+
+Revision 1.12 2000/11/06 11:35:46 morsch
+Call BuildGeometry() after Init() to be able to share common detector parameters.
+
+Revision 1.11 2000/10/04 16:30:22 fca
+Add include for exit()
+
Revision 1.10 2000/10/02 21:28:16 fca
Removal of useless dependecies via forward declarations
#include <stdlib.h>
#include <TParticle.h>
+#include <TStopwatch.h>
#include "AliDecayer.h"
#include "AliGeant3.h"
#include "AliCallf77.h"
#include "AliModule.h"
#include "AliMagF.h"
+#include "AliGenerator.h"
#ifndef WIN32
# define rxgtrak rxgtrak_
-# define rxstrak rxstrak_
-# define rxkeep rxkeep_
# define rxouth rxouth_
+# define rxinh rxinh_
#else
# define rxgtrak RXGTRAK
-# define rxstrak RXSTRAK
-# define rxkeep RXKEEP
# define rxouth RXOUTH
+# define rxinh RXINH
#endif
ClassImp(AliGeant3)
//____________________________________________________________________________
void AliGeant3::Init()
{
- //
- //=================Create Materials and geometry
- //
- TObjArray *modules = gAlice->Modules();
- TIter next(modules);
- AliModule *detector;
- while((detector = (AliModule*)next())) {
- // Initialise detector materials and geometry
- detector->CreateMaterials();
- detector->CreateGeometry();
- detector->BuildGeometry();
- detector->Init();
- }
+ //
+ //=================Create Materials and geometry
+ //
+ TStopwatch stw;
+ TObjArray *modules = gAlice->Modules();
+ TIter next(modules);
+ AliModule *detector;
+ printf("Geometry creation:\n");
+ while((detector = (AliModule*)next())) {
+ stw.Start();
+ // Initialise detector materials and geometry
+ detector->CreateMaterials();
+ detector->CreateGeometry();
+ printf("%10s R:%.2fs C:%.2fs\n",
+ detector->GetName(),stw.RealTime(),stw.CpuTime());
+ }
+ //Terminate building of geometry
+ FinishGeometry();
+
+ printf("Initialisation:\n");
+ next.Reset();
+ while((detector = (AliModule*)next())) {
+ stw.Start();
+ // Initialise detector and display geometry
+ detector->Init();
+ detector->BuildGeometry();
+ printf("%10s R:%.2fs C:%.2fs\n",
+ detector->GetName(),stw.RealTime(),stw.CpuTime());
+ }
- //Terminate building of geometry
- FinishGeometry();
}
//____________________________________________________________________________
}
//_____________________________________________________________________________
-extern "C" void type_of_call
-#ifndef WIN32
-rxstrak (Int_t &keep, Int_t &parent, Int_t &ipart, Float_t *pmom,
- Float_t *vpos, Float_t &tof, const char* cmech, Int_t &ntr, const int cmlen)
-#else
-rxstrak (Int_t &keep, Int_t &parent, Int_t &ipart, Float_t *pmom,
- Float_t *vpos, Float_t &tof, const char* cmech, const int cmlen,
- Int_t &ntr)
-#endif
+extern "C" void type_of_call rxouth ()
{
//
- // Fetches next track from the ROOT stack for transport. Called by GUKINE
- // and GUSTEP.
- //
- // Status of the track. If keep=0 the track is put
- // keep on the ROOT stack but it is not fetched for
- // transport.
- // parent Parent track. If parent=0 the track is a primary.
- // In GUSTEP the routine is normally called to store
- // secondaries generated by the current track whose
- // ROOT stack number is MTRACK (common SCKINE.
- // ipart Particle code in the GEANT conventions.
- // pmom[3] Particle momentum in GeV/c
- // vpos[3] Particle position
- // tof Particle time of flight in seconds
- //
- // cmech (CHARACTER*10) Particle origin. This field is user
- // defined and it is not used inside the GALICE code.
- // ntr Number assigned to the particle in the ROOT stack.
+ // Called by Gtreve at the end of each primary track
//
- char mecha[11];
- Float_t polar[3]={0.,0.,0.};
- for(int i=0; i<10 && i<cmlen; i++) mecha[i]=cmech[i];
- mecha[10]=0;
- Int_t pdg=gMC->PDGFromId(ipart);
- gAlice->SetTrack(keep, parent-1, pdg, pmom, vpos, polar, tof, mecha, ntr);
- ntr++;
+ gAlice->FinishPrimary();
}
//_____________________________________________________________________________
-extern "C" void type_of_call rxkeep(const Int_t &n)
-{
- if( NULL==gAlice ) exit(1);
-
- if( n<=0 || n>gAlice->Particles()->GetEntries() )
- {
- printf(" Bad index n=%d must be 0<n<=%d\n",
- n,gAlice->Particles()->GetEntries());
- exit(1);
- }
-
- ((TParticle*)(gAlice->Particles()->UncheckedAt(n-1)))->SetBit(kKeepBit);
-}
-
-//_____________________________________________________________________________
-extern "C" void type_of_call rxouth ()
+extern "C" void type_of_call rxinh ()
{
//
- // Called by Gtreve at the end of each primary track
+ // Called by Gtreve at the beginning of each primary track
//
- gAlice->FinishPrimary();
+ gAlice->BeginPrimary();
}
-
#ifndef WIN32
# define gudigi gudigi_
# define guhadr guhadr_
// Fetch Particles
Int_t np = geant3->Decayer()->ImportParticles(particles);
if (np <=1) return;
-
- for (Int_t i=0; i< np; i++)
+
+ TParticle * iparticle = (TParticle *) particles->At(0);
+ Int_t ichF = iparticle->GetFirstDaughter();
+ Int_t ichL = iparticle->GetLastDaughter();
+
+ for (Int_t i=ichF-1; i < ichL; i++)
{
- TParticle * iparticle = (TParticle *) particles->At(i);
- Int_t ks = iparticle->GetStatusCode();
+ iparticle = (TParticle *) particles->At(i);
+ Int_t kf = iparticle->GetPdgCode();
+// Int_t ks = iparticle->GetStatusCode();
+// printf("\n %d %d %d %d %d %d", i, np, kf, ks, ichL, ichF);
// Final state particles only
- if (ks < 1 || ks > 10) continue;
+// if (ks < 1 || ks > 10) continue;
// Skip neutrinos
- Int_t kf=iparticle->GetPdgCode();
+
+
if (kf==12 || kf ==-12) continue;
if (kf==14 || kf ==-14) continue;
if (kf==16 || kf ==-16) continue;
//
// ------------------------------------------------------------------
//
- Int_t ndet = gAlice->Modules()->GetLast();
- TObjArray &dets = *gAlice->Modules();
- AliModule *module;
- Int_t i;
-
- for(i=0; i<=ndet; i++)
- if((module = (AliModule*)dets[i]))
- module->PreTrack();
+ gAlice->PreTrack();
gtrack();
- for(i=0; i<=ndet; i++)
- if((module = (AliModule*)dets[i]))
- module->PostTrack();
+ gAlice->PostTrack();
}
//______________________________________________________________________
Int_t ipp, jk, id, nt;
Float_t polar[3]={0,0,0};
Float_t mom[3];
- const char *kChproc;
+ AliMCProcess pProc;
TGeant3* geant3 = (TGeant3*) gMC;
// --- Add new created particles
if (gMC->NSecondaries() > 0) {
- kChproc=gMC->ProdProcess();
+ pProc=gMC->ProdProcess(0);
for (jk = 0; jk < geant3->Gcking()->ngkine; ++jk) {
ipp = Int_t (geant3->Gcking()->gkin[jk][4]+0.5);
// --- Skip neutrinos!
if (ipp != 4) {
gAlice->SetTrack(1,gAlice->CurrentTrack(),gMC->PDGFromId(ipp), geant3->Gcking()->gkin[jk],
- geant3->Gckin3()->gpos[jk], polar,geant3->Gctrak()->tofg, kChproc, nt);
+ geant3->Gckin3()->gpos[jk], polar,geant3->Gctrak()->tofg, pProc, nt);
}
}
}
geant3->Gckin2()->xphot[jk], //position
&geant3->Gckin2()->xphot[jk][7], //polarisation
geant3->Gckin2()->xphot[jk][10], //time of flight
- "Cherenkov", nt);
+ kPCerenkov, nt);
}
}
// --- Particle leaving the setup ?