]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TGeant3/TGeant3.cxx
Support for Cerenkov and process list in Virtual MC
[u/mrichter/AliRoot.git] / TGeant3 / TGeant3.cxx
index 49ffe9916576868b61bf9841bebb62aaec9a691e..8d3dc43f194049e61967f70322b0f586fed4f201 100644 (file)
 
 /*
 $Log$
+Revision 1.42  2000/12/19 08:37:48  alibrary
+Using dlsym to retrieve address of commons
+
+Revision 1.41  2000/12/18 11:33:50  alibrary
+New call frequence histograms per module and volume
+
+Revision 1.40  2000/12/06 10:06:58  morsch
+Add all D and B baryons produced by HIJING to PDG DataBase.
+
+Revision 1.39  2000/11/30 07:12:54  alibrary
+Introducing new Rndm and QA classes
+
+Revision 1.38  2000/10/30 15:19:06  morsch
+Xi(b) (pdg code 5232) added to Pdg data base.
+
+Revision 1.37  2000/10/02 21:28:16  fca
+Removal of useless dependecies via forward declarations
+
+Revision 1.36  2000/09/14 07:08:41  fca
+Introducing glvolu in the interface
+
 Revision 1.35  2000/09/12 14:27:10  morsch
 No instance of AliDecayer created to initialize fDecayer.
 
@@ -102,14 +123,20 @@ Introduction of the Copyright and cvs Log
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
-#include "TGeant3.h" 
+#include "dlfcn.h"
+#include "ctype.h" 
+
 #include "TROOT.h" 
+#include "TDatabasePDG.h"
+#include "TLorentzVector.h"
+#include "TArrayI.h"
+
 #include "THIGZ.h" 
-#include "ctype.h" 
-#include <TDatabasePDG.h>
+#include "TGeant3.h" 
+
 #include "AliCallf77.h" 
 #include "AliDecayer.h" 
+
 #ifndef WIN32 
 # define gzebra  gzebra_ 
 # define grfile  grfile_ 
@@ -204,7 +231,6 @@ Introduction of the Copyright and cvs Log
  
 # define setbomb setbomb_
 # define setclip setclip_
-# define gcomad gcomad_
 
 # define gbrelm gbrelm_
 # define gprelm gprelm_
@@ -303,7 +329,6 @@ Introduction of the Copyright and cvs Log
  
 # define setbomb SETBOMB
 # define setclip SETCLIP
-# define gcomad  GCOMAD
  
 # define gbrelm GBRELM
 # define gprelm GPRELM
@@ -380,10 +405,12 @@ extern "C"
 
   void type_of_call gtreveroot(); 
 
-  void type_of_call grndm(Float_t *, const Int_t &); 
+  void type_of_call grndm(Float_t *r, const Int_t &n)
+  {gMC->Rndm(r,n);}
 
   void type_of_call grndmq(Int_t &, Int_t &, const Int_t &,
-                          DEFCHARD DEFCHARL); 
+                          DEFCHARD DEFCHARL)
+  {/*printf("Dummy grndmq called\n");*/}
 
   void type_of_call gdtom(Float_t *, Float_t *, Int_t &); 
 
@@ -521,7 +548,6 @@ extern "C"
   void type_of_call setbomb(Float_t &);
   void type_of_call setclip(DEFCHARD, Float_t &,Float_t &,Float_t &,Float_t &,
                            Float_t &, Float_t & DEFCHARL); 
-  void type_of_call gcomad(DEFCHARD, Int_t*& DEFCHARL); 
 
   void type_of_call ertrak(const Float_t *const x1, const Float_t *const p1,
                           const Float_t *x2, const Float_t *p2,
@@ -619,42 +645,74 @@ void TGeant3::LoadAddress()
   // Assigns the address of the GEANT common blocks to the structures
   // that allow their access from C++
   //
-  Int_t *addr;
-  gcomad(PASSCHARD("QUEST"), (int*&) fQuest PASSCHARL("QUEST"));
-  gcomad(PASSCHARD("GCBANK"),(int*&) fGcbank  PASSCHARL("GCBANK"));
-  gcomad(PASSCHARD("GCLINK"),(int*&) fGclink  PASSCHARL("GCLINK"));
-  gcomad(PASSCHARD("GCCUTS"),(int*&) fGccuts  PASSCHARL("GCCUTS"));
-  gcomad(PASSCHARD("GCMULO"),(int*&) fGcmulo  PASSCHARL("GCMULO"));
-  gcomad(PASSCHARD("GCFLAG"),(int*&) fGcflag  PASSCHARL("GCFLAG"));
-  gcomad(PASSCHARD("GCKINE"),(int*&) fGckine  PASSCHARL("GCKINE"));
-  gcomad(PASSCHARD("GCKING"),(int*&) fGcking  PASSCHARL("GCKING"));
-  gcomad(PASSCHARD("GCKIN2"),(int*&) fGckin2  PASSCHARL("GCKIN2"));
-  gcomad(PASSCHARD("GCKIN3"),(int*&) fGckin3  PASSCHARL("GCKIN3"));
-  gcomad(PASSCHARD("GCMATE"),(int*&) fGcmate  PASSCHARL("GCMATE"));
-  gcomad(PASSCHARD("GCTMED"),(int*&) fGctmed  PASSCHARL("GCTMED"));
-  gcomad(PASSCHARD("GCTRAK"),(int*&) fGctrak  PASSCHARL("GCTRAK"));
-  gcomad(PASSCHARD("GCTPOL"),(int*&) fGctpol  PASSCHARL("GCTPOL"));
-  gcomad(PASSCHARD("GCVOLU"),(int*&) fGcvolu  PASSCHARL("GCVOLU"));
-  gcomad(PASSCHARD("GCNUM"), (int*&) fGcnum   PASSCHARL("GCNUM"));
-  gcomad(PASSCHARD("GCSETS"),(int*&) fGcsets  PASSCHARL("GCSETS"));
-  gcomad(PASSCHARD("GCPHYS"),(int*&) fGcphys  PASSCHARL("GCPHYS"));
-  gcomad(PASSCHARD("GCPHLT"),(int*&) fGcphlt  PASSCHARL("GCPHLT"));
-  gcomad(PASSCHARD("GCOPTI"),(int*&) fGcopti  PASSCHARL("GCOPTI"));
-  gcomad(PASSCHARD("GCTLIT"),(int*&) fGctlit  PASSCHARL("GCTLIT"));
-  gcomad(PASSCHARD("GCVDMA"),(int*&) fGcvdma  PASSCHARL("GCVDMA"));
-
+  void *handle = dlopen (NULL, RTLD_LAZY);
+
+#ifndef WIN32
+  fQuest  = (Quest_t *)  dlsym(handle,"quest_");
+  fGcbank = (Gcbank_t *) dlsym(handle,"gcbank_");
+  fGclink = (Gclink_t *) dlsym(handle,"gclink_");
+  fGccuts = (Gccuts_t *) dlsym(handle,"gccuts_");
+  fGcmulo = (Gcmulo_t *) dlsym(handle,"gcmulo_");
+  fGcflag = (Gcflag_t *) dlsym(handle,"gcflag_");
+  fGckine = (Gckine_t *) dlsym(handle,"gckine_");
+  fGcking = (Gcking_t *) dlsym(handle,"gcking_");
+  fGckin2 = (Gckin2_t *) dlsym(handle,"gckin2_");
+  fGckin3 = (Gckin3_t *) dlsym(handle,"gckin3_");
+  fGcmate = (Gcmate_t *) dlsym(handle,"gcmate_");
+  fGctmed = (Gctmed_t *) dlsym(handle,"gctmed_");
+  fGctrak = (Gctrak_t *) dlsym(handle,"gctrak_");
+  fGctpol = (Gctpol_t *) dlsym(handle,"gctpol_");
+  fGcvolu = (Gcvolu_t *) dlsym(handle,"gcvolu_");
+  fGcnum  = (Gcnum_t *)  dlsym(handle,"gcnum_");
+  fGcsets = (Gcsets_t *) dlsym(handle,"gcsets_");
+  fGcphys = (Gcphys_t *) dlsym(handle,"gcphys_");
+  fGcphlt = (Gcphlt_t *) dlsym(handle,"gcphlt_");
+  fGcopti = (Gcopti_t *) dlsym(handle,"gcopti_");
+  fGctlit = (Gctlit_t *) dlsym(handle,"gctlit_");
+  fGcvdma = (Gcvdma_t *) dlsym(handle,"gcvdma_");
+  
   // Commons for GEANE
-  gcomad(PASSCHARD("ERTRIO"),(int*&) fErtrio  PASSCHARL("ERTRIO"));
-  gcomad(PASSCHARD("EROPTS"),(int*&) fEropts  PASSCHARL("EROPTS"));
-  gcomad(PASSCHARD("EROPTC"),(int*&) fEroptc  PASSCHARL("EROPTC"));
-  gcomad(PASSCHARD("ERWORK"),(int*&) fErwork  PASSCHARL("ERWORK"));
-
+  fErtrio = (Ertrio_t *) dlsym(handle,"ertrio_");
+  fEropts = (Eropts_t *) dlsym(handle,"eropts_");
+  fEroptc = (Eroptc_t *) dlsym(handle,"eroptc_");
+  fErwork = (Erwork_t *) dlsym(handle,"erwork_");
+#else  
+  fQuest  = (Quest_t *)  dlsym(handle,"QUEST");
+  fGcbank = (Gcbank_t *) dlsym(handle,"GCBANK");
+  fGclink = (Gclink_t *) dlsym(handle,"GCLINK");
+  fGccuts = (Gccuts_t *) dlsym(handle,"GCCUTS");
+  fGcmulo = (Gcmulo_t *) dlsym(handle,"GCMULO");
+  fGcflag = (Gcflag_t *) dlsym(handle,"GCFLAG");
+  fGckine = (Gckine_t *) dlsym(handle,"GCKINE");
+  fGcking = (Gcking_t *) dlsym(handle,"GCKING");
+  fGckin2 = (Gckin2_t *) dlsym(handle,"GCKIN2");
+  fGckin3 = (Gckin3_t *) dlsym(handle,"GCKIN3");
+  fGcmate = (Gcmate_t *) dlsym(handle,"GCMATE");
+  fGctmed = (Gctmed_t *) dlsym(handle,"GCTMED");
+  fGctrak = (Gctrak_t *) dlsym(handle,"GCTRAK");
+  fGctpol = (Gctpol_t *) dlsym(handle,"GCTPOL");
+  fGcvolu = (Gcvolu_t *) dlsym(handle,"GCVOLU");
+  fGcnum  = (Gcnum_t *)  dlsym(handle,"GCNUM");
+  fGcsets = (Gcsets_t *) dlsym(handle,"GCSETS");
+  fGcphys = (Gcphys_t *) dlsym(handle,"GCPHYS");
+  fGcphlt = (Gcphlt_t *) dlsym(handle,"GCPHLT");
+  fGcopti = (Gcopti_t *) dlsym(handle,"GCOPTI");
+  fGctlit = (Gctlit_t *) dlsym(handle,"GCTLIT");
+  fGcvdma = (Gcvdma_t *) dlsym(handle,"GCVDMA");
+  
+  // Commons for GEANE
+  fErtrio = (Ertrio_t *) dlsym(handle,"ERTRIO");
+  fEropts = (Eropts_t *) dlsym(handle,"EROPTS");
+  fEroptc = (Eroptc_t *) dlsym(handle,"EROPTC");
+  fErwork = (Erwork_t *) dlsym(handle,"ERWORK");
+#endif
+  
   // Variables for ZEBRA store
-  gcomad(PASSCHARD("IQ"), addr  PASSCHARL("IQ"));
-  fZiq = addr;
-  gcomad(PASSCHARD("LQ"), addr  PASSCHARL("LQ"));
-  fZlq = addr;
-  fZq       = (float*)fZiq; 
+  //
+  fZlq = (Int_t *) &(fGcbank->lmain)-1;
+  fZiq = (Int_t *) &(fGcbank->lmain)+7;
+  fZq  = (Float_t *)fZiq; 
+
 } 
 
 //_____________________________________________________________________________
@@ -954,6 +1012,56 @@ void TGeant3::DefineParticles()
   pdgDB->AddParticle("Omega(c)*0 bar","Omega(c)*0",
                     2.8000, kFALSE, -1., -0.,"Baryon", -4334);
 
+
+// Xi(cc)
+
+  pdgDB->AddParticle("Xsi(cc)+","Xsi(cc)+",
+                    3.60, kTRUE, -1., +1.,"Baryon",  4412);
+
+  pdgDB->AddParticle("Xsi(cc) bar-","Xsi(cc) bar-",
+                    3.60, kTRUE, -1., -1.,"Baryon", -4412);
+
+  pdgDB->AddParticle("Xsi*(cc)+","Xsi*(cc)+",
+                    3.66, kTRUE, -1., +1.,"Baryon",  4414);
+
+  pdgDB->AddParticle("Xsi*(cc) bar-","Xsi*(cc) bar-",
+                    3.66, kTRUE, -1., -1.,"Baryon", -4414);
+
+
+  pdgDB->AddParticle("Xsi(cc)++","Xsi(cc)++",
+                    3.60, kTRUE, -1., +2.,"Baryon",  4422);
+
+  pdgDB->AddParticle("Xsi(cc) bar--","Xsi(cc) bar--",
+                    3.60, kTRUE, -1., -2.,"Baryon", -4422);
+
+
+  pdgDB->AddParticle("Xsi*(cc)++","Xsi*(cc)++",
+                    3.66, kTRUE, -1., +2.,"Baryon",  4424);
+
+  pdgDB->AddParticle("Xsi*(cc) bar-","Xsi*(cc) bar-",
+                    3.66, kTRUE, -1., -2.,"Baryon", -4424);
+
+  pdgDB->AddParticle("Omega(cc)+","Omega(cc)+",
+                    3.78, kTRUE, -1., +1.,"Baryon",  4432);
+
+  pdgDB->AddParticle("Omega(cc) bar-","Omega(cc) bar-",
+                    3.78, kTRUE, -1., -1.,"Baryon", -4432);
+
+  pdgDB->AddParticle("Omega*(cc)+","Omega*(cc)+",
+                    3.82, kTRUE, -1., +1.,"Baryon",  4434);
+
+  pdgDB->AddParticle("Omega*(cc) bar-","Omega*(cc) bar-",
+                    3.82, kTRUE, -1., -1.,"Baryon", -4434);
+
+
+  pdgDB->AddParticle("Omega*(ccc)+","Omega*(cc)++",
+                    4.91, kTRUE, -1., +2.,"Baryon",  4444);
+
+  pdgDB->AddParticle("Omega*(ccc) bar--","Omega*(cc) bar--",
+                    4.91, kTRUE, -1., -2.,"Baryon", -4444);
+
+
+
 // Bottom baryons
 //
 // mass value from Hijing
@@ -962,7 +1070,176 @@ void TGeant3::DefineParticles()
 
   pdgDB->AddParticle("Sigma(b)*-","Sigma(b)*-",
                     5.8100, kFALSE, -1., -1.,"Baryon", -5224);
+
+
+  pdgDB->AddParticle("Xi(b)0","Xi(b)0",
+                    5.8400, kFALSE, -1., +0.,"Baryon", 5232);
+
+  pdgDB->AddParticle("Xi(b)0 bar","Xi(b)0 bar",
+                    5.8100, kFALSE, -1., -0.,"Baryon", -5232);
+
+// B(s) 
+  pdgDB->AddParticle("Xi'(b)-","Xi'(b)-",
+                    5.9600, kFALSE, -1., -1.,"Baryon", 5312);
+
+  pdgDB->AddParticle("Xi'(b) bar+","Xi'(b) bar+",
+                    5.9600, kFALSE, -1.,  1.,"Baryon", -5312);
+
+  pdgDB->AddParticle("Xi*(b)-","Xi*(b)-",
+                    5.9700, kFALSE, -1., -1.,"Baryon", 5314);
+
+  pdgDB->AddParticle("Xi*(b) bar+","Xi*(b) bar+",
+                    5.9700, kFALSE, -1.,  1.,"Baryon", -5314);
+
+  pdgDB->AddParticle("Xi'(b)0","Xi'(b)0",
+                    5.9600, kFALSE, -1., -0.,"Baryon", 5322);
+
+  pdgDB->AddParticle("Xi'(b) bar0","Xi'(b) bar0",
+                    5.9600, kFALSE, -1.,  0.,"Baryon", -5322);
+
+  pdgDB->AddParticle("Xi*(b)0","Xi*(b)0",
+                    5.9700, kFALSE, -1., -0.,"Baryon", 5324);
+
+  pdgDB->AddParticle("Xi*(b) bar0","Xi*(b) bar0",
+                    5.9700, kFALSE, -1.,  0.,"Baryon", -5324);
+
+  pdgDB->AddParticle("Omega(b)-","Omega(b)-",
+                    6.1200, kFALSE, -1., -1.,"Baryon", 5332);
+
+  pdgDB->AddParticle("Omega(b) bar+","Omega(b) bar+",
+                    6.1200, kFALSE, -1.,  1.,"Baryon", -5332);
+
+  pdgDB->AddParticle("Omega*(b)-","Omega*(b)-",
+                    6.1300, kFALSE, -1., -1.,"Baryon", 5334);
+
+  pdgDB->AddParticle("Omega*(b) bar+","Omega*(b) bar+",
+                    6.1300, kFALSE, -1.,  1.,"Baryon", -5334);
+
+
+  pdgDB->AddParticle("Omega*(b)-","Omega*(b)-",
+                    6.1300, kFALSE, -1., -1.,"Baryon", 5334);
+
+  pdgDB->AddParticle("Omega*(b) bar+","Omega*(b) bar+",
+                    6.1300, kFALSE, -1.,  1.,"Baryon", -5334);
+
+// B(c) 
+
+  pdgDB->AddParticle("Omega(bc)0","Omega(bc)0",
+                    7.1900, kFALSE, -1., -0.,"Baryon", 5342);
+
+  pdgDB->AddParticle("Omega(bc) bar0","Omega(bc) bar0",
+                    7.1900, kFALSE, -1.,  0.,"Baryon", -5342);
+
+  pdgDB->AddParticle("Xi'(bc)0","Xi'(bc)0",
+                    7.0400, kFALSE, -1., -0.,"Baryon", 5412);
+
+  pdgDB->AddParticle("Xi'(bc) bar0","Xi'(bc) bar0",
+                    7.0400, kFALSE, -1.,  0.,"Baryon", -5412);
+
+  pdgDB->AddParticle("Xi*(bc)0","Xi*(bc)0",
+                    7.0500, kFALSE, -1., -0.,"Baryon", 5414);
+
+  pdgDB->AddParticle("Xi*(bc) bar0","Xi*(bc) bar0",
+                    7.0500, kFALSE, -1.,  0.,"Baryon", -5414);
+
+  pdgDB->AddParticle("Xi'(bc)+","Xi'(bc)+",
+                    7.0400, kFALSE, -1., +1.,"Baryon", 5422);
+
+  pdgDB->AddParticle("Xi'(bc) bar-","Xi'(bc) bar-",
+                    7.0400, kFALSE, -1., -1.,"Baryon", -5422);
+
+  pdgDB->AddParticle("Xi*(bc)+","Xi*(bc)+",
+                    7.0500, kFALSE, -1., +1.,"Baryon", 5424);
+
+  pdgDB->AddParticle("Xi*(bc) bar-","Xi*(bc) bar-",
+                    7.0500, kFALSE, -1., -1.,"Baryon", -5424);
+
+  pdgDB->AddParticle("Omega'(bc)0","Omega'(bc)0",
+                    7.2100, kFALSE, -1., -0.,"Baryon", 5432);
+
+  pdgDB->AddParticle("Omega'(bc) bar0","Omega'(bc) bar0",
+                    7.2100, kFALSE, -1.,  0.,"Baryon", -5432);
+
+  pdgDB->AddParticle("Omega*(bc)0","Omega*(bc)0",
+                    7.2200, kFALSE, -1., -0.,"Baryon", 5434);
+
+  pdgDB->AddParticle("Omega*(bc) bar0","Omega*(bc) bar0",
+                    7.2200, kFALSE, -1.,  0.,"Baryon", -5434);
+// B(bcc)
+  pdgDB->AddParticle("Omega(bcc)+","Omega(bcc)+",
+                    8.3100, kFALSE, -1., +1.,"Baryon", 5442);
+
+  pdgDB->AddParticle("Omega(bcc) bar-","Omega(bcc) bar-",
+                    8.3100, kFALSE, -1., -1.,"Baryon", -5442);
+
+  pdgDB->AddParticle("Omega*(bcc)+","Omega*(bcc)+",
+                   8.3100, kFALSE, -1., +1.,"Baryon", 5444);
+
+  pdgDB->AddParticle("Omega*(bcc) bar-","Omega*(bcc) bar-",
+                    8.3100, kFALSE, -1., -1.,"Baryon", -5444);
+
+
+
+
+// B(bb)
+
+  pdgDB->AddParticle("Xsi(bb)-","Xsi(bb)-",
+                    10.4200, kFALSE, -1., -1.,"Baryon", 5512);
+  
+  pdgDB->AddParticle("Xsi(bb) bar+","Xsi(bb) bar+",
+                    10.4200, kFALSE, -1., +1.,"Baryon", -5512);
+
+  pdgDB->AddParticle("Xsi*(bb)-","Xsi*(bb)-",
+                    10.4400, kFALSE, -1., -1.,"Baryon", 5514);
+  
+  pdgDB->AddParticle("Xsi*(bb) bar+","Xsi*(bb) bar+",
+                    10.4400, kFALSE, -1., +1.,"Baryon", -5514);
+
+  pdgDB->AddParticle("Xsi(bb)0","Xsi(bb)0",
+                    10.4200, kFALSE, -1., -0.,"Baryon", 5522);
+  
+  pdgDB->AddParticle("Xsi(bb) bar0","Xsi(bb) bar0",
+                    10.4200, kFALSE, -1., +0.,"Baryon", -5522);
+
+  pdgDB->AddParticle("Xsi*(bb)0","Xsi*(bb)0",
+                    10.4400, kFALSE, -1., -0.,"Baryon", 5524);
+  
+  pdgDB->AddParticle("Xsi*(bb) bar0","Xsi*(bb) bar0",
+                    10.4400, kFALSE, -1., +0.,"Baryon", -5524);
+
+  pdgDB->AddParticle("Omega*(bb)-","Omega(bb)-",
+                    10.6000, kFALSE, -1., -1.,"Baryon", 5532);
+
+  pdgDB->AddParticle("Omega(bb) bar+","Omega(bb) bar+",
+                    10.6000, kFALSE, -1., +1.,"Baryon", -5532);
+
+  pdgDB->AddParticle("Omega*(bb)-","Omega*(bb)-",
+                    10.6000, kFALSE, -1., -1.,"Baryon", 5534);
+
+  pdgDB->AddParticle("Omega*(bb) bar+","Omega*(bb) bar+",
+                    10.6000, kFALSE, -1., +1.,"Baryon", -5534);
+
+// B(bbc)
+
+  pdgDB->AddParticle("Omega(bbc)0","Omega(bbc)0",
+                    11.7100, kFALSE, -1., -0.,"Baryon", 5542);
+
+  pdgDB->AddParticle("Omega(bbc) bar0","Omega(bbc) bar0",
+                    11.7100, kFALSE, -1., +0.,"Baryon", -5542);
+
+  pdgDB->AddParticle("Omega*(bbc)0","Omega*(bbc)0",
+                    11.7100, kFALSE, -1., -0.,"Baryon", 5544);
+
+  pdgDB->AddParticle("Omega*(bbc) bar0","Omega*(bbc) bar0",
+                    11.7100, kFALSE, -1., +0.,"Baryon", -5544);
+// B(bbb)
+
+  pdgDB->AddParticle("Omega*(bbb)-","Omega*(bbb)-",
+                    15.1000, kFALSE, -1., -1.,"Baryon", 5544);
+
+  pdgDB->AddParticle("Omega*(bbb) bar+","Omega*(bbb) bar+",
+                    15.100, kFALSE, -1., +1.,"Baryon", -5544);
+
 //
 //
   pdgDB->AddParticle("Deuteron","Deuteron",2*kAu2Gev+8.071e-3,kTRUE,
@@ -1215,6 +1492,20 @@ Int_t TGeant3::NofVolumes() const
   return fGcnum->nvolum;
 }
 
+//_____________________________________________________________________________
+Int_t TGeant3::VolId2Mate(Int_t id) const 
+{
+  //
+  // Return material number for a given volume id
+  //
+  if(id<1 || id > fGcnum->nvolum || fGclink->jvolum<=0) 
+    return 0;
+  else {
+    Int_t jvo = fZlq[fGclink->jvolum-id];
+    return Int_t(fZq[jvo+4]);
+  }
+}
+
 //_____________________________________________________________________________
 const char* TGeant3::VolName(Int_t id) const
 {
@@ -1467,36 +1758,72 @@ Int_t   TGeant3::CurrentEvent() const
 }
 
 //_____________________________________________________________________________
-const char* TGeant3::ProdProcess() const
+AliMCProcess TGeant3::ProdProcess(Int_t ) const
 {
   //
   // Name of the process that has produced the secondary particles
   // in the current step
   //
-  static char proc[5];
-  const Int_t kIpMec[13] = { 5,6,7,8,9,10,11,12,21,23,25,105,108 };
-  Int_t mec, km, im;
-  //
-  if(fGcking->ngkine>0) {
-    for (km = 0; km < fGctrak->nmec; ++km) {
-      for (im = 0; im < 13; ++im) {
-       if (fGctrak->lmec[km] == kIpMec[im]) {
-         mec = fGctrak->lmec[km];
-         if (0 < mec && mec < 31) {
-           strncpy(proc,(char *)&fGctrak->namec[mec - 1],4);
-         } else if (mec - 100 <= 30 && mec - 100 > 0) {
-           strncpy(proc,(char *)&fGctpol->namec1[mec - 101],4);
-         }
-         proc[4]='\0';
-         return proc;
-       }
-      }
-    }
-    strcpy(proc,"UNKN");
-  } else strcpy(proc,"NONE");
+  const AliMCProcess kIpProc[13] = { kPDecay, kPPair, kPCompton, 
+                             kPPhotoelectric, kPBrem, kPDeltaRay,
+                             kPAnnihilation, kPHadronic, 
+                             kPMuonNuclear, kPPhotoFission,
+                             kPRayleigh, kPCerenkov, kPSynchrotron};
+  Int_t km, im;
+  //
+  if(fGcking->ngkine>0) 
+    for (km = 0; km < fGctrak->nmec; ++km) 
+      for (im = 0; im < 13; ++im) 
+       if (G3toVMC(fGctrak->lmec[km]) == kIpProc[im]) 
+           return kIpProc[im];
+  //  
+  return kPNoProcess;
+}
+
+//_____________________________________________________________________________
+Int_t TGeant3::StepProcesses(TArrayI &proc) const
+{
+  //
+  // Return processes active in the current step
+  //
+  Int_t i;
+  Int_t nproc=Gctrak()->nmec;
+  //
+  proc.Set(nproc);
+  Int_t nvproc=0;
+  //
+  for (i=0; i<nproc; ++i) 
+    if((proc[nvproc]=G3toVMC(Gctrak()->lmec[i]))!=kPNoProcess) nvproc++;
+  //
+  proc.Set(nvproc);
+  //
+  return nvproc;
+}
+
+//_____________________________________________________________________________
+AliMCProcess TGeant3::G3toVMC(Int_t iproc) const
+{
+  //
+  // Conversion between GEANT and AliMC processes
+  //
+  
+  const AliMCProcess kPG2MC1[30] = {kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL, kPDecay, 
+                            kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
+                            kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission, 
+                            kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic, kPHInhelastic,
+                            kPMuonNuclear, kPTOFlimit, kPPhotoFission, kPNoProcess, kPRayleigh,
+                            kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop};
+  
+  const AliMCProcess kPG2MC2[9] = {kPLightAbsorption, kPLightScattering, kStepMax, kPNoProcess, kPCerenkov,
+                           kPLightReflection, kPLightRefraction, kPSynchrotron, kPNoProcess};
+
+  AliMCProcess proc=kPNoProcess;
+  if(1<iproc && iproc<=30) proc= kPG2MC1[iproc-1];
+  else if(101<=iproc && iproc<=109) proc= kPG2MC2[iproc-100-1];
   return proc;
 }
 
+
 //_____________________________________________________________________________
 void    TGeant3::GetSecondary(Int_t isec, Int_t& ipart, 
                              TLorentzVector &x, TLorentzVector &p)
@@ -1775,16 +2102,6 @@ Float_t TGeant3::Etot() const
   return fGctrak->getot;
 }
 
-//_____________________________________________________________________________
-void TGeant3::Rndm(Float_t* r, const Int_t n) const
-{
-  //
-  // Return an array of n random numbers uniformly distributed 
-  // between 0 and 1 not included
-  //
-  Grndm(r,n);
-}
-
 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 //
 //                        Functions from GBASE
@@ -2138,7 +2455,29 @@ void  TGeant3::Gstmed(Int_t numed, const char *name, Int_t nmat, Int_t isvol,
  
 //_____________________________________________________________________________
 void  TGeant3::Gsckov(Int_t itmed, Int_t npckov, Float_t *ppckov,
-                     Float_t *absco, Float_t *effic, Float_t *rindex)
+                          Float_t *absco, Float_t *effic, Float_t *rindex)
+{ 
+  //
+  //    Stores the tables for UV photon tracking in medium ITMED 
+  //    Please note that it is the user's responsability to 
+  //    provide all the coefficients:
+  //
+  //
+  //       ITMED       Tracking medium number
+  //       NPCKOV      Number of bins of each table
+  //       PPCKOV      Value of photon momentum (in GeV)
+  //       ABSCO       Absorbtion coefficients 
+  //                   dielectric: absorbtion length in cm
+  //                   metals    : absorbtion fraction (0<=x<=1)
+  //       EFFIC       Detection efficiency for UV photons 
+  //       RINDEX      Refraction index (if=0 metal)
+  //
+  gsckov(itmed,npckov,ppckov,absco,effic,rindex);
+}
+
+//_____________________________________________________________________________
+void  TGeant3::SetCerenkov(Int_t itmed, Int_t npckov, Float_t *ppckov,
+                          Float_t *absco, Float_t *effic, Float_t *rindex)
 { 
   //
   //    Stores the tables for UV photon tracking in medium ITMED 
@@ -2403,17 +2742,17 @@ void  TGeant3::Grndm(Float_t *rvec, const Int_t len) const
   //
   //   To generate a vector RVECV of LEN random numbers 
   //   Copy of the CERN Library routine RANECU 
-  grndm(rvec,len);
+  Rndm(rvec,len);
 }
 
 //_____________________________________________________________________________
-void  TGeant3::Grndmq(Int_t &is1, Int_t &is2, const Int_t iseq,
-                     const Text_t *chopt)
+void  TGeant3::Grndmq(Int_t &/*is1*/, Int_t &/*is2*/, const Int_t /*iseq*/,
+                     const Text_t */*chopt*/)
 {
   //
   //  To set/retrieve the seed of the random number generator
   //
-  grndmq(is1,is2,iseq,PASSCHARD(chopt) PASSCHARL(chopt));
+  /*printf("Dummy grndmq called\n");*/
 }
 
 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
@@ -2667,6 +3006,7 @@ void  TGeant3::Gspos(const char *name, Int_t nr, const char *mother, Float_t x,
   //
   //  It positions a previously defined volume in the mother.
   //  
+    
   char vname[5];
   Vname(name,vname);
   char vmother[5];
@@ -4273,4 +4613,3 @@ void TGeant3::Streamer(TBuffer &R__b)
   }
 }
 
-