]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/Alieve/ITSModule.cxx
Use two-level selection, implement callback QuadSelected() to print out the digit...
[u/mrichter/AliRoot.git] / EVE / Alieve / ITSModule.cxx
index 8eba2118ce9a9407ad165459e8099f74a029d759..62b6f8a1da7246f903cf4c8741fa4e1a81024c7e 100644 (file)
@@ -8,38 +8,44 @@
 
 using namespace Reve;
 using namespace Alieve;
-using namespace std;
 
-Short_t ITSModule::fgSDDThreshold  = 5;
-Short_t ITSModule::fgSDDMaxVal     = 80;
-Short_t ITSModule::fgSSDThreshold  = 2;
-Short_t ITSModule::fgSSDMaxVal     = 100;
+
+Bool_t       ITSModule::fgStaticInitDone = kFALSE;
+
+FrameBox*    ITSModule::fgSPDFrameBox = 0;
+FrameBox*    ITSModule::fgSDDFrameBox = 0;
+FrameBox*    ITSModule::fgSSDFrameBox = 0;
+
+RGBAPalette* ITSModule::fgSPDPalette  = 0;
+RGBAPalette* ITSModule::fgSDDPalette  = 0;
+RGBAPalette* ITSModule::fgSSDPalette  = 0;
+
+//__________________________________________________________________________
+// ITSModule
+//
+//
 
 ClassImp(ITSModule)
 
 /**************************************************************************/
 
-ITSModule::ITSModule(const Text_t* n, const Text_t* t, Color_t col) :
-  Reve::RenderElement(fFrameColor),
+ITSModule::ITSModule(const Text_t* n, const Text_t* t) :
   QuadSet(n, t),
   fInfo(0),
   fID(-1), fDetID(-1),
   fLayer(-1), fLadder(-1), fDet(-1),
-  fDx(0), fDz(0), fDy(0),
-  fFrameColor(col)
+  fDx(0), fDz(0), fDy(0)
 {}
 
-ITSModule::ITSModule(Int_t id, ITSDigitsInfo* info, Color_t col) :
-  Reve::RenderElement(fFrameColor),
-  QuadSet(Form("ITS module %d", id)),
+ITSModule::ITSModule(Int_t gid, ITSDigitsInfo* info) :
+  QuadSet(Form("ITS module %d", gid)),
   fInfo  (0),
   fID(-1), fDetID(-1),
   fLayer(-1), fLadder(-1), fDet(-1),
-  fDx(0), fDz(0), fDy(0),
-  fFrameColor(col)
+  fDx(0), fDz(0), fDy(0)
 {
   SetDigitsInfo(info);
-  SetID(id);
+  SetID(gid);
 }
 
 ITSModule::~ITSModule()
@@ -49,63 +55,165 @@ ITSModule::~ITSModule()
 
 /**************************************************************************/
 
-void ITSModule::SetMainColor(Color_t col)
+void ITSModule::InitStatics(ITSDigitsInfo* info)
 {
-  Reve::RenderElement::SetMainColor(col);
-  if(!fQuads.empty()) {
-    fQuads.front().ColorFromIdx(col);
+  if (fgStaticInitDone) return;
+  fgStaticInitDone = kTRUE;
+
+  {
+    Float_t dx = info->fSegSPD->Dx()*0.00005;
+    Float_t dz = 3.48; 
+
+    fgSPDFrameBox = new FrameBox();
+    fgSPDFrameBox->SetAAQuadXZ(-dx, 0, -dz, 2*dx, 2*dz);
+    fgSPDFrameBox->SetFrameColor((Color_t) 31);
+    fgSPDPalette  = new RGBAPalette(0, 1);
   }
+
+  {
+    Float_t dx = info->fSegSDD->Dx()*0.0001;
+    Float_t dz = info->fSegSDD->Dz()*0.00005;
+
+    fgSDDFrameBox = new FrameBox();
+    fgSDDFrameBox->SetAAQuadXZ(-dx, 0, -dz, 2*dx, 2*dz);
+    fgSDDFrameBox->SetFrameColor((Color_t) 32);
+    fgSDDPalette  = new RGBAPalette(5, 80);
+    fgSDDPalette->SetLimits(0, 512); // Set proper ADC range.
+  }
+
+  {
+    Float_t dx = info->fSegSSD->Dx()*0.00005;
+    Float_t dz = info->fSegSSD->Dz()*0.00005;
+
+    fgSSDFrameBox = new FrameBox();
+    fgSSDFrameBox->SetAAQuadXZ(-dx, 0, -dz, 2*dx, 2*dz);
+    fgSSDFrameBox->SetFrameColor((Color_t) 33);
+    fgSSDPalette  = new RGBAPalette(2, 100);
+    fgSSDPalette->SetLimits(0, 1024); // Set proper ADC range.
+  }
+
 }
 
 /**************************************************************************/
 
 void ITSModule::SetDigitsInfo(ITSDigitsInfo* info)
 {
-  if(fInfo) fInfo->DecRefCount();
+  if (fInfo == info) return;
+  if (fInfo) fInfo->DecRefCount();
   fInfo = info;
-  if(fInfo) fInfo->IncRefCount();
+  if (fInfo) fInfo->IncRefCount();
 }
 
-void ITSModule::SetID(Int_t id)
+/**************************************************************************/
+
+void ITSModule::SetID(Int_t gid)
 {
   static const Exc_t eH("ITSModule::SetID ");
 
   if(fInfo == 0)
     throw(eH + "ITSDigitsInfo not set.");
 
-  if (id < fInfo->fGeom->GetStartSPD() || id > fInfo->fGeom->GetLastSSD())
-    throw(eH + Form("%d is not valid. ID range from %d to %d", id,
+  if (gid < fInfo->fGeom->GetStartSPD() || gid > fInfo->fGeom->GetLastSSD())
+    throw(eH + Form("%d is not valid. ID range from %d to %d", gid,
                     fInfo->fGeom->GetStartSPD(), fInfo->fGeom->GetLastSSD()));
 
-  fID = id;
-  InitModule();
-}
-
-/**************************************************************************/
-
-void ITSModule::InitModule()
-{
-  fInfo->fGeom->GetModuleId(fID,fLayer,fLadder,fDet);
-  SetName(Form("ITSModule %d", fID));
-
-  if (fID <= fInfo->fGeom->GetLastSPD()) {
+  fID = gid;
+
+  if (!fgStaticInitDone) InitStatics(fInfo);
+
+  fInfo->fGeom->GetModuleId(fID, fLayer, fLadder, fDet);
+  TString strLadder = "Ladder";
+  TString strSensor = "Sensor";
+  TString symname;
+  Int_t   id, nsector, nstave, nladder, rest;
+  
+  if (fID <= fInfo->fGeom->GetLastSPD())
+  {
+    // SPD
+
+    SetFrame(fgSPDFrameBox);
+    SetPalette(fgSPDPalette);
+    symname += strLadder;
+    if (fID < 80)
+    {
+      nsector = fID/8;
+      rest    = fID - 8*nsector;
+      nstave  = 1;
+    }
+    else
+    {
+      id      = fID - 80;
+      nsector = id/8;
+      rest    = id - 8*nsector;
+      nstave  = 1;
+    }
+    if (rest < 4) nstave = 0;
+    rest    -= 4*nstave;
+    symname += rest;
+    SetName(symname);
     fDetID = 0;
     fDx = fInfo->fSegSPD->Dx()*0.00005;
     fDz = 3.48; 
     fDy = fInfo->fSegSPD->Dy()*0.00005;
+
   }
-  else if (fID <= fInfo->fGeom->GetLastSDD()) {
+  else if (fID <= fInfo->fGeom->GetLastSDD())
+  {
+    // SDD
+
+    SetFrame(fgSDDFrameBox);
+    SetPalette(fgSDDPalette);
+    symname += strSensor;
+    if (fID < 324)
+    {
+      id      = fID - 240;
+      nladder = id/6;
+      rest    = id - 6*nladder;
+    }
+    else
+    {
+      id      = fID - 324;
+      nladder = id/8;
+      rest    = id - 8*nladder;
+    }
+    symname += rest;
+    SetName(symname);
     fDetID = 1;
     fDx = fInfo->fSegSDD->Dx()*0.0001;
     fDz = fInfo->fSegSDD->Dz()*0.00005;
     fDy = fInfo->fSegSDD->Dy()*0.00005;
+
   }
-  else {
+  else
+  {
+    // SSD
+
+    SetFrame(fgSSDFrameBox);
+    SetPalette(fgSSDPalette);
+
+    symname += strSensor;
+    if (fID < 1248)
+    {
+      id      = fID - 500;
+      nladder = id/22;
+      rest    = id - nladder*22;
+    }
+    else
+    {
+      id      = fID - 1248;
+      nladder = id/25;
+      rest    = id - nladder*25;
+    }
+    symname += rest;
+    SetName(symname);
     fDetID = 2;
     fInfo->fSegSSD->SetLayer(fLayer);  
     fDx = fInfo->fSegSSD->Dx()*0.00005;
     fDz = fInfo->fSegSSD->Dz()*0.00005;
     fDy = fInfo->fSegSSD->Dy()*0.00005;
+
   }
 
   LoadQuads();  
@@ -115,147 +223,138 @@ void ITSModule::InitModule()
 
 void ITSModule::LoadQuads()
 {
+  // Here we still use 'z' for the name of axial coordinates.
+  // The transforamtion matrix aplied rotates y -> z.
+  // We need this as QuadSet offers optimized treatment for
+  // quads in the x-y plane.
+
   // printf("its module load quads \n");
-  Float_t x = fDx;
-  Float_t z = fDz;
-  Bool_t aboveThreshold = false;
-
-  // Module frame in xy plane
-  fQuads.push_back(Reve::Quad(fFrameColor));
-  Float_t dy = -0.;
-  Float_t* p = fQuads.back().vertices;
-  p[0] = -x;  p[1] =  dy; p[2]  = -z;
-  p[3] = -x;  p[4] =  dy; p[5]  =  z;
-  p[6] =  x;  p[7] =  dy; p[8]  =  z;
-  p[9] =  x;  p[10] = dy; p[11] = -z;
-
-  // Digits
+
   TClonesArray *digits;
-  Int_t ndigits;
-  Float_t dpx,dpz; 
-  Int_t i,j;
-  digits  = fInfo->GetDigits(fID, fDetID );
+  Float_t       x, z, dpx, dpz; 
+  Int_t         i, j, ndigits;
+  digits  = fInfo->GetDigits(fID, fDetID);
   ndigits = digits->GetEntriesFast(); 
-  Int_t n_col = gStyle->GetNumberOfColors();
-
-  switch(fDetID) {
-
-  case 0: { // SPD
-    aboveThreshold = true;
-    AliITSsegmentationSPD* seg =  fInfo->fSegSPD; 
-    AliITSdigitSPD *d=0;
-
-    for (Int_t k=0; k<ndigits; k++) {
-      d=(AliITSdigitSPD*)digits->UncheckedAt(k);
-      j = d->GetCoord1();
-      i = d->GetCoord2();
-      x  = -seg->Dx()/2 + seg->Dpx(0) *i;
-      x *=  0.0001;
-      fInfo->GetSPDLocalZ(j,z);
-      dpx = seg->Dpx(i)*0.0001;
-      dpz = seg->Dpz(j)*0.0001;
-
-      fQuads.push_back(Reve::Quad(7));
-      Float_t* p = fQuads.back().vertices;
-      p[0] = x;        p[1] = 0.; p[2]  = z;
-      p[3] = x;        p[4] = 0.; p[5]  = z + dpz;
-      p[6] = x + dpx;  p[7] = 0.; p[8]  = z + dpz;
-      p[9] = x + dpx;  p[10] =0.; p[11] = z;
-    }
-    break;
-  }
 
-  case 1: { // SDD
-    AliITSsegmentationSDD* seg =  fInfo->fSegSDD; 
-    AliITSdigitSDD *d=0;
-    x = 2*fDx;
-    z = 2*fDz;
-    for (Int_t k=0; k<ndigits; k++) {
-      d=(AliITSdigitSDD*)digits->UncheckedAt(k);
+  switch(fDetID)
+  {
+
+    case 0: { // SPD
+      AliITSsegmentationSPD* seg =  fInfo->fSegSPD; 
 
-      if (d->GetSignal() > fgSDDThreshold) {
+      Reset(QT_RectangleXZFixedY, kFALSE, 32);
+
+      for (Int_t k=0; k<ndigits; ++k)
+      {
+       AliITSdigitSPD *d = (AliITSdigitSPD*) digits->UncheckedAt(k);
        j = d->GetCoord1();
        i = d->GetCoord2();
-       aboveThreshold = true;
-       seg->DetToLocal(i,j,x,z);
+       x  = -0.5*seg->Dx() + i*seg->Dpx(0);
+       x *=  0.0001;
+       fInfo->GetSPDLocalZ(j, z);
        dpx = seg->Dpx(i)*0.0001;
        dpz = seg->Dpz(j)*0.0001;
 
-       Int_t ci = gStyle->GetColorPalette
-         (TMath::Min(n_col - 1,
-                     (n_col*(d->GetSignal() - fgSDDThreshold))/(fgSDDMaxVal - fgSDDThreshold)));
-       fQuads.push_back(Reve::Quad(ci, p));
-       Float_t* p = fQuads.back().vertices;
-       p[0] = x;        p[1] = 0.; p[2]  = z;
-       p[3] = x;        p[4] = 0.; p[5]  = z + dpz;
-       p[6] = x + dpx;  p[7] = 0.; p[8]  = z + dpz;
-       p[9] = x + dpx;  p[10] =0.; p[11] = z;
+       AddQuad(x, z, dpx, dpz);
+       QuadValue(1); // In principle could have color based on number of neigbours
+       QuadId(d);
       }
+      break;
     }
-    break;
-  }
 
-  case 2: { // SSD
-    AliITSsegmentationSSD* seg = fInfo->fSegSSD; 
-    AliITSdigitSSD *d=0;
-    Float_t ap,an,a;
-    seg->Angles(ap,an);
-    for (Int_t k=0; k<ndigits; k++) {
-      d=(AliITSdigitSSD*)digits->UncheckedAt(k);
-      if(d->GetSignal() > fgSSDThreshold){
-       aboveThreshold = true;
-       j = d->GetCoord1();
-       i = d->GetCoord2();
-       seg->DetToLocal(i,j,x,z);
+    case 1: { // SDD
+      AliITSsegmentationSDD *seg =  fInfo->fSegSDD; 
+
+      Reset(QT_RectangleXZFixedY, kFALSE, 32);
+
+      for (Int_t k=0; k<ndigits; ++k)
+      {
+       AliITSdigitSDD* d = (AliITSdigitSDD*) digits->UncheckedAt(k);
 
-       if( d->GetCoord1() == 1) {
-         a = ap;
+       // if (d->GetSignal() > fgSDDThreshold)
+       {
+         j = d->GetCoord1();
+         i = d->GetCoord2();
+         seg->DetToLocal(i, j, x, z);
+         dpx = seg->Dpx(i)*0.0001;
+         dpz = seg->Dpz(j)*0.0001;
+
+         AddQuad(x-2*dpx, z, 4*dpx, dpz);
+         QuadValue(d->GetSignal());
+         QuadId(d);
        }
-       else {
-         a = -an;
+      }
+      break;
+    }
+
+    case 2: { // SSD
+      AliITSsegmentationSSD* seg = fInfo->fSegSSD; 
+
+      Reset(QT_LineXZFixedY, kFALSE, 32);
+
+      Float_t ap, an; // positive/negative angles -> offsets
+      seg->Angles(ap, an);
+      ap =   TMath::Tan(ap) * fDz;
+      an = - TMath::Tan(an) * fDz;
+
+      for (Int_t k=0; k<ndigits; ++k)
+      {
+       AliITSdigitSSD *d = (AliITSdigitSSD*) digits->UncheckedAt(k);
+       // if(d->GetSignal() > fgSSDThreshold)
+       {
+         j = d->GetCoord1();
+         i = d->GetCoord2();
+         seg->DetToLocal(i,j,x,z);
+
+         Float_t a = ( d->GetCoord1() == 1) ? ap : an;
+
+         AddLine(x-a, -fDz, 2*a, 2*fDz);
+         QuadValue(d->GetSignal());
+         QuadId(d);
+         // printf("%3d -> %3d -> %8x\n", d->GetSignal(), ci, fQuads.back().color);
        }
-       fQuads.push_back(Reve::Quad());
-       Int_t ci = gStyle->GetColorPalette
-         (TMath::Min(n_col - 1,
-                     (n_col*(d->GetSignal() - fgSSDThreshold))/(fgSSDMaxVal - fgSSDThreshold)));
-
-       fQuads.back().ColorFromIdx(ci);
-       Float_t* p = fQuads.back().vertices;
-        
-       p[0] = x-TMath::Tan(a)*fDz;  p[1] =  0; p[2]  = -fDz;
-       p[3] = x+TMath::Tan(a)*fDz;  p[4] =  0; p[5]  = fDz ;
-       p[6] = x+TMath::Tan(a)*fDz;  p[7] =  0; p[8]  = fDz  ;
-       p[9] = x-TMath::Tan(a)*fDz;  p[10] = 0; p[11] = -fDz;
-       //      printf("%3d -> %3d -> %8x\n", d->GetSignal(), ci, fQuads.back().color);
       }
+      break;
     }
-    break;
-  }
 
-  }
+  } // end switch
+
+  RefitPlex();
 }
 
 /**************************************************************************/
 
 void ITSModule::SetTrans()
 {
-  Double_t pos[3];
-  Double_t rot[9];
-  fInfo->fGeom->GetTrans(fID,pos);
-  fInfo->fGeom->GetRotMatrix(fID,rot);
-  Double_t *s, *d;
-
-  // column major ii
-  s = &rot[0]; d = &fMatrix[0];
-  d[0] = s[0]; d[1] = s[3]; d[2] = s[6]; d[3] = 0;
-  s = &rot[1]; d = &fMatrix[4];
-  d[0] = s[0]; d[1] = s[3]; d[2] = s[6]; d[3] = 0;
-  s = &rot[2]; d = &fMatrix[8];
-  d[0] = s[0]; d[1] = s[3]; d[2] = s[6]; d[3] = 0;
-  s = &pos[0]; d = &fMatrix[12];
-  d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = 1;
-
-  fTrans = true;
+  Double_t x[9];
+  fHMTrans.UnitTrans();
+
+   // column major
+  fInfo->fGeom->GetRotMatrix(fID, x);
+  fHMTrans.SetBaseVec(1, x[0], x[3], x[6]);
+  fHMTrans.SetBaseVec(2, x[1], x[4], x[7]);
+  fHMTrans.SetBaseVec(3, x[2], x[5], x[8]);
+  // translation
+  fInfo->fGeom->GetTrans(fID, x);  
+  fHMTrans.SetBaseVec(4, x);
+}
+
+/**************************************************************************/
+
+void ITSModule::QuadSelected(Int_t idx)
+{
+  // Override control-click from QuadSet
+
+  QuadBase* qb   = GetQuad(idx);
+  TObject* obj   = qb->fId.GetObject();
+  AliITSdigit* d = dynamic_cast<AliITSdigit*>(obj);
+  printf("ITSModule::QuadSelected "); Print();
+  printf("  idx=%d, value=%d, obj=0x%lx, digit=0x%lx\n",
+        idx, qb->fValue, (ULong_t)obj, (ULong_t)d);
+  if (d)
+    printf("  coord1=%3d coord2=%3d signal=%d\n",
+          d->GetCoord1(), d->GetCoord2(), d->GetSignal());
+
 }
 
 /**************************************************************************/