CMS 3D CMS Logo

hcaltb::HcalTBTDCUnpacker Class Reference

Date
2006/08/28 16:39:16
Revision
1.6
More...

#include <RecoTBCalo/HcalTBObjectUnpacker/interface/HcalTBTDCUnpacker.h>

List of all members.

Public Member Functions

 HcalTBTDCUnpacker (bool)
void setCalib (const vector< vector< string > > &calibLines_)
void unpack (const FEDRawData &raw, HcalTBEventPosition &pos, HcalTBTiming &timing) const

Private Member Functions

void reconstructTiming (const std::vector< Hit > &hits, HcalTBTiming &timing) const
void reconstructWC (const std::vector< Hit > &hits, HcalTBEventPosition &pos) const
void unpackHits (const FEDRawData &raw, std::vector< Hit > &hits, HcalTBTiming &timing) const

Private Attributes

bool includeUnmatchedHits_
double tdc_convers [161]
double tdc_ped [161]
struct
hcaltb::HcalTBTDCUnpacker::WireChamberRecoData 
wc_ [PLANECOUNT]

Static Private Attributes

static const int PLANECOUNT = 16
static const int WC_CHANNELIDS [PLANECOUNT *3]

Classes

struct  Hit
struct  WireChamberRecoData


Detailed Description

Date
2006/08/28 16:39:16
Revision
1.6

Author:
J. Mans, P. Dudero - Minnesota

Definition at line 15 of file HcalTBTDCUnpacker.h.


Constructor & Destructor Documentation

hcaltb::HcalTBTDCUnpacker::HcalTBTDCUnpacker ( bool  include_unmatched_hits  ) 

Definition at line 30 of file HcalTBTDCUnpacker.cc.

00030                                                                 :
00031   includeUnmatchedHits_(include_unmatched_hits) {
00032 //  setupWC(); reads it from configuration file
00033 }
void HcalTBTDCUnpacker::setCalib(const vector<vector<string> >& calibLines_) {


Member Function Documentation

void hcaltb::HcalTBTDCUnpacker::reconstructTiming ( const std::vector< Hit > &  hits,
HcalTBTiming timing 
) const [private]

Definition at line 168 of file HcalTBTDCUnpacker.cc.

References j, lcBeamCoincidence, lcBeamHalo1, lcBeamHalo2, lcBeamHalo3, lcBeamHalo4, lcLaserFlash, lcMuon1, lcMuon2, lcMuon3, lcQIEPhase, lcScint1, lcScint2, lcScint3, lcScint4, lcTOF1J, lcTOF1S, lcTOF2J, lcTOF2S, lcTriggerTime, lcTTCL1ATime, HcalTBTiming::setHits(), HcalTBTiming::setTimes(), and tdc_ped.

Referenced by unpack().

00169                                                                       {
00170   std::vector<Hit>::const_iterator j;
00171   double trigger_time=0;
00172   double ttc_l1a_time=0;
00173   double laser_flash=0;
00174   double qie_phase=0;
00175   double TOF1S_time=0;
00176   double TOF1J_time=0;
00177   double TOF2S_time=0;
00178   double TOF2J_time=0;
00179   
00180   std::vector<double> m1hits, m2hits, m3hits, s1hits, s2hits, s3hits, s4hits,
00181                       bh1hits, bh2hits, bh3hits, bh4hits,beam_coinc;
00182 
00183   for (j=hits.begin(); j!=hits.end(); j++) {
00184     switch (j->channel) {
00185     case lcTriggerTime:     trigger_time   = j->time-tdc_ped[lcTriggerTime];  break;
00186     case lcTTCL1ATime:      ttc_l1a_time   = j->time-tdc_ped[lcTTCL1ATime];  break;
00187     case lcBeamCoincidence: beam_coinc.push_back(j->time-tdc_ped[lcBeamCoincidence]);  break;
00188     case lcLaserFlash:      laser_flash    = j->time-tdc_ped[lcLaserFlash];  break;
00189     case lcQIEPhase:        qie_phase      = j->time-tdc_ped[lcQIEPhase];  break;
00190     case lcMuon1:           m1hits.push_back(j->time-tdc_ped[lcMuon1]); break;
00191     case lcMuon2:           m2hits.push_back(j->time-tdc_ped[lcMuon2]); break;
00192     case lcMuon3:           m3hits.push_back(j->time-tdc_ped[lcMuon3]); break;
00193     case lcScint1:          s1hits.push_back(j->time-tdc_ped[lcScint1]); break;
00194     case lcScint2:          s2hits.push_back(j->time-tdc_ped[lcScint2]); break;
00195     case lcScint3:          s3hits.push_back(j->time-tdc_ped[lcScint3]); break;
00196     case lcScint4:          s4hits.push_back(j->time-tdc_ped[lcScint4]); break;
00197     case lcTOF1S:           TOF1S_time   = j->time-tdc_ped[lcTOF1S];  break;
00198     case lcTOF1J:           TOF1J_time   = j->time-tdc_ped[lcTOF1J];  break;
00199     case lcTOF2S:           TOF2S_time   = j->time-tdc_ped[lcTOF2S];  break;
00200     case lcTOF2J:           TOF2J_time   = j->time-tdc_ped[lcTOF2J];  break;
00201     case lcBeamHalo1:       bh1hits.push_back(j->time-tdc_ped[lcBeamHalo1]); break;
00202     case lcBeamHalo2:       bh2hits.push_back(j->time-tdc_ped[lcBeamHalo2]); break;
00203     case lcBeamHalo3:       bh3hits.push_back(j->time-tdc_ped[lcBeamHalo3]); break;
00204     case lcBeamHalo4:       bh4hits.push_back(j->time-tdc_ped[lcBeamHalo4]); break;
00205     default: break;
00206     }
00207   }
00208 
00209   timing.setTimes(trigger_time,ttc_l1a_time,laser_flash,qie_phase,TOF1S_time,TOF1J_time,TOF2S_time,TOF2J_time);
00210   timing.setHits (m1hits,m2hits,m3hits,s1hits,s2hits,s3hits,s4hits,bh1hits,bh2hits,bh3hits,bh4hits,beam_coinc);
00211 
00212 }

void hcaltb::HcalTBTDCUnpacker::reconstructWC ( const std::vector< Hit > &  hits,
HcalTBEventPosition pos 
) const [private]

Definition at line 268 of file HcalTBTDCUnpacker.cc.

References hcaltb::HcalTBTDCUnpacker::WireChamberRecoData::b0, hcaltb::HcalTBTDCUnpacker::WireChamberRecoData::b1, dsum(), includeUnmatchedHits_, j, mean(), hcaltb::N_SIGMA, PLANECOUNT, HcalTBEventPosition::setChamberHits(), hcaltb::TDC_OFFSET_CONSTANT, wc_, WC_CHANNELIDS, and x.

Referenced by unpack().

00268                                                                                                {
00269   // process all planes, looping over all hits...
00270   const int MAX_HITS=100;
00271   float hits1[MAX_HITS], hits2[MAX_HITS], hitsA[MAX_HITS];
00272   int n1,n2,nA,chan1,chan2,chanA;
00273   
00274   std::vector<double> x;
00275 
00276   for (int plane=0; plane<PLANECOUNT; plane++) {
00277     n1=0; n2=0; nA=0;
00278 
00279     std::vector<double> plane_hits;
00280     double hit_time;
00281 
00282     chan1=WC_CHANNELIDS[plane*3];
00283     chan2=WC_CHANNELIDS[plane*3+1];
00284     chanA=WC_CHANNELIDS[plane*3+2];
00285 
00286     for (std::vector<Hit>::const_iterator j=hits.begin(); j!=hits.end(); j++) {
00287       if (j->channel==chan1 && n1<MAX_HITS) {
00288         hits1[n1]=j->time-TDC_OFFSET_CONSTANT; n1++;
00289       }
00290       if (j->channel==chan2 && n2<MAX_HITS) {
00291         hits2[n2]=j->time-TDC_OFFSET_CONSTANT; n2++;
00292       }
00293       if (j->channel==chanA && nA<MAX_HITS) {
00294         hitsA[nA]=j->time-TDC_OFFSET_CONSTANT; nA++;
00295       }
00296     }
00297     
00298     // anode-matched hits
00299     for (int ii=0; ii<n1; ii++) {
00300       int jmin=-1, lmin=-1;
00301       float dsumMin=99999;
00302       for (int jj=0; jj<n2; jj++) {
00303         for (int ll=0; ll<nA; ll++) {
00304           float dsum=fabs(wc_[plane].mean - hits1[ii] - hits2[jj] + 2.0*hitsA[ll]);
00305           if(dsum<(N_SIGMA*wc_[plane].sigma) && dsum<dsumMin){
00306             jmin=jj;
00307             lmin=ll;
00308             dsumMin=dsum;
00309            }
00310         }             
00311       }
00312       if (jmin>=0) {
00313         hit_time = wc_[plane].b0 +
00314                              wc_[plane].b1 * (hits1[ii]-hits2[jmin]);
00315         if((plane%2)==0)
00316                 {
00317                 plane_hits.push_back(-hit_time);
00318                 }else{
00319                 plane_hits.push_back(hit_time);
00320                 }
00321         hits1[ii]=-99999;
00322         hits2[jmin]=-99999;
00323         hitsA[lmin]=99999;
00324       }
00325     }
00326 
00327     if (includeUnmatchedHits_||plane>9)   // unmatched hits (all pairs get in here)
00328       for (int ii=0; ii<n1; ii++) {
00329         if (hits1[ii]<-99990) continue;
00330         for (int jj=0; jj<n2; jj++) {
00331           if (hits2[jj]<-99990) continue;
00332           hit_time = wc_[plane].b0 +
00333                              wc_[plane].b1 * (hits1[ii]-hits2[jj]);
00334           if((plane%2)==0)
00335                 {
00336                 plane_hits.push_back(-hit_time);
00337                 }else{
00338                 plane_hits.push_back(hit_time);
00339                 }
00340         }
00341       }
00342 
00343     if ((plane%2)==0) x=plane_hits;
00344     else {
00345       char chamber='A'+plane/2;
00346       ep.setChamberHits(chamber,x,plane_hits);
00347     }
00348   }
00349   
00350 }

void hcaltb::HcalTBTDCUnpacker::setCalib ( const vector< vector< string > > &  calibLines_  ) 

Definition at line 34 of file HcalTBTDCUnpacker.cc.

References hcaltb::HcalTBTDCUnpacker::WireChamberRecoData::b0, hcaltb::HcalTBTDCUnpacker::WireChamberRecoData::b1, Exception, i, hcaltb::HcalTBTDCUnpacker::WireChamberRecoData::mean, hcaltb::HcalTBTDCUnpacker::WireChamberRecoData::sigma, size, tdc_convers, tdc_ped, and wc_.

Referenced by HcalTBObjectUnpacker::HcalTBObjectUnpacker().

00034                                                                            {
00035         for(int i=0;i<161;i++)
00036          {
00037           tdc_ped[i]=0.;tdc_convers[i]=1.;
00038          }
00039         for(unsigned int ii=0;ii<calibLines_.size();ii++)
00040          {
00041 //   TDC configuration
00042           if(calibLines_[ii][0]=="TDC")
00043                 {
00044                 if(calibLines_[ii].size()==4)
00045                   {
00046                   int channel=atoi(calibLines_[ii][1].c_str());
00047                   tdc_ped[channel]=atof(calibLines_[ii][2].c_str());
00048                   tdc_convers[channel]=atof(calibLines_[ii][3].c_str());
00049         //        printf("Got TDC %i ped %f , conversion %f\n",channel, tdc_ped[channel],tdc_convers[channel]);
00050                   }
00051                  else
00052                   {
00053                throw cms::Exception("Incomplete configuration") << 
00054                 "Wrong TDC configuration format : expected 3 parameters, got "<<calibLines_[ii].size()-1;
00055                   }
00056                 } // End of the TDCs
00057 
00058 //   Wire chambers calibration
00059           if(calibLines_[ii][0]=="WC")
00060                 {
00061                 if(calibLines_[ii].size()==6)
00062                   {
00063                   int plane=atoi(calibLines_[ii][1].c_str());
00064                   wc_[plane].b0=atof(calibLines_[ii][2].c_str());
00065                   wc_[plane].b1=atof(calibLines_[ii][3].c_str());
00066                   wc_[plane].mean=atof(calibLines_[ii][4].c_str());
00067                   wc_[plane].sigma=atof(calibLines_[ii][5].c_str());
00068        //         printf("Got WC plane %i b0 %f, b1 %f, mean %f, sigma %f\n",plane, 
00069        //                wc_[plane].b0,wc_[plane].b1,wc_[plane].mean,wc_[plane].sigma);
00070                   }
00071                  else
00072                   {
00073                throw cms::Exception("Incomplete configuration") << 
00074                 "Wrong Wire Chamber configuration format : expected 5 parameters, got "<<calibLines_[ii].size()-1;
00075                   }
00076                 } // End of the Wire Chambers
00077 
00078          } // End of the CalibLines
00079         }

void hcaltb::HcalTBTDCUnpacker::unpack ( const FEDRawData raw,
HcalTBEventPosition pos,
HcalTBTiming timing 
) const

Definition at line 81 of file HcalTBTDCUnpacker.cc.

References reconstructTiming(), reconstructWC(), and unpackHits().

Referenced by HcalTBObjectUnpacker::produce().

00083                                                            {
00084     std::vector<Hit> hits;
00085 
00086     unpackHits(raw, hits, timing);
00087     
00088     reconstructWC(hits, pos);
00089     reconstructTiming(hits, timing);
00090     
00091   }

void hcaltb::HcalTBTDCUnpacker::unpackHits ( const FEDRawData raw,
std::vector< Hit > &  hits,
HcalTBTiming timing 
) const [private]

Definition at line 109 of file HcalTBTDCUnpacker.cc.

References hcaltb::HcalTBTDCUnpacker::Hit::channel, FEDRawData::data(), Exception, h, hcaltb::ClassicTDCDataFormat::hits, i, hcaltb::ClassicTDCDataFormat::n_hits, hcaltb::ClassicTDCDataFormat::n_max_hits, hcaltb::CombinedTDCQDCDataFormat::n_qdc_hits, hcaltb::CombinedTDCQDCDataFormat::n_tdc_hits, HcalTBTiming::setV775(), FEDRawData::size(), tdc_convers, and hcaltb::HcalTBTDCUnpacker::Hit::time.

Referenced by unpack().

00110                                                                                     {
00111   const ClassicTDCDataFormat* tdc=(const ClassicTDCDataFormat*)raw.data();
00112 
00113   if (raw.size()<3*8) {
00114     throw cms::Exception("Missing Data") << "No data in the TDC block";
00115   }
00116 
00117   const unsigned int* hitbase=0;
00118   unsigned int totalhits=0;
00119 
00120   // old TDC (767)
00121   if (tdc->n_max_hits!=192) {
00122     const CombinedTDCQDCDataFormat* qdctdc=(const CombinedTDCQDCDataFormat*)raw.data();
00123     hitbase=(unsigned int*)(qdctdc);
00124     hitbase+=6; // header
00125     hitbase+=qdctdc->n_qdc_hits/2; // two unsigned short per unsigned long
00126     totalhits=qdctdc->n_tdc_hits&0xFFFF; // mask off high bits
00127 
00128     //    for (unsigned int i=0; i<qdctdc->n_qdc_hits; i++)
00129     //      printf("QADC: %02d %d\n",i,qdctdc->qdc_values[i]&0xFFF);
00130 
00131   } else {
00132     hitbase=&(tdc->hits[0]);
00133     totalhits=tdc->n_hits;
00134   }
00135 
00136   for (unsigned int i=0; i<totalhits; i++) {
00137     Hit h;    
00138     h.channel=(hitbase[i]&0x7FC00000)>>22; // hardcode channel assignment
00139     h.time=(hitbase[i]&0xFFFFF)*tdc_convers[h.channel]; 
00140     hits.push_back(h);
00141     //        printf("V767: %d %f\n",h.channel,h.time);
00142   }
00143 
00144   // new TDC (V775)
00145   int v775[32];
00146   for (int i=0;i<32;i++) v775[i]=-1;
00147   if (tdc->n_max_hits!=192) {
00148     const CombinedTDCQDCDataFormat* qdctdc=(const CombinedTDCQDCDataFormat*)raw.data();
00149     hitbase=(unsigned int*)(qdctdc);
00150     hitbase+=6; // header
00151     hitbase+=qdctdc->n_qdc_hits/2; // two unsigned short per unsigned long
00152     hitbase+=(qdctdc->n_tdc_hits&0xFFFF); // same length
00153     totalhits=(qdctdc->n_tdc_hits&0xFFFF0000)>>16; // mask off high bits    
00154     for (unsigned int i=0; i<totalhits; i++) {
00155       Hit h;    
00156 //      h.channel=129+i;
00157       h.channel=129+((hitbase[i]&0x3F0000)>>16);
00158       h.time=(hitbase[i]&0xFFF)*tdc_convers[h.channel] ;
00159       hits.push_back(h);
00160       if ( (h.channel-129)<32 ) 
00161          v775[(h.channel-129)] = (hitbase[i]&0xFFF);
00162       //      printf("V775: %d %f\n",h.channel,h.time);
00163     }
00164   }
00165   timing.setV775(v775);
00166 }


Member Data Documentation

bool hcaltb::HcalTBTDCUnpacker::includeUnmatchedHits_ [private]

Definition at line 41 of file HcalTBTDCUnpacker.h.

Referenced by reconstructWC().

const int hcaltb::HcalTBTDCUnpacker::PLANECOUNT = 16 [static, private]

Definition at line 35 of file HcalTBTDCUnpacker.h.

Referenced by reconstructWC().

double hcaltb::HcalTBTDCUnpacker::tdc_convers[161] [private]

Definition at line 43 of file HcalTBTDCUnpacker.h.

Referenced by setCalib(), and unpackHits().

double hcaltb::HcalTBTDCUnpacker::tdc_ped[161] [private]

Definition at line 42 of file HcalTBTDCUnpacker.h.

Referenced by reconstructTiming(), and setCalib().

struct hcaltb::HcalTBTDCUnpacker::WireChamberRecoData hcaltb::HcalTBTDCUnpacker::wc_[PLANECOUNT] [private]

Referenced by reconstructWC(), and setCalib().

const int hcaltb::HcalTBTDCUnpacker::WC_CHANNELIDS [static, private]

Initial value:

 { 
                                                     12, 13, 14, 
                                                     10, 11, 15, 
                                                     22, 23, 24, 
                                                     20, 21, 25, 
                                                     32, 33, 34, 
                                                     30, 31, 35, 
                                                     101, 102, 104, 
                                                     107, 108, 110, 
                                                     113, 114, 116, 
                                                     97, 98, 99, 
                                                    42, 43, -1, 
                                                    44, 60, -1, 
                                                    40, 41, -1, 
                                                    45, 61, -1, 
                                                    52, 53, -1, 
                                                    54, 62, -1  
}

Definition at line 36 of file HcalTBTDCUnpacker.h.

Referenced by reconstructWC().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:47:25 2009 for CMSSW by  doxygen 1.5.4