Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

PmtMap.cxx

Go to the documentation of this file.
00001 #include <cstdlib>
00002 
00003 #include "MuonRemoval/PmtMap.h"
00004 #include "MessageService/MsgService.h"
00005 #include "MuonRemoval/RawDigitInfo.h"
00006 #include "Plex/PlexHandle.h"
00007 
00008 CVSID("$Id: PmtMap.cxx,v 1.4 2009/02/28 21:46:14 gmieg Exp $");
00009 
00010 ElecChannel::ElecChannel():
00011   adc(0),
00012   tdc(0),
00013   valid(0),
00014   index(-1)
00015 {
00016 }
00017 
00018 void ElecChannel::PrintSummary(){  
00019   if(rcid.GetElecType()==ElecType::kVA)
00020     MSG("EvtMrg",Msg::kInfo) << rcid.GetCrate() << " " << rcid.GetVarcId() << " " 
00021                              << rcid.GetVfb() << " " << rcid.GetVaAdcSel() << " " 
00022                              << rcid.GetVaChip() << " " << rcid.GetVaChannel() << " " 
00023                              << adc << " " << tdc << " " << ((valid!=0)?' ':'X') << " " 
00024                              << index << endl;  
00025   else if(rcid.GetElecType()==ElecType::kQIE)
00026     MSG("EvtMrg",Msg::kInfo) << rcid.GetCrate() << " " << rcid.GetMaster() << " " 
00027                              << rcid.GetMinder() << " " << rcid.GetMenu() << " " 
00028                              << adc << " " << tdc << " " << ((valid!=0)?' ':'X') 
00029                              << " " << index << endl;  
00030 }
00031 
00032 
00033 //
00034 // The detector map
00035 //
00036 PmtMap::PmtMap()
00037 {
00038 }
00039 
00040     
00041 bool PmtMap::BuildMap(const vector<const RawDigit*>& digitlist, 
00042                       const vector<int>& digit_index,const VldContext *vldc)
00043 {
00044   //set elecType:
00045   if(digitlist.size()==0) return false;
00046   elecType = digitlist[0]->GetChannel().GetElecType();
00047   //fill vector:
00048   if(elecType==ElecType::kVA){
00049     const unsigned int ndigit = digitlist.size(); 
00050     for(unsigned int idigit= 0 ; idigit<ndigit; idigit++){    
00051       RawChannelId rcid = digitlist[idigit]->GetChannel();
00052       Int_t        tdc  = digitlist[idigit]->GetTDC();
00053       Int_t        adc  = digitlist[idigit]->GetADC();
00054       bool found = 0;
00055       const unsigned int nchannel = channel.size();
00056       for(unsigned int ichannel = 0; ichannel<nchannel; ichannel++){
00057         if(channel[ichannel].rcid == rcid){
00058           MSG("EvtMrg",Msg::kError) << "Found duplicate RCID RawDigits:" 
00059                                     << channel[ichannel].tdc << "  cf " 
00060                                     << digitlist[idigit]->GetTDC() << endl;
00061           found = 1;
00062         }
00063       }
00064       ElecChannel tmpch;
00065       tmpch.rcid = rcid;
00066       tmpch.tdc  = tdc;
00067       tmpch.adc  = adc;
00068       tmpch.valid = 1;
00069       tmpch.index = digit_index[idigit];
00070       channel.push_back(tmpch);
00071     }  
00072   }
00073   else if(elecType==ElecType::kQIE){
00074     PlexHandle ph(*vldc);
00075     const unsigned int ndigit = digitlist.size();
00076     for(unsigned int idigit= 0 ; idigit<ndigit; idigit++){
00077       RawChannelId rcid = digitlist[idigit]->GetChannel();
00078       Int_t        tdc  = digitlist[idigit]->GetTDC();
00079       Int_t        adc  = digitlist[idigit]->GetADC();
00080       Int_t        pln  = ph.GetSEIdAltL(rcid).GetPlane();
00081       bool found = 0;
00082       const unsigned int nchannel = channel.size();
00083       for(unsigned int ichannel = 0; ichannel<nchannel; ichannel++){
00084         if(channel[ichannel].rcid == rcid && channel[ichannel].tdc == tdc){
00085           if(pln>=121) found = 1;  //spectrometer
00086           else { 
00087             MSG("EvtMrg",Msg::kError) << "Found duplicate RCID RawDigits with same TDC (ADC) " 
00088                                       << channel[ichannel].tdc << " (" 
00089                                       << channel[ichannel].adc << ") cf " 
00090                                       << tdc << " (" << adc << ") in plane " << pln << endl;
00091             
00092           }
00093         }
00094       }
00095       // not going to add multiple spectrometer digits; these come from previous reco pass
00096       if(!found){
00097         ElecChannel tmpch;
00098         tmpch.rcid = rcid;
00099         tmpch.tdc  = tdc;
00100         tmpch.adc  = adc;
00101         tmpch.valid = 1;
00102         tmpch.index = digit_index[idigit];
00103         channel.push_back(tmpch);
00104       }
00105     }
00106   }
00107   return true;
00108 }
00109   
00110   
00111 bool PmtMap::BuildMap(const TClonesArray*  rawdigits)
00112 {  
00113   if(rawdigits->GetEntries()==0) return false;
00114   elecType = ((RawDigitInfo*) rawdigits->At(0))->rcid.GetElecType();
00115   if(elecType==ElecType::kVA){
00116     TIter iter(rawdigits);
00117     while(RawDigitInfo *digit = dynamic_cast<RawDigitInfo*>(iter())){
00118       bool found = 0;
00119       const unsigned int nchannel = channel.size();
00120       for(unsigned int ichannel = 0; ichannel<nchannel; ichannel++){
00121         if(channel[ichannel].rcid == digit->rcid){      
00122           MSG("EvtMrg",Msg::kError) << "Found duplicate RCID RawDigitsInfo" <<endl;      
00123           found = 1;
00124         }
00125       }
00126       ElecChannel tmpch;
00127       tmpch.rcid = digit->rcid;
00128       tmpch.tdc  = (int)digit->tdc;
00129       tmpch.adc  = (int)digit->adc;
00130       tmpch.valid = 1;
00131       channel.push_back(tmpch);
00132     }
00133   }
00134   else if(elecType==ElecType::kQIE){
00135     TIter iter(rawdigits);
00136     while(RawDigitInfo *digit = dynamic_cast<RawDigitInfo*>(iter())  ){
00137       bool found = 0;
00138       const unsigned int nchannel = channel.size();
00139       for(unsigned int ichannel = 0; ichannel<nchannel; ichannel++){
00140         if(channel[ichannel].rcid == digit->rcid && 
00141            channel[ichannel].tdc == digit->tdc){        
00142           MSG("EvtMrg",Msg::kDebug) << "Found duplicate RCID RawDigits with same TDC (ADC) " 
00143                                     << channel[ichannel].tdc << " (" 
00144                                     << channel[ichannel].adc << ") cf " 
00145                                     << digit->tdc << " (" << digit->adc << ")" << endl;   
00146           // if we we're generating electrons independently
00147           // these digits would already be merged, so merge now:
00148           channel[ichannel].adc += (int)digit->adc;
00149           found = 1;
00150           break;
00151         }
00152       }
00153       if(!found) {
00154         ElecChannel tmpch;
00155         tmpch.rcid = digit->rcid;
00156         tmpch.tdc  = (int)digit->tdc;
00157         tmpch.adc  = (int)digit->adc;
00158         tmpch.valid = 1;
00159         channel.push_back(tmpch);
00160       }
00161     }
00162   }
00163   return true;
00164 }
00165 
00166 
00167 bool PmtMap::Merge(PmtMap& lhs, PmtMap& rhs){
00168   //look at lhs and add in any overlapping digits
00169   if(lhs.elecType!=rhs.elecType) return false;
00170   elecType = lhs.elecType;
00171   if(elecType==ElecType::kVA){
00172     Int_t max_index = 0;
00173     const unsigned int nlhs = lhs.channel.size();
00174     const unsigned int nrhs = rhs.channel.size();  
00175     for(unsigned int ilhs=0; ilhs<nlhs; ilhs++){   
00176       ElecChannel tmp;
00177       tmp.rcid = lhs.channel[ilhs].rcid;
00178       tmp.adc = lhs.channel[ilhs].adc;
00179       tmp.tdc = lhs.channel[ilhs].tdc;
00180       tmp.index = lhs.channel[ilhs].index;
00181       tmp.valid = 1;        
00182       for(unsigned int irhs=0; irhs<nrhs; irhs++){
00183         if(lhs.channel[ilhs].rcid == rhs.channel[irhs].rcid && rhs.channel[irhs].valid){
00184           MSG("EvtMrg",Msg::kVerbose) 
00185             << "Merging digits Dt:" << abs(tmp.tdc  - rhs.channel[irhs].tdc) 
00186             <<  "  Different time:" 
00187             << ((abs(tmp.tdc  - rhs.channel[irhs].tdc)>3200)?" Okay " : " combine" ) << endl;
00188           if(abs(tmp.tdc  - rhs.channel[irhs].tdc)<3200){
00189             tmp.adc+=rhs.channel[irhs].adc;
00190             if(rhs.channel[irhs].tdc< tmp.tdc) tmp.tdc = rhs.channel[irhs].tdc;
00191             if(rhs.channel[irhs].index!=-1) tmp.index = rhs.channel[irhs].index;
00192             rhs.channel[irhs].valid = 0;
00193           }
00194         }
00195       }
00196       this->channel.push_back(tmp);
00197       if(tmp.index>max_index) max_index = tmp.index;
00198     }
00199 
00200     //
00201     //pick up any remaining digits
00202     //
00203     for(unsigned int irhs=0; irhs<nrhs; irhs++){
00204       if(rhs.channel[irhs].valid){
00205         ElecChannel tmp;
00206         tmp.rcid = rhs.channel[irhs].rcid;
00207         tmp.adc = rhs.channel[irhs].adc;
00208         tmp.tdc = rhs.channel[irhs].tdc;
00209         tmp.valid = 1;        
00210         tmp.index = max_index; //rhs.channel[irhs].index;
00211         this->channel.push_back(tmp);
00212       }
00213     }
00214   }
00215   else if(elecType==ElecType::kQIE){
00216     const unsigned int nlhs = lhs.channel.size();
00217     const unsigned int nrhs = rhs.channel.size();
00218     Int_t max_index = 0;
00219     for(unsigned int ilhs=0; ilhs<nlhs; ilhs++){
00220       ElecChannel tmp;
00221       tmp.rcid = lhs.channel[ilhs].rcid;
00222       tmp.adc = lhs.channel[ilhs].adc;
00223       tmp.tdc = lhs.channel[ilhs].tdc;
00224       tmp.index = lhs.channel[ilhs].index;
00225       tmp.valid = 1;
00226       for(unsigned int irhs=0; irhs<nrhs; irhs++){
00227         if(lhs.channel[ilhs].rcid == rhs.channel[irhs].rcid && 
00228            lhs.channel[ilhs].tdc  == rhs.channel[irhs].tdc && 
00229            rhs.channel[irhs].valid){
00230           MSG("EvtMrg",Msg::kVerbose) << "Merging digits RCID = " << tmp.rcid 
00231                                       << " TDC = " << tmp.tdc << endl;
00232           tmp.adc+=rhs.channel[irhs].adc;
00233           rhs.channel[irhs].valid = 0;
00234         }
00235     }
00236       this->channel.push_back(tmp);
00237       if(tmp.index>max_index) max_index = tmp.index;
00238     }
00239     
00240     //
00241     //pick up any remaining digits
00242     //
00243     for(unsigned int irhs=0; irhs<nrhs; irhs++){
00244       if(rhs.channel[irhs].valid){
00245         ElecChannel tmp;
00246         tmp.rcid = rhs.channel[irhs].rcid;
00247         tmp.adc = rhs.channel[irhs].adc;
00248         tmp.tdc = rhs.channel[irhs].tdc;
00249         tmp.valid = 1;
00250         tmp.index = max_index;
00251         this->channel.push_back(tmp);
00252         rhs.channel[irhs].valid = 0;
00253       }
00254     }
00255   }
00256   return true;  
00257 }
00258 
00259 void PmtMap::PrintSummary(){
00260   const unsigned int nchannel = channel.size();
00261   for(unsigned int ichannel = 0; ichannel<nchannel; ichannel++){
00262     channel[ichannel].PrintSummary();
00263   }
00264 }

Generated on Mon Feb 15 11:07:25 2010 for loon by  doxygen 1.3.9.1