]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/EveDet/AliEveITSScaledModule.cxx
Looser default cut values.
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveITSScaledModule.cxx
CommitLineData
d810d0de 1// $Id$
2// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3b868b75 3
d810d0de 4/**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
51346b82 7 * full copyright notice. *
d810d0de 8 **************************************************************************/
9
10#include "AliEveITSScaledModule.h"
3b868b75 11
0879c50b 12#include <AliITSsegmentationSPD.h>
13#include <AliITSsegmentationSDD.h>
14#include <AliITSsegmentationSSD.h>
15
3b868b75 16#include <AliITSdigitSPD.h>
17#include <AliITSdigitSDD.h>
18#include <AliITSdigitSSD.h>
d810d0de 19
0879c50b 20#include <TMath.h>
a15e6d7d 21#include <TClonesArray.h>
3b868b75 22
a15e6d7d 23//==============================================================================
24//==============================================================================
d810d0de 25// AliEveDigitScaleInfo
a15e6d7d 26//==============================================================================
27
28//______________________________________________________________________________
3b868b75 29//
a15e6d7d 30// Encapsulates current state of scaling and agglomeration.
698e2c9b 31
d810d0de 32ClassImp(AliEveDigitScaleInfo)
3b868b75 33
d810d0de 34AliEveDigitScaleInfo::AliEveDigitScaleInfo():
3b868b75 35 fScale(1),
a15e6d7d 36 fStatType (kSTAverage),
32e219c2 37 fSyncPalette(kFALSE)
3b868b75 38{
39}
40
d810d0de 41void AliEveDigitScaleInfo::ScaleChanged(Int_t s)
3b868b75 42{
32e219c2 43 fScale = s;
51346b82 44
d810d0de 45 AliEveITSScaledModule* sm;
84aff7a4 46 std::list<TEveElement*>::iterator i = fBackRefs.begin();
32e219c2 47 while (i != fBackRefs.end())
48 {
d810d0de 49 sm = dynamic_cast<AliEveITSScaledModule*>(*i);
32e219c2 50 if(sm) sm->LoadQuads();
51 ++i;
52 }
3b868b75 53}
54
d810d0de 55void AliEveDigitScaleInfo::StatTypeChanged(Int_t t)
3b868b75 56{
32e219c2 57 fStatType = t;
58 fSyncPalette = kTRUE;
51346b82 59
d810d0de 60 AliEveITSScaledModule* sm;
84aff7a4 61 std::list<TEveElement*>::iterator i = fBackRefs.begin();
32e219c2 62 while (i != fBackRefs.end())
63 {
d810d0de 64 sm = dynamic_cast<AliEveITSScaledModule*>(*i);
a15e6d7d 65 if (sm) sm->SetQuadValues();
32e219c2 66 ++i;
67 }
3b868b75 68}
69
57ffa5fb 70//______________________________________________________________________________
a15e6d7d 71// ScaledDigit_t
3b868b75 72//
c76ea574 73
a15e6d7d 74AliEveITSScaledModule::ScaledDigit_t::ScaledDigit_t() :
3b868b75 75 TObject(),
a15e6d7d 76 fN(0),
77 fSum(0), fSqrSum(0),
78 fMinI(-1), fMinJ(-1), fMaxI(-1), fMaxJ(-1)
3b868b75 79{
80}
81
a15e6d7d 82AliEveITSScaledModule::ScaledDigit_t::ScaledDigit_t(Int_t di, Int_t dj) :
3b868b75 83 TObject(),
a15e6d7d 84 fN(0),
85 fSum(0), fSqrSum(0),
86 fMinI(di), fMinJ(dj), fMaxI(di), fMaxJ(dj)
3b868b75 87{
88}
89
a15e6d7d 90void AliEveITSScaledModule::ScaledDigit_t::Dump() const
3b868b75 91{
a15e6d7d 92 printf("N %d, sum %f, sqr_sum %f", fN, fSum, fSqrSum);
3b868b75 93}
94
698e2c9b 95
a15e6d7d 96//==============================================================================
97//==============================================================================
d810d0de 98// AliEveITSScaledModule
a15e6d7d 99//==============================================================================
698e2c9b 100
101//______________________________________________________________________________
3b868b75 102//
698e2c9b 103// Visualization of an ITS module with digits aggregated
104// on a grid of pre-defined size.
3b868b75 105
d810d0de 106ClassImp(AliEveITSScaledModule)
3b868b75 107
d810d0de 108AliEveITSScaledModule::AliEveITSScaledModule(Int_t gid, AliEveITSDigitsInfo* info, AliEveDigitScaleInfo* si):
109 AliEveITSModule("AliEveITSScaledModule", "AliEveITSScaledModule"),
3b868b75 110 fNx(-1),
111 fNz(-1),
112 fNCx(-1),
03dfc4a7 113 fNCz(-1),
9af86b69 114 fScaleInfo(si),
115 fDigitsMap()
3b868b75 116{
3b868b75 117 SetOwnIds(kTRUE);
118
119 SetDigitsInfo(info);
51346b82 120 SetID(gid);
32e219c2 121 fScaleInfo->IncRefCount(this);
3b868b75 122}
123
d810d0de 124AliEveITSScaledModule::~AliEveITSScaledModule()
3b868b75 125{
32e219c2 126 fScaleInfo->DecRefCount(this);
3b868b75 127}
128
57ffa5fb 129/******************************************************************************/
3b868b75 130
d810d0de 131void AliEveITSScaledModule::LoadQuads()
3b868b75 132{
133 // Here we still use 'z' for the name of axial coordinates.
134 // The transforamtion matrix aplied rotates y -> z.
84aff7a4 135 // We need this as TEveQuadSet offers optimized treatment for
3b868b75 136 // quads in the x-y plane.
137
138 TClonesArray *digits;
139 Float_t x, z, zo, dpx, dpz; // orig cells size, pos
140 Int_t i, j, ndigits; // orig cells idx
141 Int_t c1, c2; // original coordinates
142
143 Int_t id;
fd31e9de 144 std::map<Int_t, Int_t> dmap;
145 std::map<Int_t, Int_t>::iterator miter;
3b868b75 146 digits = fInfo->GetDigits(fID, fDetID);
147 ndigits = digits->GetEntriesFast();
148
03dfc4a7 149 Int_t scale = fScaleInfo->GetScale() -1;
3b868b75 150 switch(fDetID)
151 {
51346b82 152 case 0:
153 {
3b868b75 154 // SPD
84aff7a4 155 Reset(kQT_RectangleXZFixedY, kFALSE, 32);
3b868b75 156
157 fNCz = fInfo->fSPDScaleZ[scale];
158 fNCx = fInfo->fSPDScaleX[scale];
159 fNz = Int_t(fInfo->fSegSPD->Npz()/fNCz);
160 fNx = Int_t(fInfo->fSegSPD->Npx()/fNCx);
51346b82 161 dpz = 2*fDz/fNz;
3b868b75 162 dpx = 2*fDx/fNx;
163 //printf("SPD orig cells (%d, %d) (%d, %d)\n", fInfo->fSegSPD->Npx(), fInfo->fSegSPD->Npz(), Nx, Nz);
164
165 AliITSdigitSPD *od ;
166 for (Int_t k=0; k<ndigits; ++k)
167 {
168 od = (AliITSdigitSPD*) digits->UncheckedAt(k);
169
170 fInfo->GetSPDLocalZ(od->GetCoord1(),zo);
171 c1 = od->GetCoord1(); c2 = od->GetCoord2();
9af86b69 172 i = Int_t((zo+fDz)/dpz);
173 j = Int_t((od->GetCoord2()*fNx)/fInfo->fSegSPD->Npx());
3b868b75 174 id = j*fNx + i;
51346b82 175
9af86b69 176 ScaledDigit_t* sd = 0;
3b868b75 177 miter = dmap.find(id);
178 if(miter == dmap.end())
51346b82 179 {
3b868b75 180 dmap[id] = fPlex.Size();
181 z = dpz*(i) - fDz;
182 x = dpx*(j) - fDx;
183 AddQuad(x, z, dpx, dpz);
a15e6d7d 184 sd = new ScaledDigit_t(c1, c2);
3b868b75 185 QuadId(sd);
186 }
51346b82 187 else
3b868b75 188 {
a15e6d7d 189 sd = dynamic_cast<ScaledDigit_t*>(GetId(miter->second));
190 if(c1 < sd->fMinI)
191 sd->fMinI = c1;
192 else if( c1 > sd->fMaxI)
193 sd->fMaxI = c1;
194
195 if(c2 < sd->fMinJ)
196 sd->fMinJ = c2;
197 else if( c2 > sd->fMaxJ)
198 sd->fMaxJ = c2;
3b868b75 199 }
51346b82 200
a15e6d7d 201 sd->fN++;
202 sd->fSum += od->GetSignal();
203 sd->fSqrSum += od->GetSignal()*od->GetSignal();
3b868b75 204 }
205 break;
206 }
51346b82 207 case 1:
208 {
3b868b75 209 // SDD
84aff7a4 210 Reset(kQT_RectangleXZFixedY, kFALSE, 32);
3b868b75 211
212 fNCz = fInfo->fSDDScaleZ[scale];
51346b82 213 fNCx = fInfo->fSDDScaleX[scale];
3b868b75 214 fNz = Int_t(fInfo->fSegSDD->Npz()/fNCz);
215 fNx = Int_t(fInfo->fSegSDD->Npx()/fNCx);
9af86b69 216 dpz = 2*fDz/fNz;
217 dpx = 2*fDx/fNx;
3b868b75 218
9af86b69 219 AliITSdigitSDD *od = 0;
220 for (Int_t k = 0; k < ndigits; ++k)
221 {
222 od = (AliITSdigitSDD*)digits->UncheckedAt(k);
3b868b75 223 fInfo->fSegSDD->DetToLocal(od->GetCoord2(), od->GetCoord1(),x,z);
9af86b69 224 z += fDz;
225 x += fDx;
226 i = Int_t(z/dpz);
227 j = Int_t(x/dpx);
3b868b75 228 //printf("Mod %d coord %d,%d out of %d,%d :: ORIG coord %d,%d out of %d,%d \n",fID,
229 // i,j,Nz,Nx,od->GetCoord1(),od->GetCoord2(),fInfo->fSegSDD->Npz(),fInfo->fSegSDD->Npx());
230
231 id = j*fNx + i;
232 c1 = od->GetCoord1(); c2 = od->GetCoord2();
51346b82 233
9af86b69 234 ScaledDigit_t* sd = 0;
3b868b75 235 miter = dmap.find(id);
236 if(miter == dmap.end())
51346b82 237 {
3b868b75 238 dmap[id] = fPlex.Size();
239 z = dpz*(i) - fDz;
240 x = dpx*(j) - fDx;
241 AddQuad(x, z, dpx, dpz);
a15e6d7d 242 sd = new ScaledDigit_t(od->GetCoord1(),od->GetCoord2());
3b868b75 243 QuadId(sd);
244 }
51346b82 245 else
3b868b75 246 {
a15e6d7d 247 sd = dynamic_cast<ScaledDigit_t*>(GetId(miter->second));
248 if(c1 < sd->fMinI)
249 sd->fMinI = c1;
250 else if( c1 > sd->fMaxI)
251 sd->fMaxI = c1;
252
253 if(c2 < sd->fMinJ)
254 sd->fMinJ = c2;
255 else if( c2 > sd->fMaxJ)
256 sd->fMaxJ = c2;
3b868b75 257 }
a15e6d7d 258 sd->fN++;
259 sd->fSum += od->GetSignal();
260 sd->fSqrSum += od->GetSignal()*od->GetSignal();
3b868b75 261 }
262 break;
51346b82 263 }
264 case 2:
265 {
266 // SSD
84aff7a4 267 Reset(kQT_LineXZFixedY, kFALSE, 32);
3b868b75 268
51346b82 269 AliITSsegmentationSSD* seg = fInfo->fSegSSD;
3b868b75 270 Float_t ap, an; // positive/negative angles -> offsets
271 seg->Angles(ap, an);
272 ap = TMath::Tan(ap) * fDz;
273 an = - TMath::Tan(an) * fDz;
274
51346b82 275 fNCx = fInfo->fSSDScale[scale];
3b868b75 276 fNz = 1;
277 fNx = Int_t(fInfo->fSegSSD->Npx()/fNCx);
278 dpz = 2*fDz/fNz;
279 dpx = 2*fDx/fNx;
280
9af86b69 281 AliITSdigitSSD *od = 0;
3b868b75 282 for (Int_t k=0; k<ndigits; k++) {
283 od=(AliITSdigitSSD*)digits->UncheckedAt(k);
51346b82 284 if(od->GetCoord1() == 1)
3b868b75 285 i = 1; // p side
51346b82 286 else
3b868b75 287 i= -1; // n side
288 j = Int_t(od->GetCoord2()/fNCx);
289 c1 = od->GetCoord1(); c2 = od->GetCoord2();
51346b82 290 id = j*i;
3b868b75 291
9af86b69 292 ScaledDigit_t* sd = 0;
3b868b75 293 miter = dmap.find(id);
3b868b75 294 if(miter == dmap.end())
51346b82 295 {
3b868b75 296 // printf("orig digit %d,%d scaled %d,%d \n",od->GetCoord1(),od->GetCoord2(),i,j);
297 dmap[id] = fPlex.Size();
298 z = dpz*(i) - fDz;
299 x = dpx*(j) - fDx;
300 Float_t a = ( od->GetCoord1() == 1) ? ap : an;
301 AddLine(x-a, -fDz, 2*a, 2*fDz);
302
a15e6d7d 303 sd = new ScaledDigit_t(c1, c2);
3b868b75 304 QuadId(sd);
305 }
51346b82 306 else
3b868b75 307 {
a15e6d7d 308 sd = dynamic_cast<ScaledDigit_t*>(GetId(miter->second));
309 if(c1 < sd->fMinI)
310 sd->fMinI = c1;
311 else if( c1 > sd->fMaxI)
312 sd->fMaxI = c1;
313
314 if(c2 < sd->fMinJ)
315 sd->fMinJ = c2;
316 else if( c2 > sd->fMaxJ)
317 sd->fMaxJ = c2;
3b868b75 318 }
a15e6d7d 319 sd->fN++;
320 sd->fSum += od->GetSignal();
321 sd->fSqrSum += od->GetSignal()*od->GetSignal();
3b868b75 322 } // for digits
323 break;
324 } // end case 2
325 } // end switch
326
327 SetQuadValues();
328 RefitPlex();
329}
330
57ffa5fb 331/******************************************************************************/
3b868b75 332
d810d0de 333void AliEveITSScaledModule::SetQuadValues()
3b868b75 334{
32e219c2 335 if(fScaleInfo->GetSyncPalette()) SyncPalette();
336
a15e6d7d 337 Int_t num = fPlex.Size();
338 for (Int_t i = 0 ; i < num; i++)
3b868b75 339 {
a15e6d7d 340 ScaledDigit_t* sd = dynamic_cast<ScaledDigit_t*>(GetId(i));
3b868b75 341 Int_t v = 0;
32e219c2 342 switch(fScaleInfo->GetStatType())
343 {
344 using namespace TMath;
345
a15e6d7d 346 case AliEveDigitScaleInfo::kSTOccup:
347 v = Nint((100.0*sd->fN) / (fNCx*fNCz));
32e219c2 348 break;
a15e6d7d 349 case AliEveDigitScaleInfo::kSTAverage:
350 v = Nint((Double_t) sd->fSum / sd->fN);
32e219c2 351 break;
a15e6d7d 352 case AliEveDigitScaleInfo::kSTRms:
353 v = Nint(Sqrt(sd->fSqrSum) / sd->fN);
32e219c2 354 break;
3b868b75 355 }
84aff7a4 356 DigitBase_t* qb = GetDigit(i);
3b868b75 357 qb->fValue = v;
358 }
359}
360
57ffa5fb 361/******************************************************************************/
3b868b75 362
d810d0de 363void AliEveITSScaledModule::SyncPalette()
51346b82 364{
d810d0de 365 // printf("AliEveITSScaledModule::SyncPalette()\n");
a15e6d7d 366 if(fScaleInfo->GetStatType() == AliEveDigitScaleInfo::kSTOccup)
32e219c2 367 {
368 // SPD
d810d0de 369 AliEveITSModule::fgSPDPalette->SetLimits(0, 100);
370 AliEveITSModule::fgSPDPalette->SetMinMax(0, 100);
51346b82 371
32e219c2 372 // SDD
d810d0de 373 AliEveITSModule::fgSDDPalette->SetLimits(0, 100);
374 AliEveITSModule::fgSDDPalette->SetMinMax(0, 100);
32e219c2 375
376 // SSD
d810d0de 377 AliEveITSModule::fgSSDPalette->SetLimits(0, 100);
378 AliEveITSModule::fgSDDPalette->SetMinMax(0, 100);
32e219c2 379 }
380 else
381 {
a15e6d7d 382 AliEveITSDigitsInfo& di = *fInfo;
32e219c2 383 // SPD
a15e6d7d 384 AliEveITSModule::fgSPDPalette->SetLimits(0, di.fSPDHighLim);
385 AliEveITSModule::fgSPDPalette->SetMinMax(di.fSPDMinVal, di.fSPDMaxVal);
51346b82 386
32e219c2 387 // SDD
a15e6d7d 388 AliEveITSModule::fgSDDPalette->SetLimits(0, di.fSDDHighLim);
389 AliEveITSModule::fgSDDPalette->SetMinMax(di.fSDDMinVal, di.fSDDMaxVal);
32e219c2 390
391 // SSD
a15e6d7d 392 AliEveITSModule::fgSSDPalette->SetLimits(0, di.fSSDHighLim);
393 AliEveITSModule::fgSSDPalette->SetMinMax(di.fSSDMinVal, di.fSSDMaxVal);
32e219c2 394 }
395
396 fScaleInfo->SetSyncPalette(kFALSE);
397}
398
57ffa5fb 399/******************************************************************************/
32e219c2 400
a15e6d7d 401void AliEveITSScaledModule::GetScaleData(Int_t& cnx, Int_t& cnz, Int_t& total) const
32e219c2 402{
a15e6d7d 403 cnx = fNx;
404 cnz = fNz;
32e219c2 405 total = cnx*cnz;
406}
407
57ffa5fb 408/******************************************************************************/
32e219c2 409
d810d0de 410void AliEveITSScaledModule::DigitSelected(Int_t idx)
3b868b75 411{
84aff7a4 412 // Override control-click from TEveQuadSet
d810d0de 413 printf("AliEveITSScaledModule::DigitSelected "); Print();
3b868b75 414
84aff7a4 415 DigitBase_t* qb = GetDigit(idx);
3b868b75 416 TObject* obj = qb->fId.GetObject();
a15e6d7d 417 ScaledDigit_t* sd = dynamic_cast<ScaledDigit_t*>(obj);
3b868b75 418 TClonesArray *digits = fInfo->GetDigits(fID, fDetID);
419 Int_t ndigits = digits->GetEntriesFast();
420
a15e6d7d 421 printf("%d digits in cell scaleX = %d, scaleZ = %d \n", sd->fN, fNCx, fNCz);
3b868b75 422
423 Int_t il = 0;
51346b82 424 for(Int_t k=0; k<ndigits; k++)
3b868b75 425 {
426 AliITSdigit *d = (AliITSdigit*) digits->UncheckedAt(k);
427
a15e6d7d 428 if(d->GetCoord1()>=sd->fMinI && d->GetCoord1()<=sd->fMaxI &&
429 d->GetCoord2()>=sd->fMinJ && d->GetCoord2()<=sd->fMaxJ)
3b868b75 430 {
431 printf("%3d, %3d: %3d", d->GetCoord1(), d->GetCoord2(), d->GetSignal());
432 printf(" | ");
433 il++;
434 if(il>5) {
435 printf("\n");
436 il = 0;
437 }
438 }
439 }
440 if(il) printf("\n");
441}