]>
Commit | Line | Data |
---|---|---|
f1b02822 | 1 | #if !defined(__CINT__) || defined(__MAKECINT__) |
2 | #include <TStyle.h> | |
3 | #include <TGrid.h> | |
4 | #include <TCanvas.h> | |
5 | #include <TH2D.h> | |
6 | #include <TLine.h> | |
7 | #include <TView.h> | |
8 | #include <TMath.h> | |
9 | #include <TGeoManager.h> | |
10 | #include "AliITSOnlineCalibrationSPDhandler.h" | |
11 | #include "AliCDBManager.h" | |
12 | #include "AliGeomManager.h" | |
13 | #include "AliITSAlignMille2Module.h" | |
14 | #endif | |
15 | ||
16 | void Draw3D(AliITSOnlineCalibrationSPDhandler *h); | |
17 | ||
18 | void ShowSPDConfiguration(Int_t runNb=0, const char *ocdblocation="local://$ALICE_ROOT/OCDB", bool grid=kFALSE,bool threed=kFALSE){ | |
19 | ||
20 | ||
21 | gStyle->SetOptStat(0); | |
22 | ||
23 | if(grid){ | |
24 | TGrid::Connect("alien://"); | |
25 | if(!gGrid){ | |
26 | printf("no grid connection is available, exiting.\n"); | |
27 | return; | |
28 | } | |
29 | } | |
30 | AliITSOnlineCalibrationSPDhandler *h = new AliITSOnlineCalibrationSPDhandler(); | |
31 | h->ReadDeadFromDB(runNb,ocdblocation); | |
32 | AliCDBManager::Instance(); | |
33 | AliCDBManager::Instance()->SetRun(runNb); | |
34 | AliCDBManager::Instance()->SetDefaultStorage(ocdblocation); | |
35 | AliGeomManager::LoadGeometry(); | |
36 | ||
37 | if(threed) { | |
38 | Draw3D(h); | |
39 | return; | |
40 | } | |
41 | ||
42 | Double_t nact[2]={0.,0.}; | |
43 | ||
44 | TCanvas *c = new TCanvas("c","Active Modules ",500,700); | |
45 | c->Divide(1,2); | |
46 | c->cd(1); | |
47 | TH2D *hPhiZInner = new TH2D("hPhiZInner","Inner layer Active Modules ",200,-20,20,3,0,2*TMath::Pi()); | |
48 | hPhiZInner->SetXTitle("Z (cm)"); | |
49 | hPhiZInner->SetYTitle("#varphi (rad)"); | |
50 | hPhiZInner->Draw(); | |
51 | ||
52 | for(Int_t i=0; i<80; i++){ | |
53 | if((h->GetNrBad(i))<1) { | |
54 | TGeoHMatrix matrix; | |
55 | int vid = AliITSAlignMille2Module::GetVolumeIDFromIndex(i); | |
56 | AliITSAlignMille2Module::SensVolMatrix(vid,&matrix); | |
57 | Double_t local0[3],local1[3],local2[3],local3[3]; // local position of the four angles | |
58 | local0[0]=-0.6375; local0[1]=0; local0[2]= 3.48; | |
59 | local1[0]=-0.6375; local1[1]=0; local1[2]= -3.48; | |
60 | local2[0]=0.6375; local2[1]=0; local2[2]= -3.48; | |
61 | local2[0]=0.6375; local3[1]=0; local3[2]= 3.48; | |
62 | Double_t global0[3],global1[3],global2[3],global3[3]; | |
63 | matrix.LocalToMaster(local0,global0); | |
64 | matrix.LocalToMaster(local1,global1); | |
65 | matrix.LocalToMaster(local2,global2); | |
66 | matrix.LocalToMaster(local3,global3); | |
67 | Double_t phiUp = atan2(global0[1],global0[0]); | |
68 | if(phiUp<0) phiUp+=2*TMath::Pi(); | |
69 | Double_t phiDown = atan2(global2[1],global2[0]); | |
70 | if(phiDown<0) phiDown+=2*TMath::Pi(); | |
71 | TLine *lhor1 = new TLine(global0[2],phiDown,global1[2],phiDown); lhor1->Draw("same"); | |
72 | lhor1->SetLineColor(kBlue); | |
73 | lhor1->SetLineWidth(3); | |
74 | TLine *lver1 = new TLine(global1[2],phiDown,global2[2],phiUp); lver1->Draw("same"); | |
75 | lver1->SetLineColor(kBlue); | |
76 | lver1->SetLineWidth(3); | |
77 | TLine *lhor2 = new TLine(global2[2],phiUp,global3[2],phiUp); lhor2->Draw("same"); | |
78 | lhor2->SetLineColor(kBlue); | |
79 | lhor2->SetLineWidth(3); | |
80 | TLine *lver2 = new TLine(global3[2],phiUp,global0[2],phiDown); lver2->Draw("same"); | |
81 | lver2->SetLineColor(kBlue); | |
82 | lver2->SetLineWidth(3); | |
83 | nact[0]++; | |
84 | } | |
85 | } | |
86 | c->cd(2); | |
87 | ||
88 | TH2D *hPhiZOuter = new TH2D("hPhiZOuter","Outer layer Active Modules ",200,-20,20,3,0,2*TMath::Pi()); | |
89 | hPhiZOuter->SetXTitle("Z (cm)"); | |
90 | hPhiZOuter->SetYTitle("#varphi (rad)"); | |
91 | hPhiZOuter->Draw(); | |
92 | for(Int_t i=80; i<240; i++){ | |
93 | TGeoHMatrix matrix; | |
94 | int vid = AliITSAlignMille2Module::GetVolumeIDFromIndex(i); | |
95 | AliITSAlignMille2Module::SensVolMatrix(vid,&matrix); | |
96 | Double_t local[4][3]; // local position of the four angles | |
97 | local[0][0]=0.6375; local[0][1]=0; local[0][2]= -3.48; | |
98 | local[1][0]=0.6375; local[1][1]=0; local[1][2]= 3.48; | |
99 | local[2][0]=-0.6375; local[2][1]=0; local[2][2]= 3.48; | |
100 | local[2][0]=-0.6375; local[3][1]=0; local[3][2]= -3.48; | |
101 | Double_t global[4][3]; | |
102 | for(Int_t j=0; j<4; j++){ | |
103 | matrix.LocalToMaster(local[j],global[j]); | |
104 | } | |
105 | Double_t phiUp = atan2(global[0][1],global[0][0]); | |
106 | if(phiUp<0) phiUp+=2*TMath::Pi(); | |
107 | Double_t phiDown = atan2(global[2][1],global[2][0]); | |
108 | if(phiDown<0) phiDown+=2*TMath::Pi(); | |
109 | if(i>235) if(phiUp < 0.1) phiUp = TMath::Pi()*2; | |
110 | // printf("module %i - phiDown %f phiUp %f \n",i,phiDown,phiUp); | |
111 | if((h->GetNrBad(i))<1) { | |
112 | TLine *lhor1 = new TLine(global[0][2],phiUp,global[1][2],phiUp); lhor1->Draw("same"); | |
113 | lhor1->SetLineColor(kBlue); | |
114 | lhor1->SetLineWidth(2); | |
115 | TLine *lver1 = new TLine(global[1][2],phiUp,global[2][2],phiDown); lver1->Draw("same"); | |
116 | lver1->SetLineColor(kBlue); | |
117 | lver1->SetLineWidth(2); | |
118 | TLine *lhor2 = new TLine(global[2][2],phiDown,global[3][2],phiDown); lhor2->Draw("same"); | |
119 | lhor2->SetLineColor(kBlue); | |
120 | lhor2->SetLineWidth(2); | |
121 | TLine *lver2 = new TLine(global[3][2],phiDown,global[0][2],phiUp); lver2->Draw("same"); | |
122 | lver2->SetLineColor(kBlue); | |
123 | lver2->SetLineWidth(2); | |
124 | nact[1]++; | |
125 | } | |
126 | } | |
127 | printf(" \n Number of Active SPD modules (->Total) : inner %3.0f (80) %f - outer %3.0f (160) %f \n",nact[0],nact[0]/80.,nact[1],nact[1]/160.); | |
128 | c->SaveAs(Form("active%i.png",runNb)); | |
129 | } | |
130 | ||
131 | ||
132 | void Draw3D(AliITSOnlineCalibrationSPDhandler *h){ | |
133 | ||
134 | TGeoHMatrix m2t[240]; | |
135 | for(Int_t imod=0; imod<240; imod++){ | |
136 | int vid = AliITSAlignMille2Module::GetVolumeIDFromIndex(imod); | |
137 | AliITSAlignMille2Module::SensVolMatrix(vid,&m2t[imod]); | |
138 | } | |
139 | ||
140 | delete gGeoManager; | |
141 | ||
142 | new TGeoManager("SPD","active"); | |
143 | ||
144 | TGeoMaterial *vacuum = new TGeoMaterial("vacuum",0,0,0); | |
145 | TGeoMedium *none = new TGeoMedium("Vacuum",0,vacuum); | |
146 | TGeoVolume *top = gGeoManager->MakeBox("TOP",none,500,500,500); | |
147 | gGeoManager->SetTopVolume(top); | |
148 | ||
149 | TGeoVolume *ladder = gGeoManager->MakeBox("ladder",none,0.6375,0.001/2,3.48); | |
150 | ||
151 | Int_t nActive[2]={0,0}; | |
152 | for(Int_t imod=0; imod<240; imod++){ | |
153 | TGeoRotation *rot = new TGeoRotation(); | |
154 | rot->SetMatrix(m2t[imod].GetRotationMatrix()); | |
155 | TGeoCombiTrans *matrix = new TGeoCombiTrans(m2t[imod].GetTranslation()[0],m2t[imod].GetTranslation()[1],m2t[imod].GetTranslation()[2],rot); | |
156 | if((40960-h->GetNrBad(imod))>0) { | |
157 | top->AddNode(ladder,imod,matrix); | |
158 | if(imod<80) nActive[0]++; | |
159 | else nActive[1]++; | |
160 | } | |
161 | } | |
162 | ||
163 | printf(" \n\n Number of Active SPD modules (->Total) : inner %i (80) outer %i (160) \n\n\n",nActive[0],nActive[1]); | |
164 | gGeoManager->CloseGeometry(); | |
165 | top->Draw("ogl"); | |
166 | gPad->GetView()->ShowAxis(); | |
167 | ||
168 | } | |
169 |