Coverity 18449,18448,18447
[u/mrichter/AliRoot.git] / PMD / AliPMDMisAligner.cxx
1 /**************************************************************************
2  * Copyright(c) 2007-2010, 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 //
18 // This class generates misalignment for PMD. In particular it defines
19 // the misalignment in the three canonical scenarios: "ideal", "residual"
20 // and "full".
21 // It is meant to be run standalone or from the steering macro
22 // $ALICE_ROOT/macros/MakeAlignmentObjs.C
23 // looping on the detectors.
24 //
25 // Macro to randomly displace the 4 sectors of the PMD
26 // in each plane. Each sector (to be misaligned) 
27 // of PMD houses the following :
28 // (a) 6 modules of preshower plane
29 // (b) 6 modules of veto plane
30 // (c) The FEE boards on back plane of each module
31 // (d) 6 modules of convertor plates
32 // The clustering is done module-wise
33 // The actual amount displacement will be provided
34 // by the survey data and has to be converted into
35 // displacement in x,y,z,theta, phi and psi 
36
37
38 // Now specify the path of the module to be misaligned
39 // as followed in the PMD geant
40
41 //   _____________
42 //  |    |        |
43 //  | 1  |   3    |
44 //  |    |________|
45 //  |____|___|    |
46 //  |        | 2  |
47 //  |   4    |    |
48 //  |________|____|
49   
50 // Misalignment Matrix is expected to be
51 // same for sectors 1 and 4 
52 // and for the sectors 2 and 3
53 // As these will be mounted on the same
54 // Steel plate 
55 //========================================================================
56
57 #include "AliPMDMisAligner.h"
58 #include "AliGeomManager.h"
59 #include "TClonesArray.h"
60 #include "TRandom.h"
61 #include "AliAlignObjParams.h"
62 #include "AliLog.h"
63
64 ClassImp(AliPMDMisAligner)
65
66     //_______________________________________________________________________________________
67 AliPMDMisAligner::AliPMDMisAligner() : AliMisAligner()
68 {
69     //
70     // dummy constructor
71     //
72 }
73
74 //_______________________________________________________________________________________
75 TClonesArray* AliPMDMisAligner::MakeAlObjsArray() {
76     // builds and returns the array of alignment objects
77     // according to the spcified misalignment scenario
78     // ("ideal", "residual" or "full").
79     //
80     TClonesArray *array = new TClonesArray("AliAlignObjParams",4);
81     TClonesArray &alobj = *array;
82
83     Double_t max_trans=0.1; // maximun shifts in X,Y,Z  in centimeters
84     Double_t max_rot=0.1;   // maximum shifts in angles in degrees
85
86     const char *Sector1="PMD/Sector1"; 
87     const char *Sector2="PMD/Sector2"; 
88     const char *Sector3="PMD/Sector3"; 
89     const char *Sector4="PMD/Sector4"; 
90
91     //Sectors 1 and 4
92     Double_t dx14=0., dy14=0., dz14=0.;          // Misalignment in X,Y and Z
93     Double_t dpsi14=0., dtheta14=0., dphi14=0.; //  Angular displacements
94     //Sectors 2 and 3
95     Double_t dx23=0., dy23=0., dz23=0.;          // Misalignment in X,Y and Z
96     Double_t dpsi23=0., dtheta23=0., dphi23=0.; //  Angular displacements
97
98     UShort_t iIndex=0; // PMD is not indexed
99     AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
100     UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
101   
102     gRandom->SetSeed(4357);
103   
104     if(TString(GetMisalType())=="ideal")
105     {
106
107         Double_t dx=0., dy=0., dz=0., dpsi=0., dtheta=0., dphi=0.;
108
109         for(Int_t i=0; i<4; i++){
110             TString snSector(Form("PMD/Sector%d",i+1));
111             new(alobj[i]) AliAlignObjParams(snSector.Data(), volid, dx, dy, dz, dpsi, dtheta, dphi, kTRUE);
112         }
113
114     }else if(TString(GetMisalType())=="residual" || TString(GetMisalType())=="full"){
115         if(!AliGeomManager::GetGeometry())
116         {
117             AliError("No geometry loaded into AliGeomManager! Returning null pointer!");
118             return 0;
119         }
120
121         // For sectors 1 and 4
122         // Translation displacement
123         dx14     = (gRandom->Uniform()-0.5)*max_trans;
124         dy14     = (gRandom->Uniform()-0.5)*max_trans;
125         dz14     = (gRandom->Uniform()-0.5)*max_trans;
126         //Rotation angles
127         dpsi14   = (gRandom->Uniform()-0.5)*max_rot;
128         dtheta14 = (gRandom->Uniform()-0.5)*max_rot;
129         dphi14   = (gRandom->Uniform()-0.5)*max_rot;
130
131         // For sectors 2 and 3
132         // Translation displacement
133         dx23     = (gRandom->Uniform()-0.5)*max_trans;
134         dy23     = (gRandom->Uniform()-0.5)*max_trans;
135         dz23     = (gRandom->Uniform()-0.5)*max_trans;
136         //Rotation angles
137         dpsi23   = (gRandom->Uniform()-0.5)*max_rot;
138         dtheta23 = (gRandom->Uniform()-0.5)*max_rot;
139         dphi23   = (gRandom->Uniform()-0.5)*max_rot;
140
141         new(alobj[0]) AliAlignObjParams(Sector1, volid, dx14, dy14, dz14, dpsi14, dtheta14, dphi14, kFALSE);
142         new(alobj[1]) AliAlignObjParams(Sector2, volid, dx14, dy14, dz14, dpsi14, dtheta14, dphi14, kFALSE);
143         new(alobj[2]) AliAlignObjParams(Sector3, volid, dx23, dy23, dz23, dpsi23, dtheta23, dphi23, kFALSE);
144         new(alobj[3]) AliAlignObjParams(Sector4, volid, dx23, dy23, dz23, dpsi23, dtheta23, dphi23, kFALSE);
145
146     }else{
147         AliError(Form("\"%s\" is not a valid identifier for misalignment types. Exiting ...",GetMisalType()));
148         return 0;
149     }
150
151     return array;
152 }
153
154 //_______________________________________________________________________________________
155 AliCDBMetaData* AliPMDMisAligner::GetCDBMetaData() const {
156     // Returns the comment and responsible for the
157     // AliCDBMetaData to be associated with the OCDB entry
158     // containing the PMD array of misalignment objects
159     //
160     AliCDBMetaData* md = new AliCDBMetaData();
161     md->SetResponsible("");
162
163     if(TString(GetMisalType())=="ideal")
164         md->SetComment("Alignment objects for PMD ideal misalignment");
165     if(TString(GetMisalType())=="residual")
166         md->SetComment("Alignment objects for PMD residual misalignment");
167     if(TString(GetMisalType())=="full")
168         md->SetComment("Alignment objects for PMD full misalignment");
169
170     return md;
171 }