00001 // COCOA class implementation file 00002 //Id: FittedEntriesSet.cc 00003 //CAT: Model 00004 // 00005 // History: v1.0 00006 // Pedro Arce 00007 00008 #include <fstream> 00009 #include <map> 00010 #include "Alignment/CocoaAnalysis/interface/FittedEntriesSet.h" 00011 #include "Alignment/CocoaModel/interface/Model.h" 00012 #include "Alignment/CocoaModel/interface/Measurement.h" 00013 #include "Alignment/CocoaModel/interface/OpticalObject.h" 00014 #include "Alignment/CocoaModel/interface/Entry.h" 00015 00016 #ifdef MAT_MESCHACH 00017 #include "Alignment/CocoaFit/interface/MatrixMeschach.h" 00018 #endif 00019 // 00020 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 00021 FittedEntriesSet::FittedEntriesSet( MatrixMeschach* AtWAMatrix ) 00022 { 00023 //- theTime = Model::MeasurementsTime(); 00024 theDate = Measurement::getCurrentDate(); 00025 theTime = Measurement::getCurrentTime(); 00026 00027 theMinEntryQuality = 2; 00028 theEntriesErrorMatrix = AtWAMatrix; 00029 00030 Fill(); 00031 00032 } 00033 00034 00035 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 00036 FittedEntriesSet::FittedEntriesSet( std::vector<ALIstring> wl ) 00037 { 00038 //- theTime = Model::MeasurementsTime(); 00039 theDate = wl[0]; 00040 theTime = "99:99"; 00041 00042 theMinEntryQuality = 2; 00043 theEntriesErrorMatrix = (MatrixMeschach*)0; 00044 00045 FillEntriesFromFile( wl ); 00046 00047 } 00048 00049 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 00050 FittedEntriesSet::FittedEntriesSet( std::vector<FittedEntriesSet*> vSets ) 00051 { 00052 theDate = "99/99/99"; 00053 theTime = "99:99"; 00054 00055 theMinEntryQuality = 2; 00056 theEntriesErrorMatrix = (MatrixMeschach*)0; 00057 00058 FillEntriesAveragingSets( vSets ); 00059 00060 } 00061 00062 00063 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 00064 void FittedEntriesSet::Fill( ) 00065 { 00066 00067 FillEntries( ); 00068 FillCorrelations( ); 00069 00070 } 00071 00072 00073 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 00074 void FittedEntriesSet::FillEntries() 00075 { 00076 //---------- Store Fitted Entries 00077 //----- Iterate over entry list 00078 std::vector<Entry*>::const_iterator vecite; 00079 for ( vecite = Model::EntryList().begin(); 00080 vecite != Model::EntryList().end(); vecite++ ) { 00081 //--- Only for good quality parameters (='unk') 00082 if ( (*vecite)->quality() >= theMinEntryQuality ) { 00083 // ALIdouble dimv = (*vecite)->ValueDimensionFactor(); 00084 // ALIdouble dims = (*vecite)->SigmaDimensionFactor(); 00085 ALIint ipos = (*vecite)->fitPos(); 00086 FittedEntry* fe = new FittedEntry( (*vecite), ipos, sqrt(theEntriesErrorMatrix->Mat()->me[ipos][ipos])); 00087 //- std::cout << fe << "IN fit FE " << fe->theValue<< " " << fe->Sigma()<< " " << sqrt(theEntriesErrorMatrix->Mat()->me[NoEnt][NoEnt]) / dims<< std::endl; 00088 theFittedEntries.push_back( fe ); 00089 } 00090 } 00091 00092 } 00093 00094 00095 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 00096 void FittedEntriesSet::FillCorrelations() 00097 { 00098 //------ Count the number of entries that will be in the set 00099 ALIuint nent = 0; 00100 std::vector<Entry*>::const_iterator vecite; 00101 for ( vecite = Model::EntryList().begin(); 00102 vecite != Model::EntryList().end(); vecite++ ) { 00103 if((*vecite)->quality() > theMinEntryQuality ) { 00104 nent++; 00105 } 00106 } 00107 00108 CreateCorrelationMatrix( nent ); 00109 //---------- Store correlations 00110 ALIuint ii; 00111 for( ii = 0; ii < nent; ii++) { 00112 for(ALIuint jj = ii+1; jj < nent; jj++) { 00113 ALIdouble corr = theEntriesErrorMatrix->Mat()->me[ii][jj]; 00114 if (corr != 0) { 00115 corr /= ( sqrt(theEntriesErrorMatrix->Mat()->me[ii][ii]) 00116 / sqrt(theEntriesErrorMatrix->Mat()->me[jj][jj]) ); 00117 theCorrelationMatrix[ii][jj] = corr; 00118 } 00119 } 00120 } 00121 00122 } 00123 00124 00125 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 00126 void FittedEntriesSet::CreateCorrelationMatrix( const ALIuint nent ) 00127 { 00128 00129 std::vector<ALIdouble> vd( nent, 0.); 00130 std::vector< std::vector<ALIdouble> > vvd( nent, vd); 00131 theCorrelationMatrix = vvd; 00132 00133 } 00134 00135 00136 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 00137 void FittedEntriesSet::FillEntriesFromFile( std::vector<ALIstring> wl) 00138 { 00139 00140 ALIuint siz = wl.size(); 00141 for( ALIuint ii = 1; ii< siz; ii+=3 ) { 00142 FittedEntry* fe = new FittedEntry( wl[ii], ALIUtils::getFloat(wl[ii+1]), ALIUtils::getFloat(wl[ii+2])); 00143 theFittedEntries.push_back( fe ); 00144 } 00145 00146 } 00147 00148 00149 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 00150 void FittedEntriesSet::FillEntriesAveragingSets( std::vector<FittedEntriesSet*> vSets ) 00151 { 00152 00153 std::vector<FittedEntry*> vFEntry; 00154 ALIuint nEntry = vSets[0]->FittedEntries().size(); 00155 // ALIuint setssiz = vSets.size(); 00156 for( ALIuint ii = 0; ii < nEntry; ii++ ){ // loop to FittedEntry's 00157 if(ALIUtils::debug >= 5) std::cout << "FillEntriesAveragingSets entry " << ii << std::endl; 00158 vFEntry.clear(); 00159 for( ALIuint jj = 0; jj < vSets.size(); jj++ ){ // look for FittedEntry ii in each Sets 00160 if(ALIUtils::debug >= 5) std::cout << "FillEntriesAveragingSets set " << jj << std::endl; 00161 //----- Check all have the same number of entries 00162 if( vSets[jj]->FittedEntries().size() != nEntry ){ 00163 std::cerr << "!!! FATAL ERROR FittedEntriesSet::FillEntriesAveragingSets set number " << jj 00164 << " has different number of entries = " 00165 << vSets[jj]->FittedEntries().size() 00166 << " than first set = " << nEntry << std::endl; 00167 exit(1); 00168 } 00169 00170 vFEntry.push_back( vSets[jj]->FittedEntries()[ii] ); 00171 } 00172 FittedEntry* fe = new FittedEntry( vFEntry ); 00173 if(ALIUtils::debug >= 5) std::cout << "FillEntriesAveragingSets new fentry " << fe->getValue() << " " << fe->getSigma() << std::endl; 00174 theFittedEntries.push_back( fe ); 00175 } 00176 00177 00178 } 00179 00180 00181 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2 00182 void FittedEntriesSet::SetOptOEntries() 00183 { 00184 if(ALIUtils::debug >= 5) std::cout << " FittedEntriesSet::SetOptOEntries " << theFittedEntries.size() << std::endl; 00185 00186 std::vector< FittedEntry* >::const_iterator ite; 00187 for( ite = theFittedEntries.begin();ite != theFittedEntries.end();ite++){ 00188 FittedEntry* fe = (*ite); 00189 OpticalObject * opto = Model::getOptOByName( fe->getOptOName() ); 00190 Entry* entry = Model::getEntryByName( fe->getOptOName(), fe->getEntryName() ); 00191 entry->setValue( fe->getValue() ); 00192 entry->setSigma( fe->getSigma() ); 00193 00194 if(ALIUtils::debug >= 5) std::cout << " FittedEntriesSet::SetOptOEntries() " << opto->name() << " " << entry->name() << std::endl; 00195 opto->setGlobalCoordinates(); 00196 opto->setOriginalEntryValues(); 00197 } 00198 }