Forum: Fields: Magnetic and Otherwise
 Hi Lukasz, Sorry for the long silence over the Holidays. I imagine you have solved your problem by now. Your observation is correct, you cannot use G4QuadrupoleMagField since this class returns the field for points in the global coordinate system. You need to write your own field class - or maybe we should fix G4QuadrupoleMagField - so it can be associated with a volume positioned and rotated anywhere in the "World". To do that you have to convert global coordinates to local coordinates in GetFieldValue and then convert the local field to the global field before you return it. Please, see examples/extended/field/field04/src/F04SimpleSolenoid.cc (addFieldValue). What you do is: G4ThreeVector global(y[0],y[1],y[2]); G4ThreeVector local = global2local.TransformPoint(global); B[0] = fGradient*local[1]; B[1] = fGradient*local[0]; B[2] = 0 ; G4ThreeVector field(B[0],B[1],B[2]); field = global2local.Inverse().TransformAxis(field); B[0] = field[0]; B[1] = field[1]; B[2] = field[2]; The G4AffineTransform global2local can be calculated once - in the constructor of your field, for example - by knowing where the center(x,y,z) of your quadrupole-field volume is in the world: ``` G4Navigator* theNavigator = G4TransportationManager::GetTransportationManager()-> GetNavigatorForTracking(); G4Navigator* aNavigator = new G4Navigator(); if ( theNavigator->GetWorldVolume() ) aNavigator->SetWorldVolume(theNavigator->GetWorldVolume());``` ``` G4ThreeVector center(x,y,z); aNavigator->LocateGlobalPointAndSetup(center,0,false);``` ``` G4TouchableHistoryHandle fTouchable = aNavigator-> CreateTouchableHistoryHandle();``` ``` // set global2local transform global2local = fTouchable->GetHistory()->GetTopTransform();``` See: Peter