ROOT logo
//*--Author A.Rustamov
//
//Input position vector,output field vector
//In the Sector coordinate system
//
//               |Y             
//               |
//        ***************
//         *     |     * 
//          *    |    *
//           *   |   *
//            *  |  *
//             * | *
//              ***
//               | 
//   -------------             
//   X
//

using namespace std;
#include <iostream>
#include <iomanip>
#include <fstream>
#include "hmdctrackgfield.h"
#include "TTimer.h"
#include "TBuffer.h"
#include <math.h>
#include <unistd.h>

ClassImp(HMdcTrackGField)

HMdcTrackGField::HMdcTrackGField(const Char_t* name, const Char_t* title) :
TNamed(name,title)
{
    dconv=0.0001;

    p_tzfl=new Double_t[708400]; //161*176*25
    p_tpfl=new Double_t[708400];
    p_trfl=new Double_t[708400];
    nfz=161;
    nfr=176;
    nfp=25;
    nfz_nfr=nfz*nfr;

    one_sixtyth=1.0/60.0;
    
//    printf("building acos table of size %d points...",ACOS_TABLE_SIZE);
    acos_table=new Double_t[ACOS_TABLE_SIZE*2+1];
    Double_t temp;
    Double_t t1,t2;
    t2=Double_t(ACOS_TABLE_SIZE);
    Double_t radd=57.29577951;
//fill negative arguments:
    for(Int_t i=0;i<ACOS_TABLE_SIZE;i++)
    {
	t1=Double_t(i-ACOS_TABLE_SIZE);
	temp=t1/t2;
	acos_table[i]=acos(temp)*radd;
    }

//fill zero argument:
    acos_table[ACOS_TABLE_SIZE]=acos(0.0)*radd;

//fill positive arguments:
    for(Int_t i=ACOS_TABLE_SIZE+1;i<(ACOS_TABLE_SIZE*2+1);i++)
    {
	t1=Double_t(i-ACOS_TABLE_SIZE);
	temp=t1/t2;
	acos_table[i]=acos(temp)*radd;
    }
//    printf("Ok\n");

}

HMdcTrackGField::~HMdcTrackGField()
{
    delete [] p_tzfl;
    delete [] p_trfl;
    delete [] p_tpfl;
    delete [] acos_table;
}
void HMdcTrackGField::clear()
{
}

void HMdcTrackGField::init(TString infile)
{
      ifstream input;   
      input.open(infile.Data(),ios::in);
      while(!input.eof())
    {

      input>>zflmin ;
      input>>zflmax ;
      input>>zfldel;
      input>>rflmin ;
      input>>rflmax ;
      input>>rfldel ;
      input>>pflmin ;
      input>>pflmax ;
      input>>pfldel ;
	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>>p_tzfl[i3+i2*nfz+i1*nfz*nfr];}
		for (Int_t i3 = 0;i3 < nfz; i3 ++){input>>p_trfl[i3+i2*nfz+i1*nfz*nfr];}
		for (Int_t i3 = 0;i3 < nfz; i3 ++){input>>p_tpfl[i3+i2*nfz+i1*nfz*nfr];}
	    }
	}
    }
    cout<<"READING FIELDMAP FINISHED!"<<endl;
    input.close();
    step1z=1.0/zfldel;
    step1r=1.0/rfldel;
    step1p=1.0/pfldel;
}	  
	  	  
void HMdcTrackGField::calcField(Double_t *xv,Double_t *btos,Double_t fpol )
{	
  Double_t xloc,yloc,zloc,rhog,phigd,phil,bz,br,bp;
  Double_t m1,m2,m3;
  Double_t dc,ds,a,b,c,ac,ab,bc,abc,w1,w2,w3,w4,w5,w6,w7,w8;
  Double_t spol;
  Double_t mult;
  Int_t ifz,ifr,ifp,ifr1,ifp1;
  Int_t i1,i2,i3,i4,i5,i6,i7,i8;
    
  zloc=xv[2]; 

  if(zloc<zflmin||zloc>zflmax) {
  btos[0]=0.; btos[1]=0.;btos[2]=0.;
//  printf("WARN!! z returned,xv=%f %f %f, zloc=%f \n",xv[0],xv[1],xv[2]);
  return;
  }
    xloc=xv[0];
    yloc=xv[1];    
    rhog=sqrt(xloc*xloc+yloc*yloc);
    if(rhog>rflmax){
	btos[0]=0.;
	btos[1]=0.;
	btos[2]=0.;
//	printf("WARN!!! r returned xv=%f %f %f rhog=%f\n",xv[0],xv[1],xv[2]);
	return;
      }
  if(rhog>0.01){
    dc=xloc/rhog;
    ds=yloc/rhog;
    phigd=acos_table[Int_t(dc*ACOS_TABLE_SIZE+ACOS_TABLE_SIZE)];

    }else{
      rhog=0.;
      phigd=0.;
      dc=0.;
      ds=0.;
//      printf("WARN!!!! rhog<=eps!!!\n");
    }
    
    phil=phigd-(Int_t)(phigd*one_sixtyth)*60.0;
//phil=phigd-60.0;    

      if(phil>30.0){
	spol=-1.0;
	phil=60.0-phil;
      }else {
        spol=1.0;
	}
    
            
    m1=(zloc-zflmin)*step1z;
    m2=(rhog-rflmin)*step1r;
    m3=(phil-pflmin)*step1p;

    ifz=(Int_t)(m1);
    ifr=(Int_t)(m2);
    ifp=(Int_t)(m3);

    a=m1-ifz;
    b=m2-ifr;
    c=m3-ifp;

    ifz++;
    ifr=(ifr+1)*nfz;
    ifp=(ifp+1)*nfz_nfr;
    ifr1=ifr-nfz;
    ifp1=ifp-nfz_nfr;

      ab=a*b;
      ac=a*c;
      bc=b*c;
      abc=a*bc;
      w1=1.0-a-b+ab-c+ac+bc-abc;
      w2=b-ab-bc+abc;
      w3=bc-abc;
      w4=c-ac-bc+abc;
      w5=a-ab-ac+abc;
      w6=ab-abc;
      w7=abc;
      w8=ac-abc;
      
    i1=ifz-1+ifr1+ifp1;
    i2=ifz-1+ifr+ifp1;
    i3=ifz-1+ifr+ifp;
    i4=ifz-1+ifr1+ifp;
    i5=ifz+ifr1+ifp1;
    i6=ifz+ifr+ifp1;
    i7=ifz+ifr+ifp;
    i8=ifz+ifr1+ifp;

       bz=w1*p_tzfl[i1]+w2*p_tzfl[i2]
      +w3*p_tzfl[i3]+w4*p_tzfl[i4]
     +w5*p_tzfl[i5]+w6*p_tzfl[i6]
    +w7*p_tzfl[i7]+w8*p_tzfl[i8];
							 
       br=w1*p_trfl[i1]+w2*p_trfl[i2]
      +w3*p_trfl[i3]+w4*p_trfl[i4]
     +w5*p_trfl[i5]+w6*p_trfl[i6]
    +w7*p_trfl[i7]+w8*p_trfl[i8];
							
           bp=w1*p_tpfl[i1]+w2*p_tpfl[i2]
      +w3*p_tpfl[i3]+w4*p_tpfl[i4]
     +w5*p_tpfl[i5]+w6*p_tpfl[i6]
    +w7*p_tpfl[i7]+w8*p_tpfl[i8];



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

      btos[0]=(dc*br-ds*bp);
      btos[1]=(ds*br+dc*bp);
      btos[2]=bz;	  
//      printf("xv=%f %f %f, btos=%f %f %f\n",xv[0],xv[1],xv[2],btos[0],btos[1],btos[2]);
} 
	  	  

void HMdcTrackGField::Streamer(TBuffer &R__b) {
  // Stream an object of class HMdcTrackGField.
  // The data in the 1-dimensional arrays are streamed into/from the old
  // 3-dimensional arrays (no change of class version)
  UInt_t R__s, R__c;
  if (R__b.IsReading()) {
    Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { }
    TNamed::Streamer(R__b);
    R__b >> nfz;
    R__b >> nfr;
    R__b >> nfp;
    R__b >> zflmin;
    R__b >> zflmax;
    R__b >> zfldel;
    R__b >> rflmin;
    R__b >> rflmax;
    R__b >> rfldel;
    R__b >> pflmin;
    R__b >> pflmax;
    R__b >> pfldel;
      
    Int_t n;
    R__b >> n;
    for (Int_t i3 = 0; i3 < nfz; i3 ++)
    for (Int_t i2 = 0; i2 < nfr; i2 ++)  
    for (Int_t i1 = 0; i1 < nfp; i1 ++) 
      R__b >> p_tzfl[i3+i2*nfz+i1*nfz*nfr];

    R__b >> n;
    for (Int_t i3 = 0; i3 < nfz; i3 ++)
    for (Int_t i2 = 0; i2 < nfr; i2 ++)  
    for (Int_t i1 = 0; i1 < nfp; i1 ++) 
      R__b >> p_trfl[i3+i2*nfz+i1*nfz*nfr];

    R__b >> n;
    for (Int_t i3 = 0; i3 < nfz; i3 ++)
    for (Int_t i2 = 0; i2 < nfr; i2 ++)  
    for (Int_t i1 = 0; i1 < nfp; i1 ++) 
      R__b >> p_tpfl[i3+i2*nfz+i1*nfz*nfr];

    step1z=1.0/zfldel;
    step1r=1.0/rfldel;
    step1p=1.0/pfldel;
      
    R__b.ReadStaticArray((Double_t*)Pvector);
    R__b.ReadStaticArray((Double_t*)Fvector);

    R__b.CheckByteCount(R__s, R__c, HMdcTrackGField::IsA());
      
  } else {
    R__c = R__b.WriteVersion(HMdcTrackGField::IsA(), kTRUE);
    TNamed::Streamer(R__b);
    R__b << nfz;
    R__b << nfr;
    R__b << nfp;
    R__b << zflmin;
    R__b << zflmax;
    R__b << zfldel;
    R__b << rflmin;
    R__b << rflmax;
    R__b << rfldel;
    R__b << pflmin;
    R__b << pflmax;
    R__b << pfldel;

    Int_t n=nfz*nfr*nfp;
    R__b << n;
    for (Int_t i3 = 0; i3 < nfz; i3 ++)
    for (Int_t i2 = 0; i2 < nfr; i2 ++)  
    for (Int_t i1 = 0; i1 < nfp; i1 ++) 
      R__b << p_tzfl[i3+i2*nfz+i1*nfz*nfr];

    R__b << n;
    for (Int_t i3 = 0; i3 < nfz; i3 ++)
    for (Int_t i2 = 0; i2 < nfr; i2 ++)  
    for (Int_t i1 = 0; i1 < nfp; i1 ++) 
      R__b << p_trfl[i3+i2*nfz+i1*nfz*nfr];

    R__b << n;
    for (Int_t i3 = 0; i3 < nfz; i3 ++)
    for (Int_t i2 = 0; i2 < nfr; i2 ++)  
    for (Int_t i1 = 0; i1 < nfp; i1 ++) 
      R__b << p_tpfl[i3+i2*nfz+i1*nfz*nfr];

    R__b.WriteArray(Pvector, 3);
    R__b.WriteArray(Fvector, 3);
    R__b.SetByteCount(R__c, kTRUE);
  }
}

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