//_____________________________________________________________________________ void StarMCHits::MakeDetectorDescriptors() { if (! gGeoManager) { cout << "No gGeoManager" << endl; return; } TDataSet *Detectors = StMaker::GetChain()->GetDataBase("VmcGeometry/Index"); if (! Detectors) { cout << "No Detectors found in VmcGeometry/Index" << endl; } // Make List of sensitive volumes TObjArray *vols = gGeoManager->GetListOfVolumes(); Int_t nvol = vols->GetEntriesFast(); Int_t nSensVol = 0; Int_t nsize = 100; TArrayI Indx(nsize); Int_t *indx = Indx.GetArray(); for (Int_t i = 0; i < nvol; i++) { TGeoVolume *vol = (TGeoVolume *) vols->At(i); if (! vol) continue; TGeoMedium *med = vol->GetMedium(); if (! med) continue; Int_t isvol = (Int_t) med->GetParam(0); if (! isvol) continue; indx[nSensVol] = i; nSensVol++; if (nSensVol >= nsize) { nsize *= 2; Indx.Set(nsize); indx = Indx.GetArray(); } TString Path(MakeDetectorDescriptor(vol->GetName())); if (Detectors) { // Check consistency StarVMCDetector *det = (StarVMCDetector *) Detectors->Find(vol->GetName()); if (! det) { cout << "Detector description for " << vol->GetName() << "\t" << vol->GetTitle() << " is missing" << endl; } else { TString FMT = det->GetFMT(); cout << "Found path:\t" << Path.Data() << endl; cout << "Set path:\t" << FMT.Data(); if (Path == FMT) cout << " are the same" << endl; else cout << " are the different" << endl; } } } }
GeoHandler& GeoHandler::collect(DetElement element, GeometryInfo& info) { m_data->clear(); i_collect(element.placement().ptr(), 0, Region(), LimitSet()); for (Data::const_reverse_iterator i = m_data->rbegin(); i != m_data->rend(); ++i) { const Data::mapped_type& mapped = (*i).second; for (Data::mapped_type::const_iterator j = mapped.begin(); j != mapped.end(); ++j) { const TGeoNode* n = *j; TGeoVolume* v = n->GetVolume(); if (v) { Material m(v->GetMedium()); Volume vol = Ref_t(v); // Note : assemblies and the world do not have a real volume nor a material if (info.volumeSet.find(vol) == info.volumeSet.end()) { info.volumeSet.insert(vol); info.volumes.push_back(vol); } if (m.isValid()) info.materials.insert(m); if (dynamic_cast<Volume::Object*>(v)) { VisAttr vis = vol.visAttributes(); //Region reg = vol.region(); //LimitSet lim = vol.limitSet(); //SensitiveDetector det = vol.sensitiveDetector(); if (vis.isValid()) info.vis.insert(vis); //if ( lim.isValid() ) info.limits[lim.ptr()].insert(v); //if ( reg.isValid() ) info.regions[reg.ptr()].insert(v); //if ( det.isValid() ) info.sensitives[det.ptr()].insert(v); } collectSolid(info, v->GetName(), n->GetName(), v->GetShape(), n->GetMatrix()); } } } return *this; }
//________________________________________________________________________________ void StarMCHits::Step() { // static Int_t Idevt0 = -1; static Double_t Gold = 0; #if 0 if (Debug() && gMC->IsA()->InheritsFrom("TGeant3TGeo")) { TGeant3TGeo *geant3 = (TGeant3TGeo *)gMC; geant3->Gdebug(); } #endif // cout << "Call StarMCHits::Step" << endl; TGeoNode *nodeT = gGeoManager->GetCurrentNode(); assert(nodeT); TGeoVolume *volT = nodeT->GetVolume(); assert(volT); const TGeoMedium *med = volT->GetMedium(); /* fParams[0] = isvol; fParams[1] = ifield; fParams[2] = fieldm; fParams[3] = tmaxfd; fParams[4] = stemax; fParams[5] = deemax; fParams[6] = epsil; fParams[7] = stmin; */ Int_t Isvol = (Int_t) med->GetParam(0); fCurrentDetector = 0; if (Isvol <= 0) return; fCurrentDetector = (StarVMCDetector *) fVolUserInfo->At(volT->GetNumber()); if (! fCurrentDetector) { volT = nodeT->GetMotherVolume(); fCurrentDetector = (StarVMCDetector *) fVolUserInfo->At(volT->GetNumber()); if (! fCurrentDetector) { TString path(gGeoManager->GetPath()); TObjArray *obj = path.Tokenize("_/"); Int_t N = obj->GetEntries(); for (Int_t i = N-2; i >= 0; i -= 2) { TObjString *o = (TObjString *) obj->At(i); const Char_t *name = o->GetName(); volT = gGeoManager->GetVolume(name); assert (volT); fCurrentDetector = (StarVMCDetector *) fVolUserInfo->At(volT->GetNumber()); if (fCurrentDetector) break; } delete obj; } } if (Isvol && ! fCurrentDetector && Debug()) { cout << "Active medium:" << med->GetName() << "\t for volume " << volT->GetName() << " has no detector description" << endl; } // Int_t Idevt = gMC->CurrentEvent(); gMC->TrackPosition(fHit.Current.Global.xyzT); gMC->TrackMomentum(fHit.Current.Global.pxyzE); TGeoHMatrix *matrixC = gGeoManager->GetCurrentMatrix(); fHit.Current.Global2Local(matrixC); if (gMC->IsTrackEntering()) { fHit.Detector= fCurrentDetector; fHit.Entry = fHit.Current; fHit.Sleng = gMC->TrackLength(); fHit.Charge = (Int_t) gMC->TrackCharge(); fHit.Mass = gMC->TrackMass(); fHit.AdEstep = fHit.AStep = 0; return; } Double_t GeKin = fHit.Current.Global.pxyzE.E() - fHit.Mass; fHit.Sleng = gMC->TrackLength(); if (fHit.Sleng == 0.) Gold = GeKin; Double_t dEstep = gMC->Edep(); Double_t Step = gMC->TrackStep(); fHit.iPart = gMC->TrackPid(); fHit.iTrack = StarVMCApplication::Instance()->GetStack()->GetCurrentTrackId(); // GetCurrentTrackNumber() + 1 to be consistent with g2t // - - - - - - - - - - - - - energy correction - - - - - - - - - - if (gMC->IsTrackStop() && TMath::Abs(fHit.iPart) == kElectron) { TArrayI proc; Int_t Nproc = gMC->StepProcesses(proc); Int_t Mec = 0; for (Int_t i = 0; i < Nproc; i++) if (proc[i] == kPAnnihilation || proc[i] == kPStop) Mec = proc[i]; Int_t Ngkine = gMC->NSecondaries(); if (fHit.iPart == kElectron && Ngkine == 0 && Mec == kPStop) dEstep = Gold; else { if (fHit.iPart == kPositron && Ngkine < 2 && Mec == kPAnnihilation) { dEstep = Gold + 2*fHit.Mass; if (Ngkine == 1) { TLorentzVector x; TLorentzVector p; Int_t IpartSec; gMC->GetSecondary(0,IpartSec,x,p); dEstep -= p.E(); } } } } // - - - - - - - - - - - - - - - - user - - - - - - - - - - - - - - - // user step // - - - - - - - - - - - - - - - sensitive - - - - - - - - - - - - - fHit.AdEstep += dEstep; fHit.AStep += Step; if (fHit.AdEstep == 0) return; if (! gMC->IsTrackExiting() && ! gMC->IsTrackStop()) return; fHit.Exit = fHit.Current; fHit.Middle = fHit.Entry; fHit.Middle += fHit.Exit; fHit.Middle *= 0.5; if (! fCurrentDetector) return; fHit.VolumeId = fCurrentDetector->GetVolumeId(gGeoManager->GetPath()); FillG2Table(); }