// @(#)root/geom:$Id$

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TVirtualMagField
#define ROOT_TVirtualMagField

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TVirtualMagField - ABC for magnetic field. Derived classes must        //
// implement the method: Field(const Double_t *x, Double_t *B)            //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TVirtualMagField : public TNamed
{
public:
   TVirtualMagField()                 : TNamed() {}
   TVirtualMagField(const char *name) : TNamed(name,"") {}
   virtual ~TVirtualMagField();

   virtual void Field(const Double_t *x, Double_t *B) = 0;

   ClassDef(TVirtualMagField, 1)              // Abstract base field class
};


////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoUniformMagField - Uniform magnetic field class.                       //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoUniformMagField : public TVirtualMagField
{
private:
   Double_t                fB[3]; // Magnetic field vector

protected:
   TGeoUniformMagField(const TGeoUniformMagField&);
   TGeoUniformMagField& operator=(const TGeoUniformMagField&);

public:
   TGeoUniformMagField();
   TGeoUniformMagField(Double_t Bx, Double_t By, Double_t Bz);
   virtual ~TGeoUniformMagField() {}

   void            Field(const Double_t * /*x*/, Double_t *B) {B[0]=fB[0]; B[1]=fB[1]; B[2]=fB[2];}

   const Double_t *GetFieldValue() const { return &fB[0]; }
   void            SetFieldValue(Double_t Bx, Double_t By, Double_t Bz) {fB[0]=Bx; fB[1]=By; fB[2]=Bz;}

   ClassDef(TGeoUniformMagField, 1)  // Uniform magnetic field
};

#endif
 TVirtualMagField.h:1
 TVirtualMagField.h:2
 TVirtualMagField.h:3
 TVirtualMagField.h:4
 TVirtualMagField.h:5
 TVirtualMagField.h:6
 TVirtualMagField.h:7
 TVirtualMagField.h:8
 TVirtualMagField.h:9
 TVirtualMagField.h:10
 TVirtualMagField.h:11
 TVirtualMagField.h:12
 TVirtualMagField.h:13
 TVirtualMagField.h:14
 TVirtualMagField.h:15
 TVirtualMagField.h:16
 TVirtualMagField.h:17
 TVirtualMagField.h:18
 TVirtualMagField.h:19
 TVirtualMagField.h:20
 TVirtualMagField.h:21
 TVirtualMagField.h:22
 TVirtualMagField.h:23
 TVirtualMagField.h:24
 TVirtualMagField.h:25
 TVirtualMagField.h:26
 TVirtualMagField.h:27
 TVirtualMagField.h:28
 TVirtualMagField.h:29
 TVirtualMagField.h:30
 TVirtualMagField.h:31
 TVirtualMagField.h:32
 TVirtualMagField.h:33
 TVirtualMagField.h:34
 TVirtualMagField.h:35
 TVirtualMagField.h:36
 TVirtualMagField.h:37
 TVirtualMagField.h:38
 TVirtualMagField.h:39
 TVirtualMagField.h:40
 TVirtualMagField.h:41
 TVirtualMagField.h:42
 TVirtualMagField.h:43
 TVirtualMagField.h:44
 TVirtualMagField.h:45
 TVirtualMagField.h:46
 TVirtualMagField.h:47
 TVirtualMagField.h:48
 TVirtualMagField.h:49
 TVirtualMagField.h:50
 TVirtualMagField.h:51
 TVirtualMagField.h:52
 TVirtualMagField.h:53
 TVirtualMagField.h:54
 TVirtualMagField.h:55
 TVirtualMagField.h:56
 TVirtualMagField.h:57
 TVirtualMagField.h:58
 TVirtualMagField.h:59
 TVirtualMagField.h:60
 TVirtualMagField.h:61
 TVirtualMagField.h:62
 TVirtualMagField.h:63
 TVirtualMagField.h:64
 TVirtualMagField.h:65
 TVirtualMagField.h:66