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