ROOT logo
//*-- AUTHOR : A. Rustamov

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////
// HField
// Reads Field map from TOSCA file.Calculates Field strength in a given
// space point in Lab coordinate system.
////////////////////////////////////////////////////////////////////////////
using namespace std;
#include <iostream>
#include <iomanip>
#include <fstream>
#include "hfield.h"
#include <math.h>
#include <cstdlib>

ClassImp(HField)

HField::HField(const Char_t* name,const Char_t* title)
    : TNamed(name,title)
{
    // constructor for HField
}
HField::~HField()
{
  // destructor of HField
}
void HField::initVariables()
{
    nfz=161;
    nfr=176;
    nfp=25;
    for (Int_t i1 = 0; i1 < nfp; i1 ++){
	for (Int_t i2 = 0; i2 < nfr; i2 ++){
	    for (Int_t i3 = 0;i3 < nfz; i3 ++){
		tzfl[i3][i2][i1]=0.;
		trfl[i3][i2][i1]=0.;
		tpfl[i3][i2][i1]=0.;
	    }
	}
    }
}
void HField::init(TString infile)
{
    // infile : tosca field map (for GEANT)

    Double_t a[9];
    ifstream input;

    if(infile.CompareTo("")!=0)
    {
	input.open(infile.Data(),ios::in);
	cout<<"READING FIELDMAP FROM: "<<infile.Data()<<endl;
    }
    else
    {
	Error("HField::init()","NO INPUTFILE DEFINED!");
	exit(1);
    }
    initVariables();
    while(!input.eof())
    {
	for(Int_t i = 0; i < 9; i ++) input>>a[i];
	zflmin = a[0];
	zflmax = a[1];
	zfldel = a[2];
	rflmin = a[3];
	rflmax = a[4];
	rfldel = a[5];
	pflmin = a[6];
	pflmax = a[7];
	pfldel = a[8];
	for (Int_t i1 = 0; i1 < nfp; i1 ++){
	    for (Int_t i2 = 0; i2 < nfr; i2 ++){
		for (Int_t i3 = 0;i3 < nfz; i3 ++){input>>tzfl[i3][i2][i1];}
		for (Int_t i3 = 0;i3 < nfz; i3 ++){input>>trfl[i3][i2][i1];}
		for (Int_t i3 = 0;i3 < nfz; i3 ++){input>>tpfl[i3][i2][i1];}
	    }
	}
    }
    cout<<"READING FIELDMAP FINISHED!"<<endl;
    input.close();
}
void HField::calcField(Double_t *xv,Double_t *btos,Int_t fpol )
{	
    // xv[3]  : position vector
    // btos[3]: Field vector
    // fpol   : Field polarity (1 default , -1 inverse)

    Double_t xloc,yloc,zloc,rhog,rho2g,phig,phigd,phil,bz,br,bp;
    Double_t delz,delr,delp,delz1,delr1,delp1,delz2,delr2,delp2;
    Double_t dc,ds,wz,wr,wp,wzi,wri,wpi,w1,w2,w3,w4,w5,w6,w7,w8;
    Double_t dsec,dhsec,eps,radd,twopi,spol,dconv;
    Int_t ifz,ifr,ifp;

    zloc=xv[2];

    if(zloc<zflmin||zloc>zflmax)
    {   // outside range of z
	btos[0]=0.;
	btos[1]=0.;
	btos[2]=0.;
    }
    else
    {   // inside range of z
	xloc=xv[0];
	yloc=xv[1];

	rho2g=xloc*xloc+yloc*yloc;
	rhog=sqrt(rho2g);

	if(rhog>rflmax)
	{   // outside range of r
	    btos[0]=0.;
	    btos[1]=0.;
	    btos[2]=0.;
	}
	else
	{   // inside range of r
	    eps   =0.01;
	    radd  =57.29577951;
	    twopi =6.283185308;
	    dsec  =60.;
	    dhsec =.5*dsec;
	    dconv =0.001;

	    if(rhog>eps)
	    {
		phig=atan2(yloc,xloc);
		if(phig<0.)phig+=twopi;
		phigd=radd*phig;
		dc=cos(phig);
		ds=sin(phig);
	    }
	    else
	    {
		rhog=0.;
		phig=0.;
		phigd=0.;
		dc=0.;
		ds=0.;
	    }

	    phil=phigd-(Int_t)(phigd/dsec)*dsec;

	    if(phil<=dhsec)spol=1.;
	    else
	    {
		spol=-1.;
		phil=dsec-phil;
	    }

	    delz=zloc-zflmin;
	    delr=rhog-rflmin;
	    delp=phil-pflmin;

	    delz2=delz-(Int_t)(delz/zfldel)*zfldel;
	    delr2=delr-(Int_t)(delr/rfldel)*rfldel;
	    delp2=delp-(Int_t)(delp/pfldel)*pfldel;
      
	    delz1=delz-delz2;
	    delr1=delr-delr2;
	    delp1=delp-delp2;

	    wzi=delz2/zfldel;
	    wri=delr2/rfldel;
	    wpi=delp2/pfldel;
	    wz=1.-wzi;
	    wr=1.-wri;
	    wp=1.-wpi;

	    ifz=(Int_t)((delz1+eps)/zfldel)+1;
	    ifr=(Int_t)((delr1+eps)/rfldel)+1;
	    ifp=(Int_t)((delp1+eps)/pfldel)+1;

	    w1=wz*wr*wp;
	    w2=wz*wri*wp;
	    w3=wz*wri*wpi;
	    w4=wz*wr*wpi;
	    w5=wzi*wr*wp;
	    w6=wzi*wri*wp;
	    w7=wzi*wri*wpi;
	    w8=wzi*wr*wpi;

	    bz=w1*tzfl[ifz-1][ifr-1][ifp-1]+w2*tzfl[ifz-1][ifr][ifp-1]
		+w3*tzfl[ifz-1][ifr][ifp]+w4*tzfl[ifz-1][ifr-1][ifp]
		+w5*tzfl[ifz][ifr-1][ifp-1]+w6*tzfl[ifz][ifr][ifp-1]
		+w7*tzfl[ifz][ifr][ifp]+w8*tzfl[ifz][ifr-1][ifp];

	    br=w1*trfl[ifz-1][ifr-1][ifp-1]+w2*trfl[ifz-1][ifr][ifp-1]
		+w3*trfl[ifz-1][ifr][ifp]+w4*trfl[ifz-1][ifr-1][ifp]
		+w5*trfl[ifz][ifr-1][ifp-1]+w6*trfl[ifz][ifr][ifp-1]
		+w7*trfl[ifz][ifr][ifp]+w8*trfl[ifz][ifr-1][ifp];

	    bp=w1*tpfl[ifz-1][ifr-1][ifp-1]+w2*tpfl[ifz-1][ifr][ifp-1]
		+w3*tpfl[ifz-1][ifr][ifp]+w4*tpfl[ifz-1][ifr-1][ifp]
		+w5*tpfl[ifz][ifr-1][ifp-1]+w6*tpfl[ifz][ifr][ifp-1]
		+w7*tpfl[ifz][ifr][ifp]+w8*tpfl[ifz][ifr-1][ifp];

	    bz=-bz*fpol*spol*dconv;
	    br=-br*fpol*spol*dconv;
	    bp=-bp*fpol*dconv;

	    btos[0]=dc*br-ds*bp;
	    btos[1]=ds*br+dc*bp;
	    btos[2]=bz;
	}
    }
}
 hfield.cc:1
 hfield.cc:2
 hfield.cc:3
 hfield.cc:4
 hfield.cc:5
 hfield.cc:6
 hfield.cc:7
 hfield.cc:8
 hfield.cc:9
 hfield.cc:10
 hfield.cc:11
 hfield.cc:12
 hfield.cc:13
 hfield.cc:14
 hfield.cc:15
 hfield.cc:16
 hfield.cc:17
 hfield.cc:18
 hfield.cc:19
 hfield.cc:20
 hfield.cc:21
 hfield.cc:22
 hfield.cc:23
 hfield.cc:24
 hfield.cc:25
 hfield.cc:26
 hfield.cc:27
 hfield.cc:28
 hfield.cc:29
 hfield.cc:30
 hfield.cc:31
 hfield.cc:32
 hfield.cc:33
 hfield.cc:34
 hfield.cc:35
 hfield.cc:36
 hfield.cc:37
 hfield.cc:38
 hfield.cc:39
 hfield.cc:40
 hfield.cc:41
 hfield.cc:42
 hfield.cc:43
 hfield.cc:44
 hfield.cc:45
 hfield.cc:46
 hfield.cc:47
 hfield.cc:48
 hfield.cc:49
 hfield.cc:50
 hfield.cc:51
 hfield.cc:52
 hfield.cc:53
 hfield.cc:54
 hfield.cc:55
 hfield.cc:56
 hfield.cc:57
 hfield.cc:58
 hfield.cc:59
 hfield.cc:60
 hfield.cc:61
 hfield.cc:62
 hfield.cc:63
 hfield.cc:64
 hfield.cc:65
 hfield.cc:66
 hfield.cc:67
 hfield.cc:68
 hfield.cc:69
 hfield.cc:70
 hfield.cc:71
 hfield.cc:72
 hfield.cc:73
 hfield.cc:74
 hfield.cc:75
 hfield.cc:76
 hfield.cc:77
 hfield.cc:78
 hfield.cc:79
 hfield.cc:80
 hfield.cc:81
 hfield.cc:82
 hfield.cc:83
 hfield.cc:84
 hfield.cc:85
 hfield.cc:86
 hfield.cc:87
 hfield.cc:88
 hfield.cc:89
 hfield.cc:90
 hfield.cc:91
 hfield.cc:92
 hfield.cc:93
 hfield.cc:94
 hfield.cc:95
 hfield.cc:96
 hfield.cc:97
 hfield.cc:98
 hfield.cc:99
 hfield.cc:100
 hfield.cc:101
 hfield.cc:102
 hfield.cc:103
 hfield.cc:104
 hfield.cc:105
 hfield.cc:106
 hfield.cc:107
 hfield.cc:108
 hfield.cc:109
 hfield.cc:110
 hfield.cc:111
 hfield.cc:112
 hfield.cc:113
 hfield.cc:114
 hfield.cc:115
 hfield.cc:116
 hfield.cc:117
 hfield.cc:118
 hfield.cc:119
 hfield.cc:120
 hfield.cc:121
 hfield.cc:122
 hfield.cc:123
 hfield.cc:124
 hfield.cc:125
 hfield.cc:126
 hfield.cc:127
 hfield.cc:128
 hfield.cc:129
 hfield.cc:130
 hfield.cc:131
 hfield.cc:132
 hfield.cc:133
 hfield.cc:134
 hfield.cc:135
 hfield.cc:136
 hfield.cc:137
 hfield.cc:138
 hfield.cc:139
 hfield.cc:140
 hfield.cc:141
 hfield.cc:142
 hfield.cc:143
 hfield.cc:144
 hfield.cc:145
 hfield.cc:146
 hfield.cc:147
 hfield.cc:148
 hfield.cc:149
 hfield.cc:150
 hfield.cc:151
 hfield.cc:152
 hfield.cc:153
 hfield.cc:154
 hfield.cc:155
 hfield.cc:156
 hfield.cc:157
 hfield.cc:158
 hfield.cc:159
 hfield.cc:160
 hfield.cc:161
 hfield.cc:162
 hfield.cc:163
 hfield.cc:164
 hfield.cc:165
 hfield.cc:166
 hfield.cc:167
 hfield.cc:168
 hfield.cc:169
 hfield.cc:170
 hfield.cc:171
 hfield.cc:172
 hfield.cc:173
 hfield.cc:174
 hfield.cc:175
 hfield.cc:176
 hfield.cc:177
 hfield.cc:178
 hfield.cc:179
 hfield.cc:180
 hfield.cc:181
 hfield.cc:182
 hfield.cc:183
 hfield.cc:184
 hfield.cc:185
 hfield.cc:186
 hfield.cc:187
 hfield.cc:188
 hfield.cc:189
 hfield.cc:190
 hfield.cc:191
 hfield.cc:192
 hfield.cc:193
 hfield.cc:194
 hfield.cc:195
 hfield.cc:196
 hfield.cc:197
 hfield.cc:198
 hfield.cc:199
 hfield.cc:200
 hfield.cc:201
 hfield.cc:202
 hfield.cc:203
 hfield.cc:204
 hfield.cc:205
 hfield.cc:206
 hfield.cc:207
 hfield.cc:208
 hfield.cc:209