/////////////////////////////////////////////////////////////////////////////// // fill MDC branches of GEANT ROOT tree // // last modified on 05/12/2008 by I. Koenig /////////////////////////////////////////////////////////////////////////////// #include "fillmdc.h" #include "cfortran.h" #include "hgeantmdc.h" #include "hgeantmaxtrk.h" #include "hades.h" #include "hlocation.h" #include "hcategory.h" #include "hrecevent.h" #include "hpartialevent.h" #include "hgeantkine.h" #define NFO 7 struct MDC_DEF { // structure mapped to MDCTUPLE Fortran COMMON block Int_t nhits; Int_t mdctrk[MAXTRKMDC*7]; Int_t mdclay[MAXTRKMDC*7]; Float_t mdcx[MAXTRKMDC*7]; Float_t mdcy[MAXTRKMDC*7]; Float_t mdctheta[MAXTRKMDC*7]; Float_t mdcphi[MAXTRKMDC*7]; Float_t mdctof[MAXTRKMDC*7]; Float_t mdcmom[MAXTRKMDC*7]; }; #define MDCTUPLE COMMON_BLOCK(MDCTUPLE,drtups) COMMON_BLOCK_DEF(MDC_DEF,MDCTUPLE); void fillmdc(int* sector, int* module) { HLocation loc; HRecEvent* pHGeantEvent = (HRecEvent*)(gHades->getCurrentEvent()); // get pointer to event Int_t evt = pHGeantEvent->getHeader()->getEventSeqNumber(); HPartialEvent* pSimul = pHGeantEvent->getPartialEvent(catSimul); HCategory* pMdcCat = pSimul->getCategory(catMdcGeantRaw); // get MDC cat if(*sector == 1 && *module == 1) pMdcCat->Clear(); // clear if 1st sect+mod HCategory* pKin = pSimul->getCategory(catGeantKine); // get KINE cat // if(evt==154) cout << *sector << " " << *module << " " << MDCTUPLE.nhits << endl; Int_t index; Int_t layer; Int_t nhl[7]={0,0,0,0,0,0,0}; for(int hit=0; hitgetSlot(loc,&index)); // get slot and its index if(pMdc==NULL) { printf("\n*** FILLMDC: HGeantMdc location not found ! ***\n"); printf("sec=%d mod=%d layer=%d hit=%d\n",(*sector-1),(*module-1), layer-1,nhl[layer-1]); return; } nhl[layer-1]++; pMdc = new(pMdc) HGeantMdc; // MDC track data Int_t track = MDCTUPLE.mdctrk[hit]; pMdc->setTrack(track); pMdc->setHit(MDCTUPLE.mdcx[hit], MDCTUPLE.mdcy[hit], MDCTUPLE.mdctof[hit], MDCTUPLE.mdcmom[hit]); // if(evt==154) printf("evt=%d trk=%d: (s,m,l)=(%d,%d,%d) tof=%f p=%f\n", // evt,track,*sector,*module,layer,MDCTUPLE.mdctof[hit],MDCTUPLE.mdcmom[hit]); pMdc->setIncidence(MDCTUPLE.mdctheta[hit], MDCTUPLE.mdcphi[hit]); pMdc->setAddress((Char_t)(*sector-1), (Char_t)(*module-1), (Char_t)(layer-1)); if(pKin != NULL && track > 0) { // add hit to linked list of track ((HGeantKine*)pKin->getObject(track-1))->setMdcHitIndex(index); pMdc->sortVariable = MDCTUPLE.mdctof[hit]; } } if(pKin != NULL && *sector == 6 && *module == 4) { // loop over all tracks ... Int_t nTracks = pKin->getEntries(); for(Int_t i=0;igetObject(i))->sortMdcHits(); // ... and sort hits } } } // wrapping of the c++ routine as Fortran-subroutine using cfortran.h // of Cern-library FCALLSCSUB2(fillmdc,FILLMDC,fillmdc,PINT,PINT)