]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TGeant3/AliGeant3.cxx
Access function to local momenta renamed.
[u/mrichter/AliRoot.git] / TGeant3 / AliGeant3.cxx
index 5e9d02d3cfc99b3fa02d669c2af3b7fd9e08b363..101589bd296b380f0ee1180a4fefba318e2d182a 100644 (file)
 
 /*
 $Log$
+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
+
+Revision 1.9  2000/09/12 14:36:17  morsch
+In gudcay(): call ForceDecay() before Decay()
+
+Revision 1.8  2000/09/06 14:56:34  morsch
+gudcay() method implemented.
+Decays are performed using  the AliDecayer interface. The pointer to the instance of AliDecayer
+is obtained from geant3 (will be gMC once it has been implemented for Geant4).
+
+Revision 1.7  2000/07/13 16:19:10  fca
+Mainly coding conventions + some small bug fixes
+
+Revision 1.6  2000/07/11 18:24:59  fca
+Coding convention corrections + few minor bug fixes
+
+Revision 1.5  2000/05/20 14:49:48  fca
+Call gdebug at the end of gustep
+
+Revision 1.4  2000/04/26 10:17:32  fca
+Changes in Lego for G4 compatibility
+
+Revision 1.3  2000/04/07 11:12:35  fca
+G4 compatibility changes
+
+Revision 1.2  2000/02/29 19:11:17  fca
+Move gucode into AliGeant3.cxx
+
 Revision 1.1  2000/02/23 16:25:25  fca
 AliVMC and AliGeant3 classes introduced
 ReadEuclid moved from AliRun to AliModule
 
 */
 
+#include <stdlib.h>
+
 #include <TParticle.h>
 
+#include "AliDecayer.h"
 #include "AliGeant3.h"
 #include "AliRun.h"
 #include "TGeant3.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_
 #else
 
 # define rxgtrak RXGTRAK 
-# define rxstrak RXSTRAK 
-# define rxkeep  RXKEEP  
 # define rxouth  RXOUTH
 #endif
 
 ClassImp(AliGeant3)
 
-AliGeant3::AliGeant3()
+AliGeant3::AliGeant3(const char *title) : 
+  TGeant3(title) {}
+
+//____________________________________________________________________________
+void AliGeant3::FinishGeometry()
 {
-  new TGeant3();
+  //
+  // Finalise geometry construction
+  //
+  TGeant3::FinishGeometry();
+  //Create the color table
+  SetColors();
 }
 
-AliGeant3::AliGeant3(const char *title) : 
-  AliVMC("ALICE Virtual MC for Geant3",title)
+//____________________________________________________________________________
+void AliGeant3::Init()
 {
-  new TGeant3(title);
+  //
+  //=================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->Init();
+    detector->BuildGeometry();
+  }
+
+  //Terminate building of geometry
+  FinishGeometry();
 }
 
-void AliGeant3::FinishGeometry()
+//____________________________________________________________________________
+void AliGeant3::ProcessRun(Int_t nevent)
 {
-  gMC->FinishGeometry();
-  //Create the color table
-  gMC->SetColors();
+  //
+  // Process the run
+  //
+  Int_t todo = TMath::Abs(nevent);
+  for (Int_t i=0; i<todo; i++) {
+  // Process one run (one run = one event)
+     gAlice->BeginEvent();
+     ProcessEvent();
+     gAlice->FinishEvent();
+  }
 }
 
-void AliGeant3::BuildPhysics()
+//_____________________________________________________________________________
+void AliGeant3::ProcessEvent()
 {
-  ((TGeant3*)gMC)->Gphysi();
+  //
+  // Process one event
+  //
+  Gtrigi();
+  Gtrigc();
+  Gtrig();
 }
 
-void AliGeant3::ProcessEvent()
+//_____________________________________________________________________________
+void AliGeant3::SetColors()
 {
-  ((TGeant3*)gMC)->Gtrigi();
-  ((TGeant3*)gMC)->Gtrigc();
-  ((TGeant3*)gMC)->Gtrig();
+  //
+  // Set the colors for all the volumes
+  // this is done sequentially for all volumes
+  // based on the number of their medium
+  //
+  Int_t kv, icol;
+  Int_t jvolum=fGclink->jvolum;
+  //Int_t jtmed=fGclink->jtmed;
+  //Int_t jmate=fGclink->jmate;
+  Int_t nvolum=fGcnum->nvolum;
+  char name[5];
+  //
+  //    Now for all the volumes
+  for(kv=1;kv<=nvolum;kv++) {
+    //     Get the tracking medium
+    Int_t itm=Int_t (fZq[fZlq[jvolum-kv]+4]);
+    //     Get the material
+    //Int_t ima=Int_t (fZq[fZlq[jtmed-itm]+6]);
+    //     Get z
+    //Float_t z=fZq[fZlq[jmate-ima]+7];
+    //     Find color number
+    //icol = Int_t(z)%6+2;
+    //icol = 17+Int_t(z*150./92.);
+    //icol = kv%6+2;
+    icol = itm%6+2;
+    strncpy(name,(char*)&fZiq[jvolum+kv],4);
+    name[4]='\0';
+    Gsatt(name,"COLO",icol);
+  }
 }
 
 //_____________________________________________________________________________
@@ -103,61 +208,6 @@ extern "C" void type_of_call  rxgtrak (Int_t &mtrack, Int_t &ipart, Float_t *pmo
   mtrack++;
 }
 
-//_____________________________________________________________________________
-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
-{
-  //
-  //     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.
-  //
-  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++;
-}
-
-//_____________________________________________________________________________
-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(Keep_Bit);
-}
-
 //_____________________________________________________________________________
 extern "C" void type_of_call  rxouth ()
 {
@@ -167,7 +217,6 @@ extern "C" void type_of_call  rxouth ()
   gAlice->FinishPrimary();
 }
 
-
 #ifndef WIN32
 #  define gudigi gudigi_
 #  define guhadr guhadr_
@@ -201,7 +250,7 @@ extern "C" void type_of_call  rxouth ()
 #  define ghelix ghelix_
 #  define grkuta grkuta_
 #  define gtrack gtrack_
-#  define gtreve_root gtreve_root_
+#  define gtreveroot gtreveroot_
 #  define glast  glast_
 
 #else
@@ -237,7 +286,7 @@ extern "C" void type_of_call  rxouth ()
 #  define ghelix GHELIX
 #  define grkuta GRKUTA
 #  define gtrack GTRACK
-#  define gtreve_root GTREVE_ROOT
+#  define gtreveroot GTREVEROOT
 #  define glast  GLAST
 
 #endif
@@ -252,7 +301,7 @@ extern "C" type_of_call void ghelx3(Float_t&, Float_t&, Float_t*, Float_t*);
 extern "C" type_of_call void ghelix(Float_t&, Float_t&, Float_t*, Float_t*);
 extern "C" type_of_call void grkuta(Float_t&, Float_t&, Float_t*, Float_t*);
 extern "C" type_of_call void gtrack();
-extern "C" type_of_call void gtreve_root();
+extern "C" type_of_call void gtreveroot();
 extern "C" type_of_call void glast();
 
 extern "C" type_of_call {
@@ -348,6 +397,66 @@ void gudcay()
 //
 //    ------------------------------------------------------------------
 //
+    
+    TGeant3* geant3=(TGeant3*) gMC;
+  // set decay table
+  gMC->Decayer()->ForceDecay();
+
+// Initialize 4-momentum vector    
+    Int_t ipart = geant3->Gckine()->ipart;
+    TLorentzVector p;
+    
+    p[0]=geant3->Gctrak()->vect[3];
+    p[1]=geant3->Gctrak()->vect[4];
+    p[2]=geant3->Gctrak()->vect[5];
+    p[3]=geant3->Gctrak()->vect[6];    
+    
+// Convert from geant to lund particle code
+    Int_t iplund=gMC->PDGFromId(ipart);
+// Particle list
+    static TClonesArray *particles;
+    if(!particles) particles=new TClonesArray("TParticle",1000);
+// Decay
+    gMC->Decayer()->Decay(iplund, &p);
+    
+// 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(i);
+       Int_t ks = iparticle->GetStatusCode();
+// Final state particles only
+       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 index=geant3->Gcking()->ngkine;
+// Put particle on geant stack
+// momentum vector
+
+       (geant3->Gcking()->gkin[index][0]) = iparticle->Px();
+       (geant3->Gcking()->gkin[index][1]) = iparticle->Py();
+       (geant3->Gcking()->gkin[index][2]) = iparticle->Pz();
+       (geant3->Gcking()->gkin[index][3]) = iparticle->Energy();
+       Int_t ilu = gMC->IdFromPDG(kf);
+
+// particle type       
+       (geant3->Gcking()->gkin[index][4]) = Float_t(ilu);
+// position
+       (geant3->Gckin3()->gpos[index][0]) = geant3->Gctrak()->vect[0];
+       (geant3->Gckin3()->gpos[index][1]) = geant3->Gctrak()->vect[1];
+       (geant3->Gckin3()->gpos[index][2]) = geant3->Gctrak()->vect[2];
+// time of flight offset (mm)
+       (geant3->Gcking()->tofd[index])    = 0.;
+//     (geant3->Gcking()->tofd[index])    = iparticle->T()/(10*kSpeedOfLight);
+// increase stack counter
+       (geant3->Gcking()->ngkine)=index+1;
+    }
 }
 
 //______________________________________________________________________
@@ -566,20 +675,11 @@ void gutrak()
 //
 //    ------------------------------------------------------------------
 //
-     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();
 }
 
 //______________________________________________________________________
@@ -597,7 +697,7 @@ void gutrev()
 //
 //    ------------------------------------------------------------------
 //
-  gtreve_root();
+  gtreveroot();
 }
 
 
@@ -634,27 +734,26 @@ void gustep()
   Int_t ipp, jk, id, nt;
   Float_t polar[3]={0,0,0};
   Float_t mom[3];
-  const char *chproc;
+  AliMCProcess pProc;
+
   
-  // --- Standard GEANT debug routine 
   TGeant3* geant3 = (TGeant3*) gMC;
-  if(geant3->Gcflag()->idebug) geant3->Gdebug();
-
   //     Stop particle if outside user defined tracking region 
   gMC->TrackPosition(x);
   r=TMath::Sqrt(x[0]*x[0]+x[1]*x[1]);
   if (r > gAlice->TrackingRmax() || TMath::Abs(x[2]) > gAlice->TrackingZmax()) {
        gMC->StopTrack();
   }
+
   // --- Add new created particles 
   if (gMC->NSecondaries() > 0) {
-    chproc=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, chproc, nt);
+                        geant3->Gckin3()->gpos[jk], polar,geant3->Gctrak()->tofg, pProc, nt);
       }
     }
   }
@@ -669,12 +768,15 @@ void gustep()
                       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 ?
   if (!gMC->IsTrackOut()) 
     if ((id=gAlice->DetFromMate(geant3->Gctmed()->numed)) >= 0) gAlice->StepManager(id);
+
+  // --- Standard GEANT debug routine 
+  if(geant3->Gcflag()->idebug) geant3->Gdebug();
 }
 
 //______________________________________________________________________