-//====================================================================
-//
-// Graphics and event display
-//
-//____________________________________________________________________
-void
-AliFMD::BuildGeometry()
-{
- //
- // Build simple ROOT TNode geometry for event display. With the new
- // geometry modeller, TGeoManager, this seems rather redundant.
- AliDebug(10, "\tCreating a simplified geometry");
-
- AliFMDGeometry* fmd = AliFMDGeometry::Instance();
-
- static TXTRU* innerShape = 0;
- static TXTRU* outerShape = 0;
- static TObjArray* innerRot = 0;
- static TObjArray* outerRot = 0;
-
- if (!innerShape || !outerShape) {
- // Make the shapes for the modules
- for (Int_t i = 0; i < 2; i++) {
- AliFMDRing* r = 0;
- switch (i) {
- case 0: r = fmd->GetRing('I'); break;
- case 1: r = fmd->GetRing('O'); break;
- }
- if (!r) {
- AliError(Form("no ring found for i=%d", i));
- return;
- }
- Double_t siThick = r->GetSiThickness();
- const Int_t knv = r->GetNVerticies();
- Double_t theta = r->GetTheta();
- Int_t nmod = r->GetNModules();
-
- TXTRU* shape = new TXTRU(r->GetName(), r->GetTitle(), "void", knv, 2);
- for (Int_t j = 0; j < knv; j++) {
- TVector2* vv = r->GetVertex(knv - 1 - j);
- shape->DefineVertex(j, vv->X(), vv->Y());
- }
- shape->DefineSection(0, -siThick / 2, 1, 0, 0);
- shape->DefineSection(1, +siThick / 2, 1, 0, 0);
- shape->SetLineColor(GetLineColor());
-
- TObjArray* rots = new TObjArray(nmod);
- for (Int_t j = 0; j < nmod; j++) {
- Double_t th = (j + .5) * theta * 2;
- TString name(Form("FMD_ring_%c_rot_%02d", r->GetId(), j));
- TString title(Form("FMD Ring %c Rotation # %d", r->GetId(), j));
- TRotMatrix* rot = new TRotMatrix(name.Data(), title.Data(),
- 90, th, 90, fmod(90+th,360), 0, 0);
- rots->AddAt(rot, j);
- }
-
- switch (r->GetId()) {
- case 'i':
- case 'I': innerShape = shape; innerRot = rots; break;
- case 'o':
- case 'O': outerShape = shape; outerRot = rots; break;
- }
- }
- }
-
- TNode* top = gAlice->GetGeometry()->GetNode("alice");
-
- for (Int_t i = 1; i <= 3; i++) {
- AliFMDDetector* det = fmd->GetDetector(i);
- if (!det) {
- Warning("BuildGeometry", "FMD%d seems to be disabled", i);
- continue;
- }
- Double_t w = 0;
- Double_t rh = det->GetRing('I')->GetHighR();
- Char_t id = 'I';
- if (det->GetRing('O')) {
- w = TMath::Abs(det->GetRingZ('O') - det->GetRingZ('I'));
- id = (TMath::Abs(det->GetRingZ('O'))
- > TMath::Abs(det->GetRingZ('I')) ? 'O' : 'I');
- rh = det->GetRing('O')->GetHighR();
- }
- w += (det->GetRing(id)->GetModuleSpacing() +
- det->GetRing(id)->GetSiThickness());
- TShape* shape = new TTUBE(det->GetName(), det->GetTitle(), "void",
- det->GetRing('I')->GetLowR(), rh, w / 2);
- Double_t z = (det->GetRingZ('I') - w / 2);
- if (z > 0) z += det->GetRing(id)->GetModuleSpacing();
- top->cd();
- TNode* node = new TNode(det->GetName(), det->GetTitle(), shape,
- 0, 0, z, 0);
- fNodes->Add(node);
-
- for (Int_t j = 0; j < 2; j++) {
- AliFMDRing* r = 0;
- TShape* rshape = 0;
- TObjArray* rots = 0;
- switch (j) {
- case 0:
- r = det->GetRing('I'); rshape = innerShape; rots = innerRot; break;
- case 1:
- r = det->GetRing('O'); rshape = outerShape; rots = outerRot; break;
- }
- if (!r) continue;
-
- Double_t siThick = r->GetSiThickness();
- Int_t nmod = r->GetNModules();
- Double_t modspace = r->GetModuleSpacing();
- Double_t rz = - (z - det->GetRingZ(r->GetId()));
-
- for (Int_t k = 0; k < nmod; k++) {
- node->cd();
- Double_t offz = (k % 2 == 1 ? modspace : 0);
- TRotMatrix* rot = static_cast<TRotMatrix*>(rots->At(k));
- TString name(Form("%s%c_module_%02d", det->GetName(), r->GetId(),k));
- TString title(Form("%s%c Module %d", det->GetName(), r->GetId(),k));
- TNode* mnod = new TNode(name.Data(), title.Data(), rshape,
- 0, 0, rz - siThick / 2
- + TMath::Sign(offz,z), rot);
- mnod->SetLineColor(GetLineColor());
- fNodes->Add(mnod);
- } // for (Int_t k = 0 ; ...)
- } // for (Int_t j = 0 ; ...)
- } // for (Int_t i = 1 ; ...)
-}
-
-//____________________________________________________________________
-void
-AliFMD::LoadPoints(Int_t /* track */)
-{
- // Store x, y, z of all hits in memory for display.
- //
- // Normally, the hits are drawn using TPolyMarker3D - however, that
- // is not very useful for the FMD. Therefor, this member function
- // is overloaded to make TMarker3D, via the class AliFMDPoints.
- // AliFMDPoints is a local class.
- //
- if (!fHits) {
- AliError(Form("fHits == 0. Name is %s",GetName()));
- return;
- }
- Int_t nHits = fHits->GetEntriesFast();
- if (nHits == 0) {
- return;
- }
- Int_t tracks = gAlice->GetMCApp()->GetNtrack();
- if (fPoints == 0) fPoints = new TObjArray(2 * tracks);
-
- // Get geometry
- AliFMDGeometry* geom = AliFMDGeometry::Instance();
- geom->Init();
- geom->InitTransformations();
-
- // Now make markers for each hit
- // AliInfo(Form("Drawing %d hits (have %d points) for track %d",
- // nHits, fPoints->GetEntriesFast(), track));
- for (Int_t ihit = 0; ihit < nHits; ihit++) {
- AliFMDHit* hit = static_cast<AliFMDHit*>(fHits->At(ihit));
- if (!hit) continue;
- Double_t edep = hit->Edep();
- Double_t m = hit->M();
- Double_t poverm = (m == 0 ? 0 : hit->P());
- Double_t absQ = TMath::Abs(hit->Q());
- Bool_t bad = kFALSE;
- // This `if' is to debug abnormal energy depositions. We trigger on
- // p/m approx larger than or equal to a MIP, and a large edep - more
- // than 1 keV - a MIP is 100 eV.
- if (edep > absQ * absQ && poverm > 1) bad = kTRUE;
-
- AliFMDPoints* p1 = new AliFMDPoints(hit, GetMarkerColor());
- // AliPoints* p1 = new AliPoints();
- // p1->SetMarkerColor(GetMarkerColor());
- // p1->SetMarkerSize(GetMarkerSize());
- // p1->SetPoint(0, hit->X(), hit->Y(), hit->Z());
- p1->SetDetector(this);
- p1->SetParticle(hit->GetTrack());
- fPoints->AddAt(p1, hit->GetTrack());
- if (bad) {
- p1->SetMarkerColor(4);
- // p1->SetMarkerSize(2 * GetMarkerSize());
- }
-
- Double_t x, y, z;
- geom->Detector2XYZ(hit->Detector(), hit->Ring(), hit->Sector(),
- hit->Strip(), x, y, z);
- AliFMDPoints* p = new AliFMDPoints(hit, 3);
- // AliPoints* p = new AliPoints();
- // p->SetMarkerColor(3);
- // p->SetMarkerSize(GetMarkerSize());
- // p->SetPoint(0, x, y, z);
- p->SetDetector(this);
- p->SetParticle(hit->GetTrack());
- p->SetXYZ(x, y, z);
- p->SetMarkerColor(3);
- fPoints->AddAt(p, tracks+hit->GetTrack());
- if (bad) {
- p->SetMarkerColor(5);
- // p->SetMarkerSize(2 * GetMarkerSize());
- }
- // AliInfo(Form("Adding point at %d", tracks+hit->GetTrack()));
- }
-}
-
-//____________________________________________________________________
-void
-AliFMD::DrawDetector()
-{
- // Draw a shaded view of the Forward multiplicity detector. This
- // isn't really useful anymore.
- AliDebug(10, "\tDraw detector");
-}
-
-//____________________________________________________________________
-Int_t
-AliFMD::DistancetoPrimitive(Int_t, Int_t)
-{
- // Calculate the distance from the mouse to the FMD on the screen
- // Dummy routine.
- //
- return 9999;
-}