#ifndef IGEOCOMETFIELD_H #define IGEOCOMETFIELD_H #include #include #include "IFieldManager.hxx" namespace COMET { class IGeoField : public TVirtualMagField { public: IGeoField(TGeoHMatrix *tolocal=0) { fGlobalField = COMET::IFieldManager::GetObject(); fLocal=tolocal; } void Field(const Double_t *xyzcm, Double_t *B) { const double* xyzin=xyzcm; Double_t vec[3]; if(fLocal){ fLocal->LocalToMaster(xyzcm,vec); xyzin=vec; } double field_vectors[6]={0,0,0}; double xyz[]={xyzin[0]*unit::cm,xyzin[1]*unit::cm,xyzin[2]*unit::cm}; fGlobalField->GetFieldValue(xyz,field_vectors); /// Field in kGauss for(int i=0;i<3;i++) B[i] = field_vectors[i]/unit::kilogauss; if (fLocal) { fLocal->MasterToLocalVect(B,vec); for(int i=0;i<3;i++) B[i]=vec[i]; } } protected: COMET::IFieldManager* fGlobalField; TGeoHMatrix* fLocal; }; } /// namespace COMET #endif