#ifndef PAMVMC_DETECTOR_SD_H #define PAMVMC_DETECTOR_SD_H #include #include #include #include #include #include #include #include "PamVMCDetectorHit.h" #include "PamVMCGeoIDMgr.h" #include "PamRootManager.h" #include "PamVMCStack.h" #include //#include enum fin{INSIDE,ENTERING,EXITING}; class PamVMCDetectorSD : public TObject { //private: //PamVMCDetectorHit fhit; protected: TString fcname; TString fdname; Int_t fnohit; fin ffi; TClonesArray *fHitColl; TMap fdmap; PamVMCGeoID *fdetID; PamVMCDetectorHit fhit; public: PamVMCDetectorSD( const char *cname="pHitData", char *dname="", Int_t is=0): fcname(cname), fdname(dname), fnohit(0), fdetID(0) { if(is) { fHitColl=new TClonesArray(fcname.Data(),is); } else { fHitColl=new TClonesArray(fcname.Data()); } AddGeoID(dname); } virtual ~PamVMCDetectorSD() { delete fHitColl; delete fdetID;} virtual void PamVMCDetectorSD::Register(){ PamRootManager::Instance()-> Register(fdname.Data(),"TClonesArray", &fHitColl); TString a=fHitColl?"exist":"not exist"; } void AddGeoID(const char * dname){ TString temp=dname; fdetID=new PamVMCGeoID(dname); fdmap.Add(new TObjString(temp), fdetID); cout <<" Inside AddGeoID "<GetID( )) ; } else { fhit.SetPOS(-1); } } virtual void UpdateHit(TVirtualMC *g){ fhit.FillHit(g); } virtual void SaveHit(){ pHitData * t=CreateHit(); *t=*fhit.GetHit(); } virtual void SaveHit(Int_t f){ pHitData * t=CreateHit(f); *t+=*(fhit.GetHit()); } virtual void SaveHit(const char * dname){ pHitData * t=CreateHit(dname); *t=*fhit.GetHit(); } virtual pHitData * CreateHit() { pHitData *hit= (pHitData *) fHitColl->New(fnohit++); InitHit(); return hit; } virtual void FillVolID(){ fdetID->FillVolID(); fhit.SetPOS( fdetID->GetID( )) ; } virtual pHitData * CreateHit(const char * dname) { fdetID=(PamVMCGeoID*)fdmap(dname); return CreateHit(); } virtual pHitData * CreateHit(Int_t flag) { if(!fHitColl->At(flag)) { pHitData *hit= (pHitData *) fHitColl->New(flag); InitHit(); return hit; } return (pHitData*)fHitColl->At(flag); } virtual void PreEvent(){/* this method was created for zeroing digits in common area */}; virtual void Compress(){ (*fHitColl).Compress(); }; virtual void Digitize(){/* later will be = 0 */}; virtual void ClearHitColl(){ fnohit=0; (*fHitColl).Clear("C"); } virtual void FillHit(fin f,TVirtualMC *g){ ffi=f; switch(f) { case ENTERING: CleanHit(); FillVolID(); InitHit(); default: UpdateHit(g); break; } switch(f){ case EXITING: // Save hit if energy release is greater than zero if(fhit.GetEREL()){ SaveHit(fdname.Data()); } break; default: break; } } virtual void Print(const Option_t* ="") const { // Print more information like the name std::cout<<"DETECTOR "<Print(); } ClassDef(PamVMCDetectorSD,1) }; #endif //PAMVMC_DETECTOR_SD_H