void BuildHybrid(AMSgvolume *mvol, int tkid) { // Build hybrid geometry TkLadder *lad = TkDBc::Head->FindTkId(tkid); if (!lad) return; int layer = std::abs(tkid)/100; int plane= TkDBc::Head->_plane_layer[layer-1]; int sign = (tkid > 0) ? 1 : -1; char name[5]; std::ostrstream ost(name,sizeof(name)); ost << ((tkid < 0) ? "ELL" : "ELR") << layer << std::ends; geant par[3]; if(layer==1 ||layer==8||layer==9){ par[0] = TkDBc::Head->_zelec[2]/2.; par[1] = TkDBc::Head->_zelec[1]/2.; par[2] = TkDBc::Head->_zelec[0]/2.; }else{ par[0] = TkDBc::Head->_zelec[0]/2.; par[1] = TkDBc::Head->_zelec[1]/2.; par[2] = TkDBc::Head->_zelec[2]/2.; } double hlen = TkCoo::GetLadderLength(tkid)/2 -(TkDBc::Head->_ssize_inactive[0]-TkDBc::Head->_ssize_active[0])/2; double hwid = TkDBc::Head->_ssize_active[1]/2; AMSRotMat rot0 = lad->GetRotMatT(); AMSRotMat rot = rot0*lad->GetRotMat(); AMSPoint pos = lad->GetPos()+lad->GetPosT(); AMSPoint loc(hlen, hwid, 0); AMSPoint oo = rot*loc+pos; // Get coordinate w.r.t. the mother layer geant coo[3]; coo[0] = oo.x() +sign*(TkCoo::GetLadderLength(tkid)/2+par[0]+0.003); coo[1] = oo.y(); coo[2] = (std::abs(oo.z())/oo.z())*(TkDBc::Head->_sup_hc_w[plane-1]/2.+par[2]+0.1); if(layer==1) coo[2] -= TkDBc::Head->_dz[0]; if(layer==8) coo[2] -= TkDBc::Head->_dz[4]; if(layer==9) coo[2] -= TkDBc::Head->_dz[5]; number nrm[3][3]; VZERO(nrm,9*sizeof(nrm[0][0])/4); nrm[0][0] = nrm[1][1] = nrm[2][2] = 1; int gid = tkid+1000; mvol->add(new AMSgvolume("ELECTRONICS", _nrot++, name, "BOX", par, 3, coo, nrm, "ONLY", 1, gid, 1)); }
bool TofGeometry::IsInsidePlane(AMSPoint x[3], AMSPoint point) { float x0 = x[0].x(); float y0 = x[0].y(); float z0 = x[0].z(); float x1 = x[1].x(); float y1 = x[1].y(); float z1 = x[1].z(); float x2 = x[2].x(); float y2 = x[2].y(); float z2 = x[2].z(); float a = (y2 - y0)*(z1 - z0) - (z2 - z0)*(y1 - y0); float b = (z2 - z0)*(x1 - x0) - (x2 - x0)*(z1 - z0); float c = (x2 - x0)*(y1 - y0) - (y2 - y0)*(x1 - x0); float d = - a*x0 - b*y0 - c*z0; float result = a*point.x() + b*point.y() + c*point.z() + d; return (fabs(result)<0.01); // .1 mm }
int TofGeometry::GetTofPaddleIndex(AMSPoint point, float delta) { int index = -1; int nfound = 0; for (int ilayer=0; ilayer<4; ilayer++) { for (int ibar=0; ibar<GetNBars(ilayer); ibar++) { // z check if (fabs(point.z()-GetZPaddle(ilayer,ibar))>0.5) continue; // xy check if (HitCounter(point.x(),point.y(),ilayer,ibar,delta)) { index = ilayer*10 + ibar; nfound++; } } } if (nfound>1) return -nfound; return index; }
AMSPoint TofGeometry::GetIntersection(AMSPoint x[3], AMSPoint point, AMSDir dir) { // plane equation, ax + by + cz + d = 0 float x0 = x[0].x(); float y0 = x[0].y(); float z0 = x[0].z(); float x1 = x[1].x(); float y1 = x[1].y(); float z1 = x[1].z(); float x2 = x[2].x(); float y2 = x[2].y(); float z2 = x[2].z(); float a = (y2 - y0)*(z1 - z0) - (z2 - z0)*(y1 - y0); float b = (z2 - z0)*(x1 - x0) - (x2 - x0)*(z1 - z0); float c = (x2 - x0)*(y1 - y0) - (y2 - y0)*(x1 - x0); float d = - a*x0 - b*y0 - c*z0; // parametric line (x,y,z) = (A,B,C)*t + (X,Y,Z) float A = dir.x(); float B = dir.y(); float C = dir.z(); float X = point.x(); float Y = point.y(); float Z = point.z(); // intersection if (fabs(a*A + b*B + c*C)<1e-6) return AMSPoint(-300,-300,-300); float t = - (a*X + b*Y + c*Z + d) / (a*A + b*B + c*C); return AMSPoint(A*t + X, B*t + Y, C*t + Z); }
float TofGeometry::PathLengthInAPaddle(int il, int ib, AMSPoint point, AMSDir dir) { if ( (il<0)||(il>3)||(ib<0)||(ib>9) ) return false; // check intersection with every surface AMSPoint points[6]; int npoints = 0; for (int isurface=0; isurface<6; isurface++) { AMSPoint x[4] = { TofGeometry::GetPaddleSurfaceCorner(il,ib,isurface,0), TofGeometry::GetPaddleSurfaceCorner(il,ib,isurface,1), TofGeometry::GetPaddleSurfaceCorner(il,ib,isurface,2), TofGeometry::GetPaddleSurfaceCorner(il,ib,isurface,3) }; AMSPoint intersection = GetIntersection(x,point,dir); if (!IsInsideRectangle(x,intersection)) continue; points[npoints].setp(intersection.x(),intersection.y(),intersection.z()); npoints++; } // in the case of 2 intersection the particle is entering and exiting if (npoints!=2) return 0.; return (points[1] - points[0]).norm(); }
bool goldenTRD(AMSEventR* ev, int s,int fit) { //chiedo che la traccia del TRD sia compatibile con quella del TRACKER int TRDclustersontrack=0; if (!ev->pTrdTrack(0)) return false; for(int i=0;i<ev->pTrdTrack(0)->NTrdSegment();i++) { for(int j=0; j<ev->pTrdTrack(0)->pTrdSegment(i)->NTrdCluster();j++) TRDclustersontrack++;} if(!ev->pTrTrack(0)) return false; TrTrackR* track=ev->pTrTrack(0); int fitID=track->iTrTrackPar(1,fit,1); bool golden=false; TrdHTrackR* trd_track; for(int i=0;/* i<ev->nTrdHTrack()*/i<1;i++) { trd_track=ev->pTrdHTrack(i); if(trd_track>0) { int nHits=ev->nTrdRawHit(); int nHitsonTrack=trd_track->Nhits; if(1!=10000000000) { if(trd_track->status>0) { AMSPoint pnt; AMSDir dir; TrTrackR* track=ev->pTrTrack(0); track->Interpolate(trd_track->Coo[2],pnt,dir,fitID); Double_t dtx=pnt.x()-trd_track->Coo[0]; Double_t dty=pnt.y()-trd_track->Coo[1]; if(dtx*dtx+dty*dty<(1.5-(s*10*1.5/100))*(1.5-(s*10*1.5/100))) golden=true; } } } } return golden; }
void trcls(const char *fname, const char *oname, const char *tkdbc) { AMSChain ch; TString sfn = fname; if (!sfn.Contains(".root")) sfn += "*.root"; if (ch.Add(sfn) <= 0) return; Int_t ntr = ch.GetNtrees(); Int_t nent = ch.GetEntries(); if (ntr <= 0 || nent <= 0) return; cout << "Ntr,Nent= " << ntr << " " << nent << endl; for (Int_t i = 0; i < ntr; i++) cout << ch.GetListOfFiles()->At(i)->GetTitle() << endl; Int_t idata[13]; Float_t fdata[28]; TFile of(oname, "recreate"); TTree *tree = new TTree("tree", "trcls"); tree->Branch("idata", idata, "run/I:event/I:ient/I:time/I:tkml[9]/I"); tree->Branch("fdata", fdata, "engc/F:enge/F:rgt/F:chrg/F:" "p0x/F:p0y/F:dzx/F:dzy/F:csqx/F:csqy/F:" "xcog[9]/F:ycog[9]/F"); if (tkdbc && tkdbc[0] && tkdbc[0] != '0') { ch.GetEvent(0); TkDBc::Head->init(3, tkdbc); } TrExtAlignDB::OverLoadFlag = 0; Int_t malg = 2; // kAlcaraz | kMultScat Int_t pat0 = 3; // Inner only Int_t nevt = 0; Int_t nrsl = 0; Int_t npsl = 0; Int_t nfil = 0; Int_t intv = 10000; signal(SIGTERM, handler); signal(SIGINT, handler); TStopwatch timer; timer.Start(); for (Int_t ient = 0; ient < nent && !SigTERM; ient++) { AMSEventR *evt = ch.GetEvent(ient); nevt++; if (nevt%intv == 0 || nevt == nent) { Double_t tm = timer.RealTime(); timer.Continue(); cout << Form("%6d %6d %6d %7d (%5.1f%%) %4.0f sec (%4.1f kHz)", nrsl, npsl, nfil, nevt, 100.*nevt/nent, tm, nevt/tm*1e-3) << endl; } if (evt->nTrRecHit() >= 1600) continue; if (evt->nTrTrack () != 1) continue; TrTrackR *trk = evt->pTrTrack(0); if (!trk) continue; Double_t chgp = TrCharge::GetQ(trk, 1); Double_t chgn = TrCharge::GetQ(trk, 0); if (chgp <= 0 || chgn <= 0) continue; Int_t mfp = trk->iTrTrackPar(malg, pat0, 0); if (mfp < 0) continue; Double_t rgtp = trk->GetRigidity(mfp); if (TMath::Abs(rgtp) < 5) continue; //////////////////// Recalc and refit //////////////////// trk->RecalcHitCoordinates(); Int_t mf0 = trk->iTrTrackPar(malg, pat0, 2); if (mf0 < 0) continue; Double_t rgt0 = trk->GetRigidity(mf0); if (TMath::Abs(rgt0) < 10) continue; nrsl++; //////////////////// Pre-selection //////////////////// Bool_t psel = kTRUE; Int_t span = (TrTrackSelection::GetSpanFlags(trk) & 0xff); if (!(span & TrTrackSelection::kMaxInt) || !(span & TrTrackSelection::kAllPlane)) psel = kFALSE; if (!(span & TrTrackSelection::kHalfL1N)) { if (!(span & TrTrackSelection::kHalfL9)) psel = kFALSE; AMSPoint pnt = trk->InterpolateLayerJ(9); if (TMath::Abs(pnt.x()) > 33) psel = kFALSE; } if (psel) npsl++; TrTrackR::AdvancedFitBits = 0x0f; TrRecon trec; Int_t nadd = trec.MergeExtHits(trk, mf0); if (!psel && nadd <= 0) continue; //////////////////// Remerge //////////////////// if (nadd > 0) { psel = kTRUE; span = (TrTrackSelection::GetSpanFlags(trk) & 0xff); if (!(span & TrTrackSelection::kMaxInt) || !(span & TrTrackSelection::kAllPlane)) psel = kFALSE; if (!(span & TrTrackSelection::kHalfL1N)) { if (!(span & TrTrackSelection::kHalfL9)) psel = kFALSE; AMSPoint pnt = trk->InterpolateLayerJ(9); if (TMath::Abs(pnt.x()) > 33) psel = kFALSE; } } if (!psel) continue; idata[0] = evt->Run(); idata[1] = evt->Event(); idata[2] = ient; idata[3] = evt->fHeader.Time[0]; EcalShowerR *ecal = evt->pEcalShower(0); fdata[0] = (ecal) ? ecal->EnergyC : 0; fdata[1] = (ecal) ? ecal->EnergyE : 0; fdata[2] = rgt0; fdata[3] = (chgp+chgn)/2; fdata[4] = trk->GetP0x(mf0); fdata[5] = trk->GetP0y(mf0); fdata[6] = trk->GetThetaXZ(mf0); fdata[7] = trk->GetThetaYZ(mf0); fdata[8] = trk->GetNormChisqX(mf0); fdata[9] = trk->GetNormChisqY(mf0); if (evt->nMCEventg() > 0) { MCEventgR *mcg = evt->pMCEventg(0); if (mcg) fdata[0] = mcg->Momentum; } Int_t *tkml = &idata[ 4]; Float_t *xcog = &fdata[10]; Float_t *ycog = &fdata[19]; for (Int_t i = 0; i < 9; i++) { tkml[i] = 0; xcog[i] = ycog[i] = 0; } for (Int_t i = 0; i < trk->GetNhits(); i++) { TrRecHitR *hit = trk->GetHit(i); if (!hit) continue; Int_t layer = hit->GetLayer(); //if (layer != 8 && layer != 9) continue; Int_t il = layer-1;//layer-8; Int_t tkid = hit->GetTkId(); Int_t imlt = hit->GetResolvedMultiplicity(); TrClusterR *clx = hit->GetXCluster(); TrClusterR *cly = hit->GetYCluster(); tkml[il] = TMath::Sign(imlt*1000+TMath::Abs(tkid), tkid); xcog[il] = (!clx) ? -(hit->GetDummyX()+640) : clx->GetCofG()+clx->GetSeedAddress(); ycog[il] = cly->GetCofG()+cly->GetSeedAddress(); } tree->Fill(); nfil++; } of.cd(); tree->Write(); }
void SWTrack::drawHits(QPainter *pnt) { int *zly = (TkDBc::Head->GetSetup() == 3) ? &zLayer2[NLAY*lyrConf] : zLayer1; int zl1 = -200, zl2 = 200; for (int i = 0; i < NLAY; i++) { if (zly[i] > zl1) zl1 = zly[i]; if (zly[i] < zl2) zl2 = zly[i]; } int zl = zl1-zl2; int px = (wWid-zl)/2+LYR_PX+zl1; int py = (wHei-tHei-LYR_H)/2+tHei+LYR_PY; int py1 = py+RES_H+LYR_D; int py2 = py-RES_H-LYR_D+LYR_H; int px1 = px-zl1-20; int px2 = px-zl2+20; int ifc = focusStatus/FOCUS_DOBJ/2-1; if (!(focusStatus & FOCUS_DOBJ)) ifc = -1; for (int i = 0; i < NLAY; i++) { if (zly[i] == 0) continue; pnt->setPen(QColor(100, 255, 200)); pnt->drawLine(px-zly[i], py, px-zly[i], py+LYR_H); pnt->setPen((ifc == i) ? Qt::white : Qt::green); pnt->drawLine(px-zly[i]+1, py, px-zly[i]+1, py+LYR_H); pnt->setPen((ifc == i) ? Qt::gray : Qt::darkGreen); pnt->drawLine(px-zly[i]+2, py, px-zly[i]+2, py+LYR_H); pnt->setPen(Qt::green); drawText(pnt, px-zly[i]-3, py-17, Form("%d", i+1)); } TrTrackR *trk = rEvent->pTrTrack(tID); if (!trk) return; int mfit = (0 <= fID && fID < NPAR) ? fitPar[fID] : 0; if (mfit <= 0) return; double rscx = 0.001, rscy = 0.001; int nhit = trk->GetNhits(); for (int i = 0; i < nhit; i++) { TrRecHitR *hit = trk->GetHit(i); if (!hit) continue; int ily = hit->GetLayer()-1; if (zly[ily] == 0) continue; AMSPoint res = trk->GetResidualO(hit->GetLayer(), mfit); if (!hit->OnlyY() && abs(res.x()) > rscx) rscx = abs(res.x()); if (!hit->OnlyX() && abs(res.y()) > rscy) rscy = abs(res.y()); } rscx = (rscx < 0.005) ? (int)(rscx*2000)*0.0005 : (rscx < 1.000) ? (int)(rscx*200) *0.005 : (int)(rscx*20) *0.05; rscy = (rscy < 0.005) ? (int)(rscy*2000)*0.0005 : (rscy < 1.000) ? (int)(rscy*200) *0.005 : (int)(rscy*20) *0.05; int bx1, bx2, by1, by2; int n1 = 0, n2 = 0; int idx[NLAY]; double zht[NLAY]; for (int i = 0; i < nhit; i++) zht[i] = trk->GetHit(i)->GetCoord().z(); TMath::Sort(nhit, zht, idx); for (int i = 0; i < nhit; i++) { TrRecHitR *hit = trk->GetHit(idx[i]); int lay = hit->GetLayer(); int ily = lay-1; if (zly[ily] == 0) continue; int x = px-zly[ily]; int y1 = py1-RES_H*trk->GetResidualO(lay, mfit).x()/rscx; int y2 = py2-RES_H*trk->GetResidualO(lay, mfit).y()/rscy; if (lyrSta[ily] == LSTA_HITT) { pnt->setPen(Qt::white); pnt->drawRect(x-3, y1-3, 6, 6); pnt->setPen((ifc == ily) ? Qt::darkGray : Qt::darkRed); pnt->drawRect(x-2, y1-2, 6, 6); pnt->fillRect(x-2, y1-2, 6, 6, (ifc == ily) ? QColor(Qt::gray) : QColor(Qt::red)); if (n1++ > 0) { pnt->setPen(Qt::red); pnt->drawLine(bx1, by1, x, y1); pnt->setPen(Qt::darkRed); if (abs(x-bx1) > abs(y1-by1)) pnt->drawLine(bx1, by1+1, x, y1+1); else pnt->drawLine(bx1+1, by1, x+1, y1); } bx1 = x; by1 = y1; } pnt->setPen(Qt::white); pnt->drawRect(x-3, y2-3, 6, 6); pnt->setPen((ifc == ily) ? Qt::darkGray : Qt::darkRed); pnt->drawRect(x-2, y2-2, 6, 6); pnt->fillRect(x-2, y2-2, 6, 6, (ifc == ily) ? QColor(Qt::gray) : QColor(Qt::red)); if (n2++ > 0) { pnt->setPen(Qt::red); pnt->drawLine(bx2, by2, x, y2); pnt->setPen(Qt::darkRed); if (abs(x-bx2) > abs(y2-by2)) pnt->drawLine(bx2, by2+1, x, y2+1); else pnt->drawLine(bx2+1, by2, x+1, y2); } bx2 = x; by2 = y2; } pnt->save(); pnt->rotate(-90); pnt->setPen(QColor(255, 50, 50)); drawText(pnt, -py1-14, px1-47, "ResX"); drawText(pnt, -py2-14, px1-47, "ResY"); drawText(pnt, -py1-20, px1-30, (rscx < 0.005) ? Form("%.0fum", rscx*2e4) : (rscx < 1.000) ? Form("%.1fmm", rscx*2e1) : Form("%.1fcm", rscx*2)); drawText(pnt, -py2-20, px1-30, (rscy < 0.005) ? Form("%.0fum", rscy*2e4) : (rscy < 1.000) ? Form("%.1fmm", rscy*2e1) : Form("%.1fcm", rscy*2)); pnt->restore(); pnt->setPen(QColor(255, 30, 30)); pnt->drawLine(px1, py1, px2, py1); pnt->drawLine(px1, py2, px2, py2); pnt->drawLine(px1-7, py1-RES_H, px1-7, py1+RES_H); pnt->drawLine(px1-9, py1-RES_H, px1-5, py1-RES_H); pnt->drawLine(px1-9, py1+RES_H, px1-5, py1+RES_H); pnt->drawLine(px1-7, py2-RES_H, px1-7, py2+RES_H); pnt->drawLine(px1-9, py2-RES_H, px1-5, py2-RES_H); pnt->drawLine(px1-9, py2+RES_H, px1-5, py2+RES_H); }
void SWLadder::drawInfobar(QPainter *pnt) { pnt->fillRect(0, 0, wWid-2, tHei, QColor(0, 0, 0, 200)); drawClose(pnt); drawMore (pnt); pnt->setPen(Qt::white); drawText(pnt, 28, 10, "Ladder"); drawText(pnt, 80, 10, Form(" TkID: %d", tkID)); drawText(pnt, 170, 10, Form("nClsX: %d", nClsX)); drawText(pnt, 240, 10, Form("nClsY: %d", nClsY)); drawText(pnt, 78, 30, Form(" nSen: %d", nSen )); drawText(pnt, 175, 30, Form(" nHit: %d", nHit )); drawText(pnt, 241, 30, Form("nHitT: %d", nHitT)); drawText(pnt, 310, 30, Form("nHitG: %d", nHitG)); if (focusStatus & FOCUS_DOBJ) { DrawObj dobj = drawObj.at(focusStatus/FOCUS_DOBJ/2-1); if ((dobj.atrb & ATR_CLSX) || (dobj.atrb & ATR_CLSY)) { TrClusterR *cls = rEvent->pTrCluster(dobj.idx); double sig = cls->GetTotSignal(TrClusterR::kAsym); drawText(pnt, 27, 50, Form("Cluster Side: %d", cls->GetSide())); drawText(pnt, 140, 50, Form("Seed: %d", cls->GetAddress() +cls->GetSeedIndex())); drawText(pnt, 220, 50, Form("Len: %d", cls->GetLength())); drawText(pnt, 270, 50, Form("Signal: %.0f", sig)); if (dobj.atrb & ATR_CLSX) drawText(pnt, 350, 50, Form("Mult: %d", dobj.mult)); } else if (dobj.atrb & ATR_HIT) { TrRecHitR *hit = rEvent->pTrRecHit(dobj.idx); char cf1 = (hit->OnlyY()) ? 'G' : '_'; char cf2 = (hit->checkstatus(AMSDBc::USED)) ? 'T' : '_'; AMSPoint coo = hit->GetCoord(dobj.mult); drawText(pnt, 48, 50, Form("Hit Flag: %c%c", cf1, cf2)); drawText(pnt, 150, 50, Form("Coo: (%.2f, %.2f, %.2f)", coo.x(), coo.y(), coo.z())); drawText(pnt, 350, 50, Form("Mult: %d", dobj.mult)); } else if (dobj.atrb & ATR_TRK) { TrTrackR *trk = rEvent->pTrTrack(dobj.idx); int fpat[8]; for (int i = 0; i < 8; i++) fpat[i] = 0; TString hpat; for (int i = 0; i < trk->GetNhits(); i++) { TrRecHitR *hit = trk->GetHit(i); int ily = hit->GetLayer()-1; fpat[ily] = (hit->OnlyY()) ? 1 : 2; } for (int i = 0; i < 8; i++) { if (fpat[i] == 1) hpat += "Y"; else if (fpat[i] == 2) hpat += "O"; else hpat += "_"; } drawText(pnt, 48, 50, "Track"); drawText(pnt, 100, 50, Form("nHit: %d", trk->GetNhits())); drawText(pnt, 170, 50, Form("nHitXY: %d", trk->GetNhitsXY())); drawText(pnt, 270, 50, Form("fPat: %s", hpat.Data())); } } }
void BuildSupport(AMSgvolume *mvol, int tkid) { // Build ladder support geometry TkLadder *lad = TkDBc::Head->FindTkId(tkid); if (!lad) return; int layer = std::abs(tkid)/100; char name[5]; std::ostrstream ost(name,sizeof(name)); ost << "FOA" << layer << std::ends; geant par[3]; par[0] = TkCoo::GetLadderLength(tkid)/2; par[1] = TkDBc::Head->_ssize_inactive[1]/2; par[2] = sup_foam_w/2; double hlen = TkCoo::GetLadderLength(tkid)/2 -(TkDBc::Head->_ssize_inactive[0]-TkDBc::Head->_ssize_active[0])/2; double hwid = TkDBc::Head->_ssize_active[1]/2; AMSRotMat rot0 = lad->GetRotMatT(); AMSRotMat rot = rot0*lad->GetRotMat(); AMSPoint pos = lad->GetPos()+lad->GetPosT(); AMSPoint loc(hlen, hwid, 0); AMSPoint oo = rot*loc+pos; // Get coordinate w.r.t. the mother layer geant coo[3]; coo[0] = oo.x(); coo[1] = oo.y(); coo[2] = (std::abs(oo.z())/oo.z())*(std::abs(oo.z())-TkDBc::Head->_silicon_z/2-par[2]-sup_foam_tol); if(layer==1) coo[2] -= TkDBc::Head->_dz[0]; if(layer==8) coo[2] -= TkDBc::Head->_dz[4]; if(layer==9) coo[2] -= TkDBc::Head->_dz[5]; number nrm[3][3]; VZERO(nrm,9*sizeof(nrm[0][0])/4); nrm[0][0] = nrm[1][1] = nrm[2][2] = 1; int gid = tkid+1000; mvol->add(new AMSgvolume("Tr_Foam", _nrot++, name, "BOX", par, 3, coo, nrm, "ONLY", 1, gid, 1)); if(TRMCFFKEY.ActivateShielding){ //shielding par[0] = TkCoo::GetLadderLength(tkid)/2; par[1] = TkDBc::Head->_ssize_inactive[1]/2; par[2] = 0.01/2.; // 100 um coo[0] = oo.x(); coo[1] = oo.y(); coo[2] = (std::abs(oo.z())/oo.z())*(std::abs(oo.z())+TkDBc::Head->_silicon_z/2+par[2]+0.1); if(layer==1) coo[2] -= TkDBc::Head->_dz[0]; if(layer==8) coo[2] -= TkDBc::Head->_dz[4]; if(layer==9) coo[2] -= TkDBc::Head->_dz[5]; VZERO(nrm,9*sizeof(nrm[0][0])/4); nrm[0][0] = nrm[1][1] = nrm[2][2] = 1; char name2[5]; std::ostrstream ost2(name2,sizeof(name2)); ost2 << "SHD" << layer << std::ends; gid = tkid+1000; mvol->add(new AMSgvolume("TrShield-M", _nrot++, name2, "BOX", par, 3, coo, nrm, "ONLY", 1, gid, 1)); } }
AMSgvolume *BuildLadder(AMSgvolume *mvol, int tkid) { // Build ladder geometry TkLadder *lad = TkDBc::Head->FindTkId(tkid); if (!lad) return 0; int layer = std::abs(tkid)/100; int islot = (tkid > 0) ? tkid%100 : -tkid%100+20; int iname = layer*100+islot; char name[5]; std::ostrstream ost(name,sizeof(name)); ost << "L" << iname << std::ends; geant par[3]; par[0] = TkCoo::GetLadderLength(tkid)/2; par[1] = TkDBc::Head->_ssize_inactive[1]/2; par[2] = TkDBc::Head->_silicon_z/2; double hlen = TkCoo::GetLadderLength(tkid)/2 -(TkDBc::Head->_ssize_inactive[0]-TkDBc::Head->_ssize_active[0])/2; double hwid = TkDBc::Head->_ssize_active[1]/2; AMSRotMat rot0 = lad->GetRotMatT(); AMSRotMat rot = rot0*lad->GetRotMat(); AMSPoint pos = lad->GetPos()+lad->GetPosT(); AMSPoint loc(hlen, hwid, 0); AMSPoint oo = rot*loc+pos; // Get coordinate w.r.t. the mother layer geant coo[3]; coo[0] = oo.x(); coo[1] = oo.y(); coo[2] = oo.z(); if(layer==1) coo[2] -= TkDBc::Head->_dz[0]; if(layer==8) coo[2] -= TkDBc::Head->_dz[4]; if(layer==9) coo[2] -= TkDBc::Head->_dz[5]; AMSRotMat lrm0 = lad->GetRotMatT(); AMSRotMat lrm = lrm0*lad->GetRotMat(); number nrm[3][3]; for (int ii = 0; ii < 9; ii++) nrm[ii/3][ii%3] = lrm.GetEl(ii/3,ii%3); int gid =abs(tkid)/tkid* (abs(tkid)+1000); // printf("Sensor name %s %+03d %+9d %f %f %f\n",name,tkid,gid,coo[0],coo[1],coo[2]); AMSgvolume* ladd=(AMSgvolume*)mvol ->add(new AMSgvolume("NONACTIVE_SILICON", _nrot++, name, "BOX", par, 3, coo, nrm, "ONLY", 1, gid, 1)); // printf("Ladder name %s\n",name); // Build sensors for (int sensor = 0; sensor < lad->GetNSensors(); sensor++){ char nameS[5]; std::ostrstream ost2(nameS,sizeof(nameS)); ost2 << "S" << iname << std::ends; geant par[3]; par[0] = TkDBc::Head->_ssize_active[0]/2; par[1] = TkDBc::Head->_ssize_active[1]/2; par[2] = TkDBc::Head->_silicon_z/2; // Get coordinate w.r.t. the mother ladder geant coo[3]; coo[0] = -TkCoo::GetLadderLength(tkid)/2+ TkDBc::Head->_ssize_inactive[0]/2.+ sensor * TkDBc::Head->_SensorPitchK; coo[1] = coo[2] = 0; number nrm[3][3]; VZERO(nrm, 9*sizeof(nrm[0][0])/4); nrm[0][0] = nrm[1][1] = nrm[2][2] = 1; int lside= (tkid>0)? 1:0; int gid = abs(tkid)+1000*(lside)+10000*(sensor+1); // printf("Sensor name %s %+03d %+9d %f %f %f\n",nameS,tkid,gid,coo[0],coo[1],coo[2]); ladd->add(new AMSgvolume("ACTIVE_SILICON", _nrot++, nameS, "BOX", par, 3, coo, nrm, "ONLY", 1, gid, 1)); } return ladd; }