ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TStyle.h>
#include <TGrid.h>
#include <TCanvas.h>
#include <TH2D.h>
#include <TLine.h>
#include <TView.h>
#include <TMath.h>
#include <TGeoManager.h>
#include "AliITSOnlineCalibrationSPDhandler.h"
#include "AliCDBManager.h"
#include "AliGeomManager.h"
#include "AliITSAlignMille2Module.h"
#endif

void Draw3D(AliITSOnlineCalibrationSPDhandler *h);

void ShowSPDConfiguration(Int_t runNb=0, const char *ocdblocation="local://$ALICE_ROOT/OCDB", bool grid=kFALSE,bool threed=kFALSE){


  gStyle->SetOptStat(0);

  if(grid){
    TGrid::Connect("alien://");
    if(!gGrid){
      printf("no grid connection is available, exiting.\n");
      return;
    }
  }
  AliITSOnlineCalibrationSPDhandler *h = new AliITSOnlineCalibrationSPDhandler();
  h->ReadDeadFromDB(runNb,ocdblocation);
  AliCDBManager::Instance();
  AliCDBManager::Instance()->SetRun(runNb);
  AliCDBManager::Instance()->SetDefaultStorage(ocdblocation);
  AliGeomManager::LoadGeometry();

  if(threed) {
    Draw3D(h);  
    return;
  }

  Double_t nact[2]={0.,0.};

  TCanvas *c = new TCanvas("c","Active Modules ",500,700);
  c->Divide(1,2);
  c->cd(1);
  TH2D *hPhiZInner = new TH2D("hPhiZInner","Inner layer Active Modules ",200,-20,20,3,0,2*TMath::Pi());
  hPhiZInner->SetXTitle("Z (cm)");
  hPhiZInner->SetYTitle("#varphi (rad)");
  hPhiZInner->Draw();

  for(Int_t i=0; i<80; i++){
    if((h->GetNrBad(i))<1) {
      TGeoHMatrix matrix;
      int vid = AliITSAlignMille2Module::GetVolumeIDFromIndex(i);
      AliITSAlignMille2Module::SensVolMatrix(vid,&matrix);
      Double_t local0[3],local1[3],local2[3],local3[3]; // local position of the four angles
      local0[0]=-0.6375; local0[1]=0; local0[2]= 3.48; 
      local1[0]=-0.6375; local1[1]=0; local1[2]= -3.48; 
      local2[0]=0.6375; local2[1]=0; local2[2]= -3.48; 
      local2[0]=0.6375; local3[1]=0; local3[2]= 3.48; 
      Double_t global0[3],global1[3],global2[3],global3[3];
      matrix.LocalToMaster(local0,global0);
      matrix.LocalToMaster(local1,global1);
      matrix.LocalToMaster(local2,global2);
      matrix.LocalToMaster(local3,global3);
      Double_t phiUp = atan2(global0[1],global0[0]);
      if(phiUp<0) phiUp+=2*TMath::Pi();
      Double_t phiDown = atan2(global2[1],global2[0]);
      if(phiDown<0) phiDown+=2*TMath::Pi();
      TLine *lhor1 = new TLine(global0[2],phiDown,global1[2],phiDown); lhor1->Draw("same");
      lhor1->SetLineColor(kBlue);
      lhor1->SetLineWidth(3); 
      TLine *lver1 = new TLine(global1[2],phiDown,global2[2],phiUp); lver1->Draw("same");
      lver1->SetLineColor(kBlue);
      lver1->SetLineWidth(3); 
      TLine *lhor2 = new TLine(global2[2],phiUp,global3[2],phiUp); lhor2->Draw("same");
      lhor2->SetLineColor(kBlue);
      lhor2->SetLineWidth(3); 
      TLine *lver2 = new TLine(global3[2],phiUp,global0[2],phiDown); lver2->Draw("same");
      lver2->SetLineColor(kBlue);
      lver2->SetLineWidth(3); 
      nact[0]++;
    } 
  }
  c->cd(2);

  TH2D *hPhiZOuter = new TH2D("hPhiZOuter","Outer layer Active Modules ",200,-20,20,3,0,2*TMath::Pi());
  hPhiZOuter->SetXTitle("Z (cm)");
  hPhiZOuter->SetYTitle("#varphi (rad)");
  hPhiZOuter->Draw();
  for(Int_t i=80; i<240; i++){
    TGeoHMatrix matrix;
    int vid = AliITSAlignMille2Module::GetVolumeIDFromIndex(i);
    AliITSAlignMille2Module::SensVolMatrix(vid,&matrix);
    Double_t local[4][3]; // local position of the four angles
    local[0][0]=0.6375; local[0][1]=0; local[0][2]= -3.48;
    local[1][0]=0.6375; local[1][1]=0; local[1][2]= 3.48;
    local[2][0]=-0.6375; local[2][1]=0; local[2][2]= 3.48;
    local[2][0]=-0.6375; local[3][1]=0; local[3][2]= -3.48;
    Double_t global[4][3];
    for(Int_t j=0; j<4; j++){
      matrix.LocalToMaster(local[j],global[j]);
    }
    Double_t phiUp = atan2(global[0][1],global[0][0]);
    if(phiUp<0) phiUp+=2*TMath::Pi();
    Double_t phiDown = atan2(global[2][1],global[2][0]);
    if(phiDown<0) phiDown+=2*TMath::Pi();
    if(i>235) if(phiUp < 0.1) phiUp = TMath::Pi()*2;
    //  printf("module %i  -   phiDown %f   phiUp %f \n",i,phiDown,phiUp); 
    if((h->GetNrBad(i))<1) {
      TLine *lhor1 = new TLine(global[0][2],phiUp,global[1][2],phiUp); lhor1->Draw("same");
      lhor1->SetLineColor(kBlue);
      lhor1->SetLineWidth(2); 
      TLine *lver1 = new TLine(global[1][2],phiUp,global[2][2],phiDown); lver1->Draw("same");
      lver1->SetLineColor(kBlue);
      lver1->SetLineWidth(2); 
      TLine *lhor2 = new TLine(global[2][2],phiDown,global[3][2],phiDown); lhor2->Draw("same");
      lhor2->SetLineColor(kBlue);
      lhor2->SetLineWidth(2); 
      TLine *lver2 = new TLine(global[3][2],phiDown,global[0][2],phiUp); lver2->Draw("same");
      lver2->SetLineColor(kBlue);
      lver2->SetLineWidth(2); 
      nact[1]++; 
    } 
  }
  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.);
  c->SaveAs(Form("active%i.png",runNb));
}


void Draw3D(AliITSOnlineCalibrationSPDhandler *h){

  TGeoHMatrix m2t[240];
  for(Int_t imod=0; imod<240; imod++){
    int vid = AliITSAlignMille2Module::GetVolumeIDFromIndex(imod);
    AliITSAlignMille2Module::SensVolMatrix(vid,&m2t[imod]);
  }

  delete gGeoManager;

  new TGeoManager("SPD","active");

  TGeoMaterial *vacuum = new TGeoMaterial("vacuum",0,0,0);
  TGeoMedium *none = new TGeoMedium("Vacuum",0,vacuum);
  TGeoVolume *top = gGeoManager->MakeBox("TOP",none,500,500,500);
  gGeoManager->SetTopVolume(top);

  TGeoVolume *ladder = gGeoManager->MakeBox("ladder",none,0.6375,0.001/2,3.48);

  Int_t nActive[2]={0,0};
  for(Int_t imod=0; imod<240; imod++){
    TGeoRotation *rot  = new TGeoRotation();
    rot->SetMatrix(m2t[imod].GetRotationMatrix());
    TGeoCombiTrans *matrix = new TGeoCombiTrans(m2t[imod].GetTranslation()[0],m2t[imod].GetTranslation()[1],m2t[imod].GetTranslation()[2],rot);
    if((40960-h->GetNrBad(imod))>0) {
      top->AddNode(ladder,imod,matrix);
      if(imod<80) nActive[0]++;
      else nActive[1]++;
    }
  }

  printf("  \n\n   Number of Active SPD modules (->Total)  : inner %i (80) outer %i (160) \n\n\n",nActive[0],nActive[1]);
  gGeoManager->CloseGeometry();
  top->Draw("ogl");
  gPad->GetView()->ShowAxis();

}

 ShowSPDConfiguration.C:1
 ShowSPDConfiguration.C:2
 ShowSPDConfiguration.C:3
 ShowSPDConfiguration.C:4
 ShowSPDConfiguration.C:5
 ShowSPDConfiguration.C:6
 ShowSPDConfiguration.C:7
 ShowSPDConfiguration.C:8
 ShowSPDConfiguration.C:9
 ShowSPDConfiguration.C:10
 ShowSPDConfiguration.C:11
 ShowSPDConfiguration.C:12
 ShowSPDConfiguration.C:13
 ShowSPDConfiguration.C:14
 ShowSPDConfiguration.C:15
 ShowSPDConfiguration.C:16
 ShowSPDConfiguration.C:17
 ShowSPDConfiguration.C:18
 ShowSPDConfiguration.C:19
 ShowSPDConfiguration.C:20
 ShowSPDConfiguration.C:21
 ShowSPDConfiguration.C:22
 ShowSPDConfiguration.C:23
 ShowSPDConfiguration.C:24
 ShowSPDConfiguration.C:25
 ShowSPDConfiguration.C:26
 ShowSPDConfiguration.C:27
 ShowSPDConfiguration.C:28
 ShowSPDConfiguration.C:29
 ShowSPDConfiguration.C:30
 ShowSPDConfiguration.C:31
 ShowSPDConfiguration.C:32
 ShowSPDConfiguration.C:33
 ShowSPDConfiguration.C:34
 ShowSPDConfiguration.C:35
 ShowSPDConfiguration.C:36
 ShowSPDConfiguration.C:37
 ShowSPDConfiguration.C:38
 ShowSPDConfiguration.C:39
 ShowSPDConfiguration.C:40
 ShowSPDConfiguration.C:41
 ShowSPDConfiguration.C:42
 ShowSPDConfiguration.C:43
 ShowSPDConfiguration.C:44
 ShowSPDConfiguration.C:45
 ShowSPDConfiguration.C:46
 ShowSPDConfiguration.C:47
 ShowSPDConfiguration.C:48
 ShowSPDConfiguration.C:49
 ShowSPDConfiguration.C:50
 ShowSPDConfiguration.C:51
 ShowSPDConfiguration.C:52
 ShowSPDConfiguration.C:53
 ShowSPDConfiguration.C:54
 ShowSPDConfiguration.C:55
 ShowSPDConfiguration.C:56
 ShowSPDConfiguration.C:57
 ShowSPDConfiguration.C:58
 ShowSPDConfiguration.C:59
 ShowSPDConfiguration.C:60
 ShowSPDConfiguration.C:61
 ShowSPDConfiguration.C:62
 ShowSPDConfiguration.C:63
 ShowSPDConfiguration.C:64
 ShowSPDConfiguration.C:65
 ShowSPDConfiguration.C:66
 ShowSPDConfiguration.C:67
 ShowSPDConfiguration.C:68
 ShowSPDConfiguration.C:69
 ShowSPDConfiguration.C:70
 ShowSPDConfiguration.C:71
 ShowSPDConfiguration.C:72
 ShowSPDConfiguration.C:73
 ShowSPDConfiguration.C:74
 ShowSPDConfiguration.C:75
 ShowSPDConfiguration.C:76
 ShowSPDConfiguration.C:77
 ShowSPDConfiguration.C:78
 ShowSPDConfiguration.C:79
 ShowSPDConfiguration.C:80
 ShowSPDConfiguration.C:81
 ShowSPDConfiguration.C:82
 ShowSPDConfiguration.C:83
 ShowSPDConfiguration.C:84
 ShowSPDConfiguration.C:85
 ShowSPDConfiguration.C:86
 ShowSPDConfiguration.C:87
 ShowSPDConfiguration.C:88
 ShowSPDConfiguration.C:89
 ShowSPDConfiguration.C:90
 ShowSPDConfiguration.C:91
 ShowSPDConfiguration.C:92
 ShowSPDConfiguration.C:93
 ShowSPDConfiguration.C:94
 ShowSPDConfiguration.C:95
 ShowSPDConfiguration.C:96
 ShowSPDConfiguration.C:97
 ShowSPDConfiguration.C:98
 ShowSPDConfiguration.C:99
 ShowSPDConfiguration.C:100
 ShowSPDConfiguration.C:101
 ShowSPDConfiguration.C:102
 ShowSPDConfiguration.C:103
 ShowSPDConfiguration.C:104
 ShowSPDConfiguration.C:105
 ShowSPDConfiguration.C:106
 ShowSPDConfiguration.C:107
 ShowSPDConfiguration.C:108
 ShowSPDConfiguration.C:109
 ShowSPDConfiguration.C:110
 ShowSPDConfiguration.C:111
 ShowSPDConfiguration.C:112
 ShowSPDConfiguration.C:113
 ShowSPDConfiguration.C:114
 ShowSPDConfiguration.C:115
 ShowSPDConfiguration.C:116
 ShowSPDConfiguration.C:117
 ShowSPDConfiguration.C:118
 ShowSPDConfiguration.C:119
 ShowSPDConfiguration.C:120
 ShowSPDConfiguration.C:121
 ShowSPDConfiguration.C:122
 ShowSPDConfiguration.C:123
 ShowSPDConfiguration.C:124
 ShowSPDConfiguration.C:125
 ShowSPDConfiguration.C:126
 ShowSPDConfiguration.C:127
 ShowSPDConfiguration.C:128
 ShowSPDConfiguration.C:129
 ShowSPDConfiguration.C:130
 ShowSPDConfiguration.C:131
 ShowSPDConfiguration.C:132
 ShowSPDConfiguration.C:133
 ShowSPDConfiguration.C:134
 ShowSPDConfiguration.C:135
 ShowSPDConfiguration.C:136
 ShowSPDConfiguration.C:137
 ShowSPDConfiguration.C:138
 ShowSPDConfiguration.C:139
 ShowSPDConfiguration.C:140
 ShowSPDConfiguration.C:141
 ShowSPDConfiguration.C:142
 ShowSPDConfiguration.C:143
 ShowSPDConfiguration.C:144
 ShowSPDConfiguration.C:145
 ShowSPDConfiguration.C:146
 ShowSPDConfiguration.C:147
 ShowSPDConfiguration.C:148
 ShowSPDConfiguration.C:149
 ShowSPDConfiguration.C:150
 ShowSPDConfiguration.C:151
 ShowSPDConfiguration.C:152
 ShowSPDConfiguration.C:153
 ShowSPDConfiguration.C:154
 ShowSPDConfiguration.C:155
 ShowSPDConfiguration.C:156
 ShowSPDConfiguration.C:157
 ShowSPDConfiguration.C:158
 ShowSPDConfiguration.C:159
 ShowSPDConfiguration.C:160
 ShowSPDConfiguration.C:161
 ShowSPDConfiguration.C:162
 ShowSPDConfiguration.C:163
 ShowSPDConfiguration.C:164
 ShowSPDConfiguration.C:165
 ShowSPDConfiguration.C:166
 ShowSPDConfiguration.C:167
 ShowSPDConfiguration.C:168
 ShowSPDConfiguration.C:169
 ShowSPDConfiguration.C:170