LCOV - code coverage report
Current view: top level - MUON/MUONgeometry - AliMUONSurveyUtil.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 428 0.2 %
Date: 2016-06-14 17:26:59 Functions: 1 23 4.3 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             :  *                                                                        *
       4             :  * Author: The ALICE Off-line Project.                                    *
       5             :  * Contributors are mentioned in the code where appropriate.              *
       6             :  *                                                                        *
       7             :  * Permission to use, copy, modify and distribute this software and its   *
       8             :  * documentation strictly for non-commercial purposes is hereby granted   *
       9             :  * without fee, provided that the above copyright notice appears in all   *
      10             :  * copies and that both the copyright notice and this permission notice   *
      11             :  * appear in the supporting documentation. The authors make no claims     *
      12             :  * about the suitability of this software for any purpose. It is          *
      13             :  * provided "as is" without express or implied warranty.                  *
      14             :  **************************************************************************/
      15             : 
      16             : //-----------------------------------------------------------------------------
      17             : /// \class AliMUONSurveyUtil
      18             : /// Singleton utility class for the survey processing of the ALICE DiMuon spectrometer 
      19             : /// 
      20             : /// This class contains various functions to calculate misalignement parameters
      21             : /// from survey data and designed positions of survey targets.
      22             : /// Macro also includes a method to get the new AliMUONGeometryTranformer.
      23             : /// 
      24             : /// \author Javier Castillo
      25             : //-----------------------------------------------------------------------------
      26             : 
      27             : #include <TClonesArray.h>
      28             : #include <TMath.h>
      29             : #include <TMatrixDSym.h>
      30             : #include <TString.h>
      31             : 
      32             : #include "AliAlignObjMatrix.h"
      33             : 
      34             : #include "AliMUONSurveyUtil.h"
      35             : #include "AliMUONGeometryTransformer.h"
      36             : #include "AliMUONGeometryModuleTransformer.h"
      37             : #include "AliMUONGeometryDetElement.h"
      38             : #include "AliMUONGeometryBuilder.h"
      39             : #include "AliMpExMap.h"
      40             : #include "AliMpExMapIterator.h"
      41             : 
      42             : /// \cond CLASSIMP
      43          18 : ClassImp(AliMUONSurveyUtil)
      44             : /// \endcond
      45             : 
      46             : int AliMUONSurveyUtil::fgNDetElemCh[10] = {4,4,4,4,18,18,26,26,26,26};
      47             : AliMUONSurveyUtil* AliMUONSurveyUtil::fgInstance(0x0);
      48             : 
      49           0 : AliMUONSurveyUtil::~AliMUONSurveyUtil(){
      50           0 :   printf("WHAT AM I DOING HERE????????????????\n");
      51           0 :   fgInstance = 0x0;
      52           0 : }
      53             : 
      54             : AliMUONSurveyUtil* AliMUONSurveyUtil::Instance() {
      55             :   ///  Return its instance 
      56           0 :   if (!fgInstance) 
      57           0 :     fgInstance = new AliMUONSurveyUtil();
      58             :   
      59           0 :   return fgInstance;
      60           0 : }
      61             : 
      62             : Bool_t AliMUONSurveyUtil::MatrixToAngles(const Double_t *rot, Double_t *angles)
      63             : {
      64             :   /// Calculates the Euler angles in "x y z" notation
      65             :   /// using the rotation matrix
      66             :   /// Returns false in case the rotation angles can not be
      67             : 
      68             :   // extracted from the matrix
      69             :   //
      70           0 :   if(TMath::Abs(rot[0])<1e-7 || TMath::Abs(rot[8])<1e-7) {
      71           0 :     printf("Failed to extract roll-pitch-yall angles!");
      72           0 :     return kFALSE;
      73             :   }
      74             :   //   Double_t raddeg = TMath::RadToDeg();
      75           0 :   angles[0]=TMath::ATan2(-rot[5],rot[8]);
      76           0 :   angles[1]=TMath::ASin(rot[2]);
      77           0 :   angles[2]=TMath::ATan2(-rot[1],rot[0]);
      78           0 :   return kTRUE;
      79           0 : }
      80             : 
      81             : void AliMUONSurveyUtil::AnglesToMatrix(const Double_t *angles, Double_t *rot)
      82             : {
      83             :   /// Calculates the rotation matrix using the 
      84             :   /// Euler angles in "x y z" notation
      85             :   ///
      86             :   //  Double_t degrad = TMath::DegToRad();
      87             :   Double_t degrad = 1.;
      88           0 :   Double_t sinpsi = TMath::Sin(degrad*angles[0]);
      89           0 :   Double_t cospsi = TMath::Cos(degrad*angles[0]);
      90           0 :   Double_t sinthe = TMath::Sin(degrad*angles[1]);
      91           0 :   Double_t costhe = TMath::Cos(degrad*angles[1]);
      92           0 :   Double_t sinphi = TMath::Sin(degrad*angles[2]);
      93           0 :   Double_t cosphi = TMath::Cos(degrad*angles[2]);
      94             : 
      95           0 :   rot[0] =  costhe*cosphi;
      96           0 :   rot[1] = -costhe*sinphi;
      97           0 :   rot[2] =  sinthe;
      98           0 :   rot[3] =  sinpsi*sinthe*cosphi + cospsi*sinphi;
      99           0 :   rot[4] = -sinpsi*sinthe*sinphi + cospsi*cosphi;
     100           0 :   rot[5] = -costhe*sinpsi;
     101           0 :   rot[6] = -cospsi*sinthe*cosphi + sinpsi*sinphi;
     102           0 :   rot[7] =  cospsi*sinthe*sinphi + sinpsi*cosphi;
     103           0 :   rot[8] =  costhe*cospsi;
     104           0 : }
     105             : 
     106             : Double_t AliMUONSurveyUtil::XpCenter(const Double_t *x, const Double_t *par) const{
     107             :   /// Returns center x position using x coord. of 2 button targets. + solution. 
     108           0 :   Double_t lCos2Tht = TMath::Cos(2*par[6]);
     109           0 :   Double_t lSinTht = TMath::Sin(par[6]);
     110             : 
     111           0 :   Double_t inSqrt = TMath::Abs((par[0] - par[3])*(par[0] - par[3]) 
     112           0 :                                -2*(x[0] -x[1])*(x[0] -x[1]) 
     113           0 :                                +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
     114           0 :                                +((par[0] - par[3])*(par[0] - par[3]) 
     115           0 :                                  +(par[1] - par[4])*(par[1] - par[4]) 
     116           0 :                                  +(par[2] - par[5])*(par[2] - par[5]))*lCos2Tht 
     117           0 :                                +4*(x[0] - x[1])*(par[2] - par[5])*lSinTht);
     118             : 
     119           0 :   if (inSqrt<0) return inSqrt*1e10;
     120             : 
     121           0 :   Double_t xD = ((2*(par[0]*par[0]*x[1] 
     122           0 :                      -par[0]*par[3]*(x[0] + x[1]) 
     123           0 :                      +x[1]*par[1]*(par[1] - par[4]) 
     124           0 :                      +x[0]*(par[3]*par[3] - par[1]*par[4] + par[4]*par[4])) 
     125           0 :                   -2*(par[3]*par[3]*par[2] 
     126           0 :                       +par[0]*par[0]*par[5] 
     127           0 :                       -par[0]*par[3]*(par[2] + par[5]) 
     128           0 :                       +(par[1] - par[4])*(-par[4]*par[2] +par[1]*par[5]))*lSinTht 
     129           0 :                   +TMath::Sqrt(2)*(-par[3]*par[1] + par[0]*par[4])
     130           0 :                   *TMath::Sqrt(inSqrt))
     131           0 :                  /(2*((par[0] - par[3])*(par[0] - par[3]) + (par[1] - par[4])*(par[1] - par[4]))));
     132             : 
     133             :   return xD;
     134           0 : }
     135             : 
     136             : Double_t AliMUONSurveyUtil::XnCenter(const Double_t *x, const Double_t *par) const{
     137             :   /// Returns center x position using x coord. of 2 button targets. - solution. 
     138           0 :   Double_t lCos2Tht = TMath::Cos(2*par[6]);
     139           0 :   Double_t lSinTht = TMath::Sin(par[6]);
     140             : 
     141           0 :   Double_t inSqrt = TMath::Abs((par[0] - par[3])*(par[0] - par[3]) 
     142           0 :                                -2*(x[0] - x[1])*(x[0] - x[1]) 
     143           0 :                                +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
     144           0 :                                +((par[0] - par[3])*(par[0] - par[3]) 
     145           0 :                                  +(par[1] - par[4])*(par[1] - par[4]) 
     146           0 :                                  +(par[2] - par[5])*(par[2] - par[5]))*lCos2Tht
     147           0 :                                +4*(x[0] - x[1])*(par[2] - par[5])*lSinTht);
     148             : 
     149           0 :   if (inSqrt<0) return inSqrt*1e10;
     150             : 
     151           0 :   Double_t xD = ((2*(par[0]*par[0]*x[1] 
     152           0 :                      -par[0]*par[3]*(x[0] + x[1]) 
     153           0 :                      +x[1]*par[1]*(par[1] - par[4]) 
     154           0 :                      +x[0]*(par[3]*par[3] - par[1]*par[4] + par[4]*par[4])) 
     155           0 :                   -2*(par[3]*par[3]*par[2] + par[0]*par[0]*par[5] 
     156           0 :                       -par[0]*par[3]*(par[2] + par[5]) 
     157           0 :                       +(par[1] - par[4])*(-par[4]*par[2] + par[1]*par[5]))*lSinTht 
     158           0 :                   +TMath::Sqrt(2)*(par[3]*par[1] - par[0]*par[4])
     159           0 :                   *TMath::Sqrt(inSqrt))
     160           0 :                  /(2*((par[0] - par[3])*(par[0] - par[3]) + (par[1] - par[4])*(par[1] - par[4]))));
     161             : 
     162             :   return xD;
     163           0 : }
     164             : 
     165             : Double_t AliMUONSurveyUtil::PhiXpn(const Double_t *x, const Double_t *par) const{
     166             :   /// Returns phi rot. using x coord. of 2 button targets. +- solution. 
     167           0 :   Double_t inSqrt = TMath::Abs(((par[0] - par[3])*(par[0] - par[3]) 
     168           0 :                                 -2*(x[0] - x[1])*(x[0] - x[1]) 
     169           0 :                                 +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
     170           0 :                                 +(+(par[0] - par[3])*(par[0] - par[3]) 
     171           0 :                                   +(par[1] - par[4])*(par[1] - par[4]) 
     172           0 :                                   +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6]) 
     173           0 :                                 +4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6])));
     174             : 
     175           0 :   if (inSqrt<0) return inSqrt*1e10;
     176             :   
     177           0 :   Double_t phix = ((+2*(par[0] - par[3])*(x[0] - x[1]) 
     178           0 :                     -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6]) 
     179           0 :                     +TMath::Sqrt(2)*(par[1] - par[4])
     180           0 :                     *TMath::Sqrt(inSqrt))
     181           0 :                    /(2*(+(par[0] - par[3])*(par[0] - par[3]) 
     182           0 :                         +(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));
     183             : 
     184           0 :   phix = -TMath::ACos(phix);
     185             : 
     186             :   return phix;
     187           0 : }
     188             : 
     189             : Double_t AliMUONSurveyUtil::PhiXpp(const Double_t *x, const Double_t *par) const{
     190             :   /// Returns phi rot. using x coord. of 2 button targets. ++ solution. 
     191           0 :   Double_t inSqrt = TMath::Abs(+(par[0] - par[3])*(par[0] - par[3]) 
     192           0 :                                -2*(x[0] - x[1])*(x[0] - x[1]) 
     193           0 :                                +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
     194           0 :                                +(+(par[0] - par[3])*(par[0] - par[3]) 
     195           0 :                                  +(par[1] - par[4])*(par[1] - par[4]) 
     196           0 :                                  +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6]) 
     197           0 :                                +4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6]));
     198             : 
     199           0 :   if (inSqrt<0) return inSqrt*1e10;
     200             : 
     201           0 :   Double_t phix = ((+2*(par[0] - par[3])*(x[0] - x[1]) 
     202           0 :                     -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6]) 
     203           0 :                     +TMath::Sqrt(2)*(par[1] - par[4])
     204           0 :                     *TMath::Sqrt(inSqrt))
     205           0 :                    /(2*(+(par[0] - par[3])*(par[0] - par[3]) 
     206           0 :                         +(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));
     207             : 
     208           0 :   phix = TMath::ACos(phix);
     209             : 
     210             :   return phix;
     211           0 : }
     212             : 
     213             : Double_t AliMUONSurveyUtil::PhiXnn(const Double_t *x, const Double_t *par) const{
     214             :   /// Returns phi rot. using x coord. of 2 button targets. -- solution. 
     215           0 :   Double_t inSqrt = TMath::Abs(+(par[0] - par[3])*(par[0] - par[3]) 
     216           0 :                                -2*(x[0] - x[1])*(x[0] - x[1]) 
     217           0 :                                +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
     218           0 :                                +(+(par[0] - par[3])*(par[0] - par[3]) 
     219           0 :                                  +(par[1] - par[4])*(par[1] - par[4]) 
     220           0 :                                  +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6]) 
     221           0 :                                + 4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6]));
     222             : 
     223           0 :   if (inSqrt<0) return inSqrt*1e10;
     224             :   
     225           0 :   Double_t phix = (+(+2*(par[0] - par[3])*(x[0] - x[1]) 
     226           0 :                      -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6]) 
     227           0 :                      +TMath::Sqrt(2)*(-par[1] + par[4])
     228           0 :                      *TMath::Sqrt(inSqrt))
     229           0 :                    /(2*(+(par[0] - par[3])*(par[0] - par[3]) 
     230           0 :                         +(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));
     231             : 
     232           0 :   phix = -TMath::ACos(phix);
     233             : 
     234             :   return phix;
     235           0 : }
     236             : 
     237             : Double_t AliMUONSurveyUtil::PhiXnp(const Double_t *x, const Double_t *par) const{
     238             :   /// Returns phi rot. using x coord. of 2 button targets. +- solution. 
     239           0 :   Double_t inSqrt = TMath::Abs(+(par[0] - par[3])*(par[0] - par[3]) 
     240           0 :                                -2*(x[0] - x[1])*(x[0] - x[1]) 
     241           0 :                                +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
     242           0 :                                +(+(par[0] - par[3])*(par[0] - par[3]) 
     243           0 :                                  +(par[1] - par[4])*(par[1] - par[4]) 
     244           0 :                                  +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6]) 
     245           0 :                                +4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6]));
     246             : 
     247           0 :   if (inSqrt<0) return inSqrt*1e10;
     248             : 
     249           0 :   Double_t phix = (+(+2*(par[0] - par[3])*(x[0] - x[1]) 
     250           0 :                      -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6]) 
     251           0 :                      +TMath::Sqrt(2)*(-par[1] + par[4])
     252           0 :                      *TMath::Sqrt(inSqrt))
     253           0 :                    /(2*(+(par[0] - par[3])*(par[0] - par[3]) 
     254           0 :                         +(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));
     255             : 
     256           0 :   phix = TMath::ACos(phix);
     257             : 
     258             :   return phix;
     259           0 : }
     260             : 
     261             : Double_t AliMUONSurveyUtil::YpCenter(const Double_t *x, const Double_t *par) const{
     262             :   /// Returns center y position using y coord. of 2 button targets. + solution. 
     263             : 
     264             :   // par : x1l, y1l, z1l, x2l, y2l, z2, lpsi, tht,
     265           0 :   Double_t lCosPsi = TMath::Cos(par[6]);
     266           0 :   Double_t lSinPsi = TMath::Sin(par[6]);
     267           0 :   Double_t lCosTht = TMath::Cos(par[7]);
     268           0 :   Double_t lSinTht = TMath::Sin(par[7]);
     269             : 
     270           0 :   Double_t yD = ((1./((par[0] - par[3])*(par[0] - par[3]) + (par[1] - par[4])*(par[1] - par[4])))
     271           0 :                  *(+par[3]*par[3]*x[0] 
     272           0 :                    +par[0]*par[0]*x[1] 
     273           0 :                    -par[0]*par[3]*(x[0] + x[1]) 
     274           0 :                    +(par[1] - par[4])*(-x[0]*par[4] + par[1]*x[1]) 
     275           0 :                    +(par[3]*par[3]*par[2] 
     276           0 :                      +par[0]*par[0]*par[5] 
     277           0 :                      -par[0]*par[3]*(par[2] + par[5]) 
     278           0 :                      +(par[1] - par[4])*(-par[4]*par[2] + par[1]*par[5]))*lCosTht*lSinPsi 
     279           0 :                    +(-par[3]*par[1] + par[0]*par[4])
     280           0 :                    *TMath::Sqrt(-(x[0] - x[1] 
     281           0 :                                   +(par[2] - par[5])*lCosTht*lSinPsi)
     282           0 :                                 *(x[0] - x[1] 
     283             :                                   +(par[2] - par[5])*lCosTht*lSinPsi) 
     284           0 :                                 + ((par[0] - par[3])*(par[0] - par[3]) 
     285           0 :                                    +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
     286           0 :                                                                           +lSinPsi*lSinPsi*lSinTht*lSinTht))));
     287             : 
     288           0 :   return yD;  
     289             : }
     290             : 
     291             : Double_t AliMUONSurveyUtil::PhiYpn(const Double_t *x, const Double_t *par) const{
     292             :   /// Returns phi rot. using y coord. of 2 button targets. +- solution. 
     293             : 
     294           0 :   Double_t lCosPsi = TMath::Cos(par[6]);
     295           0 :   Double_t lSinPsi = TMath::Sin(par[6]);
     296           0 :   Double_t lCosTht = TMath::Cos(par[7]);
     297           0 :   Double_t lSinTht = TMath::Sin(par[7]);
     298             : 
     299           0 :   Double_t phiy = ((lCosPsi*((par[1] - par[4])*(x[0] - x[1]) 
     300           0 :                              +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi 
     301           0 :                              +(-par[0] + par[3])
     302           0 :                              *TMath::Sqrt(-(x[0] - x[1] 
     303           0 :                                             +(par[2] - par[5])*lCosTht*lSinPsi)
     304           0 :                                           *(x[0] - x[1] 
     305             :                                             +(par[2] - par[5])*lCosTht*lSinPsi) 
     306           0 :                                           +(+(par[0] - par[3])*(par[0] - par[3]) 
     307           0 :                                             +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi
     308           0 :                                                                                    +lSinPsi*lSinPsi*lSinTht*lSinTht))) 
     309           0 :                     +lSinPsi*lSinTht*((par[0] - par[3])*(x[0] - x[1]) 
     310           0 :                                       +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi 
     311           0 :                                       +(par[1] - par[4])
     312           0 :                                       *TMath::Sqrt(-(x[0] - x[1] 
     313           0 :                                                      +(par[2] - par[5])*lCosTht*lSinPsi)
     314           0 :                                                    *(x[0] - x[1] 
     315             :                                                      +(par[2] - par[5])*lCosTht*lSinPsi) 
     316           0 :                                                    + ((par[0] - par[3])*(par[0] - par[3]) 
     317           0 :                                                       +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
     318             :                                                                                              +lSinPsi*lSinPsi*lSinTht*lSinTht))))
     319           0 :                    /((+(par[0] - par[3])*(par[0] - par[3]) 
     320           0 :                       +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
     321             :                                                              +lSinPsi*lSinPsi*lSinTht*lSinTht)));
     322             :   
     323           0 :   phiy = -TMath::ACos(phiy);
     324             : 
     325             : 
     326           0 :   return phiy;
     327             : }
     328             : 
     329             : Double_t AliMUONSurveyUtil::PhiYpp(const Double_t *x, const Double_t *par) const{
     330             :   /// Returns phi rot. using y coord. of 2 button targets. ++ solution. 
     331             : 
     332           0 :   Double_t lCosPsi = TMath::Cos(par[6]);
     333           0 :   Double_t lSinPsi = TMath::Sin(par[6]);
     334           0 :   Double_t lCosTht = TMath::Cos(par[7]);
     335           0 :   Double_t lSinTht = TMath::Sin(par[7]);
     336             : 
     337           0 :   Double_t phiy = ((lCosPsi*((par[1] - par[4])*(x[0] - x[1]) 
     338           0 :                              +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi 
     339           0 :                              +(-par[0] + par[3])
     340           0 :                              *TMath::Sqrt(-(x[0] - x[1] 
     341           0 :                                             +(par[2] - par[5])*lCosTht*lSinPsi)
     342           0 :                                           *(x[0] - x[1] 
     343             :                                             +(par[2] - par[5])*lCosTht*lSinPsi) 
     344           0 :                                           +((par[0] - par[3])*(par[0] - par[3]) 
     345           0 :                                             +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
     346           0 :                                                                                    +lSinPsi*lSinPsi*lSinTht*lSinTht))) 
     347           0 :                     +lSinPsi*lSinTht*((par[0] - par[3])*(x[0] - x[1]) 
     348           0 :                                       +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi 
     349           0 :                                       +(par[1] - par[4])*TMath::Sqrt(-(x[0] - x[1] 
     350           0 :                                                                        +(par[2] - par[5])*lCosTht*lSinPsi)
     351           0 :                                                                      *(x[0] - x[1] 
     352             :                                                                        +(par[2] - par[5])*lCosTht*lSinPsi) 
     353           0 :                                                                      +((par[0] - par[3])*(par[0] - par[3])
     354           0 :                                                                        +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
     355             :                                                                                                               +lSinPsi*lSinPsi*lSinTht*lSinTht))))
     356           0 :                    /(((par[0] - par[3])*(par[0] - par[3]) 
     357           0 :                       +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
     358             :                                                              +lSinPsi*lSinPsi*lSinTht*lSinTht)));
     359             :   
     360           0 :   phiy = TMath::ACos(phiy);
     361             : 
     362           0 :   return phiy;
     363             : }
     364             :  
     365             : Double_t AliMUONSurveyUtil::YnCenter(const Double_t *x, const Double_t *par) const{
     366             :   /// Returns center y position using y coord. of 2 button targets. - solution. 
     367           0 :   Double_t lCosPsi = TMath::Cos(par[6]);
     368           0 :   Double_t lSinPsi = TMath::Sin(par[6]);
     369           0 :   Double_t lCosTht = TMath::Cos(par[7]);
     370           0 :   Double_t lSinTht = TMath::Sin(par[7]);
     371             : 
     372           0 :   Double_t yD = ((1./(+(par[0] - par[3])*(par[0] - par[3]) 
     373           0 :                       +(par[1] - par[4])*(par[1] - par[4])))
     374           0 :                  *(+par[3]*par[3]*x[0] 
     375           0 :                    +par[0]*par[0]*x[1] 
     376           0 :                    -par[0]*par[3]*(x[0] + x[1]) 
     377           0 :                    +(par[1] - par[4])*(-x[0]*par[4] + par[1]*x[1]) 
     378           0 :                    +(+par[3]*par[3]*par[2] 
     379           0 :                      +par[0]*par[0]*par[5] 
     380           0 :                      -par[0]*par[3]*(par[2] + par[5]) 
     381           0 :                      +(par[1] - par[4])*(-par[4]*par[2] + par[1]*par[5]))*lCosTht*lSinPsi 
     382           0 :                    +(par[3]*par[1] - par[0]*par[4])
     383           0 :                    *TMath::Sqrt(-(+x[0] - x[1] 
     384           0 :                                   +(par[2] - par[5])*lCosTht*lSinPsi)
     385           0 :                                 *(x[0] - x[1] 
     386             :                                   +(par[2] - par[5])*lCosTht*lSinPsi) 
     387           0 :                                 +((par[0] - par[3])*(par[0] - par[3]) 
     388           0 :                                   +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
     389           0 :                                                                          +lSinPsi*lSinPsi*lSinTht*lSinTht))));
     390             :   
     391           0 :   return yD;  
     392             : }
     393             :  
     394             : 
     395             : Double_t AliMUONSurveyUtil::PhiYnn(const Double_t *x, const Double_t *par) const{
     396             :   /// Returns phi rot. using y coord. of 2 button targets. -- solution. 
     397             : 
     398           0 :   Double_t lCosPsi = TMath::Cos(par[6]);
     399           0 :   Double_t lSinPsi = TMath::Sin(par[6]);
     400           0 :   Double_t lCosTht = TMath::Cos(par[7]);
     401           0 :   Double_t lSinTht = TMath::Sin(par[7]);
     402             : 
     403           0 :   Double_t phiy = ((lCosPsi*(+(par[1] - par[4])*(x[0] - x[1]) 
     404           0 :                              +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi 
     405           0 :                              +(par[0] - par[3])
     406           0 :                              *TMath::Sqrt(-(x[0] - x[1] 
     407           0 :                                             +(par[2] - par[5])*lCosTht*lSinPsi)
     408           0 :                                           *(x[0] - x[1] 
     409             :                                             +(par[2] - par[5])*lCosTht*lSinPsi) 
     410           0 :                                           +(+(par[0] - par[3])*(par[0] - par[3]) 
     411           0 :                                             +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
     412           0 :                                                                                    +lSinPsi*lSinPsi*lSinTht*lSinTht))) 
     413           0 :                     +lSinPsi*lSinTht*(+(par[0] - par[3])*(x[0] - x[1]) 
     414           0 :                                       +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi 
     415           0 :                                       +(-par[1] + par[4])
     416           0 :                                       *TMath::Sqrt(-(x[0] - x[1] 
     417           0 :                                                      +(par[2] - par[5])*lCosTht*lSinPsi)
     418           0 :                                                    *(x[0] - x[1] 
     419             :                                                      +(par[2] - par[5])*lCosTht*lSinPsi) 
     420           0 :                                                    +(+(par[0] - par[3])*(par[0] - par[3]) 
     421           0 :                                                      +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
     422             :                                                                                             +lSinPsi*lSinPsi*lSinTht*lSinTht))))
     423           0 :                    /((+(par[0] - par[3])*(par[0] - par[3]) 
     424           0 :                       +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
     425             :                                                              +lSinPsi*lSinPsi*lSinTht*lSinTht)));
     426             :   
     427           0 :   phiy = -TMath::ACos(phiy);
     428             :   
     429           0 :   return phiy;
     430             : }
     431             : 
     432             : 
     433             : Double_t AliMUONSurveyUtil::PhiYnp(const Double_t *x, const Double_t *par) const{
     434             :   /// Returns phi rot. using y coord. of 2 button targets. -+ solution. 
     435             : 
     436           0 :   Double_t lCosPsi = TMath::Cos(par[6]);
     437           0 :   Double_t lSinPsi = TMath::Sin(par[6]);
     438           0 :   Double_t lCosTht = TMath::Cos(par[7]);
     439           0 :   Double_t lSinTht = TMath::Sin(par[7]);
     440             : 
     441           0 :   Double_t phiy = ((lCosPsi*(+(par[1] - par[4])*(x[0] - x[1]) 
     442           0 :                              +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi 
     443           0 :                              +(par[0] - par[3])
     444           0 :                              *TMath::Sqrt(-(x[0] - x[1] 
     445           0 :                                             +(par[2] - par[5])*lCosTht*lSinPsi)
     446           0 :                                           *(x[0] - x[1] 
     447             :                                             +(par[2] - par[5])*lCosTht*lSinPsi) 
     448           0 :                                           +((par[0] - par[3])*(par[0] - par[3]) 
     449           0 :                                             +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
     450           0 :                                                                                    +lSinPsi*lSinPsi*lSinTht*lSinTht))) 
     451           0 :                     +lSinPsi*lSinTht*(+(par[0] - par[3])*(x[0] - x[1]) 
     452           0 :                                       +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi 
     453           0 :                                       +(-par[1] + par[4])
     454           0 :                                       *TMath::Sqrt(-(x[0] - x[1] 
     455           0 :                                                      +(par[2] - par[5])*lCosTht*lSinPsi)
     456           0 :                                                    *(x[0] - x[1] 
     457             :                                                      +(par[2] - par[5])*lCosTht*lSinPsi) 
     458           0 :                                                    +((par[0] - par[3])*(par[0] - par[3]) 
     459           0 :                                                      +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
     460             :                                                                                             +lSinPsi*lSinPsi*lSinTht*lSinTht))))
     461           0 :                    /((+(par[0] - par[3])*(par[0] - par[3])
     462           0 :                       +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
     463             :                                                              +lSinPsi*lSinPsi*lSinTht*lSinTht)));
     464             :   
     465           0 :   phiy = TMath::ACos(phiy);
     466             :   
     467           0 :   return phiy;
     468             : }
     469             : 
     470             : Double_t AliMUONSurveyUtil::ZnCenter(const Double_t *x, const Double_t *par) const{
     471             :   /// Returns center z position using z coord. of 2 button targets. - solution. 
     472             : 
     473             :   // par :  x1l, y1l, z1l, x2l, y2l, z2l, psi, tht
     474           0 :   Double_t lCosPsi = TMath::Cos(par[6]);
     475           0 :   Double_t lSinPsi = TMath::Sin(par[6]);
     476           0 :   Double_t lCosTht = TMath::Cos(par[7]);
     477           0 :   Double_t lSinTht = TMath::Sin(par[7]);
     478             : 
     479           0 :   Double_t inSqrt = ((par[3]*par[1] - par[0]*par[4])*(par[3]*par[1] - par[0]*par[4])
     480           0 :                      *((-(x[0] - x[1])*(x[0] - x[1]))
     481           0 :                        +(((par[0] - par[3])*(par[0] - par[3])
     482           0 :                           +(par[1] - par[4])*(par[1] - par[4])))*lSinPsi*lSinPsi
     483           0 :                        +lCosPsi*((-(par[2] - par[5]))
     484           0 :                                  *lCosTht*(-2*x[0]+2*x[1]
     485           0 :                                            +(par[2] - par[5])*lCosPsi*lCosTht)
     486           0 :                                  +((par[0] - par[3])*(par[0] - par[3])
     487           0 :                                    +(par[1] - par[4])*(par[1] - par[4]))*lCosPsi*lSinTht*lSinTht)));
     488             : 
     489           0 :   if (inSqrt<0) return inSqrt*1e10;
     490             : 
     491           0 :   Double_t zD = ((1./((par[0] - par[3])*(par[0] - par[3]) 
     492             :                       +(par[1] - par[4])*(par[1] - par[4])))
     493           0 :                  *(-par[1]*par[4]*x[0] 
     494           0 :                    +par[4]*par[4]*x[0] 
     495           0 :                    +par[0]*par[0]*x[1] 
     496           0 :                    +par[1]*par[1]*x[1] 
     497           0 :                    -par[1]*par[4]*x[1] 
     498           0 :                    -par[0]*par[3]*(x[0] + x[1]) 
     499           0 :                    +par[3]*par[3]*x[0]
     500           0 :                    +(+par[1]*par[4]*par[2] 
     501           0 :                      -par[4]*par[4]*par[2] 
     502           0 :                      -par[0]*par[0]*par[5] 
     503           0 :                      -par[1]*par[1]*par[5] 
     504           0 :                      +par[1]*par[4]*par[5] 
     505           0 :                      +par[0]*par[3]*(par[2] + par[5])
     506           0 :                      -par[3]*par[3]*par[2])*lCosPsi*lCosTht
     507           0 :                    -TMath::Sqrt(inSqrt)));
     508             :   
     509             :   return zD;
     510           0 : }
     511             : 
     512             : Double_t AliMUONSurveyUtil::ZpCenter(const Double_t *x, const Double_t *par) const{
     513             :   /// Returns center z position using z coord. of 2 button targets. + solution. 
     514             : 
     515             :   // par :  x1l, y1l, z1l, x2l, y2l, z2l, psi, tht
     516           0 :   Double_t lCosPsi = TMath::Cos(par[6]);
     517           0 :   Double_t lSinPsi = TMath::Sin(par[6]);
     518           0 :   Double_t lCosTht = TMath::Cos(par[7]);
     519           0 :   Double_t lSinTht = TMath::Sin(par[7]);
     520             : 
     521           0 :   Double_t inSqrt = ((par[3]*par[1] - par[0]*par[4])*(par[3]*par[1] - par[0]*par[4])
     522           0 :                      *((-(x[0] - x[1])*(x[0] - x[1]))
     523           0 :                        +(((par[0] - par[3])*(par[0] - par[3])
     524           0 :                           +(par[1] - par[4])*(par[1] - par[4])))*lSinPsi*lSinPsi
     525           0 :                        +lCosPsi*((-(par[2] - par[5]))
     526           0 :                                  *lCosTht*(-2*x[0]+2*x[1]
     527           0 :                                            +(par[2] - par[5])*lCosPsi*lCosTht)
     528           0 :                                  +((par[0] - par[3])*(par[0] - par[3])
     529           0 :                                    +(par[1] - par[4])*(par[1] - par[4]))*lCosPsi*lSinTht*lSinTht)));
     530             : 
     531           0 :   if (inSqrt<0) return inSqrt*1e10;  
     532             : 
     533           0 :   Double_t zD = ((1./((par[0] - par[3])*(par[0] - par[3]) 
     534             :                       +(par[1] - par[4])*(par[1] - par[4])))
     535           0 :                  *(-par[1]*par[4]*x[0] 
     536           0 :                    +par[4]*par[4]*x[0] 
     537           0 :                    +par[0]*par[0]*x[1] 
     538           0 :                    +par[1]*par[1]*x[1] 
     539           0 :                    -par[1]*par[4]*x[1] 
     540           0 :                    -par[0]*par[3]*(x[0] + x[1]) 
     541           0 :                    +par[3]*par[3]*x[0]
     542           0 :                    +(+par[1]*par[4]*par[2] 
     543           0 :                      -par[4]*par[4]*par[2] 
     544           0 :                      -par[0]*par[0]*par[5] 
     545           0 :                      -par[1]*par[1]*par[5] 
     546           0 :                      +par[1]*par[4]*par[5] 
     547           0 :                      +par[0]*par[3]*(par[2] + par[5])
     548           0 :                      -par[3]*par[3]*par[2])*lCosPsi*lCosTht
     549           0 :                    +TMath::Sqrt(inSqrt)));
     550             : 
     551             :   return zD;
     552           0 : }
     553             : 
     554             : //______________________________________________________________________
     555             : AliMUONGeometryTransformer* AliMUONSurveyUtil::ReAlign(const AliMUONGeometryTransformer * transformer, 
     556             :                                                        int rMod, int rNDetElems, int rDetElemPseudoIdToDetElem[], TGeoCombiTrans deltaDetElemTransf[], Bool_t verbose)
     557             : {
     558             :   /////////////////////////////////////////////////////////////////////
     559             :   ///   Takes the internal geometry module transformers, copies them
     560             :   /// and gets the Detection Elements from them.
     561             :   /// Takes misalignment parameters and applies these
     562             :   /// to the local transform of the Detection Element
     563             :   /// Obtains the global transform by multiplying the module transformer
     564             :   /// transformation with the local transformation 
     565             :   /// Applies the global transform to a new detection element
     566             :   /// Adds the new detection element to a new module transformer
     567             :   /// Adds the new module transformer to a new geometry transformer
     568             :   /// Returns the new geometry transformer
     569             : 
     570             :   Int_t iDetElemId = 0;
     571             :   Int_t iDetElemPseudoId = 0;
     572             : 
     573             :   AliMUONGeometryTransformer *newGeometryTransformer =
     574           0 :     new AliMUONGeometryTransformer();
     575           0 :   for (Int_t iMt = 0; iMt < transformer->GetNofModuleTransformers(); iMt++) {
     576             :     // module transformers    
     577             :     const AliMUONGeometryModuleTransformer *kModuleTransformer =
     578           0 :       transformer->GetModuleTransformer(iMt, true);
     579             :       
     580             :     AliMUONGeometryModuleTransformer *newModuleTransformer =
     581           0 :       new AliMUONGeometryModuleTransformer(iMt);
     582           0 :     newGeometryTransformer->AddModuleTransformer(newModuleTransformer);
     583             :     
     584           0 :     TGeoCombiTrans moduleTransform =
     585           0 :       TGeoCombiTrans(*kModuleTransformer->GetTransformation());
     586             :     // New module transformation
     587             :     TGeoCombiTrans *newModuleTransform;
     588           0 :     if ((rMod<4 && iMt==rMod) || (rMod>=4 && (iMt==4+(rMod-4)*2||iMt==4+(rMod-4)*2+1))) {
     589           0 :       newModuleTransform = new TGeoCombiTrans(moduleTransform*deltaDetElemTransf[rNDetElems]);
     590           0 :     } else {
     591           0 :       newModuleTransform = new TGeoCombiTrans(moduleTransform);
     592             :     }
     593           0 :     newModuleTransformer->SetTransformation(*newModuleTransform);
     594             :     
     595             :     // For the selected chamber add misalign module
     596           0 :     if ((rMod<4 && iMt==rMod) || (rMod>=4 && (iMt==4+(rMod-4)*2||iMt==4+(rMod-4)*2+1))) {
     597             :       // Get delta transformation: 
     598             :       // Tdelta = Tnew * Told.inverse
     599           0 :       TGeoHMatrix deltaModuleTransform = 
     600           0 :         AliMUONGeometryBuilder::Multiply(*newModuleTransform, 
     601           0 :                                          kModuleTransformer->GetTransformation()->Inverse());    
     602             :       // Create module mis alignment matrix
     603           0 :       newGeometryTransformer
     604           0 :         ->AddMisAlignModule(kModuleTransformer->GetModuleId(), deltaModuleTransform);
     605           0 :     }
     606             :     
     607           0 :     AliMpExMap *detElements = kModuleTransformer->GetDetElementStore();
     608             :     
     609           0 :     if (verbose)
     610           0 :       printf("%i DEs in old GeometryStore  %i\n",detElements->GetSize(), iMt);
     611             :     TGeoCombiTrans *deltaLocalTransform;
     612           0 :     TIter next(detElements->CreateIterator());
     613             :     AliMUONGeometryDetElement *detElement;
     614           0 :     while ((detElement = static_cast<AliMUONGeometryDetElement*>(next()))){
     615             :       /// make a new detection element
     616             :       AliMUONGeometryDetElement *newDetElement =
     617           0 :         new AliMUONGeometryDetElement(detElement->GetId(),
     618           0 :                                       detElement->GetVolumePath());
     619           0 :       TString lDetElemName(detElement->GetDEName());
     620           0 :       lDetElemName.ReplaceAll("DE","");
     621           0 :       iDetElemId = lDetElemName.Atoi();
     622           0 :       iDetElemPseudoId = iDetElemId%100;
     623           0 :       if ((rMod<4 && iMt==rMod) || (rMod>=4 && (iMt==4+(rMod-4)*2||iMt==4+(rMod-4)*2+1))) {
     624           0 :         deltaLocalTransform = new TGeoCombiTrans(deltaDetElemTransf[rDetElemPseudoIdToDetElem[iDetElemPseudoId]]);       
     625           0 :       } else {
     626           0 :         deltaLocalTransform = new TGeoCombiTrans(*gGeoIdentity);
     627             :       }
     628             :       
     629             :       // local transformation of this detection element.
     630           0 :       TGeoCombiTrans localTransform
     631           0 :         = TGeoCombiTrans(*detElement->GetLocalTransformation());
     632             :       //      TGeoHMatrix newLocalMatrix = localTransform * (*deltaLocalTransform);
     633           0 :       TGeoCombiTrans newLocalTransform 
     634           0 :         = TGeoCombiTrans(localTransform * (*deltaLocalTransform));
     635           0 :       newDetElement->SetLocalTransformation(newLocalTransform);        
     636             :       // global transformation
     637           0 :       TGeoHMatrix newGlobalTransform =
     638           0 :         AliMUONGeometryBuilder::Multiply(*newModuleTransform,
     639             :                                          newLocalTransform);
     640           0 :       newDetElement->SetGlobalTransformation(newGlobalTransform);
     641             :       
     642             :       // add this det element to module
     643           0 :       newModuleTransformer->GetDetElementStore()->Add(newDetElement->GetId(),
     644           0 :                                                       newDetElement);
     645             :       
     646             :       // In the Alice Alignment Framework misalignment objects store
     647             :       // global delta transformation
     648             :       // Get detection "intermediate" global transformation
     649           0 :       TGeoHMatrix newOldGlobalTransform = (*newModuleTransform) * localTransform;
     650             :       // Get detection element global delta transformation: 
     651             :       // Tdelta = Tnew * Told.inverse
     652           0 :       TGeoHMatrix  deltaGlobalTransform
     653           0 :         = AliMUONGeometryBuilder::Multiply(newGlobalTransform, 
     654           0 :                                            newOldGlobalTransform.Inverse());
     655             :       
     656             :       // Create mis alignment matrix
     657           0 :       newGeometryTransformer
     658           0 :         ->AddMisAlignDetElement(detElement->GetId(), deltaGlobalTransform);
     659           0 :     }
     660             :       
     661           0 :     if (verbose)
     662           0 :       printf("Added module transformer %i to the transformer\n", iMt);
     663           0 :     newGeometryTransformer->AddModuleTransformer(newModuleTransformer);
     664           0 :   }
     665           0 :   return newGeometryTransformer;
     666           0 : }
     667             : 
     668             : void AliMUONSurveyUtil::SetAlignmentResolution(const TClonesArray* misAlignArray, Int_t chId, Double_t chResX, Double_t chResY, Double_t deResX, Double_t deResY){
     669             :   /// Sets the alignment resolution to the AliAlignObjMatrix correlation matrix
     670             : 
     671           0 :   TMatrixDSym mChCorrMatrix(6);
     672           0 :   mChCorrMatrix[0][0]=chResX*chResX;
     673           0 :   mChCorrMatrix[1][1]=chResY*chResY;
     674             :   //  mChCorrMatrix.Print();
     675             : 
     676           0 :   TMatrixDSym mDECorrMatrix(6);
     677           0 :   mDECorrMatrix[0][0]=deResX*deResX;
     678           0 :   mDECorrMatrix[1][1]=deResY*deResY;
     679             :   //  mDECorrMatrix.Print();
     680             : 
     681             :   AliAlignObjMatrix *alignMat = 0x0;
     682             : 
     683             : //  Int_t modId = (chId<4)? chId : 4+(chId-4)*2;   
     684           0 :   TString chName1;
     685           0 :   TString chName2;
     686           0 :   if (chId<4){
     687           0 :     chName1 = Form("GM%d",chId);
     688           0 :     chName2 = Form("GM%d",chId);
     689             :   } else {
     690           0 :     chName1 = Form("GM%d",4+(chId-4)*2);
     691           0 :     chName2 = Form("GM%d",4+(chId-4)*2+1);
     692             :   }
     693             :   
     694           0 :   for (int i=0; i<misAlignArray->GetEntries(); i++) {
     695           0 :     alignMat = (AliAlignObjMatrix*)misAlignArray->At(i);
     696           0 :     TString volName(alignMat->GetSymName());
     697           0 :     if((volName.Contains(chName1)&&
     698           0 :         volName.Last('/')<=volName.Index(chName1)+chName1.Length())||
     699           0 :        (volName.Contains(chName2)&&
     700           0 :         volName.Last('/')<=volName.Index(chName2)+chName2.Length())) {
     701           0 :       volName.Remove(0,volName.Last('/')+1);
     702           0 :       if (volName.Contains("GM")) {
     703             :         //      alignMat->Print("NULL");
     704           0 :         alignMat->SetCorrMatrix(mChCorrMatrix);
     705           0 :       } else if (volName.Contains("DE")) {
     706             :         //      alignMat->Print("NULL");
     707           0 :         alignMat->SetCorrMatrix(mDECorrMatrix);
     708             :       }
     709             :     }
     710           0 :   }
     711           0 : }

Generated by: LCOV version 1.11