ROOT logo
#ifndef ALIFMDSURVEYTOALIGNOBJS_H
#define ALIFMDSURVEYTOALIGNOBJS_H
#include <AliSurveyToAlignObjs.h>
#include <TGeoMatrix.h>

// Forward decl
class TVector3;
class TGeoMatrix;
class AliAlignObjParams;

/**
 * Class to take survey data and transform that to alignment objects. 
 * 
 */
class AliFMDSurveyToAlignObjs : public AliSurveyToAlignObjs
{
public:
  /** 
   * Constructor
   * 
   */
  AliFMDSurveyToAlignObjs() : AliSurveyToAlignObjs(),
			      fFMD1Delta(0),
			      fFMD2Delta(0) {}
  /** 
   * Run the task.
   * 
   */  
  void Run();
  void Run(const char** files);
  /** 
   * 
   * Method to create the alignment objects
   * 
   * @return @c true on success, @c false otherwise
   */  
  Bool_t CreateAlignObjs();

  
  TClonesArray* GetAlignObjArray() const { return fAlignObjArray; }
  
protected:
  /** 
   * Do the FMD1 analysis.  We have 4 survey targets on V0-A on the
   * C-side.  These are 
   *
   *  - V0A_ICT  In-side, C-side, top.
   *  - V0A_ICB  In-side, C-side, bottom.  
   *  - V0A_OCT  Out-side, C-side, top.	 
   *  - V0A_OCB	 Out-side, C-side, bottom.
   * 
   * These 4 survey targets sit 3.3mm over the V0-A C-side surface, or
   * 3.3mm over the back surface of FMD1.  
   *
   * Since these are really sitting on a plane, we can use the method
   * proposed by the CORE offline. 
   * 
   * @return @c true on success, @c false otherwise.
   */
  Bool_t DoFMD1();
  /** 
   * Get the FMD1 plane from the survey points
   * 
   * @param rot    Rotation matrix (direction cosines)
   * @param trans  Translation
   * 
   * @return @c true on success, @c false otherwise.
   */
  Bool_t GetFMD1Plane(Double_t* rot, Double_t* trans) const;
  /** 
   * Do the FMD2 calculations.  We have 6 survey points of which only
   * 5 are normally surveyed.  These are all sittings 
   *
   *  - FMD2_ITOP   - In-side, top
   *  - FMD2_IBOTM  - In-side, middle bottom
   *  - FMD2_IBOT   - In-side, bottom
   *  - FMD2_OTOP   - Out-side, top
   *  - FMD2_OBOTM  - Out-side, middle bottom
   *  - FMD2_OBOT   - Out-side, bottom
   *
   * The nominal coordinates of these retro-fitted survey stickers
   * isn't known.  Also, these stickers are put on a thin (0.3mm
   * thick) carbon cover which flexes quite easily.  This means, that
   * to rotations and xy-translation obtained from the survey data
   * cannot be used, and left is only the z-translation.
   *
   * Further more, since FMD2 to is attached to the ITS SPD thermal
   * screen, it is questionable if the FMD2 survey will ever be used. 
   * 
   * @return @c true on success, @c false otherwise.
   */
  Bool_t DoFMD2();
  /** 
   * Get the surveyed plane corresponding to the backside of FMD2.
   * The plane is done as a best fit of the plane equation to at least
   * 4 of the available survey points.
   * 
   * @param rot    Rotation matrix (direction cosines)
   * @param trans  Translation vector.
   * 
   * @return @c true on success, @c false otherwise
   */
  Bool_t GetFMD2Plane(Double_t* rot, Double_t* trans) const;
  /** 
   * Get the factor to translate current coordinates to the canonical
   * unit (centi-meters). 
   * 
   * @return Conversion factor
   */
  Double_t GetUnitFactor() const;
  /** 
   * Get the coordinates of a survey point (if available).
   * 
   * @param name Name of the survey point.
   * @param p    Coordinates.
   * @param e    Error on the measurement.
   * 
   * @return @c true if the survey data is available, @c false otherwise.
   */
  Bool_t   GetPoint(const char* name, TVector3& p, TVector3& e) const;
  /** 
   * Calculate the plane translation and rotation from 3 survey points
   * 
   * @param a     1st Survey point 
   * @param b     2nd Survey point
   * @param c     3rd Survey point
   * @param trans Translation vector
   * @param rot   Rotation matrix (direction cosines)
   * 
   * @return 
   */
  Bool_t   CalculatePlane(const     TVector3& a, 
			  const     TVector3& b,
			  const     TVector3& c,
			  Double_t  depth,
			  Double_t* trans,
			  Double_t* rot) const;
  /** 
   * Calculate the plane rotation and translation by doing a fit of
   * the plane equation to the surveyed points.  At least 4 points
   * must be passed in the @a points array with corresponding errors
   * in the array @a errors.  The arrays are assumed to contain
   * TVector3 objects.
   * 
   * @param points Array surveyed positions
   * @param errors Array of errors corresponding to @a points
   * @param depth  Survey targets depth (perpendicular to the plane)
   * @param trans  On return, translation of the plane
   * @param rot    On return, rotation (direction cosines) of the plane
   * 
   * @return @c true on success, @c false otherwise
   */
  Bool_t FitPlane(const TObjArray& points, 
		  const TObjArray& errors,
		  Double_t         depth,
		  Double_t*        trans,
		  Double_t*        rot) const;
  /** 
   * Create a delta transform from a global rotation matrix and
   * translation. 
   * 
   * @param global Global matrix of element to transform.
   * @param rot    Rotation matrix (direction cosines)
   * @param trans  Translation 
   * @param delta  On return, the delta transform
   * 
   * @return Newly 
   */
  Bool_t MakeDelta(const TGeoMatrix*  global,
		   const Double_t*    rot, 
		   const Double_t*    trans,
		   TGeoHMatrix& delta) const;
  /** 
   * Create a delta transform from a global rotation matrix and
   * translation. 
   * 
   * @param path   Path of element to transform.
   * @param rot    Rotation matrix (direction cosines)
   * @param trans  Translation 
   * @param delta  On return, the delta transform
   * 
   * @return Newly 
   */
  Bool_t MakeDelta(const char*  path, 
		   const Double_t*    rot, 
		   const Double_t*    trans,
		   TGeoHMatrix& delta) const;
  /** 
   * Create a default (i.e., no rotation or translation) alignment object. 
   * 
   * @param path Path to volume 
   * @param id   Id of volume
   * 
   * @return Created object
   */
  AliAlignObjParams* CreateDefaultAlignObj(const TString& path, Int_t id=0);
  /** 
   * Check if we have an alignment object for the given path alread 
   * 
   * @param path PAth to check 
   * 
   * @return Pointer to object if found, otherwise 0
   */
  AliAlignObjParams* FindAlignObj(const TString& path) const;
  /** 
   * Fill In default alignmen objects 
   * 
   * @return true on sucess
   */
  Bool_t FillDefaultAlignObjs();

  /** 
   * Service member function to print a vector
   * 
   * @param text Prefix text
   * @param v    Vector (array of 3 doubles)
   */
  static void PrintVector(const char* text, const Double_t* v);
  /** 
   * Service member function to print a vector
   * 
   * @param text Prefix text
   * @param v    Vector
   */
  static void PrintVector(const char* text, const TVector3& v);
  /** 
   * Service member function to print a rotation matrix
   * 
   * @param text Prefix text
   * @param v    Matrix (array of 9 doubles)
   */
  static void PrintRotation(const char* text, const Double_t* rot);

  TGeoHMatrix fFMD1Delta; // FMD1 delta transform
  TGeoHMatrix fFMD2Delta; // FMD2 delta transform 
  
  ClassDef(AliFMDSurveyToAlignObjs,0) // Convert FMD survey to alignments
};


#endif
//____________________________________________________________________
//
// Local Variables:
//  mode: C++
// End:
//

 AliFMDSurveyToAlignObjs.h:1
 AliFMDSurveyToAlignObjs.h:2
 AliFMDSurveyToAlignObjs.h:3
 AliFMDSurveyToAlignObjs.h:4
 AliFMDSurveyToAlignObjs.h:5
 AliFMDSurveyToAlignObjs.h:6
 AliFMDSurveyToAlignObjs.h:7
 AliFMDSurveyToAlignObjs.h:8
 AliFMDSurveyToAlignObjs.h:9
 AliFMDSurveyToAlignObjs.h:10
 AliFMDSurveyToAlignObjs.h:11
 AliFMDSurveyToAlignObjs.h:12
 AliFMDSurveyToAlignObjs.h:13
 AliFMDSurveyToAlignObjs.h:14
 AliFMDSurveyToAlignObjs.h:15
 AliFMDSurveyToAlignObjs.h:16
 AliFMDSurveyToAlignObjs.h:17
 AliFMDSurveyToAlignObjs.h:18
 AliFMDSurveyToAlignObjs.h:19
 AliFMDSurveyToAlignObjs.h:20
 AliFMDSurveyToAlignObjs.h:21
 AliFMDSurveyToAlignObjs.h:22
 AliFMDSurveyToAlignObjs.h:23
 AliFMDSurveyToAlignObjs.h:24
 AliFMDSurveyToAlignObjs.h:25
 AliFMDSurveyToAlignObjs.h:26
 AliFMDSurveyToAlignObjs.h:27
 AliFMDSurveyToAlignObjs.h:28
 AliFMDSurveyToAlignObjs.h:29
 AliFMDSurveyToAlignObjs.h:30
 AliFMDSurveyToAlignObjs.h:31
 AliFMDSurveyToAlignObjs.h:32
 AliFMDSurveyToAlignObjs.h:33
 AliFMDSurveyToAlignObjs.h:34
 AliFMDSurveyToAlignObjs.h:35
 AliFMDSurveyToAlignObjs.h:36
 AliFMDSurveyToAlignObjs.h:37
 AliFMDSurveyToAlignObjs.h:38
 AliFMDSurveyToAlignObjs.h:39
 AliFMDSurveyToAlignObjs.h:40
 AliFMDSurveyToAlignObjs.h:41
 AliFMDSurveyToAlignObjs.h:42
 AliFMDSurveyToAlignObjs.h:43
 AliFMDSurveyToAlignObjs.h:44
 AliFMDSurveyToAlignObjs.h:45
 AliFMDSurveyToAlignObjs.h:46
 AliFMDSurveyToAlignObjs.h:47
 AliFMDSurveyToAlignObjs.h:48
 AliFMDSurveyToAlignObjs.h:49
 AliFMDSurveyToAlignObjs.h:50
 AliFMDSurveyToAlignObjs.h:51
 AliFMDSurveyToAlignObjs.h:52
 AliFMDSurveyToAlignObjs.h:53
 AliFMDSurveyToAlignObjs.h:54
 AliFMDSurveyToAlignObjs.h:55
 AliFMDSurveyToAlignObjs.h:56
 AliFMDSurveyToAlignObjs.h:57
 AliFMDSurveyToAlignObjs.h:58
 AliFMDSurveyToAlignObjs.h:59
 AliFMDSurveyToAlignObjs.h:60
 AliFMDSurveyToAlignObjs.h:61
 AliFMDSurveyToAlignObjs.h:62
 AliFMDSurveyToAlignObjs.h:63
 AliFMDSurveyToAlignObjs.h:64
 AliFMDSurveyToAlignObjs.h:65
 AliFMDSurveyToAlignObjs.h:66
 AliFMDSurveyToAlignObjs.h:67
 AliFMDSurveyToAlignObjs.h:68
 AliFMDSurveyToAlignObjs.h:69
 AliFMDSurveyToAlignObjs.h:70
 AliFMDSurveyToAlignObjs.h:71
 AliFMDSurveyToAlignObjs.h:72
 AliFMDSurveyToAlignObjs.h:73
 AliFMDSurveyToAlignObjs.h:74
 AliFMDSurveyToAlignObjs.h:75
 AliFMDSurveyToAlignObjs.h:76
 AliFMDSurveyToAlignObjs.h:77
 AliFMDSurveyToAlignObjs.h:78
 AliFMDSurveyToAlignObjs.h:79
 AliFMDSurveyToAlignObjs.h:80
 AliFMDSurveyToAlignObjs.h:81
 AliFMDSurveyToAlignObjs.h:82
 AliFMDSurveyToAlignObjs.h:83
 AliFMDSurveyToAlignObjs.h:84
 AliFMDSurveyToAlignObjs.h:85
 AliFMDSurveyToAlignObjs.h:86
 AliFMDSurveyToAlignObjs.h:87
 AliFMDSurveyToAlignObjs.h:88
 AliFMDSurveyToAlignObjs.h:89
 AliFMDSurveyToAlignObjs.h:90
 AliFMDSurveyToAlignObjs.h:91
 AliFMDSurveyToAlignObjs.h:92
 AliFMDSurveyToAlignObjs.h:93
 AliFMDSurveyToAlignObjs.h:94
 AliFMDSurveyToAlignObjs.h:95
 AliFMDSurveyToAlignObjs.h:96
 AliFMDSurveyToAlignObjs.h:97
 AliFMDSurveyToAlignObjs.h:98
 AliFMDSurveyToAlignObjs.h:99
 AliFMDSurveyToAlignObjs.h:100
 AliFMDSurveyToAlignObjs.h:101
 AliFMDSurveyToAlignObjs.h:102
 AliFMDSurveyToAlignObjs.h:103
 AliFMDSurveyToAlignObjs.h:104
 AliFMDSurveyToAlignObjs.h:105
 AliFMDSurveyToAlignObjs.h:106
 AliFMDSurveyToAlignObjs.h:107
 AliFMDSurveyToAlignObjs.h:108
 AliFMDSurveyToAlignObjs.h:109
 AliFMDSurveyToAlignObjs.h:110
 AliFMDSurveyToAlignObjs.h:111
 AliFMDSurveyToAlignObjs.h:112
 AliFMDSurveyToAlignObjs.h:113
 AliFMDSurveyToAlignObjs.h:114
 AliFMDSurveyToAlignObjs.h:115
 AliFMDSurveyToAlignObjs.h:116
 AliFMDSurveyToAlignObjs.h:117
 AliFMDSurveyToAlignObjs.h:118
 AliFMDSurveyToAlignObjs.h:119
 AliFMDSurveyToAlignObjs.h:120
 AliFMDSurveyToAlignObjs.h:121
 AliFMDSurveyToAlignObjs.h:122
 AliFMDSurveyToAlignObjs.h:123
 AliFMDSurveyToAlignObjs.h:124
 AliFMDSurveyToAlignObjs.h:125
 AliFMDSurveyToAlignObjs.h:126
 AliFMDSurveyToAlignObjs.h:127
 AliFMDSurveyToAlignObjs.h:128
 AliFMDSurveyToAlignObjs.h:129
 AliFMDSurveyToAlignObjs.h:130
 AliFMDSurveyToAlignObjs.h:131
 AliFMDSurveyToAlignObjs.h:132
 AliFMDSurveyToAlignObjs.h:133
 AliFMDSurveyToAlignObjs.h:134
 AliFMDSurveyToAlignObjs.h:135
 AliFMDSurveyToAlignObjs.h:136
 AliFMDSurveyToAlignObjs.h:137
 AliFMDSurveyToAlignObjs.h:138
 AliFMDSurveyToAlignObjs.h:139
 AliFMDSurveyToAlignObjs.h:140
 AliFMDSurveyToAlignObjs.h:141
 AliFMDSurveyToAlignObjs.h:142
 AliFMDSurveyToAlignObjs.h:143
 AliFMDSurveyToAlignObjs.h:144
 AliFMDSurveyToAlignObjs.h:145
 AliFMDSurveyToAlignObjs.h:146
 AliFMDSurveyToAlignObjs.h:147
 AliFMDSurveyToAlignObjs.h:148
 AliFMDSurveyToAlignObjs.h:149
 AliFMDSurveyToAlignObjs.h:150
 AliFMDSurveyToAlignObjs.h:151
 AliFMDSurveyToAlignObjs.h:152
 AliFMDSurveyToAlignObjs.h:153
 AliFMDSurveyToAlignObjs.h:154
 AliFMDSurveyToAlignObjs.h:155
 AliFMDSurveyToAlignObjs.h:156
 AliFMDSurveyToAlignObjs.h:157
 AliFMDSurveyToAlignObjs.h:158
 AliFMDSurveyToAlignObjs.h:159
 AliFMDSurveyToAlignObjs.h:160
 AliFMDSurveyToAlignObjs.h:161
 AliFMDSurveyToAlignObjs.h:162
 AliFMDSurveyToAlignObjs.h:163
 AliFMDSurveyToAlignObjs.h:164
 AliFMDSurveyToAlignObjs.h:165
 AliFMDSurveyToAlignObjs.h:166
 AliFMDSurveyToAlignObjs.h:167
 AliFMDSurveyToAlignObjs.h:168
 AliFMDSurveyToAlignObjs.h:169
 AliFMDSurveyToAlignObjs.h:170
 AliFMDSurveyToAlignObjs.h:171
 AliFMDSurveyToAlignObjs.h:172
 AliFMDSurveyToAlignObjs.h:173
 AliFMDSurveyToAlignObjs.h:174
 AliFMDSurveyToAlignObjs.h:175
 AliFMDSurveyToAlignObjs.h:176
 AliFMDSurveyToAlignObjs.h:177
 AliFMDSurveyToAlignObjs.h:178
 AliFMDSurveyToAlignObjs.h:179
 AliFMDSurveyToAlignObjs.h:180
 AliFMDSurveyToAlignObjs.h:181
 AliFMDSurveyToAlignObjs.h:182
 AliFMDSurveyToAlignObjs.h:183
 AliFMDSurveyToAlignObjs.h:184
 AliFMDSurveyToAlignObjs.h:185
 AliFMDSurveyToAlignObjs.h:186
 AliFMDSurveyToAlignObjs.h:187
 AliFMDSurveyToAlignObjs.h:188
 AliFMDSurveyToAlignObjs.h:189
 AliFMDSurveyToAlignObjs.h:190
 AliFMDSurveyToAlignObjs.h:191
 AliFMDSurveyToAlignObjs.h:192
 AliFMDSurveyToAlignObjs.h:193
 AliFMDSurveyToAlignObjs.h:194
 AliFMDSurveyToAlignObjs.h:195
 AliFMDSurveyToAlignObjs.h:196
 AliFMDSurveyToAlignObjs.h:197
 AliFMDSurveyToAlignObjs.h:198
 AliFMDSurveyToAlignObjs.h:199
 AliFMDSurveyToAlignObjs.h:200
 AliFMDSurveyToAlignObjs.h:201
 AliFMDSurveyToAlignObjs.h:202
 AliFMDSurveyToAlignObjs.h:203
 AliFMDSurveyToAlignObjs.h:204
 AliFMDSurveyToAlignObjs.h:205
 AliFMDSurveyToAlignObjs.h:206
 AliFMDSurveyToAlignObjs.h:207
 AliFMDSurveyToAlignObjs.h:208
 AliFMDSurveyToAlignObjs.h:209
 AliFMDSurveyToAlignObjs.h:210
 AliFMDSurveyToAlignObjs.h:211
 AliFMDSurveyToAlignObjs.h:212
 AliFMDSurveyToAlignObjs.h:213
 AliFMDSurveyToAlignObjs.h:214
 AliFMDSurveyToAlignObjs.h:215
 AliFMDSurveyToAlignObjs.h:216
 AliFMDSurveyToAlignObjs.h:217
 AliFMDSurveyToAlignObjs.h:218
 AliFMDSurveyToAlignObjs.h:219
 AliFMDSurveyToAlignObjs.h:220
 AliFMDSurveyToAlignObjs.h:221
 AliFMDSurveyToAlignObjs.h:222
 AliFMDSurveyToAlignObjs.h:223
 AliFMDSurveyToAlignObjs.h:224
 AliFMDSurveyToAlignObjs.h:225
 AliFMDSurveyToAlignObjs.h:226
 AliFMDSurveyToAlignObjs.h:227
 AliFMDSurveyToAlignObjs.h:228
 AliFMDSurveyToAlignObjs.h:229
 AliFMDSurveyToAlignObjs.h:230
 AliFMDSurveyToAlignObjs.h:231
 AliFMDSurveyToAlignObjs.h:232
 AliFMDSurveyToAlignObjs.h:233
 AliFMDSurveyToAlignObjs.h:234
 AliFMDSurveyToAlignObjs.h:235
 AliFMDSurveyToAlignObjs.h:236
 AliFMDSurveyToAlignObjs.h:237
 AliFMDSurveyToAlignObjs.h:238
 AliFMDSurveyToAlignObjs.h:239
 AliFMDSurveyToAlignObjs.h:240
 AliFMDSurveyToAlignObjs.h:241
 AliFMDSurveyToAlignObjs.h:242
 AliFMDSurveyToAlignObjs.h:243
 AliFMDSurveyToAlignObjs.h:244
 AliFMDSurveyToAlignObjs.h:245
 AliFMDSurveyToAlignObjs.h:246
 AliFMDSurveyToAlignObjs.h:247
 AliFMDSurveyToAlignObjs.h:248