ROOT logo
// draw the 1st sensor of every ladder of requested layers (axis directions - thin arrows) 
// and the tracking frame of each sensor (axis directions - thick arrows)

void drawLr(int layMin=1,int layMax=1) 
{

  gSystem->Load("libITSUpgradeBase.so");
  gSystem->Load("libITSUpgradeSim.so");
  gSystem->Load("libITSUpgradeRec.so");

  AliGeomManager::LoadGeometry("geometry.root");


  // Apply misaligment ... ;-)
  const char *ocdb="local://$ALICE_ROOT/OCDB";
  AliCDBManager::Instance()->SetDefaultStorage(ocdb);
  Int_t run = 1;
  AliCDBManager::Instance()->SetRun(run); 
  AliCDBManager::Instance()->SetSpecificStorage("ITS/Align/Data", Form("local://%s",gSystem->pwd()));
  AliCDBEntry *entry = AliCDBManager::Instance()->Get("ITS/Align/Data");
  TClonesArray *array = (TClonesArray*)entry->GetObject();
  AliGeomManager::ApplyAlignObjsToGeom(*array);
  gGeoManager->LockGeometry();

  AliITSUGeomTGeo* gm = new AliITSUGeomTGeo(kTRUE,kTRUE);
  TObjArray* segmArr = gm->GetSegmentations();  
  //
  int nlr = gm->GetNLayers();
  if (layMin<0) layMin = 0;
  if (layMax<0) layMax = nlr-1;
  else if (layMax>=nlr) layMax = nlr-1;
  //
  TH2* hh = new TH2F("hh","hh",100,-70,70,100,-70,70);
  hh->Draw();
  gStyle->SetOptStat(0);
  //
  double rmax = 0;
  TGeoHMatrix *msens=0, *mttr=0;
  double  loc[3]={0,0,0},gloC[3],glo[3],glo1[3],glo2[3],trk[3];
  //
  Int_t mod=0;

  for (Int_t lay=layMin;lay<=layMax;lay++) {
    //
    AliITSUSegmentationPix* segm = (AliITSUSegmentationPix*)segmArr->At(gm->GetLayerChipTypeID(lay));
    for (int ild=0;ild<gm->GetNLadders(lay);ild++) {
    
      // Sensor Matrices
      printf("Layer %d Ladder %d\n",lay,ild);
      msens = gm->GetMatrixSens(lay,ild,mod);
      printf("Sensor Matrix: ");
      msens->Print();
      mttr = gm->GetMatrixT2L(lay,ild,mod);
      printf("T2L Matrix: ");
      mttr->Print();
      //
      loc[0]=loc[1]=loc[2] = 0;
      msens->LocalToMaster(loc,gloC);
      mttr->MasterToLocal(loc,trk);  
      printf("SensorCenter in Lab: ");
      for (int i=0;i<3;i++) printf("%+9.4f ",gloC[i]); printf("\n");
      printf("SensorCenter in TRK: ");
      for (int i=0;i<3;i++) printf("%+9.4f ",trk[i]); printf("\n");
      //
      double r = TMath::Sqrt(gloC[0]*gloC[0]+gloC[1]*gloC[1]);
      if (rmax<r) rmax = r;
      //
      loc[0]=-segm->Dx()/2;
      msens->LocalToMaster(loc,glo);
      loc[0]= segm->Dx()/2;;
      msens->LocalToMaster(loc,glo1);
      TArrow* linS = new TArrow(glo[0],glo[1],glo1[0],glo1[1],0.012);  // sensor with pos local X direction 
      linS->SetLineColor((ild+1)%4+1); linS->Draw(); 
      //
      loc[0]=0;
      loc[1]=rmax*0.1;
      msens->LocalToMaster(loc,glo2);
      //
      //lin->Print(); 
      linS = new TArrow(gloC[0],gloC[1],glo2[0],glo2[1],0.012);  // pos local Y axis
      linS->SetLineColor((ild+1)%4+1); linS->Draw(); 
      //
      TMarker* mrk = new TMarker(gloC[0],gloC[1],31);
      mrk->SetMarkerColor((ild+1)%4+1);
      mrk->Draw();
      //
      TLatex *latx = new TLatex( gloC[0]*1.2,gloC[1]*1.2,Form("%d",ild));
      latx->SetTextColor((ild+1)%4+1);
      latx->SetTextSize(0.02);
      latx->Draw();
      //
      // Check Tracking to Local Matrix -------
      //
      // Draw sensors tracking frame
      trk[0]=trk[1]=0;
      mttr->LocalToMaster(trk,loc); 
      msens->LocalToMaster(loc,glo1);
      TMarker* mrk = new TMarker(glo1[0],glo1[1],24);
      mrk->SetMarkerColor((ild+1)%4+1);
      mrk->Draw();
      //
      // normal to sensor plane
      TLine* linN = new TLine(0,0,glo1[0],glo1[1]); 
      linN->SetLineWidth(1);
      linN->SetLineStyle(2);
      linN->SetLineColor((ild+1)%4+1); 
      linN->Draw(); 
      //
      // connect tracking and local frame
      TLine* linNP = new TLine(gloC[0],gloC[1],glo1[0],glo1[1]); 
      linNP->SetLineWidth(1);
      linNP->SetLineStyle(2);
      linNP->SetLineColor((ild+1)%4+1); 
      linNP->Draw(); 
      //
       // direction of X axis of the tracking plane
      trk[0]=rmax*0.1;
      mttr->LocalToMaster(trk,loc); 
      msens->LocalToMaster(loc,glo); 
      TArrow* linX = new TArrow(glo1[0],glo1[1],glo[0],glo[1],0.012);
      linX->SetLineWidth(2);
      linX->SetLineStyle(1);
      linX->SetLineColor((ild+1)%4+1); 
      linX->Draw(); 
      //
      trk[0] = 0;
      // direction of tracking Y axis
      double dx = glo[0]-glo1[0];
      double dy = glo[1]-glo1[1];
      double dst = TMath::Sqrt(dx*dx+dy*dy);
      trk[1]=-dst;
      mttr->LocalToMaster(trk,loc); 
      msens->LocalToMaster(loc,glo);
      trk[1]= dst;
      mttr->LocalToMaster(trk,loc); 
      msens->LocalToMaster(loc,glo1);
      //
      TArrow* linT = new TArrow(glo[0],glo[1],glo1[0],glo1[1],0.012); // normal to sensor plane, pox Y of tracking frame
      linT->SetLineWidth(2);
      linT->SetLineStyle(1);
      linT->SetLineColor((ild+1)%4+1); 
      linT->Draw(); 
      //
      printf("Layer %d Ladder %d\n",lay,ild);
      mttr->Print();
    }
  }
  //
  rmax = 1.3*rmax;
  hh->GetXaxis()->SetRangeUser(-rmax,rmax);
  hh->GetYaxis()->SetRangeUser(-rmax,rmax);
  gPad->Modified();
  gPad->Update();
}
 drawLr.C:1
 drawLr.C:2
 drawLr.C:3
 drawLr.C:4
 drawLr.C:5
 drawLr.C:6
 drawLr.C:7
 drawLr.C:8
 drawLr.C:9
 drawLr.C:10
 drawLr.C:11
 drawLr.C:12
 drawLr.C:13
 drawLr.C:14
 drawLr.C:15
 drawLr.C:16
 drawLr.C:17
 drawLr.C:18
 drawLr.C:19
 drawLr.C:20
 drawLr.C:21
 drawLr.C:22
 drawLr.C:23
 drawLr.C:24
 drawLr.C:25
 drawLr.C:26
 drawLr.C:27
 drawLr.C:28
 drawLr.C:29
 drawLr.C:30
 drawLr.C:31
 drawLr.C:32
 drawLr.C:33
 drawLr.C:34
 drawLr.C:35
 drawLr.C:36
 drawLr.C:37
 drawLr.C:38
 drawLr.C:39
 drawLr.C:40
 drawLr.C:41
 drawLr.C:42
 drawLr.C:43
 drawLr.C:44
 drawLr.C:45
 drawLr.C:46
 drawLr.C:47
 drawLr.C:48
 drawLr.C:49
 drawLr.C:50
 drawLr.C:51
 drawLr.C:52
 drawLr.C:53
 drawLr.C:54
 drawLr.C:55
 drawLr.C:56
 drawLr.C:57
 drawLr.C:58
 drawLr.C:59
 drawLr.C:60
 drawLr.C:61
 drawLr.C:62
 drawLr.C:63
 drawLr.C:64
 drawLr.C:65
 drawLr.C:66
 drawLr.C:67
 drawLr.C:68
 drawLr.C:69
 drawLr.C:70
 drawLr.C:71
 drawLr.C:72
 drawLr.C:73
 drawLr.C:74
 drawLr.C:75
 drawLr.C:76
 drawLr.C:77
 drawLr.C:78
 drawLr.C:79
 drawLr.C:80
 drawLr.C:81
 drawLr.C:82
 drawLr.C:83
 drawLr.C:84
 drawLr.C:85
 drawLr.C:86
 drawLr.C:87
 drawLr.C:88
 drawLr.C:89
 drawLr.C:90
 drawLr.C:91
 drawLr.C:92
 drawLr.C:93
 drawLr.C:94
 drawLr.C:95
 drawLr.C:96
 drawLr.C:97
 drawLr.C:98
 drawLr.C:99
 drawLr.C:100
 drawLr.C:101
 drawLr.C:102
 drawLr.C:103
 drawLr.C:104
 drawLr.C:105
 drawLr.C:106
 drawLr.C:107
 drawLr.C:108
 drawLr.C:109
 drawLr.C:110
 drawLr.C:111
 drawLr.C:112
 drawLr.C:113
 drawLr.C:114
 drawLr.C:115
 drawLr.C:116
 drawLr.C:117
 drawLr.C:118
 drawLr.C:119
 drawLr.C:120
 drawLr.C:121
 drawLr.C:122
 drawLr.C:123
 drawLr.C:124
 drawLr.C:125
 drawLr.C:126
 drawLr.C:127
 drawLr.C:128
 drawLr.C:129
 drawLr.C:130
 drawLr.C:131
 drawLr.C:132
 drawLr.C:133
 drawLr.C:134
 drawLr.C:135
 drawLr.C:136
 drawLr.C:137
 drawLr.C:138
 drawLr.C:139
 drawLr.C:140
 drawLr.C:141
 drawLr.C:142
 drawLr.C:143
 drawLr.C:144
 drawLr.C:145
 drawLr.C:146
 drawLr.C:147
 drawLr.C:148
 drawLr.C:149
 drawLr.C:150
 drawLr.C:151
 drawLr.C:152
 drawLr.C:153
 drawLr.C:154
 drawLr.C:155