CMS 3D CMS Logo

Public Member Functions | Private Attributes

CSCGeometryParsFromDD Class Reference

#include <CSCGeometryParsFromDD.h>

List of all members.

Public Member Functions

bool build (const DDCompactView *cview, const MuonDDDConstants &muonConstants, RecoIdealGeometry &rig, CSCRecoDigiParameters &rdp)
 Build the geometry returning the RecoIdealGeometry and the CSCRecoDigiParameters objects.
 CSCGeometryParsFromDD ()
 Constructor.
virtual ~CSCGeometryParsFromDD ()
 Destructor.

Private Attributes

std::string myName

Detailed Description

Build the CSCGeometry from the DDD description.

Author:
Tim Cox

Definition at line 21 of file CSCGeometryParsFromDD.h.


Constructor & Destructor Documentation

CSCGeometryParsFromDD::CSCGeometryParsFromDD ( )

Constructor.

Definition at line 37 of file CSCGeometryParsFromDD.cc.

: myName("CSCGeometryParsFromDD") { }
CSCGeometryParsFromDD::~CSCGeometryParsFromDD ( ) [virtual]

Destructor.

Definition at line 39 of file CSCGeometryParsFromDD.cc.

{ }

Member Function Documentation

bool CSCGeometryParsFromDD::build ( const DDCompactView cview,
const MuonDDDConstants muonConstants,
RecoIdealGeometry rig,
CSCRecoDigiParameters rdp 
)

Build the geometry returning the RecoIdealGeometry and the CSCRecoDigiParameters objects.

crap: using a constructed wg to deconstruct it and put it in db... alternative? use temporary (not wg!) storage.

format as inserted is best documented by the actualy push_back statements below.

fupar size now becomes origSize+6+wg.wiresInEachGroup.size()+wg.consecutiveGroups.size()

end crap

Definition at line 41 of file CSCGeometryParsFromDD.cc.

References DDFilteredView::addFilter(), CSCWireGroupPackage::alignmentPinToFirstWire, DDSpecificsFilter::AND, CSCNumberingScheme::baseNumberToUnitNumber(), CSCDetId::chamber(), CSCWireGroupPackage::consecutiveGroups, filterCSVwithJSON::copy, CSCDetId, ddsubtraction, cond::rpcobgas::detid, Reference_intrackfit_cff::endcap, CSCDetId::endcap(), DDSpecificsFilter::equals, align_tpl::filter, first, DDFilteredView::firstChild(), DDFilteredView::geoHistory(), MuonDDDNumbering::geoHistoryToBaseNumber(), i, RecoIdealGeometry::insert(), CSCDetId::layer(), CSCWireGroupPackage::lengthOfWirePlane, DDFilteredView::logicalPart(), LogTrace, myName, CSCWireGroupPackage::narrowWidthOfWirePlane, DDFilteredView::next(), CSCWireGroupPackage::numberOfGroups, DDSolid::parameters(), CSCRecoDigiParameters::pChamberType, CSCRecoDigiParameters::pfupars, CSCRecoDigiParameters::pUserParOffset, CSCRecoDigiParameters::pUserParSize, CSCDetId::ring(), relativeConstraints::ring, DDFilteredView::rotation(), edm::second(), DDSpecificsFilter::setCriteria(), DDSolid::shape(), DDLogicalPart::solid(), DDBooleanSolid::solidA(), DDFilteredView::specifics(), relativeConstraints::station, CSCDetId::station(), DDBase< N, C >::toString(), DDFilteredView::translation(), relativeConstraints::value, CSCChamberSpecs::whatChamberType(), CSCWireGroupPackage::wideWidthOfWirePlane, CSCWireGroupPackage::wiresInEachGroup, and CSCWireGroupPackage::wireSpacing.

Referenced by CSCRecoIdealDBLoader::beginRun(), and CSCGeometryBuilderFromDDD::build().

                                     {
  std::string attribute = "MuStructure";      // could come from outside
  std::string value     = "MuonEndcapCSC";    // could come from outside
  DDValue muval(attribute, value, 0.0);

  // Asking for a specific section of the MuStructure

  DDSpecificsFilter filter;
  filter.setCriteria(muval, // name & value of a variable 
                     DDSpecificsFilter::equals,
                     DDSpecificsFilter::AND, 
                     true, // compare strings otherwise doubles
                     true // use merged-specifics or simple-specifics
                     );

  DDFilteredView fv( *cview );
  fv.addFilter(filter);

  bool doSubDets = fv.firstChild();

  if (!doSubDets) {
    edm::LogError("CSCGeometryParsFromDD") << "Can not proceed, no CSC parts found with the filter.  The current node is: " << fv.logicalPart().toString();
    return false;
  }
  int noOfAnonParams = 0;
  std::vector<const DDsvalues_type *> spec = fv.specifics();
  std::vector<const DDsvalues_type *>::const_iterator spit = spec.begin();
  std::vector<double> uparvals;
  std::vector<double> fpar;
  std::vector<double> dpar;
  std::vector<double> gtran( 3 );
  std::vector<double> grmat( 9 );
  std::vector<double> trm ( 9 );
  while (doSubDets) {
    spec = fv.specifics();
    spit = spec.begin();

    // get numbering information early for possible speed up of code.

    LogTrace(myName) << myName  << ": create numbering scheme...";

    MuonDDDNumbering mdn(muonConstants);
    MuonBaseNumber mbn = mdn.geoHistoryToBaseNumber(fv.geoHistory());
    CSCNumberingScheme mens(muonConstants);

    LogTrace(myName) << myName  << ": find detid...";

    int id = mens.baseNumberToUnitNumber( mbn ); //@@ FIXME perhaps should return CSCDetId itself?

    LogTrace(myName) << myName  << ": raw id for this detector is " << id << 
      ", octal " << std::oct << id << ", hex " << std::hex << id << std::dec;

    CSCDetId detid = CSCDetId( id );
    int jendcap  = detid.endcap();
    int jstation = detid.station();
    int jring    = detid.ring();
    int jchamber = detid.chamber();
    int jlayer   = detid.layer();

    // Package up the wire group info as it's decoded
    CSCWireGroupPackage wg; 
    uparvals.clear();
    //std::cout << "size of spec=" << spec.size() << std::endl;

    // if the specs are made no need to get all this crap!
    int chamberType = CSCChamberSpecs::whatChamberType( jstation, jring );
    //    std::cout << "Chamber Type: " << chamberType << std::endl;
    size_t ct = 0;
    bool chSpecsAlreadyExist = false;
    for ( ; ct < rdp.pChamberType.size() ; ++ct ) {
      if ( chamberType == rdp.pChamberType[ct] ) {
        break;
      }
    }
    if ( ct < rdp.pChamberType.size() && rdp.pChamberType[ct] == chamberType ) {
      // it was found, therefore no need to load all the intermediate crap from DD.
      //      std::cout << "already found a " << chamberType << " at index " << ct << std::endl;
      chSpecsAlreadyExist = true;
    } else {
      for (;  spit != spec.end(); spit++) {
        DDsvalues_type::const_iterator it = (**spit).begin();
        for (;  it != (**spit).end(); it++) {
          //std::cout << "it->second.name()=" << it->second.name() << std::endl;  
          if (it->second.name() == "upar") {
            uparvals.push_back(it->second.doubles().size());
            for ( size_t i = 0; i < it->second.doubles().size(); ++i) {
              uparvals.push_back(it->second.doubles()[i]);
            }
            //std::cout << "found upars " << std::endl;
          } else if (it->second.name() == "NoOfAnonParams") {
            noOfAnonParams = static_cast<int>( it->second.doubles()[0] );
          } else if (it->second.name() == "NumWiresPerGrp") {
            //numWiresInGroup = it->second.doubles();
            for ( size_t i = 0 ; i < it->second.doubles().size(); i++) {
              wg.wiresInEachGroup.push_back( int( it->second.doubles()[i] ) );
            }
            //std::cout << "found upars " << std::endl;
          } else if ( it->second.name() == "NumGroups" ) {
            //numGroups = it->second.doubles();
            for ( size_t i = 0 ; i < it->second.doubles().size(); i++) {
              wg.consecutiveGroups.push_back( int( it->second.doubles()[i] ) );
            }
          } else if ( it->second.name() == "WireSpacing" ) {
            wg.wireSpacing = it->second.doubles()[0];
          } else if ( it->second.name() == "AlignmentPinToFirstWire" ) {
            wg.alignmentPinToFirstWire = it->second.doubles()[0]; 
          } else if ( it->second.name() == "TotNumWireGroups" ) {
            wg.numberOfGroups = int(it->second.doubles()[0]);
          } else if ( it->second.name() == "LengthOfFirstWire" ) {
            wg.narrowWidthOfWirePlane = it->second.doubles()[0];
          } else if ( it->second.name() == "LengthOfLastWire" ) {
            wg.wideWidthOfWirePlane = it->second.doubles()[0];
          } else if ( it->second.name() == "RadialExtentOfWirePlane" ) {
            wg.lengthOfWirePlane = it->second.doubles()[0];
          }
        }
      }
      
      uparvals.push_back( wg.wireSpacing );
      uparvals.push_back( wg.alignmentPinToFirstWire );
      uparvals.push_back( wg.numberOfGroups );
      uparvals.push_back( wg.narrowWidthOfWirePlane );
      uparvals.push_back( wg.wideWidthOfWirePlane );
      uparvals.push_back( wg.lengthOfWirePlane );
      uparvals.push_back( wg.wiresInEachGroup.size() ); 
      for (CSCWireGroupPackage::Container::const_iterator it = wg.wiresInEachGroup.begin();
           it != wg.wiresInEachGroup.end(); ++it) {
        uparvals.push_back(*it);
      }
      for (CSCWireGroupPackage::Container::const_iterator it = wg.consecutiveGroups.begin();
           it != wg.consecutiveGroups.end(); ++it) {
        uparvals.push_back(*it);
      }
    }
    fpar.clear();
    //    dpar = fv.logicalPart().solid().parameters();
    if ( fv.logicalPart().solid().shape() == ddsubtraction ) {
      const DDSubtraction& first = fv.logicalPart().solid();
      const DDSubtraction& second = first.solidA();
      const DDSolid& third = second.solidA();
      dpar = third.parameters();
    } else {
      dpar = fv.logicalPart().solid().parameters();
    }

    LogTrace(myName) << myName  << ": noOfAnonParams=" << noOfAnonParams;
    LogTrace(myName) << myName  << ": fill fpar...";
    LogTrace(myName) << myName  << ": dpars are... " << 
      dpar[4]/cm << ", " << dpar[8]/cm << ", " << 
      dpar[3]/cm << ", " << dpar[0]/cm;

    fpar.push_back( ( dpar[4]/cm) );
    fpar.push_back( ( dpar[8]/cm ) ); 
    fpar.push_back( ( dpar[3]/cm ) ); 
    fpar.push_back( ( dpar[0]/cm ) ); 

    LogTrace(myName) << myName  << ": fill gtran...";

    gtran[0] = (float) 1.0 * (fv.translation().X() / cm);
    gtran[1] = (float) 1.0 * (fv.translation().Y() / cm);
    gtran[2] = (float) 1.0 * (fv.translation().Z() / cm);

    LogTrace(myName) << myName << ": gtran[0]=" << gtran[0] << ", gtran[1]=" <<
      gtran[1] << ", gtran[2]=" << gtran[2];

    LogTrace(myName) << myName  << ": fill grmat...";

    fv.rotation().GetComponents(trm.begin(), trm.end());
    size_t rotindex = 0;
    for (size_t i = 0; i < 9; ++i) {
      grmat[i] = (float) 1.0 * trm[rotindex];
      rotindex = rotindex + 3;
      if ( (i+1) % 3 == 0 ) {
        rotindex = (i+1) / 3;
      }
    }
    LogTrace(myName) << myName  << ": looking for wire group info for layer " <<
      "E" << CSCDetId::endcap(id) << 
      " S" << CSCDetId::station(id) << 
      " R" << CSCDetId::ring(id) <<
      " C" << CSCDetId::chamber(id) <<
      " L" << CSCDetId::layer(id);
          
    if ( wg.numberOfGroups != 0 ) {
      LogTrace(myName) << myName  << ": fv.geoHistory:      = " << fv.geoHistory() ;
      LogTrace(myName) << myName  << ": TotNumWireGroups     = " << wg.numberOfGroups ;
      LogTrace(myName) << myName  << ": WireSpacing          = " << wg.wireSpacing ;
      LogTrace(myName) << myName  << ": AlignmentPinToFirstWire = " << wg.alignmentPinToFirstWire ;
      LogTrace(myName) << myName  << ": Narrow width of wire plane = " << wg.narrowWidthOfWirePlane ;
      LogTrace(myName) << myName  << ": Wide width of wire plane = " << wg.wideWidthOfWirePlane ;
      LogTrace(myName) << myName  << ": Length in y of wire plane = " << wg.lengthOfWirePlane ;
      LogTrace(myName) << myName  << ": wg.consecutiveGroups.size() = " << wg.consecutiveGroups.size() ;
      LogTrace(myName) << myName  << ": wg.wiresInEachGroup.size() = " << wg.wiresInEachGroup.size() ;
      LogTrace(myName) << myName  << ": \tNumGroups\tWiresInGroup" ;
      for (size_t i = 0; i < wg.consecutiveGroups.size(); i++) {
        LogTrace(myName) << myName  << " \t" << wg.consecutiveGroups[i] << "\t\t" << wg.wiresInEachGroup[i] ;
      }
    } else {
      LogTrace(myName) << myName  << ": DDD is MISSING SpecPars for wire groups" ;
    }
    LogTrace(myName) << myName << ": end of wire group info. " ;

    LogTrace(myName) << myName << ":_z_ E" << jendcap << " S" << jstation << " R" << jring <<
      " C" << jchamber << " L" << jlayer <<
      " gx=" << gtran[0] << ", gy=" << gtran[1] << ", gz=" << gtran[2] <<
      " thickness=" << fpar[2]*2.;

    if ( jlayer == 0 ) { // Can only build chambers if we're filtering them

      LogTrace(myName) << myName  << ":_z_ frame=" << uparvals[31]/10. <<
        " gap=" << uparvals[32]/10. << " panel=" << uparvals[33]/10. << " offset=" << uparvals[34]/10.;

    if ( jstation==1 && jring==1 ) {
      // set up params for ME1a and ME1b and call buildChamber *for each*
      // Both get the full ME11 dimensions

      // detid is for ME11 and that's what we're using for ME1b in the software

      rig.insert( id, gtran, grmat, fpar );
      if ( !chSpecsAlreadyExist ) {
        //      rdp.pCSCDetIds.push_back(CSCDetId(id));
        //      std::cout << " inserting chamber type " << chamberType << std::endl;
        rdp.pChamberType.push_back(chamberType);
        rdp.pUserParOffset.push_back(rdp.pfupars.size());
        rdp.pUserParSize.push_back(uparvals.size());
        std::copy ( uparvals.begin(), uparvals.end(), std::back_inserter(rdp.pfupars));
      }

      // No. of anonymous parameters per chamber type should be read from cscSpecs file...
      // Only required for ME11 splitting into ME1a and ME1b values,
      // If it isn't seen may as well try to get further but this value will depend
      // on structure of the file so may not even match! 
      const int kNoOfAnonParams = 35;
      if ( noOfAnonParams == 0 ) { noOfAnonParams = kNoOfAnonParams; } // in case it wasn't seen
      
      std::copy( uparvals.begin()+noOfAnonParams+1, uparvals.begin()+(2*noOfAnonParams)+2, uparvals.begin()+1 ); // copy ME1a params from back to the front
      
      CSCDetId detid1a = CSCDetId( jendcap, 1, 4, jchamber, 0 ); // reset to ME1A
      rig.insert( detid1a.rawId(), gtran, grmat, fpar );
      int chtypeA = CSCChamberSpecs::whatChamberType( 1, 4 );
      ct = 0;
      for ( ; ct < rdp.pChamberType.size() ; ++ct ) {
        if ( chtypeA == rdp.pChamberType[ct] ) {
          break;
        }
      }
      if ( ct < rdp.pChamberType.size() && rdp.pChamberType[ct] == chtypeA ) {
        // then its in already, don't put it
        //      std::cout << "found chamber type " << chtypeA << " so don't put it in! " << std::endl;
      } else {
        //      rdp.pCSCDetIds.push_back(detid1a);
        //      std::cout << " inserting chamber type " << chtypeA << std::endl;
        rdp.pChamberType.push_back(chtypeA);
        rdp.pUserParOffset.push_back(rdp.pfupars.size());
        rdp.pUserParSize.push_back(uparvals.size());
        std::copy ( uparvals.begin(), uparvals.end(), std::back_inserter(rdp.pfupars));
      }
      
    }
    else {
      rig.insert( id, gtran, grmat, fpar );
      if ( !chSpecsAlreadyExist ) {
        //   rdp.pCSCDetIds.push_back(CSCDetId(id));
        //      std::cout << " inserting chamber type " << chamberType << std::endl;
        rdp.pChamberType.push_back(chamberType);
        rdp.pUserParOffset.push_back(rdp.pfupars.size());
        rdp.pUserParSize.push_back(uparvals.size());
        std::copy ( uparvals.begin(), uparvals.end(), std::back_inserter(rdp.pfupars));
      }
    }

    } // filtering chambers.

    doSubDets = fv.next();
  }
  return true;
}

Member Data Documentation

std::string CSCGeometryParsFromDD::myName [private]

Definition at line 39 of file CSCGeometryParsFromDD.h.

Referenced by build().