ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

/// \ingroup macros
/// \file MUONCheckMisAligner.C
/// \brief This macro performs the misalignment on an existing muon arm geometry
///  
/// This macro performs the misalignment on an existing muon arm geometry
/// based on the standard definition of the detector elements in 
/// the AliMUONGeometryTransformer class.
///
/// It uses AliMUONGeometryMisAligner : 
/// - Creates a new AliMUONGeometryTransformer and AliMUONGeometryMisAligner
/// - Loads the geometry from the specified geometry file (default is geometry.root)
/// - Creates a second AliMUONGeometryTransformer by misaligning the existing 
///   one using AliMUONGeometryMisAligner::MisAlign
/// - User has to specify the magnitude of the alignments, in the Cartesian 
///   co-ordiantes (which are used to apply translation misalignments) and in the
///   spherical co-ordinates (which are used to apply angular displacements)
/// - User can also set misalignment ranges by hand using the methods : 
///   SetMaxCartMisAlig, SetMaxAngMisAlig, SetXYAngMisAligFactor
///   (last method takes account of the fact that the misalingment is greatest in 
///   the XY plane, since the detection elements are fixed to a support structure
///   in this plane. Misalignments in the XZ and YZ plane will be very small 
///   compared to those in the XY plane, which are small already - of the order 
///   of microns)
/// - Default behavior generates a "residual" misalignment using gaussian
///   distributions. Uniform distributions can still be used, see 
///   AliMUONGeometryMisAligner.
/// - User can also generate module misalignments using SetModuleCartMisAlig
///   and SetModuleAngMisAlig
///
/// Note: If the detection elements are allowed to be misaligned in all
/// directions, this has consequences for the alignment algorithm, which 
/// needs to know the number of free parameters. Eric only allowed 3 : 
/// x,y,theta_xy, but in principle z and the other two angles are alignable
/// as well.  
///
/// \author:Bruce Becker

#if !defined(__CINT__) || defined(__MAKECINT__)

#include "AliMUONGeometryTransformer.h"
#include "AliMUONGeometryMisAligner.h"

#include "AliGeomManager.h"
#include "AliCDBManager.h"
#include "AliCDBMetaData.h"
#include "AliCDBId.h"

#include <TGeoManager.h>
#include <TClonesArray.h>

#endif

void MUONCheckMisAligner(Double_t xcartmisaligm = 0.0, Double_t xcartmisaligw = 0.004, 
			 Double_t ycartmisaligm = 0.0, Double_t ycartmisaligw = 0.003, 
			 Double_t angmisaligm = 0.0, Double_t angmisaligw = 0.0023,
			 TString nameCDB = "ResMisAlignCDB", 
                         const TString& geomFileName = "geometry.root")
{
  
  AliMUONGeometryTransformer *transform = new AliMUONGeometryTransformer();
  transform->LoadGeometryData(geomFileName.Data());

  AliMUONGeometryMisAligner misAligner(xcartmisaligm,xcartmisaligw,
                                       ycartmisaligm,ycartmisaligw,
				       angmisaligm,angmisaligw);

  // Generate mis alignment data

  // Uncomment lines below if you would like to generate module misalignments
  // misAligner.SetModuleCartMisAlig(0.0,0.1,0.0,0.1,0.0,0.1); // Full
  // misAligner.SetModuleAngMisAlig(0.0,0.02,0.0,0.04,0.0,0.02); // Full
  // misAligner.SetModuleCartMisAlig(0.0,0.003,0.0,0.003,0.0,0.003); // Res
  // misAligner.SetModuleAngMisAlig(0.0,0.0006,0.0,0.001,0.0,0.0005); // Res

  AliMUONGeometryTransformer *newTransform = misAligner.MisAlign(transform,true); 
  newTransform->WriteTransformations("transform2.dat");
  newTransform->WriteMisAlignmentData("misalign.root");

  // Apply misAlignment via AliRoot framework
  AliGeomManager::ApplyAlignObjsToGeom(
     *const_cast<TClonesArray*>(newTransform->GetMisAlignmentData()));
  // Save new geometry file
  gGeoManager->Export("geometry2.root");

  // Extract new transformations
  AliMUONGeometryTransformer* transform3 = new AliMUONGeometryTransformer();
  gGeoManager->UnlockGeometry();
  transform3->LoadGeometryData("geometry2.root");
  transform3->WriteTransformations("transform3.dat");
               // Check that transform3.dat is equal to transform2.dat

  // Generate misaligned data in local cdb
  const TClonesArray* array = newTransform->GetMisAlignmentData();
  
  // 100 mum residual resolution for chamber misalignments?
  misAligner.SetAlignmentResolution(array,-1,0.01,0.01,xcartmisaligw,ycartmisaligw);
  
  TString sLocCDB("local://");
  sLocCDB += nameCDB;
  // CDB manager
  AliCDBManager* cdbManager = AliCDBManager::Instance();
  cdbManager->SetSpecificStorage("MUON/Align/Data",sLocCDB.Data());

  AliCDBMetaData* cdbData = new AliCDBMetaData();
  cdbData->SetResponsible("Dimuon Offline project");
  cdbData->SetComment("MUON alignment objects with residual misalignment");
  AliCDBId id("MUON/Align/Data", 0, AliCDBRunRange::Infinity());
  cdbManager->Put(const_cast<TClonesArray*>(array), id, cdbData);

  // To run simulation with misaligned geometry, you have to set
  // the Align option in Config.C:
  // MUON->SetAlign("transform2.dat");
}




 MUONCheckMisAligner.C:1
 MUONCheckMisAligner.C:2
 MUONCheckMisAligner.C:3
 MUONCheckMisAligner.C:4
 MUONCheckMisAligner.C:5
 MUONCheckMisAligner.C:6
 MUONCheckMisAligner.C:7
 MUONCheckMisAligner.C:8
 MUONCheckMisAligner.C:9
 MUONCheckMisAligner.C:10
 MUONCheckMisAligner.C:11
 MUONCheckMisAligner.C:12
 MUONCheckMisAligner.C:13
 MUONCheckMisAligner.C:14
 MUONCheckMisAligner.C:15
 MUONCheckMisAligner.C:16
 MUONCheckMisAligner.C:17
 MUONCheckMisAligner.C:18
 MUONCheckMisAligner.C:19
 MUONCheckMisAligner.C:20
 MUONCheckMisAligner.C:21
 MUONCheckMisAligner.C:22
 MUONCheckMisAligner.C:23
 MUONCheckMisAligner.C:24
 MUONCheckMisAligner.C:25
 MUONCheckMisAligner.C:26
 MUONCheckMisAligner.C:27
 MUONCheckMisAligner.C:28
 MUONCheckMisAligner.C:29
 MUONCheckMisAligner.C:30
 MUONCheckMisAligner.C:31
 MUONCheckMisAligner.C:32
 MUONCheckMisAligner.C:33
 MUONCheckMisAligner.C:34
 MUONCheckMisAligner.C:35
 MUONCheckMisAligner.C:36
 MUONCheckMisAligner.C:37
 MUONCheckMisAligner.C:38
 MUONCheckMisAligner.C:39
 MUONCheckMisAligner.C:40
 MUONCheckMisAligner.C:41
 MUONCheckMisAligner.C:42
 MUONCheckMisAligner.C:43
 MUONCheckMisAligner.C:44
 MUONCheckMisAligner.C:45
 MUONCheckMisAligner.C:46
 MUONCheckMisAligner.C:47
 MUONCheckMisAligner.C:48
 MUONCheckMisAligner.C:49
 MUONCheckMisAligner.C:50
 MUONCheckMisAligner.C:51
 MUONCheckMisAligner.C:52
 MUONCheckMisAligner.C:53
 MUONCheckMisAligner.C:54
 MUONCheckMisAligner.C:55
 MUONCheckMisAligner.C:56
 MUONCheckMisAligner.C:57
 MUONCheckMisAligner.C:58
 MUONCheckMisAligner.C:59
 MUONCheckMisAligner.C:60
 MUONCheckMisAligner.C:61
 MUONCheckMisAligner.C:62
 MUONCheckMisAligner.C:63
 MUONCheckMisAligner.C:64
 MUONCheckMisAligner.C:65
 MUONCheckMisAligner.C:66
 MUONCheckMisAligner.C:67
 MUONCheckMisAligner.C:68
 MUONCheckMisAligner.C:69
 MUONCheckMisAligner.C:70
 MUONCheckMisAligner.C:71
 MUONCheckMisAligner.C:72
 MUONCheckMisAligner.C:73
 MUONCheckMisAligner.C:74
 MUONCheckMisAligner.C:75
 MUONCheckMisAligner.C:76
 MUONCheckMisAligner.C:77
 MUONCheckMisAligner.C:78
 MUONCheckMisAligner.C:79
 MUONCheckMisAligner.C:80
 MUONCheckMisAligner.C:81
 MUONCheckMisAligner.C:82
 MUONCheckMisAligner.C:83
 MUONCheckMisAligner.C:84
 MUONCheckMisAligner.C:85
 MUONCheckMisAligner.C:86
 MUONCheckMisAligner.C:87
 MUONCheckMisAligner.C:88
 MUONCheckMisAligner.C:89
 MUONCheckMisAligner.C:90
 MUONCheckMisAligner.C:91
 MUONCheckMisAligner.C:92
 MUONCheckMisAligner.C:93
 MUONCheckMisAligner.C:94
 MUONCheckMisAligner.C:95
 MUONCheckMisAligner.C:96
 MUONCheckMisAligner.C:97
 MUONCheckMisAligner.C:98
 MUONCheckMisAligner.C:99
 MUONCheckMisAligner.C:100
 MUONCheckMisAligner.C:101
 MUONCheckMisAligner.C:102
 MUONCheckMisAligner.C:103
 MUONCheckMisAligner.C:104
 MUONCheckMisAligner.C:105
 MUONCheckMisAligner.C:106
 MUONCheckMisAligner.C:107
 MUONCheckMisAligner.C:108
 MUONCheckMisAligner.C:109
 MUONCheckMisAligner.C:110
 MUONCheckMisAligner.C:111
 MUONCheckMisAligner.C:112
 MUONCheckMisAligner.C:113
 MUONCheckMisAligner.C:114
 MUONCheckMisAligner.C:115
 MUONCheckMisAligner.C:116
 MUONCheckMisAligner.C:117
 MUONCheckMisAligner.C:118
 MUONCheckMisAligner.C:119
 MUONCheckMisAligner.C:120
 MUONCheckMisAligner.C:121
 MUONCheckMisAligner.C:122
 MUONCheckMisAligner.C:123
 MUONCheckMisAligner.C:124
 MUONCheckMisAligner.C:125
 MUONCheckMisAligner.C:126
 MUONCheckMisAligner.C:127
 MUONCheckMisAligner.C:128
 MUONCheckMisAligner.C:129
 MUONCheckMisAligner.C:130
 MUONCheckMisAligner.C:131
 MUONCheckMisAligner.C:132
 MUONCheckMisAligner.C:133
 MUONCheckMisAligner.C:134
 MUONCheckMisAligner.C:135