- Disentangle masks effect from trigger chamber efficiency estimation.
[u/mrichter/AliRoot.git] / MUON / MUONCheckMisAligner.C
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 /* $Id$ */
17
18 /// \ingroup macros
19 /// \file MUONCheckMisAligner.C
20 /// \brief This macro performs the misalignment on an existing muon arm geometry
21 ///  
22 /// This macro performs the misalignment on an existing muon arm geometry
23 /// based on the standard definition of the detector elements in 
24 /// the AliMUONGeometryTransformer class.
25 ///
26 /// It uses AliMUONGeometryMisAligner : 
27 /// - Creates a new AliMUONGeometryTransformer and AliMUONGeometryMisAligner
28 /// - Loads the geometry from the specified geometry file (default is geometry.root)
29 /// - Creates a second AliMUONGeometryTransformer by misaligning the existing 
30 ///   one using AliMUONGeometryMisAligner::MisAlign
31 /// - User has to specify the magnitude of the alignments, in the Cartesian 
32 ///   co-ordiantes (which are used to apply translation misalignments) and in the
33 ///   spherical co-ordinates (which are used to apply angular displacements)
34 /// - User can also set misalignment ranges by hand using the methods : 
35 ///   SetMaxCartMisAlig, SetMaxAngMisAlig, SetXYAngMisAligFactor
36 ///   (last method takes account of the fact that the misalingment is greatest in 
37 ///   the XY plane, since the detection elements are fixed to a support structure
38 ///   in this plane. Misalignments in the XZ and YZ plane will be very small 
39 ///   compared to those in the XY plane, which are small already - of the order 
40 ///   of microns)
41 /// - Default behavior generates a "residual" misalignment using gaussian
42 ///   distributions. Uniform distributions can still be used, see 
43 ///   AliMUONGeometryMisAligner.
44 /// - User can also generate module misalignments using SetModuleCartMisAlig
45 ///   and SetModuleAngMisAlig
46 ///
47 /// Note: If the detection elements are allowed to be misaligned in all
48 /// directions, this has consequences for the alignment algorithm, which 
49 /// needs to know the number of free parameters. Eric only allowed 3 : 
50 /// x,y,theta_xy, but in principle z and the other two angles are alignable
51 /// as well.  
52 ///
53 /// \author:Bruce Becker
54
55 #if !defined(__CINT__) || defined(__MAKECINT__)
56
57 #include "AliMUONGeometryTransformer.h"
58 #include "AliMUONGeometryMisAligner.h"
59
60 #include "AliGeomManager.h"
61 #include "AliCDBManager.h"
62 #include "AliCDBMetaData.h"
63 #include "AliCDBId.h"
64
65 #include <TGeoManager.h>
66 #include <TClonesArray.h>
67
68 #endif
69
70 void MUONCheckMisAligner(Double_t xcartmisaligm = 0.0, Double_t xcartmisaligw = 0.004, 
71                          Double_t ycartmisaligm = 0.0, Double_t ycartmisaligw = 0.003, 
72                          Double_t angmisaligm = 0.0, Double_t angmisaligw = 0.0023,
73                          TString nameCDB = "ResMisAlignCDB", 
74                          const TString& geomFileName = "geometry.root")
75 {
76   
77   AliMUONGeometryTransformer *transform = new AliMUONGeometryTransformer();
78   transform->LoadGeometryData(geomFileName.Data());
79
80   AliMUONGeometryMisAligner misAligner(xcartmisaligm,xcartmisaligw,
81                                        ycartmisaligm,ycartmisaligw,
82                                        angmisaligm,angmisaligw);
83
84   // Generate mis alignment data
85
86   // Uncomment lines below if you would like to generate module misalignments
87   // misAligner.SetModuleCartMisAlig(0.0,0.1,0.0,0.1,0.0,0.1); // Full
88   // misAligner.SetModuleAngMisAlig(0.0,0.02,0.0,0.04,0.0,0.02); // Full
89   // misAligner.SetModuleCartMisAlig(0.0,0.003,0.0,0.003,0.0,0.003); // Res
90   // misAligner.SetModuleAngMisAlig(0.0,0.0006,0.0,0.001,0.0,0.0005); // Res
91
92   AliMUONGeometryTransformer *newTransform = misAligner.MisAlign(transform,true); 
93   newTransform->WriteTransformations("transform2.dat");
94   newTransform->WriteMisAlignmentData("misalign.root");
95
96   // Apply misAlignment via AliRoot framework
97   AliGeomManager::ApplyAlignObjsToGeom(
98      *const_cast<TClonesArray*>(newTransform->GetMisAlignmentData()));
99   // Save new geometry file
100   gGeoManager->Export("geometry2.root");
101
102   // Extract new transformations
103   AliMUONGeometryTransformer* transform3 = new AliMUONGeometryTransformer();
104   gGeoManager->UnlockGeometry();
105   transform3->LoadGeometryData("geometry2.root");
106   transform3->WriteTransformations("transform3.dat");
107                // Check that transform3.dat is equal to transform2.dat
108
109   // Generate misaligned data in local cdb
110   const TClonesArray* array = newTransform->GetMisAlignmentData();
111   
112   // 100 mum residual resolution for chamber misalignments?
113   misAligner.SetAlignmentResolution(array,-1,0.01,0.01,xcartmisaligw,ycartmisaligw);
114   
115   TString sLocCDB("local://");
116   sLocCDB += nameCDB;
117   // CDB manager
118   AliCDBManager* cdbManager = AliCDBManager::Instance();
119   cdbManager->SetSpecificStorage("MUON/Align/Data",sLocCDB.Data());
120
121   AliCDBMetaData* cdbData = new AliCDBMetaData();
122   cdbData->SetResponsible("Dimuon Offline project");
123   cdbData->SetComment("MUON alignment objects with residual misalignment");
124   AliCDBId id("MUON/Align/Data", 0, AliCDBRunRange::Infinity());
125   cdbManager->Put(const_cast<TClonesArray*>(array), id, cdbData);
126
127   // To run simulation with misaligned geometry, you have to set
128   // the Align option in Config.C:
129   // MUON->SetAlign("transform2.dat");
130 }
131
132
133
134