X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMD.cxx;h=9be365dde77b8975cefeb6987ccdb802e30fbe2d;hb=6ddaaee3dbf90d0c9ab9400e28410018bb852f8a;hp=17fb122553c5282eb8fd41eb0d825913bc143ef1;hpb=54e415a8144d14b99862abb4eb6e5b8f108304b6;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMD.cxx b/FMD/AliFMD.cxx index 17fb122553c..9be365dde77 100644 --- a/FMD/AliFMD.cxx +++ b/FMD/AliFMD.cxx @@ -12,15 +12,19 @@ * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ - /* $Id$ */ - +/** @file AliFMD.cxx + @author Christian Holm Christensen + @date Sun Mar 26 17:59:18 2006 + @brief Implementation of AliFMD base class +*/ //____________________________________________________________________ // // Forward Multiplicity Detector based on Silicon wafers. This class -// contains the base procedures for the Forward Multiplicity detector -// Detector consists of 3 sub-detectors FMD1, FMD2, and FMD3, each of -// which has 1 or 2 rings of silicon sensors. +// is the driver for especially simulation. +// +// The Forward Multiplicity Detector consists of 3 sub-detectors FMD1, +// FMD2, and FMD3, each of which has 1 or 2 rings of silicon sensors. // // This is the base class for all FMD manager classes. // @@ -41,22 +45,9 @@ // +--------+<>--+ | +------------------+ // | AliFMD | +--| AliFMDSDigitizer | // +--------+<>--+ +------------------+ -// 1 | +-----------------+ -// +--| AliFMDSimulator | -// +-----------------+ -// ^ -// | -// +-------------+-------------+ -// | | -// +--------------------+ +-------------------+ -// | AliFMDGeoSimulator | | AliFMDG3Simulator | -// +--------------------+ +-------------------+ -// ^ ^ -// | | -// +-----------------------+ +----------------------+ -// | AliFMDGeoOldSimulator | | AliFMDG3OldSimulator | -// +-----------------------+ +----------------------+ -// +// 1 | +---------------------+ +// +--| AliFMDReconstructor | +// +---------------------+ // // * AliFMD // This defines the interface for the various parts of AliROOT that @@ -79,19 +70,21 @@ // simulator tasks are responsible to implment the geoemtry, and // process hits. // -// * AliFMDGeoSimulator -// This is a concrete implementation of the AliFMDSimulator that -// uses the TGeo classes directly only. +// * AliFMDReconstructor +// This is a concrete implementation of the AliReconstructor that +// reconstructs pseudo-inclusive-multiplicities from digits (raw or +// from simulation) // -// * AliFMDG3Simulator -// This is a concrete implementation of the AliFMDSimulator that -// uses the TVirtualMC interface with GEANT 3.21-like messages. +// Calibration and geometry parameters are managed by separate +// singleton managers. These are AliFMDGeometry and +// AliFMDParameters. Please refer to these classes for more +// information on these. // // These files are not in the same directory, so there's no reason to // ask the preprocessor to search in the current directory for these // files by including them with `#include "..."' -#include // __CMATH__ +#include // __CMATH__ #include // ROOT_TClonesArray #include // ROOT_TGeomtry #include // ROOT_TNode @@ -100,33 +93,28 @@ #include // ROOT_TTUBE #include // ROOT_TTree #include // ROOT_TBrowser -#include // ROOT_TMath -#include // ROOT_TVirtualMC +// #include // ROOT_TVirtualMC +#include // ROOT_TVector2 +#include // ROOT_TGeoManager #include // ALIRUNDIGITIZER_H #include // ALILOADER_H #include // ALIRUN_H #include // ALIMC_H -#include "AliMagF.h" // ALIMAGF_H +#include // ALIMAGF_H #include // ALILOG_H #include "AliFMD.h" // ALIFMD_H -#include "AliFMDDigit.h" // ALIFMDDIGIG_H +#include "AliFMDDigit.h" // ALIFMDDIGIT_H +#include "AliFMDSDigit.h" // ALIFMDSDIGIT_H #include "AliFMDHit.h" // ALIFMDHIT_H #include "AliFMDGeometry.h" // ALIFMDGEOMETRY_H #include "AliFMDDetector.h" // ALIFMDDETECTOR_H #include "AliFMDRing.h" // ALIFMDRING_H #include "AliFMDDigitizer.h" // ALIFMDDIGITIZER_H -#ifdef USE_PRE_MOVE -#include "AliFMDSimulator.h" // ALIFMDSIMULATOR_H -#include "AliFMDG3Simulator.h" // ALIFMDG3SIMULATOR_H -#include "AliFMDGeoSimulator.h" // ALIFMDGEOSIMULATOR_H -#include "AliFMDG3OldSimulator.h" // ALIFMDG3OLDSIMULATOR_H -#include "AliFMDGeoOldSimulator.h" // ALIFMDGEOOLDSIMULATOR_H -#else -#include "AliFMDGeometryBuilderSimple.h" -#endif +#include "AliFMDSDigitizer.h" // ALIFMDSDIGITIZER_H +// #include "AliFMDGeometryBuilder.h" #include "AliFMDRawWriter.h" // ALIFMDRAWWRITER_H -#include +#include "AliFMDPoints.h" // ALIFMDPOINTS_H //____________________________________________________________________ ClassImp(AliFMD) @@ -140,10 +128,9 @@ AliFMD::AliFMD() fSDigits(0), fNsdigits(0), fDetailed(kTRUE), -#ifdef USE_PRE_MOVE - fSimulator(0), -#endif - fBad(0) + fUseOld(kFALSE), + fUseAssembly(kTRUE), + fBad(0) { // // Default constructor for class AliFMD @@ -152,44 +139,23 @@ AliFMD::AliFMD() fHits = 0; fDigits = 0; fIshunt = 0; - fUseOld = kFALSE; - fUseAssembly = kTRUE; fBad = new TClonesArray("AliFMDHit"); } -//____________________________________________________________________ -AliFMD::AliFMD(const AliFMD& other) - : AliDetector(other), - fSDigits(other.fSDigits), - fNsdigits(other.fNsdigits), - fDetailed(other.fDetailed), -#ifdef USE_PRE_MOVE - fSimulator(other.fSimulator), -#endif - fBad(other.fBad) -{ - // Copy constructor - fUseOld = other.fUseOld; - fUseAssembly = other.fUseAssembly; -} - //____________________________________________________________________ AliFMD::AliFMD(const char *name, const char *title) : AliDetector (name, title), fSDigits(0), fNsdigits(0), fDetailed(kTRUE), -#ifdef USE_PRE_MOVE - fSimulator(0), -#endif + fUseOld(kFALSE), + fUseAssembly(kFALSE), fBad(0) { // // Standard constructor for Forward Multiplicity Detector // AliDebug(10, "\tStandard CTOR"); - fUseOld = kFALSE; - fUseAssembly = kFALSE; fBad = new TClonesArray("AliFMDHit"); // Initialise Hit array @@ -202,8 +168,8 @@ AliFMD::AliFMD(const char *name, const char *title) // CHC: What is this? fIshunt = 0; - SetMarkerColor(kRed); - SetLineColor(kYellow); + //PH SetMarkerColor(kRed); + //PH SetLineColor(kYellow); } //____________________________________________________________________ @@ -232,20 +198,6 @@ AliFMD::~AliFMD () } } -//____________________________________________________________________ -AliFMD& -AliFMD::operator=(const AliFMD& other) -{ - AliDetector::operator=(other); - fSDigits = other.fSDigits; - fNsdigits = other.fNsdigits; - fDetailed = other.fDetailed; -#ifdef USE_PRE_MOVE - fSimulator = other.fSimulator; -#endif - fBad = other.fBad; - return *this; -} //==================================================================== // @@ -257,42 +209,14 @@ AliFMD::CreateGeometry() { // // Create the geometry of Forward Multiplicity Detector. The actual - // construction of the geometry is delegated to the class AliFMDRing - // and AliFMDSubDetector and the relevant derived classes. + // construction of the geometry is delegated to the class + // AliFMDGeometryBuilder, invoked by the singleton manager + // AliFMDGeometry. // - // The flow of this member function is: - // - // FOR rings fInner and fOuter DO - // AliFMDRing::Init(); - // END FOR - // - // Set up hybrud card support (leg) volume shapes - // - // FOR rings fInner and fOuter DO - // AliFMDRing::SetupGeometry(); - // END FOR - // - // FOR subdetectors fFMD1, fFMD2, and fFMD3 DO - // AliFMDSubDetector::SetupGeomtry(); - // END FOR - // - // FOR subdetectors fFMD1, fFMD2, and fFMD3 DO - // AliFMDSubDetector::Geomtry(); - // END FOR - // -#ifndef USE_PRE_MOVE AliFMDGeometry* fmd = AliFMDGeometry::Instance(); - if (fUseOld) fmd->SetBuilder(new AliFMDGeometryBuilderSimple(fDetailed)); fmd->SetDetailed(fDetailed); fmd->UseAssembly(fUseAssembly); fmd->Build(); -#else - if (!fSimulator) { - AliFatal("Simulator object not made yet!"); - return; - } - fSimulator->DefineGeometry(); -#endif } //____________________________________________________________________ @@ -311,9 +235,13 @@ void AliFMD::CreateMaterials() // FMD Air$ Air (Air in the FMD) // FMD Plastic$ Plastic (Support legs for the hybrid cards) // - // Pointers to TGeoMedium objects are retrived from the TGeoManager - // singleton. These pointers are later used when setting up the - // geometry + // The geometry builder should really be the one that creates the + // materials, but the architecture of AliROOT makes that design + // akward. What should happen, was that the AliFMDGeometryBuilder + // made the mediums, and that this class retrives pointers from the + // TGeoManager, and registers the mediums here. Alas, it's not + // really that easy. + // AliDebug(10, "\tCreating materials"); // Get pointer to geometry singleton object. AliFMDGeometry* geometry = AliFMDGeometry::Instance(); @@ -325,7 +253,6 @@ void AliFMD::CreateMaterials() return; } #endif -#ifndef USE_PRE_MOVE Int_t id; Double_t a = 0; Double_t z = 0; @@ -483,57 +410,34 @@ void AliFMD::CreateMaterials() AliMedium(kPlasticId, "Plastic$", id,0,fieldType,maxField,maxBending, maxStepSize,maxEnergyLoss,precision,minStepSize); } -#else - AliDebug(10, "\tCreating materials"); - - if (fSimulator) { - AliFatal("Simulator object already instantised!"); - return; - } - TVirtualMC* mc = TVirtualMC::GetMC(); - - Bool_t geo = mc->IsRootGeometrySupported(); - if (geo) { - if (fUseOld) - fSimulator = new AliFMDGeoOldSimulator(this, fDetailed); - else - fSimulator = new AliFMDGeoSimulator(this, fDetailed); - } - else { - if (fUseOld) - fSimulator = new AliFMDG3OldSimulator(this, fDetailed); - else - fSimulator = new AliFMDG3Simulator(this, fDetailed); - } - AliDebug(1, Form("using a %s as simulation backend", - fSimulator->IsA()->GetName())); - fSimulator->SetDetailed(fDetailed); - fSimulator->UseAssembly(fUseAssembly); - fSimulator->DefineMaterials(); -#endif } //____________________________________________________________________ void AliFMD::Init() -{} +{ + // Initialize the detector + // + AliDebug(1, "Initialising FMD detector object"); + // AliFMDGeometry* fmd = AliFMDGeometry::Instance(); + // fmd->InitTransformations(); +} //____________________________________________________________________ void AliFMD::FinishEvent() { -#ifndef USE_PRE_MOVE + // Called at the end of the an event in simulations. If the debug + // level is high enough, then the `bad' hits are printed. + // + if (AliLog::GetDebugLevel("FMD", "AliFMD") < 10) return; if (fBad && fBad->GetEntries() > 0) { AliWarning((Form("EndEvent", "got %d 'bad' hits", fBad->GetEntries()))); TIter next(fBad); AliFMDHit* hit; - while ((hit = static_cast(next()))) - hit->Print("D"); + while ((hit = static_cast(next()))) hit->Print("D"); fBad->Clear(); } -#else - if (fSimulator) fSimulator->EndEvent(); -#endif } @@ -546,12 +450,8 @@ void AliFMD::BuildGeometry() { // - // Build simple ROOT TNode geometry for event display - // - // Build a simplified geometry of the FMD used for event display - // - // The actual building of the TNodes is done by - // AliFMDSubDetector::SimpleGeometry. + // 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(); @@ -574,18 +474,18 @@ AliFMD::BuildGeometry() return; } Double_t siThick = r->GetSiThickness(); - const Int_t nv = r->GetNVerticies(); + 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", nv, 2); - for (Int_t j = 0; j < nv; j++) { - TVector2* vv = r->GetVertex(nv - 1 - j); + 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()); + shape->SetLineColor(kYellow); //PH kYellow is the default line color in FMD TObjArray* rots = new TObjArray(nmod); for (Int_t j = 0; j < nmod; j++) { @@ -660,7 +560,7 @@ AliFMD::BuildGeometry() TNode* mnod = new TNode(name.Data(), title.Data(), rshape, 0, 0, rz - siThick / 2 + TMath::Sign(offz,z), rot); - mnod->SetLineColor(GetLineColor()); + mnod->SetLineColor(kYellow); //PH kYellow is the default line color in FMD fNodes->Add(mnod); } // for (Int_t k = 0 ; ...) } // for (Int_t j = 0 ; ...) @@ -669,38 +569,96 @@ AliFMD::BuildGeometry() //____________________________________________________________________ void -AliFMD::DrawDetector() +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. // - // Draw a shaded view of the Forward multiplicity detector - // - // DebugGuard guard("AliFMD::DrawDetector"); + 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(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, kRed); //PH kRed is the default marker color in FMD + // 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"); - -#if 0 - //Set ALIC mother transparent - gMC->Gsatt("ALIC","SEEN",0); - // - gMC->Gdopt("hide", "on"); - gMC->Gdopt("shad", "on"); - gMC->Gsatt("*", "fill", 7); - gMC->SetClipBox("."); - gMC->SetClipBox("*", 0, 1000, -1000, 1000, -1000, 1000); - gMC->DefaultRange(); - gMC->Gdraw("alic", 40, 30, 0, 12, 12, .055, .055); - gMC->Gdhead(1111, "Forward Multiplicity Detector"); - gMC->Gdman(16, 10, "MAN"); - gMC->Gdopt("hide", "off"); -#endif } //____________________________________________________________________ Int_t -AliFMD::DistanceToPrimitive(Int_t, Int_t) +AliFMD::DistancetoPrimitive(Int_t, Int_t) { - // // Calculate the distance from the mouse to the FMD on the screen - // Dummy routine + // Dummy routine. // return 9999; } @@ -764,8 +722,6 @@ AliFMD::SetTreeAddress() } } - - //____________________________________________________________________ void AliFMD::SetHitsAddressBranch(TBranch *b) @@ -830,9 +786,10 @@ AliFMD::AddHitByFields(Int_t track, Float_t pz, Float_t edep, Int_t pdg, - Float_t t) + Float_t t, + Float_t l, + Bool_t stop) { - // // Add a hit to the list // // Parameters: @@ -851,6 +808,8 @@ AliFMD::AddHitByFields(Int_t track, // edep Energy deposited by track // pdg Track's particle Id # // t Time when the track hit + // l Track length through the material. + // stop Whether track was stopped or disappeared // TClonesArray& a = *(HitsArray()); // Search through the list of already registered hits, and see if we @@ -867,17 +826,18 @@ AliFMD::AddHitByFields(Int_t track, && hit->Sector() == sector && hit->Strip() == strip && hit->Track() == track) { - Warning("AddHit", "already had a hit in FMD%d%c[%2d,%3d] for track # %d," - " adding energy (%f) to that hit (%f) -> %f", - detector, ring, sector, strip, track, edep, hit->Edep(), - hit->Edep() + edep); + AliDebug(1, Form("already had a hit in FMD%d%c[%2d,%3d] for track # %d," + " adding energy (%f) to that hit (%f) -> %f", + detector, ring, sector, strip, track, edep, hit->Edep(), + hit->Edep() + edep)); hit->SetEdep(hit->Edep() + edep); return hit; } } // If hit wasn't already registered, do so know. hit = new (a[fNhits]) AliFMDHit(fIshunt, track, detector, ring, sector, - strip, x, y, z, px, py, pz, edep, pdg, t); + strip, x, y, z, px, py, pz, edep, pdg, t, + l, stop); fNhits++; return hit; } @@ -995,8 +955,7 @@ AliFMD::AddSDigitByFields(UShort_t detector, void AliFMD::ResetSDigits() { - // - // Reset number of digits and the digits array for this detector + // Reset number of digits and the digits array for this detector. // fNsdigits = 0; if (fSDigits) fSDigits->Clear(); @@ -1112,12 +1071,55 @@ AliFMD::Browse(TBrowser* b) // AliDebug(30, "\tBrowsing the FMD"); AliDetector::Browse(b); -#ifdef USE_PRE_MOVE - if (fSimulator) b->Add(fSimulator); -#endif b->Add(AliFMDGeometry::Instance()); } +//____________________________________________________________________ +void +AliFMD::AddAlignableVolumes() const +{ + // + // Create entries for alignable volumes associating the symbolic volume + // name with the corresponding volume path. Needs to be syncronized with + // eventual changes in the geometry. + // + // This code was made by Raffaele Grosso . I + // (cholm) will probably want to change it. For one, I think it + // should be the job of the geometry manager to deal with this. + AliFMDGeometry::Instance()->SetAlignableVolumes(); +#if 0 + for(size_t f = 1; f <= 3; f++){ // Detector 1,2,3 + for(size_t tb = 0; tb <2 ; tb++){ // Top/Bottom + char stb = tb == 0 ? 'T' : 'B'; + unsigned min = tb == 0 ? 0 : 5; + + TString halfVol(Form("/ALIC_1/F%dM%c_%d", f, stb, f)); + TString halfSym(halfVol); + if(!gGeoManager->SetAlignableEntry(halfSym.Data(),halfVol.Data())) + AliFatal(Form("Alignable entry %s not created. " + "Volume path %s not valid", + halfSym.Data(),halfVol.Data())); + for(size_t io = 0; io < 2; io++){ // inner, outer + if (f==1 && io==1) continue; // Only one ring in FMD1 + if(tb == 1 && io==1) min=10; + char sio = (io == 0 ? 'I' : 'O'); + unsigned nio = (io == 0 ? 3 : 9); + unsigned max = (io == 0 ? 5 : 10) + min; + + for(size_t i = min; i < max; i++) { // Modules + TString modVol(Form("%s/F%c%cV_7%d/F%cSE_%d", halfVol.Data(), + sio, stb, nio, sio, i)); + TString modSym(modVol); + if(!gGeoManager->SetAlignableEntry(modSym.Data(),modVol.Data())) + AliFatal(Form("Alignable entry %s not created. " + "Volume path %s not valid", + modSym.Data(), modVol.Data())); + } + } + } + } +#endif +} //___________________________________________________________________ // // EOF