CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_0/src/DataFormats/TrackerCommon/interface/ClusterSummary.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:    ClusterSummary
00004 // Class:      ClusterSummary
00005 // 
00013 //
00014 // Original Author:  Michael Segala
00015 //         Created:  Wed Feb 23 17:36:23 CST 2011
00016 // $Id: ClusterSummary.h,v 1.3 2012/04/24 15:26:46 msegala Exp $
00017 //
00018 //
00019 
00020 
00021 #ifndef CLUSTERSUMMARY
00022 #define CLUSTERSUMMARY
00023 
00024 // system include files
00025 #include <memory>
00026 #include <string>
00027 #include <map>
00028 #include <vector>
00029 #include<iostream>
00030 #include <string.h>
00031 #include <sstream>
00032 #include "FWCore/Utilities/interface/Exception.h"
00033 
00034 // user include files
00035 
00036 #include "FWCore/Framework/interface/Frameworkfwd.h"
00037 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
00038 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
00039 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
00040 #include "DataFormats/Common/interface/DetSetVectorNew.h"
00041 
00042 
00043 #include "RecoLocalTracker/SiStripClusterizer/interface/SiStripClusterInfo.h"
00044 #include "DataFormats/SiStripDigi/interface/SiStripProcessedRawDigi.h"
00045 #include "DataFormats/Common/interface/DetSetVector.h"
00046 
00047 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
00048 #include "DataFormats/DetId/interface/DetId.h" 
00049 #include "DataFormats/SiStripDetId/interface/TIBDetId.h"
00050 #include "DataFormats/SiStripDetId/interface/TOBDetId.h"
00051 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00052 #include "DataFormats/SiStripDetId/interface/TECDetId.h"
00053 #include "DataFormats/SiPixelDetId/interface/PXBDetId.h"
00054 #include "DataFormats/SiPixelDetId/interface/PXFDetId.h"
00055 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h"
00056 #include "DataFormats/SiPixelDetId/interface/PixelBarrelName.h"
00057 #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h"
00058 #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetType.h"
00059 
00060 /*****************************************************************************************
00061 
00062 How to use ClusterSummary class:
00063 
00064 ClusterSummary provides summary inforation for a number of cluster dependent variables.
00065 All the variables are stored within variables_
00066 The modules selected are stored within modules_
00067 The number of variables for each module is stored within iterator_
00068 
00069 [If putting ClusterSummary into producer]
00070 
00071 1) In beginJob() of Producer, set the method   
00072 
00073   Cluster.SetUserContent(v_userContent);
00074   Cluster.SetUserIterator();
00075 
00076   where v_userContent is a vector of strings of the varibales you are getting info on
00077    
00078 
00079 2) In produce() of Prodcuer, fill the output vectors
00080 
00081    // Tell ClusterSummary which Tracker Partitions you want summary information from
00082    Cluster.SetUserModules( mod ) 
00083 
00084 
00085    //Fill generic vector to hold any variables. You can fill the vector based on the name of the variables or the location of the variable within userContent
00086    cCluster.SetGenericVariable( "sHits", mod_pair2, 1 );
00087    cCluster.SetGenericVariable( "sSize", mod_pair2, Summaryinfo.clusterSize() );
00088    cCluster.SetGenericVariable( "sCharge", mod_pair2, Summaryinfo.charge() );
00089 
00090 
00091    // Once the loop over all detIds have finsihed fill the Output vectors
00092    Cluster.SetUserVariables( mod );
00093 
00094 
00095   // Dont forget to clear all the vectors and arrays at end of each event
00096 
00097 
00098 
00099 
00100 [If putting reading back ClusterSummary from anlayzer]
00101 
00102    You can access all the summary vectors in the following way
00103 
00104    Handle< ClusterSummary  > class_;
00105    iEvent.getByLabel( _class, class_);
00106       
00107    genericVariables_ = class_ -> GetGenericVariable();   
00108 
00109    //You can access the variables by genericVariables_[i][j] where 'i' is the order in which the variable was stored, see enum VariablePlacement
00110    cout << genericVariables_[0][1] << endl;
00111    cout << genericVariables_[1][1]/genericVariables_[0][1] << endl;
00112    cout << genericVariables_[2][2]/genericVariables_[0][2] << endl;
00113 
00114    --or--
00115    
00116    //You can access the variables by the variable and partition name.
00117    cout << class_ -> GetGenericVariable("cHits", ClusterSummary::TIB) << endl;
00118    cout << class_ -> GetGenericVariable("cSize", ClusterSummary::TIB)/class_ -> GetGenericVariable("cHits", ClusterSummary::TIB) << endl;
00119    cout << class_ -> GetGenericVariable("cCharge", ClusterSummary::TOB)/class_ -> GetGenericVariable("cHits", ClusterSummary::TOB) << endl;
00120 
00121 
00122 
00123 
00124 ********************************************************************************************/
00125 
00126 
00127 class ClusterSummary {
00128 
00129  public:
00130   
00131   ClusterSummary():genericVariablesTmp_(6, std::vector<double>(100,0) ){}
00132 
00133   // Enum for each partition within Tracer
00134   enum CMSTracker { TRACKER = 0,
00135                     TIB = 1,
00136                     TIB_1 = 11, TIB_2 = 12, TIB_3 = 13, TIB_4 = 14, //TIB layer 1-4
00137                     TOB = 2,
00138                     TOB_1 = 21, TOB_2 = 22, TOB_3 = 23, TOB_4 = 24, TOB_5 = 25, TOB_6 = 26,  //TOB layer 1-6
00139                     TID = 3,
00140                     TIDM = 31, TIDP = 32,  //TID minus and plus
00141                     TIDM_1 = 311, TIDM_2 = 312, TIDM_3 = 313, //TID minus layer 1-3
00142                     TIDP_1 = 321, TIDP_2 = 322, TIDP_3 = 323, //TID plus layer 1-3
00143                     TIDMR_1 = 3110, TIDMR_2 = 3120, TIDMR_3 = 3130, //TID minus ring 1-3
00144                     TIDPR_1 = 3210, TIDPR_2 = 3220, TIDPR_3 = 3230, //TID plus ring 1-3
00145                     TEC = 4,
00146                     TECM = 41, TECP = 42,  //TEC minus and plus
00147                     TECM_1 = 411, TECM_2 = 412, TECM_3 = 413, TECM_4 = 414, TECM_5 = 415, TECM_6 = 416, TECM_7 = 417, TECM_8 = 418, TECM_9 = 419, //TEC minus layer 1-9
00148                     TECP_1 = 421, TECP_2 = 422, TECP_3 = 423, TECP_4 = 424, TECP_5 = 425, TECP_6 = 426, TECP_7 = 427, TECP_8 = 428, TECP_9 = 429, //TEC plus layer 1-9 
00149                     TECMR_1 = 4110, TECMR_2 = 4120, TECMR_3 = 4130, TECMR_4 = 4140, TECMR_5 = 4150, TECMR_6 = 4160, TECMR_7 = 4170, //TEC minus ring 1-9
00150                     TECPR_1 = 4210, TECPR_2 = 4220, TECPR_3 = 4230, TECPR_4 = 4240, TECPR_5 = 4250, TECPR_6 = 4260, TECPR_7 = 4270, //TEC plus ring 1-9
00151                     PIXEL = 5,
00152                     FPIX = 6, // Pixel endcaps
00153                     FPIX_1 = 61,FPIX_2 = 62,FPIX_3 = 63, // Endcaps disks 1-3
00154                     FPIXM = 611, FPIXP = 612,  // Pixel endcaps minus and plus side
00155                     FPIXM_1 = 6110, FPIXM_2 = 6120, FPIXM_3 = 6130, // Endcap minus disk 1-3  
00156                     FPIXP_1 = 6210, FPIXP_2 = 6220, FPIXP_3 = 6230, // Endcap plus disk 1-3  
00157                     BPIX = 7, //Pixel barrel
00158                     BPIX_1 = 71, BPIX_2 = 72, BPIX_3 = 73 //Pixel barrel layer 1-3
00159   };
00160 
00161   // Enum which describes the ordering of the summary variables inside vector variables_
00162   enum VariablePlacement{ NMODULES = 0,
00163                           CLUSTERSIZE = 1,
00164                           CLUSTERCHARGE = 2,
00165                           NMODULESPIXELS = 3,
00166                           CLUSTERSIZEPIXELS = 4,
00167                           CLUSTERCHARGEPIXELS = 5};
00168  
00169 
00170   //===================+++++++++++++========================
00171   //
00172   //                 Main methods to fill 
00173   //                      Variables
00174   //
00175   //===================+++++++++++++========================
00176 
00177   
00178   //Get value of any variable given location of the variable within userContent and the module number based on enum CMSTracker
00179   double GetGenericVariable( int variableLocation, int module ) const { return genericVariables_[variableLocation][GetModuleLocation(module)]; }
00180 
00181   //Get value of any variable given variable name and the module number based on enum CMSTracker
00182   double GetGenericVariable( std::string variableName, int module ) const { 
00183 
00184     int position = GetVariableLocation(variableName);
00185     int mposition = GetModuleLocation(module);
00186 
00187     return genericVariables_[position][mposition];    
00188   }
00189 
00190   //Get specific varibale for all modules using the variable name
00191   std::vector<double> GetGenericVariable( std::string variableName ) const {     
00192     return genericVariables_[GetVariableLocation(variableName)];
00193   }
00194 
00195   //Get specific varibale for all modules using the location of the variable within userContent
00196   std::vector<double> GetGenericVariable( int variableLocation ) const {     
00197     return genericVariables_[variableLocation];
00198   }
00199 
00200   //Get the vector genericVariables_
00201   std::vector< std::vector<double> > GetGenericVariable() const { return genericVariables_; }  
00202 
00203   //Set the vector genericVariables_ based on the location of the variable within userContent and the module number based on enum CMSTracker
00204   void SetGenericVariable( int variableLocation, int module, double value ) { genericVariablesTmp_[variableLocation][GetModuleLocation(module)] += value; } 
00205 
00206   //Set the vector genericVariables_ given the variable name and the module number based on enum CMSTracker
00207   void SetGenericVariable( std::string variableName, int module, double value ) { 
00208     
00209     /*
00210       genericVariablesTmp[ variable ][ module ]
00211       
00212       This will fill the values in the order as they are filled in the produced.
00213       
00214       1) Find where the variableName lives in userContent
00215       2) Find where module lives in modules_
00216 
00217     */
00218 
00219     int position = GetVariableLocation(variableName);
00220     int mposition = GetModuleLocation(module);
00221 
00222     genericVariablesTmp_[position][mposition] += value;    
00223   } 
00224 
00225   //Prepair the final vector to be put into the producer. Remove any remaining 0's and copy the Tmp to the vector over to genericVariables_. Must be done at the end of each event.
00226   void PrepairGenericVariable() { 
00227     
00228     genericVariables_ = genericVariablesTmp_;
00229     
00230     for (unsigned int i = 0; i < userContent.size(); ++i){
00231       genericVariables_[i].erase(std::remove(genericVariables_[i].begin(), genericVariables_[i].end(), 0), genericVariables_[i].end());
00232     }
00233   } 
00234 
00235   //Clear genericVariablesTmp_. Must be done at the end of each event.
00236   void ClearGenericVariable() { 
00237     
00238     //genericVariablesTmp_.clear();
00239 
00240     for (unsigned int i = 0; i < genericVariablesTmp_.size(); ++i){
00241       for (unsigned int j = 0; j < genericVariablesTmp_[i].size(); ++j){
00242         genericVariablesTmp_[i][j] = 0;
00243       }
00244     }    
00245   } 
00246 
00247 
00248 
00249   // Setter and Getter for the User Content. You can also return the size and what is stored in the UserContent 
00250   void SetUserContent(std::vector<std::string> Content)  const { userContent = Content;}
00251   std::vector<std::string> GetUserContent()  { return userContent;}
00252   int GetUserContentSize()  { return userContent.size(); }
00253   void  GetUserContentInfo() const  { 
00254     std::cout << "Saving info for " ;
00255     for (unsigned int i = 0; i < userContent.size(); ++i){ std::cout << userContent.at(i) << " " ;}
00256     std::cout << std::endl;
00257   }
00258   int GetVariableLocation ( std::string var ) const;
00259 
00260 
00261   //Set and Get modules_
00262   void SetUserModules( int value ) { modules_.push_back( value ); }
00263   std::vector<int> GetUserModules( ) const { return modules_;  }
00264   void ClearUserModules( ) { modules_.clear(); }
00265   // Return the location of desired module within modules_. 
00266   int GetModuleLocation ( int mod ) const;
00267 
00268 
00269   //Set and Get iterator_
00270   void SetUserIterator() { iterator_.push_back( GetUserContentSize()  );}
00271   std::vector<int> GetUserIterator() const { return iterator_; }
00272   void ClearUserIterator() { iterator_.clear(); }
00273     
00274   // Return a vector of the modules that summary infomation was requested for. This should come from the provenance information. 
00275   std::vector<std::string> DecodeProvInfo(std::string ProvInfo) const;
00276 
00277   // Class which determines if a detId is part of a desired partition
00278   class ModuleSelection{
00279   public:
00280     ModuleSelection(std::string gs){
00281       geosearch = gs;
00282     };
00283     virtual std::pair<int,int> IsStripSelected (int DetId);
00284     virtual std::pair<int,int> IsPixelSelected (int DetId);
00285   private:
00286     std::string geosearch; // string of selected modules        
00287   };
00288 
00289 
00290 
00291 
00292  private:
00293   
00294 
00295   // String which stores the name of the variables the user is getting the summary info for
00296   mutable std::vector<std::string>        userContent;
00297 
00298   std::vector<int>    iterator_;   // <number of varibale for Module1, number of varibale for Module2 ...>
00299   std::vector<int>    modules_;    // <Module1, Module2 ...>
00300 
00301   std::vector< std::vector<double> > genericVariables_; 
00302   mutable std::vector< std::vector<double> > genericVariablesTmp_; 
00303 
00304 };
00305 
00306 
00307 #endif
00308 
00309 
00310 
00311 
00312 
00313 
00314