ROOT logo
#ifndef ALIFMDGEOMETRYBUILDER_H
#define ALIFMDGEOMETRYBUILDER_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights
 * reserved. 
 *
 * Latest changes by Christian Holm Christensen <cholm@nbi.dk>
 *
 * See cxx source for full Copyright notice                               
 */
// Builder of FMD geometry. 
// This class takes care of actually building the geometry using the 
// TGeo classes.  Various parameters are fecthed from the
// AliFMDGeometry manager.  
/** @file    AliFMDGeometryBuilder.h
    @author  Christian Holm Christensen <cholm@nbi.dk>
    @date    Mon Mar 27 12:41:17 2006
    @brief   Class to build the FMD geometry 
*/
#ifndef ROOT_TTask
# include <TTask.h>
#endif
#ifndef ROOT_TArrayI
# include <TArrayI.h>
#endif
class TGeoVolume;
class TGeoMedium;
class TGeoShape;
class AliFMD;
class AliFMDRing;
class AliFMDDetector;
class AliFMD1;
class AliFMD2;
class AliFMD3;

//____________________________________________________________________
/** @class AliFMDGeometryBuilder 
    @brief Builder of FMD geometry. 
    This class takes care of actually building the geometry using the
    @b TGeo classes.  Various parameters are fecthed from the
    AliFMDGeometry manager. 
    @ingroup FMD_sim
 */
class AliFMDGeometryBuilder : public TTask
{
public:
  /** CTOR */
  AliFMDGeometryBuilder();
  /** CTOR 
      @param detailed Whether to make a detailed geometry. */
  AliFMDGeometryBuilder(Bool_t detailed);
  virtual ~AliFMDGeometryBuilder() {}
  /** Register */
  virtual void Exec(Option_t* option="");
  /** @param use Wheher to assemblies in the geometry definition */
  virtual void UseAssembly(Bool_t use=kTRUE) { fUseAssembly = use; }
  /** Whether to make a detailed geometry or not. 
      @param use If true, make a detailed geometry */
  virtual void SetDetailed(Bool_t use) { fDetailed = use; }
  /** @return Sector offset in volume tree  */
  Int_t GetSectorOff() const { return fSectorOff; }
    /** @return Module offset in volume tree */
  Int_t GetModuleOff() const { return fModuleOff; }
    /** @return Ring offset in the volume tree  */
  Int_t GetRingOff() const { return fRingOff; }
    /** @return Detector offfset in the volume tree  */
  Int_t GetDetectorOff() const { return fDetectorOff; }
protected:
  /** Copy CTOR */
  AliFMDGeometryBuilder(const AliFMDGeometryBuilder& o) 
    : TTask(o),
      fActiveId(o.fActiveId),
      fDetailed(o.fDetailed),
      fUseAssembly(o.fUseAssembly),
      fSectorOff(o.fSectorOff),
      fModuleOff(o.fModuleOff),
      fRingOff(o.fRingOff),
      fDetectorOff(o.fDetectorOff),
      fSi(o.fSi),
      fC(o.fC),
      fAl(o.fAl),
      fPCB(o.fPCB),
      fChip(o.fChip),
      fAir(o.fAir),
      fPlastic(o.fPlastic),
      fCopper(o.fCopper), 
      fSteel(o.fSteel)
  {}
  /** 
   * Assignment operator 
   *
   * @return Reference to this object
   */  
  AliFMDGeometryBuilder& operator=(const AliFMDGeometryBuilder&){return *this;}

  /** 
   * Make a polygonic extrusion shape based on verticies passed in @a
   * verticies 
   * 
   * @param verticies List of verticies
   * @param thick     Thickness
   * 
   * @return newly allocated polygonic extrusion shape
   */
  virtual TGeoShape* MakeXTRU(const TObjArray& verticies, Double_t thick) const;
  
  /** 
   * Make a ring volume 
   * 
   * @param r Ring geometry 
   *
   * @return  Ring volume 
   */
  virtual TGeoVolume* RingGeometry(const AliFMDRing* r);

  /** 
   * Make a honey comb shape from passed parameters.
   *
   * @param id       Detector identifier (1,2, or 3)
   * @param ring     Ring identifier ('I' or 'O')
   * @param r1       Inner radius
   * @param r2       Outer radius
   * @param w        width 
   * @param t        Thickness of material 
   * @param c        Clearing from horizontal. 
   *
   * @return Pointer to newly allocated composite shape. 
   */ 
  virtual TGeoShape* HoneycombShape(Int_t id, Char_t ring,
				    double r1, double r2, 
				    double w, double t, double c=0.3);
  /** 
   * Get the tension box volume
   * 
   * 
   * @return 
   */
  virtual TGeoVolume* TensionBox();
  /** 
   * Make a detector volume 
   *
   * @param d Detector geometry 
   * @param motherTop Mother volume (detector volume)
   * @param motherBot Mother volume (detector volume)
   * @param zmother Z position of mother 
   * @param innerTop Inner ring volume 
   * @param innerBot Inner ring volume 
   * @param outerTop Outer ring volume 
   * @param outerBot Outer ring volume 
   *
   * @return  Detector volume 
   */
  virtual TGeoVolume* DetectorGeometry(const AliFMDDetector* d, 
				       TGeoVolume* motherTop, 
				       TGeoVolume* motherBot, 
				       Double_t    zmother, 
				       TGeoVolume* innerTop, 
				       TGeoVolume* innerBot, 
				       TGeoVolume* outerTop=0,
				       TGeoVolume* outerBot=0);
  /** 
   * Make FMD1 volume 
   *
   * @param d Detector geometry 
   * @param innerTop Inner ring volume 
   * @param innerBot Inner ring volume 
   * @return FMD1 volume  
   */
  virtual TGeoVolume* FMD1Geometry(const AliFMD1* d, 
				   TGeoVolume* innerTop,
				   TGeoVolume* innerBot);
  /** 
   * Make FMD2 volume 
   *
   * @param d Detector geometry 
   * @param innerTop Inner ring volume 
   * @param innerBot Inner ring volume 
   * @param outerTop Outer ring volume 
   * @param outerBot Outer ring volume 
   *
   * @return FMD2 volume  
   */
  virtual TGeoVolume* FMD2Geometry(const AliFMD2* d, 
				   TGeoVolume* innerTop, 
				   TGeoVolume* innerBot, 
				   TGeoVolume* outerTop,
				   TGeoVolume* outerBot);
  /**
   * Make FMD3 volume 
   *
   * @param d Detector geometry 
   * @param innerTop Inner ring volume 
   * @param innerBot Inner ring volume 
   * @param outerTop Outer ring volume 
   * @param outerBot Outer ring volume 
   *
   * @return FMD3 volume  
   */
  virtual TGeoVolume* FMD3Geometry(const AliFMD3* d, 
				   TGeoVolume* innerTop, 
				   TGeoVolume* innerBot, 
				   TGeoVolume* outerTop,
				   TGeoVolume* outerBot);


  TArrayI     fActiveId;      //! Active volume ID's
  Bool_t      fDetailed;      // Whether to make a detailed simulation 
  Bool_t      fUseAssembly;   // Assembly volumes
  Int_t       fSectorOff;     // Sector offset in volume tree 
  Int_t       fModuleOff;     // Module offset in volume tree
  Int_t       fRingOff;       // Ring offset in the volume tree 
  Int_t       fDetectorOff;   // Detector offfset in the volume tree 

  TGeoMedium* fSi;	 //! Si Medium
  TGeoMedium* fC;	 //! C Medium
  TGeoMedium* fAl;	 //! Al Medium
  TGeoMedium* fPCB;	 //! PCB Medium
  TGeoMedium* fChip;	 //! Chip Medium
  TGeoMedium* fAir;	 //! Air Medium
  TGeoMedium* fPlastic;	 //! Plastic Medium
  TGeoMedium* fCopper;	 //! Copper Medium
  TGeoMedium* fSteel;	 //! Steel Medium

  static const Char_t* fgkActiveName;	// Name of Active volumes
  static const Char_t* fgkSectorName;	// Name of Sector volumes
  static const Char_t* fgkStripName;	// Name of Strip volumes
  static const Char_t* fgkSensorName;	// Name of Sensor volumes
  static const Char_t* fgkPCBName;	// Name of PCB volumes
  static const Char_t* fgkCuName;	// Name of copper volumes
  static const Char_t* fgkChipName;	// Name of chip volumes
  static const Char_t* fgkLongLegName;	// Name of LongLeg volumes
  static const Char_t* fgkShortLegName;	// Name of ShortLeg volumes
  static const Char_t* fgkFrontVName;	// Name of Front volumes
  static const Char_t* fgkBackVName;	// Name of Back volumes
  static const Char_t* fgkRingTopName;	// Name of Top ring volumes
  static const Char_t* fgkRingBotName;	// Name of Bottom ring volumes
  static const Char_t* fgkHCName;	// Name of Honeycomb volumes
  static const Char_t* fgkIHCName;	// Name of Inner honeycomb volumes
  static const Char_t* fgkNoseName;	// Name of Nose volumes
  static const Char_t* fgkBackName;	// Name of Back volumes
  static const Char_t* fgkTopName;	// Name of Back volumes
  static const Char_t* fgkBeamName;	// Name of Beam volumes
  static const Char_t* fgkFlangeName;	// Name of Flange volumes
  static const Char_t* fgkFMDDCuName;   // Name of FMDD copper volumes
  static const Char_t* fgkFMDDPCBName;  // Name of FMDD PCB volumes 
  static const Char_t* fgkFMDDChipName; // Name of FMDD chip volumes
  static const Char_t* fgkFMDDName; 	// Name of FMDD volumes
  static const Char_t* fgkFMDName;	// Name of Half FMD volumes

  ClassDef(AliFMDGeometryBuilder,1)
};

#endif
//____________________________________________________________________
//
// Local Variables:
//   mode: C++
// End:
//
// EOF
//

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