# include "TArrayF.h" # include "TArrayI.h" # include "hades.h" # include "hdetpario.h" # include "hmdcdetector.h" # include "hmdcmodulegeometry.h" # include "hpario.h" # include "hspectrometer.h" ClassImp(HMdcModuleGeometry) //*-- Author : Beatriz Fuentes Arenaz //*-- Last updated : 17/01/2002 by I. Koenig //*-- Last updated : 16/3/2000 by Beatriz Fuentes(functions read and writeFile) //*-- Last updated: 27/10/99 //*-- Modified : 19/05/99 //*-- Copyright : GENP (Univ. Santiago de Compostela) //_HADES_CLASS_DESCRIPTION ////////////////////////////////////////////////////////// // HMdcModuleGeometry stores the geometry of one mdc module. // // It will change soon, since the general geometry // // structure has not been completely designed. // // ////////////////////////////////////////////////////////// HMdcModuleGeometry :: HMdcModuleGeometry(const char* name,const char* title, const char* context) : HParSet(name,title,context) { // gets number of sectors, modules and layers from setup and allocate memory fNSectors = gHades->getSetup()->getDetector("Mdc")->getMaxSectors(); fNModules = gHades->getSetup()->getDetector("Mdc")->getMaxModules(); fNLayers = ((HMdcDetector* )(gHades->getSetup()->getDetector("Mdc")))->getMaxComponents(); fZPlane = new TArrayF(fNSectors*fNModules*fNLayers); fWireOrient = new TArrayF(fNSectors*fNModules*fNLayers); fCosn = new TArrayF(fNSectors*fNModules*fNLayers); fSinn = new TArrayF(fNSectors*fNModules*fNLayers); fSgpln = new TArrayF(fNSectors*fNModules*fNLayers); fPitch = new TArrayF(fNSectors*fNModules*fNLayers); fFirstWirePos = new TArrayF(fNSectors*fNModules*fNLayers); fCentralWire = new TArrayF(fNSectors*fNModules*fNLayers); fMaxNumCells = new TArrayI(fNSectors*fNModules*fNLayers); fCatDistance = new TArrayF(fNSectors*fNModules*fNLayers); strcpy(detName, "Mdc"); } HMdcModuleGeometry :: ~HMdcModuleGeometry(void){ // destructor if(fZPlane) delete fZPlane; if(fWireOrient) delete fWireOrient; if(fCosn) delete fCosn; if(fSinn) delete fSinn; if(fSgpln) delete fSgpln; if(fPitch) delete fPitch; if(fFirstWirePos) delete fFirstWirePos; if(fCentralWire) delete fCentralWire; if(fMaxNumCells) delete fMaxNumCells; if(fCatDistance) delete fCatDistance; } Bool_t HMdcModuleGeometry :: init(HParIo* inp, Int_t* set){ // initializes the container from an input HDetParIo* input=inp->getDetParIo("HMdcParIo"); if (input) return (input->init(this,set)); return kFALSE; } Int_t HMdcModuleGeometry :: write(HParIo* output){ // writes the container to an output HDetParIo* out=output->getDetParIo("HMdcParIo"); if (out) return out->write(this); return -1; } Int_t HMdcModuleGeometry::writeFile(fstream *pFile) { if (pFile) { Text_t buf[155]; Text_t com[]="##################################################################################\n" "# Geometrical parameters for Santiago tracking of the MDC\n" "# Format:\n" "# sector module layer \n" "# zplane: z coordinate of plane (mm) \n" "# angle: orientation of wires in layer (deg)\n" "# cosn \n" "# sinn \n" "# sgpln: sigma of layer (mm)\n" "# pitch (mm)\n" "# catdistance: distance between cathodes (mm)\n" "# firstWirePos: position of first wire (mm)\n" "# centralWire: number of central wire (mm)\n" "# maxNumCells: maximum number of cells in layer\n" "####################################################################################\n"; pFile->write(com,strlen(com)); sprintf(buf,"[%s]\n",GetName()); pFile->write(buf,strlen(buf)); Int_t index; for(Int_t s=0;sAt(index), fWireOrient->At(index), fCosn->At(index), fSinn->At(index), fSgpln->At(index), fPitch->At(index), fCatDistance->At(index), fFirstWirePos->At(index), fCentralWire->At(index), fMaxNumCells->At(index)); pFile->write(buf,strlen(buf)); } } } sprintf(buf,"###########################################################\n"); pFile->write(buf,strlen(buf)); setChanged(kFALSE); return 1; } cerr<<"Output is not writable"<eof()) { pFile->getline(buf,maxbuf); if (buf[0]=='[') { sscanf(buf,"%s",key); if (strstr(buf,GetName())!=0) { while (!all && !pFile->eof()) { c=pFile->get(); if (c=='#' || c=='/') all=kTRUE; else { pFile->putback(c); pFile->getline(buf,maxbuf); sscanf(buf,"%i%i%i%f%f%f%f%f%f%f%f%f%i", §or,&module,&layer,&zplane,&angle,&cosn,&sinn,&sgpln, &pitch,&catDistance,&firstWirePos,¢ralWire, &maxNumCells); pos=sector*4+module; if (set[pos]) { index = getIndex(sector, module, layer); fZPlane->AddAt(zplane,index); fWireOrient->AddAt(angle,index); fCosn->AddAt(cosn,index); fSinn->AddAt(sinn,index); fSgpln->AddAt(sgpln,index); fPitch->AddAt(pitch,index); fCatDistance->AddAt(catDistance,index); fFirstWirePos->AddAt(firstWirePos,index); fCentralWire->AddAt(centralWire,index); fMaxNumCells->AddAt(maxNumCells,index); } } } } } } if (all) { setInputVersion(1,inputNumber); setChanged(); printf("MdcGeometry initialized from Ascii file\n"); return kTRUE; } } return kFALSE; } Bool_t HMdcModuleGeometry :: setZPlane(Int_t sector, Int_t module, Int_t layer, Float_t z){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fZPlane->AddAt(z, getIndex(sector,module,layer)); return kTRUE; } Bool_t HMdcModuleGeometry :: setWireOrient(Int_t sector, Int_t module, Int_t layer, Float_t z){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fWireOrient->AddAt(z, getIndex(sector,module,layer)); return kTRUE; } Bool_t HMdcModuleGeometry :: setCosn(Int_t sector, Int_t module, Int_t layer, Float_t cos){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fCosn->AddAt(cos, getIndex(sector,module,layer)); return kTRUE; } Bool_t HMdcModuleGeometry :: setSinn(Int_t sector, Int_t module, Int_t layer, Float_t sin){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fSinn->AddAt(sin, getIndex(sector,module,layer)); return kTRUE; } Bool_t HMdcModuleGeometry :: setSgpln(Int_t sector, Int_t module, Int_t layer, Float_t sigma){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fSgpln->AddAt(sigma, getIndex(sector,module,layer)); return kTRUE; } Bool_t HMdcModuleGeometry :: setPitch(Int_t sector, Int_t module, Int_t layer, Float_t dist){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fPitch->AddAt(dist, getIndex(sector,module,layer)); return kTRUE; } Bool_t HMdcModuleGeometry :: setFirstWirePos(Int_t sector, Int_t module, Int_t layer, Float_t pos){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fFirstWirePos->AddAt(pos, getIndex(sector,module,layer)); return kTRUE; } Bool_t HMdcModuleGeometry :: setCentralWire(Int_t sector, Int_t module, Int_t layer, Float_t num){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fCentralWire->AddAt(num, getIndex(sector,module,layer)); return kTRUE; } Bool_t HMdcModuleGeometry :: setMaxNumCells(Int_t sector, Int_t module, Int_t layer, Int_t num){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fMaxNumCells->AddAt(num, getIndex(sector,module,layer)); return kTRUE; } Bool_t HMdcModuleGeometry :: setCatDistance(Int_t sector, Int_t module, Int_t layer, Float_t distance){ if ((sector<0) || (sector>=fNSectors)) return kFALSE; if ((module<0) || (module>=fNModules)) return kFALSE; if ((layer<0) || (layer>=fNLayers )) return kFALSE; fCatDistance->AddAt(distance, getIndex(sector,module,layer)); return kTRUE; } void HMdcModuleGeometry::Streamer(TBuffer &R__b) { // Stream an object of class HMdcModuleGeometry. if (R__b.IsReading()) { Version_t R__v = R__b.ReadVersion(); if (R__v) { } HParSet::Streamer(R__b); R__b >> fNSectors; R__b >> fNModules; R__b >> fNLayers; fZPlane->Streamer(R__b); fWireOrient->Streamer(R__b); fCosn->Streamer(R__b); fSinn->Streamer(R__b); fSgpln->Streamer(R__b); fPitch->Streamer(R__b); fCatDistance->Streamer(R__b); fFirstWirePos->Streamer(R__b); fCentralWire->Streamer(R__b); fMaxNumCells->Streamer(R__b); } else { R__b.WriteVersion(HMdcModuleGeometry::IsA()); HParSet::Streamer(R__b); R__b << fNSectors; R__b << fNModules; R__b << fNLayers; fZPlane->Streamer(R__b); fWireOrient->Streamer(R__b); fCosn->Streamer(R__b); fSinn->Streamer(R__b); fSgpln->Streamer(R__b); fPitch->Streamer(R__b); fCatDistance->Streamer(R__b); fFirstWirePos->Streamer(R__b); fCentralWire->Streamer(R__b); fMaxNumCells->Streamer(R__b); } }