2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
10 #include "AliEveITSScaledModule.h"
12 #include <AliITSgeom.h>
13 #include <AliITSsegmentationSPD.h>
14 #include <AliITSsegmentationSDD.h>
15 #include <AliITSsegmentationSSD.h>
17 #include <AliITSdigitSPD.h>
18 #include <AliITSdigitSDD.h>
19 #include <AliITSdigitSSD.h>
23 //______________________________________________________________________________
24 // AliEveDigitScaleInfo
27 ClassImp(AliEveDigitScaleInfo)
29 AliEveDigitScaleInfo::AliEveDigitScaleInfo():
31 fStatType (kST_Average),
36 void AliEveDigitScaleInfo::ScaleChanged(Int_t s)
40 AliEveITSScaledModule* sm;
41 std::list<TEveElement*>::iterator i = fBackRefs.begin();
42 while (i != fBackRefs.end())
44 sm = dynamic_cast<AliEveITSScaledModule*>(*i);
45 if(sm) sm->LoadQuads();
50 void AliEveDigitScaleInfo::StatTypeChanged(Int_t t)
55 AliEveITSScaledModule* sm;
56 std::list<TEveElement*>::iterator i = fBackRefs.begin();
57 while (i != fBackRefs.end())
59 sm = dynamic_cast<AliEveITSScaledModule*>(*i);
60 if(sm) sm->SetQuadValues();
65 //______________________________________________________________________________
69 AliEveITSScaledModule::ScaledDigit::ScaledDigit() :
73 min_i(-1), min_j(-1), max_i(-1), max_j(-1)
77 AliEveITSScaledModule::ScaledDigit::ScaledDigit(Int_t di, Int_t dj) :
81 min_i(di), min_j(dj), max_i(di), max_j(dj)
85 void AliEveITSScaledModule::ScaledDigit::Dump() const
87 printf("N %d, sum %f, sqr_sum %f",N, sum, sqr_sum);
91 //______________________________________________________________________________
93 // AliEveITSScaledModule
95 //______________________________________________________________________________
97 // Visualization of an ITS module with digits aggregated
98 // on a grid of pre-defined size.
100 ClassImp(AliEveITSScaledModule)
102 AliEveITSScaledModule::AliEveITSScaledModule(Int_t gid, AliEveITSDigitsInfo* info, AliEveDigitScaleInfo* si):
103 AliEveITSModule("AliEveITSScaledModule", "AliEveITSScaledModule"),
115 fScaleInfo->IncRefCount(this);
118 AliEveITSScaledModule::~AliEveITSScaledModule()
120 fScaleInfo->DecRefCount(this);
123 /******************************************************************************/
125 void AliEveITSScaledModule::LoadQuads()
127 // Here we still use 'z' for the name of axial coordinates.
128 // The transforamtion matrix aplied rotates y -> z.
129 // We need this as TEveQuadSet offers optimized treatment for
130 // quads in the x-y plane.
132 TClonesArray *digits;
133 Float_t x, z, zo, dpx, dpz; // orig cells size, pos
134 Int_t i, j, ndigits; // orig cells idx
135 Int_t c1, c2; // original coordinates
138 std::map<Int_t, Int_t> dmap;
139 std::map<Int_t, Int_t>::iterator miter;
140 digits = fInfo->GetDigits(fID, fDetID);
141 ndigits = digits->GetEntriesFast();
144 Int_t scale = fScaleInfo->GetScale() -1;
150 Reset(kQT_RectangleXZFixedY, kFALSE, 32);
152 fNCz = fInfo->fSPDScaleZ[scale];
153 fNCx = fInfo->fSPDScaleX[scale];
154 fNz = Int_t(fInfo->fSegSPD->Npz()/fNCz);
155 fNx = Int_t(fInfo->fSegSPD->Npx()/fNCx);
158 //printf("SPD orig cells (%d, %d) (%d, %d)\n", fInfo->fSegSPD->Npx(), fInfo->fSegSPD->Npz(), Nx, Nz);
161 for (Int_t k=0; k<ndigits; ++k)
163 od = (AliITSdigitSPD*) digits->UncheckedAt(k);
165 fInfo->GetSPDLocalZ(od->GetCoord1(),zo);
166 c1 = od->GetCoord1(); c2 = od->GetCoord2();
167 i = Int_t((zo+fDz)/dpz);
168 j = Int_t((od->GetCoord2()*fNx)/fInfo->fSegSPD->Npx());
171 miter = dmap.find(id);
172 if(miter == dmap.end())
174 dmap[id] = fPlex.Size();
177 AddQuad(x, z, dpx, dpz);
178 sd = new ScaledDigit(c1, c2);
183 sd = dynamic_cast<ScaledDigit*>(GetId(miter->second));
186 else if( c1 > sd->max_i)
191 else if( c2 > sd->max_j)
196 sd->sum += od->GetSignal();
197 sd->sqr_sum += od->GetSignal()*od->GetSignal();
204 Reset(kQT_RectangleXZFixedY, kFALSE, 32);
206 fNCz = fInfo->fSDDScaleZ[scale];
207 fNCx = fInfo->fSDDScaleX[scale];
208 fNz = Int_t(fInfo->fSegSDD->Npz()/fNCz);
209 fNx = Int_t(fInfo->fSegSDD->Npx()/fNCx);
213 AliITSdigitSDD *od=0;
214 for (Int_t k=0; k<ndigits; k++) {
215 od=(AliITSdigitSDD*)digits->UncheckedAt(k);
216 fInfo->fSegSDD->DetToLocal(od->GetCoord2(), od->GetCoord1(),x,z);
221 //printf("Mod %d coord %d,%d out of %d,%d :: ORIG coord %d,%d out of %d,%d \n",fID,
222 // i,j,Nz,Nx,od->GetCoord1(),od->GetCoord2(),fInfo->fSegSDD->Npz(),fInfo->fSegSDD->Npx());
225 c1 = od->GetCoord1(); c2 = od->GetCoord2();
227 miter = dmap.find(id);
228 if(miter == dmap.end())
230 dmap[id] = fPlex.Size();
233 AddQuad(x, z, dpx, dpz);
234 sd = new ScaledDigit(od->GetCoord1(),od->GetCoord2());
239 sd = dynamic_cast<ScaledDigit*>(GetId(miter->second));
242 else if( c1 > sd->max_i)
247 else if( c2 > sd->max_j)
251 sd->sum += od->GetSignal();
252 sd->sqr_sum += od->GetSignal()*od->GetSignal();
259 Reset(kQT_LineXZFixedY, kFALSE, 32);
261 AliITSsegmentationSSD* seg = fInfo->fSegSSD;
262 Float_t ap, an; // positive/negative angles -> offsets
264 ap = TMath::Tan(ap) * fDz;
265 an = - TMath::Tan(an) * fDz;
267 fNCx = fInfo->fSSDScale[scale];
269 fNx = Int_t(fInfo->fSegSSD->Npx()/fNCx);
273 AliITSdigitSSD *od=0;
274 for (Int_t k=0; k<ndigits; k++) {
275 od=(AliITSdigitSSD*)digits->UncheckedAt(k);
276 if(od->GetCoord1() == 1)
280 j = Int_t(od->GetCoord2()/fNCx);
281 c1 = od->GetCoord1(); c2 = od->GetCoord2();
284 miter = dmap.find(id);
286 if(miter == dmap.end())
288 // printf("orig digit %d,%d scaled %d,%d \n",od->GetCoord1(),od->GetCoord2(),i,j);
289 dmap[id] = fPlex.Size();
292 Float_t a = ( od->GetCoord1() == 1) ? ap : an;
293 AddLine(x-a, -fDz, 2*a, 2*fDz);
295 sd = new ScaledDigit(c1, c2);
300 sd = dynamic_cast<ScaledDigit*>(GetId(miter->second));
303 else if( c1 > sd->max_i)
308 else if( c2 > sd->max_j)
312 sd->sum += od->GetSignal();
313 sd->sqr_sum += od->GetSignal()*od->GetSignal();
323 /******************************************************************************/
325 void AliEveITSScaledModule::SetQuadValues()
327 if(fScaleInfo->GetSyncPalette()) SyncPalette();
329 Int_t N = fPlex.Size();
330 for (Int_t i = 0 ; i< N; i++)
332 ScaledDigit* sd = dynamic_cast<ScaledDigit*>(GetId(i));
334 switch(fScaleInfo->GetStatType())
336 using namespace TMath;
338 case AliEveDigitScaleInfo::kST_Occup:
339 v = Nint((100.0*sd->N) / (fNCx*fNCz));
341 case AliEveDigitScaleInfo::kST_Average:
342 v = Nint((Double_t) sd->sum / sd->N);
344 case AliEveDigitScaleInfo::kST_Rms:
345 v = Nint(Sqrt(sd->sqr_sum) / sd->N);
348 DigitBase_t* qb = GetDigit(i);
353 /******************************************************************************/
355 void AliEveITSScaledModule::SyncPalette()
357 // printf("AliEveITSScaledModule::SyncPalette()\n");
358 if(fScaleInfo->GetStatType() == AliEveDigitScaleInfo::kST_Occup)
361 AliEveITSModule::fgSPDPalette->SetLimits(0, 100);
362 AliEveITSModule::fgSPDPalette->SetMinMax(0, 100);
365 AliEveITSModule::fgSDDPalette->SetLimits(0, 100);
366 AliEveITSModule::fgSDDPalette->SetMinMax(0, 100);
369 AliEveITSModule::fgSSDPalette->SetLimits(0, 100);
370 AliEveITSModule::fgSDDPalette->SetMinMax(0, 100);
374 AliEveITSDigitsInfo& DI = *fInfo;
376 AliEveITSModule::fgSPDPalette->SetLimits(0, DI.fSPDHighLim);
377 AliEveITSModule::fgSPDPalette->SetMinMax(DI.fSPDMinVal, DI.fSPDMaxVal);
380 AliEveITSModule::fgSDDPalette->SetLimits(0, DI.fSDDHighLim);
381 AliEveITSModule::fgSDDPalette->SetMinMax(DI.fSDDMinVal, DI.fSDDMaxVal);
384 AliEveITSModule::fgSSDPalette->SetLimits(0, DI.fSSDHighLim);
385 AliEveITSModule::fgSSDPalette->SetMinMax(DI.fSSDMinVal, DI.fSSDMaxVal);
388 fScaleInfo->SetSyncPalette(kFALSE);
391 /******************************************************************************/
393 void AliEveITSScaledModule::GetScaleData(Int_t& cnx, Int_t& cnz, Int_t& total)
400 /******************************************************************************/
402 void AliEveITSScaledModule::DigitSelected(Int_t idx)
404 // Override control-click from TEveQuadSet
405 printf("AliEveITSScaledModule::DigitSelected "); Print();
407 DigitBase_t* qb = GetDigit(idx);
408 TObject* obj = qb->fId.GetObject();
409 ScaledDigit* sd = dynamic_cast<ScaledDigit*>(obj);
410 TClonesArray *digits = fInfo->GetDigits(fID, fDetID);
411 Int_t ndigits = digits->GetEntriesFast();
413 printf("%d digits in cell scaleX = %d, scaleZ = %d \n", sd->N, fNCx, fNCz);
416 for(Int_t k=0; k<ndigits; k++)
418 AliITSdigit *d = (AliITSdigit*) digits->UncheckedAt(k);
420 if(d->GetCoord1()>=sd->min_i && d->GetCoord1()<=sd->max_i &&
421 d->GetCoord2()>=sd->min_j && d->GetCoord2()<=sd->max_j)
423 printf("%3d, %3d: %3d", d->GetCoord1(), d->GetCoord2(), d->GetSignal());