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 <AliITSsegmentationSPD.h>
13 #include <AliITSsegmentationSDD.h>
14 #include <AliITSsegmentationSSD.h>
16 #include <AliITSdigitSPD.h>
17 #include <AliITSdigitSDD.h>
18 #include <AliITSdigitSSD.h>
21 #include <TClonesArray.h>
23 //==============================================================================
24 //==============================================================================
25 // AliEveDigitScaleInfo
26 //==============================================================================
28 //______________________________________________________________________________
30 // Encapsulates current state of scaling and agglomeration.
32 ClassImp(AliEveDigitScaleInfo)
34 AliEveDigitScaleInfo::AliEveDigitScaleInfo():
36 fStatType (kSTAverage),
41 void AliEveDigitScaleInfo::ScaleChanged(Int_t s)
45 AliEveITSScaledModule* sm;
46 #if ROOT_VERSION_CODE >= 334599
47 RefMap_i i = fBackRefs.begin();
49 std::list<TEveElement*>::iterator i = fBackRefs.begin();
51 while (i != fBackRefs.end())
53 #if ROOT_VERSION_CODE >= 334599
54 sm = dynamic_cast<AliEveITSScaledModule*>((*i).first);
56 sm = dynamic_cast<AliEveITSScaledModule*>(*i);
58 if(sm) sm->LoadQuads();
63 void AliEveDigitScaleInfo::StatTypeChanged(Int_t t)
68 AliEveITSScaledModule* sm;
69 #if ROOT_VERSION_CODE >= 334599
70 RefMap_i i = fBackRefs.begin();
72 std::list<TEveElement*>::iterator i = fBackRefs.begin();
74 while (i != fBackRefs.end())
76 #if ROOT_VERSION_CODE >= 334599
77 sm = dynamic_cast<AliEveITSScaledModule*>((*i).first);
79 sm = dynamic_cast<AliEveITSScaledModule*>(*i);
81 if (sm) sm->SetQuadValues();
86 //______________________________________________________________________________
90 AliEveITSScaledModule::ScaledDigit_t::ScaledDigit_t() :
94 fMinI(-1), fMinJ(-1), fMaxI(-1), fMaxJ(-1)
98 AliEveITSScaledModule::ScaledDigit_t::ScaledDigit_t(Int_t di, Int_t dj) :
102 fMinI(di), fMinJ(dj), fMaxI(di), fMaxJ(dj)
106 void AliEveITSScaledModule::ScaledDigit_t::Dump() const
108 printf("N %d, sum %f, sqr_sum %f", fN, fSum, fSqrSum);
112 //==============================================================================
113 //==============================================================================
114 // AliEveITSScaledModule
115 //==============================================================================
117 //______________________________________________________________________________
119 // Visualization of an ITS module with digits aggregated
120 // on a grid of pre-defined size.
122 ClassImp(AliEveITSScaledModule)
124 AliEveITSScaledModule::AliEveITSScaledModule(Int_t gid, AliEveITSDigitsInfo* info, AliEveDigitScaleInfo* si):
125 AliEveITSModule("AliEveITSScaledModule", "AliEveITSScaledModule"),
137 fScaleInfo->IncRefCount(this);
140 AliEveITSScaledModule::~AliEveITSScaledModule()
142 fScaleInfo->DecRefCount(this);
145 /******************************************************************************/
147 void AliEveITSScaledModule::LoadQuads()
149 // Here we still use 'z' for the name of axial coordinates.
150 // The transforamtion matrix aplied rotates y -> z.
151 // We need this as TEveQuadSet offers optimized treatment for
152 // quads in the x-y plane.
154 TClonesArray *digits = fInfo->GetDigits(fID, fDetID);
157 Int_t ndigits = digits->GetEntriesFast();
159 Float_t x, z, zo, dpx, dpz; // orig cells size, pos
160 Int_t i, j; // orig cells idx
161 Int_t c1, c2; // original coordinates
164 std::map<Int_t, Int_t> dmap;
165 std::map<Int_t, Int_t>::iterator miter;
167 Int_t scale = fScaleInfo->GetScale() -1;
173 Reset(kQT_RectangleXZFixedY, kFALSE, 32);
175 fNCz = fInfo->fSPDScaleZ[scale];
176 fNCx = fInfo->fSPDScaleX[scale];
177 fNz = Int_t(fInfo->fSegSPD->Npz()/fNCz);
178 fNx = Int_t(fInfo->fSegSPD->Npx()/fNCx);
181 //printf("SPD orig cells (%d, %d) (%d, %d)\n", fInfo->fSegSPD->Npx(), fInfo->fSegSPD->Npz(), Nx, Nz);
184 for (Int_t k=0; k<ndigits; ++k)
186 od = (AliITSdigitSPD*) digits->UncheckedAt(k);
188 fInfo->GetSPDLocalZ(od->GetCoord1(),zo);
189 c1 = od->GetCoord1(); c2 = od->GetCoord2();
190 i = Int_t((zo+fDz)/dpz);
191 j = Int_t((od->GetCoord2()*fNx)/fInfo->fSegSPD->Npx());
194 ScaledDigit_t* sd = 0;
195 miter = dmap.find(id);
196 if(miter == dmap.end())
198 dmap[id] = fPlex.Size();
201 AddQuad(x, z, dpx, dpz);
202 sd = new ScaledDigit_t(c1, c2);
207 sd = static_cast<ScaledDigit_t*>(GetId(miter->second));
210 else if( c1 > sd->fMaxI)
215 else if( c2 > sd->fMaxJ)
220 sd->fSum += od->GetSignal();
221 sd->fSqrSum += od->GetSignal()*od->GetSignal();
228 Reset(kQT_RectangleXZFixedY, kFALSE, 32);
230 fNCz = fInfo->fSDDScaleZ[scale];
231 fNCx = fInfo->fSDDScaleX[scale];
232 fNz = Int_t(fInfo->fSegSDD->Npz()/fNCz);
233 fNx = Int_t(fInfo->fSegSDD->Npx()/fNCx);
237 AliITSdigitSDD *od = 0;
238 for (Int_t k = 0; k < ndigits; ++k)
240 od = (AliITSdigitSDD*)digits->UncheckedAt(k);
241 fInfo->fSegSDD->DetToLocal(od->GetCoord2(), od->GetCoord1(),x,z);
246 //printf("Mod %d coord %d,%d out of %d,%d :: ORIG coord %d,%d out of %d,%d \n",fID,
247 // i,j,Nz,Nx,od->GetCoord1(),od->GetCoord2(),fInfo->fSegSDD->Npz(),fInfo->fSegSDD->Npx());
250 c1 = od->GetCoord1(); c2 = od->GetCoord2();
252 ScaledDigit_t* sd = 0;
253 miter = dmap.find(id);
254 if(miter == dmap.end())
256 dmap[id] = fPlex.Size();
259 AddQuad(x, z, dpx, dpz);
260 sd = new ScaledDigit_t(od->GetCoord1(),od->GetCoord2());
265 sd = static_cast<ScaledDigit_t*>(GetId(miter->second));
268 else if( c1 > sd->fMaxI)
273 else if( c2 > sd->fMaxJ)
277 sd->fSum += od->GetSignal();
278 sd->fSqrSum += od->GetSignal()*od->GetSignal();
285 Reset(kQT_LineXZFixedY, kFALSE, 32);
287 AliITSsegmentationSSD* seg = fInfo->fSegSSD;
288 Float_t ap, an; // positive/negative angles -> offsets
290 ap = TMath::Tan(ap) * fDz;
291 an = - TMath::Tan(an) * fDz;
293 fNCx = fInfo->fSSDScale[scale];
295 fNx = Int_t(fInfo->fSegSSD->Npx()/fNCx);
299 AliITSdigitSSD *od = 0;
300 for (Int_t k=0; k<ndigits; k++) {
301 od=(AliITSdigitSSD*)digits->UncheckedAt(k);
302 if(od->GetCoord1() == 1)
306 j = Int_t(od->GetCoord2()/fNCx);
307 c1 = od->GetCoord1(); c2 = od->GetCoord2();
310 ScaledDigit_t* sd = 0;
311 miter = dmap.find(id);
312 if(miter == dmap.end())
314 // printf("orig digit %d,%d scaled %d,%d \n",od->GetCoord1(),od->GetCoord2(),i,j);
315 dmap[id] = fPlex.Size();
318 Float_t a = ( od->GetCoord1() == 1) ? ap : an;
319 AddLine(x-a, -fDz, 2*a, 2*fDz);
321 sd = new ScaledDigit_t(c1, c2);
326 sd = static_cast<ScaledDigit_t*>(GetId(miter->second));
329 else if( c1 > sd->fMaxI)
334 else if( c2 > sd->fMaxJ)
338 sd->fSum += od->GetSignal();
339 sd->fSqrSum += od->GetSignal()*od->GetSignal();
349 /******************************************************************************/
351 void AliEveITSScaledModule::SetQuadValues()
353 if(fScaleInfo->GetSyncPalette()) SyncPalette();
355 Int_t num = fPlex.Size();
356 for (Int_t i = 0 ; i < num; i++)
358 ScaledDigit_t* sd = static_cast<ScaledDigit_t*>(GetId(i));
360 switch(fScaleInfo->GetStatType())
362 using namespace TMath;
364 case AliEveDigitScaleInfo::kSTOccup:
365 v = Nint((100.0*sd->fN) / (fNCx*fNCz));
367 case AliEveDigitScaleInfo::kSTAverage:
368 v = Nint((Double_t) sd->fSum / sd->fN);
370 case AliEveDigitScaleInfo::kSTRms:
371 v = Nint(Sqrt(sd->fSqrSum) / sd->fN);
374 DigitBase_t* qb = GetDigit(i);
379 /******************************************************************************/
381 void AliEveITSScaledModule::SyncPalette()
383 // printf("AliEveITSScaledModule::SyncPalette()\n");
384 if(fScaleInfo->GetStatType() == AliEveDigitScaleInfo::kSTOccup)
387 AliEveITSModule::fgSPDPalette->SetLimits(0, 100);
388 AliEveITSModule::fgSPDPalette->SetMinMax(0, 100);
391 AliEveITSModule::fgSDDPalette->SetLimits(0, 100);
392 AliEveITSModule::fgSDDPalette->SetMinMax(0, 100);
395 AliEveITSModule::fgSSDPalette->SetLimits(0, 100);
396 AliEveITSModule::fgSDDPalette->SetMinMax(0, 100);
400 AliEveITSDigitsInfo& di = *fInfo;
402 AliEveITSModule::fgSPDPalette->SetLimits(0, di.fSPDHighLim);
403 AliEveITSModule::fgSPDPalette->SetMinMax(di.fSPDMinVal, di.fSPDMaxVal);
406 AliEveITSModule::fgSDDPalette->SetLimits(0, di.fSDDHighLim);
407 AliEveITSModule::fgSDDPalette->SetMinMax(di.fSDDMinVal, di.fSDDMaxVal);
410 AliEveITSModule::fgSSDPalette->SetLimits(0, di.fSSDHighLim);
411 AliEveITSModule::fgSSDPalette->SetMinMax(di.fSSDMinVal, di.fSSDMaxVal);
414 fScaleInfo->SetSyncPalette(kFALSE);
417 /******************************************************************************/
419 void AliEveITSScaledModule::GetScaleData(Int_t& cnx, Int_t& cnz, Int_t& total) const
426 /******************************************************************************/
428 void AliEveITSScaledModule::DigitSelected(Int_t idx)
430 // Override control-click from TEveQuadSet
431 printf("AliEveITSScaledModule::DigitSelected "); Print();
433 // DigitBase_t *qb = GetDigit(idx);
434 TObject *obj = GetId(idx);
435 ScaledDigit_t *sd = static_cast<ScaledDigit_t*>(obj);
436 TClonesArray *digits = fInfo->GetDigits(fID, fDetID);
437 Int_t ndigits = digits->GetEntriesFast();
439 printf("%d digits in cell scaleX = %d, scaleZ = %d \n", sd->fN, fNCx, fNCz);
442 for(Int_t k=0; k<ndigits; k++)
444 AliITSdigit *d = (AliITSdigit*) digits->UncheckedAt(k);
446 if(d->GetCoord1()>=sd->fMinI && d->GetCoord1()<=sd->fMaxI &&
447 d->GetCoord2()>=sd->fMinJ && d->GetCoord2()<=sd->fMaxJ)
449 printf("%3d, %3d: %3d", d->GetCoord1(), d->GetCoord2(), d->GetSignal());