1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
19 /// \file MUONSurveyCh8L.C
20 /// \brief Macro to process survey and photogrammetry data of chamber 5
22 /// Macro loads the survey data from .txt file using AliSurveyObj.
23 /// Macro uses AliMUONSurvey... classes.
24 /// The transformations of the detection elements or chambers can be obtained
26 /// - A: Fit of local to global transformation using the fixed button targets.
27 /// - B: Fit a plane to the sticker targets -> psi, theta
28 /// Use above psi and theta and fit remaining 4 parameters using the fixed
30 /// - C: Fit a plane to the sticker targets -> psi, theta
31 /// Use above psi and theta to calculate xc, yc, zc and phi by solving
32 /// the equations from a local to global transformation of the fixed button
35 /// Methods A and B are prefered to C, and B is better if sticker targets are
36 /// available and lie on a plane!
37 /// For slats only methods B and C can be used.
38 /// Various histograms are filled and printed for monitoring.
39 /// MisAlignment object is then created.
41 /// \author Javier Castillo
43 #if !defined(__CINT__) || defined(__MAKECINT__)
45 #include "AliMUONGeometryTransformer.h"
46 #include "AliMUONGeometryModuleTransformer.h"
47 #include "AliMUONGeometryDetElement.h"
48 #include "AliMUONGeometryMisAligner.h"
49 #include "AliMUONSurveyChamber.h"
50 #include "AliMUONSurveyDetElem.h"
51 #include "AliMUONSurveyUtil.h"
53 #include "AliSurveyObj.h"
54 #include "AliSurveyPoint.h"
55 #include "AliGeomManager.h"
56 #include "AliCDBManager.h"
57 #include "AliCDBMetaData.h"
59 #include "AliAlignObjMatrix.h"
60 #include "AliAlignObj.h"
63 #include <TGeoManager.h>
64 #include <TClonesArray.h>
65 #include <TObjArray.h>
72 #include <TGraphErrors.h>
76 #include <TPostScript.h>
77 #include <TPaveLabel.h>
80 #include <TMatrixDSym.h>
86 void MUONSurveyCh5() {
91 Bool_t bMonitor = kTRUE;
93 Bool_t saveps = kFALSE;
94 const int cWidth = (int)(700*(29./21.));
95 const int cHeight = 700;
96 const int filetype = 112; // landscape
100 Int_t nDetElems = 18;
101 Int_t nDetElemsI = 9;
102 // Int_t nDetElemsO = 9;
103 Int_t iDetElemToDetElemId[18] = {514,506,516,508,500,510,502,512,504,513,503,511,501,509,517,507,515,505};
104 Int_t iDetElemPseudoIdToDetElem[18] = {4,12,6,10,8,17,1,15,3,13,5,11,7,9,0,16,2,14};
105 Int_t iDetElemsOfChamber[2][9] = {{0,16,2,14,4,12,6,10,8},
106 {9,7,11,5,13,3,15,1,17}};
108 TObjArray *myChamberArray = new TObjArray();
109 myChamberArray->Add(new AliMUONSurveyChamber(chId));
110 myChamberArray->Add(new AliMUONSurveyChamber(chId));
112 AliMUONSurveyChamber *myChamberI = 0x0;
113 AliMUONSurveyChamber *myChamberO = 0x0;
114 AliMUONSurveyChamber *myChamber = 0x0;
115 AliMUONSurveyDetElem *myDetElem = 0x0;
117 myChamberI = (AliMUONSurveyChamber*)myChamberArray->At(0);
118 myChamberI->GetSurveyObj()->FillFromLocalFile("../Reports/AliceSt3_TC5_1381b.txt");
119 myChamberO = (AliMUONSurveyChamber*)myChamberArray->At(1);
120 myChamberO->GetSurveyObj()->FillFromLocalFile("../Reports/AliceSt3_TC5_1381b.txt");
122 myChamber = myChamberI;
123 myChamber->PrintSurveyReport();
125 // Chamber & DetElems button targets local coordinates
126 AliSurveyObj *lSO = new AliSurveyObj();
127 lSO->FillFromLocalFile("$ALICE_ROOT/MUON/data/MUONTrackingTargetsLocal.txt");
129 // Set survey targets for chambers
130 myChamberI->AddGButtonTargets(Form("%dC_1000",chId+1),4);
131 myChamberI->AddStickerTargets(Form("%dA_702",chId+1),9);
132 myChamberI->AddStickerTargets(Form("%dA_703",chId+1),9);
133 myChamberI->AddStickerTargets(Form("%dC_700",chId+1),9);
134 myChamberI->AddStickerTargets(Form("%dC_701",chId+1),9);
135 myChamberI->AddLButtonTargets(lSO->GetData(),Form("%d_1000",chId+1),4);
136 myChamberO->AddGButtonTargets(Form("%dC_1010",chId+1),4);
137 myChamberO->AddStickerTargets(Form("%dA_700",chId+1),9);
138 myChamberO->AddStickerTargets(Form("%dA_701",chId+1),9);
139 myChamberO->AddStickerTargets(Form("%dC_702",chId+1),9);
140 myChamberO->AddStickerTargets(Form("%dC_703",chId+1),9);
141 myChamberO->AddLButtonTargets(lSO->GetData(),Form("%d_1010",chId+1),4);
143 // Set survey targets for detection elements
144 for (int iCh =0; iCh<=1; iCh++) {
145 myChamber = (AliMUONSurveyChamber*)myChamberArray->At(iCh);
146 for (int iDetElemI=0; iDetElemI<nDetElemsI; iDetElemI++){
147 Int_t iDetElem = iDetElemsOfChamber[iCh][iDetElemI];
148 myChamber->AddSurveyDetElem(iDetElemToDetElemId[iDetElem]);
150 myDetElem = myChamber->GetDetElem(iDetElemI);
152 if(iDetElem<9) baseName = Form("%dA_50%d",chId+1,iDetElem+1);
153 else baseName = Form("%dC_50%d",chId+1,iDetElem+1-9);
154 myDetElem->AddStickerTargets(baseName,9);
155 if(iDetElem<9) baseName = Form("%dA_60%d",chId+1,iDetElem+1);
156 else baseName = Form("%dC_60%d",chId+1,iDetElem+1-9);
157 myDetElem->AddGButtonTargets(baseName,2);
158 if(iDetElemToDetElemId[iDetElem]-500<10) baseName = Form("%d_50%d",chId+1,iDetElemToDetElemId[iDetElem]-500);
159 else baseName = Form("%d_5%d",chId+1,iDetElemToDetElemId[iDetElem]-500);
160 myDetElem->AddLButtonTargets(lSO->GetData(),baseName,2);
164 printf("All targets added! \n");
166 Double_t **lCenDetElem = new Double_t*[nDetElems+nChs];
167 Double_t **lRotDetElem = new Double_t*[nDetElems+nChs];
168 Double_t **lDiffCenDetElem0 = new Double_t*[nDetElems+nChs];
169 Double_t **lDiffRotDetElem0 = new Double_t*[nDetElems+nChs];
170 Double_t **lDiffThCenDetElem0 = new Double_t*[nDetElems+nChs];
171 Double_t **lDiffThRotDetElem0 = new Double_t*[nDetElems+nChs];
172 Double_t **lDeltaDiffCenDetElem0 = new Double_t*[nDetElems+nChs];
173 Double_t **lDeltaDiffRotDetElem0 = new Double_t*[nDetElems+nChs];
175 for (int iDetElem=0; iDetElem<nDetElems+nChs; iDetElem++) {
176 lCenDetElem[iDetElem] = new Double_t[3];
177 lRotDetElem[iDetElem] = new Double_t[3];
178 lDiffCenDetElem0[iDetElem] = new Double_t[3];
179 lDiffRotDetElem0[iDetElem] = new Double_t[3];
180 lDiffThCenDetElem0[iDetElem] = new Double_t[3];
181 lDiffThRotDetElem0[iDetElem] = new Double_t[3];
182 lDeltaDiffCenDetElem0[iDetElem] = new Double_t[3];
183 lDeltaDiffRotDetElem0[iDetElem] = new Double_t[3];
186 TGeoCombiTrans dtrfDetElem[nDetElems+nChs];
187 TGeoCombiTrans localTrfDetElem[nDetElems+nChs];
188 TGeoCombiTrans localTrfThDetElem[nDetElems+nChs];
190 // Import TGeo geometry
191 char* geoFilename = "geometry.root";
192 if ( ! AliGeomManager::GetGeometry() ) {
193 AliGeomManager::LoadGeometry(geoFilename);
194 if (! AliGeomManager::GetGeometry() ) {
195 printf("MUONSurveyCh%d: getting geometry from file %s failed\n", chId+1,geoFilename);
198 cout << "geometry imported" << endl;
201 AliMUONGeometryTransformer *transform = new AliMUONGeometryTransformer();
202 transform->LoadGeometryData();
204 TGeoCombiTrans trfThChamber;
205 TGeoCombiTrans trfThDetElem;
207 for (int iCh =0; iCh<=1; iCh++) {
208 myChamber = (AliMUONSurveyChamber*)myChamberArray->At(iCh);
210 trfThChamber = TGeoCombiTrans(*transform->GetModuleTransformerByDEId(iDetElemToDetElemId[iCh*nDetElemsI])->GetTransformation());
211 trfThChamber.Print();
212 myChamber->SetLocalTransformation(new TGeoCombiTrans(trfThChamber),kTRUE);
214 // Set Chamber plane function
215 cout << "Setting plane for Chamber" << iCh+1 << " ..." << endl;
216 myChamber->SetPlane(Form("fChamber%d",iCh+1));
217 myChamber->SetPlaneParameters(0.,0.,0.);
219 // Fit a plane to sticker targets
220 Double_t lCChi2 = myChamber->FitPlane();
221 cout << "... chi2 = " << lCChi2 << " ..." << endl;
223 // Get best transformation from fitting method
224 // (local to global transformation)
225 cout << "Trying fitting method for chamber " << iCh << endl;
226 myChamber->SurveyToAlign();
227 // myChamber->SurveyToAlign(myChamber->GetPlane()->GetParameter(0),myChamber->GetPlane()->GetParameter(1),myChamber->GetPlane()->GetParError(0),myChamber->GetPlane()->GetParError(1));
229 for (int iDetElemI=0; iDetElemI<nDetElemsI; iDetElemI++){
230 myDetElem = myChamber->GetDetElem(iDetElemI);
231 Int_t iDetElem = iDetElemsOfChamber[iCh][iDetElemI];
233 trfThDetElem.Clear();
234 trfThDetElem = TGeoCombiTrans(*transform->GetDetElement(iDetElemToDetElemId[iDetElem])->GetLocalTransformation());
235 trfThDetElem.Print();
236 myDetElem->SetLocalTransformation(new TGeoCombiTrans(trfThDetElem),kTRUE);
238 for (int iCor=0; iCor<3; iCor++){
239 lCenDetElem[iDetElem][iCor] = 0;
240 lRotDetElem[iDetElem][iCor] = 0;
244 // MONITOR: Draw graph with sticker targets for plane fitting
245 myDetElem->DrawSTargets();
249 // Get DetElem transformation.
250 // Psi and Theta are obtained by fitting a plane to the sticker targets.
251 // Then Xc, Yc, Zc and Phi are obtained by solving the equations to the ref.
252 // syst. transformation of the button targets
254 // Set DetElem plane function
255 cout << "Setting plane for DetElem" << iDetElem+1 << " ..." << endl;
256 myDetElem->SetPlane(Form("fDetElem%d",iDetElem+1));
257 myDetElem->SetPlaneParameters(0.,0.,3.)
259 // Fit a plane to sticker targets
260 Double_t lChi2 = myDetElem->FitPlane();
261 cout << "... chi2 = " << lChi2 << " ..." << endl;
263 lRotDetElem[iDetElem][0]=TMath::ATan(myDetElem->GetPlane()->GetParameter(0));
264 lRotDetElem[iDetElem][1]=TMath::ATan(myDetElem->GetPlane()->GetParameter(1));
266 // Calculate Mean transformation using previous plane fit
267 // and pairs of button targets
268 myDetElem->CalculateMeanTransf(lCenDetElem[iDetElem],lRotDetElem[iDetElem]);
270 cout << "DetElem" << iDetElem+1 << " : mycen(" << lCenDetElem[iDetElem][0] << "," << lCenDetElem[iDetElem][1] << "," << lCenDetElem[iDetElem][2] << "); rot(" << lRotDetElem[iDetElem][0] << "," << lRotDetElem[iDetElem][1] << "," << lRotDetElem[iDetElem][2] << ")" << endl;
273 // Get best transformation from fitting method
274 // (local to global transformation)
275 cout << "Trying fitting method for DetElemId " << iDetElemToDetElemId[iDetElem] << endl;
276 // myDetElem->SurveyToAlign();
277 myDetElem->SurveyToAlign(lRotDetElem[iDetElem][0],lRotDetElem[iDetElem][1],myDetElem->GetPlane()->GetParError(0),myDetElem->GetPlane()->GetParError(1));
281 // Print found transformation of Detection Element (plane fit + loop)
282 for (int iCh =0; iCh<=1; iCh++) {
283 for (int iDetElemI=0; iDetElemI<nDetElemsI; iDetElemI++){
284 Int_t iDetElem = iDetElemsOfChamber[iCh][iDetElemI];
285 cout << "DetElem" << iDetElem+1 << " : mycen(" << lCenDetElem[iDetElem][0] << "," << lCenDetElem[iDetElem][1] << "," << lCenDetElem[iDetElem][2] << "); rot(" << lRotDetElem[iDetElem][0] << "," << lRotDetElem[iDetElem][1] << "," << lRotDetElem[iDetElem][2] << ")" << endl;
289 // Print Theoretical transformation of Detection Element
290 for (int iCh =0; iCh<=1; iCh++) {
291 myChamber = (AliMUONSurveyChamber*)myChamberArray->At(iCh);
292 for (int iDetElemI=0; iDetElemI<nDetElemsI; iDetElemI++){
293 myChamber->GetDetElem(iDetElemI)->PrintLocalTrf();
297 // Print found delta transformation of Detection Element
298 for (int iCh =0; iCh<=1; iCh++) {
299 myChamber = (AliMUONSurveyChamber*)myChamberArray->At(iCh);
300 for (int iDetElemI=0; iDetElemI<nDetElemsI; iDetElemI++){
301 myChamber->GetDetElem(iDetElemI)->PrintAlignTrf();
306 // Compare transformations to expected ones
308 Int_t iDetElemToPos[18] = {0, 16, 2, 14, 4, 12, 6, 10, 8, 9, 7, 11, 5, 13, 3, 15, 1, 17};
310 TGraphErrors *gDeltaDiffCenXDetElem0 = new TGraphErrors(nDetElems);
311 TGraphErrors *gDeltaDiffCenYDetElem0 = new TGraphErrors(nDetElems);
312 TGraphErrors *gDeltaDiffCenZDetElem0 = new TGraphErrors(nDetElems);
313 TGraphErrors *gDeltaDiffPsiDetElem0 = new TGraphErrors(nDetElems);
314 TGraphErrors *gDeltaDiffThtDetElem0 = new TGraphErrors(nDetElems);
315 TGraphErrors *gDeltaDiffPhiDetElem0 = new TGraphErrors(nDetElems);
317 for (int iCh =0; iCh<=1; iCh++) {
318 myChamber = (AliMUONSurveyChamber*)myChamberArray->At(iCh);
319 for (int iDetElemI=0; iDetElemI<nDetElemsI; iDetElemI++){
320 myChamber->GetDetElem(iDetElemI)->GetAlignTrf()->Print();
324 for (int iCh =0; iCh<=1; iCh++) {
325 myChamber = (AliMUONSurveyChamber*)myChamberArray->At(iCh);
326 // Store delta transformations to use for CDB entry creation
327 dtrfDetElem[nDetElems+iCh].Clear();
328 dtrfDetElem[nDetElems+iCh] = *(myChamber->GetAlignTrf());
330 // Those are for checks and visualizations
331 localTrfDetElem[nDetElems+iCh].Clear();
332 localTrfDetElem[nDetElems+iCh] = (*(myChamber->GetLocalTrf())*(*(myChamber->GetAlignTrf())));
333 localTrfDetElem[nDetElems+iCh].Print();
334 lDiffCenDetElem0[nDetElems+iCh] = (Double_t*)localTrfDetElem[nDetElems+iCh].GetTranslation();
335 AliMUONSurveyUtil::MatrixToAngles(localTrfDetElem[nDetElems+iCh].GetRotationMatrix(),lDiffRotDetElem0[nDetElems+iCh]);
337 localTrfThDetElem[nDetElems+iCh].Clear();
338 localTrfThDetElem[nDetElems+iCh] = (*(myChamber->GetLocalTrf()));
339 localTrfThDetElem[nDetElems+iCh].Print();
340 lDiffThCenDetElem0[nDetElems+iCh] = (Double_t*)localTrfThDetElem[nDetElems+iCh].GetTranslation();
341 AliMUONSurveyUtil::MatrixToAngles(localTrfThDetElem[nDetElems+iCh].GetRotationMatrix(),lDiffThRotDetElem0[nDetElems+iCh]);
343 for (int iCor=0; iCor<3; iCor++){
344 lDeltaDiffCenDetElem0[nDetElems+iCh][iCor] = lDiffCenDetElem0[nDetElems+iCh][iCor]-lDiffThCenDetElem0[nDetElems+iCh][iCor];
345 lDeltaDiffRotDetElem0[nDetElems+iCh][iCor] = lDiffRotDetElem0[nDetElems+iCh][iCor]-lDiffThRotDetElem0[nDetElems+iCh][iCor];
346 if (lDeltaDiffRotDetElem0[nDetElems+iCh][iCor]>TMath::Pi()) lDeltaDiffRotDetElem0[nDetElems+iCh][iCor]-=TMath::TwoPi();
347 if (lDeltaDiffRotDetElem0[nDetElems+iCh][iCor]<-TMath::Pi()) lDeltaDiffRotDetElem0[nDetElems+iCh][iCor]+=TMath::TwoPi();
350 for (int iDetElemI=0; iDetElemI<nDetElemsI; iDetElemI++){
351 Int_t iDetElem = iDetElemsOfChamber[iCh][iDetElemI];
352 myDetElem = myChamber->GetDetElem(iDetElemI);
353 // Store delta transformations to use for CDB entry creation
354 dtrfDetElem[iDetElem].Clear();
355 dtrfDetElem[iDetElem] = *(myDetElem->GetAlignTrf());
357 // Those are for checks and visualizations
358 localTrfDetElem[iDetElem].Clear();
359 localTrfDetElem[iDetElem] = (*(myDetElem->GetLocalTrf())*(*(myDetElem->GetAlignTrf())));
360 // localTrfDetElem[iDetElem] = (*(myDetElem->GetBaseTrf())*(*(myDetElem->GetAlignTrf())));
361 localTrfDetElem[iDetElem].Print();
362 lDiffCenDetElem0[iDetElem] = (Double_t*)localTrfDetElem[iDetElem].GetTranslation();
363 AliMUONSurveyUtil::MatrixToAngles(localTrfDetElem[iDetElem].GetRotationMatrix(),lDiffRotDetElem0[iDetElem]);
364 // lDiffCenDetElem0[iDetElem] = lCenDetElem[iDetElem];
365 // lDiffRotDetElem0[iDetElem] = lRotDetElem[iDetElem];
367 localTrfThDetElem[iDetElem].Clear();
368 localTrfThDetElem[iDetElem] = (*(myDetElem->GetLocalTrf()));
369 // localTrfThDetElem[iDetElem] = (*(myDetElem->GetBaseTrf()));
370 localTrfThDetElem[iDetElem].Print();
371 lDiffThCenDetElem0[iDetElem] = (Double_t*)localTrfThDetElem[iDetElem].GetTranslation();
372 AliMUONSurveyUtil::MatrixToAngles(localTrfThDetElem[iDetElem].GetRotationMatrix(),lDiffThRotDetElem0[iDetElem]);
374 for (int iCor=0; iCor<3; iCor++){
375 lDeltaDiffCenDetElem0[iDetElem][iCor] = lDiffCenDetElem0[iDetElem][iCor]-lDiffThCenDetElem0[iDetElem][iCor];
376 lDeltaDiffRotDetElem0[iDetElem][iCor] = lDiffRotDetElem0[iDetElem][iCor]-lDiffThRotDetElem0[iDetElem][iCor];
377 if (lDeltaDiffRotDetElem0[iDetElem][iCor]>TMath::Pi()) lDeltaDiffRotDetElem0[iDetElem][iCor]-=TMath::TwoPi();
378 if (lDeltaDiffRotDetElem0[iDetElem][iCor]<-TMath::Pi()) lDeltaDiffRotDetElem0[iDetElem][iCor]+=TMath::TwoPi();
381 gDeltaDiffCenXDetElem0->SetPoint(iDetElem,1e1*lDeltaDiffCenDetElem0[iDetElem][0],iDetElemToPos[iDetElem]+1);
382 gDeltaDiffCenYDetElem0->SetPoint(iDetElem,1e1*lDeltaDiffCenDetElem0[iDetElem][1],iDetElemToPos[iDetElem]+1);
383 gDeltaDiffCenZDetElem0->SetPoint(iDetElem,1e1*lDeltaDiffCenDetElem0[iDetElem][2],iDetElemToPos[iDetElem]+1);
384 gDeltaDiffPsiDetElem0->SetPoint(iDetElem,1e3*lDeltaDiffRotDetElem0[iDetElem][0],iDetElemToPos[iDetElem]+1);
385 gDeltaDiffThtDetElem0->SetPoint(iDetElem,1e3*lDeltaDiffRotDetElem0[iDetElem][1],iDetElemToPos[iDetElem]+1);
386 gDeltaDiffPhiDetElem0->SetPoint(iDetElem,1e3*lDeltaDiffRotDetElem0[iDetElem][2],iDetElemToPos[iDetElem]+1);
387 gDeltaDiffCenXDetElem0->SetPointError(iDetElem,1e1*myDetElem->GetFitter()->GetParError(0),0.);
388 gDeltaDiffCenYDetElem0->SetPointError(iDetElem,1e1*myDetElem->GetFitter()->GetParError(1),0.);
389 gDeltaDiffCenZDetElem0->SetPointError(iDetElem,1e1*myDetElem->GetFitter()->GetParError(2),0.);
390 gDeltaDiffPsiDetElem0->SetPointError(iDetElem,1e3*myDetElem->GetFitter()->GetParError(3),0.);
391 gDeltaDiffThtDetElem0->SetPointError(iDetElem,1e3*myDetElem->GetFitter()->GetParError(4),0.);
392 gDeltaDiffPhiDetElem0->SetPointError(iDetElem,1e3*myDetElem->GetFitter()->GetParError(5),0.);
396 // Apply the found misalignments to the geometry
397 AliMUONGeometryTransformer *newTransform = AliMUONSurveyUtil::ReAlign(transform,chId,nDetElems,iDetElemPseudoIdToDetElem,dtrfDetElem,true);
398 newTransform->WriteTransformations(Form("transform2ReAlignSurveyCh%d.dat",chId+1));
401 // Generate realigned data in local cdb
402 const TClonesArray* array = newTransform->GetMisAlignmentData();
404 // Set the alignment resolution in the align objects for this chamber
405 Double_t chResX = myChamberI->GetAlignResX();
406 Double_t chResY = myChamberI->GetAlignResY();
407 Double_t deResX = (myChamberI->GetMeanDetElemAlignResX()+myChamberO->GetMeanDetElemAlignResX())/2.;
408 Double_t deResY = (myChamberI->GetMeanDetElemAlignResY()+myChamberO->GetMeanDetElemAlignResY())/2.;
409 printf("Chamber alignment resolutions: resX=%f , resY=%f\n",chResX,chResY);
410 printf("Detection Elements alignment resolutions: resX=%f , resY=%f\n",deResX,deResY);
411 chResX = TMath::Sqrt(0.1*0.1+chResX*chResX);
412 chResY = TMath::Sqrt(0.1*0.1+chResY*chResY);
413 AliMUONSurveyUtil::SetAlignmentResolution(array,chId,chResX,chResY,deResX,deResY);
416 AliCDBManager* cdbManager = AliCDBManager::Instance();
417 cdbManager->SetDefaultStorage(Form("local://ReAlignSurveyCh%dCDB",chId+1));
419 AliCDBMetaData* cdbData = new AliCDBMetaData();
420 cdbData->SetResponsible("Dimuon Offline project");
421 cdbData->SetComment("MUON alignment objects with survey realignment");
422 AliCDBId id("MUON/Align/Data", 0, AliCDBRunRange::Infinity());
423 cdbManager->Put(const_cast<TClonesArray*>(array), id, cdbData);
426 for(Int_t iCor=0; iCor<3; iCor++){
427 for(Int_t iDetElem=0; iDetElem<nDetElems; iDetElem++){
428 cout << lDeltaDiffCenDetElem0[iDetElem][iCor] << " " << lDiffCenDetElem0[iDetElem][iCor] << " " << lDiffThCenDetElem0[iDetElem][iCor] << endl;
433 for(Int_t iCor=0; iCor<3; iCor++){
434 for(Int_t iDetElem=0; iDetElem<nDetElems; iDetElem++){
435 cout << lDeltaDiffRotDetElem0[iDetElem][iCor] << " " << lDiffRotDetElem0[iDetElem][iCor] << " " << lDiffThRotDetElem0[iDetElem][iCor] << endl;
440 TH1F *myDetElemDeltaDiffCenX = new TH1F("myDetElemDeltaDiffCenX","myDetElemDeltaDiffCenX",100,-10,10);
441 myDetElemDeltaDiffCenX->SetMaximum(nDetElems+1);
442 myDetElemDeltaDiffCenX->SetMinimum(0);
443 TH1F *myDetElemDeltaDiffCenY = new TH1F("myDetElemDeltaDiffCenY","myDetElemDeltaDiffCenY",100,-10,10);
444 myDetElemDeltaDiffCenY->SetMaximum(nDetElems+1);
445 myDetElemDeltaDiffCenY->SetMinimum(0);
446 TH1F *myDetElemDeltaDiffCenZ = new TH1F("myDetElemDeltaDiffCenZ","myDetElemDeltaDiffCenZ",100,-30,30);
447 myDetElemDeltaDiffCenZ->SetMaximum(nDetElems+1);
448 myDetElemDeltaDiffCenZ->SetMinimum(0);
450 TH1F *myDetElemDeltaDiffRotX = new TH1F("myDetElemDeltaDiffRotX","myDetElemDeltaDiffRotX",100,-15,15);
451 myDetElemDeltaDiffRotX->SetMaximum(nDetElems+1);
452 myDetElemDeltaDiffRotX->SetMinimum(0);
453 TH1F *myDetElemDeltaDiffRotY = new TH1F("myDetElemDeltaDiffRotY","myDetElemDeltaDiffRotY",100,-15,15);
454 myDetElemDeltaDiffRotY->SetMaximum(nDetElems+1);
455 myDetElemDeltaDiffRotY->SetMinimum(0);
456 TH1F *myDetElemDeltaDiffRotZ = new TH1F("myDetElemDeltaDiffRotZ","myDetElemDeltaDiffRotZ",100,-5,5);
457 myDetElemDeltaDiffRotZ->SetMaximum(nDetElems+1);
458 myDetElemDeltaDiffRotZ->SetMinimum(0);
461 // ******** Starting plots
465 TPaveLabel *theTitle;
466 gStyle->SetPalette(1);
471 ps = new TPostScript(Form("surveyChamber%d",chId+1),filetype);
475 // Observed misalignments
476 str = Form("Chamber %d",chId+1);
477 TCanvas *cvn2 = new TCanvas("cvn2",str,cWidth,cHeight);
479 canvas->Range(0,0,21,29);
481 title = Form(" MisAlignments Chamber %d - PL2G - In Frame ",chId+1);
482 TPaveLabel *theTitle2 = new TPaveLabel(3,27.0,18,28.5,title,"br");
483 theTitle = theTitle2;
484 theTitle->SetFillColor(18);
485 theTitle->SetTextFont(32);
486 theTitle->SetTextSize(0.4);
487 theTitle->SetTextColor(1);
490 TPad *pad2 = new TPad("pad2","pad2",0.01,0.01,0.98,0.91,0);
493 TLine *ch0Line = new TLine(0,1,0,2);
494 TLine *ch1Line = new TLine(0,1,0,2);
495 ch1Line->SetLineStyle(2);
499 myDetElemDeltaDiffCenX->Draw();
500 myDetElemDeltaDiffCenX->SetXTitle("#Delta[xc_{i}^{m}-xc_{i}^{th}] (mm)");
501 myDetElemDeltaDiffCenX->SetYTitle("DetElem arbitrary ordering");
502 gDeltaDiffCenXDetElem0->SetMarkerStyle(20);
503 gDeltaDiffCenXDetElem0->Draw("P");
504 ch0Line->DrawLine(1e1*lDeltaDiffCenDetElem0[nDetElems+0][0],0.5,1e1*lDeltaDiffCenDetElem0[nDetElems+0][0],9.5);
505 ch1Line->DrawLine(1e1*lDeltaDiffCenDetElem0[nDetElems+1][0],9.5,1e1*lDeltaDiffCenDetElem0[nDetElems+1][0],18.5);
508 myDetElemDeltaDiffCenY->Draw();
509 myDetElemDeltaDiffCenY->SetXTitle("#Delta[yc_{i}^{m}-yc_{i}^{th}] (mm)");
510 myDetElemDeltaDiffCenY->SetYTitle("DetElem arbitrary ordering");
511 gDeltaDiffCenYDetElem0->SetMarkerStyle(20);
512 gDeltaDiffCenYDetElem0->Draw("P");
513 ch0Line->DrawLine(1e1*lDeltaDiffCenDetElem0[nDetElems+0][1],0.5,1e1*lDeltaDiffCenDetElem0[nDetElems+0][1],9.5);
514 ch1Line->DrawLine(1e1*lDeltaDiffCenDetElem0[nDetElems+1][1],9.5,1e1*lDeltaDiffCenDetElem0[nDetElems+1][1],18.5);
517 myDetElemDeltaDiffCenZ->Draw();
518 myDetElemDeltaDiffCenZ->SetXTitle("#Delta[zc_{i}^{m}-zc_{i}^{th}] (mm)");
519 myDetElemDeltaDiffCenZ->SetYTitle("DetElem arbitrary ordering");
520 gDeltaDiffCenZDetElem0->SetMarkerStyle(20);
521 gDeltaDiffCenZDetElem0->Draw("P");
522 ch0Line->DrawLine(1e1*lDeltaDiffCenDetElem0[nDetElems+0][2],0.5,1e1*lDeltaDiffCenDetElem0[nDetElems+0][2],9.5);
523 ch1Line->DrawLine(1e1*lDeltaDiffCenDetElem0[nDetElems+1][2],9.5,1e1*lDeltaDiffCenDetElem0[nDetElems+1][2],18.5);
526 myDetElemDeltaDiffRotX->Draw();
527 myDetElemDeltaDiffRotX->SetXTitle("#Delta[#psi_{i}^{m}-#psi_{i}^{th}] (mrad)");
528 myDetElemDeltaDiffRotX->SetYTitle("DetElem arbitrary ordering");
529 gDeltaDiffPsiDetElem0->SetMarkerStyle(20);
530 gDeltaDiffPsiDetElem0->Draw("P");
531 ch0Line->DrawLine(1e3*lDeltaDiffRotDetElem0[nDetElems+0][0],0.5,1e3*lDeltaDiffRotDetElem0[nDetElems+0][0],9.5);
532 ch1Line->DrawLine(1e3*lDeltaDiffRotDetElem0[nDetElems+1][0],9.5,1e3*lDeltaDiffRotDetElem0[nDetElems+1][0],18.5);
535 myDetElemDeltaDiffRotY->Draw();
536 myDetElemDeltaDiffRotY->SetXTitle("#Delta[#theta_{i}^{m}-#theta_{i}^{th}] (mrad)");
537 myDetElemDeltaDiffRotY->SetYTitle("DetElem arbitrary ordering");
538 gDeltaDiffThtDetElem0->SetMarkerStyle(20);
539 gDeltaDiffThtDetElem0->Draw("P");
540 ch0Line->DrawLine(1e3*lDeltaDiffRotDetElem0[nDetElems+0][1],0.5,1e3*lDeltaDiffRotDetElem0[nDetElems+0][1],9.5);
541 ch1Line->DrawLine(1e3*lDeltaDiffRotDetElem0[nDetElems+1][1],9.5,1e3*lDeltaDiffRotDetElem0[nDetElems+1][1],18.5);
544 myDetElemDeltaDiffRotZ->Draw();
545 myDetElemDeltaDiffRotZ->SetXTitle("#Delta[#phi_{i}^{m}-#phi_{i}^{th}] (mrad)");
546 myDetElemDeltaDiffRotZ->SetYTitle("DetElem arbitrary ordering");
547 gDeltaDiffPhiDetElem0->SetMarkerStyle(20);
548 gDeltaDiffPhiDetElem0->Draw("P");
549 ch0Line->DrawLine(1e3*lDeltaDiffRotDetElem0[nDetElems+0][2],0.5,1e3*lDeltaDiffRotDetElem0[nDetElems+0][2],9.5);
550 ch1Line->DrawLine(1e3*lDeltaDiffRotDetElem0[nDetElems+1][2],9.5,1e3*lDeltaDiffRotDetElem0[nDetElems+1][2],18.5);
555 // MONITOR: Histograms for monitoring
556 TH2F *hCPSTa = new TH2F("hCPSTa","hCPSTa",100,-200,200,100,-200,200);
557 TH2F *hCPSTc = new TH2F("hCPSTc","hCPSTc",100,-200,200,100,-200,200);
558 TH2F *hSSTa = new TH2F("hSSTa","hSSTa",200,-200,200,200,-200,200);
559 TH2F *hSSTc = new TH2F("hSSTc","hSSTc",200,-200,200,200,-200,200);
560 TH2F *hSSTap = new TH2F("hSSTap","hSSTap",800,-200,200,800,-200,200);
561 TH2F *hSSTcp = new TH2F("hSSTcp","hSSTcp",800,-200,200,800,-200,200);
563 // MONITOR: Fill histograms with chambers and slats sticker target positions
564 for (int iCh =0; iCh<=1; iCh++) {
565 myChamber = (AliMUONSurveyChamber*)myChamberArray->At(iCh);
566 cout << "Filling histograms of sticker target for chamber" << iCh+1 << " ..." << endl;
567 myChamber->FillCPSTHistograms(TString("C"),hCPSTc,TString("A"),hCPSTa);
568 myChamber->FillDESTHistograms(TString("C"),hSSTc,TString("A"),hSSTa);
570 for (int iDetElemI=0; iDetElemI<nDetElemsI; iDetElemI++){
571 // Int_t iDetElem = iDetElemsOfChamber[iCh][iDetElemI];
572 myDetElem = myChamber->GetDetElem(iDetElemI);
573 // MONITOR: Fill slat plane for fit monitor.
574 Double_t pl[3] = {0};
575 Double_t pg[3] = {0};
576 AliSurveyPoint *pointSBT0 = myDetElem->GetLButtonTarget(0);
577 AliSurveyPoint *pointSBT1 = myDetElem->GetLButtonTarget(1);
578 if(pointSBT0&&pointSBT1) {
579 if (pointSBT0->GetX()>pointSBT1->GetX()){
580 pointSBT0=myDetElem->GetLButtonTarget(1);
581 pointSBT1=myDetElem->GetLButtonTarget(0);
583 Double_t lX = pointSBT0->GetX();
584 while(lX<pointSBT1->GetX()){
585 Double_t lY = pointSBT0->GetY()-20;
586 while(lY<pointSBT0->GetY()+20){
587 pl[0] = lX; pl[1] = lY; pl[2] = 0.;
588 (TGeoCombiTrans((*(myDetElem->GetBaseTrf()))*(*(myDetElem->GetAlignTrf())))).LocalToMaster(pl,pg);
589 if(myDetElem->GetGButtonTarget(0)->GetPointName().Contains("A")){
590 if (hSSTap->GetBinContent(hSSTap->FindBin(pg[0],pg[1]))==0)
591 hSSTap->Fill(pg[0],pg[1],-pg[2]);
594 if (hSSTcp->GetBinContent(hSSTcp->FindBin(pg[0],pg[1]))==0)
595 hSSTcp->Fill(pg[0],pg[1],-pg[2]);
597 lY+=hSSTap->GetYaxis()->GetBinWidth(1);
599 lX+=hSSTap->GetXaxis()->GetBinWidth(1);
610 str = Form("Chamber %d - side A",chId+1);
611 TCanvas *cvn0 = new TCanvas("cvn0",str,cWidth,cHeight);
613 canvas->Range(0,0,21,29);
615 title = Form(" Deformations of chamber %d - View from side A ",chId+1);
616 TPaveLabel *theTitle0 = new TPaveLabel(3,27.0,18,28.5,title,"br");
617 theTitle = theTitle0;
618 theTitle->SetFillColor(18);
619 theTitle->SetTextFont(32);
620 theTitle->SetTextSize(0.4);
621 theTitle->SetTextColor(1);
624 TPad *pad0 = new TPad("pad0","pad0",0.01,0.01,0.98,0.91,0);
632 lMin = hCPSTa->GetMinimum(0);
633 hCPSTa->SetMinimum(TMath::Floor(lMin));
634 lMax = hCPSTa->GetMaximum();
635 hCPSTa->SetMaximum(TMath::Ceil(lMax));
636 hCPSTa->Draw("lego2z");
639 lMin = hSSTa->GetMinimum(0);
640 hSSTa->SetMinimum(TMath::Floor(lMin));
641 lMax = hSSTa->GetMaximum();
642 hSSTa->SetMaximum(TMath::Ceil(lMax));
643 hSSTa->Draw("lego2z");
648 lMin = hSSTap->GetMinimum(0);
649 hSSTap->SetMinimum(TMath::Floor(lMin));
650 lMax = hSSTap->GetMaximum();
651 hSSTap->SetMaximum(TMath::Ceil(lMax));
652 hSSTap->Draw("surf2z");
659 // Inv Mass, Multiplicity
660 str = Form("Chamber %d - side C",chId+1);
661 TCanvas *cvn1 = new TCanvas("cvn1",str,cWidth,cHeight);
663 canvas->Range(0,0,21,29);
665 title = Form(" Deformations of chamber %d - View from side C ",chId+1);
666 TPaveLabel *theTitle1 = new TPaveLabel(3,27.0,18,28.5,title,"br");
667 theTitle = theTitle1;
668 theTitle->SetFillColor(18);
669 theTitle->SetTextFont(32);
670 theTitle->SetTextSize(0.4);
671 theTitle->SetTextColor(1);
674 TPad *pad1 = new TPad("pad1","pad1",0.01,0.01,0.98,0.91,0);
680 lMin = hCPSTc->GetMinimum(0);
681 hCPSTc->SetMinimum(TMath::Floor(lMin));
682 lMax = hCPSTc->GetMaximum();
683 hCPSTc->SetMaximum(TMath::Ceil(lMax));
684 hCPSTc->Draw("lego2z");
687 lMin = hSSTc->GetMinimum(0);
688 hSSTc->SetMinimum(TMath::Floor(lMin));
689 lMax = hSSTc->GetMaximum();
690 hSSTc->SetMaximum(TMath::Ceil(lMax));
691 hSSTc->Draw("lego2z");
696 lMin = hSSTcp->GetMinimum(0);
697 hSSTcp->SetMinimum(TMath::Floor(lMin));
698 lMax = hSSTcp->GetMaximum();
699 hSSTcp->SetMaximum(TMath::Ceil(lMax));
700 hSSTcp->Draw("surf2z");
708 TFile *hFile = new TFile(Form("spCH%d_PL2G_IF.root",chId+1),"RECREATE");
709 gDeltaDiffCenXDetElem0->Write("gDeltaDiffCenXDetElem0");
710 gDeltaDiffCenYDetElem0->Write("gDeltaDiffCenYDetElem0");
711 gDeltaDiffCenZDetElem0->Write("gDeltaDiffCenZDetElem0");
712 gDeltaDiffPsiDetElem0->Write("gDeltaDiffPsiDetElem0");
713 gDeltaDiffThtDetElem0->Write("gDeltaDiffThtDetElem0");
714 gDeltaDiffPhiDetElem0->Write("gDeltaDiffPhiDetElem0");
715 myDetElemDeltaDiffCenX->Write();
716 myDetElemDeltaDiffCenY->Write();
717 myDetElemDeltaDiffCenZ->Write();
718 myDetElemDeltaDiffRotX->Write();
719 myDetElemDeltaDiffRotY->Write();
720 myDetElemDeltaDiffRotZ->Write();