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