// @(#)root/vmc:$Id$
// Authors: Alice collaboration 25/06/2002

/*************************************************************************
 * Copyright (C) 2006, Rene Brun and Fons Rademakers.                    *
 * Copyright (C) 2002, ALICE Experiment at CERN.                         *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TVirtualMCGeometry
#define ROOT_TVirtualMCGeometry

//
// Class TVirtualMCGeometry
// -------------------------
// Interface to Monte Carlo geometry construction
// (separated from VirtualMC)

#include "TNamed.h"

class TGeoHMatrix;
class TArrayD;
class TString;

class TVirtualMCGeometry : public TNamed {

public:
   // Standard constructor
   TVirtualMCGeometry(const char *name, const char *title);

   // Default constructor
   TVirtualMCGeometry();

   // Destructor
   virtual ~TVirtualMCGeometry();

   //
   // detector composition
   // ------------------------------------------------
   //

   // Define a material
   // kmat   number assigned to the material
   // name   material name
   // a      atomic mass in au
   // z      atomic number
   // dens   density in g/cm3
   // absl   absorption length in cm;
   //               if >=0 it is ignored and the program
   //               calculates it, if <0. -absl is taken
   // radl   radiation length in cm
   //               if >=0 it is ignored and the program
   //               calculates it, if <0. -radl is taken
   // buf    pointer to an array of user words
   // nwbuf  number of user words
   virtual void  Material(Int_t& kmat, const char* name, Double_t a,
                     Double_t z, Double_t dens, Double_t radl, Double_t absl,
                     Float_t* buf, Int_t nwbuf) = 0;

   // The same as previous but in double precision
   virtual void  Material(Int_t& kmat, const char* name, Double_t a,
                     Double_t z, Double_t dens, Double_t radl, Double_t absl,
                     Double_t* buf, Int_t nwbuf) = 0;

   // Define mixture or compound
   // with a number kmat composed by the basic nlmat materials defined
   // by arrays a, z and wmat
   //
   // If nlmat > 0 then wmat contains the proportion by
   // weights of each basic material in the mixture.
   //
   // If nlmat < 0 then wmat contains the number of atoms
   // of a given kind into the molecule of the compound.
   // In this case, wmat in output is changed to relative
   // weights.
   virtual void  Mixture(Int_t& kmat, const char *name, Float_t *a,
                     Float_t *z, Double_t dens, Int_t nlmat, Float_t *wmat) = 0;

   // The same as previous but in double precision
   virtual void  Mixture(Int_t& kmat, const char *name, Double_t *a,
                     Double_t *z, Double_t dens, Int_t nlmat, Double_t *wmat) = 0;

   // Define a medium.
   // kmed      tracking medium number assigned
   // name      tracking medium name
   // nmat      material number
   // isvol     sensitive volume flag
   // ifield    magnetic field:
   //                  - ifield = 0 if no magnetic field;
   //                  - ifield = -1 if user decision in guswim;
   //                  - ifield = 1 if tracking performed with g3rkuta;
   //                  - ifield = 2 if tracking
   // fieldm    max. field value (kilogauss)
   // tmaxfd    max. angle due to field (deg/step)
   // stemax    max. step allowed
   // deemax    max. fraction of energy lost in a step
   // epsil     tracking precision (cm)
   // stmin     min. step due to continuous processes (cm)
   // ubuf      pointer to an array of user words
   // nbuf      number of user words
   //  performed with g3helix; ifield = 3 if tracking performed with g3helx3.
   virtual void  Medium(Int_t& kmed, const char *name, Int_t nmat,
                     Int_t isvol, Int_t ifield, Double_t fieldm, Double_t tmaxfd,
                     Double_t stemax, Double_t deemax, Double_t epsil,
                     Double_t stmin, Float_t* ubuf, Int_t nbuf) = 0;

   // The same as previous but in double precision
   virtual void  Medium(Int_t& kmed, const char *name, Int_t nmat,
                     Int_t isvol, Int_t ifield, Double_t fieldm, Double_t tmaxfd,
                     Double_t stemax, Double_t deemax, Double_t epsil,
                     Double_t stmin, Double_t* ubuf, Int_t nbuf) = 0;

   // Define a rotation matrix
   // krot     rotation matrix number assigned
   // thetaX   polar angle for axis X
   // phiX     azimuthal angle for axis X
   // thetaY   polar angle for axis Y
   // phiY     azimuthal angle for axis Y
   // thetaZ   polar angle for axis Z
   // phiZ     azimuthal angle for axis Z
   virtual void  Matrix(Int_t& krot, Double_t thetaX, Double_t phiX,
                     Double_t thetaY, Double_t phiY, Double_t thetaZ,
                     Double_t phiZ) = 0;

   //
   // functions from GGEOM
   // ------------------------------------------------
   //

   // Create a new volume
   // name   Volume name
   // shape  Volume type
   // nmed   Tracking medium number
   // np     Number of shape parameters
   // upar   Vector containing shape parameters
   virtual Int_t  Gsvolu(const char *name, const char *shape, Int_t nmed,
                          Float_t *upar, Int_t np) = 0;

   // The same as previous but in double precision
   virtual Int_t  Gsvolu(const char *name, const char *shape, Int_t nmed,
                          Double_t *upar, Int_t np) = 0;

   // Create a new volume by dividing an existing one.
   // It divides a previously defined volume
   // name   Volume name
   // mother Mother volume name
   // ndiv   Number of divisions
   // iaxis  Axis value:
   //               X,Y,Z of CAXIS will be translated to 1,2,3 for IAXIS.
   virtual void  Gsdvn(const char *name, const char *mother, Int_t ndiv,
                         Int_t iaxis) = 0;

   // Create a new volume by dividing an existing one.
   // Divide mother into ndiv divisions called name
   // along axis iaxis starting at coordinate value c0i.
   // The new volume created will be medium number numed.
   virtual void  Gsdvn2(const char *name, const char *mother, Int_t ndiv,
                         Int_t iaxis, Double_t c0i, Int_t numed) = 0;

   // Create a new volume by dividing an existing one
   // Divide mother into divisions called name along
   // axis iaxis in steps of step. If not exactly divisible
   // will make as many as possible and will center them
   // with respect to the mother. Divisions will have medium
   // number numed. If numed is 0, numed of mother is taken.
   // ndvmx is the expected maximum number of divisions
   // (If 0, no protection tests are performed in Geant3)
   virtual void  Gsdvt(const char *name, const char *mother, Double_t step,
                         Int_t iaxis, Int_t numed, Int_t ndvmx) = 0;

   // Create a new volume by dividing an existing one
   // Divides mother into divisions called name along
   // axis iaxis starting at coordinate value c0 with step
   // size step.
   // The new volume created will have medium number numed.
   // If numed is 0, numed of mother is taken.
   // ndvmx is the expected maximum number of divisions
   // (If 0, no protection tests are performed in Geant3)
   virtual void  Gsdvt2(const char *name, const char *mother, Double_t step,
                         Int_t iaxis, Double_t c0, Int_t numed, Int_t ndvmx) = 0;

   // Flag volume name whose contents will have to be ordered
   // along axis iax, by setting the search flag to -iax
   // (Geant3 only)
   virtual void  Gsord(const char *name, Int_t iax) = 0;

   // Position a volume into an existing one.
   // It positions a previously defined volume in the mother.
   //   name   Volume name
   //   nr     Copy number of the volume
   //   mother Mother volume name
   //   x      X coord. of the volume in mother ref. sys.
   //   y      Y coord. of the volume in mother ref. sys.
   //   z      Z coord. of the volume in mother ref. sys.
   //   irot   Rotation matrix number w.r.t. mother ref. sys.
   //   konly  ONLY/MANY flag
   virtual void  Gspos(const char *name, Int_t nr, const char *mother,
                         Double_t x, Double_t y, Double_t z, Int_t irot,
                         const char *konly="ONLY") = 0;

   // Place a copy of generic volume name with user number
   //  nr inside mother, with its parameters upar(1..np)
   virtual void  Gsposp(const char *name, Int_t nr, const char *mother,
                         Double_t x, Double_t y, Double_t z, Int_t irot,
                         const char *konly, Float_t *upar, Int_t np) = 0;

   // The same as previous but in double precision
   virtual void  Gsposp(const char *name, Int_t nr, const char *mother,
                         Double_t x, Double_t y, Double_t z, Int_t irot,
                         const char *konly, Double_t *upar, Int_t np) = 0;

   // Helper function for resolving MANY.
   // Specify the ONLY volume that overlaps with the
   // specified MANY and has to be substracted.
   // (Geant4 only)
   virtual void  Gsbool(const char* onlyVolName, const char* manyVolName) = 0;

   //
   // functions for access to geometry
   // ------------------------------------------------
   //

   // Return the transformation matrix between the volume specified by
   // the path volumePath and the top or master volume.
   virtual Bool_t GetTransformation(const TString& volumePath,
                         TGeoHMatrix& matrix) = 0;

   // Return the name of the shape (shapeType)  and its parameters par
   // for the volume specified by the path volumePath .
   virtual Bool_t GetShape(const TString& volumePath,
                         TString& shapeType, TArrayD& par) = 0;

   // Return the material parameters for the volume specified by
   // the volumeName.
   virtual Bool_t GetMaterial(const TString& volumeName,
                               TString& name, Int_t& imat,
                               Double_t& a, Double_t& z, Double_t& density,
                               Double_t& radl, Double_t& inter, TArrayD& par) = 0;

   // Return the medium parameters for the volume specified by the
   // volumeName.
   virtual Bool_t GetMedium(const TString& volumeName,
                             TString& name, Int_t& imed,
                             Int_t& nmat, Int_t& isvol, Int_t& ifield,
                             Double_t& fieldm, Double_t& tmaxfd, Double_t& stemax,
                             Double_t& deemax, Double_t& epsil, Double_t& stmin,
                             TArrayD& par) = 0;

   // functions for drawing
   //virtual void  DrawOneSpec(const char* name) = 0;
   //virtual void  Gsatt(const char* name, const char* att, Int_t val) = 0;
   //virtual void  Gdraw(const char*,Double_t theta = 30, Double_t phi = 30,
   //                    Double_t psi = 0, Double_t u0 = 10, Double_t v0 = 10,
   //                    Double_t ul = 0.01, Double_t vl = 0.01) = 0;

   // Euclid
   // virtual void  WriteEuclid(const char*, const char*, Int_t, Int_t) = 0;

   //
   // get methods
   // ------------------------------------------------
   //


   // Return the unique numeric identifier for volume name volName
   virtual Int_t VolId(const char* volName) const = 0;

   // Return the volume name for a given volume identifier id
   virtual const char* VolName(Int_t id) const = 0;

   // Return the unique numeric identifier for medium name mediumName
   virtual Int_t MediumId(const char* mediumName) const = 0;

   // Return total number of volumes in the geometry
   virtual Int_t NofVolumes() const = 0;

   // Return number of daughters of the volume specified by volName
   virtual Int_t NofVolDaughters(const char* volName) const = 0;

   // Return the name of i-th daughter of the volume specified by volName
   virtual const char*  VolDaughterName(const char* volName, Int_t i) const = 0;

   // Return the copyNo of i-th daughter of the volume specified by volName
   virtual Int_t        VolDaughterCopyNo(const char* volName, Int_t i) const = 0;

   // Return material number for a given volume id
   virtual Int_t VolId2Mate(Int_t id) const = 0;

protected:
   TVirtualMCGeometry(const TVirtualMCGeometry& /*rhs*/);
   TVirtualMCGeometry & operator=(const TVirtualMCGeometry& /*rhs*/);

   ClassDef(TVirtualMCGeometry,1)  //Interface to Monte Carlo geometry construction
};

#endif //ROOT_TVirtualMCGeometry

 TVirtualMCGeometry.h:1
 TVirtualMCGeometry.h:2
 TVirtualMCGeometry.h:3
 TVirtualMCGeometry.h:4
 TVirtualMCGeometry.h:5
 TVirtualMCGeometry.h:6
 TVirtualMCGeometry.h:7
 TVirtualMCGeometry.h:8
 TVirtualMCGeometry.h:9
 TVirtualMCGeometry.h:10
 TVirtualMCGeometry.h:11
 TVirtualMCGeometry.h:12
 TVirtualMCGeometry.h:13
 TVirtualMCGeometry.h:14
 TVirtualMCGeometry.h:15
 TVirtualMCGeometry.h:16
 TVirtualMCGeometry.h:17
 TVirtualMCGeometry.h:18
 TVirtualMCGeometry.h:19
 TVirtualMCGeometry.h:20
 TVirtualMCGeometry.h:21
 TVirtualMCGeometry.h:22
 TVirtualMCGeometry.h:23
 TVirtualMCGeometry.h:24
 TVirtualMCGeometry.h:25
 TVirtualMCGeometry.h:26
 TVirtualMCGeometry.h:27
 TVirtualMCGeometry.h:28
 TVirtualMCGeometry.h:29
 TVirtualMCGeometry.h:30
 TVirtualMCGeometry.h:31
 TVirtualMCGeometry.h:32
 TVirtualMCGeometry.h:33
 TVirtualMCGeometry.h:34
 TVirtualMCGeometry.h:35
 TVirtualMCGeometry.h:36
 TVirtualMCGeometry.h:37
 TVirtualMCGeometry.h:38
 TVirtualMCGeometry.h:39
 TVirtualMCGeometry.h:40
 TVirtualMCGeometry.h:41
 TVirtualMCGeometry.h:42
 TVirtualMCGeometry.h:43
 TVirtualMCGeometry.h:44
 TVirtualMCGeometry.h:45
 TVirtualMCGeometry.h:46
 TVirtualMCGeometry.h:47
 TVirtualMCGeometry.h:48
 TVirtualMCGeometry.h:49
 TVirtualMCGeometry.h:50
 TVirtualMCGeometry.h:51
 TVirtualMCGeometry.h:52
 TVirtualMCGeometry.h:53
 TVirtualMCGeometry.h:54
 TVirtualMCGeometry.h:55
 TVirtualMCGeometry.h:56
 TVirtualMCGeometry.h:57
 TVirtualMCGeometry.h:58
 TVirtualMCGeometry.h:59
 TVirtualMCGeometry.h:60
 TVirtualMCGeometry.h:61
 TVirtualMCGeometry.h:62
 TVirtualMCGeometry.h:63
 TVirtualMCGeometry.h:64
 TVirtualMCGeometry.h:65
 TVirtualMCGeometry.h:66
 TVirtualMCGeometry.h:67
 TVirtualMCGeometry.h:68
 TVirtualMCGeometry.h:69
 TVirtualMCGeometry.h:70
 TVirtualMCGeometry.h:71
 TVirtualMCGeometry.h:72
 TVirtualMCGeometry.h:73
 TVirtualMCGeometry.h:74
 TVirtualMCGeometry.h:75
 TVirtualMCGeometry.h:76
 TVirtualMCGeometry.h:77
 TVirtualMCGeometry.h:78
 TVirtualMCGeometry.h:79
 TVirtualMCGeometry.h:80
 TVirtualMCGeometry.h:81
 TVirtualMCGeometry.h:82
 TVirtualMCGeometry.h:83
 TVirtualMCGeometry.h:84
 TVirtualMCGeometry.h:85
 TVirtualMCGeometry.h:86
 TVirtualMCGeometry.h:87
 TVirtualMCGeometry.h:88
 TVirtualMCGeometry.h:89
 TVirtualMCGeometry.h:90
 TVirtualMCGeometry.h:91
 TVirtualMCGeometry.h:92
 TVirtualMCGeometry.h:93
 TVirtualMCGeometry.h:94
 TVirtualMCGeometry.h:95
 TVirtualMCGeometry.h:96
 TVirtualMCGeometry.h:97
 TVirtualMCGeometry.h:98
 TVirtualMCGeometry.h:99
 TVirtualMCGeometry.h:100
 TVirtualMCGeometry.h:101
 TVirtualMCGeometry.h:102
 TVirtualMCGeometry.h:103
 TVirtualMCGeometry.h:104
 TVirtualMCGeometry.h:105
 TVirtualMCGeometry.h:106
 TVirtualMCGeometry.h:107
 TVirtualMCGeometry.h:108
 TVirtualMCGeometry.h:109
 TVirtualMCGeometry.h:110
 TVirtualMCGeometry.h:111
 TVirtualMCGeometry.h:112
 TVirtualMCGeometry.h:113
 TVirtualMCGeometry.h:114
 TVirtualMCGeometry.h:115
 TVirtualMCGeometry.h:116
 TVirtualMCGeometry.h:117
 TVirtualMCGeometry.h:118
 TVirtualMCGeometry.h:119
 TVirtualMCGeometry.h:120
 TVirtualMCGeometry.h:121
 TVirtualMCGeometry.h:122
 TVirtualMCGeometry.h:123
 TVirtualMCGeometry.h:124
 TVirtualMCGeometry.h:125
 TVirtualMCGeometry.h:126
 TVirtualMCGeometry.h:127
 TVirtualMCGeometry.h:128
 TVirtualMCGeometry.h:129
 TVirtualMCGeometry.h:130
 TVirtualMCGeometry.h:131
 TVirtualMCGeometry.h:132
 TVirtualMCGeometry.h:133
 TVirtualMCGeometry.h:134
 TVirtualMCGeometry.h:135
 TVirtualMCGeometry.h:136
 TVirtualMCGeometry.h:137
 TVirtualMCGeometry.h:138
 TVirtualMCGeometry.h:139
 TVirtualMCGeometry.h:140
 TVirtualMCGeometry.h:141
 TVirtualMCGeometry.h:142
 TVirtualMCGeometry.h:143
 TVirtualMCGeometry.h:144
 TVirtualMCGeometry.h:145
 TVirtualMCGeometry.h:146
 TVirtualMCGeometry.h:147
 TVirtualMCGeometry.h:148
 TVirtualMCGeometry.h:149
 TVirtualMCGeometry.h:150
 TVirtualMCGeometry.h:151
 TVirtualMCGeometry.h:152
 TVirtualMCGeometry.h:153
 TVirtualMCGeometry.h:154
 TVirtualMCGeometry.h:155
 TVirtualMCGeometry.h:156
 TVirtualMCGeometry.h:157
 TVirtualMCGeometry.h:158
 TVirtualMCGeometry.h:159
 TVirtualMCGeometry.h:160
 TVirtualMCGeometry.h:161
 TVirtualMCGeometry.h:162
 TVirtualMCGeometry.h:163
 TVirtualMCGeometry.h:164
 TVirtualMCGeometry.h:165
 TVirtualMCGeometry.h:166
 TVirtualMCGeometry.h:167
 TVirtualMCGeometry.h:168
 TVirtualMCGeometry.h:169
 TVirtualMCGeometry.h:170
 TVirtualMCGeometry.h:171
 TVirtualMCGeometry.h:172
 TVirtualMCGeometry.h:173
 TVirtualMCGeometry.h:174
 TVirtualMCGeometry.h:175
 TVirtualMCGeometry.h:176
 TVirtualMCGeometry.h:177
 TVirtualMCGeometry.h:178
 TVirtualMCGeometry.h:179
 TVirtualMCGeometry.h:180
 TVirtualMCGeometry.h:181
 TVirtualMCGeometry.h:182
 TVirtualMCGeometry.h:183
 TVirtualMCGeometry.h:184
 TVirtualMCGeometry.h:185
 TVirtualMCGeometry.h:186
 TVirtualMCGeometry.h:187
 TVirtualMCGeometry.h:188
 TVirtualMCGeometry.h:189
 TVirtualMCGeometry.h:190
 TVirtualMCGeometry.h:191
 TVirtualMCGeometry.h:192
 TVirtualMCGeometry.h:193
 TVirtualMCGeometry.h:194
 TVirtualMCGeometry.h:195
 TVirtualMCGeometry.h:196
 TVirtualMCGeometry.h:197
 TVirtualMCGeometry.h:198
 TVirtualMCGeometry.h:199
 TVirtualMCGeometry.h:200
 TVirtualMCGeometry.h:201
 TVirtualMCGeometry.h:202
 TVirtualMCGeometry.h:203
 TVirtualMCGeometry.h:204
 TVirtualMCGeometry.h:205
 TVirtualMCGeometry.h:206
 TVirtualMCGeometry.h:207
 TVirtualMCGeometry.h:208
 TVirtualMCGeometry.h:209
 TVirtualMCGeometry.h:210
 TVirtualMCGeometry.h:211
 TVirtualMCGeometry.h:212
 TVirtualMCGeometry.h:213
 TVirtualMCGeometry.h:214
 TVirtualMCGeometry.h:215
 TVirtualMCGeometry.h:216
 TVirtualMCGeometry.h:217
 TVirtualMCGeometry.h:218
 TVirtualMCGeometry.h:219
 TVirtualMCGeometry.h:220
 TVirtualMCGeometry.h:221
 TVirtualMCGeometry.h:222
 TVirtualMCGeometry.h:223
 TVirtualMCGeometry.h:224
 TVirtualMCGeometry.h:225
 TVirtualMCGeometry.h:226
 TVirtualMCGeometry.h:227
 TVirtualMCGeometry.h:228
 TVirtualMCGeometry.h:229
 TVirtualMCGeometry.h:230
 TVirtualMCGeometry.h:231
 TVirtualMCGeometry.h:232
 TVirtualMCGeometry.h:233
 TVirtualMCGeometry.h:234
 TVirtualMCGeometry.h:235
 TVirtualMCGeometry.h:236
 TVirtualMCGeometry.h:237
 TVirtualMCGeometry.h:238
 TVirtualMCGeometry.h:239
 TVirtualMCGeometry.h:240
 TVirtualMCGeometry.h:241
 TVirtualMCGeometry.h:242
 TVirtualMCGeometry.h:243
 TVirtualMCGeometry.h:244
 TVirtualMCGeometry.h:245
 TVirtualMCGeometry.h:246
 TVirtualMCGeometry.h:247
 TVirtualMCGeometry.h:248
 TVirtualMCGeometry.h:249
 TVirtualMCGeometry.h:250
 TVirtualMCGeometry.h:251
 TVirtualMCGeometry.h:252
 TVirtualMCGeometry.h:253
 TVirtualMCGeometry.h:254
 TVirtualMCGeometry.h:255
 TVirtualMCGeometry.h:256
 TVirtualMCGeometry.h:257
 TVirtualMCGeometry.h:258
 TVirtualMCGeometry.h:259
 TVirtualMCGeometry.h:260
 TVirtualMCGeometry.h:261
 TVirtualMCGeometry.h:262
 TVirtualMCGeometry.h:263
 TVirtualMCGeometry.h:264
 TVirtualMCGeometry.h:265
 TVirtualMCGeometry.h:266
 TVirtualMCGeometry.h:267
 TVirtualMCGeometry.h:268
 TVirtualMCGeometry.h:269
 TVirtualMCGeometry.h:270
 TVirtualMCGeometry.h:271
 TVirtualMCGeometry.h:272
 TVirtualMCGeometry.h:273
 TVirtualMCGeometry.h:274
 TVirtualMCGeometry.h:275
 TVirtualMCGeometry.h:276
 TVirtualMCGeometry.h:277
 TVirtualMCGeometry.h:278
 TVirtualMCGeometry.h:279
 TVirtualMCGeometry.h:280
 TVirtualMCGeometry.h:281
 TVirtualMCGeometry.h:282
 TVirtualMCGeometry.h:283
 TVirtualMCGeometry.h:284
 TVirtualMCGeometry.h:285
 TVirtualMCGeometry.h:286
 TVirtualMCGeometry.h:287
 TVirtualMCGeometry.h:288
 TVirtualMCGeometry.h:289
 TVirtualMCGeometry.h:290
 TVirtualMCGeometry.h:291
 TVirtualMCGeometry.h:292
 TVirtualMCGeometry.h:293
 TVirtualMCGeometry.h:294
 TVirtualMCGeometry.h:295
 TVirtualMCGeometry.h:296
 TVirtualMCGeometry.h:297
 TVirtualMCGeometry.h:298
 TVirtualMCGeometry.h:299
 TVirtualMCGeometry.h:300