#include <RVersion.h>
#include <TBrowser.h>
+#include <TClonesArray.h>
+#include <TGeoManager.h>
#include <TStopwatch.h>
#include <TSystem.h>
#include <TVirtualMC.h>
-#include "TGeant3.h"
-
#include "AliLog.h"
#include "AliDetector.h"
fSum2Energy(0),
fTrRmax(1.e10),
fTrZmax(1.e10),
+ fRDecayMax(1.e10),
+ fRDecayMin(-1.),
+ fDecayPdg(0),
fImedia(0),
fTransParName("\0"),
fMCQA(0),
fSum2Energy(0),
fTrRmax(1.e10),
fTrZmax(1.e10),
+ fRDecayMax(1.e10),
+ fRDecayMin(-1.),
+ fDecayPdg(0),
fImedia(new TArrayI(1000)),
fTransParName("\0"),
fMCQA(0),
fSum2Energy(0),
fTrRmax(1.e10),
fTrZmax(1.e10),
+ fRDecayMax(1.e10),
+ fRDecayMin(-1.),
+ fDecayPdg(0),
fImedia(0),
fTransParName("\0"),
fMCQA(0),
fTrackReferences(0)
{
//
- // Copy constructor for AliRun
+ // Copy constructor for AliMC
//
mc.Copy(*this);
}
void AliMC::ConstructGeometry()
{
//
- // Create modules, materials, geometry
+ // Either load geometry from file or create it through usual
+ // loop on detectors. In the first case the method
+ // AliModule::CreateMaterials() only builds fIdtmed and is postponed
+ // at InitGeometry().
//
+ if(gAlice->IsRootGeometry()){
+ // Load geometry
+ const char *geomfilename = gAlice->GetGeometryFileName();
+ if(gSystem->ExpandPathName(geomfilename)){
+ AliInfo(Form("Loading geometry from file:\n %40s\n\n",geomfilename));
+ TGeoManager::Import(geomfilename);
+ }else{
+ AliInfo(Form("Geometry file %40s not found!\n",geomfilename));
+ return;
+ }
+ }else{
+ // Create modules, materials, geometry
TStopwatch stw;
TIter next(gAlice->Modules());
AliModule *detector;
AliInfo(Form("%10s R:%.2fs C:%.2fs",
detector->GetName(),stw.RealTime(),stw.CpuTime()));
}
+ }
+
+}
+
+//_______________________________________________________________________
+void AliMC::ConstructOpGeometry()
+{
+ //
+ // Loop all detector modules and call DefineOpticalProperties() method
+ //
+
+ TIter next(gAlice->Modules());
+ AliModule *detector;
+ AliInfo("Optical properties definition");
+ while((detector = dynamic_cast<AliModule*>(next()))) {
+ // Initialise detector optical properties
+ detector->DefineOpticalProperties();
+ }
}
//_______________________________________________________________________
void AliMC::InitGeometry()
{
//
- // Initialize detectors and display geometry
+ // Initialize detectors
//
- AliInfo("Initialisation:");
- TStopwatch stw;
- TIter next(gAlice->Modules());
- AliModule *detector;
- while((detector = dynamic_cast<AliModule*>(next()))) {
- stw.Start();
- // Initialise detector and display geometry
- detector->Init();
- detector->BuildGeometry();
- AliInfo(Form("%10s R:%.2fs C:%.2fs",
- detector->GetName(),stw.RealTime(),stw.CpuTime()));
- }
-
+ AliInfo("Initialisation:");
+ TStopwatch stw;
+ TIter next(gAlice->Modules());
+ AliModule *detector;
+ while((detector = dynamic_cast<AliModule*>(next()))) {
+ stw.Start();
+ // Initialise detector geometry
+ if(gAlice->IsRootGeometry()) detector->CreateMaterials();
+ detector->Init();
+ AliInfo(Form("%10s R:%.2fs C:%.2fs",
+ detector->GetName(),stw.RealTime(),stw.CpuTime()));
+ }
+}
+
+//_______________________________________________________________________
+void AliMC::SetAllAlignableVolumes()
+{
+ //
+ // Add alignable volumes (TGeoPNEntries) looping on all
+ // active modules
+ //
+
+ AliInfo(Form("Setting entries for all alignable volumes of active detectors"));
+ AliModule *detector;
+ TIter next(gAlice->Modules());
+ while((detector = dynamic_cast<AliModule*>(next()))) {
+ detector->AddAlignableVolumes();
+ }
}
//_______________________________________________________________________
// Called at every step during transport
//
- Int_t id = DetFromMate(gMC->GetMedium());
+ Int_t id = DetFromMate(gMC->CurrentMedium());
if (id < 0) return;
if ( gMC->IsNewTrack() &&
gMC->TrackTime() == 0. &&
- fRDecayMin > 0. &&
+ fRDecayMin >= 0. &&
fRDecayMax > fRDecayMin &&
gMC->TrackPid() == fDecayPdg )
{
//Call the appropriate stepping routine;
AliModule *det = dynamic_cast<AliModule*>(gAlice->Modules()->At(id));
if(det && det->StepManagerIsEnabled()) {
- fMCQA->StepManager(id);
+ if(AliLog::GetGlobalDebugLevel()>0) fMCQA->StepManager(id);
det->StepManager();
}
}
void AliMC::PostTrack()
{
// Posts tracks for each module
- TObjArray &dets = *gAlice->Modules();
- AliModule *module;
-
- for(Int_t i=0; i<=gAlice->GetNdets(); i++)
- if((module = dynamic_cast<AliModule*>(dets[i])))
- module->PostTrack();
+ TObjArray &dets = *gAlice->Modules();
+ AliModule *module;
+
+ for(Int_t i=0; i<=gAlice->GetNdets(); i++)
+ if((module = dynamic_cast<AliModule*>(dets[i])))
+ module->PostTrack();
}
//_______________________________________________________________________
//
//
+
if(gAlice->Lego()) gAlice->Lego()->FinishEvent();
TIter next(gAlice->Modules());
// Write out the kinematics
- stack->FinishEvent();
+ if (!gAlice->Lego()) stack->FinishEvent();
// Write out the event Header information
TTree* treeE = runloader->TreeE();
//=================Create Materials and geometry
gMC->Init();
+ //Set alignable volumes for the whole geometry
+ SetAllAlignableVolumes();
//Read the cuts for all materials
ReadTransPar();
//Build the special IMEDIA table
//Compute cross-sections
gMC->BuildPhysics();
- //Write Geometry object to current file.
- gAlice->GetRunLoader()->WriteGeometry();
-
//Initialise geometry deposition table
fEventEnergy.Set(gMC->NofVolumes()+1);
fSummEnergy.Set(gMC->NofVolumes()+1);
b->Add(fMCQA,"AliMCQA");
}
-//PH
//_______________________________________________________________________
void AliMC::AddHit(Int_t id, Int_t track, Int_t *vol, Float_t *hits) const
{
// Called at finish primary
//
if (!fTrackReferences) return;
- for (Int_t i=0;i<fTrackReferences->GetEntries();i++){
- AliTrackReference * ref = dynamic_cast<AliTrackReference*>(fTrackReferences->UncheckedAt(i));
- if (ref) {
- Int_t newID = map[ref->GetTrack()];
- if (newID>=0) ref->SetTrack(newID);
- else {
- //ref->SetTrack(-1);
- ref->SetBit(kNotDeleted,kFALSE);
- fTrackReferences->RemoveAt(i);
- }
- }
+ Int_t nEntries = fTrackReferences->GetEntries();
+ for (Int_t i=0; i < nEntries; i++){
+ AliTrackReference * ref = dynamic_cast<AliTrackReference*>(fTrackReferences->UncheckedAt(i));
+ if (ref) {
+ Int_t newID = map[ref->GetTrack()];
+ if (newID>=0) ref->SetTrack(newID);
+ else {
+ ref->SetBit(kNotDeleted,kFALSE);
+ fTrackReferences->RemoveAt(i);
+ }
+ } // if ref
}
fTrackReferences->Compress();
}
//
// Force decay time in transport code
//
- TGeant3 * geant = (TGeant3*) gMC;
- geant->Gcphys()->sumlif = t / p.Beta() / p.Gamma();
+ gMC->ForceDecayTime(t / 2.99792458e10);
}