13 #ifndef ROOT_TVirtualMC 
   14 #define ROOT_TVirtualMC 
   40 class TVirtualMCSensitiveDetector;
 
   42 class TVirtualMC : 
public TNamed {
 
   45    friend class TMCManager;
 
   52    TVirtualMC(
const char *name, 
const char *title, Bool_t isRootGeometrySupported = kFALSE);
 
   58    virtual ~TVirtualMC();
 
   61    static TVirtualMC *GetMC();
 
   70    virtual Bool_t IsRootGeometrySupported() 
const = 0;
 
   91    virtual void Material(Int_t &kmat, 
const char *name, Double_t a, Double_t z, Double_t dens, Double_t radl,
 
   92                          Double_t absl, Float_t *buf, Int_t nwbuf) = 0;
 
   95    virtual void Material(Int_t &kmat, 
const char *name, Double_t a, Double_t z, Double_t dens, Double_t radl,
 
   96                          Double_t absl, Double_t *buf, Int_t nwbuf) = 0;
 
  110    Mixture(Int_t &kmat, 
const char *name, Float_t *a, Float_t *z, Double_t dens, Int_t nlmat, Float_t *wmat) = 0;
 
  114    Mixture(Int_t &kmat, 
const char *name, Double_t *a, Double_t *z, Double_t dens, Int_t nlmat, Double_t *wmat) = 0;
 
  135    virtual void Medium(Int_t &kmed, 
const char *name, Int_t nmat, Int_t isvol, Int_t ifield, Double_t fieldm,
 
  136                        Double_t tmaxfd, Double_t stemax, Double_t deemax, Double_t epsil, Double_t stmin, Float_t *ubuf,
 
  140    virtual void Medium(Int_t &kmed, 
const char *name, Int_t nmat, Int_t isvol, Int_t ifield, Double_t fieldm,
 
  141                        Double_t tmaxfd, Double_t stemax, Double_t deemax, Double_t epsil, Double_t stmin,
 
  142                        Double_t *ubuf, Int_t nbuf) = 0;
 
  152    virtual void Matrix(Int_t &krot, Double_t thetaX, Double_t phiX, Double_t thetaY, Double_t phiY, Double_t thetaZ,
 
  165    virtual void Gstpar(Int_t itmed, 
const char *param, Double_t parval) = 0;
 
  178    virtual Int_t Gsvolu(
const char *name, 
const char *shape, Int_t nmed, Float_t *upar, Int_t np) = 0;
 
  181    virtual Int_t Gsvolu(
const char *name, 
const char *shape, Int_t nmed, Double_t *upar, Int_t np) = 0;
 
  190    virtual void Gsdvn(
const char *name, 
const char *mother, Int_t ndiv, Int_t iaxis) = 0;
 
  196    virtual void Gsdvn2(
const char *name, 
const char *mother, Int_t ndiv, Int_t iaxis, Double_t c0i, Int_t numed) = 0;
 
  206    virtual void Gsdvt(
const char *name, 
const char *mother, Double_t step, Int_t iaxis, Int_t numed, Int_t ndvmx) = 0;
 
  217    Gsdvt2(
const char *name, 
const char *mother, Double_t step, Int_t iaxis, Double_t c0, Int_t numed, Int_t ndvmx) = 0;
 
  222    virtual void Gsord(
const char *name, Int_t iax) = 0;
 
  234    virtual void Gspos(
const char *name, Int_t nr, 
const char *mother, Double_t x, Double_t y, Double_t z, Int_t irot,
 
  235                       const char *konly = 
"ONLY") = 0;
 
  239    virtual void Gsposp(
const char *name, Int_t nr, 
const char *mother, Double_t x, Double_t y, Double_t z, Int_t irot,
 
  240                        const char *konly, Float_t *upar, Int_t np) = 0;
 
  243    virtual void Gsposp(
const char *name, Int_t nr, 
const char *mother, Double_t x, Double_t y, Double_t z, Int_t irot,
 
  244                        const char *konly, Double_t *upar, Int_t np) = 0;
 
  250    virtual void Gsbool(
const char *onlyVolName, 
const char *manyVolName) = 0;
 
  264    SetCerenkov(Int_t itmed, Int_t npckov, Float_t *ppckov, Float_t *absco, Float_t *effic, Float_t *rindex) = 0;
 
  268    SetCerenkov(Int_t itmed, Int_t npckov, Double_t *ppckov, Double_t *absco, Double_t *effic, Double_t *rindex) = 0;
 
  283    virtual void DefineOpSurface(
const char *name, EMCOpSurfaceModel model, EMCOpSurfaceType surfaceType,
 
  284                                 EMCOpSurfaceFinish surfaceFinish, Double_t sigmaAlpha) = 0;
 
  294    virtual void SetBorderSurface(
const char *name, 
const char *vol1Name, 
int vol1CopyNo, 
const char *vol2Name,
 
  295                                  int vol2CopyNo, 
const char *opSurfaceName) = 0;
 
  302    virtual void SetSkinSurface(
const char *name, 
const char *volName, 
const char *opSurfaceName) = 0;
 
  312    SetMaterialProperty(Int_t itmed, 
const char *propertyName, Int_t np, Double_t *pp, Double_t *values) = 0;
 
  319    virtual void SetMaterialProperty(Int_t itmed, 
const char *propertyName, Double_t value) = 0;
 
  329    SetMaterialProperty(
const char *surfaceName, 
const char *propertyName, Int_t np, Double_t *pp, Double_t *values) = 0;
 
  338    virtual Bool_t GetTransformation(
const TString &volumePath, TGeoHMatrix &matrix) = 0;
 
  342    virtual Bool_t GetShape(
const TString &volumePath, TString &shapeType, TArrayD &par) = 0;
 
  346    virtual Bool_t GetMaterial(Int_t imat, TString &name, Double_t &a, Double_t &z, Double_t &density, Double_t &radl,
 
  347                               Double_t &inter, TArrayD &par) = 0;
 
  351    virtual Bool_t GetMaterial(
const TString &volumeName, TString &name, Int_t &imat, Double_t &a, Double_t &z,
 
  352                               Double_t &density, Double_t &radl, Double_t &inter, TArrayD &par) = 0;
 
  356    virtual Bool_t GetMedium(
const TString &volumeName, TString &name, Int_t &imed, Int_t &nmat, Int_t &isvol,
 
  357                             Int_t &ifield, Double_t &fieldm, Double_t &tmaxfd, Double_t &stemax, Double_t &deemax,
 
  358                             Double_t &epsil, Double_t &stmin, TArrayD &par) = 0;
 
  368    virtual void WriteEuclid(
const char *filnam, 
const char *topvol, Int_t number, Int_t nlevel) = 0;
 
  371    virtual void SetRootGeometry() = 0;
 
  377    virtual void SetUserParameters(Bool_t isUserParameters) = 0;
 
  385    virtual Int_t VolId(
const char *volName) 
const = 0;
 
  388    virtual const char *VolName(Int_t 
id) 
const = 0;
 
  391    virtual Int_t MediumId(
const char *mediumName) 
const = 0;
 
  394    virtual Int_t NofVolumes() 
const = 0;
 
  397    virtual Int_t VolId2Mate(Int_t 
id) 
const = 0;
 
  400    virtual Int_t NofVolDaughters(
const char *volName) 
const = 0;
 
  403    virtual const char *VolDaughterName(
const char *volName, Int_t i) 
const = 0;
 
  406    virtual Int_t VolDaughterCopyNo(
const char *volName, Int_t i) 
const = 0;
 
  417    virtual void SetSensitiveDetector(
const TString &volName, TVirtualMCSensitiveDetector *sd);
 
  421    virtual TVirtualMCSensitiveDetector *GetSensitiveDetector(
const TString &volName) 
const;
 
  426    virtual void SetExclusiveSDScoring(Bool_t exclusiveSDScoring);
 
  440    virtual Bool_t SetCut(
const char *cutName, Double_t cutValue) = 0;
 
  443    virtual Bool_t SetProcess(
const char *flagName, Int_t flagValue) = 0;
 
  470    virtual Bool_t DefineParticle(Int_t pdg, 
const char *name, TMCParticleType mcType, Double_t mass, Double_t charge,
 
  471                                  Double_t lifetime) = 0;
 
  498    virtual Bool_t DefineParticle(Int_t pdg, 
const char *name, TMCParticleType mcType, Double_t mass, Double_t charge,
 
  499                                  Double_t lifetime, 
const TString &pType, Double_t width, Int_t iSpin, Int_t iParity,
 
  500                                  Int_t iConjugation, Int_t iIsospin, Int_t iIsospinZ, Int_t gParity, Int_t lepton,
 
  501                                  Int_t baryon, Bool_t stable, Bool_t shortlived = kFALSE, 
const TString &subType = 
"",
 
  502                                  Int_t antiEncoding = 0, Double_t magMoment = 0.0, Double_t excitation = 0.0) = 0;
 
  512    virtual Bool_t DefineIon(
const char *name, Int_t Z, Int_t A, Int_t Q, Double_t excEnergy, Double_t mass = 0.) = 0;
 
  519    virtual Bool_t SetDecayMode(Int_t pdg, Float_t bratio[6], Int_t mode[6][3]) = 0;
 
  524    virtual Double_t Xsec(
char *, Double_t, Int_t, Int_t) = 0;
 
  532    virtual Int_t IdFromPDG(Int_t pdg) 
const = 0;
 
  535    virtual Int_t PDGFromId(Int_t 
id) 
const = 0;
 
  543    virtual TString ParticleName(Int_t pdg) 
const = 0;
 
  546    virtual Double_t ParticleMass(Int_t pdg) 
const = 0;
 
  549    virtual Double_t ParticleCharge(Int_t pdg) 
const = 0;
 
  552    virtual Double_t ParticleLifeTime(Int_t pdg) 
const = 0;
 
  555    virtual TMCParticleType ParticleMCType(Int_t pdg) 
const = 0;
 
  568    virtual void StopTrack() = 0;
 
  571    virtual void StopEvent() = 0;
 
  574    virtual void StopRun() = 0;
 
  582    virtual void SetMaxStep(Double_t) = 0;
 
  585    virtual void SetMaxNStep(Int_t) = 0;
 
  589    virtual void SetUserDecay(Int_t pdg) = 0;
 
  592    virtual void ForceDecayTime(Float_t) = 0;
 
  600    virtual Int_t CurrentVolID(Int_t ©No) 
const = 0;
 
  604    virtual Int_t CurrentVolOffID(Int_t off, Int_t ©No) 
const = 0;
 
  607    virtual const char *CurrentVolName() 
const = 0;
 
  612    virtual const char *CurrentVolOffName(Int_t off) 
const = 0;
 
  615    virtual const char *CurrentVolPath() = 0;
 
  619    virtual Bool_t CurrentBoundaryNormal(Double_t &x, Double_t &y, Double_t &z) 
const = 0;
 
  622    virtual Int_t CurrentMaterial(Float_t &a, Float_t &z, Float_t &dens, Float_t &radl, Float_t &absl) 
const = 0;
 
  625    virtual Int_t CurrentMedium() 
const = 0;
 
  629    virtual Int_t CurrentEvent() 
const = 0;
 
  638    virtual void Gmtod(Float_t *xm, Float_t *xd, Int_t iflag) = 0;
 
  641    virtual void Gmtod(Double_t *xm, Double_t *xd, Int_t iflag) = 0;
 
  650    virtual void Gdtom(Float_t *xd, Float_t *xm, Int_t iflag) = 0;
 
  653    virtual void Gdtom(Double_t *xd, Double_t *xm, Int_t iflag) = 0;
 
  656    virtual Double_t MaxStep() 
const = 0;
 
  659    virtual Int_t GetMaxNStep() 
const = 0;
 
  670    virtual void TrackPosition(TLorentzVector &position) 
const = 0;
 
  673    virtual void TrackPosition(Double_t &x, Double_t &y, Double_t &z) 
const = 0;
 
  676    virtual void TrackPosition(Float_t &x, Float_t &y, Float_t &z) 
const = 0;
 
  680    virtual void TrackMomentum(TLorentzVector &momentum) 
const = 0;
 
  684    virtual void TrackMomentum(Double_t &px, Double_t &py, Double_t &pz, Double_t &etot) 
const = 0;
 
  688    virtual void TrackMomentum(Float_t &px, Float_t &py, Float_t &pz, Float_t &etot) 
const = 0;
 
  691    virtual Double_t TrackStep() 
const = 0;
 
  694    virtual Double_t TrackLength() 
const = 0;
 
  697    virtual Double_t TrackTime() 
const = 0;
 
  700    virtual Double_t Edep() 
const = 0;
 
  703    virtual Double_t NIELEdep() 
const;
 
  706    virtual Int_t StepNumber() 
const;
 
  709    virtual Double_t TrackWeight() 
const;
 
  712    virtual void TrackPolarization(Double_t &polX, Double_t &polY, Double_t &polZ) 
const;
 
  715    virtual void TrackPolarization(TVector3 &pol) 
const;
 
  725    virtual Int_t TrackPid() 
const = 0;
 
  728    virtual Double_t TrackCharge() 
const = 0;
 
  731    virtual Double_t TrackMass() 
const = 0;
 
  734    virtual Double_t Etot() 
const = 0;
 
  742    virtual Bool_t IsNewTrack() 
const = 0;
 
  745    virtual Bool_t IsTrackInside() 
const = 0;
 
  748    virtual Bool_t IsTrackEntering() 
const = 0;
 
  751    virtual Bool_t IsTrackExiting() 
const = 0;
 
  754    virtual Bool_t IsTrackOut() 
const = 0;
 
  759    virtual Bool_t IsTrackDisappeared() 
const = 0;
 
  762    virtual Bool_t IsTrackStop() 
const = 0;
 
  766    virtual Bool_t IsTrackAlive() 
const = 0;
 
  774    virtual Int_t NSecondaries() 
const = 0;
 
  778    virtual void GetSecondary(Int_t isec, Int_t &particleId, TLorentzVector &position, TLorentzVector &momentum) = 0;
 
  782    virtual TMCProcess ProdProcess(Int_t isec) 
const = 0;
 
  786    virtual Int_t StepProcesses(TArrayI &proc) 
const = 0;
 
  789    virtual Bool_t SecondariesAreOrdered() 
const = 0;
 
  798    virtual void Init() = 0;
 
  801    virtual void BuildPhysics() = 0;
 
  804    virtual void ProcessEvent(Int_t eventId);
 
  807    virtual void ProcessEvent();
 
  811    virtual Bool_t ProcessRun(Int_t nevent) = 0;
 
  814    virtual void TerminateRun() {}
 
  817    virtual void InitLego() = 0;
 
  820    virtual void SetCollectTracks(Bool_t collectTracks) = 0;
 
  823    virtual Bool_t IsCollectTracks() 
const = 0;
 
  826    virtual Bool_t IsMT()
 const { 
return kFALSE; }
 
  835    virtual void SetStack(TVirtualMCStack *stack);
 
  838    virtual void SetExternalDecayer(TVirtualMCDecayer *decayer);
 
  841    virtual void SetRandom(TRandom *random);
 
  844    virtual void SetMagField(TVirtualMagField *field);
 
  853    TVirtualMCStack *GetStack()
 const { 
return fStack; }
 
  856    TMCManagerStack *GetManagerStack()
 const { 
return fManagerStack; }
 
  859    TVirtualMCDecayer *GetDecayer()
 const { 
return fDecayer; }
 
  862    TRandom *GetRandom()
 const { 
return fRandom; }
 
  865    TVirtualMagField *GetMagField()
 const { 
return fMagField; }
 
  868    Int_t GetId()
 const { 
return fId; }
 
  872    void SetId(UInt_t 
id);
 
  875    void SetManagerStack(TMCManagerStack *stack);
 
  882    virtual void ProcessEvent(Int_t eventId, Bool_t isInterruptible);
 
  886    virtual void InterruptTrack();
 
  889    TVirtualMC(
const TVirtualMC &mc);
 
  890    TVirtualMC &operator=(
const TVirtualMC &);
 
  893    TVirtualMCApplication *fApplication; 
 
  896 #if !defined(__CINT__) 
  897    static TMCThreadLocal TVirtualMC *fgMC; 
 
  899    static TVirtualMC *fgMC; 
 
  909    TVirtualMCStack *fStack;        
 
  910    TMCManagerStack *fManagerStack; 
 
  911    TVirtualMCDecayer *fDecayer;    
 
  913    TVirtualMagField *fMagField;    
 
  915    ClassDef(TVirtualMC, 1) 
 
  920 inline void TVirtualMC::SetSensitiveDetector(
const TString & , TVirtualMCSensitiveDetector * )
 
  926    Warning(
"SetSensitiveDetector(...)", 
"New function - not yet implemented.");
 
  929 inline TVirtualMCSensitiveDetector *TVirtualMC::GetSensitiveDetector(
const TString & )
 const 
  934    Warning(
"GetSensitiveDetector()", 
"New function - not yet implemented.");
 
  939 inline void TVirtualMC::SetExclusiveSDScoring(Bool_t )
 
  945    Warning(
"SetExclusiveSDScoring(...)", 
"New function - not yet implemented.");
 
  948 inline Double_t TVirtualMC::NIELEdep()
 const 
  952    Warning(
"NIELEdep()", 
"New function - not yet implemented.");
 
  957 #define gMC (TVirtualMC::GetMC()) 
  959 #endif // ROOT_TVirtualMC