Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "TEveStraightLineSet.h"
00015 #include "TEveCompound.h"
00016
00017 #include "Fireworks/Core/interface/FWProxyBuilderBase.h"
00018 #include "Fireworks/Core/interface/FWEventItem.h"
00019 #include "Fireworks/Core/interface/FWGeometry.h"
00020 #include "Fireworks/Core/interface/fwLog.h"
00021
00022 #include "DataFormats/CSCDigi/interface/CSCWireDigiCollection.h"
00023
00024 #include <cmath>
00025
00026 class FWCSCWireDigiProxyBuilder : public FWProxyBuilderBase
00027 {
00028 public:
00029 FWCSCWireDigiProxyBuilder() {}
00030 virtual ~FWCSCWireDigiProxyBuilder() {}
00031
00032 REGISTER_PROXYBUILDER_METHODS();
00033
00034 private:
00035 virtual void build(const FWEventItem* iItem, TEveElementList* product, const FWViewContext*);
00036 FWCSCWireDigiProxyBuilder(const FWCSCWireDigiProxyBuilder&);
00037 const FWCSCWireDigiProxyBuilder& operator=(const FWCSCWireDigiProxyBuilder&);
00038
00039
00040
00041 double getYOfFirstWire(const int station, const int ring, const double length);
00042 double getAverageWireSpacing(const int station, const int ring);
00043 };
00044
00045 double
00046 FWCSCWireDigiProxyBuilder::getYOfFirstWire(const int station, const int ring, const double length)
00047 {
00048 double yAlignmentFrame = 3.49;
00049 double alignmentPinToFirstWire;
00050
00051 if ( station == 1 )
00052 {
00053 if ( ring == 1 || ring == 4 )
00054 {
00055 alignmentPinToFirstWire = 1.065;
00056 yAlignmentFrame = 0.0;
00057 }
00058
00059 else
00060 alignmentPinToFirstWire = 2.85;
00061 }
00062
00063 else if ( station == 4 && ring == 1 )
00064 alignmentPinToFirstWire = 3.04;
00065
00066 else if ( station == 3 && ring == 1 )
00067 alignmentPinToFirstWire = 2.84;
00068
00069 else
00070 alignmentPinToFirstWire = 2.87;
00071
00072 return (yAlignmentFrame-length) + alignmentPinToFirstWire;
00073 }
00074
00075 double
00076 FWCSCWireDigiProxyBuilder::getAverageWireSpacing(const int station, const int ring)
00077 {
00078
00079
00080
00081 if ( ring == 2 )
00082 {
00083 if ( station == 1 )
00084 return 174.81/64;
00085 else
00086 return 323.38/64;
00087 }
00088
00089 if ( station == 1 && (ring == 1 || ring == 4))
00090 return 150.5/48;
00091 if ( station == 1 && ring == 3 )
00092 return 164.47/32;
00093 if ( station == 2 && ring == 1 )
00094 return 189.97/112;
00095 if ( station == 3 && ring == 1 )
00096 return 170.01/96;
00097 if ( station == 4 && ring == 1 )
00098 return 149.73/96;
00099
00100 return 0.0;
00101 }
00102
00103 void
00104 FWCSCWireDigiProxyBuilder::build(const FWEventItem* iItem, TEveElementList* product, const FWViewContext*)
00105 {
00106 const CSCWireDigiCollection* digis = 0;
00107
00108 iItem->get(digis);
00109
00110 if ( ! digis )
00111 {
00112 fwLog( fwlog::kWarning ) << "Failed to get CSCWireDigis" << std::endl;
00113 return;
00114 }
00115 const FWGeometry *geom = iItem->getGeom();
00116
00117 for ( CSCWireDigiCollection::DigiRangeIterator dri = digis->begin(), driEnd = digis->end();
00118 dri != driEnd; ++dri )
00119 {
00120 const CSCDetId& cscDetId = (*dri).first;
00121 unsigned int rawid = cscDetId.rawId();
00122 const CSCWireDigiCollection::Range& range = (*dri).second;
00123
00124 if( ! geom->contains( rawid ))
00125 {
00126 fwLog( fwlog::kWarning ) << "Failed to get geometry of CSC chamber with detid: "
00127 << rawid << std::endl;
00128
00129 TEveCompound* compound = createCompound();
00130 setupAddElement( compound, product );
00131
00132 continue;
00133 }
00134
00135 const float* shape = geom->getShapePars( rawid );
00136
00137 float length = shape[4];
00138 float topWidth = shape[2];
00139 float bottomWidth = shape[1];
00140
00141
00142
00143
00144 double wireSpacing = getAverageWireSpacing(cscDetId.station(), cscDetId.ring());
00145
00146
00147
00148 double yOfFirstWire = getYOfFirstWire( cscDetId.station(), cscDetId.ring(), length );
00149
00150 for ( CSCWireDigiCollection::const_iterator dit = range.first;
00151 dit != range.second; ++dit )
00152 {
00153 TEveStraightLineSet* wireDigiSet = new TEveStraightLineSet();
00154 wireDigiSet->SetLineWidth(3);
00155 setupAddElement(wireDigiSet, product);
00156
00157 int wireGroup = (*dit).getWireGroup();
00158 float yOfWire = yOfFirstWire + ((wireGroup-1)*wireSpacing);
00159 float wireLength = yOfWire*(topWidth-bottomWidth) / length;
00160 wireLength += bottomWidth*2.0;
00161
00162 float localPointLeft[3] =
00163 {
00164 static_cast<float>(-wireLength*0.5), yOfWire, static_cast<float>(0.0)
00165 };
00166
00167
00168
00169 float localPointRight[3] =
00170 {
00171 static_cast<float>(wireLength*0.5), yOfWire, static_cast<float>(0.0)
00172
00173 };
00174
00175 float globalPointLeft[3];
00176 float globalPointRight[3];
00177
00178 geom->localToGlobal( rawid, localPointLeft, globalPointLeft, localPointRight, globalPointRight );
00179
00180 wireDigiSet->AddLine( globalPointLeft[0], globalPointLeft[1], globalPointLeft[2],
00181 globalPointRight[0], globalPointRight[1], globalPointRight[2] );
00182 }
00183 }
00184 }
00185
00186 REGISTER_FWPROXYBUILDER(FWCSCWireDigiProxyBuilder, CSCWireDigiCollection, "CSCWireDigi",
00187 FWViewType::kAll3DBits | FWViewType::kAllRPZBits);
00188
00189