00001
00002 #include "bfemDisplay/AcdDisplay.h"
00003
00004 ClassImp(AcdDisplay)
00005
00006 AcdDisplay::AcdDisplay( TNode *parent, TObjArray *acdpeds ) {
00007
00008 m_acdpeds = acdpeds;
00009
00010
00011
00012 parent->cd();
00013
00014 TBRIK* acdFrame = new TBRIK( "acdFrame", "acdFrame", "void", 0.0, 0.0, 0.0 );
00015 acdFrame->SetLineColor( 1 );
00016
00017 m_acdFrameNode = new TNode( "acdFrameNode", "acdFrameNode", "acdFrame" );
00018
00019 m_AcdNodeList = 0;
00020 m_AcdShapeList = 0;
00021
00022 m_XgtNodeList = 0;
00023 m_XgtShapeList = 0;
00024
00025
00026
00027
00028
00032
00033
00034
00035
00036 m_tileSizes = new TObjArray(6);
00037
00038 TVector3* type0Size = new TVector3(44.2,30.0,1.);
00039
00040 m_tileSizes->AddAt(type0Size,0);
00041
00042 TVector3* type1Size = new TVector3(1.,43.2,29.7);
00043
00044 m_tileSizes->AddAt(type1Size,1);
00045
00046 TVector3* type2Size = new TVector3(1.,43.2,28.4);
00047
00048 m_tileSizes->AddAt(type2Size,2);
00049
00050 TVector3* type3Size = new TVector3(43.2,1.,29.7);
00051
00052 m_tileSizes->AddAt(type3Size,3);
00053
00054 TVector3* type4Size = new TVector3(43.2,1.,28.4);
00055
00056 m_tileSizes->AddAt(type4Size,4);
00057
00058 TVector3* type5Size = new TVector3(20.4,20.4,1.);
00059
00060 m_tileSizes->AddAt(type5Size,5);
00061
00062
00063
00064
00065 m_tileCenters = new TObjArray(20);
00066
00067 TVector3* acd14Pos = new TVector3(-10.35,-10.35,56.57);
00068
00069 m_tileCenters->AddAt(acd14Pos,0);
00070
00071 TVector3* acd13Pos = new TVector3(10.35,-10.35,56.57);
00072
00073 m_tileCenters->AddAt(acd13Pos,1);
00074
00075 TVector3* acd20Pos = new TVector3(-10.35,10.35,56.57);
00076
00077 m_tileCenters->AddAt(acd20Pos,2);
00078
00079 TVector3* acd19Pos = new TVector3(10.35,10.35,56.57);
00080
00081 m_tileCenters->AddAt(acd19Pos,3);
00082
00083 TVector3* acd8Pos = new TVector3(-21.1,0.,44.87);
00084
00085 m_tileCenters->AddAt(acd8Pos,4);
00086
00087 TVector3* acd2Pos = new TVector3(-22.1,0.,17.29);
00088
00089 m_tileCenters->AddAt(acd2Pos,5);
00090
00091 TVector3* acd9Pos = new TVector3(0.,-21.1,44.87);
00092
00093 m_tileCenters->AddAt(acd9Pos,6);
00094
00095 TVector3* acd3Pos = new TVector3(0.,-22.1,17.29);
00096
00097 m_tileCenters->AddAt(acd3Pos,7);
00098
00099 TVector3* acd7Pos = new TVector3(21.1,0.,44.87);
00100
00101 m_tileCenters->AddAt(acd7Pos,8);
00102
00103 TVector3* acd1Pos = new TVector3(22.1,0.,17.29);
00104
00105 m_tileCenters->AddAt(acd1Pos,9);
00106
00107 TVector3* acd6Pos = new TVector3(0.,21.1,44.87);
00108
00109 m_tileCenters->AddAt(acd6Pos,10);
00110
00111 TVector3* acd18Pos = new TVector3(0.,22.1,17.29);
00112
00113 m_tileCenters->AddAt(acd18Pos,11);
00114
00115 TVector3* acd12Pos = new TVector3(0.,0.,57.67);
00116
00117 m_tileCenters->AddAt(acd12Pos,12);
00118
00119
00120
00121
00122
00123
00124
00125
00126 m_XgtCenters = new TObjArray(4);
00127
00128 TVector3* Xgt2pos = new TVector3(-12.374,-12.374,69.67);
00129
00130 m_XgtCenters->AddAt(Xgt2pos,0);
00131
00132 TVector3* Xgt1pos = new TVector3(12.374,-12.374,69.67);
00133
00134 m_XgtCenters->AddAt(Xgt1pos,1);
00135
00136 TVector3* Xgt3pos = new TVector3(-12.374,12.374,69.67);
00137
00138 m_XgtCenters->AddAt(Xgt3pos,2);
00139
00140 TVector3* Xgt0pos = new TVector3(12.374,12.374,69.67);
00141
00142 m_XgtCenters->AddAt(Xgt0pos,3);
00143
00144
00145 m_XgtSize = new TVector3(5.,10.,5.);
00146
00147
00148
00149 }
00150
00151 void AcdDisplay::DrawEvents( DigiEvent *event ) {
00152
00153 m_event = event;
00154
00155 m_acdFrameNode->cd();
00156
00157 drawAcdEvents();
00158
00159 setXGTthr();
00160
00161 drawXgtEvents();
00162
00163 }
00164
00165
00166 void AcdDisplay::setXGTthr() {
00167
00168
00169
00170 for (Int_t i=0; i<4; i++) {
00171
00172 m_xgtthr[0][i] = 50. + 300.*m_mip[i];
00173 m_xgtthr[1][i] = 150.+ 230.*m_mip[i];
00174 m_xgtthr[2][i] = 140.+ 240.*m_mip[i];
00175 m_xgtthr[3][i] = 130.+ 230.*m_mip[i];
00176
00177 }
00178
00179 return;
00180
00181 }
00182
00183
00184 void AcdDisplay::drawAcdEvents() {
00185
00186
00187
00188
00189
00190 if ( m_AcdNodeList ) m_AcdNodeList->Delete();
00191 m_AcdNodeList = new TObjArray();
00192
00193 if (m_AcdShapeList != 0) m_AcdShapeList->Delete();
00194 m_AcdShapeList = new TObjArray();
00195
00196 Char_t* acd_name=0;
00197
00198 Int_t nACD = m_event->getAcdDigi()->GetEntries();
00199
00200 for (Int_t ihit=0; ihit < nACD; ihit++) {
00201
00202 m_event->getAcdDigi()->Sort();
00203
00204 AcdTile *hit = (AcdTile*)m_event->getAcdDigi()->At(ihit);
00205
00206 AcdId *tile = (AcdId*)hit->getId();
00207
00208 Int_t id = tile->getId();
00209
00210 if (id > 1000) continue;
00211
00212 acd_name = getAcdName(id);
00213
00214 Float_t acdPH = ( ( AcdTile* )m_event->getAcdTile(id) )->getPulseHeight();
00215
00216 Float_t eTotal = getACDEnergy(id, nACD, acdPH);
00217
00218 if ( eTotal > m_acd_lev[ 0 ] ) {
00219
00220
00221
00222 Float_t width, length, height;
00223 Int_t index;
00224
00225 if (id == 1000) index = 0;
00226 if (id == 110 || id == 310) index = 1;
00227 if (id == 100 || id == 300) index = 2;
00228 if (id == 210 || id == 410) index = 3;
00229 if (id == 200 || id == 400) index = 4;
00230 if (id < 100) index = 5;
00231
00232 width = ((TVector3*) m_tileSizes->At(index))->X()/2.;
00233 length = ((TVector3*) m_tileSizes->At(index))->Y()/2.;
00234 height = ((TVector3*) m_tileSizes->At(index))->Z()/2.;
00235
00236 TBRIK *acdTile = new TBRIK(acd_name,acd_name,"void",width,length,height);
00237 m_AcdShapeList->Add(acdTile);
00238
00239 Double_t x = ((TVector3*) m_tileCenters->At(ihit))->X();
00240 Double_t y = ((TVector3*) m_tileCenters->At(ihit))->Y();
00241 Double_t z = ((TVector3*) m_tileCenters->At(ihit))->Z();
00242
00243
00244
00245 if ( eTotal > m_acd_lev[ 3 ] ) acdTile->SetLineColor(5);
00246
00247 if ( eTotal > m_acd_lev[ 2 ] && eTotal < m_acd_lev[ 3 ] ) acdTile->SetLineColor(2);
00248
00249 if ( eTotal > m_acd_lev[ 1 ] && eTotal < m_acd_lev[ 2 ] ) acdTile->SetLineColor(4);
00250
00251 if ( eTotal > m_acd_lev[ 0 ] && eTotal < m_acd_lev[ 1 ] ) acdTile->SetLineColor(3);
00252
00253
00254 m_AcdNodeList->Add(new TNode(acd_name,acd_name,acd_name,x,y,z));
00255
00256 }
00257
00258 }
00259
00260 }
00261
00262 Float_t AcdDisplay::getACDEnergy(Int_t id, Int_t nACD, Float_t acdPH){
00263
00264 Float_t acdEn, acdPed;
00265
00266 TVector *acd_id, *acd_ped;
00267
00268 nACD = 13;
00269
00270 if ( m_acdpeds ) {
00271
00272 acd_id = (TVector *)m_acdpeds->At(0);
00273 acd_ped = (TVector *)m_acdpeds->At(1);
00274
00275
00276 for ( Int_t j=0; j<nACD; j++){
00277
00278 if ( acd_id->operator() (j) == id ) acdPed = acd_ped->operator() (j);
00279
00280 }
00281
00282
00283 acdEn = (acdPH - acdPed) / 350.;
00284
00285 return acdEn;
00286
00287 }
00288
00289 return 0.0;
00290
00291 }
00292
00293
00295
00296 void AcdDisplay::drawXgtEvents(){
00297
00298
00299
00300
00301 if ( m_XgtNodeList ) m_XgtNodeList->Delete();
00302 m_XgtNodeList = new TObjArray();
00303
00304 if ( m_XgtShapeList ) m_XgtShapeList->Delete();
00305 m_XgtShapeList = new TObjArray();
00306
00307
00308
00309
00310 Char_t* xgt_name=0;
00311
00312 Int_t nXGT = m_event->getXgtDigi()->GetEntries();
00313
00314 for (Int_t ihit=0; ihit < nXGT; ihit++) {
00315
00316 m_event->getXgtDigi()->Sort();
00317
00318 AcdTile *hit = (AcdTile*)m_event->getXgtDigi()->At(ihit);
00319
00320 AcdId *tile = (AcdId*) hit->getId();
00321
00322 Int_t id = tile->getId();
00323
00324 xgt_name = getXgtName(id);
00325
00326 Float_t xgtPH = ( ( AcdTile* )m_event->getXgt(id))->getPulseHeight();
00327
00328
00329
00330
00331 if ( xgtPH > m_xgtthr[ihit][0] ) {
00332
00333
00334
00335 Float_t width, length, height;
00336
00337
00338 width = m_XgtSize->X()/2.;
00339
00340 length = m_XgtSize->Y()/2.;
00341
00342 height = m_XgtSize->Z()/2.;
00343
00344
00345
00346 TBRIK *xgt = new TBRIK(xgt_name,xgt_name,"void",width,length,height);
00347
00348 m_XgtShapeList->Add(xgt);
00349
00350
00351
00352 Float_t x = ((TVector3*) m_XgtCenters->At(ihit))->X();
00353
00354 Float_t y = ((TVector3*) m_XgtCenters->At(ihit))->Y();
00355
00356 Float_t z = ((TVector3*) m_XgtCenters->At(ihit))->Z();
00357
00358
00359
00360
00361
00362 if ( xgtPH > m_xgtthr[ihit][3] ) xgt->SetLineColor(5);
00363
00364 if ( xgtPH > m_xgtthr[ihit][2] && xgtPH < m_xgtthr[ihit][3] ) xgt->SetLineColor(2);
00365
00366 if ( xgtPH > m_xgtthr[ihit][1] && xgtPH < m_xgtthr[ihit][2] ) xgt->SetLineColor(4);
00367
00368 if ( xgtPH > m_xgtthr[ihit][0] && xgtPH < m_xgtthr[ihit][1] ) xgt->SetLineColor(3);
00369
00370
00371 if (id == 2000 || id == 2011) {
00372
00373 m_XgtRot1 = new TRotMatrix("xgtrot1", "xgtrot1", 90., -45., 90.,45.,0., 0.);
00374
00375 m_XgtNodeList->Add(new TNode(xgt_name,xgt_name,xgt_name,x,y,z, "xgtrot1"));
00376
00377 }
00378
00379 else {
00380
00381 m_XgtRot2 = new TRotMatrix("xgtrot2", "xgtrot2", 90., 45., 90.,135.,0., 0.);
00382
00383 m_XgtNodeList->Add(new TNode(xgt_name,xgt_name,xgt_name,x,y,z, "xgtrot2"));
00384
00385 }
00386
00387 }
00388
00389 }
00390
00391 }
00392
00393
00394 void AcdDisplay::setThresholds( Float_t threshAcd[ 4 ], Float_t threshXgt[ 4 ] ) {
00395
00396 for ( Int_t lev=0; lev<4; ++lev ) {
00397 m_acd_lev[ lev ] = threshAcd[ lev ];
00398 m_mip[ lev ] = threshXgt[ lev ];
00399 }
00400
00401 }
00402
00403
00404
00406
00407 Char_t* AcdDisplay::getXgtName(Int_t id){
00408
00409 Char_t cs[40];
00410
00411 TString* XgtName = new TString("XGT");
00412
00413 sprintf(cs,"%d",id);
00414
00415 XgtName->Append(cs);
00416
00417 return (Char_t*)XgtName->Data();
00418
00419 }
00420
00421
00423
00424 Char_t* AcdDisplay::getAcdName(Int_t id) {
00425
00426 Char_t cs[40];
00427
00428 TString *AcdName = new TString("Tile ");
00429
00430 sprintf(cs,"%d",id);
00431
00432 AcdName->Append(cs);
00433
00434 return (Char_t*)AcdName->Data();
00435
00436 }