Added method to initialize the alignment object starting from translations and angles...
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 23 Feb 2006 11:27:40 +0000 (11:27 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 23 Feb 2006 11:27:40 +0000 (11:27 +0000)
STEER/AliAlignObj.cxx
STEER/AliAlignObj.h

index 7b6d87e..12e6c58 100644 (file)
@@ -292,6 +292,49 @@ AliAlignObj::ELayerID AliAlignObj::VolUIDToLayer(UShort_t voluid)
 }
 
 //_____________________________________________________________________________
+Bool_t AliAlignObj::SetLocalPars(Double_t x, Double_t y, Double_t z,
+                                Double_t psi, Double_t theta, Double_t phi)
+{
+  // Set the translations and angles by using parameters
+  // defined in the local (in TGeo means) coordinate system
+  // of the alignable volume. In case that the TGeo was
+  // initialized, returns false and the object parameters are
+  // not set.
+  if (!gGeoManager || !gGeoManager->IsClosed()) {
+    AliError("Can't set the alignment object parameters! gGeoManager doesn't exist or it is still opened!");
+    return kFALSE;
+  }
+
+  const char* volpath = GetVolPath();
+  TGeoPhysicalNode* node = (TGeoPhysicalNode*) gGeoManager->MakePhysicalNode(volpath);
+  if (!node) {
+    AliError(Form("Volume path %s not valid!",volpath));
+    return kFALSE;
+  }
+  if (node->IsAligned())
+    AliWarning(Form("Volume %s has been already misaligned!",volpath));
+
+  TGeoHMatrix m;
+  Double_t tr[3];
+  tr[0]=x; tr[1]=y; tr[2]=z;
+  m.SetTranslation(tr);
+  Double_t angles[3] = {psi, theta, phi};
+  Double_t rot[9];
+  AnglesToMatrix(angles,rot);
+  m.SetRotation(rot);
+
+  TGeoHMatrix align,gprime,gprimeinv;
+  gprime = *node->GetMatrix();
+  gprimeinv = gprime.Inverse();
+  m.Multiply(&gprimeinv);
+  m.MultiplyLeft(&gprime);
+
+  SetMatrix(m);
+
+  return kTRUE;
+}
+
+//_____________________________________________________________________________
 Bool_t AliAlignObj::ApplyToGeometry()
 {
   // Apply the current alignment object
index 17db925..e37c5c1 100644 (file)
@@ -43,6 +43,8 @@ class AliAlignObj : public TObject {
   virtual Bool_t SetRotation(const TGeoMatrix& m) = 0;
   virtual void SetPars(Double_t x, Double_t y, Double_t z, Double_t psi,
                Double_t theta, Double_t phi) = 0;
+  virtual Bool_t SetLocalPars(Double_t x, Double_t y, Double_t z,
+                             Double_t psi, Double_t theta, Double_t phi);
   virtual void SetMatrix(const TGeoMatrix& m) = 0;
   void  SetVolPath(const TString& volpath) {fVolPath=volpath;}
   void  SetVolUID(UShort_t voluid) {fVolUID=voluid;}